Ihr kennt sicher Doodle, die weit verbreitete Plattform für Terminumfragen. Wie wäre es aber mit einer eigenen, individuell anpassbaren Alternative? In diesem Tutorial stelle ich euch Rallly vor, ein leistungsstarkes Tool für genau diesen Zweck. Ich zeige euch Schritt für Schritt, wie ihr Rallly mit Docker Compose und Traefik auf eurem eigenen Server installieren könnt. So könnt ihr leicht den besten Termin für alle finden und habt dabei die volle Kontrolle.
0. Versionierung
Datum | Änderung |
---|---|
28.10.2023 | Initialer Release |
1. Voraussetzungen
Bevor ihr beginnt, benötigt ihr einen Server mit den folgenden Eigenschaften:
- x86-64 Architektur
- Docker + Traefik
Außerdem solltet ihr Zugang zu einem SMTP-Server haben, um E-Mails versenden zu können.
2. Verzeichnisse und Dateien anlegen
Als nächstes legen wir die notwendigen Verzeichnisse und Dateien auf dem Server an. Führt die folgenden Befehle aus:
mkdir -p /opt/containers/rallly/config cd /opt/containers/rallly/
Dieser Befehl erstellt das Verzeichnis /opt/containers/rallly/config
auf dem Server, in dem später die Konfigurationsdateien für Rallly gespeichert werden.
Nun erstellen wir die erforderlichen Dateien:
touch /opt/containers/rallly/docker-compose.yml touch /opt/containers/rallly/config/{rallly.env,nginx.conf}
Hiermit legen wir auf dem Server die docker-compose.yml
für die Docker-Konfiguration, eine rallly.env
Datei für spezifische Rallly-Einstellungen und eine nginx.conf
damit Traefik später auch funktioniert.
Damit ist die notwendige Ordnerstruktur und die erforderlichen Dateien auf dem Server für die Installation von Rallly vorbereitet. Im nächsten Schritt kümmern wir uns um die Konfiguration.
3. Rallly-Konfiguration anpassen
3.1. Grundlegende Variablen einfügen
Bevor ihr mit den Einstellungen beginnt, müsst ihr den Beispielinhalt in eure rallly.env
Datei auf dem Server kopieren. Diese Datei befindet sich im Verzeichnis /opt/containers/rallly/config
.
nano /opt/containers/rallly/config/rallly.env
# REQUIRED CONFIG # A postgres database connection string. # Does not need to be defined if you are using the docker-compose file in this repository # to run your database. DATABASE_URL=postgres://postgres:postgres@rallly_db:5432/db # A random 32-character secret key used to encrypt user sessions SECRET_PASSWORD= # The base url where this instance is accessible, including the scheme. # Example: https://example.com NEXT_PUBLIC_BASE_URL=http://localhost:3000 # Comma separated list of email addresses that are allowed to register and login. # You can use wildcard syntax to match a range of email addresses. # Example: "john@example.com,jane@example.com" or "*@example.com" ALLOWED_EMAILS= # EMAIL CONFIG (required for sending emails) # The email address that will be used to send emails. If not set, SUPPORT_EMAIL will be used instead. NOREPLY_EMAIL= # The email of whoever is managing this instance in case a user needs support. SUPPORT_EMAIL= # The host address of your SMTP server SMTP_HOST= # The port of your SMTP server SMTP_PORT=587 # Set to "true" if SSL is enabled for your SMTP connection SMTP_SECURE= # The username (if auth is enabled on your SMTP server) SMTP_USER= # The password (if auth is enabled on your SMTP server) SMTP_PWD=
3.2. Grundlegende Einstellungen
Sobald die Datei vorbereitet ist, startet ihr mit der Erstellung eines geheimen Schlüssels, der mindestens 32 Zeichen lang sein muss. Dies könnt ihr mit dem Befehl openssl rand -base64 32
erzeugen. Tragt diesen Schlüssel bei SECRET_PASSWORD
ein.
openssl rand -base64 32
root@mail:/opt/containers/rallly# openssl rand -base64 32 BNqEb3xGxIXyAJ1sgfcGXKpYxAGhuYLBbsKR/8gwjJw= root@mail:/opt/containers/rallly#
# REQUIRED CONFIG # A postgres database connection string. # Does not need to be defined if you are using the docker-compose file in this repository # to run your database. DATABASE_URL=postgres://postgres:postgres@rallly_db:5432/db # A random 32-character secret key used to encrypt user sessions SECRET_PASSWORD=BNqEb3xGxIXyAJ1sgfcGXKpYxAGhuYLBbsKR/8gwjJw= # The base url where this instance is accessible, including the scheme. # Example: https://example.com NEXT_PUBLIC_BASE_URL=http://localhost:3000 # Comma separated list of email addresses that are allowed to register and login. # You can use wildcard syntax to match a range of email addresses. # Example: "john@example.com,jane@example.com" or "*@example.com" ALLOWED_EMAILS= # EMAIL CONFIG (required for sending emails) # The email address that will be used to send emails. If not set, SUPPORT_EMAIL will be used instead. NOREPLY_EMAIL= # The email of whoever is managing this instance in case a user needs support. SUPPORT_EMAIL= # The host address of your SMTP server SMTP_HOST= # The port of your SMTP server SMTP_PORT=587 # Set to "true" if SSL is enabled for your SMTP connection SMTP_SECURE= # The username (if auth is enabled on your SMTP server) SMTP_USER= # The password (if auth is enabled on your SMTP server) SMTP_PWD=
Setzt dann die Variable NEXT_PUBLIC_BASE_URL
auf die URL, unter der eure Rallly-Instanz erreichbar ist. Diese sollte das Schema (z.B. http:// oder https://), den Domain-Namen und optional den Port enthalten. Vermeidet abschließende Schrägstriche oder Unterpfade.
# REQUIRED CONFIG # A postgres database connection string. # Does not need to be defined if you are using the docker-compose file in this repository # to run your database. DATABASE_URL=postgres://postgres:postgres@rallly_db:5432/db # A random 32-character secret key used to encrypt user sessions SECRET_PASSWORD=BNqEb3xGxIXyAJ1sgfcGXKpYxAGhuYLBbsKR/8gwjJw= # The base url where this instance is accessible, including the scheme. # Example: https://example.com NEXT_PUBLIC_BASE_URL=https://rallly.meinedomain.de # Comma separated list of email addresses that are allowed to register and login. # You can use wildcard syntax to match a range of email addresses. # Example: "john@example.com,jane@example.com" or "*@example.com" ALLOWED_EMAILS= # EMAIL CONFIG (required for sending emails) # The email address that will be used to send emails. If not set, SUPPORT_EMAIL will be used instead. NOREPLY_EMAIL= # The email of whoever is managing this instance in case a user needs support. SUPPORT_EMAIL= # The host address of your SMTP server SMTP_HOST= # The port of your SMTP server SMTP_PORT=587 # Set to "true" if SSL is enabled for your SMTP connection SMTP_SECURE= # The username (if auth is enabled on your SMTP server) SMTP_USER= # The password (if auth is enabled on your SMTP server) SMTP_PWD=
3.3. E-Mail-Konfiguration
Für den E-Mail-Versand ist ein SMTP-Server erforderlich. Tragt die E-Mail-Adresse, die für Support-Anfragen und als Absender genutzt werden soll, bei SUPPORT_EMAIL
ein.
Konfiguriert dann euren SMTP-Server mit folgenden Umgebungsvariablen:
SMTP_HOST
: Host-Adresse des SMTP-ServersSMTP_PORT
: Port des SMTP-ServersSMTP_SECURE
: Setzt dies auf “true”, falls SSL aktiviert istSMTP_USER
: Benutzername (falls Authentifizierung erforderlich ist)SMTP_PWD
: Passwort (falls Authentifizierung erforderlich ist)
# REQUIRED CONFIG # A postgres database connection string. # Does not need to be defined if you are using the docker-compose file in this repository # to run your database. DATABASE_URL=postgres://postgres:postgres@rallly_db:5432/db # A random 32-character secret key used to encrypt user sessions SECRET_PASSWORD=BNqEb3xGxIXyAJ1sgfcGXKpYxAGhuYLBbsKR/8gwjJw= # The base url where this instance is accessible, including the scheme. # Example: https://example.com NEXT_PUBLIC_BASE_URL=https://rallly.meinedomain.de # Comma separated list of email addresses that are allowed to register and login. # You can use wildcard syntax to match a range of email addresses. # Example: "john@example.com,jane@example.com" or "*@example.com" ALLOWED_EMAILS= # EMAIL CONFIG (required for sending emails) # The email address that will be used to send emails. If not set, SUPPORT_EMAIL will be used instead. NOREPLY_EMAIL=noreply@meinedomain.de # The email of whoever is managing this instance in case a user needs support. SUPPORT_EMAIL=support@meinedomain.de # The host address of your SMTP server SMTP_HOST=mail.meinedomain.de # The port of your SMTP server SMTP_PORT=465 # Set to "true" if SSL is enabled for your SMTP connection SMTP_SECURE=true # The username (if auth is enabled on your SMTP server) SMTP_USER=noreply@meinedomain.de # The password (if auth is enabled on your SMTP server) SMTP_PWD=MeinSicheresApplikationsPasswortfürDieseEmail
3.4. Benutzerzugriff einschränken
Standardmäßig ist die Registrierung für jeden möglich. Um dies zu beschränken, verwendet die Variable ALLOWED_EMAILS
.
- Einzelne E-Mail:
ALLOWED_EMAILS="john.doe@example.com"
- Mehrere E-Mails:
ALLOWED_EMAILS="john.doe@example.com,jane.doe@example.com"
- Alle E-Mails einer Domain:
ALLOWED_EMAILS="*@example.com"
Damit habt ihr alle notwendigen Einstellungen für die Rallly-Konfiguration vorgenommen.
4. Nginx-Konfiguration anpassen
Ich habe festgestellt, dass Traefik und Rallly nicht direkt miteinander harmonieren. Das kein Grund zur Sorge. Wir können Traefik mit Hilfe eines kleinen Nginx-Container verwenden.
Öffnet die Nginx-Konfigurationsdatei und fügt folgendes ein:
nano /opt/containers/rallly/config/nginx.conf
server { listen 80; listen [::]:80; location / { proxy_pass http://rallly:3000; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
5. Anpassung der docker-compose.yml
-Datei
Öffnet die Datei docker-compose.yml
im Verzeichnis /opt/containers/rallly/
auf eurem Server und fügt den folgenden Inhalt ein:
nano /opt/containers/rallly/docker-compose.yml
version: '3.9' services: rallly: container_name: rallly depends_on: rallly_db: condition: service_healthy required: true env_file: - config/rallly.env environment: DATABASE_URL: postgres://postgres:DasIstEinSicheresPasswort@rallly-db:5432/rallly hostname: rallly image: lukevella/rallly:latest networks: default: null restart: always rallly_db: container_name: rallly_db environment: POSTGRES_DB: db POSTGRES_PASSWORD: DasIstEinSicheresPasswort hostname: rallly-db healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] timeout: 5s interval: 5s retries: 5 image: postgres:14 networks: default: null restart: always volumes: - ./database:/var/lib/postgresql/data rallly_nginx: container_name: rallly_nginx hostname: rallly-nginx image: nginx:latest labels: traefik.docker.network: proxy traefik.enable: "true" traefik.http.routers.rallly.entrypoints: websecure traefik.http.routers.rallly.rule: Host(`rallly.meinedomain.de`) traefik.http.routers.rallly.service: rallly traefik.http.routers.rallly.tls: "true" traefik.http.routers.rallly.tls.certresolver: tls_resolver traefik.http.services.rallly.loadbalancer.server.port: "80" networks: default: null proxy: null restart: always volumes: - ./config/nginx.conf:/etc/nginx/conf.d/default.conf networks: default: name: rallly_default proxy: external: true
Wichtige Anmerkungen zur Anpassung:
- Domain: Ändert den Eintrag in
Host(
rallly.meinedomain.de)
auf die Domain, unter der eure Rallly-Instanz erreichbar sein soll. - Datenbank-Passwort: Achtet darauf, das Passwort in
DATABASE_URL: postgres://postgres:DasIstEinSicheresPasswort@rallly-db:5432/rallly
und inPOSTGRES_PASSWORD: DasIstEinSicheresPasswort
zu ändern. Das Passwort muss in beiden Fällen identisch sein.
Durch diese Anpassungen sollte eure docker-compose.yml
für den Einsatz bereit sein.
6. Rallly starten
Nachdem alle Vorbereitungen abgeschlossen sind, könnt ihr nun Rallly starten. Stellt sicher, dass ihr euch im Verzeichnis /opt/containers/rallly/
befindet, um den Docker-Compose-Befehl auszuführen:
cd /opt/containers/rallly/ docker compose up -d
Mit diesem Befehl wird der Docker Compose-Prozess im Hintergrund gestartet (-d
steht für “detached”). Jetzt sollten alle Dienste, einschließlich Rallly und dem Nginx-Container, laufen und erreichbar sein. Ihr könnt nun die Rallly-Webseite über die von euch festgelegte Domain aufrufen und die Funktionalität testen.
Das war’s! Ihr habt nun eure eigene Rallly-Instanz mit Docker Compose und Nginx eingerichtet. Viel Spaß bei der Terminfindung!
7. Finanzielle Unterstützung für den Entwickler
Rallly ist komplett kostenfrei für die Selbst-Hostung. Allerdings bedeutet kostenfrei nicht, dass keine Arbeit und Zeit in die Entwicklung und Wartung des Projekts fließen. Der Entwickler investiert viel Mühe in die Erstellung, Pflege und den Support von Rallly.
Auf der offiziellen Webseite gibt es die Möglichkeit, den Entwickler finanziell zu unterstützen. Der vorgeschlagene Preis für eine einmalige Zahlung liegt bei 42 US-Dollar, was auch dem Preis für ein Jahresabonnement des offiziell verwalteten Dienstes entspricht. Natürlich könnt ihr auch jeden anderen Betrag zahlen, den ihr für angemessen haltet.
Wenn ihr Rallly nützlich findet und es euch leisten könnt, denkt bitte darüber nach, den Entwickler für seine harte Arbeit zu unterstützen. Jede Unterstützung ist wertvoll und hilft dabei, die Weiterentwicklung des Projekts zu finanzieren.
8. Unterstützung für Christian
Genauso wie der Entwickler von Rallly freut sich auch Christian, desen Blog das ist, über jede Form der Unterstützung. Jedes neue Community-Mitglied und jede Spende hilft dabei, qualitativ hochwertige Inhalte und Tutorials wie dieses weiterhin zur Verfügung stellen zu können. Wenn ihr die Arbeit schätzt und von den bereitgestellten Informationen profitiert, überlegt bitte auch, Christian und seinen Blog zu unterstützen. Jede Form der Anerkennung ist willkommen und wird sehr geschätzt.
Sehr gute Idee und Anleitung!
Bei der docker-compose.yml scheint aber ein Eintrag zu viel, der bei mir mit docker compose up -d jeweils folgende Fehlermeldung ergab:
services.rallly.depends_on.rallly_db Additional property required is not allowed
Nachdem ich in der docker-compose.yml die Voraussetzungen für depends_on im Abschnitt rallly: in
depends_on:
– rallly_db
geändert habe (die beiden Einträge in der Vorlage löschen), lief alles glatt durch. Damit aber Rallly auch mit Traefik und Crowdsec gemäss Anleitung auf goneuland.de lief, musst ich noch die Labels: im Abschnitt rallly_nginx: wie folgt anpassen:
labels:
– “traefik.enable=true”
– “traefik.http.routers.rallly.entrypoints=https”
– “traefik.http.routers.rallly.rule=(Host(
rallly.iup.ch
))”– “traefik.http.routers.rallly.tls=true”
– “traefik.http.routers.rallly.tls.certresolver=http”
– “traefik.http.routers.rallly.service=rallly”
– “traefik.http.services.rallly.loadbalancer.server.port=80”
– “traefik.docker.network=proxy”
– “traefik.http.routers.rallly.middlewares=default@file”
Vielleicht kann das, wenn es für alle zutrifft, in einer nächsten Version eingearbeitet werden.