---
title: "Config VPS — Snapshot 17 avril 2026"
type: log
created: 2026-04-17
owner: jerem
agent: DAEMON
status: active
tags:
  - infra
  - vps
  - config
  - snapshot
related:
  - "[[projects/deamon-backend]]"
  - "[[_adn/routing-llm]]"
---

# Config VPS — 17 avril 2026

> Snapshot de l'état du VPS après Phase 1-6 + audit sécurité/stabilité.

---

## Serveur

| Élément | Valeur |
|---|---|
| Hébergeur | Hostinger — VPS dédié |
| OS | Ubuntu 22.04.5 LTS |
| Kernel | 5.15.0-176-generic |
| CPU | AMD EPYC 9354P — 2 cores |
| RAM | 7.8 GB |
| Swap | 4 GB |
| Disque | 97 GB (15% utilisé) |
| IP publique | 76.13.42.203 |
| IP VPN | 10.66.66.1 |
| SSH | Port 2222, clé uniquement, root désactivé |
| Domaine | jeremunlimited.com (DNS OVH) |
| Wildcard DNS | *.jeremunlimited.com → 76.13.42.203 |

---

## Accès

| Méthode | Commande / URL |
|---|---|
| SSH | `ssh -p 2222 jerem@10.66.66.1` (VPN requis) |
| Coolify | https://coolify.jeremunlimited.com |
| Gitea | https://git.jeremunlimited.com |
| n8n | https://n8n.jeremunlimited.com |
| Uptime Kuma | https://kuma.jeremunlimited.com |
| Whisper | https://whisper.jeremunlimited.com |

---

## Services Docker

| Container | Image | Port interne | Restart | Réseau |
|---|---|---|---|---|
| gitea | gitea/gitea:1.22 | 3000 | always | coolify + internal |
| gitea-db | postgres:16-alpine | 5432 | always | internal |
| n8n | n8nio/n8n:latest | 5678 | always | coolify |
| whisper | fedirz/faster-whisper-server:latest-cpu | 8000 | always | coolify |
| uptime-kuma | louislam/uptime-kuma:1 | 3001 | always | coolify |
| coolify | coolify:4.0.0-beta.473 | 8080 | always | coolify |
| coolify-proxy | traefik:v3.6 | 80/443 | unless-stopped | coolify |
| coolify-sentinel | sentinel:0.0.21 | — | always | coolify |
| coolify-db | postgres:15-alpine | 5432 | always | coolify |
| coolify-redis | redis:7-alpine | 6379 | always | coolify |
| coolify-realtime | coolify-realtime:1.0.13 | 6001-6002 | always | coolify |

---

## Sécurité

| Mesure | Status |
|---|---|
| SSH port 2222 (port 22 fermé) | ✅ |
| Root login désactivé (sauf Docker local) | ✅ |
| Password auth désactivé | ✅ |
| Fail2ban sur sshd | ✅ |
| WireGuard VPN (split tunnel) | ✅ |
| UFW firewall (deny par défaut) | ✅ |
| HTTPS Let's Encrypt sur tous les services | ✅ |
| Unattended security upgrades | ✅ |
| Kernel à jour | ✅ |

### Ports ouverts (UFW)

| Port | Protocole | Usage |
|---|---|---|
| 2222/tcp | ALLOW | SSH |
| 51820/udp | ALLOW | WireGuard |
| 22/tcp | ALLOW 10.0.0.0/24, 10.0.1.0/24, 76.13.42.203 | Coolify interne |
| 6001, 6002, 8080 | DENY | Bloqués par UFW (note: Docker bypass UFW) |

### Limitation connue

Docker manipule iptables directement et bypass UFW. Les ports 6001/6002/8080/8000 exposés par Coolify restent techniquement accessibles depuis l'extérieur malgré les règles DENY. Risque limité car ces services requièrent une authentification.

---

## Stabilité

| Mesure | Status |
|---|---|
| Swap 4 GB | ✅ |
| Restart policy `always` sur tous les containers | ✅ |
| Log rotation Docker (10MB × 3 fichiers) | ✅ |
| Backup quotidien 3h00 UTC (rétention 7 jours) | ✅ |
| Backup path | /home/jerem/backups/ |
| Backup script | /home/jerem/daemon-infra/backup.sh |

---

## Fichiers clés sur le VPS

```
/home/jerem/
├── daemon-infra/
│   ├── docker-compose.yml      # Tous les services DAEMON
│   ├── .env                    # GITEA_DB_PASS
│   ├── backup.sh               # Script backup quotidien
│   ├── gitea/                  # Data Gitea + PostgreSQL
│   ├── n8n/                    # Data n8n
│   ├── uptime-kuma/            # Data Uptime Kuma
│   ├── whisper/                # Modèles Whisper
│   └── openclaw/               # OpenClaw (installé, pas configuré)
├── backups/                    # Backups quotidiens
└── .ssh/                       # Clés SSH
```

---

## WireGuard

| Élément | Valeur |
|---|---|
| VPS (serveur) | 10.66.66.1, port 51820 |
| Mac (client) | 10.66.66.2 |
| Mode | Split tunnel (seul le trafic 10.66.66.x passe par le VPN) |
| Config VPS | /etc/wireguard/wg0.conf |

---

## Traefik (reverse proxy)

