Primo post del blog. Stack: Flask + Markdown, zero database, zero fronzoli.
Perché questo stack?¶
Niente ORM, niente migrazioni, niente headache. I post sono file .md sul filesystem — versionabili con git, editabili con qualsiasi editor, backuppabili con rsync.
posts/
├── benvenuto-nel-blog.md
├── setup-opnsense.md
└── proxmox-influxdb-grafana.md
Syntax highlighting¶
Il blog supporta fenced code blocks con Pygments:
from flask import Flask, render_template
from pathlib import Path
app = Flask(__name__)
@app.route("/post/<slug>")
def post(slug: str):
path = Path("posts") / f"{slug}.md"
if not path.exists():
abort(404)
# parse & render
return render_template("post.html", post=parse_post(path))
# Avviare il blog
SECRET_KEY="cambia-questo" python app.py
# Oppure con gunicorn
gunicorn -w 4 -b 0.0.0.0:5050 app:app
Features¶
- Lista post con tag e categorie filtrabili
- Pannello admin protetto da password
- Syntax highlighting via Pygments
- RSS feed a
/feed.xml - Navigazione prev/next tra i post
- Zero dipendenze pesanti
Tutto il blog è un singolo
app.py+ template Jinja2. Deploy ovunque giri Python.
Deploy¶
Con Docker Compose è banale. Crea un compose.yml, monta ./posts come volume e sei live.
services:
blog:
build: .
ports:
- "5050:5050"
volumes:
- ./posts:/app/posts
environment:
SECRET_KEY: "segreto-sicuro-qui"
ADMIN_PASSWORD_HASH: "sha256-della-tua-password"
restart: unless-stopped