82 lines
3.2 KiB
Markdown
82 lines
3.2 KiB
Markdown
---
|
||
title: Docker-stack
|
||
created: 2026-10-19
|
||
status: aktiv
|
||
tags:
|
||
- projekt
|
||
---
|
||
|
||
# Docker-stack
|
||
|
||
> [!abstract] Översikt
|
||
> Hemmaservern `zeuz`. Allt definieras i repot `~/repo/Docker` och körs med `docker compose`. Traefik tar emot all webbtrafik bakom Cloudflare och routar `<namn>.milvert.com` till rätt container.
|
||
|
||
## Layout
|
||
|
||
```
|
||
Internet → Cloudflare → Traefik (80/443) → container på nätverket backend
|
||
```
|
||
|
||
| Var | Vad |
|
||
| --- | --- |
|
||
| `~/repo/Docker/docker-compose.yml` | Huvudfilen, nästan alla tjänster |
|
||
| `~/repo/Docker/.env` | Variabler: `DOMAIN`, `DIR_LOCAL`, `SECRETSDIR`, `UID`/`GID`, `TZ` |
|
||
| `~/repo/Docker/secrets/` | Lösenord som filer, en per hemlighet (ej i git) |
|
||
| `~/repo/Docker/<tjänst>/` | Konfigfiler som ska versionshanteras |
|
||
| `/opt/docker_data/<tjänst>/` | Data (`${DIR_LOCAL}`), ej i git |
|
||
| `~/repo/Docker/traefik/` | Middlewares och TLS-inställningar |
|
||
|
||
**Middleware-kedjor** – väljs per tjänst:
|
||
|
||
- `chain-authelia` – kräver inloggning via Authelia. Standard för admin-gränssnitt.
|
||
- `chain-no-auth` – ingen inloggning, men rate limit och säkerhetsheaders. För tjänster med egen inloggning.
|
||
- `chain-local` – bara åtkomst från lokalt nät.
|
||
- Ingen kedja – bara när kedjorna bryter något (t.ex. CouchDB, där headers och rate limit stör synken).
|
||
|
||
**Nätverk:** allt som Traefik ska nå ligger på `backend`.
|
||
|
||
## Lägga till en ny tjänst
|
||
|
||
1. **Lägg till tjänsten** sist bland `services:` i `docker-compose.yml`:
|
||
|
||
```yaml
|
||
minapp:
|
||
image: org/minapp:1.2 # lås version, undvik latest
|
||
container_name: minapp
|
||
restart: unless-stopped
|
||
networks:
|
||
- backend
|
||
environment:
|
||
- TZ=${TZ}
|
||
volumes:
|
||
- ${DIR_LOCAL}/minapp:/data
|
||
labels:
|
||
- diun.enable=true # notis om nya versioner
|
||
- "traefik.enable=true"
|
||
- "traefik.http.services.minapp-service.loadbalancer.server.port=8080"
|
||
- "traefik.http.routers.minapp-secure.entrypoints=web-secure"
|
||
- "traefik.http.routers.minapp-secure.rule=Host(`minapp.${DOMAIN}`)"
|
||
- "traefik.http.routers.minapp-secure.tls.certresolver=milvert_dns"
|
||
- "traefik.http.routers.minapp-secure.tls=true"
|
||
- "traefik.http.routers.minapp-secure.middlewares=chain-authelia@file"
|
||
```
|
||
|
||
2. **Lösenord:** lägg dem i `secrets/minapp_password` (`chmod 600`), lägg till under `secrets:` överst i compose-filen och läs dem i containern från `/run/secrets/minapp_password`. Klarar imagen inte `_FILE`-variabler, använd ett litet entrypoint-skript som läser filen.
|
||
3. **Portar:** publicera inga `ports:` om tjänsten bara ska nås via Traefik.
|
||
4. **Starta bara den nya tjänsten:**
|
||
|
||
```sh
|
||
docker compose up -d minapp
|
||
```
|
||
|
||
5. **Vänta på certifikatet.** DNS-utmaningen tar ett par minuter. Fram till dess ger Cloudflare fel 525.
|
||
6. **Committa** compose-filen och eventuella konfigfiler i `~/repo/Docker`.
|
||
|
||
> [!tip] Felsökning
|
||
> - Traefik loggar till fil: `docker exec traefik tail /log/info.log`
|
||
> - Testa förbi Cloudflare: `curl --resolve minapp.milvert.com:443:127.0.0.1 https://minapp.milvert.com/`
|
||
|
||
## Utanför huvudfilen
|
||
|
||
Några tjänster körs separat: Dockge-stackar i `stacks/`, Bitwarden, evcc och zigbee2mqtt.
|