Documentation Index
Fetch the complete documentation index at: https://docs.snakysec.com/llms.txt
Use this file to discover all available pages before exploring further.
OpenProject Setup — Runbook
Runbook opérationnel pour OpenProject Community Edition 14 self-hosted. Stack :platform/compose/openproject.yml(app + worker + Postgres dédié + Memcached). Source de vérité projet :docs/project/roadmap.yml(importé viaseed-openproject.mjs).
TL;DR
Note compose env : la variableAprès le seed, OpenProject contient :OPENPROJECT_AVAILABLE__LANGUAGESne doit pas être définie dans l’overlay — elle rend le settingavailable_languagesnon writable côté DB et casse ledb:seed(Setting::NotWritableError). Configurer les langues disponibles via Admin → Languages.
- 1 projet
SnakySec V1 Q2 2026 - 7 versions (1 archive V1 + 4 sprints + Patterns transverses + Backlog Q3 2026)
- 86 work packages (24 V1 + 4 arbitrages + 35 recos UX + 10 patterns + 6 bugs + 7 backlog)
Plan B — Custom fields + Types Epic/Bug (manuel UI, ~30 min)
L’API v3 d’OpenProject Community ne permet pas de créer custom fields ni de définir de nouveaux types — ces opérations sont réservées à l’admin UI. Une fois ce step fait, re-runnermake openproject-seed enrichit
automatiquement les WPs avec les valeurs custom du YAML.
Step 1 : Activer Epic + Feature + User Story + Bug + Documentation
- Login admin →
/admin/types - Pour chaque type non-existant (Epic, Feature, User Story, Bug, Documentation) :
- Cliquer + Type
- Nom :
Epic(puisFeature, etc.) - Couleur : choisir distinctive (Epic violet, Bug rouge, Feature bleu, Documentation gris, User Story vert)
- Save
- Vérifier que les 5 nouveaux types apparaissent à
/admin/types
Step 2 : Activer ces types pour le projet snakysec-v1
- Project menu → Project settings → Types
- Cocher : Epic, Feature, User Story, Bug, Documentation (en plus de Tâche déjà actif)
- Save
Step 3 : Créer les Custom Fields
/admin/custom_fields → + Custom field pour chacun :
| Name | Type | Format | Required | Pour les types |
|---|---|---|---|---|
Effort | List | List | No | All work package types |
Persona ciblé | List | List | No | Feature, User Story, Task |
Problèmes adressés | Long text | Long text | No | All |
ID UX | String | String | No | All |
Axes DICT | List | List (multi-select) | No | All |
Framework | List | List (multi-select) | No | All |
Effort : S / M / L
Options pour Persona ciblé : MSSP Operator / Client PME / Les deux
Options pour Axes DICT : Disponibilité / Intégrité / Confidentialité / Traçabilité
Options pour Framework : CIS / SCuBA / ISO27001 / NIS2 / RGPD / ANSSI / eIDAS
Step 4 : Activer les Custom Fields pour le projet
- Project menu → Project settings → Custom fields
- Cocher les 6 nouveaux + Save
Step 5 : Re-runner le seed
- Re-mappe les types YAML (
Epic,Feature, etc.) vers leurs nouveaux ids OpenProject - Pousse les valeurs
custom.effort,custom.persona,custom.prob_addressed, etc. depuis le YAML
Step 6 : Configurer les vues sauvegardées
À faire manuellement dans l’UI (~10 min) :-
Vue Gantt exécutif :
/projects/snakysec-v1/work_packages→ vue Gantt chart- Filtres : Type ∈ Epic, Feature, User Story
- Colonnes : Subject, Type, Priority, Assignee, Start date, Due date, Estimated time
- Save as new view → “V1 Gantt exécutif”
-
Vue Kanban Sprint 1 :
- Vue Board → Group by Status
- Filtres : Version = “Sprint 1 — Bases produit”
- Save as → “Sprint 1 Kanban”
-
Vue Tableau complet :
- Vue Table (default)
- Colonnes : ID, Subject, Type, Status, Priority, Assignee, Estimated time, Version, Custom: Effort, ID UX
- Save as → “V1 Tableau exécutif”
Architecture
openproject-net(interne, isolation BD/cache)mssp-net(exposition Traefik, accès Vault)
Secrets Vault
Path :mssp/data/openproject
| Clé | Type | Rotation | Notes |
|---|---|---|---|
secret_key_base | Hex 128 | Jamais sans purge sessions | Rails session encryption |
db_password | Random 32 | Jamais sans reset DB | Postgres user openproject |
admin_password | Random 24 | À la demande (--rotate-admin) | Initial admin login uniquement |
admin_email | String | À la demande | Default admin@snakysec.com |
Workflow quotidien
1. Voir l’état du stack
2. Updater la roadmap
Source de vérité :docs/project/roadmap.yml
- Éditer le YAML (ajout chantier, change status, dates)
- Re-seed (idempotent — n’écrase pas les modifs UI faites entre temps) :
3. Backup ad-hoc DB
4. Restaurer un dump
5. Shell Postgres
Vues et configuration UI
Après seed initial, configurer les vues globales (Admin → System → Work Package types).Vue Gantt (timeline)
- Aller sur
/projects/snakysec-v1/work_packages - Cliquer “Gantt chart” dans le sélecteur de vue
- Filtres recommandés :
- Type : Epic + Feature + User Story (cacher Tasks/Bugs/Doc pour vue exec)
- Date colonnes : start_date / due_date
- Sauvegarder vue : “Save as new view” → “V1 Q2 2026 Gantt exécutif”
Vue Kanban
- Cliquer “Board” dans le sélecteur de vue
- Group by : Status
- Filtres : Version = “Sprint 1 — Bases produit” (ou autre sprint actif)
- Sauvegarder : “Sprint 1 Kanban”
Vue Tableau (spreadsheet-like, éditable inline)
- Cliquer “Table” dans le sélecteur de vue (par défaut)
- Colonnes recommandées :
- ID, Subject, Type, Status, Priority, Assignee, Start date, Due date, Version, Custom: Effort, Custom: Persona, Custom: ux_id
- Inline edit : clic sur une cellule pour la modifier directement
- Sauvegarder : “V1 Tableau complet”
Custom fields
Si les custom fields (effort, persona, prob_addressed, ux_id, dict_axes, framework) ne sont pas créés automatiquement par le seed (ils dépendent de l’admin OpenProject), créer manuellement via :
Admin → Custom fields → New custom field
Pour chacun :
- Type : List (effort, persona, dict_axes, framework) ou Text (prob_addressed) ou String (ux_id)
- Cocher “For all projects” et “Required” = NON
- Mappings dans
docs/project/roadmap.ymlsectioncustom_fields
Backup et DR
Stratégie
OpenProject DB doit être incluse dans le plan de backup PG.- DB :
openproject-dbPostgres dédié → dump quotidien via Ofelia - Assets : volume
openproject-assets→ snapshot rsync - Vault secrets : déjà inclus dans le plan Vault DR (Shamir 5/3)
Ofelia config
À ajouter dansplatform/docker/ofelia/config.ini :
Restore en cas d’incident
make openproject-down- Identifier le dump cible :
ls -lt artifacts/backup/openproject-pg/ make openproject-up(DB vide)- Attendre que
openproject-dbsoit healthy docker exec -i openproject-db pg_restore -U openproject -d openproject -c < <dump>- Restart :
make openproject-restart
Troubleshooting
”OpenProject is starting up…” pendant >5 min
Premier boot = Rails asset compile + DB migrate. Normal jusqu’à ~5 min.”Vault is sealed” → entrypoint échoue
“Connection refused” sur openproject.localhost
- Vérifier
app.localhostfonctionne (Traefik OK ?) - Vérifier label Traefik :
docker inspect openproject-app | grep Host - Vérifier que mkcert a généré le wildcard
*.localhost(sinonmake certs)
“Database password authentication failed”
Cause :db_password dans Vault ≠ password actuel Postgres.
Si juste boot initial → vérifier setup-openproject-secrets.sh a tourné.
Si après restore → resetter le password :
Performance lente après plusieurs mois
Production deployment (VPS OVH)
À faire quand pré-prod stable et 1er client payant. Étapes :- Adapter overlay :
compose/openproject.yml→ utiliser image avec tag pinned (openproject/community:14.x.yau lieu de:14) - Reverse proxy : configurer LE wildcard pour
openproject.snakysec.comdans Traefik prod - Variable env :
OPENPROJECT_HOST=openproject.snakysec.com - Backup : confirmer Ofelia tourne et upload vers OVH Object Storage
- Vault : confirmer policy mssp-app accède bien à
mssp/data/openprojecten prod - Smoke test :
curl https://openproject.snakysec.com/health_checks/default
Références
- Docs OpenProject : https://www.openproject.org/docs/installation-and-operations/installation/docker/
- API v3 : https://www.openproject.org/docs/api/
- Source roadmap :
docs/project/roadmap.yml - Script seed :
platform/scripts/seed-openproject.mjs - Setup secrets :
platform/scripts/setup-openproject-secrets.sh - Compose overlay :
platform/compose/openproject.yml - Vault entrypoint :
platform/docker/openproject/entrypoint.sh