# Déploiement sur le Synology DS218+ (Container Manager → Projet). # # Principe : aucun port n'est publié, ni sur le réseau local ni sur Internet. Le seul # chemin d'entrée est le tunnel Cloudflare, qui ouvre une connexion SORTANTE depuis le # NAS. La box reste close. # # Les secrets vivent dans un fichier `.env` posé À CÔTÉ de ce fichier, sur le NAS. Il # n'entre jamais dans Git. Voir docs/DEPLOIEMENT.md. services: api: # Étiquette suivie : `latest` = dernière fusion sur main. Pour figer une version # précise, remplacer par `ghcr.io/regis57/altiplume@sha256:`. # C'est l'image de l'auteur : pour votre propre version, publiez la vôtre depuis votre # copie du dépôt et remplacez par `ghcr.io//:latest` # (voir docs/DEPLOIEMENT.md, la note en tête). image: ghcr.io/regis57/altiplume:latest container_name: altiplume-api restart: unless-stopped env_file: [.env] environment: NODE_ENV: production HOST: 0.0.0.0 PORT: "3000" DATABASE_PATH: /data/altiplume.db volumes: # Volume nommé plutôt que dossier du NAS : Docker en gère les droits, et # l'utilisateur non-root du conteneur peut y écrire sans bricolage de permissions. - altiplume-data:/data # Le code et le système de fichiers sont immuables ; seul /data est écrivable. read_only: true tmpfs: - /tmp:size=16m,mode=1777 security_opt: - no-new-privileges:true cap_drop: [ALL] networks: [altiplume] # Pas de `ports:` — volontairement. Rien n'est exposé. logging: driver: json-file options: { max-size: "10m", max-file: "3" } tunnel: image: cloudflare/cloudflared:latest container_name: altiplume-tunnel restart: unless-stopped command: tunnel run environment: # Jeton du tunnel, fourni par Cloudflare. C'est un secret : il vit dans .env. TUNNEL_TOKEN: ${TUNNEL_TOKEN:?definir TUNNEL_TOKEN dans .env} depends_on: [api] read_only: true security_opt: - no-new-privileges:true cap_drop: [ALL] networks: [altiplume] logging: driver: json-file options: { max-size: "10m", max-file: "3" } networks: altiplume: driver: bridge volumes: altiplume-data: