8.0 KiB
Big Brother
Tableau de bord web pour gérer et surveiller le VPS : serveur, conteneurs, sites, projets, Caddy et sauvegardes.
- API : AdonisJS 7 (
api/), base SQLite. - Interface : Angular 22 (
web/), servie par l'API (un seul conteneur, un seul domaine).
« Big Brother » est un nom provisoire. Pour le changer, il suffit de modifier
container_namedans ledocker-compose.yml, le bloc Caddy etAPP_URL.
Fonctionnalités
| Page | Contenu |
|---|---|
| Vue d'ensemble | Processeur, mémoire, disque, réseau, charge, durée depuis le démarrage. Graphiques en direct (toutes les 5 s) et historique sur 1 h, 24 h, 7 j et 30 j. État des conteneurs, des sites et des sauvegardes, dernières actions. |
| Conteneurs | Tous les conteneurs avec leur état, CPU et mémoire. Alerte quand un port est publié sur Internet (seul Caddy devrait l'être). Logs en direct (filtre, pause, téléchargement). Démarrer, arrêter, redémarrer. |
| Sites | Les domaines du Caddyfile, vérifiés chaque minute : état, temps de réponse, disponibilité sur 24 h et 7 j, expiration du certificat HTTPS, incidents. |
| Projets | Les projets de /srv (même organisation que la procédure). Pour chacun : dépôt git (version en ligne, nouveautés), mise à jour (git pull puis recréation des conteneurs), retour à un ancien commit, redémarrage, arrêt, mise à jour des images. Création de projet Node, Adonis, WordPress ou site statique : dossier, clone, .env, base MariaDB dédiée, docker-compose.yml (templates de la procédure), démarrage et bloc Caddy. |
| Caddy | Éditeur du Caddyfile. Si Caddy refuse la nouvelle configuration, l'ancien fichier est remis en place automatiquement. Historique des 50 dernières versions, restaurables. |
| Sauvegardes | Export de toutes les bases MariaDB et archive de /srv (sans node_modules). Sauvegarde automatique quotidienne en option, téléchargement depuis la page. |
| Journal | Toutes les actions et connexions, avec la sortie des commandes. |
Sécurité
Le conteneur a accès au socket Docker et à /srv en écriture : c'est l'équivalent d'un accès root au serveur. Les protections en place :
- Comptes : aucune page d'inscription. Les comptes se créent uniquement en ligne de commande sur le VPS.
- Connexion :
- mot de passe d'au moins 12 caractères ;
- code de double authentification (TOTP), refusé s'il a déjà servi ;
- 5 essais ratés par IP, puis blocage pendant 15 minutes.
- Session : cookies
httpOnly,SecureetSameSite=Strict, session de 12 h, protection CSRF. - En-têtes : Content-Security-Policy stricte (aucun script externe ni en ligne), HSTS,
X-Frame-Options: DENY. - Réseau : aucun port publié, l'accès passe uniquement par Caddy. Le secret 2FA est chiffré avec
APP_KEY. - Traçabilité : chaque action est enregistrée dans le journal (qui, quand, depuis quelle IP, avec la sortie).
Mise en ligne sur le VPS
Le projet suit la procédure : un dossier contenant docker-compose.yml, avec le dépôt cloné dans project/.
-
Créer le dépôt sur
git.nucleus-ludus.fret y pousser ce dossier. -
Sur le VPS :
mkdir -p /srv/fullstack/big-brother /root/backups cd /srv/fullstack/big-brother git clone https://git.nucleus-ludus.fr/<compte>/big-brother.git project cp project/deploy/docker-compose.yml . cp project/deploy/.env.example .env nano .envDans
.env, remplir au minimum :APP_KEY: générer la valeur avecopenssl rand -base64 24;APP_URL;BACKUP_DAILY_AT.
Vérifier aussi
CADDY_CONTAINERetMARIADB_CONTAINER: ce sont les noms de tes conteneurs Caddy et MariaDB. -
Construire et lancer :
docker compose up -d --build docker compose logs -f -
Créer ton compte. La commande affiche un QR code à scanner avec ton application de double authentification (Aegis, 2FAS, Google Authenticator…) :
docker exec -it big-brother node ace user:create -
Ajouter le bloc à
/srv/caddy/Caddyfile(voirdeploy/Caddyfile.block), puis recharger Caddy :big-brother.nucleus-ludus.fr { reverse_proxy big-brother:3333 }docker exec caddy caddy reload --config /etc/caddy/Caddyfile
Ce que monte le docker-compose.yml
| Volume | Rôle |
|---|---|
./data:/data |
Base SQLite (comptes, historique, journal) |
/var/run/docker.sock |
Conteneurs, logs, actions, rechargement de Caddy, MariaDB |
/srv:/srv |
Projets et Caddyfile, au même chemin que sur le VPS (nécessaire pour docker compose) |
/proc:/host/proc:ro |
Métriques du serveur (et pas seulement celles du conteneur) |
/root/backups:/backups |
Sauvegardes |
Mettre à jour Big Brother
Depuis le tableau de bord : Projets → big-brother → Mettre à jour. La recréation du conteneur se fait dans un conteneur à part (docker:cli) pour ne pas être interrompue par l'arrêt du tableau de bord. La page se reconnecte d'elle-même.
À la main :
cd /srv/fullstack/big-brother
git -C project pull --ff-only
docker compose up -d --build
Gestion des comptes
docker exec -it big-brother node ace user:create
docker exec -it big-brother node ace user:password <identifiant>
docker exec -it big-brother node ace user:reset-2fa <identifiant> # téléphone perdu
Variables d'environnement
| Variable | Rôle |
|---|---|
APP_KEY |
Clé secrète (cookies, chiffrement des secrets 2FA). À ne jamais perdre ni partager. |
APP_URL |
URL publique du tableau de bord |
TZ |
Fuseau horaire (heure de la sauvegarde automatique) |
DB_PATH |
Fichier SQLite (/data/db.sqlite3) |
SRV_ROOT |
Racine des projets (/srv) |
HOST_PROC |
/proc du serveur monté dans le conteneur (/host/proc) |
DISK_PATH |
Chemin dont le disque est surveillé (/srv) |
BACKUP_DIR |
Dossier des sauvegardes dans le conteneur (/backups) |
DOCKER_SOCKET |
Socket Docker |
CADDY_CONTAINER |
Nom du conteneur Caddy |
CADDYFILE_PATH |
Caddyfile vu par le tableau de bord (/srv/caddy/Caddyfile) |
CADDY_CONFIG_PATH |
Caddyfile vu depuis le conteneur Caddy (/etc/caddy/Caddyfile) |
MARIADB_CONTAINER |
Nom du conteneur MariaDB (son mot de passe root est lu dans le conteneur, via MARIADB_ROOT_PASSWORD) |
BASE_DOMAIN |
Domaine proposé pour les nouveaux projets (<nom>.<BASE_DOMAIN>) |
BACKUP_DAILY_AT |
Heure de la sauvegarde automatique (03:00). Vide = pas de sauvegarde automatique. |
BACKUP_KEEP |
Nombre de sauvegardes gardées pour chaque type (7) |
Développement local
Prérequis : Node 24. Docker Desktop est facultatif : sans lui, les pages Conteneurs et les actions affichent « Docker injoignable ».
# API (http://localhost:3333)
cd api
npm install
cp .env.example .env
Dans api/.env, adapter les valeurs pour le local :
NODE_ENV=development,HOST=localhost,APP_KEY: une valeur quelconque ;SRV_ROOT=../dev-srv: faux/srvfourni pour le développement ;CADDYFILE_PATH=../dev-srv/caddy/Caddyfile;BACKUP_DIR=../dev-backups;- supprimer les lignes
DB_PATH,HOST_PROCetDOCKER_SOCKET.
Puis :
node ace migration:run
node ace user:create
npm run dev
# Interface (http://localhost:4200, les appels /api passent par le proxy vers 3333)
cd web
npm install
npm start
Pour tester l'interface compilée servie par l'API : npm run build dans web/, puis copier web/dist/web/browser/ dans api/public/.
Limites
- Pas d'alerte : il faut consulter le tableau de bord.
- Vérifications depuis le VPS : elles détectent un conteneur arrêté ou une erreur de configuration, pas une panne complète du serveur (le tableau de bord serait lui aussi hors ligne).
- Sites statiques : le build se fait sur le PC puis s'envoie avec
scp(la page du projet affiche les commandes). - Création de projet : en cas d'échec à une étape, les étapes déjà faites ne sont pas annulées. Le journal indique où ça s'est arrêté.