Rendre le compose deployable depuis le depot

env_file rendait obligatoire un fichier non versionne : un clone neuf, ou une
stack Portainer construite depuis Git, echouait avec "env file .env not found".
La declaration etait de toute facon redondante, Compose lisant deja un .env
voisin pour resoudre les interpolations, et toutes les variables du .env.example
etant couvertes par environment: ou ports:.

Verifie : configuration resolue identique avec un .env present, a l'exception de
APP_PORT qui n'est plus injecte dans le conteneur. C'est une variable cote hote,
que le backend ne lit jamais et dont le port est fige dans le CMD.

Documente le deploiement par stack Portainer : variables d'environnement en
remplacement du .env, emplacement et proprietaire du dossier de donnees (uid
10001), mise a jour, administration par la console, et cas du proxy en Docker.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-10 11:08:30 +02:00
parent 9ede2c5e68
commit 55e5b359a1
2 changed files with 111 additions and 2 deletions

107
README.md
View File

@@ -424,6 +424,113 @@ identifier une ligne, insuffisant pour ouvrir le lien.
--- ---
## Deploiement avec Portainer
OpenMind se deploie comme une **stack** Portainer construite directement depuis
le depot Git. Aucun registre d'images n'est necessaire : Portainer clone le
depot et lance le build multi-etapes.
### 1. Creer la stack
*Stacks* -> *Add stack* -> onglet **Repository** :
| Champ | Valeur |
|---|---|
| Name | `openmind` |
| Repository URL | l'URL de clone du depot |
| Repository reference | `refs/heads/main` |
| Compose path | `docker-compose.yml` |
| Authentication | uniquement si le depot est prive |
Le premier deploiement compile le frontend puis l'image Python : comptez
plusieurs minutes. Les suivants reutilisent le cache de build.
### 2. Renseigner les variables
Le fichier `.env` n'est **pas** dans le depot : c'est normal, il contient la
configuration de votre instance. Utilisez la section **Environment variables**
de la stack, qui joue exactement le meme role. Toutes les variables ont une
valeur par defaut : ne declarez que ce que vous changez.
Pour une instance publique derriere un reverse proxy :
| Variable | Valeur |
|---|---|
| `APP_BIND` | `127.0.0.1` si le proxy tourne sur l'hote |
| `TRUST_PROXY_HEADERS` | `true` |
| `TRUSTED_PROXY_CIDRS` | le reseau d'ou arrivent les connexions du proxy |
| `DEFAULT_SHARE_EXPIRY_DAYS` | `30` |
| `MAX_SHARED_MAPS` | `10000` |
Rappel : `TRUST_PROXY_HEADERS=true` sans `TRUSTED_PROXY_CIDRS` **empeche le
demarrage**, volontairement. Si la stack ne demarre pas, la raison est dans les
logs du conteneur, en clair.
### 3. Le dossier de donnees
Le compose monte `./data` a cote du fichier compose, c'est-a-dire dans le
repertoire de la stack cree par Portainer, typiquement :
```
/var/lib/docker/volumes/portainer_data/_data/compose/<id-de-la-stack>/data/
```
Ce dossier contient `openmind.db` et vos sauvegardes : **c'est lui qu'il faut
sauvegarder**. Si vous preferez un emplacement stable et explicite, remplacez la
ligne de volume par un chemin absolu de l'hote :
```yaml
volumes:
- /srv/openmind/data:/app/data
```
Le conteneur tourne sous l'uid **10001**. Si vous creez le dossier vous-meme,
donnez-lui le bon proprietaire, sinon SQLite ne pourra pas ecrire :
```bash
sudo mkdir -p /srv/openmind/data
sudo chown -R 10001:10001 /srv/openmind/data
```
### 4. Mettre a jour
*Stacks* -> `openmind` -> **Pull and redeploy**, en cochant *Re-pull image and
redeploy* pour reconstruire. Les migrations de schema s'appliquent seules au
demarrage ; les partages existants sont conserves.
### 5. Administration
Portainer donne acces a la console du conteneur (*Containers* -> `openmind` ->
*Console*, commande `/bin/sh`). Toutes les commandes d'administration y
fonctionnent telles quelles :
```bash
python -m app.cli stats
python -m app.cli shares purge-expired --dry-run
python -m app.cli backup /app/data/backups/openmind.db --yes --keep 7
```
Pour automatiser sauvegarde et purge, gardez cron ou un timer systemd sur
l'hote : `docker exec openmind python -m app.cli ...`.
### Si le proxy tourne aussi dans Docker
Retirez la publication de port et placez les deux conteneurs sur un reseau
commun. Dans Portainer, ajoutez ces lignes a la stack :
```yaml
services:
openmind:
ports: !reset []
networks: [proxy]
networks:
proxy:
external: true
```
---
## Deploiement derriere un reverse proxy ## Deploiement derriere un reverse proxy
Le conteneur ecoute simplement sur `8080` en HTTP. Le TLS est termine par le Le conteneur ecoute simplement sur `8080` en HTTP. Le TLS est termine par le

View File

@@ -6,8 +6,10 @@ services:
image: openmind:latest image: openmind:latest
container_name: openmind container_name: openmind
restart: unless-stopped restart: unless-stopped
env_file: # Pas de `env_file` : Compose lit deja automatiquement un fichier .env place
- .env # a cote de ce compose pour resoudre les ${...} ci-dessous. Le declarer
# explicitement rendrait ce fichier obligatoire, et un deploiement depuis le
# depot (Portainer, clone neuf) echouerait, .env n'etant pas versionne.
environment: environment:
# Le conteneur ecoute toujours sur 8080 ; APP_PORT ne change que l'hote. # Le conteneur ecoute toujours sur 8080 ; APP_PORT ne change que l'hote.
APP_NAME: ${APP_NAME:-OpenMind} APP_NAME: ${APP_NAME:-OpenMind}