Git Deploy
Verbinde deinen Server mit einem Repository auf GitHub, GitLab, Gitea oder Forgejo und deploye automatisch bei jedem Push, Release oder Tag, mit geschützten Pfaden, Neustart, CI-Checks und Rollback per Klick.
Der Tab Git Deploy im Portal verbindet deinen Server mit einem Git-Repository auf GitHub, GitLab, Gitea oder Forgejo. Dessen Dateien landen automatisch auf deinem Server — bei jedem Push, wenn du ein Release veröffentlichst, wenn du einen Tag pushst oder per Knopfdruck. Auf Wunsch wird dein Server vor dem Deploy sauber gestoppt und danach wieder gestartet.
Kurz gesagt: Code pushen, und ein paar Sekunden später läuft er auf deinem Server. Kein Hochladen per SFTP mehr, kein Entpacken von ZIP-Dateien in der Dateiverwaltung, kein vergessener Neustart.
Das lernst du hier
- Wie du ein Repository verbindest, mit der GitHub-App Daki Git Deploy oder mit einem Zugriffstoken
- Wann ein Deploy läuft und wie du selbst einen auslöst
- Wie du Welten, Datenbanken und
.env-Dateien mit geschützten Pfaden absicherst - Wie Neustart, Deploy-Verlauf, Rollback und der Status in deinem Repository funktionieren
- Wie du deinem Team die passenden Rechte gibst
Für wen es gedacht ist
- Entwickler von Discord-Bots sowie Node.js-, Python- oder Java-Anwendungen, deren Code ohnehin auf GitHub oder GitLab liegt.
- Minecraft-Netzwerke und Gameserver-Teams, die Plugins, Configs oder Datapacks in einem Repository pflegen und Änderungen nachvollziehbar ausrollen wollen.
- Teams: Mehrere Leute arbeiten im Repository, der Server ist immer auf dem neuesten Stand, und über Subuser-Rechte legst du genau fest, wer deployen darf.
- Release-basierte Projekte: Nur veröffentlichte Versionen (z. B. eine fertige
.jaraus dem Release) landen auf dem Server, nicht jeder Zwischenstand.
Bevor du loslegst
- Einen Server im Portal, der den Tab Git Deploy zeigt. Er steht in der Server-Navigation unter Essentials, standardmäßig direkt nach Files.
- Ein Repository auf GitHub (github.com), GitLab (gitlab.com oder eine eigene Instanz, auch Untergruppen wie
gruppe/untergruppe/projekt), Gitea oder Forgejo (z. B. Codeberg oder eine eigene Instanz). Öffentliche und private Repositories funktionieren beide.
Daki legt pro Server-Typ (Egg) fest, ob der Tab angezeigt wird. Siehst du Git Deploy nicht, ist die Funktion für den Typ deines Servers nicht freigeschaltet.
Diese Anleitung nutzt die englischen Beschriftungen des Tabs. Git Deploy gibt es in 19 Sprachen, der Tab folgt der Sprache, die du im Portal eingestellt hast. Auf Deutsch heißen zum Beispiel Connect with GitHub „Mit GitHub verbinden“, Deploy now „Jetzt deployen“, Deploy again „Erneut deployen“, Save settings „Einstellungen speichern“, When to deploy „Wann deployen“, Protected paths „Geschützte Pfade“ und Wait for CI checks „Auf CI-Checks warten“.
Schnellstart mit GitHub (empfohlen)
Der schnellste Weg: Verbinde dich über Daki Git Deploy, die offizielle GitHub-App von Daki Hosting. Du meldest dich bei GitHub an und wählst deine Repositories aus — kein Token und kein Webhook nötig.
Öffne den Tab Git Deploy
Öffne deinen Server im Portal und wechsle in den Tab Git Deploy. Wähle unter Git service den Dienst GitHub.
Mit GitHub verbinden
Klicke im Kasten GitHub access auf Connect with GitHub. Melde dich bei GitHub an und autorisiere die App.
Beim ersten Mal geht es danach direkt weiter zur Auswahl, auf welche Repositories die App zugreifen darf (All repositories oder nur ausgewählte) — ein Durchgang statt zwei. Anschließend landest du automatisch wieder im Portal, und der Kasten GitHub access zeigt Connected via Daki Git Deploy as mit deinem GitHub-Namen. Der Kasten Webhook bestätigt, dass nichts einzurichten ist: Pushes und Releases kommen über die App von selbst an.
Wähle Repository und Branch
Klicke auf Choose from my repositories und wähle dein Repository — oder füge die Web- oder Clone-URL ein bzw. tippe den Pfad. Klicke auf Load branches und wähle den Branch, der deployt werden soll. Lässt du den Branch leer, wird der Standard-Branch des Repositorys verwendet.
Lege fest, wann und wie deployt wird
Wähle unter When to deploy einen Modus (z. B. Every push). Stelle danach Zielordner, geschützte Pfade und das Neustart-Verhalten ein.
Speichern
Klicke unten in der Leiste auf Save settings. Fertig: Oben im Tab steht Automatic deploys on, und dein nächster Push wird automatisch deployt. Willst du sofort deployen, klicke oben rechts auf Deploy now.
- Weiteres Repository freigeben: Choose repositories on GitHub öffnet die Repository-Auswahl auf GitHub erneut. Dort legst du fest, auf welche Repositories Daki Git Deploy zugreifen darf.
- Verbindung lösen: Klicke auf Disconnect. Danach deployt der Server nicht mehr aus privaten Repositories.
Du musst nie etwas erneuern. Für jeden Deploy holt sich das Portal automatisch einen frischen, kurzlebigen Schlüssel von GitHub (1 Stunde gültig), der nur das eine Repository deines Servers erreicht. Das passiert im Hintergrund.
Schnellstart mit Zugriffstoken
Für GitLab, Gitea und Forgejo — und auf Wunsch auch für GitHub — hinterlegst du einen persönlichen Zugriffstoken. Öffentliche Repositories funktionieren sogar ganz ohne Token.
Wähle den Git-Dienst
Öffne deinen Server → Git Deploy und wähle unter Git service deinen Dienst. Bei einer eigenen GitLab-Instanz, Gitea oder Forgejo trägst du die Server-Adresse ein (z. B.
https://codeberg.orgoderhttps://git.example.com). Bei gitlab.com lässt du sie leer.Trage das Repository ein
Trage das Repository als Pfad (
besitzer/name) ein oder füge einfach die Web- oder Clone-URL ein. Bei einem öffentlichen Repository reicht das schon — ohne Token zeigt der Zugangs-Kasten No token – public repositories only.Hinterlege einen Token für private Repositories
Bei GitHub klickst du dafür zuerst im Kasten GitHub access auf Use an own access token instead. Erstelle dann bei deinem Git-Dienst einen Token — der Link Create a token on … im Portal führt dich direkt zur richtigen Seite — und speichere ihn unter Personal access token. Das Portal prüft den Token sofort. Welche Rechte er braucht, steht unter Token-Rechte.
Einstellungen wählen und speichern
Lege fest, wann deployt wird, und wähle Zielordner, geschützte Pfade und das Neustart-Verhalten. Klicke dann auf Save settings.
Webhook anlegen
Im Kasten Webhook stehen Payload URL und Secret, jeweils mit Kopieren-Knopf. Trage beides in deinem Repository ein, wie unter Webhook einrichten beschrieben. Unter dem Kasten zeigt Last delivery danach, ob der Webhook ankommt.
Automatische Deploys einschalten
Schalte Automatic deploys active ein.
Token-Rechte
| Dienst | Token-Art | Rechte für Deploys | Zusätzlich für den Status im Repository |
|---|---|---|---|
| GitHub | Fine-grained Token, nur für dieses Repository | Contents: Read-only (für Wait for CI checks zusätzlich Actions: Read-only) | Commit statuses und Deployments: Read and write |
| GitLab | Personal, Project oder Group Access Token | read_api + read_repository | api statt read_api, Rolle Developer |
| Gitea / Forgejo | Einstellungen → Anwendungen | repository: Lesen, user: Lesen | repository: Lesen und Schreiben |
Fehlt nur das Schreibrecht für den Status, wird trotzdem deployt — im Deploy-Log steht dann ein Hinweis.
Webhook einrichten
Gehe in deinem Repository zu Settings → Webhooks → Add webhook:
- Füge Payload URL und Secret aus dem Portal ein.
- Stelle den Content type auf
application/json. - Wähle bei den Events Just the push event. Im Release-Modus wählst du stattdessen Releases.
Gehe in deinem Projekt zu Einstellungen → Webhooks:
- Füge die Payload URL als URL und das Secret unter Secret token ein.
- Wähle als Trigger Push-Ereignisse. Im Tag-Modus wählst du Tag-Push-Ereignisse, im Release-Modus Release-Ereignisse.
Gehe in deinem Repository zu Einstellungen → Webhooks → Webhook hinzufügen und wähle Gitea bzw. Forgejo:
- Füge die Payload URL ein, stelle den Content type auf
application/jsonund trage das Secret ein. - Wähle Push-Events, im Release-Modus Benutzerdefinierte Events → Release.
Dein Git-Dienst erreicht das Portal nicht, zum Beispiel weil deine Gitea-Instanz im Heimnetz läuft? Wähle stattdessen unter Also check … for updates ein Intervall (z. B. Also check Gitea for updates). Beim ersten Durchlauf wird der aktuelle Stand einmal deployt.
Wann ein Deploy läuft
Unter When to deploy wählst du einen von vier Modi:
| Modus | Was deployt wird |
|---|---|
| Manual | Nur, wenn jemand auf Deploy now klickt. |
| Every push | Jeder Push auf den gewählten Branch. |
| Releases | Nur, wenn ein Release veröffentlicht wird. Deployt wird wahlweise der Quellcode des Releases oder eine Release-Datei (z. B. *.jar) — optional unter festem Namen gespeichert (z. B. server.jar) und optional entpackt, wenn es eine .zip ist. Pre-Releases kannst du ein- oder ausschließen. |
| Tags | Wenn ein Tag gepusht wird, der zu einem Muster passt, z. B. v*. |
Auslöser
- Webhook: Dein Git-Dienst meldet Änderungen sofort, der Deploy startet innerhalb von Sekunden. Mit der GitHub-App passiert das automatisch, ohne eigenen Webhook.
- Update-Prüfung (Polling): optional, für Fälle, in denen dein Git-Dienst das Portal nicht erreichen kann. Intervalle von 5 Minuten bis 1 Tag.
- Deploy now: jederzeit per Knopf. Im Release-Modus kannst du ein bestimmtes Release auswählen.
- Push überspringen: Steht
[skip deploy]in der Commit-Nachricht, wird dieser Push nicht deployt.[deploy skip]und[no deploy]funktionieren auch.
Auf CI-Checks warten
Ist Wait for CI checks eingeschaltet (nur im Modus Every push), wird ein Commit erst deployt, wenn seine CI grün ist — unterstützt werden GitHub Actions, GitLab CI und Gitea/Forgejo Actions. Schlägt die CI fehl, wird der Deploy übersprungen.
Alle Einstellungen erklärt
| Bereich | Einstellung | Bedeutung |
|---|---|---|
| Repository | Git service | GitHub, GitLab, Gitea oder Forgejo |
| Repository | Server URL | Nur für selbst gehostete Instanzen; muss aus dem Internet erreichbar sein |
| Repository | Repository | besitzer/name oder URL; Choose from my repositories zeigt eine Liste |
| Repository | Branch | Leer = Standard-Branch; Load branches zeigt eine Liste |
| When to deploy | Manual / Every push / Releases / Tags | Siehe Wann ein Deploy läuft |
| When to deploy | Wait for CI checks | Nur bei Every push |
| When to deploy | Include pre-releases, What to deploy (Source code / Release file), Save as, Extract .zip files instead of uploading them | Nur bei Releases |
| When to deploy | Tag pattern | Nur bei Tags, z. B. v*; leer = jeder Tag |
| When to deploy | Also check … for updates (nach deinem Git-Dienst benannt, z. B. Also check GitHub for updates) | Polling: Never (webhook only), 5/10/15/30 Min., 1/3/6/12/24 Std. |
| When to deploy | Automatic deploys active | Aus pausiert Webhook und Polling; Deploy now funktioniert weiter |
| When to deploy | Show deploys in the repository | Status am Commit, siehe Status in deinem Repository |
| Files | Folder in the repository | Nur einen Unterordner deployen, z. B. dist; leer = alles |
| Files | Target folder on the server | Wohin die Dateien kommen; / = Hauptordner deines Servers |
| Files | Protected paths | Eine Regel pro Zeile, siehe Geschützte Pfade |
| Files | Remove files that were deleted from the repository | Optionales Aufräumen, siehe unten |
| Restart | Restart if running / Always start / Do not restart | Siehe Neustart-Verhalten |
| Restart | If the server does not stop | Sofort beenden oder nach 5 s, 10 s (Standard: Kill after 10 seconds), 15 s, 30 s, 1 Min., 2 Min. oder 5 Min. |
Änderungen werden erst wirksam, wenn du auf Save settings klickst. Solange etwas ungespeichert ist, zeigt eine Leiste unten Discard und Save settings, und Deploy now ist gesperrt.
Remove files that were deleted from the repository entfernt nur Dateien, die ein früherer Deploy selbst geschrieben hat — nie geschützte Pfade und nie Dateien, die du selbst angelegt hast. Leere Ordner bleiben stehen.
Geschützte Pfade
Dateien und Ordner unter Protected paths werden von einem Deploy nie überschrieben oder gelöscht. Gibt es sie noch nicht, werden sie einmal angelegt. Perfekt für Spielwelten, Datenbanken und Passwörter.
Schreibe eine Regel pro Zeile, relativ zum Zielordner. Leere Zeilen und Zeilen mit # am Anfang werden ignoriert. * passt nie über ein / hinweg.
| Regel | Schützt |
|---|---|
world/ | Jeden Ordner namens world, egal wie tief |
/world/ | Nur world direkt im Zielordner |
*.db | Jede Datei mit der Endung .db, überall |
.env | Jede Datei .env, überall |
/config.yml | Nur config.yml direkt im Zielordner |
plugins/*/config.yml | config.yml in jedem direkten Unterordner von plugins |
Typische Beispiele:
world/
world_nether/
world_the_end/
plugins/*/config.yml
whitelist.json
ops.json
banned-*.json.env
*.db
*.sqlite
node_modules/
data/.env
*.db
venv/Neustart-Verhalten
| Option | Was passiert |
|---|---|
| Restart if running | Der Server wird vor dem Schreiben der Dateien gestoppt und danach wieder gestartet. Ein ausgeschalteter Server bleibt aus. |
| Always start | Wie oben, und ein ausgeschalteter Server wird nach dem Deploy gestartet. |
| Do not restart | Die Dateien werden ersetzt, während der Server weiterläuft. |
If the server does not stop: Manche Programme, vor allem Node.js-Anwendungen, ignorieren das Stopp-Signal. Der Server wird dann nach der gewählten Zeit beendet („gekillt“) — sofort oder nach 5 Sekunden bis 5 Minuten, standardmäßig Kill after 10 seconds —, damit der Deploy nicht hängen bleibt. Sofort beenden ist am schnellsten, lässt dem Server aber keine Zeit zum Speichern.
Zwei Sicherheitsnetze: Geht der Server gar nicht aus, werden keine Dateien verändert. Schlägt der Deploy fehl, nachdem der Server gestoppt wurde, wird der Server wieder gestartet.
Was bei einem Deploy passiert
- Ein Auslöser (Push, Release, Tag, Update-Prüfung oder Knopf) erzeugt einen Deploy.
- Ist Wait for CI checks eingeschaltet, wartet er auf grüne CI-Checks (Waiting).
- Das Portal lädt das Archiv von deinem Git-Dienst. Deine Zugangsdaten verlassen dabei nie das Portal und landen nie auf deinem Server.
- Das Archiv wird vorbereitet: nur der gewählte Ordner, geschützte Pfade herausgefiltert, unsichere Inhalte wie symbolische Links verworfen.
- Je nach Einstellung wird der Server gestoppt (und notfalls nach der gewählten Zeit beendet).
- Die Dateien werden in den Zielordner geschrieben; optional werden gelöschte Dateien entfernt.
- Je nach Einstellung wird der Server wieder gestartet.
- Ergebnis und vollständiges Log erscheinen im Verlauf — und, wenn eingeschaltet, als Status am Commit.
Ein Deploy dauert typischerweise 10–40 Sekunden, plus die Zeit, die dein Server zum Stoppen braucht.
Verlauf, Logs und Rollback
Die Liste Deployments unten im Tab zeigt jeden Deploy mit Status, Branch und Commit (z. B. main @ 75cd0a1), Nummer, Auslöser, der Person, die ihn gestartet hat, der Uhrzeit und der Commit-Nachricht. Oben im Tab siehst du, wann der Server zuletzt deployt wurde.
| Status | Bedeutung |
|---|---|
| Waiting | Wartet auf CI-Checks |
| Scheduled | Eingeplant, startet gleich |
| Running | Der Deploy läuft |
| Deployed | Erfolgreich abgeschlossen |
| Failed | Etwas ist schiefgegangen — das Log zeigt, was |
| Skipped | Nicht deployt, z. B. weil die CI fehlgeschlagen ist oder im Commit [skip deploy] steht |
| Cancelled | Abgebrochen, bevor er gestartet ist |
- Log: Jeder Deploy hat ein Live-Log, das sich während des Deploys aktualisiert. Hide log blendet es wieder aus.
- Rollback mit einem Klick: Klicke bei einem früheren Deploy auf Deploy again, um diesen Stand noch einmal auszurollen.
- Abbrechen: Wartende oder eingeplante Deploys kannst du abbrechen.
Mehrere Server können gleichzeitig deployen, pro Server läuft aber immer nur ein Deploy. Ein neuer Auslöser ersetzt einen älteren Deploy, der noch wartet.
Status in deinem Repository
Ist Show deploys in the repository eingeschaltet, erscheint an deinem Commit der Status Daki Hosting / dein Servername: gelb während des Deploys, danach ein grüner Haken oder ein rotes Kreuz, mit Link zum Tab Git Deploy.
- Auf GitHub erscheint der Deploy zusätzlich unter Deployments, mit deinem Servernamen als Umgebung.
- Mit der GitHub-App schreibt Daki Git Deploy den Status und zeigt sein Logo — sonst ist nichts einzurichten. Mit Token erscheint das Bild des Token-Kontos, und der Token braucht Schreibrechte (siehe Token-Rechte).
- Du kannst es pro Server abschalten. Öffentlich sichtbar sind nur Status und Link — keine Logs und keine Fehlerdetails.
Teams und Subuser-Rechte
Subuser bekommen eine eigene Rechte-Gruppe Git Deploy:
| Recht | Erlaubt |
|---|---|
view (github.read) | Einstellungen, Webhook-Adresse und Verlauf mit Logs sehen |
deploy (github.deploy) | Deploy now, Deploy again und Deploys abbrechen |
change settings (github.update) | Repository, Zugang, Webhook und alle Einstellungen |
Subuser haben standardmäßig keinen Zugriff auf Git Deploy — du entscheidest, wer welches Recht bekommt. Der Besitzer des Servers darf immer alles.
Sicherheit
- Tokens und Secrets werden verschlüsselt gespeichert und nie an deinen Browser geschickt.
- Mit der GitHub-App gibt es für Deploys gar keinen dauerhaften Token von dir: Jeder Deploy nutzt einen kurzlebigen Schlüssel (1 Stunde), der nur das Repository deines Servers erreicht.
- Welche Repositories du verbinden kannst, entscheidet dein eigener GitHub-Zugang. Niemand kann fremde Repositories auf seinen Server ziehen.
- Webhooks sind signiert, mit einem eigenen Secret pro Server. Zustellungen mit falschem Secret oder für ein anderes Repository werden abgewiesen.
- Nur wer den Token hinterlegt hat, kann das Repository wechseln. So können Subuser nicht mit dem Token des Besitzers andere private Repositories laden.
- Änderst du Git-Dienst oder Server-Adresse, wird der gespeicherte Token beim Speichern automatisch gelöscht.
- Geschützte Pfade werden nie überschrieben, und Remove files that were deleted from the repository löscht nur, was Git Deploy selbst geschrieben hat.
- Der öffentliche Status in deinem Repository enthält keine Logs und keine Fehlerdetails.
Bekannte Grenzen
- Pro Server ein Repository und ein Zugang.
- Pro Server läuft immer nur ein Deploy gleichzeitig.
- Der Status in deinem Repository erscheint erst, wenn der Deploy wirklich startet, nicht schon beim Warten auf die CI.
- Release-Dateien werden nur entpackt, wenn es
.zip-Dateien sind; eine.tar.gzwird als Datei hochgeladen. - Leere Ordner bleiben nach Remove files that were deleted from the repository stehen.
- Symbolische Links im Repository werden nicht deployt.
- GitLab kennt keine Pre-Releases; ein Release mit Datum in der Zukunft gilt als Pre-Release.
- GitLab: Release-Dateien, die als Upload im Projekt liegen (
/uploads/…), lassen sich bei privaten Projekten nicht mit einem Token laden; Links auf die Package Registry funktionieren. - Connect with GitHub gibt es nur für GitHub; GitLab, Gitea und Forgejo nutzen einen Token.
FAQ und Fehlersuche
Muss ich meinen Token regelmäßig erneuern?
Mit der GitHub-App nicht: Das Portal holt sich für jeden Deploy automatisch einen frischen Schlüssel. Ein eigener Token gilt so lange, wie du es beim Erstellen auf deinem Git-Dienst festgelegt hast; läuft er ab, speicherst du einfach einen neuen.
Mein Repository taucht in der Liste nicht auf (GitHub-App)
Klicke auf Choose repositories on GitHub und gib das Repository für die App frei.
Der Deploy bleibt auf Scheduled stehen
Warte einen Moment. Bleibt er länger als ein paar Minuten so, kontaktiere bitte den Support.
Der Webhook kommt nicht an oder GitHub zeigt Fehler 401
Das Secret stimmt nicht. Kopiere das Secret im Portal und trage es im Webhook neu ein. Mit New secret erzeugst du ein neues — ändere es danach auch bei deinem Git-Dienst.
Warum wurde mein Deploy übersprungen?
Mögliche Gründe: Die CI-Checks sind fehlgeschlagen, in der Commit-Nachricht steht [skip deploy], oder ein neuerer Auslöser hat einen noch wartenden Deploy ersetzt. Der Grund steht in der Zeile des Deploys.
Ich sehe keinen Status an meinem Commit
Show deploys in the repository muss eingeschaltet sein. Mit Token braucht der Token außerdem Schreibrechte (siehe Token-Rechte) — der Grund steht im Deploy-Log.
Der Deploy scheitert mit „The node rejected the request“
Der Typ deines Servers verbietet bestimmte Dateien, oder der Speicherplatz ist voll. Die Details stehen im Log.
Die Adresse meiner eigenen Gitea-Instanz wird abgelehnt
Selbst gehostete Instanzen müssen aus dem Internet erreichbar sein. Adressen aus dem Heimnetz wie 192.168.x.x funktionieren nicht.
Wie mache ich ein Rollback?
Klicke im Verlauf beim gewünschten früheren Deploy auf Deploy again.
Werden meine Spielwelt oder Datenbank überschrieben?
Nicht, wenn sie unter Protected paths stehen (z. B. world/ oder *.db).
Wer in meinem Team darf deployen?
Nur wer in den Subuser-Einstellungen des Servers das Recht deploy in der Gruppe Git Deploy hat. Der Besitzer des Servers darf immer alles.
Nächste Schritte
- Subuser — Gib deinem Team Zugriff und lege fest, wer deployen darf.
- Umgebungsvariablen — Halte Tokens und Passwörter aus deinem Repository heraus.
- Startup-Einstellungen — Lege den Startbefehl fest, mit dem dein deployter Code läuft.
- Backups — Speichere automatische Backups deines Servers in Google Drive.