Docker
🐳 Den Bot in Docker betreiben
Docker ist der kürzeste Weg zu einem laufenden Bot: keine Node-Installation, keine Build-Werkzeuge für das native SQLite-Modul, und dasselbe Image auf einem VPS, einem Raspberry Pi oder einem Heimserver. Die Images gibt es für linux/amd64 und linux/arm64.
ghcr.io/msk-scripts/discord_ticketbot:latest
Die Tags folgen den Releases: latest zeigt auf den Standard-Branch, mit 2, 2.15
und 2.15.0 legst du dich so genau fest, wie du möchtest.
1. Verzeichnisse vorbereiten
Zwei Dinge hält der Bot außerhalb des Images: seine Datenbank und seine Konfiguration. Beide werden eingehängt, ein Image-Update fasst sie deshalb nie an.
mkdir -p ticketbot/config ticketbot/data
cd ticketbot
Im Image läuft der Bot als uid 1000, nicht als root. Unter Linux müssen die beiden eingehängten Verzeichnisse für diesen Nutzer beschreibbar sein:
sudo chown -R 1000:1000 config data
Ohne das stoppt der Container sofort und nennt im Log das Verzeichnis, in das er nicht schreiben kann. Das ist Absicht: ein Bot, der startet, aber nichts speichern kann, ist schlimmer als einer, der den Start verweigert.
2. Umgebungsvariablen
Lege eine .env neben der Compose-Datei an:
TOKEN=dein_discord_bot_token
CLIENT_ID=deine_application_id
GUILD_ID=deine_server_id
# Optional, schaltet den gehosteten Transkript-Dienst frei
MSK_API_KEY=
MSK_API_URL=https://www.msk-scripts.de
# Optional. Leer bedeutet SQLite in data/tickets.db
DATABASE_URL=
3. docker-compose.yml
services:
ticketbot:
image: ghcr.io/msk-scripts/discord_ticketbot:latest
container_name: ticketbot
restart: unless-stopped
init: true
env_file:
- .env
volumes:
- ./data:/app/data
- ./config:/app/config
init: true wird wichtig, sobald du das Dashboard nutzt: es startet den Bot als
Kindprozess, und ohne einen Init-Prozess wird dieses Kind nie aufgeräumt.
4. Erster Start
docker compose up -d
docker compose logs -f
Beim ersten Start kopiert der Container config.jsonc und snippets.jsonc in dein
eingehängtes config/-Verzeichnis und stoppt dann, weil die frische Konfiguration noch
Platzhalter enthält. Das Log nennt jedes Feld, um das es geht:
[ERROR] Config validation failed:
[ERROR] - Field "openTicketChannelId" is still the example placeholder ("CHANNEL_ID_HERE").
Trage die Werte ein (siehe Konfiguration) und starte erneut:
docker compose up -d
5. Das Web-Dashboard
Das Dashboard ist standardmäßig aus. Um es zu nutzen, ergänzt du die .env:
DASHBOARD_ENABLED=true
DASHBOARD_HOST=0.0.0.0
DASHBOARD_PORT=3010
DASHBOARD_PUBLIC_URL=https://tickets.example.com
CLIENT_SECRET=dein_discord_oauth_secret
und den Compose-Dienst:
command: node dashboard.js
ports:
- "127.0.0.1:3010:3010"
Der Standard 127.0.0.1 ist das Loopback des Containers selbst, das erreicht kein
Port-Mapping. Auf 0.0.0.0 zu lauschen ist hier unbedenklich, weil der
veröffentlichte Port an das Loopback des Hosts gebunden ist
(127.0.0.1:3010:3010). Setze einen Reverse Proxy mit TLS davor, siehe
Dashboard.
6. Aktualisieren
docker compose pull
docker compose up -d
Datenbank und Konfiguration liegen in den Mounts und überstehen das.
Der Update-Button im Dashboard führt git pull und npm install aus. Im Container gibt
es aber kein Checkout, unter Docker aktualisierst du deshalb über ein neues Image. Alles
andere im Dashboard arbeitet ganz normal.
7. MariaDB oder PostgreSQL statt SQLite
SQLite ist der Standard und braucht nichts. Für eine externe Datenbank ergänzt du einen
Dienst und richtest DATABASE_URL darauf aus:
mariadb:
image: mariadb:11
restart: unless-stopped
environment:
MARIADB_DATABASE: ticketbot
MARIADB_USER: ticketbot
MARIADB_PASSWORD: changeme
MARIADB_RANDOM_ROOT_PASSWORD: "yes"
volumes:
- ./data/mariadb:/var/lib/mysql
DATABASE_URL=mysql://ticketbot:changeme@mariadb:3306/ticketbot
Der Hostname ist der Dienstname aus der Compose-Datei, nicht localhost. Wie du eine
bestehende SQLite-Datei umziehst, steht unter Datenbank.
Das Image selbst bauen
Im Repository liegt das Dockerfile bei, ein lokaler Build kommt also ohne die
Registry aus:
git clone https://github.com/MSK-Scripts/discord_ticketbot.git
cd discord_ticketbot
docker build -t ticketbot .