Fondamentaux d'un VPS personnel
Ces notes décrivent une démarche sûre pour mettre en place un serveur personnel : vérifier l’identité de la machine, établir un accès distant sans risquer de se retrouver bloqué, installer l’environnement de conteneurs et un point d’entrée commun, puis valider un premier déploiement applicatif réel avec RSSHub. La phase 3 reste un déploiement miroir : la nouvelle instance RSSHub est utilisable, mais le consommateur de flux existant utilise toujours le RSSHub local ; aucun consommateur de production n’a encore été basculé.
Si vous choisissez encore où exécuter une application, comparez cette approche autogérée avec Cloudflare Workers et le tutoriel Cloud Run de Google Cloud. Ces guides couvrent l’exécution gérée, les permissions, le stockage et la facturation ; cette série se concentre sur l’administration de l’hôte Linux lui-même.
Pour suivre un nom d’hôte à travers les ports et HTTPS jusqu’à l’application, commencez par le parcours d’une requête réseau.
Commencer par la vue d'ensemble : deux portes
Considérez le VPS comme une salle des machines située sur Internet. Il possède désormais deux points d'entrée très différents :
- La porte d'administration m'est réservée : WSL2 emprunte d'abord la route privée Tailscale, puis OpenSSH vérifie ma clé et ouvre un terminal.
- La porte du site web est destinée aux visiteurs d'Internet : chaque requête HTTP/HTTPS publique atteint d'abord Caddy, et Caddy décide quel site web ou quelle API doit la recevoir.
Uptime Kuma est un outil d'administration, pas un site web public. Il n'a pas de porte publique ; je crée un tunnel SSH temporaire lorsque j'ai besoin de le consulter.
[Moi : WSL2]
`-- route privée Tailscale
`-- porte d’administration OpenSSH verrouillée
`-- [VPS Ubuntu]
[Visiteur Internet]
`-- TCP 80/443
`-- accueil public Caddy
|-- contrôle de santé de l’infrastructure
`-- couloir infra-edge -> RSSHub:1200
[À l’intérieur du VPS]
|-- Docker exécute Caddy, Uptime Kuma et RSSHub séparément
|-- UFW contrôle les ports de l’hôte qui peuvent recevoir du trafic
|-- Uptime Kuma attend un tunnel SSH uniquement sur 127.0.0.1:3001
`-- le port 1200 de RSSHub n’est accessible que dans le réseau Docker, sans publication sur l’hôte
[Environnement local existant]
`-- consommateur de flux -> RSSHub local (chemin de production et solution de repli)
Trois couches sont souvent confondues :
- La connectivité réseau détermine si les paquets peuvent atteindre le VPS.
- OpenSSH fournit une session chiffrée et vérifie l’identité du serveur.
- L’authentification SSH par clé publique prouve que la personne qui se connecte possède la clé privée correspondante.
Dans cette installation, Tailscale fournit uniquement le chemin réseau privé. C’est toujours OpenSSH sous Ubuntu qui écoute sur le port 22 et vérifie les clés publiques utilisateur. Je n’ai pas activé la fonctionnalité distincte Tailscale SSH.
Vocabulaire
Outils installés ou activés
Les composants ci-dessous ont été installés, activés ou explicitement configurés au cours des phases 1 à 3. L’analogie permet de comprendre leur rôle avant de retenir leur nom technique.
Outils me permettant de me connecter en toute sécurité
Tailscale et OpenSSH sont différents : Tailscale construit la route vers le serveur ; OpenSSH vérifie la clé lorsque j'arrive à la porte.
Outils qui exécutent les services
Les trois fichiers de configuration actuels sont /srv/caddy/compose.yaml, /srv/uptime-kuma/compose.yaml et /srv/rsshub/compose.yaml. Ils sont indépendants, de sorte que redémarrer RSSHub ne redémarre ni l'entrée ni la supervision.
Outils pour l'entrée publique et la supervision
Caddy et RSSHub rejoignent le réseau Docker nommé infra-edge. Considérez-le comme un couloir interne reliant l’accueil au service web : Caddy trouve RSSHub grâce à l’alias rsshub-prod, sans que le port 1200 de RSSHub soit publié sur l’hôte ou sur Internet. Kuma reste en dehors de ce chemin de proxy et demeure disponible uniquement via son tunnel SSH.
Quand vais-je utiliser chacun d'eux ?
- Se connecter au VPS : connecter Tailscale, puis exécuter
ssh; Tailscale, UFW et OpenSSH fonctionnent ensemble en coulisses. - Démarrer, arrêter ou inspecter un service : utiliser
docker compose; ne pas modifier directement les fichiers internes de Docker. - Ouvrir Kuma : créer la redirection locale SSH, puis naviguer vers
http://127.0.0.1:3001; ne pas rendre le port 3001 public. - Vérifier le point de terminaison public : ouvrir l'URL HTTPS
/healthzservie par Caddy. - Utiliser RSSHub : un consommateur de confiance appelle le domaine HTTPS avec l'ACCESS_KEY ; la clé ne transite que depuis le fichier
.envprotégé du VPS vers les consommateurs de confiance, jamais dans les notes publiques ou les URL de supervision. - Buildx : à utiliser uniquement lors de la construction d'une image personnalisée ; l'exploitation courante en a rarement besoin.
Quatre frontières à retenir
- Seul le trafic public TCP 80/443 entre, et il atteint Caddy en premier.
- SSH transite uniquement par le réseau privé Tailscale ; le SSH public reste bloqué.
- Kuma écoute uniquement sur le
127.0.0.1:3001propre au VPS et se consulte via un tunnel SSH. - Le port 1200 de RSSHub n’est pas publié sur l’hôte. Caddy y accède via
infra-edge; l’hôte Docker et les autres conteneurs de ce réseau peuvent aussi y accéder à l’adresse du conteneur.
« UFW actif » seul ne prouve pas que les ports Docker sont sécurisés, car Docker a ses propres règles de redirection de ports. Pour chaque nouveau service, vérifiez les ports déclarés dans Compose, les adresses et ports effectivement publiés par Docker, puis le résultat d’une connexion depuis une autre machine. Le guide d'ajout de services contient les commandes, et le Journal de construction contient la chronologie de déploiement.
Parcours de lecture
- Architecture et sécurité
- Accès SSH et durcissement
- Réseau Tailscale et OpenSSH
- UFW sans verrouillage
- Moteur Docker et Compose
- Guide d'exploitation
- Tmux en pratique
- Ajouter des services à côté d'un bot existant
- Déploiement miroir de RSSHub en production
Invariants de sécurité
- Étiqueter chaque commande comme étant locale à WSL2 ou distante sur le VPS.
- Ne jamais supprimer le dernier chemin SSH vérifié.
- Après une modification de SSH ou du pare-feu, tester avec une nouvelle connexion ; une ancienne session peut survivre à une règle de pare-feu défectueuse.
- Ne jamais placer de clés privées, mots de passe, jetons d’authentification ou codes de récupération dans la sortie des commandes, les notes, Git ou les conversations. Ne pas publier non plus d’adresses réelles ni d’empreintes.
Variables d’exemple
Cette série utilise des valeurs de substitution à la place des informations réelles de la machine :
VPS_USER=ubuntu
VPS_PUBLIC_IPV4="<public-ip>"
TAILSCALE_IPV4="<100.x.x.x>"
LOCAL_SSH_PUBLIC_KEY="$HOME/.ssh/id_ed25519.pub"
Ne pas enregistrer de mot de passe, de clé privée ou de clé d’authentification Tailscale dans ces variables.
Ce qui est en place aujourd’hui
Après les phases 1 à 3, mon VPS dispose des éléments suivants :
- Un système Ubuntu mis à jour, avec le bon nom d’hôte et le bon fuseau horaire.
- OpenSSH configuré pour l’authentification par clé publique seule, sans connexion directe de root.
- Des sessions OpenSSH fonctionnelles sur le réseau privé Tailscale.
- Les ports TCP 80/443 accessibles publiquement pour l’entrée web, tandis que le port 22 n’est plus ouvert à tous.
- Docker, Buildx et Compose opérationnels, avec Caddy, Uptime Kuma et RSSHub dans des projets Compose indépendants.
- Caddy comme unique entrée publique vers les conteneurs, tandis que l’interface d’administration de Kuma reste limitée à l’adresse de bouclage.
- RSSHub exécuté à partir d’une image officielle épinglée par digest, avec un cache en mémoire,
ACCESS_KEYet aucun port publié sur l’hôte. - Des contrôles de santé HTTPS publics, le refus des requêtes non authentifiées, une route réelle authentifiée, la supervision et le redémarrage de l’application, tous vérifiés.
- Les configurations des services et leurs données persistantes sous
/srv; un répertoire de données ne constitue pas une sauvegarde. - Tmux pour maintenir les sessions d’administration, avec l’ajout progressif de services sous forme de projets Compose indépendants.
La configuration de production du consommateur de flux, ses données persistantes, son ordonnanceur et le RSSHub local restent inchangés. La bascule des consommateurs, la preuve de sauvegarde et de restauration, la migration de l’ordonnanceur et la décision de retirer la solution de repli locale relèvent de la phase 4.