secubox-openwrt/luci-app-secubox-bonus/htdocs/luci-static/secubox/blog/local-saas-vhost.html
CyberMind-FR 086e62584e feat: add luci-app-secubox-bonus package with website content
Created new independent package to integrate SecuBox marketing and
documentation website. Includes demo pages, tutorials, and multi-language
content previously deployed separately.

Package contents:
- 36 static files (HTML, JS, JSON)
- 16 module demo pages (auth, bandwidth, cdn-cache, client-guardian, etc.)
- 3 blog tutorials (setup guides)
- 13 language translations (en, fr, de, es, pt, it, nl, ru, ar, zh, ja, ko, hi)
- Campaign and landing pages

Files accessible at: /luci-static/secubox/
Main URL: http://router-ip/luci-static/secubox/index.html

Package info:
- Version: 0.1.0-1
- Size: ~500KB
- Dependencies: luci-base only
- No RPCD/backend components

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-31 12:12:55 +01:00

304 lines
14 KiB
HTML

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Héberger vos propres services SaaS | CyberMind Blog</title>
<meta name="description" content="Remplacez Google Drive, GitHub et Netflix par des alternatives auto-hébergées : Nextcloud, GitLab et Jellyfin avec VHost Manager.">
<style>
:root { --primary: #10b981; --primary-dark: #059669; --dark: #0f172a; --darker: #020617; --card: #1e293b; --text: #f1f5f9; --text-muted: #94a3b8; --border: #334155; }
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: 'Georgia', serif; background: var(--darker); color: var(--text); line-height: 1.8; }
.header { background: var(--dark); border-bottom: 1px solid var(--border); padding: 20px 0; }
.header-inner { max-width: 800px; margin: 0 auto; padding: 0 24px; display: flex; justify-content: space-between; align-items: center; }
.logo { font-family: system-ui, sans-serif; font-weight: 700; font-size: 20px; color: var(--text); text-decoration: none; display: flex; align-items: center; gap: 8px; }
.nav a { color: var(--text-muted); text-decoration: none; margin-left: 24px; font-family: system-ui, sans-serif; font-size: 14px; }
.hero { background: linear-gradient(135deg, var(--primary-dark), var(--primary)); padding: 80px 24px; text-align: center; }
.hero-inner { max-width: 800px; margin: 0 auto; }
.hero-tag { display: inline-block; background: rgba(255,255,255,0.2); padding: 6px 16px; border-radius: 50px; font-size: 14px; margin-bottom: 20px; font-family: system-ui, sans-serif; }
.hero h1 { font-size: 42px; line-height: 1.2; margin-bottom: 16px; }
.hero-meta { opacity: 0.9; font-size: 16px; font-family: system-ui, sans-serif; }
.content { max-width: 800px; margin: 0 auto; padding: 60px 24px; }
h2 { font-size: 28px; margin: 48px 0 24px; color: var(--text); font-family: system-ui, sans-serif; }
h3 { font-size: 22px; margin: 32px 0 16px; color: var(--text); font-family: system-ui, sans-serif; }
p { margin-bottom: 24px; color: var(--text-muted); }
.lead { font-size: 20px; color: var(--text); margin-bottom: 32px; }
ul, ol { margin: 0 0 24px 24px; color: var(--text-muted); }
li { margin-bottom: 12px; }
code { background: var(--card); padding: 2px 8px; border-radius: 4px; font-family: monospace; font-size: 14px; color: var(--primary); }
pre { background: var(--card); padding: 24px; border-radius: 12px; overflow-x: auto; margin: 24px 0; border: 1px solid var(--border); }
pre code { background: none; padding: 0; color: var(--text); }
.info-box { background: rgba(16, 185, 129, 0.1); border-left: 4px solid var(--primary); padding: 20px 24px; border-radius: 0 12px 12px 0; margin: 32px 0; }
.info-box p { margin: 0; color: var(--text); }
.comparison-table { width: 100%; border-collapse: collapse; margin: 32px 0; }
.comparison-table th, .comparison-table td { padding: 16px; text-align: left; border-bottom: 1px solid var(--border); }
.comparison-table th { background: var(--card); font-family: system-ui, sans-serif; }
.comparison-table td:first-child { font-weight: 600; }
.service-card { background: var(--card); padding: 24px; border-radius: 12px; margin: 24px 0; border-left: 4px solid; display: flex; gap: 20px; align-items: flex-start; }
.service-icon { font-size: 48px; }
.service-content h4 { font-family: system-ui, sans-serif; margin-bottom: 8px; }
.cta-box { background: linear-gradient(135deg, var(--primary-dark), var(--primary)); padding: 40px; border-radius: 16px; text-align: center; margin: 48px 0; }
.cta-box h3 { color: white; margin-bottom: 16px; font-family: system-ui, sans-serif; }
.cta-box p { color: rgba(255,255,255,0.9); margin-bottom: 24px; }
.cta-btn { display: inline-block; background: white; color: var(--primary-dark); padding: 14px 32px; border-radius: 10px; text-decoration: none; font-family: system-ui, sans-serif; font-weight: 600; }
.footer { background: var(--dark); border-top: 1px solid var(--border); padding: 40px 24px; text-align: center; }
.footer p { color: var(--text-muted); font-family: system-ui, sans-serif; font-size: 14px; margin: 0; }
@media (max-width: 768px) { .hero h1 { font-size: 32px; } .service-card { flex-direction: column; } }
</style>
</head>
<body>
<header class="header">
<div class="header-inner">
<a href="https://cybermind.fr" class="logo">🧠 CyberMind</a>
<nav class="nav">
<a href="https://cybermind.fr/blog">Blog</a>
<a href="../index.html" class="back-link" data-i18n="demo.backToMain">← Retour à l'accueil</a>
</nav>
</div>
</header>
<div class="hero">
<div class="hero-inner">
<span class="hero-tag">📚 Tutorial</span>
<h1>Héberger vos propres services SaaS</h1>
<p class="hero-meta">Par Gandalf • 22 décembre 2024 • 18 min de lecture</p>
</div>
</div>
<article class="content">
<p class="lead">
Fatigué de dépendre de Google, Microsoft et autres géants du cloud ? Avec <strong>VHost Manager</strong>,
transformez votre réseau local en plateforme SaaS privée : Nextcloud remplace Google Drive,
GitLab remplace GitHub, et Jellyfin remplace Netflix.
</p>
<h2>Pourquoi auto-héberger ?</h2>
<table class="comparison-table">
<tr>
<th>Aspect</th>
<th>Services Cloud</th>
<th>Auto-hébergé</th>
</tr>
<tr>
<td>🔒 Vie privée</td>
<td>Vos données chez eux</td>
<td>Vos données chez vous</td>
</tr>
<tr>
<td>💰 Coût</td>
<td>Abonnements mensuels</td>
<td>Coût initial puis gratuit</td>
</tr>
<tr>
<td>🌐 Dépendance Internet</td>
<td>Requise en permanence</td>
<td>Fonctionne hors ligne</td>
</tr>
<tr>
<td>⚡ Performance locale</td>
<td>Limitée par la connexion</td>
<td>Vitesse du réseau local</td>
</tr>
<tr>
<td>🎛️ Contrôle</td>
<td>Limité aux options proposées</td>
<td>Total</td>
</tr>
</table>
<h2>Services recommandés</h2>
<div class="service-card" style="border-color: #0082c9;">
<div class="service-icon">☁️</div>
<div class="service-content">
<h4>Nextcloud → Remplace Google Drive/Dropbox</h4>
<p>Synchronisation de fichiers, calendrier, contacts, notes, visioconférence.
Applications mobiles et desktop. Collaboration en temps réel sur documents.</p>
</div>
</div>
<div class="service-card" style="border-color: #fc6d26;">
<div class="service-icon">💻</div>
<div class="service-content">
<h4>GitLab → Remplace GitHub</h4>
<p>Hébergement Git avec CI/CD intégré, wiki, issues, merge requests.
Parfait pour vos projets personnels ou d'équipe.</p>
</div>
</div>
<div class="service-card" style="border-color: #00a4dc;">
<div class="service-icon">🎬</div>
<div class="service-content">
<h4>Jellyfin → Remplace Netflix/Plex</h4>
<p>Streaming de votre bibliothèque multimédia. Films, séries, musique.
Applications sur tous les appareils. 100% gratuit et open source.</p>
</div>
</div>
<div class="service-card" style="border-color: #41bdf5;">
<div class="service-icon">🏠</div>
<div class="service-content">
<h4>Home Assistant → Domotique centralisée</h4>
<p>Contrôlez tous vos appareils connectés depuis une interface unique.
Automatisations puissantes, intégrations illimitées.</p>
</div>
</div>
<h2>Configuration VHost Manager</h2>
<h3>1. Installation</h3>
<pre><code>opkg update
opkg install luci-app-vhost-manager nginx
/etc/init.d/rpcd reload</code></pre>
<h3>2. Définir les services internes</h3>
<pre><code># /etc/config/vhost
config vhost 'global'
option enabled '1'
option default_ssl '1'
option acme_email '<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e687828b8f88a68a8985878ac88a8788">[email&#160;protected]</a>'
config internal 'nextcloud'
option enabled '1'
option name 'Nextcloud'
option domain 'cloud.local.lan'
option backend '192.168.1.10:80'
option ssl '1'
config internal 'gitlab'
option enabled '1'
option name 'GitLab'
option domain 'git.local.lan'
option backend '192.168.1.11:80'
option ssl '1'
config internal 'jellyfin'
option enabled '1'
option name 'Jellyfin'
option domain 'media.local.lan'
option backend '192.168.1.12:8096'
option ssl '1'</code></pre>
<h3>3. Configuration DNS locale</h3>
<p>Ajoutez les domaines à dnsmasq pour qu'ils pointent vers le routeur :</p>
<pre><code># /etc/dnsmasq.conf ou via LuCI
address=/cloud.local.lan/192.168.1.1
address=/git.local.lan/192.168.1.1
address=/media.local.lan/192.168.1.1
address=/home.local.lan/192.168.1.1</code></pre>
<h3>4. Configuration nginx (générée automatiquement)</h3>
<pre><code># /etc/nginx/conf.d/vhost-cloud.conf
server {
listen 443 ssl http2;
server_name cloud.local.lan;
ssl_certificate /etc/ssl/acme/cloud.local.lan.crt;
ssl_certificate_key /etc/ssl/acme/cloud.local.lan.key;
location / {
proxy_pass http://192.168.1.10:80;
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;
}
}</code></pre>
<h2>Redirection de services externes (avancé)</h2>
<p>
Fonctionnalité expérimentale : redirigez les requêtes vers des services externes
(Google Drive, GitHub) vers vos alternatives locales. Nécessite l'interception DNS.
</p>
<div class="info-box">
<p>⚠️ <strong>Attention :</strong> Cette fonctionnalité peut casser certaines applications
qui dépendent des services originaux. À utiliser avec précaution.</p>
</div>
<pre><code>config redirect 'google_drive'
option enabled '0' # Désactivé par défaut
option name 'Google Drive → Nextcloud'
option external_domain 'drive.google.com'
option local_domain 'cloud.local.lan'</code></pre>
<h2>Gestion des certificats SSL</h2>
<h3>Certificats auto-signés (réseau local)</h3>
<pre><code># Générer un certificat auto-signé
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/cloud.local.lan.key \
-out /etc/ssl/certs/cloud.local.lan.crt \
-subj "/CN=cloud.local.lan"</code></pre>
<h3>Let's Encrypt (avec accès externe)</h3>
<pre><code>config ssl 'settings'
option provider 'acme'
option challenge 'dns' # ou 'http'
option auto_renew '1'
option renew_days '30'</code></pre>
<h2>Déployer vos services</h2>
<h3>Nextcloud avec Docker</h3>
<pre><code>docker run -d \
--name nextcloud \
-p 8080:80 \
-v nextcloud:/var/www/html \
-v nextcloud-data:/var/www/html/data \
nextcloud:latest</code></pre>
<h3>Jellyfin avec Docker</h3>
<pre><code>docker run -d \
--name jellyfin \
-p 8096:8096 \
-v jellyfin-config:/config \
-v /media:/media \
jellyfin/jellyfin:latest</code></pre>
<div class="cta-box">
<h3>🌐 Créez votre cloud privé</h3>
<p>Installez VHost Manager et prenez le contrôle de vos services.</p>
<a href="../demo-vhost.html" class="cta-btn">Voir la démo</a>
</div>
<h2>Conclusion</h2>
<p>
L'auto-hébergement n'a jamais été aussi accessible. Avec VHost Manager, vous configurez
facilement un reverse proxy nginx, gérez vos certificats SSL et organisez tous vos services
depuis une interface unifiée dans LuCI.
</p>
<p>
Vos données restent chez vous, vos services fonctionnent même sans Internet, et vous
bénéficiez de performances réseau local optimales. C'est le meilleur des deux mondes !
</p>
</article>
<footer class="footer">
<p>
<a href="https://cybermood.eu" style="color: var(--primary); text-decoration: none;">CyberMood.eu</a>
© 2025 <a href="https://cybermind.fr" style="color: var(--text-muted); text-decoration: none;">CyberMind.fr</a>
— Open Source Apache-2.0 — 🇫🇷 Made in France with ❤️
</p>
</footer>
<!-- Multi-language System -->
<script src="/i18n.js"></script>
</body>
</html>