{"id":2919,"date":"2026-10-21T13:20:56","date_gmt":"2026-10-21T11:20:56","guid":{"rendered":"https:\/\/procyb.fr\/?p=2919"},"modified":"2026-10-21T13:20:56","modified_gmt":"2026-10-21T11:20:56","slug":"installer-wikijs-docker-compose-debian-13","status":"publish","type":"post","link":"https:\/\/procyb.fr\/index.php\/2026\/10\/21\/installer-wikijs-docker-compose-debian-13\/","title":{"rendered":"Installer, s\u00e9curiser et sauvegarder Wiki.js avec Docker Compose sur Debian 13"},"content":{"rendered":"\n<style>\n\/* PROCYB \u2014 Wiki.js : styles locaux. Copier dans CSS additionnel WordPress si <style> est filtr\u00e9 *\/\n.procyb-wikijs{--w-ink:#172b4d;--w-blue:#0369a1;--w-cyan:#0ea5e9;color:inherit;line-height:1.75}\n.procyb-wikijs *{box-sizing:border-box}\n.procyb-wikijs .w-hero{background:linear-gradient(120deg,#0f172a,#103b67 65%,#0e7490);color:#fff!important;padding:28px;border-radius:18px;margin:0 0 28px}\n.procyb-wikijs .w-hero *, .procyb-wikijs .w-note-dark *{color:#fff!important}\n.procyb-wikijs .w-kicker{letter-spacing:.09em;text-transform:uppercase;font-size:.8em;color:#a5f3fc!important}\n.procyb-wikijs .w-card{background:#f8fafc!important;color:#172b4d!important;padding:20px 22px;border-radius:14px;border:1px solid #dae3ef;border-left:6px solid #0284c7;margin:20px 0}\n.procyb-wikijs .w-card *, .procyb-wikijs .w-card p,.procyb-wikijs .w-card li,.procyb-wikijs .w-card strong{color:#172b4d!important}\n.procyb-wikijs .w-card a,.procyb-wikijs .w-card a:visited{color:#075985!important;text-decoration:underline}\n.procyb-wikijs .w-card a:hover{color:#0c4a6e!important}\n.procyb-wikijs .w-card.w-green{border-left-color:#22c55e}\n.procyb-wikijs .w-card.w-warn{border-left-color:#eab308;background:#fffbea!important}\n.procyb-wikijs .w-note-dark{background:#1e293b!important;color:#fff!important;padding:20px;border:2px solid #eab308;border-radius:14px;margin:22px 0}\n.procyb-wikijs .w-figure{background:#fff;color:#172b4d;border:1px solid #cbd5e1;padding:12px;border-radius:14px;margin:22px 0}\n.procyb-wikijs .w-figure img{width:100%;height:auto;display:block;border-radius:7px}\n.procyb-wikijs .w-figure figcaption{color:#334155!important;font-size:.88em;text-align:center;margin-top:10px}\n.procyb-wikijs .w-figure svg{display:block;max-width:100%;height:auto}\n.procyb-wikijs pre{overflow:auto;padding:16px;border-radius:12px;background:#0b1220!important;color:#e2e8f0!important;white-space:pre;font-size:.86em}\n.procyb-wikijs pre code{color:#e2e8f0!important;background:transparent!important}\n.procyb-wikijs code:not(pre code){font-size:.93em;overflow-wrap:anywhere}\n.procyb-wikijs .w-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;margin:20px 0}\n.procyb-wikijs .w-grid .w-card{margin:0}\n.procyb-wikijs .w-table{width:100%;border-collapse:collapse;margin:16px 0}\n.procyb-wikijs .w-table th,.procyb-wikijs .w-table td{border:1px solid #94a3b8;padding:9px;vertical-align:top}\n.procyb-wikijs .w-table th{background:#0f3e5c!important;color:#fff!important}\n.procyb-wikijs .w-table td{background:#f8fafc!important;color:#172b4d!important}\n.procyb-wikijs h2{scroll-margin-top:100px;border-bottom:2px solid #0ea5e9;padding-bottom:7px;margin-top:40px}\n.procyb-wikijs h3{margin-top:27px}\n.procyb-wikijs .w-small{font-size:.9em}\n@media(max-width:650px){.procyb-wikijs .w-hero{padding:18px}.procyb-wikijs .w-card{padding:16px}}\n\n\/* PROCYB \u2014 accessibilit\u00e9 : encarts clairs \/ code inline \/ liens *\/\n.procyb-wikijs :is(.w-card,.procyb-box-light,.procyb-box-warning,.procyb-box-info){\n  color:#172b4d!important;\n}\n.procyb-wikijs :is(.w-card,.procyb-box-light,.procyb-box-warning,.procyb-box-info) :is(p,li,span,strong,b,em,small,h3,h4){\n  color:#172b4d!important;\n}\n.procyb-wikijs :is(.w-card,.procyb-box-light,.procyb-box-warning,.procyb-box-info) :is(a,a:visited){\n  color:#075985!important;text-decoration:underline!important;text-underline-offset:2px;\n}\n.procyb-wikijs :is(.w-card,.procyb-box-light,.procyb-box-warning,.procyb-box-info) a:hover{color:#0c4a6e!important}\n.procyb-wikijs :is(.w-card,.procyb-box-light,.procyb-box-warning,.procyb-box-info) code:not(pre code),\n.procyb-wikijs :is(.w-card,.procyb-box-light,.procyb-box-warning,.procyb-box-info) :is(kbd,samp){\n  color:#0f172a!important;background:#dbeafe!important;border:1px solid #93c5fd!important;\n  border-radius:5px;padding:1px 5px;box-shadow:none!important;font-weight:500;\n}\n.procyb-wikijs :is(.w-card,.procyb-box-light,.procyb-box-warning,.procyb-box-info) mark{\n  color:#172b4d!important;background:#fde68a!important;padding:1px 4px;\n}\n\/* Ne pas d\u00e9grader les blocs de commandes sombres ni les encarts sombres. *\/\n.procyb-wikijs pre,.procyb-wikijs pre code{color:#e2e8f0!important;background:#0b1220!important}\n.procyb-wikijs .w-note-dark,.procyb-wikijs .w-note-dark :is(p,li,strong,code){color:#fff!important}\n<\/style>\n<div class=\"procyb-wikijs\"><div class=\"w-hero\"><p class=\"w-kicker\">HOMELAB \u2022 DOCKER \u2022 WIKI.JS \u2022 POSTGRESQL<\/p><p style=\"font-size:1.15em\">D\u00e9ployons un wiki priv\u00e9 sur une VM Debian 13, puis s\u00e9curisons son acc\u00e8s et construisons une vraie cha\u00eene de sauvegarde : PostgreSQL, contr\u00f4le de restauration, copie SFTP et r\u00e9tention sur NAS Synology.<\/p><p class=\"w-small\">Tutoriel bas\u00e9 sur des manipulations r\u00e9alis\u00e9es et test\u00e9es en laboratoire \u2014 adapter les adresses IP, comptes et chemins \u00e0 son environnement.<\/p><\/div>\n\n<nav class=\"w-card procyb-box-light\" aria-label=\"Sommaire\"><strong>Sommaire<\/strong><ol><li><a href=\"#objectifs\">Objectifs et pr\u00e9requis<\/a><\/li><li><a href=\"#architecture\">Architecture et sch\u00e9ma<\/a><\/li><li><a href=\"#nettoyage\">Nettoyage facultatif<\/a><\/li><li><a href=\"#fichiers\">R\u00e9pertoires, secrets et Compose<\/a><\/li><li><a href=\"#installation\">Premier d\u00e9marrage et configuration<\/a><\/li><li><a href=\"#permissions\">Contr\u00f4le d\u2019acc\u00e8s<\/a><\/li><li><a href=\"#backup\">Sauvegarde PostgreSQL<\/a><\/li><li><a href=\"#restore\">Test de restauration<\/a><\/li><li><a href=\"#nas\">SFTP vers NAS Synology<\/a><\/li><li><a href=\"#planning\">Planification, r\u00e9tention et logs<\/a><\/li><li><a href=\"#limites\">Limites et am\u00e9liorations<\/a><\/li><li><a href=\"#conclusion\">Bilan<\/a><\/li><\/ol><\/nav>\n\n<h2 id=\"objectifs\">1. Objectifs et pr\u00e9requis<\/h2><p>Wiki.js est un outil de documentation collaborative, adapt\u00e9 aux proc\u00e9dures techniques, inventaires et bases de connaissances. Dans ce laboratoire, l\u2019objectif est une installation <strong>priv\u00e9e<\/strong>, reproductible et maintenable, sur une VM Debian disposant d\u00e9j\u00e0 de Docker.<\/p><div class=\"w-grid\"><div class=\"w-card procyb-box-light\"><strong>Machine h\u00f4te<\/strong><p>Debian 13, Docker Engine et Docker Compose, acc\u00e8s SSH, espace disque suffisant.<\/p><\/div><div class=\"w-card procyb-box-light\"><strong>Application<\/strong><p>Wiki.js 2 et PostgreSQL 17, conteneurs s\u00e9par\u00e9s et r\u00e9seau Docker d\u00e9di\u00e9.<\/p><\/div><div class=\"w-card procyb-box-light\"><strong>Sauvegardes<\/strong><p>Export PostgreSQL quotidien, copies locales et NAS Synology via SFTP.<\/p><\/div><\/div><p>Exemples d\u2019adresses du laboratoire : <code>192.168.1.239<\/code> pour Debian et <code>192.168.1.241<\/code> pour Synology. Sur un autre r\u00e9seau, remplacez-les par vos propres adresses.<\/p>\n\n<h2 id=\"architecture\">2. Architecture retenue<\/h2><p>L\u2019application expose seulement son port web. PostgreSQL reste accessible via le r\u00e9seau Docker interne ; un volume nomm\u00e9 assure sa persistance. La sauvegarde utilise <code>pg_dump<\/code>, puis une seconde copie est transf\u00e9r\u00e9e par SFTP.<\/p>\n\n<figure class=\"w-figure\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 960 365\" role=\"img\" aria-label=\"Sch\u00e9ma architecture Wiki.js Docker PostgreSQL sauvegarde SFTP Synology\"><rect x=\"16\" y=\"16\" width=\"520\" height=\"330\" rx=\"18\" fill=\"#0f172a\"\/><text x=\"36\" y=\"43\" fill=\"#fff\" font-size=\"19\" font-weight=\"700\">VM Debian 13 \u2022 Docker Compose<\/text><rect x=\"50\" y=\"72\" width=\"210\" height=\"74\" rx=\"12\" fill=\"#0369a1\"\/><text x=\"155\" y=\"100\" text-anchor=\"middle\" fill=\"white\" font-size=\"19\" font-weight=\"700\">Wiki.js<\/text><text x=\"155\" y=\"123\" text-anchor=\"middle\" fill=\"white\" font-size=\"14\">Port 3015 \u2192 3000<\/text><rect x=\"295\" y=\"72\" width=\"205\" height=\"74\" rx=\"12\" fill=\"#0f766e\"\/><text x=\"398\" y=\"100\" text-anchor=\"middle\" fill=\"white\" font-size=\"19\" font-weight=\"700\">PostgreSQL<\/text><text x=\"398\" y=\"122\" text-anchor=\"middle\" fill=\"white\" font-size=\"13\">Port 5432 interne<\/text><path d=\"M260 109 H295\" stroke=\"#67e8f9\" stroke-width=\"4\"\/><rect x=\"295\" y=\"170\" width=\"205\" height=\"53\" rx=\"10\" fill=\"#1e3a8a\"\/><text x=\"398\" y=\"192\" text-anchor=\"middle\" fill=\"white\" font-size=\"15\">Volume nomm\u00e9<\/text><text x=\"398\" y=\"211\" text-anchor=\"middle\" fill=\"white\" font-size=\"13\">postgres_data<\/text><path d=\"M398 146 V170\" stroke=\"#94a3b8\" stroke-width=\"3\"\/><rect x=\"62\" y=\"258\" width=\"433\" height=\"57\" rx=\"10\" fill=\"#334155\"\/><text x=\"278\" y=\"281\" text-anchor=\"middle\" fill=\"white\" font-size=\"16\">pg_dump \u2192 backups\/*.dump<\/text><text x=\"278\" y=\"302\" text-anchor=\"middle\" fill=\"#bae6fd\" font-size=\"13\">7 jours locaux \u2022 cron 02:00<\/text><path d=\"M398 223 V258\" stroke=\"#67e8f9\" stroke-width=\"3\" stroke-dasharray=\"5 4\"\/><rect x=\"594\" y=\"73\" width=\"345\" height=\"244\" rx=\"18\" fill=\"#123b59\"\/><text x=\"767\" y=\"103\" text-anchor=\"middle\" font-size=\"20\" fill=\"white\" font-weight=\"700\">NAS Synology<\/text><text x=\"767\" y=\"127\" text-anchor=\"middle\" font-size=\"14\" fill=\"#bae6fd\">SFTP + cl\u00e9 Ed25519<\/text><rect x=\"625\" y=\"166\" width=\"284\" height=\"74\" rx=\"12\" fill=\"#6366f1\"\/><text x=\"767\" y=\"194\" text-anchor=\"middle\" font-size=\"16\" fill=\"white\" font-weight=\"700\">docker-backups<\/text><text x=\"767\" y=\"216\" text-anchor=\"middle\" font-size=\"13\" fill=\"white\">R\u00e9tention 30 jours \u2022 DSM 04:00<\/text><path d=\"M495 282 H572 V203 H625\" stroke=\"#0ea5e9\" fill=\"none\" stroke-width=\"4\"\/><path d=\"M615 195 L626 203 L615 211\" fill=\"none\" stroke=\"#0ea5e9\" stroke-width=\"3\"\/><text x=\"555\" y=\"266\" fill=\"#0369a1\" font-size=\"13\" text-anchor=\"middle\">SFTP<\/text><\/svg><figcaption>Sch\u00e9ma d\u2019architecture \u2014 application, base, stockage persistant et copie distante (illustration p\u00e9dagogique).<\/figcaption><\/figure>\n\n<div class=\"w-note-dark\"><strong>\u2705 \u00c0 retenir<\/strong><p>Un volume Docker prot\u00e8ge les donn\u00e9es lors du remplacement d\u2019un conteneur, mais ne remplace pas une sauvegarde. La base est export\u00e9e s\u00e9par\u00e9ment et sa restauration doit \u00eatre v\u00e9rifi\u00e9e.<\/p><\/div>\n\n<h2 id=\"nettoyage\">3. Nettoyer une ancienne installation (facultatif)<\/h2><p><strong>Cette \u00e9tape est destructrice et ne concerne que les environnements poss\u00e9dant une ancienne installation Wiki.js \u00e0 abandonner.<\/strong> Sauvegardez les donn\u00e9es avant toute suppression et contr\u00f4lez les montages utilis\u00e9s par les autres conteneurs.<\/p>\n\n<pre><code>docker ps -a --filter &quot;name=^\/wikijs$&quot;\ndocker inspect wikijs --format &#x27;{{json .Mounts}}&#x27;\ndocker ps -aq | xargs -r docker inspect --format &#x27;{{.Name}} {{range .Mounts}}{{.Source}} {{end}}&#x27;<\/code><\/pre>\n\n<p>Apr\u00e8s v\u00e9rification qu\u2019aucune autre application n\u2019utilise le dossier, l\u2019ancienne installation du laboratoire a \u00e9t\u00e9 supprim\u00e9e :<\/p>\n\n<pre><code>docker stop wikijs\ndocker rm wikijs\nsudo rm -rf -- \/srv\/appdata\/wiki<\/code><\/pre>\n\n<figure class=\"w-figure\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/i0.wp.com\/procyb.fr\/wp-content\/uploads\/2026\/10\/01-nettoyage.png?ssl=1\" alt=\"V\u00e9rification que l\u2019ancien conteneur et son dossier ont disparu\"><figcaption>V\u00e9rification que l\u2019ancien conteneur et son dossier ont disparu \u2014 capture r\u00e9elle du homelab PROCYB.<\/figcaption><\/figure>\n\n<h2 id=\"fichiers\">4. Pr\u00e9parer le projet et le fichier Compose<\/h2><h3>Cr\u00e9er les dossiers<\/h3>\n\n<pre><code>sudo mkdir -p \/opt\/stacks\/wikijs\/backups\nsudo chown -R &quot;$USER:$(id -gn)&quot; \/opt\/stacks\/wikijs\nchmod 750 \/opt\/stacks\/wikijs\ncd \/opt\/stacks\/wikijs<\/code><\/pre>\n\n<h3>Isoler les param\u00e8tres sensibles<\/h3><p>Le fichier <code>.env<\/code> conserve les param\u00e8tres de connexion. Son contenu <strong>ne doit pas \u00eatre publi\u00e9<\/strong> avec le tutoriel ni versionn\u00e9 dans Git.<\/p>\n\n<pre><code>umask 077\nprintf &#x27;POSTGRES_DB=wiki\\nPOSTGRES_USER=wikijs\\nPOSTGRES_PASSWORD=%s\\nWIKI_PORT=3015\\n&#x27; &quot;$(openssl rand -hex 32)&quot; &gt; .env\nchmod 600 .env\nprintf &#x27;.env\\nbackups\/\\n&#x27; &gt; .gitignore<\/code><\/pre>\n\n<figure class=\"w-figure\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/i0.wp.com\/procyb.fr\/wp-content\/uploads\/2026\/10\/02-environnement.png?ssl=1\" alt=\"V\u00e9rification des variables non sensibles et du fichier .env prot\u00e9g\u00e9\"><figcaption>V\u00e9rification des variables non sensibles et du fichier .env prot\u00e9g\u00e9 \u2014 capture r\u00e9elle du homelab PROCYB.<\/figcaption><\/figure>\n\n<h3>Le fichier <code>compose.yaml<\/code><\/h3><p>Les param\u00e8tres suivants correspondent \u00e0 l\u2019architecture valid\u00e9e dans le laboratoire : d\u00e9marrage de Wiki.js seulement lorsque PostgreSQL est sain, volume nomm\u00e9 et base non publi\u00e9e sur le LAN.<\/p>\n\n<pre><code>services:\n  db:\n    image: postgres:17-alpine\n    restart: unless-stopped\n    environment:\n      POSTGRES_DB: ${POSTGRES_DB}\n      POSTGRES_USER: ${POSTGRES_USER}\n      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}\n    volumes:\n      - postgres_data:\/var\/lib\/postgresql\/data\n    networks:\n      - wiki_backend\n    healthcheck:\n      test:\n        - CMD-SHELL\n        - pg_isready -U &quot;$$POSTGRES_USER&quot; -d &quot;$$POSTGRES_DB&quot;\n      interval: 10s\n      timeout: 5s\n      retries: 5\n      start_period: 20s\n  wiki:\n    image: ghcr.io\/requarks\/wiki:2\n    restart: unless-stopped\n    init: true\n    depends_on:\n      db:\n        condition: service_healthy\n    environment:\n      DB_TYPE: postgres\n      DB_HOST: db\n      DB_PORT: 5432\n      DB_USER: ${POSTGRES_USER}\n      DB_PASS: ${POSTGRES_PASSWORD}\n      DB_NAME: ${POSTGRES_DB}\n    ports:\n      - &quot;${WIKI_PORT}:3000&quot;\n    networks:\n      - wiki_backend\nvolumes:\n  postgres_data:\nnetworks:\n  wiki_backend:\n    driver: bridge<\/code><\/pre>\n\n<div class=\"w-card w-warn procyb-box-warning\"><strong>\u26a0\ufe0f S\u00e9curit\u00e9 et reproductibilit\u00e9<\/strong><p>Le port <code>3015<\/code> est publi\u00e9 sur toutes les interfaces de l\u2019h\u00f4te ; prot\u00e9gez l\u2019acc\u00e8s au moyen du pare-feu et ne cr\u00e9ez aucune redirection publique depuis votre routeur. Pour limiter l\u2019\u00e9coute \u00e0 une IP donn\u00e9e, vous pouvez utiliser <code>192.168.1.239:3015:3000<\/code> dans <code>ports<\/code>. Les tags d\u2019images sont fix\u00e9s sur une version majeure, mais il faut aussi piloter les mises \u00e0 jour des correctifs.<\/p><\/div>\n\n<pre><code>docker compose config --quiet\ndocker compose pull\ndocker compose up -d\ndocker compose ps\ndocker compose logs --tail=30 wiki<\/code><\/pre>\n\n<figure class=\"w-figure\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/i0.wp.com\/procyb.fr\/wp-content\/uploads\/2026\/10\/03-compose-validation.png?ssl=1\" alt=\"Validation syntaxique de la configuration Compose\"><figcaption>Validation syntaxique de la configuration Compose \u2014 capture r\u00e9elle du homelab PROCYB.<\/figcaption><\/figure>\n\n<figure class=\"w-figure\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/i0.wp.com\/procyb.fr\/wp-content\/uploads\/2026\/10\/04-demarrage-conteneurs.png?ssl=1\" alt=\"PostgreSQL healthy et d\u00e9marrage du serveur Wiki.js\"><figcaption>PostgreSQL healthy et d\u00e9marrage du serveur Wiki.js \u2014 capture r\u00e9elle du homelab PROCYB.<\/figcaption><\/figure>\n\n<h2 id=\"installation\">5. Initialiser et franciser Wiki.js<\/h2><p>Dans le navigateur, ouvrir <code>http:\/\/192.168.1.239:3015<\/code>, puis d\u00e9finir l\u2019adresse du site, cr\u00e9er un compte administrateur avec un mot de passe robuste et terminer l\u2019assistant initial. Dans <strong>Administration \u2192 Locale<\/strong>, installer\/activer le fran\u00e7ais selon les options propos\u00e9es. Le Wiki.js du laboratoire \u00e9tait ensuite disponible en fran\u00e7ais.<\/p><div class=\"w-card procyb-box-light\"><strong>Capture de l\u2019assistant initial<\/strong><p>La cr\u00e9ation du compte administrateur n\u2019a pas \u00e9t\u00e9 captur\u00e9e. Pour \u00e9viter une fausse illustration pr\u00e9sent\u00e9e comme authentique, ce tutoriel s\u2019appuie sur les captures r\u00e9ellement effectu\u00e9es \u00e0 partir des \u00e9tapes suivantes.<\/p><\/div>\n\n<h2 id=\"permissions\">6. Bloquer la lecture anonyme<\/h2><p>Dans <strong>Administration \u2192 Groupes \u2192 Guests<\/strong>, examiner \u00e0 la fois les permissions globales et les <strong>Page Rules<\/strong>. Une autorisation <code>Path Starts With \/<\/code> peut exposer toutes les pages. Supprimer la r\u00e8gle g\u00e9n\u00e9rale non souhait\u00e9e et enregistrer les changements.<\/p>\n\n<figure class=\"w-figure\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/i0.wp.com\/procyb.fr\/wp-content\/uploads\/2026\/10\/05-permissions-invites.png?ssl=1\" alt=\"Autorisations globales du groupe Guests avant v\u00e9rification\"><figcaption>Autorisations globales du groupe Guests avant v\u00e9rification \u2014 capture r\u00e9elle du homelab PROCYB.<\/figcaption><\/figure>\n\n<figure class=\"w-figure\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/i0.wp.com\/procyb.fr\/wp-content\/uploads\/2026\/10\/06-regles-pages.png?ssl=1\" alt=\"R\u00e8gle Page Rules autorisant potentiellement toutes les pages\"><figcaption>R\u00e8gle Page Rules autorisant potentiellement toutes les pages \u2014 capture r\u00e9elle du homelab PROCYB.<\/figcaption><\/figure>\n\n<h3>V\u00e9rifier le refus depuis une session anonyme<\/h3><p>Cr\u00e9er une page de test, copier son adresse et l\u2019ouvrir dans une fen\u00eatre de navigation priv\u00e9e. Le laboratoire affiche <strong>\u00ab Non autoris\u00e9 \u00bb<\/strong> : la lecture anonyme de cette page est bien bloqu\u00e9e.<\/p>\n\n<figure class=\"w-figure\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/i0.wp.com\/procyb.fr\/wp-content\/uploads\/2026\/10\/07-acces-refuse.png?ssl=1\" alt=\"Acc\u00e8s \u00e0 la page de test refus\u00e9 en navigation priv\u00e9e\"><figcaption>Acc\u00e8s \u00e0 la page de test refus\u00e9 en navigation priv\u00e9e \u2014 capture r\u00e9elle du homelab PROCYB.<\/figcaption><\/figure>\n\n<h2 id=\"backup\">7. Sauvegarder PostgreSQL localement<\/h2><h3>Exporter une premi\u00e8re archive<\/h3><p>Le format personnalis\u00e9 PostgreSQL (<code>-Fc<\/code>) permet de restaurer via <code>pg_restore<\/code>. Limiter les permissions du dossier et des dumps.<\/p>\n\n<pre><code>cd \/opt\/stacks\/wikijs\numask 077\ndocker compose exec -T db pg_dump -U wikijs -d wiki -Fc &gt; backups\/wikijs-test.dump\ndocker compose exec -T db pg_restore -l &lt; backups\/wikijs-test.dump\nls -lh backups\/<\/code><\/pre>\n\n<h3>Script <code>backup.sh<\/code><\/h3><p>Il interrompt son ex\u00e9cution en cas d\u2019erreur, prend un verrou, \u00e9crit d\u2019abord dans un fichier temporaire, contr\u00f4le le catalogue de l\u2019archive, puis applique une r\u00e9tention locale d\u2019environ sept jours.<\/p>\n\n<pre><code>#!\/usr\/bin\/env bash\nset -Eeuo pipefail\numask 077\nPROJECT_DIR=&quot;\/opt\/stacks\/wikijs&quot;\nBACKUP_DIR=&quot;$PROJECT_DIR\/backups&quot;\ncd &quot;$PROJECT_DIR&quot;\nmkdir -p &quot;$BACKUP_DIR&quot;\nchmod 700 &quot;$BACKUP_DIR&quot;\nexec 9&gt;&quot;$PROJECT_DIR\/.backup.lock&quot;\nflock -n 9 || { echo &quot;Une sauvegarde est d\u00e9j\u00e0 en cours&quot;; exit 1; }\nDATE=$(date +%Y%m%d_%H%M%S)\nBACKUP=&quot;$BACKUP_DIR\/wikijs_${DATE}.dump&quot;\nTEMP=&quot;${BACKUP}.tmp&quot;\ntrap &#x27;rm -f -- &quot;$TEMP&quot;&#x27; EXIT\necho &quot;[$(date)] D\u00e9but sauvegarde Wiki.js&quot;\ndocker compose exec -T db pg_dump -U wikijs -d wiki -Fc &gt; &quot;$TEMP&quot;\ntest -s &quot;$TEMP&quot;\ndocker compose exec -T db pg_restore -l &lt; &quot;$TEMP&quot; &gt; \/dev\/null\nmv -- &quot;$TEMP&quot; &quot;$BACKUP&quot;\nfind &quot;$BACKUP_DIR&quot; -maxdepth 1 -type f -name &#x27;wikijs_*.dump&#x27; -mtime +6 -delete\necho &quot;[$(date)] Sauvegarde termin\u00e9e : $BACKUP&quot;<\/code><\/pre>\n\n<pre><code>chmod 700 backup.sh\n.\/backup.sh\nls -lh backups\/<\/code><\/pre>\n\n<figure class=\"w-figure\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/i0.wp.com\/procyb.fr\/wp-content\/uploads\/2026\/10\/08-sauvegarde.png?ssl=1\" alt=\"Ex\u00e9cution r\u00e9ussie du script et cr\u00e9ation d\u2019un dump\"><figcaption>Ex\u00e9cution r\u00e9ussie du script et cr\u00e9ation d\u2019un dump \u2014 capture r\u00e9elle du homelab PROCYB.<\/figcaption><\/figure>\n\n<h2 id=\"restore\">8. Tester une restauration sans \u00e9craser la production<\/h2><p>Cr\u00e9er une base ind\u00e9pendante, restaurer le dump et comparer les nombres d\u2019enregistrements. Le test du laboratoire a retrouv\u00e9 les tables de Wiki.js puis les m\u00eames nombres de pages, utilisateurs et groupes que dans la base principale.<\/p>\n\n<pre><code>docker compose exec -T db createdb -U wikijs wiki_restore_test\ndocker compose exec -T db pg_restore -U wikijs -d wiki_restore_test --no-owner --no-acl &lt; backups\/wikijs-test.dump\ndocker compose exec -T db psql -U wikijs -d wiki_restore_test -c &quot;\\dt&quot;\ndocker compose exec -T db psql -U wikijs -d wiki_restore_test -c &quot;SELECT (SELECT count(*) FROM pages) AS pages, (SELECT count(*) FROM users) AS users, (SELECT count(*) FROM groups) AS groups;&quot;\ndocker compose exec -T db psql -U wikijs -d wiki -c &quot;SELECT (SELECT count(*) FROM pages) AS pages, (SELECT count(*) FROM users) AS users, (SELECT count(*) FROM groups) AS groups;&quot;\n# Apr\u00e8s validation uniquement :\ndocker compose exec -T db dropdb -U wikijs wiki_restore_test<\/code><\/pre>\n\n<figure class=\"w-figure\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/i0.wp.com\/procyb.fr\/wp-content\/uploads\/2026\/10\/09-restauration.png?ssl=1\" alt=\"Tables Wiki.js retrouv\u00e9es dans la base de test\"><figcaption>Tables Wiki.js retrouv\u00e9es dans la base de test \u2014 capture r\u00e9elle du homelab PROCYB.<\/figcaption><\/figure>\n\n<figure class=\"w-figure\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/i0.wp.com\/procyb.fr\/wp-content\/uploads\/2026\/10\/10-comparaison.png?ssl=1\" alt=\"Comptages compar\u00e9s, puis suppression de la base temporaire\"><figcaption>Comptages compar\u00e9s, puis suppression de la base temporaire \u2014 capture r\u00e9elle du homelab PROCYB.<\/figcaption><\/figure>\n\n<div class=\"w-note-dark\"><strong>\u2705 R\u00e8gle essentielle<\/strong><p>Un dump dont le catalogue est lisible n\u2019est pas une preuve de restauration. Tester p\u00e9riodiquement le processus entier, id\u00e9alement sur un environnement isol\u00e9.<\/p><\/div>\n\n<h2 id=\"nas\">9. Externaliser les sauvegardes vers Synology<\/h2><p>Un partage DSM <code>docker-backups<\/code> a \u00e9t\u00e9 cr\u00e9\u00e9 sur le NAS <code>192.168.1.241<\/code>, avec un compte non administrateur <code>svc_wikijs_backup<\/code>. Apr\u00e8s exploration de NFS, l\u2019\u00e9quipe du laboratoire a retenu <strong>SFTP<\/strong> afin d\u2019\u00e9viter le montage permanent et les correspondances UID\/GID. Sur DSM, activer le service SFTP, sans exposer le port SSH \u00e0 Internet.<\/p><h3>Cr\u00e9er une cl\u00e9 d\u00e9di\u00e9e sur Debian<\/h3>\n\n<pre><code>mkdir -p ~\/.ssh\nchmod 700 ~\/.ssh\nssh-keygen -t ed25519 -f ~\/.ssh\/id_ed25519_wikijs_backup -C &quot;wikijs-backup&quot;\nchmod 600 ~\/.ssh\/id_ed25519_wikijs_backup\nchmod 644 ~\/.ssh\/id_ed25519_wikijs_backup.pub<\/code><\/pre>\n\n<p>Installer <strong>uniquement la cl\u00e9 publique<\/strong> dans le <code>authorized_keys<\/code> du compte d\u00e9di\u00e9 sur Synology, avec un r\u00e9pertoire <code>.ssh<\/code> en mode <code>700<\/code> et un fichier <code>authorized_keys<\/code> en mode <code>600<\/code>. La cl\u00e9 priv\u00e9e demeure exclusivement sur Debian. Pour une automatisation sans interaction, la cl\u00e9 peut \u00eatre d\u00e9pourvue de phrase secr\u00e8te, mais doit \u00eatre strictement prot\u00e9g\u00e9e.<\/p>\n\n<pre><code>sftp -o BatchMode=yes -o IdentitiesOnly=yes \\\n  -i ~\/.ssh\/id_ed25519_wikijs_backup \\\n  svc_wikijs_backup@192.168.1.241<\/code><\/pre>\n\n<figure class=\"w-figure\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/i0.wp.com\/procyb.fr\/wp-content\/uploads\/2026\/10\/11-sftp-cle.png?ssl=1\" alt=\"Connexion SFTP sans mot de passe par cl\u00e9 d\u00e9di\u00e9e\"><figcaption>Connexion SFTP sans mot de passe par cl\u00e9 d\u00e9di\u00e9e \u2014 capture r\u00e9elle du homelab PROCYB.<\/figcaption><\/figure>\n\n<h3>Script de transfert <code>sync-nas.sh<\/code><\/h3><p>Le script rep\u00e8re le dump le plus r\u00e9cent et le transf\u00e8re vers le dossier NAS. Il ne d\u00e9truit aucune archive distante. Le t\u00e9l\u00e9chargement de v\u00e9rification est montr\u00e9 ensuite.<\/p>\n\n<pre><code>#!\/usr\/bin\/env bash\nset -Eeuo pipefail\numask 077\nBACKUP_DIR=&quot;\/opt\/stacks\/wikijs\/backups&quot;\nNAS_USER=&quot;svc_wikijs_backup&quot;\nNAS_HOST=&quot;192.168.1.241&quot;\nNAS_DIR=&quot;\/docker-backups&quot;\nSSH_KEY=&quot;\/home\/laurent\/.ssh\/id_ed25519_wikijs_backup&quot;\nBACKUP=$(find &quot;$BACKUP_DIR&quot; -maxdepth 1 -type f -name &#x27;wikijs_*.dump&#x27; \\\n  -printf &#x27;%T@ %p\\n&#x27; | sort -nr | head -n 1 | cut -d&#x27; &#x27; -f2-)\n[[ -n &quot;$BACKUP&quot; ]] || { echo &quot;Aucune sauvegarde&quot;; exit 1; }\nFILENAME=$(basename &quot;$BACKUP&quot;)\nsftp -o BatchMode=yes -o IdentitiesOnly=yes -o ConnectTimeout=15 \\\n  -i &quot;$SSH_KEY&quot; -b - &quot;${NAS_USER}@${NAS_HOST}&quot; &lt;&lt;EOF\ncd $NAS_DIR\nput $BACKUP $FILENAME\nEOF\necho &quot;Transfert termin\u00e9 : $FILENAME&quot;<\/code><\/pre>\n\n<pre><code>chmod 700 sync-nas.sh\n.\/sync-nas.sh<\/code><\/pre>\n\n<h3>V\u00e9rifier l\u2019int\u00e9grit\u00e9 avec SHA-256<\/h3><p>R\u00e9cup\u00e9rer un dump distant dans un r\u00e9pertoire temporaire puis comparer ses empreintes locales et distantes. Dans le laboratoire, elles \u00e9taient identiques.<\/p>\n\n<pre><code>mkdir -p \/tmp\/wikijs-verification\nchmod 700 \/tmp\/wikijs-verification\nsftp -o BatchMode=yes -o IdentitiesOnly=yes \\\n  -i ~\/.ssh\/id_ed25519_wikijs_backup \\\n  svc_wikijs_backup@192.168.1.241 &lt;&lt;&#x27;EOF&#x27;\nget \/docker-backups\/wikijs_20261020_151352.dump \/tmp\/wikijs-verification\/wikijs_20261020_151352.dump\nbye\nEOF\nsha256sum \/opt\/stacks\/wikijs\/backups\/wikijs_20261020_151352.dump \\\n  \/tmp\/wikijs-verification\/wikijs_20261020_151352.dump<\/code><\/pre>\n\n<figure class=\"w-figure\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/i0.wp.com\/procyb.fr\/wp-content\/uploads\/2026\/10\/12-integrite.png?ssl=1\" alt=\"Empreintes SHA-256 des deux archives rigoureusement identiques\"><figcaption>Empreintes SHA-256 des deux archives rigoureusement identiques \u2014 capture r\u00e9elle du homelab PROCYB.<\/figcaption><\/figure>\n\n<div class=\"w-card w-warn procyb-box-warning\"><strong>\u26a0\ufe0f Une protection imparfaite<\/strong><p>Le fichier distant pr\u00e9sentait des bits de permissions tr\u00e8s permissifs, tandis que les ACL h\u00e9rit\u00e9es du partage DSM autorisaient le compte de service et les administrateurs, avec refus explicite de <code>guest<\/code>. Les droits effectifs doivent \u00eatre test\u00e9s sur le NAS avec un autre compte non privil\u00e9gi\u00e9. Le chiffrement eCryptfs prot\u00e8ge les donn\u00e9es au repos lorsque le partage est d\u00e9mont\u00e9, <strong>pas contre l\u2019effacement par un utilisateur autoris\u00e9<\/strong>.<\/p><\/div>\n\n<figure class=\"w-figure\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/i0.wp.com\/procyb.fr\/wp-content\/uploads\/2026\/10\/14-acl-synology.png?ssl=1\" alt=\"ACL Synology h\u00e9rit\u00e9es du dossier partag\u00e9 docker-backups\"><figcaption>ACL Synology h\u00e9rit\u00e9es du dossier partag\u00e9 docker-backups \u2014 capture r\u00e9elle du homelab PROCYB.<\/figcaption><\/figure>\n\n<h2 id=\"planning\">10. Planifier sauvegardes, r\u00e9tention et journaux<\/h2><h3>Cha\u00eener les op\u00e9rations \u00e0 02:00<\/h3><p>Cr\u00e9er une seule t\u00e2che dans la crontab du compte Debian ex\u00e9cutant Docker. Le transfert ne d\u00e9marre que si la sauvegarde locale se termine correctement.<\/p>\n\n<pre><code>crontab -e\n# \u00c0 ins\u00e9rer dans la crontab :\n0 2 * * * { \/opt\/stacks\/wikijs\/backup.sh &amp;&amp; \/opt\/stacks\/wikijs\/sync-nas.sh; } &gt;&gt; \/opt\/stacks\/wikijs\/backups\/backup.log 2&gt;&amp;1<\/code><\/pre>\n\n<figure class=\"w-figure\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/i0.wp.com\/procyb.fr\/wp-content\/uploads\/2026\/10\/13-chaine-sauvegarde.png?ssl=1\" alt=\"Ex\u00e9cution manuelle de la cha\u00eene compl\u00e8te avec code retour nul\"><figcaption>Ex\u00e9cution manuelle de la cha\u00eene compl\u00e8te avec code retour nul \u2014 capture r\u00e9elle du homelab PROCYB.<\/figcaption><\/figure>\n\n<h3>Rotation des dumps sur le NAS<\/h3><p>Le NAS du laboratoire utilise un volume <code>ext4<\/code> et un partage <code>eCryptfs<\/code> ; Snapshot Replication sur Btrfs n\u2019est donc pas disponible pour ce partage. Un script local au NAS r\u00e9alise la rotation apr\u00e8s v\u00e9rification du montage chiffr\u00e9.<\/p>\n\n<pre><code>#!\/bin\/sh\nset -eu\nBACKUP_DIR=&quot;\/volume1\/docker-backups&quot;\nLOG_FILE=&quot;\/var\/log\/rotate-wikijs-backups.log&quot;\nif ! mount | grep -F &quot; on $BACKUP_DIR type ecryptfs &quot; &gt; \/dev\/null; then\n  echo &quot;$(date) ERREUR : partage chiffr\u00e9 non mont\u00e9&quot; &gt;&amp;2\n  exit 1\nfi\n[ -d &quot;$BACKUP_DIR&quot; ] || exit 1\necho &quot;$(date) D\u00e9but de rotation&quot; &gt;&gt; &quot;$LOG_FILE&quot;\nfind &quot;$BACKUP_DIR&quot; -maxdepth 1 -type f -name &#x27;wikijs_*.dump&#x27; \\\n  -mtime +29 -exec sh -c &#x27;\n    for file do echo &quot;$(date) Suppression : $file&quot;; rm -- &quot;$file&quot;; done\n  &#x27; sh {} + &gt;&gt; &quot;$LOG_FILE&quot; 2&gt;&amp;1\necho &quot;$(date) Rotation termin\u00e9e&quot; &gt;&gt; &quot;$LOG_FILE&quot;<\/code><\/pre>\n\n<p>Installer ce script sur Synology dans <code>\/usr\/local\/etc\/scripts\/rotate-wikijs-backups.sh<\/code> avec les droits <code>700<\/code>, puis cr\u00e9er dans <strong>Planificateur de t\u00e2ches DSM<\/strong> une t\u00e2che quotidienne \u00e0 <strong>04:00<\/strong>. Une s\u00e9lection de fichiers avec <code>-print<\/code> doit \u00eatre test\u00e9e avant d\u2019autoriser leur suppression.<\/p>\n\n<figure class=\"w-figure\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/i0.wp.com\/procyb.fr\/wp-content\/uploads\/2026\/10\/15-rotation-dsm.png?ssl=1\" alt=\"T\u00e2che de rotation quotidienne programm\u00e9e \u00e0 04:00 dans DSM\"><figcaption>T\u00e2che de rotation quotidienne programm\u00e9e \u00e0 04:00 dans DSM \u2014 capture r\u00e9elle du homelab PROCYB.<\/figcaption><\/figure>\n\n<h3>Rotation de <code>backup.log<\/code> sur Debian<\/h3><p>Dans <code>\/etc\/logrotate.d\/wikijs-backup<\/code> :<\/p>\n\n<pre><code>\/opt\/stacks\/wikijs\/backups\/backup.log {\n    weekly\n    rotate 4\n    compress\n    delaycompress\n    missingok\n    notifempty\n    su laurent laurent\n    create 0600 laurent laurent\n}<\/code><\/pre>\n\n<pre><code>sudo chmod 600 \/opt\/stacks\/wikijs\/backups\/backup.log\nsudo \/usr\/sbin\/logrotate -d \/etc\/logrotate.d\/wikijs-backup\nsystemctl status logrotate.timer --no-pager<\/code><\/pre>\n\n<figure class=\"w-figure\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/i0.wp.com\/procyb.fr\/wp-content\/uploads\/2026\/10\/16-logrotate.png?ssl=1\" alt=\"Validation du param\u00e9trage logrotate en mode diagnostic\"><figcaption>Validation du param\u00e9trage logrotate en mode diagnostic \u2014 capture r\u00e9elle du homelab PROCYB.<\/figcaption><\/figure>\n\n<figure class=\"w-figure\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/i0.wp.com\/procyb.fr\/wp-content\/uploads\/2026\/10\/17-timer.png?ssl=1\" alt=\"Service systemd de rotation des journaux actif\"><figcaption>Service systemd de rotation des journaux actif \u2014 capture r\u00e9elle du homelab PROCYB.<\/figcaption><\/figure>\n\n<h2 id=\"limites\">11. Bonnes pratiques et limites<\/h2><div class=\"w-card w-green procyb-box-info\"><strong>Ce qui a \u00e9t\u00e9 r\u00e9ellement v\u00e9rifi\u00e9<\/strong><ul><li>Wiki.js et PostgreSQL d\u00e9marrent et communiquent.<\/li><li>La page de test est inaccessible sans authentification.<\/li><li>Un dump se restaure dans une base distincte et les donn\u00e9es s\u00e9lectionn\u00e9es correspondent.<\/li><li>Un fichier transf\u00e9r\u00e9 sur Synology a \u00e9t\u00e9 r\u00e9cup\u00e9r\u00e9 avec une empreinte SHA-256 identique.<\/li><li>La cha\u00eene compl\u00e8te a \u00e9t\u00e9 test\u00e9e manuellement ; cron, DSM et logrotate sont configur\u00e9s.<\/li><\/ul><\/div><div class=\"w-card w-warn procyb-box-warning\"><strong>Ce qui reste \u00e0 surveiller<\/strong><ul><li>Contr\u00f4ler la premi\u00e8re ex\u00e9cution automatique et les fichiers g\u00e9n\u00e9r\u00e9s apr\u00e8s la nuit.<\/li><li>V\u00e9rifier une suppression de rotation sur un fichier fictif ancien avant de compter dessus.<\/li><li>Pr\u00e9voir une copie <strong>ind\u00e9pendante et non modifiable<\/strong> par le compte de transfert.<\/li><li>Emp\u00eacher l\u2019acc\u00e8s public au port Wiki.js et envisager HTTPS si l\u2019outil doit sortir du r\u00e9seau priv\u00e9.<\/li><li>Mettre \u00e0 jour les images Docker de mani\u00e8re contr\u00f4l\u00e9e, en sauvegardant avant les changements.<\/li><li>Les variables d\u2019environnement peuvent \u00eatre inspect\u00e9es par les administrateurs Docker : prot\u00e9ger l\u2019acc\u00e8s au daemon.<\/li><\/ul><\/div>\n\n<h2 id=\"conclusion\">12. Conclusion<\/h2><p>Nous disposons d\u00e9sormais d\u2019un <strong>wiki priv\u00e9 sur Debian 13<\/strong>, reposant sur Docker Compose et PostgreSQL, accompagn\u00e9 d\u2019une cha\u00eene de sauvegarde locale et d\u2019une copie SFTP vers Synology. Les captures de ce tutoriel correspondent aux tests effectu\u00e9s, notamment la restauration et le contr\u00f4le d\u2019int\u00e9grit\u00e9.<\/p><p>La prochaine am\u00e9lioration logique sera d\u2019ajouter une copie ind\u00e9pendante ou prot\u00e9g\u00e9e contre l\u2019effacement, puis de documenter un sc\u00e9nario complet de reprise apr\u00e8s perte de la VM.<\/p><div class=\"w-note-dark\"><strong>\u2705 \u00c0 retenir<\/strong><p>Un tutoriel d\u2019installation devient une proc\u00e9dure d\u2019exploitation lorsqu\u2019il d\u00e9crit aussi la supervision des erreurs, les permissions, les sauvegardes et les tests de restauration.<\/p><\/div><\/div>\n\n\n\n<div class=\"wp-block-buttons procyb-pdf-download is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/procyb.fr\/wp-content\/uploads\/2026\/10\/procyb_fiche_procedure_wikijs_docker.pdf\">T\u00e9l\u00e9charger la fiche de proc\u00e9dure (PDF)<\/a><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>D\u00e9ployez Wiki.js sur Debian 13 avec Docker Compose et PostgreSQL. D\u00e9couvrez comment s\u00e9curiser les acc\u00e8s, automatiser les sauvegardes et les externaliser sur un NAS Synology. <span class=\"more-tag mt-15 is-style-arrow\"><a class=\"more-link wp-block-button__link\" href=\"https:\/\/procyb.fr\/index.php\/2026\/10\/21\/installer-wikijs-docker-compose-debian-13\/\">...<span class=\"screen-reader-text\"> \"Installer, s\u00e9curiser et sauvegarder Wiki.js avec Docker Compose sur Debian 13\"<\/span><\/a><\/span><!-- .more-tag --><\/p>\n","protected":false},"author":2,"featured_media":2946,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_seo_schema_type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"\ud83d\ude80 **On avance sur le Homelab PROCYB !**\n\nCette fois, direction **Wiki.js**, une solution open source pour centraliser et organiser sa documentation technique.\n\nAu programme de ce nouveau tutoriel :\n\n\ud83d\udc33 D\u00e9ploiement avec Docker Compose sur Debian 13  \n\ud83d\udc18 Base de donn\u00e9es PostgreSQL  \n\ud83d\udd10 S\u00e9curisation des acc\u00e8s  \n\ud83d\udcbe Sauvegardes automatis\u00e9es et restauration  \n\ud83d\uddc4\ufe0f Externalisation vers un NAS Synology via SFTP\n\nLe tout test\u00e9 sur mon propre homelab, avec des captures d'\u00e9cran, des sch\u00e9mas explicatifs et une **fiche de proc\u00e9dure PDF t\u00e9l\u00e9chargeable** pour reproduire le d\u00e9ploiement.\n\n\ud83d\udd17 Retrouvez le tutoriel sur **PROCYB** \n\n#Homelab #Docker #WikiJS #Debian #Cybersecurite #OpenSource","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[46,37],"tags":[24,73,92,91,88],"class_list":["post-2919","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","category-systemes","tag-docker","tag-homelab","tag-postgresql","tag-synology","tag-wiki-js"],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_featured_media_url":"https:\/\/i0.wp.com\/procyb.fr\/wp-content\/uploads\/2026\/10\/Wiki.js-sur-Debian-13-_-sauvegarde-securisee.png?fit=1672%2C940&ssl=1","_links":{"self":[{"href":"https:\/\/procyb.fr\/index.php\/wp-json\/wp\/v2\/posts\/2919","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/procyb.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/procyb.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/procyb.fr\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/procyb.fr\/index.php\/wp-json\/wp\/v2\/comments?post=2919"}],"version-history":[{"count":7,"href":"https:\/\/procyb.fr\/index.php\/wp-json\/wp\/v2\/posts\/2919\/revisions"}],"predecessor-version":[{"id":2953,"href":"https:\/\/procyb.fr\/index.php\/wp-json\/wp\/v2\/posts\/2919\/revisions\/2953"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/procyb.fr\/index.php\/wp-json\/wp\/v2\/media\/2946"}],"wp:attachment":[{"href":"https:\/\/procyb.fr\/index.php\/wp-json\/wp\/v2\/media?parent=2919"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/procyb.fr\/index.php\/wp-json\/wp\/v2\/categories?post=2919"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/procyb.fr\/index.php\/wp-json\/wp\/v2\/tags?post=2919"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}