Setup completo: Wiki.js β†’ Blog Hugo auto-contenuto (ottimizzato per risorse limitate)

Perfetto! Ho aggiornato il tuo vademecum Markdown completo integrando:

  • CI/CD con webhook e build automatica
  • Gestione immagini della wiki
  • Git versioning per backup e cronologia
  • Diagramma del flusso

Ecco la versione pronta da usare:


🧱 Setup completo: Wiki.js β†’ Blog Hugo auto-contenuto (ottimizzato per risorse limitate)

🎯 Obiettivo

Partendo dalla situazione attuale:

  • βœ… Container Wiki.js operativo
  • βœ… Container nginx operativo
  • βœ… Container Gitea operativo
  • ❌ Nessun blog

Arrivare a:

  • βœ… Blog statico con Hugo, auto-contenuto nello stesso container Debian leggero
  • βœ… Import automatico delle pagine Wiki.js (iniziale + incrementale)
  • βœ… Feed unificato (wiki + post manuali)
  • βœ… Backup facile β†’ snapshot LXC

🧠 Architettura finale

[Container Wiki.js] 
        ↓ webhook
[Container Blog (Debian leggero)] β†’ Hugo CLI + Python webhook β†’ build statica /public/
        ↓
[Container nginx] β†’ serve static files
  • Tutto Hugo + webhook nello stesso container Debian
  • Nginx serve i file statici β†’ zero RAM costante per Hugo server
  • Backup facile β†’ snapshot LXC del container

πŸ“¦ STEP 1 β€” Creazione container Blog

  1. Usa stesso template Debian dei container esistenti (Wiki.js, Gitea)
  2. Riserva circa 1β€―GB RAM (puoi anche 512β€―MB se necessario)
  3. Crea struttura interna:
mkdir -p /opt/blog/content/blog
mkdir -p /opt/blog/content/wiki
mkdir -p /opt/blog/public

Struttura finale:

/opt/blog/
  content/
    blog/     ← post manuali
    wiki/     ← pagine Wiki importate
  static/
    wiki_images/ ← immagini importate
  public/     ← output Hugo statico
  import_wiki.py
  build.sh
  config.toml

βš™οΈ STEP 2 β€” Installazione software

Nel container:

sudo apt update
sudo apt install -y hugo git python3 python3-pip
pip3 install requests fastapi uvicorn
  • Hugo CLI β†’ build statico
  • Python + FastAPI β†’ webhook leggero

πŸ—οΈ STEP 3 β€” Creazione sito Hugo

cd /opt/blog
hugo new site .

🎨 STEP 4 β€” Aggiunta tema

git init
git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke themes/ananke

Configura /opt/blog/config.toml:

baseURL = "https://blog.tuodominio.it/"
languageCode = "it-it"
title = "Il mio blog"
theme = "ananke"

🐍 STEP 5 β€” Script import Wiki.js con immagini

Crea /opt/blog/import_wiki.py:

import requests, os, hashlib

WIKI_URL = "http://IP_WIKI:3000/graphql"
OUTPUT_DIR = "/opt/blog/content/wiki"
IMAGE_DIR = "/opt/blog/static/wiki_images"

query = """
query {
  pages {
    list {
      id
      path
      title
      createdAt
      updatedAt
      content
      attachments {
        url
        fileName
      }
    }
  }
}
"""

resp = requests.post(WIKI_URL, json={"query": query})
pages = resp.json()["data"]["pages"]["list"]

def slugify(path):
    return path.strip("/").replace("/", "-")

# Scarica immagini e riscrivi contenuto
for page in pages:
    slug = slugify(page["path"])
    filepath = f"{OUTPUT_DIR}/{slug}.md"
    os.makedirs(os.path.dirname(filepath), exist_ok=True)

    content_text = page['content']

    # scarica allegati
    for att in page.get("attachments", []):
        img_url = att["url"]
        # genera nome unico
        img_name = hashlib.md5(img_url.encode()).hexdigest() + os.path.splitext(att["fileName"])[1]
        img_path = f"{IMAGE_DIR}/{img_name}"
        os.makedirs(os.path.dirname(img_path), exist_ok=True)
        # download immagine
        r = requests.get(img_url)
        with open(img_path, "wb") as f:
            f.write(r.content)
        # sostituisci url nel contenuto
        content_text = content_text.replace(att["url"], f"/wiki_images/{img_name}")

    md_content = f"""---
title: "{page['title']}"
date: {page['createdAt']}
lastmod: {page['updatedAt']}
type: "wiki"
draft: false
---

{content_text}
"""

    with open(filepath, "w", encoding="utf-8") as f:
        f.write(md_content)

