name: librodrome services: app: build: context: ../ dockerfile: docker/Dockerfile target: production environment: NODE_ENV: ${NODE_ENV:-production} NUXT_PUBLIC_SITE_URL: ${NUXT_PUBLIC_SITE_URL:-https://librodrome.org} NUXT_ADMIN_PASSWORD: ${NUXT_ADMIN_PASSWORD} NUXT_ADMIN_SECRET: ${NUXT_ADMIN_SECRET} ADMIN_GIT_SYNC: ${ADMIN_GIT_SYNC:-false} NUXT_PUBLIC_UMAMI_URL: ${NUXT_PUBLIC_UMAMI_URL:-} NUXT_PUBLIC_UMAMI_WEBSITE_ID: ${NUXT_PUBLIC_UMAMI_WEBSITE_ID:-} NUXT_UMAMI_API_KEY: ${NUXT_UMAMI_API_KEY:-} ports: - 3000 volumes: # Données runtime (messages des visiteurs). L'image tourne dans /app et # le serveur lit process.cwd()/data : le volume se monte sur /app/data. # Volume nommé, pas un chemin relatif : la CI lance compose depuis son # espace de travail, où un chemin relatif désigne un dossier vide de l'hôte. - data:/app/data restart: always labels: - "traefik.enable=true" - "traefik.http.routers.librodrome.rule=Host(`librodrome.org`)" - "traefik.http.routers.librodrome.entrypoints=websecure" - "traefik.http.routers.librodrome.tls.certresolver=letsencrypt" - "traefik.http.services.librodrome.loadbalancer.server.port=3000" volumes: # Créé à la main sur le serveur avant le premier déploiement (acte du # 2026-10-26). external : compose ne le crée ni ne le supprime jamais # (`down -v` compris), et un déploiement sans lui échoue au lieu de # repartir de la graine. data: name: librodrome-data external: true