- Géré par Coolify (container coolify-proxy)
- Certificats Let's Encrypt automatiques (HTTP challenge)
- Config dynamique : /data/coolify/proxy/dynamic/
- Coolify routé via fichier `coolify-domain.yaml` (nom container, pas IP)
- Nos services routés via labels Docker dans docker-compose.yml

---

## Ce qui reste à faire

- [ ] Phase 10 — Doppler (gestion des secrets)
- [ ] Phase 11 — OpenClaw (configuration agent)
- [ ] Phase 12 — Sync Vault Mac ↔ Gitea ↔ VPS
- [ ] Déplacer le vault hors d'iCloud (recommandé pour Git sync)
- [ ] Configurer les monitors Uptime Kuma
- [ ] Tester Whisper (envoi d'un fichier audio)

---

*Généré automatiquement par DAEMON — session du 17 avril 2026*


---

## Addendum — Hardening Docker (même session)

### Problème résolu
Docker bypass UFW en manipulant iptables directement. Les ports Coolify (8000, 8080, 6001, 6002) et nos services (3000, 3001, 5678) étaient accessibles depuis internet malgré les règles UFW DENY.

### Solution
Règles iptables dans la chaîne `DOCKER-USER` (la seule que Docker respecte) :

**Autorisé :**
- Ports 80/443 depuis partout (Traefik HTTPS + Let's Encrypt)
- Tout trafic depuis le VPN (10.66.66.0/24)
- Tout trafic Docker interne (10.0.0.0/8, 172.16.0.0/12)
- Port 22 (Gitea SSH) depuis le VPN uniquement

**Bloqué (DROP) depuis internet :**
- Port 8000 (Coolify)
- Port 8080 (Traefik dashboard)
- Port 6001/6002 (Coolify Realtime)
- Port 5678 (n8n)
- Port 3000 (Gitea)
- Port 3001 (Uptime Kuma)

### Persistance
`iptables-persistent` installé, règles sauvegardées → survivent au reboot.

### Résultat
- Accès direct IP:port depuis internet → **timeout (DROP)** ✅
- Accès HTTPS via domaines → **fonctionne** ✅ (Traefik route en interne)
- Accès VPN → **fonctionne** ✅

**Risque résiduel : 0** — Seuls les ports 80/443 (Traefik) et 2222 (SSH) sont accessibles depuis internet. Tout le reste est DROP.


---

## Addendum 2 — Vault Sync (même session)

### Architecture sync

```
iPhone/iPad ←→ iCloud ←→ Mac (Obsidian) → Gitea → VPS (/home/jerem/vault)
                          commit+push auto         pull auto /5 min
                          dès stop d'édition
```

### Config

| Élément | Valeur |
|---|---|
| Plugin | Obsidian Git |
| Remote | ssh://git@10.66.66.1:222/Jerem/deamon-vault.git |
| Auto commit-and-sync | 1 minute |
| Auto commit after stop edit | ✅ activé |
| Auto pull | 1 minute |
| Clé SSH Mac | ~/.ssh/id_ed25519 (jerem@daemon) |
| Clé SSH VPS | ~/.ssh/id_ed25519 (jerem@vps) |
| VPS vault path | /home/jerem/vault |
| VPS cron pull | */5 * * * * (toutes les 5 min) |
| .gitignore | workspace.json, .trash/, .icloud, .DS_Store |

### Sécurité Notion
- Mot de passe root supprimé de la page Phase 1 (était en clair)


---

## Addendum 3 — Monitors & IPs fixes (même session)

### IPs fixes Docker (réseau coolify 10.0.1.0/24)

| Service | IP fixe | Port interne |
|---|---|---|
| Gitea | 10.0.1.100 | 3000 |
| n8n | 10.0.1.101 | 5678 |
| Whisper | 10.0.1.102 | 8000 |
| Uptime Kuma | 10.0.1.103 | 3001 |

### Monitors Uptime Kuma

| Monitor | Type | URL/Host |
|---|---|---|
| Gitea | HTTP(s) | http://gitea:3000 |
| n8n | HTTP(s) | http://n8n:5678 |
| Whisper | HTTP(s) Keyword | http://10.0.1.102:8000/v1/models |
| Coolify | HTTP(s) | http://coolify:8080 |
| SSH | TCP Port | 76.13.42.203:2222 |
| WireGuard VPN | Ping | 10.66.66.1 |

Note : Whisper utilise l'IP fixe car Kuma résolvait en IPv6 avec le hostname.

### Alertes
- Slack webhook configuré (default enabled sur tous les monitors)


---

## Addendum 4 — Doppler (même session)

### Projet Doppler : daemon-infra / environnement : prd

| Secret | Usage |
|---|---|
| CLAUDE | API Anthropic (carte non configurée pour l'instant) |
| GEMINI | API Google Gemini (gratuit tier free) |
| GROK | API xAI Grok |
| GITEA_DB_PASS | Mot de passe PostgreSQL Gitea |
| META_APP_SECRET | Clé secrète app Meta (WhatsApp webhooks) |
| NOTION | Token API Notion |
| SLACK | Bot Token Slack (xoxb-) avec scopes complets |
| WHATSAPP_BUSINESS_ID | ID compte WhatsApp Business |
| WHATSAPP_PHONE_ID | ID numéro WhatsApp |
| WHATSAPP_TOKEN | Token d'accès WhatsApp API |

### À faire
- Supprimer le fichier .env (GITEA_DB_PASS en clair) quand Doppler sera branché au docker-compose
- Ajouter ANTHROPIC_API_KEY quand la carte sera configurée
