first commit

This commit is contained in:
Rutra committed 2026-10-12 14:25:22 +02:00
commit 3c0479faf0
169 files changed
+27617

No files matched your search

+177
View File
@@ -0,0 +1,177 @@
# 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_name` dans le `docker-compose.yml`, le bloc Caddy et `APP_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`, `Secure` et `SameSite=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/`.
1. Créer le dépôt sur `git.nucleus-ludus.fr` et y pousser ce dossier.
2. Sur le VPS :
```bash
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 .env
```
Dans `.env`, remplir au minimum :
- `APP_KEY` : générer la valeur avec `openssl rand -base64 24` ;
- `APP_URL` ;
- `BACKUP_DAILY_AT`.
Vérifier aussi `CADDY_CONTAINER` et `MARIADB_CONTAINER` : ce sont les noms de tes conteneurs Caddy et MariaDB.
3. Construire et lancer :
```bash
docker compose up -d --build
docker compose logs -f
```
4. Créer ton compte. La commande affiche un QR code à scanner avec ton application de double authentification (Aegis, 2FAS, Google Authenticator…) :
```bash
docker exec -it big-brother node ace user:create
```
5. Ajouter le bloc à `/srv/caddy/Caddyfile` (voir `deploy/Caddyfile.block`), puis recharger Caddy :
```caddyfile
big-brother.nucleus-ludus.fr {
reverse_proxy big-brother:3333
}
```
```bash
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 :
```bash
cd /srv/fullstack/big-brother
git -C project pull --ff-only
docker compose up -d --build
```
## Gestion des comptes
```bash
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 ».
```bash
# 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 `/srv` fourni pour le développement ;
- `CADDYFILE_PATH=../dev-srv/caddy/Caddyfile` ;
- `BACKUP_DIR=../dev-backups` ;
- supprimer les lignes `DB_PATH`, `HOST_PROC` et `DOCKER_SOCKET`.
Puis :
```bash
node ace migration:run
node ace user:create
npm run dev
```
```bash
# 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é.