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
- Usa stesso template Debian dei container esistenti (Wiki.js, Gitea)
- Riserva circa 1β―GB RAM (puoi anche 512β―MB se necessario)
- 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?