Dokploy
Dokploy to centralna platforma do zarządzania deployami kontenerów w homelabiu. Manager stoi na Olaf-Test, deployuje zdalnie na Anna-Prod i Genie-Prod.
Dostęp i dane połączenia
| Parametr | Wartość |
|---|---|
| URL | http://192.168.0.108:3000 |
| Host | Olaf-Test (VM 112, 192.168.0.108) |
| Organization | My Organization |
| organizationId | 0jTlqBaY9_id4s5bX99xt |
| API key | <DOKPLOY_API_KEY> |
| Autoryzacja | Header: x-api-key |
| API typ | tRPC (nie klasyczny REST) |
Projekty i environmenty
| Projekt | projectId | environmentId |
|---|---|---|
| Anna-Prod | nYYLVEnj4kOB3D67Qb3d2 | Nuuww0EcJjti02dXceyua |
| Genie-Prod | -- | PDZyYD9_Icio-4lKtYPvc |
| Olaf-Test | -- | jBw1GyDCb8jgiRSMkqM-2 |
Serwery w Dokploy
| Serwer | serverId | IP | Username |
|---|---|---|---|
| Anna-Prod | NwNINc2p5yUciDoHUA0sI | 192.168.0.162 | root |
| Geenie-Prod | v35KYITpacvy1ecpKc7NG | 192.168.0.107 | root |
Anna nie jest onboardowana przez standardowy "Setup Server" Dokploy (bo to stawia własnego Traefika i koliduje z istniejącym ingress). Zamiast tego Dokploy deployuje na Anna zdalnie po SSH jako root.
API — schemat pracy
Dokploy używa tRPC. Potwierdzone endpointy:
| Endpoint | Metoda | Opis |
|---|---|---|
/api/trpc/compose.create | POST | Tworzenie nowego compose |
/api/trpc/compose.update | POST | Aktualizacja compose (composeFile, env, sourceType) |
/api/trpc/compose.one?input=... | GET | Szczegóły jednego compose |
/api/trpc/compose.deploy | POST | Deploy compose |
/api/trpc/project.all | GET | Lista projektów |
Wzór pracy przy migracji stacka:
compose.createznameienvironmentIdcompose.updatezcomposeFile,env,description,sourceType=raw,autoDeploy=false- Dopisanie
serverIddo tabelicomposew bazie Dokploy (przez SQL — patrz znane bugi) compose.deploy
Przykładowe komendy:
# Lista projektów
ssh 192.168.0.108 "curl -s -H 'x-api-key: <API_KEY>' http://127.0.0.1:3000/api/trpc/project.all"
# Deploy compose
ssh 192.168.0.108 "curl -s -X POST -H 'content-type: application/json' \
-H 'x-api-key: <API_KEY>' \
'http://127.0.0.1:3000/api/trpc/compose.deploy' \
--data '{\"json\":{\"composeId\":\"<COMPOSE_ID>\"}}'"
# Dopięcie serverId w DB
ssh 192.168.0.108 "printf '%s\n' '<sudo_pass>' | sudo -S docker exec \
dokploy-postgres.1.nujhy0gd507gol4ekqzmxxxpi \
psql -U dokploy -d dokploy \
-c \"UPDATE compose SET \\\"serverId\\\" = '<serverId>' WHERE \\\"composeId\\\" = '<ID>';\""
Znane bugi Dokploy
Bug 1: serverId nie zapisuje się przez API
compose.update nie zapisuje poprawnie serverId. Trzeba wbijać ręcznie w bazie:
UPDATE compose
SET "serverId" = 'NwNINc2p5yUciDoHUA0sI'
WHERE "composeId" = '<ID>';
Bug 2: SSH key mismatch
Public key widoczny w UI Dokploy nie odpowiadał private key trzymanemu w DB. Naprawione na Anna i Genie — nie ruszać jeśli nie ma nowego problemu.
Bug 3: Container name conflict
Docker trzyma nazwę starego kontenera mimo że docker ps nie pokazuje aktywnego kontenera. Typowy log:
Conflict. The container name "/<name>" is already in use
Rozwiązanie:
ssh 192.168.0.162 'docker rm -f <container_name> 2>/dev/null || true'
Potem ponowić compose.deploy.
Bug 4: Multiline env
Dokploy rozwija \n w wartościach env do prawdziwych nowych linii. Docker Compose widzi to jako wielokrotne klucze bez = i odrzuca plik. Rozwiązanie: wyrzucić multiline wartości z env w Dokploy, ustawiać je ręcznie na hoście.
Bug 5: Relative bind mounts
Relative paths (./data) rozwiązują się do /etc/dokploy/compose/<appname>/code/, a nie do /srv/compose/<stack>/. Rozwiązanie: zawsze używać absolutnych ścieżek w compose files.
Bug 6: env_file w raw mode
env_file: .env.production nie działa w Dokploy raw mode — Dokploy generuje tylko .env. Rozwiązanie: zmienić na env_file: .env.
Docker Swarm
| Rola | Node |
|---|---|
| Leader | Olaf |
| Reachable manager | Genie |
| Worker | Anna |
Swarm jest zestawiony, ale nie jest aktywnie używany do orkiestracji. Usługi są deployowane jako zwykłe Compose przez Dokploy. Swarm będzie rozważany dopiero po pełnej standaryzacji.