Stage 2 : Vikunja
DGA MI - Pôle Sup de La Salle
🌍 Introduction
Cette étape consiste à mettre en place un point d'entrée sécurisé (HTTPS) pour Vikunja. L'objectif est d'utiliser Nginx comme bouclier, gestionnaire de certificats, mais également comme serveur web statique pour héberger notre propre logo.
🔐 1. Génération des certificats SSL (OpenSSL)
En informatique réseau, le chiffrement repose sur un couple Clé Privée / Certificat Public. Pour ce projet, j'ai généré des certificats "auto-signés".
# Créer le dossier pour stocker les secrets SSL
mkdir -p /home/user/Documents/vikunja/nginx/ssl
cd /home/user/Documents/vikunja/nginx/ssl
# Génération du certificat auto-signé
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout vikunja.key \
-out vikunja.crt \
-subj "/C=FR/ST=France/L=Paris/O=Vikunja/CN=votre-domaine.local"
rsa:2048: Définit la robustesse du chiffrement.-nodes: Permet de ne pas crypter la clé par mot de passe, autorisant Nginx à redémarrer sans intervention humaine.
⚙️ 2. Configuration du Reverse Proxy & Alias Logo
Le fichier de configuration vikunja.conf définit comment Nginx doit rediriger le trafic entrant (HTTPS) vers le conteneur Vikunja, mais indique également où trouver le logo personnalisé sur le serveur.
server {
listen 80;
server_name _;
# Redirection automatique HTTP (port 80) vers HTTPS (port 443)
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name _;
# Emplacement des certificats à l'intérieur du conteneur
ssl_certificate /etc/nginx/ssl/vikunja.crt;
ssl_certificate_key /etc/nginx/ssl/vikunja.key;
# Dossier pour les assets statiques (Logo personnalisé)
location /images/mon-logo.png {
alias /usr/share/nginx/html/images/logo.png;
}
# Redirection vers l'application Vikunja
location / {
# Résolution DNS interne : 'vikunja' correspond au nom du conteneur
proxy_pass http://vikunja:3456;
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;
}
}
Concept clé (Proxy Pass) : Au lieu de pointer vers une IP, Nginx pointe vers http://vikunja:3456. Podman utilise son propre DNS interne pour traduire le nom du conteneur en IP, ce qui rend la configuration insensible aux redémarrages des services.
🐳 3. Déploiement du conteneur Nginx
L'image Nginx est déployée en lui "montant" nos fichiers de configuration locaux, nos certificats, et notre dossier contenant le logo.
# Déploiement
podman run -d \
--name nginx \
--network vikunja-net \
-p 80:80 \
-p 443:443 \
-v /home/user/Documents/vikunja/nginx/conf.d:/etc/nginx/conf.d:ro \
-v /home/user/Documents/vikunja/nginx/ssl:/etc/nginx/ssl:ro \
-v /home/user/Documents/vikunja/images:/usr/share/nginx/html/images:ro \
nginx:trixie-perl
- Sécurité
:ro: Les volumes sont montés en mode Read-Only. Même si le conteneur Nginx est compromis, l'attaquant ne peut pas modifier les fichiers sur l'hôte (utile pour sécuriser la clé privée). - Terminaison SSL : Le chiffrement s'arrête au niveau de Nginx. L'application Vikunja, située derrière dans un réseau privé, n'a pas besoin de gérer la complexité du HTTPS.
🎨 4. Intégration du Logo & Preuves de fonctionnement
Plutôt que de chercher à uploader une image dans l'application, Nginx expose le logo local (stocké en dehors du conteneur Vikunja) via une URL directe.
Il suffit ensuite de rajouter l'option suivante dans le fichier config.yml de Vikunja :
service:
customlogourl: "https://votre-ip-ou-domaine/images/mon-logo.png"
✅ Validation : Accès HTTPS sécurisé avec logo DGA personnalisé
1. Page de connexion (Logo + Cadenas HTTPS visibles)
2. Tableau de bord (Logo intégré à la barre de navigation)
Bilan de l'intégration : Ces captures démontrent le succès de la configuration globale. Le trafic réseau est bien chiffré (présence du cadenas SSL) grâce au conteneur Nginx, qui intercepte le port 443 avant de router la requête vers Vikunja. De plus, la directive alias de Nginx fonctionne parfaitement, puisque le logo de la DGA est correctement distribué à la place du logo d'origine.