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/ralllyund inPOSTGRES_PASSWORD: DasIstEinSicheresPasswortzu ä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.