feat(infra): déploie gitea + n8n-chlova sur local, topologie mono-hôte (v0.33.0)

Stacks gitea (1.26.4, git.pogoo.app) et n8n-chlova (2.20.8,
n8n-chlova.pogoo.app) déployés via Portainer sur l'hôte local (réseau proxy),
versionnés dans infra/. docker-compose.prod.yml recâblé pour le tout-local
(MCP_N8N_URL n8n-chlova, PORTAINER_URL interne, sidecar sur proxy). Runbook
deploy.md réécrit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016w5jRe87MGdd6AMvXQcHNi
This commit is contained in:
Kantin-Petit
2026-06-23 11:40:24 +02:00
parent d824d16eed
commit 4e23828dae
5 changed files with 217 additions and 104 deletions
+4 -3
View File
@@ -64,14 +64,15 @@ services:
image: portainer/portainer-mcp:0.6.0
restart: unless-stopped
environment:
PORTAINER_URL: ${PORTAINER_URL:?PORTAINER_URL requis} # URL PUBLIQUE Portainer (serveur sur autre hôte — cf. deploy.md)
PORTAINER_URL: ${PORTAINER_URL:-http://portainer:9000} # interne : Portainer sur le même hôte (local), réseau proxy
PORTAINER_MCP_AUTH_TOKEN: ${PORTAINER_MCP_AUTH_TOKEN:?requis} # token user chlova restreint
PORTAINER_READ_ONLY: ${PORTAINER_READ_ONLY:-true} # P1 : NE PAS passer à false
DOCKER_HOST: tcp://socket-proxy:2375
depends_on:
- socket-proxy
networks:
- chlova-internal
- chlova-internal # joignable par le backend
- proxy # joint le serveur Portainer (http://portainer:9000)
# AUCUN port publié.
# ── Backend CHLOVA : SEULE surface, cerveau (boucle agent) ──────────────
@@ -92,7 +93,7 @@ services:
OLLAMA_API_KEY: ${OLLAMA_API_KEY:?requis}
OLLAMA_MODEL: ${OLLAMA_MODEL:-qwen3:cloud}
# — MCP n8n (natif, interne via réseau proxy) —
MCP_N8N_URL: ${MCP_N8N_URL:-http://n8n:5678/mcp-server/http}
MCP_N8N_URL: ${MCP_N8N_URL:-http://n8n-chlova:5678/mcp-server/http}
MCP_N8N_AUTH_TOKEN: ${MCP_N8N_AUTH_TOKEN:?requis}
# — MCP Portainer (sidecar) —
MCP_PORTAINER_URL: ${MCP_PORTAINER_URL:-http://mcp-portainer:3000}
+43
View File
@@ -0,0 +1,43 @@
# Gitea — serveur git auto-hébergé du homelab, source du GitOps de CHLOVA.
#
# Déployé sur l'hôte `local` (Portainer endpoint 3), réseau `proxy`, exposé en
# https://git.pogoo.app via Traefik (resolver letsencrypt). DB = SQLite (volume).
# Installeur laissé ouvert au 1er run : l'opérateur crée le compte admin, puis
# l'enregistrement public reste désactivé. Voir docs/deploy.md §1.
#
# Image épinglée (jamais :latest). Aucune donnée sensible ici (admin créé en UI).
services:
gitea:
image: gitea/gitea:1.26.4
container_name: gitea
restart: unless-stopped
environment:
- USER_UID=1000
- USER_GID=1000
- TZ=Europe/Paris
- GITEA__server__DOMAIN=git.pogoo.app
- GITEA__server__ROOT_URL=https://git.pogoo.app/
- GITEA__server__DISABLE_SSH=true # push via HTTPS uniquement
- GITEA__database__DB_TYPE=sqlite3
- GITEA__service__DISABLE_REGISTRATION=true
volumes:
- gitea-data:/data
networks:
- proxy
labels:
- "traefik.enable=true"
- "traefik.docker.network=proxy"
- "traefik.http.routers.gitea.rule=Host(`git.pogoo.app`)"
- "traefik.http.routers.gitea.entrypoints=websecure"
- "traefik.http.routers.gitea.tls=true"
- "traefik.http.routers.gitea.tls.certresolver=letsencrypt"
- "traefik.http.services.gitea.loadbalancer.server.port=3000"
networks:
proxy:
name: proxy
external: true
volumes:
gitea-data:
+67
View File
@@ -0,0 +1,67 @@
# n8n dédié à CHLOVA — instance séparée du n8n de prospection (qui vit sur le VPS).
#
# Déployé sur l'hôte `local` (Portainer endpoint 3), réseau `proxy`, exposé en
# https://n8n-chlova.pogoo.app via Traefik (resolver letsencrypt). Joignable en
# interne par le backend CHLOVA : http://n8n-chlova:5678 (MCP natif sur
# /mcp-server/http). Voir docs/deploy.md §3b.
#
# Image épinglée (même tag que l'instance existante, connue bonne). La clé de
# chiffrement N8N_ENCRYPTION_KEY n'est PAS fournie ici : n8n l'auto-génère et la
# persiste dans le volume au 1er démarrage (instance mono-nœud).
services:
n8n:
image: docker.n8n.io/n8nio/n8n:2.20.8
container_name: n8n-chlova
restart: unless-stopped
volumes:
- n8n_chlova_data:/home/node/.n8n
environment:
- N8N_HOST=n8n-chlova.pogoo.app
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://n8n-chlova.pogoo.app/
- N8N_EDITOR_BASE_URL=https://n8n-chlova.pogoo.app/
- N8N_SECURE_COOKIE=true
- N8N_TRUST_PROXY=true
- N8N_PROXY_HOPS=1
- NODE_ENV=production
- N8N_DIAGNOSTICS_ENABLED=false
- N8N_VERSION_NOTIFICATIONS_ENABLED=false
- N8N_HIRING_BANNER_ENABLED=false
- N8N_PERSONALIZATION_ENABLED=false
- N8N_PUBLIC_API_DISABLED=true
- N8N_PUBLIC_API_SWAGGER_UI_DISABLED=true
- N8N_BLOCK_ENV_ACCESS_IN_NODE=true
- GENERIC_TIMEZONE=Europe/Paris
- TZ=Europe/Paris
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://localhost:5678/healthz || exit 1"]
interval: 30s
timeout: 5s
retries: 3
start_period: 30s
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
labels:
- "traefik.enable=true"
- "traefik.docker.network=proxy"
- "traefik.http.routers.n8n-chlova.rule=Host(`n8n-chlova.pogoo.app`)"
- "traefik.http.routers.n8n-chlova.entrypoints=websecure"
- "traefik.http.routers.n8n-chlova.tls=true"
- "traefik.http.routers.n8n-chlova.tls.certresolver=letsencrypt"
- "traefik.http.services.n8n-chlova.loadbalancer.server.port=5678"
networks:
- proxy
networks:
proxy:
name: proxy
external: true
volumes:
n8n_chlova_data:
driver: local