Files
limier/docs/02-deploiement.md
hcornet 5bccd86edc
CI / Backend — lint, types, tests (push) Successful in 34s
CI / Interface — types et compilation (push) Successful in 16s
CI / Construction des images (sans publication) (push) Successful in 1m35s
Publication / Images vers Harbor (push) Successful in 2m34s
1.0.5 — affichage des notices et progression
2026-09-12 19:44:36 +02:00

5.4 KiB

Déploiement sur SLDOKP03

Avant de commencer

  • Un projet Harbor nommé limier avec un compte robot en écriture.
  • Une application Authentik configurée (voir 03-authentik.md).
  • Le réseau Docker externe traefik_front_network existe déjà.

1. Dépôts Gitea

Un seul dépôt suffit : Tips-Of-Mine/limier. Secrets et variables à déclarer dans ses réglages Actions :

Nom Type Valeur
HARBOR_REGISTRY variable registry.tips-of-mine.com
HARBOR_USERNAME secret compte robot Harbor
HARBOR_PASSWORD secret jeton du compte robot

2. Première publication

git tag v1.0.0
git push origin v1.0.0

Le workflow release.yml vérifie d'abord que l'étiquette, pyproject.toml et package.json annoncent la même version — une divergence produirait des images dont /api/sante ment sur ce qui tourne — puis publie trois images vers Harbor.

3. Installation

mkdir -p /opt/limier && cd /opt/limier
# déposer deploy/docker-compose.yml et deploy/.env.example
cp .env.example .env

Générer les trois secrets :

cd /opt/limier
sed -i "s|^POSTGRES_PASSWORD=.*|POSTGRES_PASSWORD=$(openssl rand -hex 24)|" .env
sed -i "s|^LIMIER_SESSION_SECRET=.*|LIMIER_SESSION_SECRET=$(openssl rand -hex 32)|" .env
sed -i "s|^LIMIER_IDENTIFIER_HASH_PEPPER=.*|LIMIER_IDENTIFIER_HASH_PEPPER=$(openssl rand -hex 32)|" .env

Les trois secrets sont écrits directement dans .env sans passer par le terminal : rien ne reste dans l'historique du shell.

Hexadécimal et non base64 pour POSTGRES_PASSWORD. Ce mot de passe est injecté tel quel dans l'URL de connexion. Les caractères / et + que produit base64 rendent cette URL invalide, et l'API refuse alors de démarrer sur une erreur de validation peu explicite.

Le poivre ne se change pas à la légère. Toutes les empreintes d'identifiants en dépendent. Le modifier rend inopérants les blocages d'effacement déjà enregistrés : les empreintes ne correspondront plus. Sa place est dans ton Vault / OpenBao, pas dans un fichier.

Aucun fichier dynamique Traefik à déposer : le middleware de sécurité est déclaré dans les étiquettes du service limier-web, comme sur Gitea. La pile est autonome.

C'est un choix payé d'expérience. Un routeur qui référence un middleware @file absent est désactivé en silence par Traefik : la requête retombe en 404 sans qu'aucun journal ne mentionne le middleware manquant. Une dépendance externe invisible est exactement ce qu'il ne faut pas.

cloudflarewarp@file et my-crowdsec-bouncer-traefik-plugin@file restent attachés à ton entryPoint https et s'appliquent automatiquement.

Les priorités de routeurs sont explicites : l'API à 60, l'interface à 50. Sans cela, la règle Host() seule de limier-web capterait aussi /api.

4. Droits du volume de la base de sites

Les conteneurs tournent en utilisateur non privilégié (UID 1000). Docker crée les répertoires de montage en root, et ce montage masque les droits posés dans l'image : le worker ne peut alors pas y écrire la base de sites mise à jour, et reste sur les 3 302 sites livrés dans le paquet au lieu des 5 400+ disponibles en amont.

mkdir -p /opt/limier/data/sites
chown -R 1000:1000 /opt/limier/data/sites

Le symptôme, si on l'oublie : copie_base_sites_impossible avec Permission denied dans le journal du worker, et base_sites_prete annonçant 3 302 sites au lieu de 5 442.

5. Migrations puis démarrage

docker compose run --rm limier-api alembic upgrade head
docker compose up -d
docker compose ps
curl -s https://limier.tips-of-mine.com/api/pret | jq

/api/pret vérifie réellement PostgreSQL, Redis, la base de sites et la complétude de la configuration. C'est la sonde à regarder quand « ça ne marche pas ». /api/sante est la sonde du healthcheck Docker, volontairement triviale.

6. Modules optionnels

# holehe — lire services/holehe/app.py avant d'activer
docker compose --profile holehe up -d
# puis dans .env : LIMIER_HOLEHE_SERVICE_URL=http://limier-holehe:8080

# contournement Cloudflare
docker compose --profile flaresolverr up -d
# puis dans .env : LIMIER_FLARESOLVERR_URL=http://limier-flaresolverr:8191

Sans --profile, ces services ne démarrent pas : l'installation par défaut reste minimale.

7. Mise à jour

cd /opt/limier
TAG=1.1.0 docker compose pull && TAG=1.1.0 docker compose up -d
docker compose run --rm limier-api alembic upgrade head

Watchtower est activé sur les conteneurs, mais le TAG est épinglé dans le compose : il ne suivra donc pas latest tout seul. C'est voulu — une montée de version doit passer par une étiquette et une migration explicites.

Volumes

Chemin Contenu
./data/postgres base de données
./data/sites base de sites corrigée par l'auto-contrôle nocturne

Redis n'a pas de volume : il ne porte que la file et la progression. Les données durables sont dans PostgreSQL. Le perdre coûte au pire les recherches en cours.

Sauvegarde

docker compose exec -T limier-postgres pg_dump -U limier limier | gzip > limier-$(date +%F).sql.gz