~/blog / benvenuto-nel-blog.md

Benvenuto nel blog

date: 2026-04-08 author: hersel category: meta devops tags: #flask #python #homelab
─────────────────────────────────────────────────

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