docs(lxc103): document overlay network race condition + heal script fix

Bug confirmat Dokploy #2033 + docker/compose #12862: Docker Compose containers
cu external overlay network pică la restart Docker (exit 128, network not found).
Documentat cauza, fix-ul generic dokploy-compose-heal.service și fix-ul DNS daemon.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-04-28 11:54:53 +00:00
parent e08ffb1b68
commit ffe3806d43

View File

@@ -222,6 +222,86 @@ systemctl restart dokploy-dnsrr-fix
--- ---
## Fix: Docker Compose — Overlay Network Race Condition la Restart (Bug Permanent Rezolvat)
### Problema
Proiectele **Docker Compose** din Dokploy (ex: space-booking) care folosesc
`dokploy-network` ca rețea externă (`external: true`) **pică la restart Docker**.
Eroarea din `docker inspect <container>`:
```
failed to set up container networking: could not find a network matching
network mode dokploy-network: network dokploy-network not found
```
Container-ul iese cu **exit code 128** și nu mai pornește singur.
### Cauza
Race condition confirmat în:
- **Dokploy** issues #2033, #1802 — fără fix livrat
- **Docker Compose** upstream issue #12862 — nerezolvat (aprilie 2026)
La restart Docker daemon:
1. Docker Swarm inițializează rețelele overlay (`dokploy-network`) — durează câteva secunde
2. Docker Compose containers cu `restart: unless-stopped` pornesc **imediat**
3. `dokploy-network` nu e încă disponibilă → exit 128
Serviciile **Swarm** (Application type în Dokploy) nu au această problemă —
orchestratorul știe să aștepte rețelele înainte de a programa task-urile.
### De ce Docker Compose în loc de Application (Swarm)
Proiectele multi-serviciu (ex: frontend + backend) rămân Compose deoarece
serviciile comunică intern între ele (ex: nginx `proxy_pass http://backend:8000`
pe o rețea bridge shared). Conversia la Swarm Application ar necesita modificări
în codul aplicației.
### Soluția
Script generic care rulează la boot, așteaptă `dokploy-network` și repornește
**orice** container Compose eșuat din cauza lipsei rețelei:
```bash
# Script: /usr/local/bin/dokploy-compose-heal.sh
# Service: /etc/systemd/system/dokploy-compose-heal.service (enabled)
```
Logica scriptului:
- Polling `dokploy-network` disponibil (max 90s, interval 3s)
- Caută containere cu `exit code 128` + eroare "network" + label `com.docker.compose.project`
- Le repornește — **nu atinge** containerele oprite intenționat (exit 0)
```bash
# Verificare status
systemctl status dokploy-compose-heal
# Logs la ultimul boot
journalctl -u dokploy-compose-heal -n 30
# Rulare manuală (după un docker restart neașteptat)
systemctl start dokploy-compose-heal
```
### Fix aditional: DNS Docker daemon
Docker containers foloseau implicit DNS-ul Tailscale (`100.100.100.100`)
care **nu e accesibil** din interiorul containerelor — Dokploy primea
`ESERVFAIL` la validarea domeniilor.
Fix aplicat în `/etc/docker/daemon.json`:
```json
{"dns": ["8.8.4.4", "8.8.8.8"]}
```
### Pentru orice proiect Compose nou în Dokploy
1. Adaugă domeniul în **Dokploy UI → Domains → Add Domain** (nu doar în labels din docker-compose.yml)
— Dokploy generează `.yml` static în Traefik dynamic config, persistent la restart
2. Dacă containerul pică după restart Docker → `systemctl start dokploy-compose-heal` rezolvă automat
---
## Documentație Asociată ## Documentație Asociată
- **Arhitectură completă IIS:** `../vm201-windows/docs/vm201-dokploy-infrastructure.md` - **Arhitectură completă IIS:** `../vm201-windows/docs/vm201-dokploy-infrastructure.md`
@@ -233,6 +313,6 @@ systemctl restart dokploy-dnsrr-fix
--- ---
**Ultima actualizare:** 2026-03-03 **Ultima actualizare:** 2026-04-28
**Autor:** Marius Mutu **Autor:** Marius Mutu
**Proiect:** ROMFASTSQL - LXC 103 Dokploy **Proiect:** ROMFASTSQL - LXC 103 Dokploy