Docker Compose Skill
Formål
Denne skill bruges når TuxCore hjælper Thomas med Docker, Docker Compose, self-hosting, reverse proxy, serveropsætning og deployment.
Den er relevant for:
- TuxiNet.dk projekter
- DjGulvBasS.dk services
- StreamHub
- WordPress stacks
- Nginx Proxy Manager
- GitLab/Gitea
- PostgreSQL/MariaDB/Redis
- Monitoring
- MediaMTX/RTMP/HLS/WebRTC
- Lokale webapps
- Proxmox/LXC-baserede Docker hosts
Standardprincipper
- Brug
docker compose, ikke gammeldocker-compose, medmindre miljøet kræver det. - Brug ikke Portainer som standard.
- Brug
/docker_data/...som standardsti, hvis brugeren ikke angiver andet. - Brug
.envtil passwords, ports, domæner og variabler. - Brug named services med klare navne.
- Brug restart policy.
- Brug volumes så data overlever container-restarts.
- Eksponér kun nødvendige porte.
- Tænk reverse proxy ind, typisk Nginx Proxy Manager.
- Gør løsningen copy/paste-klar.
Standard mappestruktur
/docker_data/project-name/
├── docker-compose.yml
├── .env
├── data/
├── config/
├── logs/
└── backups/
Hvis projektet har database:
/docker_data/project-name/
├── docker-compose.yml
├── .env
├── app/
├── db/
├── config/
├── logs/
└── backups/
Compose standard
Et simpelt Compose-projekt bør typisk ligne dette princip:
services:
app:
image: example/image:latest
container_name: example-app
restart: unless-stopped
env_file:
- .env
volumes:
- ./data:/data
- ./config:/config
ports:
- "${APP_PORT}:8080"
.env standard
Brug .env til værdier der kan ændre sig:
APP_PORT=8080
TZ=Europe/Copenhagen
DB_NAME=appdb
DB_USER=appuser
DB_PASSWORD=change_this_password
DB_ROOT_PASSWORD=change_this_root_password
Netværk
Hvis projektet skal bag Nginx Proxy Manager på samme Docker host, kan der bruges et fælles eksternt netværk:
networks:
npm_proxy:
external: true
Service eksempel:
services:
app:
networks:
- npm_proxy
networks:
npm_proxy:
external: true
Hvis netværket ikke findes, opret det:
docker network create npm_proxy
Standardkommandoer
Start projekt:
cd /docker_data/project-name
docker compose up -d
Se status:
docker compose ps
Se logs:
docker compose logs -f
Se logs for én service:
docker compose logs -f app
Genstart:
docker compose restart
Stop:
docker compose down
Opdater image:
docker compose pull
docker compose up -d
docker image prune -f
Fejlfinding
Når brugeren skriver $docker $debug, bør TuxCore svare med:
- Hvad fejlen betyder.
- Mest sandsynlige årsag.
- Kommandoer til at undersøge problemet.
- Konkrete rettelser.
- Næste testtrin.
Typiske debug-kommandoer
docker compose ps
docker compose logs --tail=100
docker compose config
docker network ls
docker volume ls
docker ps
docker inspect container_name
Port check:
ss -tulpn | grep LISTEN
Find hvem der bruger en port:
sudo lsof -i :80
sudo lsof -i :443
sudo lsof -i :8080
Curl internt fra Docker host:
curl -I http://127.0.0.1:PORT
Curl mellem containere:
docker exec -it nginx-proxy-manager curl -I http://container-name:PORT
Reverse proxy standard
Ved Nginx Proxy Manager:
- Domain Names:
sub.domain.dk - Scheme:
http - Forward Hostname/IP: container-navn eller host-IP
- Forward Port: intern serviceport
- Websockets: aktiveres hvis appen kræver det
- SSL: Request new certificate
- Force SSL: aktiveres normalt
- HTTP/2: aktiveres normalt
Sikkerhedsregler
- Ingen passwords direkte i
docker-compose.yml, brug.env. - Expose ikke databaseporte til WAN.
- Bind følsomme admin-porte til localhost eller internt netværk når muligt.
- Brug stærke passwords.
- Brug separate databasebrugere pr. projekt.
- Brug backups for persistente data.
- Brug ikke
:latesttil kritiske produktionssystemer, hvis stabilitet er vigtig. - Skriv tydeligt hvilke porte der skal åbnes, og hvilke der kun er interne.
Database standard
MariaDB eksempel:
services:
db:
image: mariadb:11
container_name: project-db
restart: unless-stopped
env_file:
- .env
environment:
MYSQL_DATABASE: ${DB_NAME}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
volumes:
- ./db:/var/lib/mysql
PostgreSQL eksempel:
services:
postgres:
image: postgres:16
container_name: project-postgres
restart: unless-stopped
env_file:
- .env
environment:
POSTGRES_DB: ${DB_NAME}
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- ./db:/var/lib/postgresql/data
Redis eksempel:
services:
redis:
image: redis:7-alpine
container_name: project-redis
restart: unless-stopped
command: redis-server --appendonly yes
volumes:
- ./redis:/data
Backup standard
Manuelle backups bør typisk gemmes i:
/docker_data/project-name/backups/
MariaDB dump:
docker exec project-db mariadb-dump -u root -p"$DB_ROOT_PASSWORD" "$DB_NAME" > backups/db-$(date +%F-%H%M).sql
PostgreSQL dump:
docker exec project-postgres pg_dump -U "$DB_USER" "$DB_NAME" > backups/db-$(date +%F-%H%M).sql
Arkivér projektdata:
tar -czf backups/project-data-$(date +%F-%H%M).tar.gz data config
Når TuxCore laver $docker $full
Lever som udgangspunkt:
- Komplet
docker-compose.yml - Komplet
.env.example - Mappestruktur
- Opret-mapper kommandoer
- Startkommandoer
- Logs/testkommandoer
- Reverse proxy noter
- Backup-noter hvis relevant
Når TuxCore laver $docker $patch
Lever kun:
- Hvad der skal ændres.
- Den konkrete YAML/ENV ændring.
- Hvor ændringen skal placeres.
- Kommandoer til at validere og genstarte.
Acceptkriterier
En Docker-løsning er godkendt når:
docker compose configikke fejler.- Containers starter med
docker compose up -d. - Data ligger persistent under
/docker_data/.... .envbruges til secrets.- Ports er dokumenteret.
- Reverse proxy-flow er forklaret.
- Der er klare testkommandoer.
- Der er ingen Portainer-afhængighed.
Tags
docker, compose, docker-compose, tuxcore, tuxinet, nginx-proxy-manager, self-hosting, lxc, proxmox