Date : 2026-03-21
Auteur : Daniel Caron
Version OS : Debian 12 (Bookworm)
Rôle : Serveur Wiki interne/externe — Wiki.JS + PostgreSQL (Docker)
VLAN : 60 (Serveurs)
IP : 10.21.60.16
FQDN : whvd2001.home.carontech.net
URL Wiki : https://wiki.carontech.net
whvd2001Note : Le template Debian 12 utilise la clé SSH de Proxmox (pas la clé vmadmin).
Lors du premier accès, se connecter depuis le shell Proxmox :
ssh debianadmin@<IP>— la clé Proxmox est utilisée automatiquement.
Ensuite ajouter la clé vmadmin dans~/.ssh/authorized_keys.
Au premier démarrage, cloud-init effectue automatiquement :
Le boot est plus long qu'habituellement (~2-3 minutes). Appuyer sur Entrée dans la console Proxmox pour afficher le prompt de login.
10.21.60.16| Type | Nom | Valeur |
|---|---|---|
| A | whvd2001.home.carontech.net |
10.21.60.16 |
| CNAME | wiki.carontech.net |
whvd2001.home.carontech.net |
Depuis le shell Proxmox, se connecter à la VM :
ssh [email protected]
Sur le poste admin Windows, récupérer la clé publique :
Get-Content C:\Users\vmadmin\.ssh\id_ed25519.pub
Sur la VM, ajouter la clé :
echo "ssh-ed25519 AAAA.... vmadmin@hostname" >> ~/.ssh/authorized_keys
Tester depuis le poste admin :
ssh [email protected]
sudo hostnamectl set-hostname whvd2001
sudo nano /etc/hosts
Contenu de /etc/hosts :
127.0.0.1 localhost
127.0.1.1 whvd2001.home.carontech.net whvd2001
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
docker --version
sudo docker run hello-world
Version installée : Docker 29.3.0
sudo usermod -aG docker debianadmin
Se déconnecter et reconnecter, puis vérifier :
docker ps
mkdir -p ~/wikijs && cd ~/wikijs
nano docker-compose.yml
services:
db:
image: postgres:15
environment:
POSTGRES_DB: wiki
POSTGRES_USER: wiki
POSTGRES_PASSWORD: <mot-de-passe-robuste>
volumes:
- postgres_data:/var/lib/postgresql/data
restart: unless-stopped
wiki:
image: requarks/wiki:2
depends_on:
- db
environment:
DB_TYPE: postgres
DB_HOST: db
DB_PORT: 5432
DB_USER: wiki
DB_PASS: <mot-de-passe-robuste>
DB_NAME: wiki
ports:
- "3000:3000"
restart: unless-stopped
volumes:
postgres_data:
Note : Utiliser le même mot de passe pour
POSTGRES_PASSWORDetDB_PASS.
docker compose up -d
docker ps
Les deux conteneurs doivent apparaître avec le statut Up :
wikijs-wiki-1wikijs-db-1Accéder à http://10.21.60.16:3000 depuis un navigateur (accès temporaire direct).
Remplir le formulaire de setup :
https://wiki.carontech.netCliquer Install.
Le certificat de whvu1515 couvre plusieurs services via SAN (Subject Alternative Names).
La génération est effectuée depuis la station admin Windows via le script sign-cert.ps1.
| # | SAN |
|---|---|
| 1 | whvu1515.home.carontech.net |
| 2 | wiki.carontech.net |
| 3 | photos.carontech.net |
Depuis la station admin Windows :
.\sign-cert.ps1 -server whvu1515 -verbose
Le script effectue automatiquement :
whvu1515 (/etc/pki/private/ et /etc/pki/csr/)whvd9999whvu1515 → /etc/pki/certs/whvu1515-fullchain.crtNote : Le script peut sembler bloqué à l'étape "Vérification index.txt" — c'est normal, attendre 30-60 secondes. Il peut aussi attendre un Enter lors de la signature openssl ca.
| Fichier | Chemin |
|---|---|
| Fullchain | /etc/pki/certs/whvu1515-fullchain.crt |
| Clé privée | /etc/pki/private/whvu1515.key |
#---------------------------
# Wiki.JS - proxy depuis whvu1010 et acces admin direct
#---------------------------
server {
listen 443 ssl;
server_name wiki.carontech.net;
ssl_certificate /etc/pki/certs/whvu1515-fullchain.crt;
ssl_certificate_key /etc/pki/private/whvu1515.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://10.21.60.16:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Activation du site :
sudo ln -s /etc/nginx/sites-available/wiki.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Migration de HTTP:8080 vers HTTPS:443 avec le certificat whvu1515 :
#---------------------------
# Immich - proxy depuis whvu1010 et acces admin direct
#---------------------------
server {
listen 443 ssl;
server_name photos.carontech.net;
ssl_certificate /etc/pki/certs/whvu1515-fullchain.crt;
ssl_certificate_key /etc/pki/private/whvu1515.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://10.21.60.12:2283;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Utilisation du plugin DNS-01 Cloudflare (pas HTTP-01) car Cloudflare Tunnel intercepte le port 80.
sudo certbot certonly --dns-cloudflare \
--dns-cloudflare-credentials /home/ubuntuadmin/.secrets/cloudflare.ini \
-d wiki.carontech.net \
--agree-tos --no-eff-email --email [email protected]
Fichiers générés :
/etc/letsencrypt/live/wiki.carontech.net/fullchain.pem/etc/letsencrypt/live/wiki.carontech.net/privkey.pem# Force HTTP → HTTPS
server {
listen 80;
server_name wiki.carontech.net;
location /.well-known/acme-challenge/ {
root /var/www/html;
}
location / {
return 301 https://$host$request_uri;
}
}
# Serve Wiki.JS via HTTPS
server {
listen 443 ssl;
server_name wiki.carontech.net;
client_max_body_size 100M;
ssl_certificate /etc/letsencrypt/live/wiki.carontech.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/wiki.carontech.net/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass https://whvu1515.home.carontech.net:443;
proxy_set_header Host wiki.carontech.net;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Activation :
sudo ln -s /etc/nginx/sites-available/wiki.carontech.net /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Pour que whvu1010 fasse confiance au certificat PKI interne de whvu1515 :
# Depuis station admin Windows
scp -i C:\Users\danie\.ssh\id_ed25519_vmadmin [email protected]:/opt/pki/intermediate-ca/certs/intermediate-ca.crt C:\pki-temp\
scp -i C:\Users\danie\.ssh\id_ed25519_vmadmin C:\pki-temp\intermediate-ca.crt [email protected]:/tmp/
# Sur whvu1010
sudo cp /tmp/intermediate-ca.crt /usr/local/share/ca-certificates/carontech-intermediate-ca.crt
sudo update-ca-certificates
Le tunnel b710043f-c5c9-48ad-8678-a99197c1f6e2 sur whvu1010 gère les deux services publics.
| Service | Public Hostname | Type | URL |
|---|---|---|---|
| Immich | photos.carontech.net |
HTTPS | https://photos.carontech.net |
| Wiki.JS | wiki.carontech.net |
HTTPS | https://wiki.carontech.net |
| Type | Nom | Valeur |
|---|---|---|
| A | whvd2001.home.carontech.net |
10.21.60.16 |
| CNAME | wiki.carontech.net |
whvu1010.home.carontech.net |
Important : Le CNAME
wiki.carontech.netdoit pointer verswhvu1010(pas verswhvd2001directement) pour que le trafic passe par le proxy Nginx et le certificat Let's Encrypt.
| Source | Destination | Port | Action |
|---|---|---|---|
VLAN 70 (whvu1010 |
VLAN 60 (whvu1515) |
443 | Allow |
VLAN 60 (whvu1515) |
VLAN 60 (whvd2001) |
3000 | Allow |
Note : Retirer la règle temporaire port 3000 ouverte depuis VLAN résidentiel lors des tests initiaux.
Accès externe :
Cloudflare Tunnel → whvu1010:443 (Let's Encrypt) → whvu1515:443 (PKI interne) → whvd2001:3000 (HTTP)
Accès interne :
Station → whvu1010:443 (Let's Encrypt) → whvu1515:443 (PKI interne) → whvd2001:3000 (HTTP)
Internet
|
Cloudflare (wiki.carontech.net)
|
whvu1010 — VLAN Public (DMZ) — Nginx + Certbot (Let's Encrypt) — HTTPS:443
|
whvu1515 — VLAN Serveurs — Nginx proxy interne — HTTPS:443 (cert PKI interne)
|
whvd2001 — VLAN 60 — Wiki.JS Docker — HTTP:3000