Configuration Wireguard Docker
Docker compose
# =============================================================================
# docker-compose.yml — VPS OVH
# Services : WireGuard Hub + Portainer UI
# Version : 2 — Portainer UI bind sur 10.0.0.1 uniquement
# =============================================================================
#
# STRUCTURE DES FICHIERS ATTENDUE :
# /opt/wireguard-ovh/
# ├── docker-compose.yml (ce fichier)
# └── wg-config/
# └── wg0.conf (ovh-wg0.conf renommé)
#
#
# VÉRIFICATION :
# docker exec wireguard-ovh wg show
# ss -tlnp | grep 9000 # doit afficher 10.0.0.1:9000 uniquement
#
# =============================================================================
services:
wireguard:
image: lscr.io/linuxserver/wireguard:latest
container_name: wireguard-ovh
# network_mode: host est obligatoire pour que les règles iptables PostUp
# du fichier wg0.conf s'appliquent sur les interfaces réseau de l'hôte.
# En mode bridge Docker, le conteneur a ses propres interfaces virtuelles
# et ne peut pas manipuler eth0 de l'hôte ni les règles FORWARD globales.
network_mode: host
cap_add:
- NET_ADMIN # manipulation des interfaces réseau et iptables
- SYS_MODULE # chargement du module kernel WireGuard
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
volumes:
- ./wg-config:/config
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
restart: unless-stopped
portainer:
image: portainer/portainer-ce:latest
container_name: portainer-ui
# SÉCURITÉ : bind sur l'IP WireGuard uniquement.
# Le port 9000 est invisible depuis l'IP publique d'OVH.
# Accessible uniquement via le mesh : http://10.0.0.1:9000
# Profils clients qui peuvent y accéder :
# - ovh-exitnode (10.0.0.10) → oui, trafic mesh autorisé
# - private-only (10.0.0.40) → oui, c'est l'usage principal
# - mrs-exitnode (10.0.0.20) → oui, passe par le mesh via MRS→OVH
# - albi-exitnode (10.0.0.30) → oui, idem via Albi→OVH
ports:
- "10.0.0.1:9000:9000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer-data:/data
restart: unless-stopped
depends_on:
- wireguard
volumes:
portainer-data:
---
# =============================================================================
# docker-compose.yml — Serveur Marseille
# Services : WireGuard Spoke + Portainer Agent
# (Copier ce fichier pour Albi en changeant l'IP de bind du Portainer Agent)
# =============================================================================
#
# STRUCTURE DES FICHIERS ATTENDUE :
# /opt/wireguard-mrs/
# ├── docker-compose.yml
# └── wg-config/
# └── wg0.conf (marseille-wg0.conf renommé)
#
# =============================================================================
services:
wireguard:
image: lscr.io/linuxserver/wireguard:latest
container_name: wireguard-mrs
network_mode: host
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
volumes:
- ./wg-config:/config
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
restart: unless-stopped
portainer-agent:
image: portainer/agent:latest
container_name: portainer-agent
# SÉCURITÉ : bind sur l'IP WireGuard de Marseille uniquement.
# Le port 9001 est invisible depuis internet et depuis le LAN local.
# Seul Portainer UI (10.0.0.1) peut s'y connecter via le mesh.
# Pour Albi : remplacer 10.0.0.2 par 10.0.0.3
ports:
- "10.0.0.2:9001:9001"
environment:
- AGENT_PORT=9001
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/lib/docker/volumes:/var/lib/docker/volumes
restart: unless-stopped
depends_on:
- wireguard
# =============================================================================
# docker-compose.yml — Serveur Albi
# Identique à Marseille, changer uniquement :
# ports: "10.0.0.3:9001:9001"
# container_name: wireguard-albi
# =============================================================================