Was du bekommst #
| Dienst | Image | Rolle |
|---|---|---|
db | postgres:16-alpine | Daten plus Job-Queue. Nur auf 127.0.0.1:5432 veröffentlicht. |
app | gebaut aus ./web | Web-App, API und Collaboration-Server auf Port 3000. Kein Host-Port; ein Reverse-Proxy davor. |
worker | gebaut aus ./services mit worker/Dockerfile | E-Mails, Webhooks, Push, Digests, Aufräumen. |
scheduler | gebaut aus ./services mit scheduler/Dockerfile | Legt wiederkehrende Jobs in die Queue. |
Die beiden Go-Dienste teilen sich den Build-Kontext ./services, weil sie dieselben shared/-Pakete kompilieren. Anhänge landen standardmäßig in einem Docker-Volume oder in einem beliebigen S3-kompatiblen Bucket.
Ausrollen #
Klonen und konfigurieren
sh git clone https://github.com/KilicerDev/trackr.git && cd trackr cp .env.example .envTrage
POSTGRES_PASSWORD,BETTER_AUTH_SECRET(32+ zufällige Zeichen) undROOT_PASSWORD(8+ Zeichen) ein. Ändere dann zwei Werte, die das Beispiel für die lokale Entwicklung mitbringt: SetzeDATABASE_URLauf leer, damit die Container den Connection-String aus denPOSTGRES_*-Teilen bauen und den Dienstdberreichen, und setzeSTORAGE_DRIVER=local, sofern du kein S3 konfigurierst (siehe unten). Alles andere hat einen sinnvollen Standard.Starten
sh docker compose up -d --buildDer App-Container führt bei jedem Start Migrationen aus und legt das Root-Konto an; beides ist idempotent. Eine fehlschlagende Migration bricht den Start ab.
Proxy davorschalten
Zeige mit deinem Reverse-Proxy auf
app:3000und reicheX-Forwarded-ProtoundX-Forwarded-Hostweiter. LassORIGINungesetzt, damit Trackr seine öffentliche URL aus diesen Headern ableitet.Anmelden
Öffne deine Domain und melde dich mit dem Root-Konto an. Deine interne Organisation existiert bereits und das Root-Konto ist Mitglied; lade das Team unter Admin → Verzeichnis → Nutzer ein.
E-Mail #
Setze SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS und EMAIL_FROM. Ist SMTP_HOST leer, protokolliert der Worker E-Mails statt sie zu senden — nützlich für den ersten Lauf. Sobald SMTP_HOST gesetzt ist, wird EMAIL_FROM Pflicht; ohne startet der Worker nicht. SMTP_SECURE ist auf Port 465 standardmäßig true, sonst false.
Speicher #
STORAGE_DRIVER=local # oder s3
# S3-kompatibel (in docker-compose.yaml weiterreichen!)
S3_ENDPOINT=https://s3.eu-central-1.amazonaws.com
S3_REGION=eu-central-1 # Standard us-east-1
S3_BUCKET=trackr-attachments # Pflicht bei STORAGE_DRIVER=s3
S3_ACCESS_KEY_ID=…
S3_SECRET_ACCESS_KEY=…
S3_FORCE_PATH_STYLE=true # Standard true, sobald S3_ENDPOINT gesetzt ist
BODY_SIZE_LIMIT=100MBeim lokalen Treiber hängt Compose das Volume uploads unter /app/data/attachments in den app-Container; der Pfad ist in der Compose-Datei fest verdrahtet.
Aktualisieren #
git pull
docker compose up -d --buildMigrationen laufen beim Start automatisch. Die Go-Dienste migrieren nie; das Schema gehört der Web-App.
Skalierung #
workerundschedulerlaufen mit beliebig vielen Replikas; die Queue nutzt Zeilensperren, ein Job wird nie von zwei Workern zugleich beansprucht. Die Zustellung ist at-least-once: Ein Job, dessen Worker stirbt, wird vom Reaper neu eingereiht, die Handler sind deshalb idempotent.- Live-Update-Stream, Berechtigungs-Cache und Collaboration-Server der Web-App sind Einzelprozess. Betreibe eine
app-Replika.