print("Import completato")

▢️ STEP 6 β€” Import iniziale

python3 /opt/blog/import_wiki.py
  • Tutte le pagine Wiki.js vengono convertite in Markdown + immagini

πŸ—οΈ STEP 7 β€” Build statico Hugo

cd /opt/blog
hugo
  • Output in /opt/blog/public/ β†’ serve nginx

🌐 STEP 8 β€” Configurazione nginx

server {
    server_name blog.tuodominio.it;

    location / {
        root /opt/blog/public;
        index index.html;
    }
}

πŸ” STEP 9 β€” Webhook per aggiornamenti automatici

Crea /opt/blog/webhook.py:

from fastapi import FastAPI, Request
import subprocess

app = FastAPI()

@app.post("/webhook")
async def webhook(req: Request):
    subprocess.run(["python3", "/opt/blog/import_wiki.py"])
    subprocess.run(["hugo"], cwd="/opt/blog")
    # commit automatico
    subprocess.run(["git", "add", "."], cwd="/opt/blog")
    subprocess.run(["git", "commit", "-m", "Aggiornamento wiki"], cwd="/opt/blog")
    return {"status": "ok"}

Avvio:

uvicorn webhook:app --host 0.0.0.0 --port 8000
  • Ogni aggiornamento wiki β†’ build e commit automatico

πŸ”— STEP 10 β€” Configura Wiki.js webhook

  • Endpoint:
http://IP_CONTAINER_BLOG:8000/webhook
  • Eventi: page created, page updated

🏠 STEP 11 β€” Homepage feed unificato

Crea /opt/blog/layouts/index.html:

{{ define "main" }}
<h1>Ultimi contenuti</h1>

{{ range .Site.RegularPages.ByDate.Reverse }}
  <article>
    <h2><a href="{{ .RelPermalink }}">{{ .Title }}</a></h2>
    <p>{{ .Date }}</p>

    {{ if eq .Params.type "wiki" }}
      <span>πŸ“˜ Wiki</span>
    {{ else }}
      <span>✍️ Blog</span>
    {{ end }}
  </article>
{{ end }}

{{ end }}

✍️ STEP 12 β€” Creazione post manuali

hugo new blog/mio-post.md

πŸ”„ STEP 13 β€” Script build semplificato

Crea /opt/blog/build.sh:

#!/bin/bash
cd /opt/blog
python3 import_wiki.py
hugo
chmod +x /opt/blog/build.sh

πŸ’Ύ STEP 14 β€” Backup

  • Snapshot LXC del container β†’ include tutto
  • Tutto Γ¨ auto-contenuto β†’ portabilitΓ  totale

πŸŒ€ Flusso CI/CD

+-------------------+        webhook          +---------------------------+
|    Wiki.js         |----------------------->|  Container Blog Debian    |
|                   |                        |  (Hugo CLI + Python Webhook)
+-------------------+                        | 1️⃣ import_wiki.py       |
                                              |  - Scarica pagine        |
                                              |  - Aggiorna Markdown     |
                                              |  - Gestione immagini     |
                                              | 2️⃣ Hugo build statico    |
                                              | 3️⃣ Git commit opzionale  |
                                              +---------------------------+
                                                            |
                                                            | Sito statico
                                                            v
                                              +---------------------------+
                                              |        nginx container     |
                                              |  - Serve /public/          |
                                              |  - Feed unificato (wiki + blog)
                                              +---------------------------+

πŸ“Œ Checklist finale

  • Container Blog creato (Debian leggero)
  • Hugo + Python webhook installati
  • Import iniziale Wiki completato
  • Gestione immagini attiva
  • nginx configurato per serve statici
  • Webhook attivo
  • Feed unificato pronto
  • Git versioning attivo
  • Post manuali funzionanti
  • Backup testato

Con questo documento hai tutto pronto per l’implementazione, ottimizzato per la tua macchina I3 con 8β€―GB RAM, senza Docker, con feed unificato wiki + blog, immagini, Git versioning e CI/CD automatico.


Se vuoi, posso anche prepararti il file cron-job consigliato per fare build periodiche di backup / aggiornamento automatico in aggiunta al webhook, così il sistema è completamente automatico senza intervento manuale.

Vuoi che lo faccia?

Last updated on Wednesday, March 18, 2026
Built with Hugo
Theme Stack designed by Jimmy