commit f00047c7d12cff496162ec94c9fa2d8533e78e5b Author: Lionel Date: Wed Dec 31 18:44:24 2025 +0100 Initial commit - Migration documentation 2026 diff --git a/docs/changelog/2025-12-31.md b/docs/changelog/2025-12-31.md new file mode 100644 index 0000000..d6c8078 --- /dev/null +++ b/docs/changelog/2025-12-31.md @@ -0,0 +1,100 @@ +# Maintenance 31 Décembre 2025 + +## Résumé + +Session de maintenance majeure pour réparer plusieurs services et optimiser l'espace disque. + +## Problèmes résolus + +### 🔧 Shlink (URL Shortener) + +**Problème**: Les short URLs ne fonctionnaient pas - Caddy utilisait des redirections manuelles cassées. + +**Solution**: +- Simplifié le Caddyfile avec `reverse_proxy shlink:8080` +- Configuré `servers.json` pour Shlink-web avec l'API key + +**Test**: `https://go/ts` → Redirige vers Tailscale admin ✅ + +### 🔧 Arcane (Docker Management) + +**Problème**: +1. Container en crash loop (`ENCRYPTION_KEY` trop courte - 31 chars au lieu de 32) +2. Bloqué par Authelia + +**Solution**: +- Généré nouvelles clés de 32+ caractères +- Désactivé Authelia pour accès direct +- Reset de la base de données + +**Accès**: `https://arcane.talloires.local` (arcane / [nouveau mot de passe]) + +### 🔧 Jellyfin (Media Server) + +**Problème**: Les médias n'étaient pas montés (volumes pointaient vers `/mnt/annecy` au lieu de `/mnt/mediaserver`) + +**Solution**: Recréé le container avec les bons bind mounts + +### 📀 Espace Disque SD + +**Avant**: 86% utilisé (8.4 GB libre) +**Après**: 71% utilisé (17 GB libre) + +**Actions**: +- Supprimé volumes Docker orphelins (~7 GB): + - `media_jellyfin_config` (2.5 GB) + - `talloires-jellyfin-config` (2.5 GB) + - `talloires_jellyfin_config` (1 GB) + - `docker_jellyfin_config` (426 MB) + - Volumes Prometheus/Grafana/Loki orphelins +- Archivé et supprimé `/home/lionel/docker/` (ancienne structure v1) +- Migré caches vers SSD + +### 🚀 Optimisations SSD + +| Service | Avant | Après | +|---------|-------|-------| +| Jellyfin cache | SD (volume Docker) | `/mnt/mediaserver/jellyfin-cache` | +| Netdata cache | SD (`/home/lionel/talloires-v2/netdata/cache`) | `/mnt/mediaserver/netdata-cache` | + +### 📁 Consolidation Caddyfile + +- Supprimé le Caddyfile non utilisé dans `/home/lionel/talloires-v2/infra/caddy/` +- Créé symlink vers le fichier actif: `/mnt/mediaserver/talloires/caddy/Caddyfile` + +### 🔐 Certificat SSL + +- Exporté le certificat root Caddy 2025 +- Installé sur Mac pour éviter les erreurs SSL + +## État final des services + +| Service | Status | Notes | +|---------|--------|-------| +| arcane | ✅ healthy | Sans Authelia | +| authelia | ✅ healthy | | +| caddy | ✅ running | | +| dozzle | ✅ running | | +| gitea | ✅ running | | +| homeassistant | ✅ running | | +| jellyfin | ✅ healthy | Cache sur SSD | +| mkdocs | ✅ running | | +| netdata | ✅ healthy | Cache sur SSD | +| shlink | ✅ running | | +| shlink-web | ✅ running | | +| signal-api | ✅ healthy | | +| transmission | ✅ running | Via WireGuard | +| wireguard | ✅ running | | + +## Fichiers modifiés + +- `/mnt/mediaserver/talloires/caddy/Caddyfile` - Simplifié config Shlink, désactivé Authelia pour Arcane +- `/home/lionel/talloires-v2/media/docker-compose.yml` - Cache Jellyfin sur SSD +- `/home/lionel/talloires-v2/monitoring/docker-compose.yml` - Cache Netdata sur SSD +- `/home/lionel/talloires-v2/docker-mgmt/docker-compose.yml` - Nouvelles clés Arcane +- `/home/lionel/talloires-v2/tools/docker-compose.yml` - Volume servers.json pour Shlink-web +- `/home/lionel/talloires-v2/shlink-web/servers.json` - Configuration API Shlink + +## Backups créés + +- `/mnt/mediaserver/backups/docker-v1-archive-20251231.tar.gz` (63 MB) - Ancienne structure Docker diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..048ba9e --- /dev/null +++ b/docs/index.md @@ -0,0 +1,152 @@ +# 🏔️ Talloires v2.0 Documentation + +Bienvenue dans la documentation de l'infrastructure Talloires v2.0 - Migration complétée le 30 décembre 2025. + +--- + +## 🚀 Quick Links (Go-Links) + +Accès rapide aux services via les go-links: + +| Go-Link | Service | Description | +|---------|---------|-------------| +| [**go**](https://go){:target="_blank"} | Shlink Web | Gestion des liens courts | +| [**go/jf**](https://go/jf){:target="_blank"} | Jellyfin | Serveur média (films, séries) | +| [**go/trn**](https://go/trn){:target="_blank"} | Transmission | Client BitTorrent (VPN) | +| [**go/git**](https://go/git){:target="_blank"} | Gitea | Hébergement Git | +| [**go/docs**](https://go/docs){:target="_blank"} | MkDocs | Cette documentation | +| [**go/ha**](https://go/ha){:target="_blank"} | Home Assistant | Domotique | +| [**go/net**](https://go/net){:target="_blank"} | Netdata | Monitoring système | +| [**go/sig**](https://go/sig){:target="_blank"} | Signal API | Notifications | +| [**go/arcane**](https://go/arcane){:target="_blank"} | 🆕 Arcane | Docker Management UI | +| [**go/logs**](https://go/logs){:target="_blank"} | 🆕 Dozzle | Docker Logs Viewer | + +--- + +## 📊 Architecture v2.0 + +### Infrastructure +- **Serveur**: Raspberry Pi 5 (8GB) - Talloires +- **Stockage**: Synology DS620slim - Annecy (NFS) +- **VPN**: Tailscale (WireGuard) +- **Réseau**: UniFi Dream Router 7 (Theseus) + +### Stack Logicielle +- **Containerisation**: Docker + Docker Compose +- **Reverse Proxy**: Caddy (HTTPS local) +- **DNS Local**: dnsmasq +- **VPN Tunnel**: ProtonVPN (WireGuard) +- **Management**: Arcane (Web UI) + Lazydocker (TUI) + +--- + +## 🗂️ Sections + +### [Services](services/overview.md) +Documentation détaillée de chaque service déployé. + +### [Infrastructure](infra/overview.md) +Configuration réseau, VPN, DNS, backups. + +### [Vault v1.0](vault/index-v1.md) +Archive de la documentation v1.0 (référence historique). + +--- + +## 📈 Migration v1.0 → v2.0 + +**Date**: 30 décembre 2025 +**Durée**: ~3h30 +**Downtime**: ~30 minutes +**Services migrés**: 10/10 (100%) +**Réduction infrastructure**: 60% (de 25 à 10 services) + +### Services Déployés (v2.0) + +✅ [**Jellyfin**](https://go/jf){:target="_blank"} - Serveur média (2.3 GB restauré) +✅ [**Transmission + WireGuard**](https://go/trn){:target="_blank"} - BitTorrent avec VPN kill-switch +✅ [**Gitea**](https://go/git){:target="_blank"} - Hébergement Git (repos restaurés) +✅ [**Home Assistant**](https://go/ha){:target="_blank"} - Domotique (nouvelle installation) +✅ [**MkDocs**](https://go/docs){:target="_blank"} - Documentation (cette page!) +✅ [**Netdata**](https://go/net){:target="_blank"} - Monitoring système +✅ [**Signal API**](https://go/sig){:target="_blank"} - Notifications +✅ [**Shlink**](https://go){:target="_blank"} - URL shortener +✅ [**Caddy**] - Reverse proxy HTTPS + +### 🆕 Services Ajoutés (31 décembre 2025) + +✅ [**Arcane**](https://go/arcane){:target="_blank"} - Docker Management UI (BSD-3-Clause) +✅ [**Dozzle**](https://go/logs){:target="_blank"} - Real-time Docker Logs Viewer (MIT) +✅ **Lazydocker** - Terminal UI pour Docker (MIT) - Installé sur Talloires & Annecy + +### Services Retirés + +❌ **Authelia** - Remplacé par auth native de chaque service +❌ **Portainer** - Remplacé par Arcane (open source BSD-3) +❌ **Crowdsec** - Simplification sécurité +❌ **Dockge** - Remplacé par Arcane + Lazydocker +❌ **15+ autres services** - Nettoyage architecture + +--- + +## 🔐 Sécurité + +- ✅ VPN WireGuard actif (ProtonVPN Luxembourg) +- ✅ Kill-switch Transmission (network_mode) +- ✅ Accès Tailscale uniquement (pas d'exposition Internet) +- ✅ Firewall UFW actif +- ✅ Certificats HTTPS locaux (Caddy) +- ✅ Backup automatique vers Annecy (NFS) + +--- + +## 🛠️ Maintenance + +### Docker Management + +**Web UI** - [Arcane](https://go/arcane){:target="_blank"} +- Gestion containers, images, volumes, networks +- Interface moderne SvelteKit +- Templates Docker Compose +- Monitoring en temps réel + +**Logs** - [Dozzle](https://go/logs){:target="_blank"} +- Logs en temps réel multi-containers +- Search & filter +- Ultra-léger + +**Terminal UI** - Lazydocker +```bash +# Sur Talloires +ssh lionel@talloires.local +lazydocker + +# Sur Annecy (Synology) +ssh lionel@100.69.227.96 +~/.local/bin/lazydocker +``` + +### Backups +- **Location**: `/mnt/annecy/talloires/` +- **Fréquence**: Quotidien (automatique) +- **Rétention**: 30 jours +- **Services backupés**: Jellyfin, Gitea, MkDocs, Configurations + +### Monitoring +- **Netdata**: [go/net](https://go/net){:target="_blank"} +- **Arcane**: [go/arcane](https://go/arcane){:target="_blank"} +- **Dozzle**: [go/logs](https://go/logs){:target="_blank"} +- **Logs Docker**: `docker logs ` +- **Health checks**: Docker healthchecks + +--- + +## 📞 Contact + +**Administrateur**: Lionel +**Infrastructure**: Talloires (production) +**Backup**: Annecy (NAS Synology) + +--- + +*Dernière mise à jour: 31 décembre 2025 - Ajout Arcane, Dozzle, Lazydocker* diff --git a/docs/infra/overview.md b/docs/infra/overview.md new file mode 100644 index 0000000..17d75aa --- /dev/null +++ b/docs/infra/overview.md @@ -0,0 +1,382 @@ +# Infrastructure Talloires v2.0 + +Documentation de l'infrastructure réseau, VPN, DNS, et backups. + +--- + +## 🖥️ Serveurs + +### Talloires (Production) +- **Type**: Raspberry Pi 5 (8GB RAM) +- **OS**: Raspberry Pi OS (Debian 12) +- **IP Tailscale**: `100.116.198.105` +- **Hostname**: `talloires.tailfd281f.ts.net` +- **Rôle**: Serveur principal (Docker) + +### Annecy (Storage) +- **Type**: Synology DS620slim +- **OS**: DSM 7.x +- **IP Tailscale**: `100.69.227.96` +- **Hostname**: `annecy.tailfd281f.ts.net` +- **Rôle**: NAS, Backups + +### Theseus (Network) +- **Type**: UniFi Dream Router 7 +- **Rôle**: Gateway, Firewall, DHCP + +--- + +## 🐳 Outils Docker Management + +### 🎨 Arcane - Web UI + +**URL**: [go/arcane](https://go/arcane) +**License**: BSD-3-Clause +**Status**: ✅ Opérationnel + +**Fonctionnalités:** +- Gestion containers, images, volumes, networks +- Docker Compose templates & projects +- Monitoring temps réel (CPU/RAM) +- Interface moderne & responsive +- Multi-serveurs (via agents) + +**Usage:** +```bash +# Accès web +https://go/arcane + +# Credentials par défaut +Username: arcane +Password: arcane-admin +``` + +**Alternative à:** Portainer (proprietary), Dockge (unstable) + +--- + +### 📋 Dozzle - Logs Viewer + +**URL**: [go/logs](https://go/logs) +**License**: MIT +**Status**: ✅ Opérationnel + +**Fonctionnalités:** +- Real-time log streaming +- Multi-container view +- Search & filter +- Ultra-léger (~30 MB RAM) +- Aucune base de données + +**Usage:** +```bash +# Accès web +https://go/logs + +# Pas d'authentification requise (Tailscale VPN only) +``` + +**Use cases:** Debug, troubleshooting, monitoring logs + +--- + +### ⚡ Lazydocker - Terminal UI + +**License**: MIT +**Status**: ✅ Installé sur Talloires & Annecy +**Version**: 0.24.3 + +**Installation:** +```bash +# Talloires +lazydocker --version +# Location: /usr/local/bin/lazydocker + +# Annecy (Synology) +~/.local/bin/lazydocker --version +``` + +**Fonctionnalités:** +- TUI (Terminal User Interface) +- Stats en temps réel (CPU/RAM) +- Logs interactifs +- Actions rapides (start/stop/restart) +- Fonctionne via SSH + +**Usage:** +```bash +# Sur Talloires +ssh lionel@talloires.local +lazydocker + +# Sur Annecy +ssh lionel@100.69.227.96 +~/.local/bin/lazydocker +``` + +**Navigation:** +- `↑/↓`: Sélection +- `Enter`: Actions +- `l`: Logs +- `e`: Exec shell +- `q`: Quitter + +--- + +### 📊 Comparaison Outils + +| Feature | Arcane | Dozzle | Lazydocker | +|---------|--------|--------|------------| +| **Type** | Web UI | Web UI | TUI | +| **Containers** | ✅ Full mgmt | ❌ View only | ✅ Full mgmt | +| **Logs** | ✅ | ✅ | ✅ | +| **Compose** | ✅ Templates | ❌ | ✅ View | +| **Stats** | ✅ | ❌ | ✅ | +| **Remote** | ✅ Multi-host | ❌ Single | ❌ Single | +| **SSH** | ❌ | ❌ | ✅ Works | +| **RAM** | ~100 MB | ~30 MB | ~50 MB | + +**Recommandations:** +- **Arcane**: Gestion quotidienne, templates, multi-serveurs +- **Dozzle**: Quick log inspection, debugging +- **Lazydocker**: SSH access, TUI lovers, remote management + +--- + +## 🌐 Réseau + +### Tailscale VPN +- **Type**: WireGuard mesh VPN +- **MagicDNS**: Désactivé (dnsmasq preferred) +- **Subnet**: `100.64.0.0/10` + +### DNS Local (dnsmasq) +**Config**: `/etc/dnsmasq.d/tailscale.conf` + +``` +# Machines +address=/talloires.local/100.116.198.105 +address=/annecy.local/100.69.227.96 + +# Wildcards +address=/.talloires.local/100.116.198.105 + +# Go-links +address=/go/100.116.198.105 + +# Upstream DNS +server=127.0.0.1#5053 +``` + +### AdGuard DNS (DoH) +- **Port**: 5053 +- **Upstream**: AdGuard DNS-over-HTTPS +- **Config**: `cloudflared` tunnel + +--- + +## 🔐 VPN Tunnel (ProtonVPN) + +### Configuration WireGuard +- **Server**: Luxembourg (LU#44) +- **Public IP**: 5.253.204.190 +- **Endpoint**: 5.253.204.162:51820 +- **Config**: `/home/lionel/talloires-v2/transmission/wireguard/wg0.conf` + +### Kill-Switch +Transmission utilise `network_mode: service:wireguard` → Impossible de leak l'IP réelle. + +### Monitoring VPN +- Vérification automatique IP publique +- Alertes Telegram si VPN down (<30s) +- Health checks Docker + +--- + +## 💾 Backups + +### Structure NFS +``` +/mnt/annecy/talloires/ +├── migration-v2/ # Backups migration +│ ├── jellyfin-config-*.tar.gz # 2.3 GB +│ ├── gitea-data-*.tar.gz # Repos Git +│ ├── mkdocs-v1-archive-*.tar.gz # 12 KB +│ └── critical-configs-*.tar.gz # 3.5 KB +└── daily/ # Backups quotidiens (TODO) +``` + +### NFS Mount +```bash +sudo mount -t nfs 100.69.227.96:/volume1/talloires /mnt/annecy -o rw,hard,intr,rsize=8192,wsize=8192 +``` + +**Fstab**: +``` +100.69.227.96:/volume1/talloires /mnt/annecy nfs rw,hard,intr,rsize=8192,wsize=8192 0 0 +``` + +### Backup Automatique (Cron) +TODO: Mettre à jour cron pour v2.0 structure. + +--- + +## 🔒 Sécurité + +### Firewall (UFW) +```bash +sudo ufw status +``` + +Ports ouverts: +- 80, 443: HTTP/HTTPS (Caddy) +- 2222: SSH Gitea +- 8096: Jellyfin (direct access) +- 22: SSH (Tailscale only) + +### Certificats HTTPS +- **CA**: Caddy Local Authority +- **Cert**: `/data/caddy/pki/authorities/local/root.crt` +- **Installation**: Importer dans macOS Keychain → Always Trust + +### Accès +- Tailscale VPN uniquement +- Pas d'exposition Internet directe +- SSH keys only (no password) + +--- + +## 📊 Monitoring + +### Stack Monitoring + +**Netdata** - System metrics +- **URL**: `https://go/net` +- **Métriques**: CPU, RAM, Disk, Network, Docker +- **Alertes**: À configurer (optionnel) + +**Arcane** - Docker monitoring +- **URL**: `https://go/arcane` +- **Métriques**: Containers stats (CPU/RAM) +- **Features**: Dashboard, projects, logs + +**Dozzle** - Logs viewer +- **URL**: `https://go/logs` +- **Features**: Real-time logs, search, filter + +**Lazydocker** - Terminal monitoring +```bash +ssh lionel@talloires.local +lazydocker +``` + +### Docker Health Checks +Tous les containers ont des health checks configurés. + +### Logs +```bash +# CLI +docker logs +docker logs --follow +docker logs --tail 100 + +# Web UI (Dozzle) +https://go/logs + +# TUI (Lazydocker) +lazydocker +``` + +--- + +## 🛠️ Maintenance + +### Docker Management + +**Via Arcane (Web):** +``` +https://go/arcane +→ Containers → Start/Stop/Restart +→ Images → Pull/Delete +→ Projects → Manage Compose stacks +``` + +**Via Lazydocker (TUI):** +```bash +ssh lionel@talloires.local +lazydocker +# Navigate avec arrows, Enter pour actions +``` + +**Via CLI:** +```bash +# Update containers +cd /home/lionel/talloires-v2/core +docker compose pull +docker compose up -d + +# Restart service +docker restart + +# View logs +docker logs --tail 100 +``` + +### Backup Manuel +```bash +# Jellyfin +tar -czf /mnt/annecy/talloires/manual/jellyfin-$(date +%Y%m%d).tar.gz \\ + /home/lionel/talloires-v2/jellyfin/config + +# Gitea +tar -czf /mnt/annecy/talloires/manual/gitea-$(date +%Y%m%d).tar.gz \\ + /home/lionel/talloires-v2/gitea/ + +# Arcane database +tar -czf /mnt/annecy/talloires/manual/arcane-$(date +%Y%m%d).tar.gz \\ + /home/lionel/talloires-v2/docker-mgmt/arcane-data +``` + +### Restart Services +```bash +docker restart +docker compose restart +``` + +--- + +## 📁 Fichiers de Configuration + +### Docker Management +``` +/home/lionel/talloires-v2/docker-mgmt/ +├── docker-compose.yml # Arcane + Dozzle +└── arcane-data/ # Arcane database +``` + +### Caddy +``` +/home/lionel/talloires-v2/caddy/ +├── Caddyfile # Reverse proxy config +└── Caddyfile.backup-* # Backups automatiques +``` + +### Services +``` +/home/lionel/talloires-v2/ +├── core/ # Caddy, Shlink +├── jellyfin/ # Media server +├── transmission/ # BitTorrent + WireGuard +├── gitea/ # Git hosting +├── homeassistant/ # Domotique +├── mkdocs/ # Documentation +├── netdata/ # Monitoring +├── signal-api/ # Notifications +└── docker-mgmt/ # Arcane + Dozzle +``` + +--- + +*Voir [Services](../services/overview.md) pour configuration applicative.* + +*Dernière mise à jour: 31 décembre 2025* diff --git a/docs/services/overview.md b/docs/services/overview.md new file mode 100644 index 0000000..4ee338a --- /dev/null +++ b/docs/services/overview.md @@ -0,0 +1,272 @@ +# Services Talloires v2.0 + +Documentation des services déployés sur l'infrastructure v2.0. + +--- + +## 🐳 Arcane - Docker Management UI + +**URL**: `https://go/arcane` +**Port Direct**: `3552` +**Status**: ✅ Opérationnel +**License**: BSD-3-Clause (Open Source) + +### Fonctionnalités +- ✅ Gestion containers (start/stop/restart/delete) +- ✅ Gestion images (pull/delete/inspect) +- ✅ Gestion volumes & networks +- ✅ Docker Compose templates +- ✅ Monitoring temps réel (CPU/RAM) +- ✅ Interface moderne SvelteKit +- ✅ Mobile responsive + +### Credentials +``` +Username: arcane +Password: arcane-admin +``` + +**⚠️ Important**: Changer le mot de passe par défaut lors de la première connexion. + +### Configuration +```yaml +# /home/lionel/talloires-v2/docker-mgmt/docker-compose.yml +services: + arcane: + image: ghcr.io/getarcaneapp/arcane:latest + container_name: arcane + networks: + - talloires_net + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./arcane-data:/app/data + environment: + - APP_ENV=production + - PUBLIC_SESSION_SECRET= + - ENCRYPTION_KEY= + - TZ=Europe/Luxembourg +``` + +### Features Clés +- **Projects**: Organiser les stacks Docker Compose +- **Templates**: Déploiement rapide de services +- **Logs**: Vue intégrée des logs containers +- **Stats**: Métriques CPU/RAM en temps réel +- **Remote Hosts**: Support multi-serveurs (via agents) + +### Alternative À +- ❌ Portainer (proprietary license) +- ❌ Dockge (stability issues) +- ✅ Arcane = Open source + moderne + stable + +--- + +## 📋 Dozzle - Docker Logs Viewer + +**URL**: `https://go/logs` +**Port Direct**: `8080` +**Status**: ✅ Opérationnel +**License**: MIT (Open Source) + +### Fonctionnalités +- ✅ Logs en temps réel (live tailing) +- ✅ Multi-container view +- ✅ Search & filter +- ✅ Dark/light mode +- ✅ Ultra-léger (~30 MB RAM) +- ✅ Aucune base de données requise + +### Configuration +```yaml +# /home/lionel/talloires-v2/docker-mgmt/docker-compose.yml +services: + dozzle: + image: amir20/dozzle:latest + container_name: dozzle + networks: + - talloires_net + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + environment: + - DOZZLE_LEVEL=info + - DOZZLE_FILTER=status=running + - TZ=Europe/Luxembourg +``` + +### Use Cases +- 🔍 Debugging rapide de containers +- 📊 Monitoring logs en temps réel +- 🐛 Troubleshooting incidents +- 📈 Analyse de patterns + +### Features +- **Real-time**: Logs streaming instantané +- **Search**: Recherche textuelle puissante +- **Filter**: Par container, niveau, temps +- **Lightweight**: Aucun overhead + +--- + +## 🎬 Jellyfin - Serveur Média + +**URL**: `https://go/jf` +**Port Direct**: `8096` +**Status**: ✅ Opérationnel +**Data**: 2.3 GB restauré depuis v1.0 + +### Configuration +- Accès Infuse: `100.116.198.105:8096` +- Authentification: Compte Jellyfin (lionel) +- Backup: Quotidien vers Annecy + +--- + +## 📥 Transmission - BitTorrent + +**URL**: `https://go/trn` +**Status**: ✅ Opérationnel + VPN Kill-switch +**VPN**: ProtonVPN Luxembourg (LU#44) + +### Sécurité VPN +- Network mode: `service:wireguard` +- Public IP: 5.253.204.190 (ProtonVPN) +- Kill-switch: Actif (pas de leak possible) +- Monitoring: Alertes Telegram si VPN down + +### Configuration +- Watch directory: `/config/watch` +- Downloads: `/downloads` +- Web UI: Port 9091 (via WireGuard container) + +--- + +## 💾 Gitea - Hébergement Git + +**URL**: `https://go/git` +**SSH Port**: `2222` +**Status**: ✅ Opérationnel + +### Comptes +- **admin**: lionel.dupre@pm.me (Admin) +- **lionel**: dflected@dflected.org (User) + +### Clonage SSH +```bash +git clone ssh://git@talloires.local:2222/user/repo.git +``` + +### Données Restaurées +- Tous les repositories v1.0 +- Clés SSH utilisateurs +- Configuration complète + +--- + +## 🏠 Home Assistant + +**URL**: `https://go/ha` +**Status**: ✅ Nouvelle installation (config requise) + +### Configuration Initiale +1. Ouvrir `https://go/ha` +2. Créer compte admin +3. Configurer devices + +--- + +## 📚 MkDocs - Documentation + +**URL**: `https://go/docs` +**Status**: ✅ Opérationnel v2.0 + +### Structure +- Documentation v2.0 (active) +- Archive v1.0 (vault/) + +--- + +## 📊 Netdata - Monitoring + +**URL**: `https://go/net` +**Status**: ✅ Opérationnel + +### Métriques Disponibles +- CPU, RAM, Disk I/O +- Network traffic +- Docker containers +- System load + +### Netdata Cloud +Optionnel - Nécessite `NETDATA_CLAIM_TOKEN` + +--- + +## 📱 Signal API - Notifications + +**URL**: `https://go/sig` +**Port Direct**: `8080` +**Status**: ✅ Opérationnel + +### Utilisation +```bash +# Envoyer notification +curl -X POST https://go/sig/v2/send \\ + -H "Content-Type: application/json" \\ + -d '{"message":"Test","number":"+33...","recipients":["+33..."]}' +``` + +--- + +## 🔗 Shlink - URL Shortener + +**Web UI**: `https://go` +**API**: `https://api.shlink.talloires.local` +**Status**: ✅ Opérationnel + +### Features +- Liens courts personnalisés +- Statistiques de clics +- QR codes +- API REST + +--- + +## 🌐 Caddy - Reverse Proxy + +**Status**: ✅ Opérationnel +**Protocole**: HTTPS (certificats internes) + +### Fonctions +- Reverse proxy pour tous les services +- HTTPS automatique (certificats Caddy) +- Go-links routing +- Gestion certificats + +### Configuration +```bash +/home/lionel/talloires-v2/caddy/Caddyfile +``` + +--- + +## 📊 Récapitulatif Services + +| Service | URL | License | Status | +|---------|-----|---------|--------| +| **Arcane** | go/arcane | BSD-3 | ✅ | +| **Dozzle** | go/logs | MIT | ✅ | +| Jellyfin | go/jf | GPL-2 | ✅ | +| Transmission | go/trn | GPL-2 | ✅ | +| Gitea | go/git | MIT | ✅ | +| Home Assistant | go/ha | Apache-2 | ✅ | +| MkDocs | go/docs | BSD-2 | ✅ | +| Netdata | go/net | GPL-3 | ✅ | +| Signal API | go/sig | AGPL-3 | ✅ | +| Shlink | go | MIT | ✅ | +| Caddy | - | Apache-2 | ✅ | + +**Total**: 11 services opérationnels + +--- + +*Dernière mise à jour: 31 décembre 2025* diff --git a/docs/vault/README.md b/docs/vault/README.md new file mode 100644 index 0000000..c7e6920 --- /dev/null +++ b/docs/vault/README.md @@ -0,0 +1,70 @@ +# 🗄️ Vault - Archive Documentation v1.0 + +Cette section contient l'archive de la documentation de l'infrastructure Talloires **v1.0** (pré-migration du 30 décembre 2025). + +--- + +## ⚠️ Archive Historique + +**Cette documentation est archivée à titre de référence.** + +Pour la documentation actuelle de l'infrastructure v2.0, voir: +- [Page d'accueil v2.0](../index.md) +- [Services v2.0](../services/overview.md) +- [Infrastructure v2.0](../infra/overview.md) + +--- + +## 📚 Contenu v1.0 Archivé + +### [Documentation v1.0](index-v1.md) +Page d'accueil originale de la documentation v1.0. + +### [Services v1.0](services-v1/) +Documentation des services de l'infrastructure v1.0 (25+ services). + +### [Configuration v1.0](config/) +Fichiers de configuration et références techniques v1.0. + +### [Référence v1.0](reference/) +Documentation de référence et guides v1.0. + +--- + +## 🔄 Migration v1.0 → v2.0 + +**Date**: 30 décembre 2025 +**Stratégie**: Refonte complète (60% réduction services) + +### Services Conservés et Migrés +- ✅ Jellyfin (data restaurée) +- ✅ Gitea (repos restaurés) +- ✅ Transmission (nouvelle config VPN) +- ✅ MkDocs (architecture renouvelée) + +### Services Retirés +- ❌ Authelia (SSO supprimé) +- ❌ Portainer (CLI preferred) +- ❌ Crowdsec (simplification) +- ❌ Dockge +- ❌ 15+ autres services + +### Architecture Changée +- **v1.0**: 25+ containers, Authelia SSO, ZeroTier VPN +- **v2.0**: 10 containers, Auth native, Tailscale VPN, Go-links + +--- + +## 📦 Backup Complet v1.0 + +Archive complète disponible sur Annecy NAS: +``` +/mnt/annecy/talloires/migration-v2/ +├── talloires-v1-docker-20251230-191258.tar.gz (65 MB) +├── mkdocs-v1-archive-20251230.tar.gz (12 KB) +└── critical-configs-20251230-191758.tar.gz (3.5 KB) +``` + +--- + +*Retour à la [documentation v2.0](../index.md)* diff --git a/docs/vault/config/caddy.md b/docs/vault/config/caddy.md new file mode 100644 index 0000000..22382a7 --- /dev/null +++ b/docs/vault/config/caddy.md @@ -0,0 +1,58 @@ +# Caddy - Reverse Proxy + +## Configuration + +Caddy gère le reverse proxy et les certificats SSL internes pour tous les services. + +### Principes clés + +1. **Domaines .local** : Utilisent Authelia pour l'authentification (réseau local) +2. **Domaines .tailfd281f.ts.net** : Accès ZeroTier sans Authelia (services ont leur propre auth) +3. **Certificats** : Auto-générés par Caddy (CA interne) + +### Services sans Authelia + +Ces services ont leur propre authentification : + +- **Gitea** : OIDC via Authelia +- **Outline** : OIDC via Authelia +- **Linkwarden** : Auth intégrée +- **Vikunja** : Auth intégrée +- **Jellyfin** : Auth intégrée +- **Home Assistant** : Auth intégrée + +### Snippet Authelia + +```caddyfile +(authelia) { + forward_auth authelia:9091 { + uri /api/authz/forward-auth + copy_headers Remote-User Remote-Groups Remote-Email Remote-Name + } +} +``` + +### WebSocket Support + +Pour Home Assistant et Dockge : + +```caddyfile +homeassistant.talloires.local { + reverse_proxy homeassistant:8123 { + header_up Host {host} + } + tls internal +} +``` + +### Problèmes connus + +| Problème | Solution | +|----------|----------| +| Safari refuse certificats | Importer CA dans Trousseau macOS | +| 400 Bad Request | Vérifier que le service n'a pas double auth | +| Page blanche | Vérifier WebSocket headers | + +### Fichier + +`~/docker/caddy/Caddyfile` diff --git a/docs/vault/config/docker-stacks.md b/docs/vault/config/docker-stacks.md new file mode 100644 index 0000000..5667a96 --- /dev/null +++ b/docs/vault/config/docker-stacks.md @@ -0,0 +1,63 @@ +# Docker Stacks + +## Organisation + +Les services sont organisés en stacks modulaires : + +| Stack | Répertoire | Services | +|-------|------------|----------| +| Core | ~/docker/core | Caddy, Authelia, CrowdSec, Portainer, Dockge | +| Monitoring | ~/docker/monitoring | Uptime Kuma, Netdata, Grafana, Loki, Promtail | +| Media | ~/docker/media | Jellyfin, Transmission | +| Productivity | ~/docker/productivity | Gitea, MkDocs, Vikunja, LanguageTool | +| Homelab | ~/docker/homelab | Home Assistant, Watchtower | +| Linkwarden | ~/docker/linkwarden | Linkwarden + PostgreSQL | +| Outline | ~/docker/outline | Outline + PostgreSQL + Redis | + +## Réseau + +Tous les containers utilisent le réseau externe `talloires_net` : + +```yaml +networks: + talloires_net: + external: true +``` + +## Volumes + +### Volumes nommés (préfixés) + +Attention lors des migrations : les volumes Docker sont préfixés par le nom du répertoire. + +Exemple : `transmission_config` dans `~/docker/talloires` devient `talloires_transmission_config`. + +**Solution** : Utiliser `external: true` pour les volumes existants : + +```yaml +volumes: + talloires_transmission_config: + external: true +``` + +### Volumes bind mount + +Préférer les bind mounts pour les données importantes : + +```yaml +volumes: + - /home/lionel/docker/gitea:/data +``` + +## Commandes utiles + +```bash +# Démarrer un stack +cd ~/docker/media && docker compose up -d + +# Voir les logs +docker logs -f jellyfin + +# Recréer un container +docker compose up -d --force-recreate jellyfin +``` diff --git a/docs/vault/config/network.md b/docs/vault/config/network.md new file mode 100644 index 0000000..04bbf3d --- /dev/null +++ b/docs/vault/config/network.md @@ -0,0 +1,105 @@ +# Architecture Réseau + +## Vue d'ensemble + + + +## Composants + +### Tailscale + +VPN mesh reliant tous les appareils de la famille. + +| Machine | IP Tailscale | OS | +|---------|--------------|-----| +| talloires | 100.116.198.105 | Raspberry Pi 5 (Debian) | +| annecy | 100.118.210.128 | Synology DS620slim | +| olympou | 100.125.242.58 | macOS | +| pentamodi | 100.78.237.78 | iOS | +| perce | 100.69.7.78 | tvOS (Apple TV) | + +**Tailnet:** tailfd281f.ts.net + +### dnsmasq + +Serveur DNS local sur Talloires, résout les domaines internes. + +**Config:** `/etc/dnsmasq.d/tailscale.conf` + + + +**Commandes:** + + + +### cloudflared + +Proxy DNS-over-HTTPS vers AdGuard DNS avec profil personnel. + +**Config:** `/etc/cloudflared/config.yml` + + + +**Commandes:** + + + +## Configuration Tailscale Admin + +Dans Tailscale Admin Console → DNS → Nameservers : + +- **Global nameserver:** 100.116.198.105 (Talloires) +- **Override local DNS:** activé + +Cela force tous les appareils Tailscale à utiliser dnsmasq sur Talloires. + +## Domaines + +| Domaine | Usage | +|---------|-------| +| `*.talloires.local` | Services sur Talloires (recommandé) | +| `*.talloires.tailfd281f.ts.net` | Alternative Tailscale | +| `go` | Raccourcis Shlink | + +## Dépannage + +### Test résolution DNS + +Server: 100.116.198.105 +Address: 100.116.198.105#53 + +Name: go +Address: 100.116.198.105 + +Server: 100.116.198.105 +Address: 100.116.198.105#53 + +Name: docs.talloires.local +Address: 100.116.198.105 + +Server: 100.116.198.105 +Address: 100.116.198.105#53 + +Non-authoritative answer: +Name: google.com +Address: 142.250.27.138 +Name: google.com +Address: 142.250.27.100 +Name: google.com +Address: 142.250.27.101 +Name: google.com +Address: 142.250.27.102 +Name: google.com +Address: 142.250.27.113 +Name: google.com +Address: 142.250.27.139 + +### Services ne répondent pas + +1. Vérifier que dnsmasq tourne: `sudo systemctl status dnsmasq` +2. Vérifier que cloudflared tourne: `sudo systemctl status cloudflared-dns` +3. Vérifier que Caddy tourne: `docker ps | grep caddy` + +### Cache DNS + + diff --git a/docs/vault/config/troubleshooting.md b/docs/vault/config/troubleshooting.md new file mode 100644 index 0000000..455cb73 --- /dev/null +++ b/docs/vault/config/troubleshooting.md @@ -0,0 +1,74 @@ +# Troubleshooting + +## Problèmes connus + +### Certificats SSL + +**Symptôme** : Safari affiche "Can't establish secure connection" + +**Cause** : CA Caddy non trusté par macOS + +**Solution** : +```bash +# Exporter le CA +ssh lionel@10.144.221.22 "docker exec caddy cat /data/caddy/pki/authorities/local/root.crt" > ~/Downloads/caddy-root-ca.crt + +# Importer dans macOS +sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ~/Downloads/caddy-root-ca.crt +``` + +### Gitea OAuth "500 Internal Server Error" + +**Cause** : URL OAuth pointe vers hostname Docker interne + +**Vérifier** : +```bash +docker exec gitea sqlite3 /data/gitea/gitea.db "SELECT cfg FROM login_source WHERE type=6;" +``` + +**Corriger** : +```bash +docker exec gitea sqlite3 /data/gitea/gitea.db "UPDATE login_source SET cfg = REPLACE(cfg, 'http://authelia:9091', 'https://auth.talloires.local') WHERE type=6;" +docker restart gitea +``` + +### Container ne trouve pas l'URL externe + +**Cause** : Container ne peut pas résoudre ou valider le certificat SSL + +**Solution** : Monter le CA Caddy dans le container : +```yaml +volumes: + - /home/lionel/docker/caddy-root-ca.crt:/etc/ssl/certs/caddy-root-ca.crt:ro +environment: + - SSL_CERT_FILE=/etc/ssl/certs/caddy-root-ca.crt +``` + +### Outline "400 Bad Request" + +**Cause** : Double authentification (Authelia + OIDC Outline) + +**Solution** : Ne pas utiliser `import authelia` pour Outline dans Caddyfile + +### Volumes disparus après migration + +**Cause** : Nom du volume change avec le répertoire (préfixe) + +**Solution** : Utiliser `external: true` ou lister les volumes existants : +```bash +docker volume ls | grep transmission +``` + +### Home Assistant page blanche + +**Cause** : WebSocket non supporté ou mauvais reverse proxy + +**Vérifier** : +```bash +curl -s http://localhost:8123 | head -5 +``` + +**Solution** : Utiliser le nom du container, pas l'IP : +```caddyfile +reverse_proxy homeassistant:8123 +``` diff --git a/docs/vault/index-v1.md b/docs/vault/index-v1.md new file mode 100644 index 0000000..f5e9cef --- /dev/null +++ b/docs/vault/index-v1.md @@ -0,0 +1,77 @@ +# Talloires - Home Server + +Bienvenue sur le portail de documentation de **Talloires**, le serveur domestique Raspberry Pi 5. + +## 🚀 Go Links (Raccourcis) + +Accès rapide via `https://go/xxx` : + +| Raccourci | Service | Raccourci | Service | +|-----------|---------|-----------|---------| +| [go/ha](https://go/ha) | Home Assistant | [go/jf](https://go/jf) | Jellyfin | +| [go/lw](https://go/lw) | Linkwarden | [go/lt](https://go/lt) | LanguageTool | +| [go/docs](https://go/docs) | Documentation | [go/git](https://go/git) | Gitea | +| [go/grafana](https://go/grafana) | Grafana | [go/dockge](https://go/dockge) | Dockge | +| [go/shlink](https://go/shlink) | Admin Go Links | [go/auth](https://go/auth) | Authelia | + +**Tous les go-links :** ha, homeassistant, jf, jellyfin, lw, linkwarden, docs, git, auth, grafana, dockge, portainer, transmission, netdata, uptime, cockpit, vikunja, outline, lt, languagetool, shlink, annecy + +[Créer un nouveau go-link](https://go/shlink) + +--- + +## Services + +### Media +| Service | Go Link | URL | +|---------|---------|-----| +| Jellyfin | [go/jf](https://go/jf) | jellyfin.talloires.local | +| Transmission | [go/transmission](https://go/transmission) | transmission.talloires.local | + +### Productivité +| Service | Go Link | URL | +|---------|---------|-----| +| Vikunja | [go/vikunja](https://go/vikunja) | vikunja.talloires.local | +| Outline | [go/outline](https://go/outline) | outline.talloires.local | +| Linkwarden | [go/lw](https://go/lw) | linkwarden.talloires.local | +| LanguageTool | [go/lt](https://go/lt) | languagetool.talloires.local | + +### Infrastructure +| Service | Go Link | URL | +|---------|---------|-----| +| Portainer | [go/portainer](https://go/portainer) | portainer.talloires.local | +| Dockge | [go/dockge](https://go/dockge) | dockge.talloires.local | +| Gitea | [go/git](https://go/git) | git.talloires.local | +| MkDocs | [go/docs](https://go/docs) | docs.talloires.local | +| Shlink | [go/shlink](https://go/shlink) | shlink.talloires.local | + +### Monitoring +| Service | Go Link | URL | +|---------|---------|-----| +| Grafana | [go/grafana](https://go/grafana) | grafana.talloires.local | +| Netdata | [go/netdata](https://go/netdata) | netdata.talloires.local | +| Uptime Kuma | [go/uptime](https://go/uptime) | uptime.talloires.local | +| Cockpit | [go/cockpit](https://go/cockpit) | cockpit.talloires.local | + +### Domotique +| Service | Go Link | URL | +|---------|---------|-----| +| Home Assistant | [go/ha](https://go/ha) | homeassistant.talloires.local | + +### Sécurité +| Service | Go Link | URL | +|---------|---------|-----| +| Authelia | [go/auth](https://go/auth) | auth.talloires.local | +| CrowdSec | - | (service interne) | + +--- + +## Accès rapide + +- [Vue ensemble des services](services/overview.md) +- [Architecture réseau](config/network.md) +- [Configuration Shlink](services/shlink.md) +- [Configuration SSO](services/authelia.md) +- [Backup](services/backup.md) +- [Ports utilisés](reference/ports.md) +- [Commandes utiles](reference/commands.md) diff --git a/docs/vault/javascripts/external-links.js b/docs/vault/javascripts/external-links.js new file mode 100644 index 0000000..41215d7 --- /dev/null +++ b/docs/vault/javascripts/external-links.js @@ -0,0 +1,7 @@ +document.addEventListener('DOMContentLoaded', function() { + var links = document.querySelectorAll('a[href^="http"]'); + links.forEach(function(link) { + link.setAttribute('target', '_blank'); + link.setAttribute('rel', 'noopener noreferrer'); + }); +}); diff --git a/docs/vault/reference/commands.md b/docs/vault/reference/commands.md new file mode 100644 index 0000000..4fda5b6 --- /dev/null +++ b/docs/vault/reference/commands.md @@ -0,0 +1,118 @@ +# Commandes utiles + +## Docker + +```bash +# Status de tous les containers +docker ps -a + +# Logs dun service +docker logs -f + +# Redémarrer un service +docker restart + +# Recréer un service (après modif compose) +cd ~/docker/talloires && docker compose up -d + +# Tout redémarrer +cd ~/docker/talloires && docker compose down && docker compose up -d + +# Shell dans un container +docker exec -it sh +``` + +## Caddy + +```bash +# Recharger la config +docker exec caddy caddy reload --config /etc/caddy/Caddyfile + +# Voir les logs +docker logs caddy -f + +# Tester la config +docker exec caddy caddy validate --config /etc/caddy/Caddyfile +``` + +## Authelia + +```bash +# Logs +docker logs authelia -f + +# Générer un hash de mot de passe +docker exec authelia authelia crypto hash generate argon2 --password "motdepasse" + +# Générer un hash pour OIDC secret +docker exec authelia authelia crypto hash generate pbkdf2 --password "secret" +``` + +## Backup + +```bash +# Lancer un backup manuel +~/backup-to-annecy.sh + +# Voir le log +cat ~/backup.log + +# Lister les backups sur Annecy +sudo ssh -i /root/.ssh/id_ed25519 rsync-talloires@10.171.171.50 "ls -lh /volume1/Backups/talloires/" +``` + +## Système + +```bash +# Espace disque +df -h + +# Mémoire +free -h + +# Température CPU +vcgencmd measure_temp + +# Services systemd +sudo systemctl status docker +sudo systemctl status cockpit + +# Logs système +journalctl -f +``` + +## Réseau + +```bash +# IP des containers +docker network inspect talloires_net | grep -A2 Name + +# Test DNS Docker +docker exec caddy nslookup authelia + +# Connecter un container au réseau +docker network connect talloires_net +``` + +## CrowdSec + +```bash +# Status +docker exec crowdsec cscli metrics + +# Décisions actives (bans) +docker exec crowdsec cscli decisions list + +# Ajouter un ban manuel +docker exec crowdsec cscli decisions add --ip 1.2.3.4 --reason "test" +``` + +## Certificats + +```bash +# Exporter le CA Caddy (pour clients) +docker exec caddy cat /data/caddy/pki/authorities/local/root.crt > caddy-ca.crt + +# Installer sur Mac +security add-trusted-cert -d -r trustRoot -k ~/Library/Keychains/login.keychain-db caddy-ca.crt +``` diff --git a/docs/vault/reference/ports.md b/docs/vault/reference/ports.md new file mode 100644 index 0000000..d819543 --- /dev/null +++ b/docs/vault/reference/ports.md @@ -0,0 +1,98 @@ +# Ports utilises + +## Ports exposes (accessibles via reseau) + +| Port | Service | Protocol | Notes | +|------|---------|----------|-------| +| 80 | Caddy (redirect HTTPS) | TCP | Redirige vers 443 | +| 443 | Caddy (reverse proxy) | TCP | Point entree principal | +| 8096 | Jellyfin | TCP | Acces direct (optionnel) | +| 3030 | Gitea HTTP | TCP | Mappe depuis 3000 interne | +| 2222 | Gitea SSH | TCP | Mappe depuis 22 interne | +| 8123 | Home Assistant | TCP | Mode host network | +| 9090 | Cockpit | TCP | Admin systeme | +| 1514 | Syslog-ng | TCP/UDP | Collecte syslog | +| 51413 | Transmission P2P | TCP/UDP | BitTorrent | + +## Ports internes Docker (talloires_net) + +| Port | Service(s) | Notes | +|------|------------|-------| +| 3001 | Uptime Kuma | | +| 3100 | Loki | Agregation logs | +| 3456 | Vikunja | | +| 5001 | Dockge | | +| 5432 | PostgreSQL | Linkwarden-db, Outline-db | +| 6379 | Redis | Outline-redis | +| 8000 | MkDocs | | +| 8010 | LanguageTool | | +| 8080 | Shlink, Shlink-web | Go Links | +| 9000 | Portainer | | +| 9091 | Authelia, Transmission Web | | +| 19999 | Netdata | | + +## Go Links + +Acces rapide a tous les services via `https://go/xxx` + +| Go Link | Service | +|---------|---------| +| go/ha | Home Assistant | +| go/jf | Jellyfin | +| go/lw | Linkwarden | +| go/lt | LanguageTool | +| go/docs | Documentation | +| go/git | Gitea | +| go/auth | Authelia | +| go/grafana | Grafana | +| go/dockge | Dockge | +| go/portainer | Portainer | +| go/shlink | Admin Go Links | + +[Liste complete et creation de nouveaux liens](../services/shlink.md) + +## URLs par domaine + +### Acces local (.talloires.local) - avec Authelia + +| Service | URL | Authentification | +|---------|-----|------------------| +| Go Links | https://go | Shlink | +| Homepage | https://talloires.local | Authelia | +| Auth | https://auth.talloires.local | - | +| Shlink Admin | https://shlink.talloires.local | Authelia | +| Git | https://git.talloires.local | OIDC Authelia | +| Jellyfin | https://jellyfin.talloires.local | Authelia | +| Grafana | https://grafana.talloires.local | Header Auth | +| Portainer | https://portainer.talloires.local | Authelia | +| Dockge | https://dockge.talloires.local | Authelia | +| Docs | https://docs.talloires.local | Authelia | +| Vikunja | https://vikunja.talloires.local | Authelia | +| Outline | https://outline.talloires.local | OIDC Authelia | +| Linkwarden | https://linkwarden.talloires.local | Authelia | +| LanguageTool | https://languagetool.talloires.local | Authelia | +| Transmission | https://transmission.talloires.local | Authelia | +| Netdata | https://netdata.talloires.local | Authelia | +| Uptime Kuma | https://uptime.talloires.local | Authelia | +| Cockpit | https://cockpit.talloires.local | Authelia | +| Home Assistant | https://homeassistant.talloires.local | Authelia | + +### Acces ZeroTier (.talloires.tailfd281f.ts.net) - sans Authelia + +Ces URLs sont accessibles depuis exterieur via le reseau ZeroTier. + +| Service | URL | Auth native | +|---------|-----|-------------| +| Go Links | https://go | Shlink | +| Vikunja | https://vikunja.talloires.tailfd281f.ts.net | Vikunja login | +| Outline | https://outline.talloires.tailfd281f.ts.net | OIDC Authelia | +| Linkwarden | https://linkwarden.tailfd281f.ts.net | Linkwarden login | +| LanguageTool | https://languagetool.talloires.tailfd281f.ts.net | Aucune (API) | + +## Reseau ZeroTier + +| Serveur | IP ZeroTier | Role | +|---------|-------------|------| +| Talloires | 10.144.221.22 | Serveur principal (Pi5) | +| Annecy | 10.144.78.193 | NAS Synology (backup) | +| Olympou | 10.144.46.46 | Mac de travail | diff --git a/docs/vault/reference/scripts.md b/docs/vault/reference/scripts.md new file mode 100644 index 0000000..0fccbfd --- /dev/null +++ b/docs/vault/reference/scripts.md @@ -0,0 +1,56 @@ +# Scripts de maintenance + +Scripts utilitaires pour la gestion de Talloires. + +## update-containers.sh + +Met à jour tous les containers Docker en parcourant les répertoires avec un fichier docker-compose. + +**Emplacement** : + +=== Pulling latest images === + +**Usage** : + + +--- + +## transmission-toggle.sh + +Active/désactive le container Transmission à la demande (économie de ressources). + +**Emplacement** : + +🔴 Transmission is STOPPED + +**Usage** : + + +--- + +## backup-to-annecy.sh + +Sauvegarde les configs Docker vers le NAS Synology (Annecy). + +**Emplacement** : + + + +**Planification** : Cron à 3h00 quotidien + + +**Vérifier les backups** : + + +--- + +## Watchtower (automatique) + +Watchtower vérifie et met à jour automatiquement les containers à 4h00. + +**Configuration** : Dans + + + +**Logs** : + diff --git a/docs/vault/services-v1/authelia.md b/docs/vault/services-v1/authelia.md new file mode 100644 index 0000000..b2ea775 --- /dev/null +++ b/docs/vault/services-v1/authelia.md @@ -0,0 +1,141 @@ +# Authelia - SSO + +Authelia fournit l authentification unique (SSO) pour tous les services Talloires. + +## Acces + +| Parametre | Valeur | +|-----------|--------| +| URL | [auth.talloires.local](https://auth.talloires.local) | +| Utilisateur | lionel | +| Email | dflected@dflected.org | +| 2FA | TOTP active | + +## Matrice de protection des services + +| Service | Authelia | Raison | +|---------|----------|--------| +| **docs** | ✅ | Documentation interne | +| **portainer** | ✅ | Admin Docker | +| **dockge** | ✅ | Admin Docker Compose | +| **transmission** | ✅ | Client torrent | +| **netdata** | ✅ | Monitoring systeme | +| **grafana** | ✅ | Dashboards / Logs | +| **uptime** | ✅ | Monitoring disponibilite | +| **cockpit** | ✅ | Admin systeme | +| **languagetool** | ✅ | API grammaire | +| **auth** | ❌ | C est Authelia lui-meme | +| **git** | ❌ | Auth OIDC propre | +| **jellyfin** | ❌ | Auth propre | +| **homeassistant** | ❌ | Auth propre | +| **linkwarden** | ❌ | Auth propre | +| **vikunja** | ❌ | Auth propre | +| **outline** | ❌ | Auth OIDC propre | + +> **Note** : Cette protection s applique aux domaines `.local` ET `.tailfd281f.ts.net` + +## Services avec OAuth/OIDC + +Ces services utilisent Authelia comme provider OpenID Connect : + +### Gitea +| Parametre | Valeur | +|-----------|--------| +| Client ID | gitea | +| Redirect URI | https://git.talloires.local/user/oauth2/Authelia/callback | +| Scopes | openid, email, profile | + +### Outline +| Parametre | Valeur | +|-----------|--------| +| Client ID | outline | +| Redirect URI | https://outline.talloires.local/auth/oidc.callback | +| Scopes | openid, offline_access, profile, email | + +### Grafana (Header Auth) +Grafana utilise l authentification par header via Authelia (pas OIDC) : + +| Header | Valeur | +|--------|--------| +| Remote-User | Utilisateur authentifie | +| Remote-Email | Email de l utilisateur | + +## Configuration + +### Fichiers +| Fichier | Usage | +|---------|-------| +| ~/docker/authelia/config/configuration.yml | Config principale | +| ~/docker/authelia/config/users_database.yml | Base utilisateurs | +| ~/docker/authelia/config/oidc.key | Cle privee OIDC | + +### SMTP (Proton Mail) +| Parametre | Valeur | +|-----------|--------| +| Serveur | smtp.protonmail.ch:465 | +| Protocol | TLS implicite | +| From | Talloires | + +## Integration Caddy + +### Snippet forward_auth +``` +(authelia) { + forward_auth authelia:9091 { + uri /api/authz/forward-auth + copy_headers Remote-User Remote-Groups Remote-Email Remote-Name + } +} +``` + +### Usage dans Caddyfile +``` +monservice.talloires.local, monservice.talloires.tailfd281f.ts.net { + import authelia + reverse_proxy backend:port + tls internal +} +``` + +## Ajouter un client OIDC + +1. Generer le hash du secret : +```bash +docker exec authelia authelia crypto hash generate pbkdf2 --password "mon-secret" +``` + +2. Ajouter dans configuration.yml : +```yaml +- client_id: nouveau_client + client_name: Mon Service + client_secret: "$pbkdf2-sha512$..." + public: false + authorization_policy: two_factor + redirect_uris: + - https://service.talloires.local/callback + scopes: + - openid + - email + - profile +``` + +3. Redemarrer Authelia : +```bash +docker restart authelia +``` + +## Commandes utiles + +```bash +# Logs +docker logs authelia -f + +# Hash mot de passe utilisateur +docker exec authelia authelia crypto hash generate argon2 --password "motdepasse" + +# Hash OIDC client secret +docker exec authelia authelia crypto hash generate pbkdf2 --password "secret" + +# Valider la configuration +docker exec authelia authelia validate-config +``` diff --git a/docs/vault/services-v1/backup.md b/docs/vault/services-v1/backup.md new file mode 100644 index 0000000..58f95af --- /dev/null +++ b/docs/vault/services-v1/backup.md @@ -0,0 +1,76 @@ +# Backup + +Sauvegarde automatique de Talloires vers Annecy (Synology NAS). + +## Configuration + +| Paramètre | Valeur | +|-----------|--------| +| Script | ~/backup-to-annecy.sh | +| Destination | rsync-talloires@10.171.171.50:/volume1/Backups/talloires/ | +| Méthode | tar over SSH (rsync SUID bloqué sur Synology DSM 7) | +| Schedule | Cron quotidien à 3h00 | +| Rétention | 7 derniers backups | +| Log | ~/backup.log | + +## Données sauvegardées + +- ~/docker/ (toutes les configs Docker) + +### Exclusions +- *.log +- */cache/* +- */logs/* +- */__pycache__/* + +## Authentification SSH + +- Clé privée (root): /root/.ssh/id_ed25519 +- Clé privée (lionel): ~/.ssh/id_ed25519 +- Utilisateur distant: rsync-talloires +- Fingerprint: SHA256:CxpeBfvrBV/s+RNE49SwrY3WsG28Du3nyQ/2D9lApU8 + +## Commandes + +### Lancer un backup manuel +```bash +~/backup-to-annecy.sh +``` + +### Vérifier le log +```bash +cat ~/backup.log +``` + +### Vérifier les backups sur Annecy +```bash +sudo ssh -i /root/.ssh/id_ed25519 rsync-talloires@10.171.171.50 "ls -lh /volume1/Backups/talloires/" +``` + +### Restaurer un backup +```bash +# Sur Talloires +sudo ssh -i /root/.ssh/id_ed25519 rsync-talloires@10.171.171.50 "cat /volume1/Backups/talloires/docker-backup-YYYYMMDD-HHMMSS.tar.gz" | sudo tar -xzf - -C /home/lionel/ +``` + +## Cron + +```bash +# Voir le cron +sudo crontab -l + +# Modifier +sudo crontab -e +``` + +Entrée actuelle : +``` +0 3 * * * /home/lionel/backup-to-annecy.sh +``` + +## Notes techniques + +Le rsync classique ne fonctionne pas avec Synology DSM 7 car : +- rsync est SUID root sur DSM +- Les utilisateurs non-admin nont pas de shell par défaut +- Solution: tar over SSH fonctionne parfaitement diff --git a/docs/vault/services-v1/grafana.md b/docs/vault/services-v1/grafana.md new file mode 100644 index 0000000..bf771df --- /dev/null +++ b/docs/vault/services-v1/grafana.md @@ -0,0 +1,3 @@ +# Grafana - Monitoring & Alertes + +## Vue densemble diff --git a/docs/vault/services-v1/overview.md b/docs/vault/services-v1/overview.md new file mode 100644 index 0000000..4cdd453 --- /dev/null +++ b/docs/vault/services-v1/overview.md @@ -0,0 +1,148 @@ +# Vue ensemble des services + +## Architecture + +``` +Client (Mac/iPhone) + | + | HTTPS (certificat Caddy CA) + v +[Caddy] :443 + | + +-- forward_auth --> [Authelia] :9091 + | | + | (si authentifié) + | | + +-------------------------+ + | + v +Services Docker +``` + +## Services actifs (24 containers) + +### 🎬 Média +| Service | Container | Port | Description | +|---------|-----------|------|-------------| +| Jellyfin | jellyfin | 8096 | Streaming vidéo avec transcodage hardware (VideoCore) | +| Transmission | transmission | 9091, 51413 | Client BitTorrent avec web UI | + +### ✅ Productivité +| Service | Container | Port | Description | +|---------|-----------|------|-------------| +| Vikunja | vikunja | 3456 | Gestion de tâches style Todoist/Trello avec CalDAV | +| Outline | outline + outline-db + outline-redis | 3000 | Wiki collaboratif avec OIDC (PostgreSQL + Redis) | +| Linkwarden | linkwarden + linkwarden-db | 3000 | Gestionnaire de bookmarks avancé avec archivage | +| LanguageTool | languagetool | 8010 | Serveur de correction grammaticale (FR/EN/DE) | + +### 🔧 Infrastructure +| Service | Container | Port | Description | +|---------|-----------|------|-------------| +| Portainer | portainer | 9000 | Interface de gestion Docker | +| Dockge | dockge | 5001 | Interface Docker Compose | +| Gitea | gitea | 3000, 22 | Serveur Git avec SSO Authelia | +| MkDocs | mkdocs | 8000 | Cette documentation | + +### 📊 Monitoring +| Service | Container | Port | Description | +|---------|-----------|------|-------------| +| Grafana | grafana | 3000 | Dashboards et visualisation (header auth via Authelia) | +| Netdata | netdata | 19999 | Monitoring système temps réel | +| Uptime Kuma | uptime-kuma | 3001 | Surveillance uptime des services | +| Loki | loki | 3100 | Agrégation de logs | +| Promtail | promtail | - | Collecte de logs pour Loki | +| Syslog-ng | syslog-ng | 1514 | Collecte syslog centralisée | + +### 🏠 Domotique +| Service | Container | Port | Description | +|---------|-----------|------|-------------| +| Home Assistant | homeassistant | 8123 | Automatisation domotique (mode host network) | + +### 🔐 Sécurité +| Service | Container | Port | Description | +|---------|-----------|------|-------------| +| Authelia | authelia | 9091 | SSO, 2FA, OIDC provider | +| CrowdSec | crowdsec | - | IDS/IPS collaboratif | +| Caddy | caddy | 80, 443 | Reverse proxy avec TLS automatique | + +### 🔄 Maintenance +| Service | Container | Port | Description | +|---------|-----------|------|-------------| +| Watchtower | watchtower | 8080 | Mise à jour auto des containers (4h00) | + +## Répertoires Docker + +``` +~/docker/ +├── authelia/ # Config SSO +├── caddy/ # Caddyfile + certificats +├── crowdsec/ # Config IDS +├── dockge/ # Stacks Dockge +├── docs/ # MkDocs (cette doc) +├── gitea/ # Config + data Gitea +├── grafana/ # Dashboards +├── homeassistant/ # Config HA +├── languagetool/ # Config LT +├── linkwarden/ # Config Linkwarden +├── outline/ # Config Outline +├── syslog-ng/ # Config syslog +├── talloires/ # Stack principal (docker-compose.yml) +├── uptime-kuma/ # Data Uptime Kuma +├── vikunja/ # Config Vikunja +└── zeronsd/ # DNS ZeroTier +``` + +## Réseau + +| Réseau | Plage | Usage | +|--------|-------|-------| +| ZeroTier | 10.144.0.0/16 | Accès distant | +| Docker talloires_net | 172.20.0.0/16 | Inter-containers | +| LAN physique | 10.171.171.0/24 | Réseau local | + +### Adresses ZeroTier clés +| Serveur | IP | +|---------|-----| +| Talloires (Pi5) | 10.144.221.22 | +| Annecy (Synology) | 10.144.78.193 | +| Olympou (Mac) | 10.144.46.46 | + +## Stockage + +| Mount | Source | Usage | +|-------|--------|-------| +| /mnt/mediaserver | USB SSD 4TB | Films, Séries, Downloads, Databases | +| ~/docker | SD Card | Configs Docker légères | + +### Structure USB (/mnt/mediaserver) +``` +/mnt/mediaserver/ +├── databases/ +│ ├── languagetool/ngrams/ # N-grams FR/EN/DE (~8GB) +│ └── outline/ +│ ├── data/ # Fichiers Outline +│ ├── postgres/ # PostgreSQL Outline +│ └── redis/ # Redis Outline +├── downloads/ # Transmission +├── movies/ # Films (Jellyfin) +└── series/ # Séries (Jellyfin) +``` + +## Backup + +| Paramètre | Valeur | +|-----------|--------| +| Destination | Annecy (Synology) | +| Schedule | 3h00 quotidien | +| Rétention | 7 jours | +| Méthode | tar over SSH | + +Voir [Scripts de maintenance](../reference/scripts.md) pour les détails. + +## Maintenance automatique + +| Tâche | Schedule | Outil | +|-------|----------|-------| +| Mise à jour containers | 4h00 | Watchtower | +| Backup vers Annecy | 3h00 | backup-to-annecy.sh (cron) | +| Nettoyage images | Après update | docker image prune | diff --git a/docs/vault/services-v1/shlink.md b/docs/vault/services-v1/shlink.md new file mode 100644 index 0000000..0decd97 --- /dev/null +++ b/docs/vault/services-v1/shlink.md @@ -0,0 +1,109 @@ +# Shlink - Go Links + +Shlink est un service de raccourcissement d URL qui permet de creer des go-links personnalises. + +## Acces + +| Interface | URL | +|-----------|-----| +| Go Links | `https://go/xxx` | +| Admin | [go/shlink](https://go/shlink) | + +## Go Links disponibles + +| Raccourci | Destination | +|-----------|-------------| +| go/ha | Home Assistant | +| go/homeassistant | Home Assistant | +| go/jf | Jellyfin | +| go/jellyfin | Jellyfin | +| go/lw | Linkwarden | +| go/linkwarden | Linkwarden | +| go/lt | LanguageTool | +| go/languagetool | LanguageTool | +| go/docs | Documentation | +| go/git | Gitea | +| go/auth | Authelia | +| go/grafana | Grafana | +| go/dockge | Dockge | +| go/portainer | Portainer | +| go/transmission | Transmission | +| go/netdata | Netdata | +| go/uptime | Uptime Kuma | +| go/cockpit | Cockpit | +| go/vikunja | Vikunja | +| go/outline | Outline | +| go/cryptpad | CryptPad | +| go/shlink | Admin Shlink | + +## Creer un nouveau go-link + +### Via interface web + +1. Aller sur [go/shlink](https://go/shlink) +2. Cliquer sur "Create short URL" +3. Entrer l URL longue et le slug personnalise + +### Via CLI + +```bash +docker exec shlink shlink short-url:create https://example.com --custom-slug=example +``` + +### Lister tous les liens + +```bash +docker exec shlink shlink short-url:list +``` + +### Supprimer un lien + +```bash +docker exec shlink shlink short-url:delete +``` + +## Configuration + +- **Domaine** : go +- **Base de donnees** : SQLite +- **Statistiques** : Activees (visites trackees) + +## Docker Compose + +Emplacement : `~/docker/shlink/docker-compose.yml` + +```yaml +services: + shlink: + image: shlinkio/shlink:stable + container_name: shlink + environment: + - DEFAULT_DOMAIN=go + - IS_HTTPS_ENABLED=true + - DB_DRIVER=sqlite + volumes: + - ./data:/etc/shlink/data + networks: + - talloires_net + + shlink-web: + image: shlinkio/shlink-web-client:stable + container_name: shlink-web + networks: + - talloires_net +``` + +## Caddy + +``` +go, go.local, go.tailfd281f.ts.net { + reverse_proxy shlink:8080 + tls internal +} + +shlink.talloires.local, shlink.talloires.tailfd281f.ts.net { + import authelia + reverse_proxy shlink-web:8080 + tls internal +} +``` diff --git a/docs/vault/services-v1/transmission.md b/docs/vault/services-v1/transmission.md new file mode 100644 index 0000000..ac39277 --- /dev/null +++ b/docs/vault/services-v1/transmission.md @@ -0,0 +1,177 @@ +# Transmission - Torrent Client + +## Vue d'ensemble + +Transmission est le client BitTorrent utilisé sur Talloires, configuré pour router **tout son trafic via ProtonVPN** afin de protéger la vie privée et masquer l'activité de téléchargement à l'ISP. + +!!! success "Configuration VPN" + Le trafic de Talloires (10.171.171.7) est automatiquement routé via ProtonVPN sur Theseus, garantissant que Transmission est invisible pour l'ISP. + +## Informations de connexion + +| Paramètre | Valeur | +|-----------|--------| +| **URL locale** | http://talloires.local:9091 | +| **URL Tailscale** | http://talloires.tailfd281f.ts.net:9091 | +| **Container** | `transmission` | +| **Réseau Docker** | `talloires_net` | +| **IP Container** | 172.20.0.17 | + +## Configuration + +### Docker Compose + +```yaml +transmission: + image: linuxserver/transmission:latest + container_name: transmission + restart: unless-stopped + ports: + - 51413:51413 + - 51413:51413/udp + expose: + - 9091 + environment: + - PUID=1026 + - PGID=100 + - TZ=Europe/Luxembourg + volumes: + - talloires_transmission_config:/config + - /mnt/mediaserver/downloads:/downloads + networks: + - talloires_net +``` + +### Vérification VPN + +Le trafic de Transmission passe par ProtonVPN : + +```bash +# Vérifier l'IP publique de Transmission +docker exec transmission sh -c "curl -s ipinfo.io" +``` + +Résultat attendu : +```json +{ + "ip": "5.253.204.205", + "city": "Brussels", + "country": "BE", + "org": "AS9009 M247 Europe SRL" +} +``` + +!!! warning "IP différente de l'ISP" + L'IP normale de l'ISP est `87.240.228.220` (POST Luxembourg). Si Transmission montre cette IP, le VPN ne fonctionne pas correctement. + +## Script de contrôle + +Un script de gestion est disponible pour démarrer/stopper Transmission facilement. + +### Emplacement + +```bash +/home/lionel/scripts/transmission-control.sh +``` + +### Utilisation + +```bash +# Stopper Transmission +~/scripts/transmission-control.sh stop + +# Démarrer Transmission +~/scripts/transmission-control.sh start + +# Redémarrer Transmission +~/scripts/transmission-control.sh restart + +# Voir le statut et les statistiques +~/scripts/transmission-control.sh status +``` + +### Exemple de sortie + +```bash +$ ~/scripts/transmission-control.sh status +=== Transmission Status === +1b69f36ee669 linuxserver/transmission:latest Up 3 days transmission + +=== Network Stats === +CONTAINER ID NAME CPU % MEM USAGE / LIMIT NET I/O +1b69f36ee669 transmission 0.05% 45MiB / 7.68GiB 16.8GB / 813MB +``` + +## Monitoring + +### Vérifier l'état du tunnel VPN + +Sur Theseus : + +```bash +# Voir les statistiques du tunnel WireGuard +ssh -l root theseus.local 'wg show wgclt1' +``` + +### Logs Transmission + +```bash +# Logs en temps réel +docker logs -f transmission + +# Dernières 50 lignes +docker logs transmission --tail 50 +``` + +## Dépannage + +### Transmission ne télécharge pas + +1. Vérifier que le VPN est actif : +```bash +ssh -l root theseus.local 'wg show wgclt1 | grep handshake' +``` + +2. Vérifier l'IP de Transmission : +```bash +docker exec transmission sh -c "curl -s ipinfo.io | grep ip" +``` + +3. Redémarrer Transmission : +```bash +~/scripts/transmission-control.sh restart +``` + +### Vitesse lente + +Le routage via VPN peut réduire la vitesse. Vérifier : + +1. **Latence du tunnel** : +```bash +ssh -l root theseus.local 'ping -c 3 10.2.0.1' # Gateway VPN +``` + +2. **Charge CPU de Talloires** : +```bash +docker stats transmission --no-stream +``` + +## Sécurité + +### Isolation réseau + +Talloires est configuré comme **DMZ** : + +- ✅ Accès sortant uniquement via ProtonVPN +- ❌ Pas d'accès vers les autres devices du LAN (Annecy, Olympou) +- ✅ ACL Tailscale bloque les connexions depuis Talloires + +### Kill Switch + +Si le VPN tombe, Talloires **perd l'accès Internet** (pas de fallback sur l'IP ISP), garantissant qu'aucun trafic torrent ne fuite. + +## Ressources + +- [Transmission Web UI](http://talloires.local:9091) +- [LinuxServer Transmission Docs](https://docs.linuxserver.io/images/docker-transmission) +- Configuration complète : `/home/lionel/docker/media/docker-compose.yml` diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..6246c0a --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,68 @@ +site_name: Talloires v2.0 Documentation +site_description: Documentation infrastructure Talloires v2.0 +site_author: Lionel +site_url: http://docs.talloires.local + +theme: + name: material + language: fr + palette: + # Light mode + - media: "(prefers-color-scheme: light)" + scheme: default + primary: indigo + accent: indigo + toggle: + icon: material/brightness-7 + name: Switch to dark mode + # Dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + primary: indigo + accent: indigo + toggle: + icon: material/brightness-4 + name: Switch to light mode + features: + - navigation.instant + - navigation.tracking + - navigation.tabs + - navigation.sections + - navigation.expand + - navigation.top + - search.suggest + - search.highlight + - content.code.copy + +markdown_extensions: + - admonition + - pymdownx.details + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + - tables + - toc: + permalink: true + - attr_list # Enable target="_blank" for links + +nav: + - Changelog: + - 2025-12-31: changelog/2025-12-31.md + - Accueil: index.md + - Services: + - Vue d'ensemble: services/overview.md + - Infrastructure: + - Vue d'ensemble: infra/overview.md + - Vault (v1.0): + - Archive v1.0: vault/README.md + - Documentation v1.0: vault/index-v1.md + - Services v1.0: vault/services-v1/overview.md + - Configuration v1.0: vault/config/docker-stacks.md + +extra: + social: + - icon: fontawesome/brands/github + link: https://git.talloires.local diff --git a/sync.log b/sync.log new file mode 100644 index 0000000..0253673 --- /dev/null +++ b/sync.log @@ -0,0 +1,6 @@ +Fri 19 Dec 16:19:29 CET 2025: Pulled new changes +Fri 19 Dec 16:20:07 CET 2025: Pulled new changes +Fri 19 Dec 17:56:02 CET 2025: Pulled new changes +Fri 19 Dec 17:59:01 CET 2025: Pulled new changes +Tue 23 Dec 03:25:01 CET 2025: Pulled new changes +Tue 23 Dec 03:25:01 CET 2025: Triggered MkDocs rebuild diff --git a/sync.sh b/sync.sh new file mode 100755 index 0000000..07bc442 --- /dev/null +++ b/sync.sh @@ -0,0 +1,12 @@ +#!/bin/bash +cd /home/lionel/docker/docs +git fetch origin main --quiet +LOCAL=$(git rev-parse HEAD) +REMOTE=$(git rev-parse origin/main) +if [ "$LOCAL" != "$REMOTE" ]; then + git pull origin main --quiet + echo "$(date): Pulled new changes" >> /home/lionel/docker/docs/sync.log + # Force MkDocs to rebuild by sending SIGHUP + docker kill --signal=SIGHUP mkdocs 2>/dev/null || docker restart mkdocs + echo "$(date): Triggered MkDocs rebuild" >> /home/lionel/docker/docs/sync.log +fi