# ExcaliCloud services: excalicloud: build: context: . args: # Vide : version figée dans frontend/package-lock.json. Renseignée (dans .env # ou en ligne de commande), l'image est reconstruite avec cette version. EXCALIDRAW_VERSION: ${EXCALIDRAW_VERSION:-} image: excalidraw-go:local restart: unless-stopped # ports: # - "${EXCALIDRAW_PORT:-8080}:8080" environment: # Authentification : local (Basic avec AUTH_USER/AUTH_PASSWORD, aucune si # vides, ex. derrière un reverse proxy avec SSO) ou oidc (OIDC_* ci-dessous). AUTH_MODE: ${AUTH_MODE:-local} AUTH_USER: ${AUTH_USER:-} AUTH_PASSWORD: ${AUTH_PASSWORD:-} # Mode oidc : fournisseur OpenID Connect (Authentik, Keycloak...). Client # confidentiel (secret) ou public (PKCE seul) ; URI de redirection à # déclarer chez le fournisseur : https:///auth/callback. OIDC_ISSUER: ${OIDC_ISSUER:-} OIDC_CLIENT_ID: ${OIDC_CLIENT_ID:-} OIDC_CLIENT_SECRET: ${OIDC_CLIENT_SECRET:-} # Vide : déduite de la requête (en-têtes X-Forwarded-* du reverse proxy). OIDC_REDIRECT_URL: ${OIDC_REDIRECT_URL:-} OIDC_SCOPES: ${OIDC_SCOPES:-openid profile email} # Groupes autorisés, séparés par des virgules (vide : tout compte authentifié). OIDC_ALLOWED_GROUPS: ${OIDC_ALLOWED_GROUPS:-} OIDC_GROUPS_CLAIM: ${OIDC_GROUPS_CLAIM:-groups} # Déconnexion propagée au fournisseur (end_session_endpoint). OIDC_LOGOUT: ${OIDC_LOGOUT:-true} # Session : durée d'inactivité max, clé de signature des cookies (16 car. # min. ; vide : clé aléatoire générée dans DATA_DIR/.session-secret). SESSION_TTL: ${SESSION_TTL:-24h} SESSION_SECRET: ${SESSION_SECRET:-} # Taille max d'un schéma (images embarquées en base64 comprises). MAX_BODY_MB: ${MAX_BODY_MB:-50} # Icône « mise à jour d'Excalidraw disponible » (interroge registry.npmjs.org). UPDATE_CHECK: ${UPDATE_CHECK:-true} UPDATE_CHECK_INTERVAL: ${UPDATE_CHECK_INTERVAL:-12h} # Historique des versions (DATA_DIR/.history) : versions gardées par schéma # (0 : désactivé), écart minimal entre deux versions, âge max (0 : illimité). HISTORY_KEEP: ${HISTORY_KEEP:-50} HISTORY_INTERVAL: ${HISTORY_INTERVAL:-10m} HISTORY_MAX_AGE: ${HISTORY_MAX_AGE:-0} # Clé de signature des liens de partage /s/ (16 caractères min.). # Vide : clé aléatoire générée dans DATA_DIR/.share-secret. SHARE_SECRET: ${SHARE_SECRET:-} # URL publique (ex. https://excalicloud.example.org) : identifiant de la # ressource OAuth du serveur MCP (/mcp). Vide : origine de # OIDC_REDIRECT_URL, sinon déduite des en-têtes X-Forwarded-*. PUBLIC_URL: ${PUBLIC_URL:-} # Hôtes autorisés pour les retours OAuth des connecteurs MCP (https) ; # localhost (Claude Code) est toujours accepté. OAUTH_REDIRECT_HOSTS: ${OAUTH_REDIRECT_HOSTS:-claude.ai,claude.com} volumes: # Volume nommé : les droits (uid 65532) sont hérités de l'image. # Pour un bind mount (ex. ./data:/data), faire `chown -R 65532:65532 ./data`. - ./data:/data read_only: true cap_drop: [ALL] security_opt: - no-new-privileges:true networks: - traefik-net networks: traefik-net: external: true