/ tistar / homelab

OUMAX Server

Intel N100  ·  Debian 13  ·  15+ servizi  ·  H24

Mini PC silenzioso ed efficiente che fa girare Minecraft Forge, gestisce una libreria ebook, sincronizza una knowledge base personale, monitora l'UPS via NUT e risponde al bot Telegram. Tutto documentato e sotto backup doppio.

N100Intel · 6W TDP
16 GBDDR4
~19 Wa riposo
15+servizi attivi
2× backupUSB + cloud

Hardware

Mini PC con processore Intel N100, progettato per carichi leggeri e funzionamento continuo. Consumo misurato direttamente sull'EcoFlow: ~19W a riposo, circa 55 pesos MXN al mese.

ComponenteSpecifiche
CPUIntel N100 — 4C/4T, fino a 3.4 GHz, 6W TDP
RAM16 GB DDR4
Disco sistemaNVMe 256 GB — sistema operativo
Disco datiSSD 500 GB — tutti i dati in /data · ext4
Disco backupHDD USB 2 TB — backup notturno, montato solo durante il backup
ReteEthernet cablata — connesso al router di casa
UPSEcoFlow River 3 Plus — 286 Wh · 600W AC · sub-10ms · USB HID
Consumo~19W a riposo · ~55 pesos MXN/mese (a 4 pesos/kWh)

Struttura /data:

/data/
├── scripts/          ← tutti gli script + config.env
├── config/           ← snapshot config di sistema
├── www/              ← root Nginx (sito gamedite.com)
├── samba/            ← file condivisi in LAN
├── trilium/          ← knowledge base TriliumNext
├── calibre/          ← libreria ebook (metadata + file)
├── calibre-web/      ← config runtime Calibre-Web
├── gitea/            ← repository Git e database Gitea
├── minecraft/        ← server Minecraft Forge (dati live)
├── backup_minecraft/ ← snapshot backup Minecraft
└── assistant/        ← dati runtime bot Telegram

Rete

La rete di casa ha due livelli: connessione ISP e rete locale gestita da un router GL-MT3000 con OpenWrt, che fa anche da access point WiFi e adblock per tutti i dispositivi.

Accesso remoto — ZeroTier

VPN peer-to-peer senza apertura di porte. Il server, la VPS Hetzner, il PC e i cellulari sono tutti nella stessa rete ZeroTier — SSH, WebUI Minecraft e gli altri servizi sono raggiungibili da qualsiasi luogo. Samba è visibile solo in LAN fisica.

Sotto UPS

Router ISP, router GL-MT3000 e OUMAX sono tutti alimentati dall'EcoFlow River 3 Plus. In caso di blackout la connettività e il server rimangono operativi.

Servizi attivi

15+ servizi systemd in esecuzione continua.

sshd:22

Accesso remoto SSH. Notifica Telegram automatica ad ogni login via PAM.

smbd / nmbd:445

Samba — condivisione file in LAN. Share data e www. Solo rete locale, accesso senza password.

nginx:80

Server web locale. Document root: /data/www/. Copia locale del sito gamedite.com, accessibile in LAN e via ZeroTier.

zerotier-oneVPN

VPN peer-to-peer per accesso remoto sicuro da qualsiasi luogo, senza port forwarding sul router.

trilium:8080

TriliumNext Notes — knowledge base personale self-hosted. Dati in /data/trilium/, sincronizzati su MEGA.

calibre-web:8083

Libreria ebook familiare. Accesso LAN e ZeroTier. Import via Samba, lettura da qualsiasi dispositivo.

gitea:3000

Server Git locale per script, sito web, giochi e tool vari. Non esposto su internet.

nut-driverUSB

Driver usbhid-ups per EcoFlow River 3 Plus via USB HID. NUT 2.8.5 compilato dai sorgenti.

nut-server / monitor:3493

upsd espone i dati UPS in rete. upsmon gestisce lo spegnimento ordinato al 20% di carica.

minecraft:25565

Forge 1.20.1 · OpenJDK 21 · 4 GB RAM · max 3 giocatori · RCON abilitato.

minecraft-webui:8181

Interfaccia web Python per backup, ripristino e stato del server Minecraft, senza SSH.

assistant

Bot Telegram Python — monitoraggio sistema, reminder, avvio backup, notifiche automatiche.

notify-boot

Notifica Telegram all'avvio del server e al ripristino della connessione internet.

NUT 2.8.5 — Gestione UPS EcoFlow

Perché compilato dai sorgenti

Debian 13 fornisce NUT 2.8.1. Il subdriver EcoFlow HID 0.01 — necessario per il River 3 Plus — è stato introdotto nella 2.8.4. Soluzione: compilazione da sorgenti in /usr/local.

ParametroValore
Driverusbhid-ups
SubdriverEcoFlow HID 0.01
ModelloEcoFlow River 3 Plus
Capacità286 Wh · 600W AC
Soglia spegnimento20% di carica
Porta upsd3493

Comandi utili:

upsc ecoflow                    # tutti i parametri
upsc ecoflow battery.charge     # carica %
upsc ecoflow ups.status         # OL = rete · OB = batteria
upsc ecoflow battery.runtime    # autonomia residua (secondi)

Bot Telegram — Homelab Assistant

Bot Python per monitoraggio e controllo remoto. Risponde solo all'utente autorizzato. Stack: python-telegram-bot + APScheduler.

ComandoFunzione
/startLista di tutti i comandi disponibili
/statoCPU, RAM, spazio disco, uptime, data/ora ultimo backup
/backupAvvia il backup USB in background
/logUltime 20 righe del log di backup USB
/backup_megaAvvia il backup cloud su MEGA in background
/log_megaUltime 20 righe del log di backup cloud
/ricorda [min] [msg]Reminder tra X minuti
/promemoria [GG/MM/AAAA] [HH:MM] [msg]Reminder a data/ora specifica
/listaTutti i reminder attivi con ID
/cancella [ID]Cancella un reminder per ID

Notifiche automatiche: avvio server 🟢, ripristino internet 🌐, login SSH 🔐.

HTTP Relay — porta 9977

Il bot espone anche un endpoint HTTP interno (POST /send), autenticato con token, che permette agli altri servizi della rete di inviare messaggi Telegram senza conoscere il token del bot. Gira nello stesso processo, avviato come task asyncio. Lo script notify-telegram lo usa da qualsiasi macchina della rete.

Backup

Doppia copertura: backup locale incrementale su HDD USB e backup cloud su MEGA. Ogni esito viene notificato via bot Telegram.

Backup locale (USB)Backup cloud (MEGA)
Strumentorsyncrclone
SorgenteTutto /data/Trilium · Scan Samba · Gitea
DestinazioneHDD USB 2 TB (montato solo durante il backup)Account MEGA (gratuito)
FrequenzaOgni notte alle 03:00Prima esecuzione 3:30, retry ogni 30 min
Log/var/log/backup.log/var/log/backup-cloud.log
Backup server Minecraft
Script/data/scripts/minecraft-backup.sh
Destinazione/data/backup_minecraft/ — snapshot con data/ora
FrequenzaOgni lunedì alle 04:00 (cron)
SicurezzaVerifica giocatori via RCON prima di procedere — salta se ci sono giocatori online

Server Minecraft Forge 1.20.1

ParametroValore
Versione Minecraft1.20.1
Versione Forge47.3.x
JavaOpenJDK 21
RAM allocata4 GB
Giocatori massimi3
ModalitàOffline — permette client non ufficiali e bot
RCONAbilitato — usato dagli script di backup
Chunk loadingMod LoadMyChunks — blocco fisico nel mondo
WebUI Backup — porta 8181

Interfaccia Python per backup e ripristino senza SSH. Barra di progresso in tempo reale, lista backup con data/ora, eliminazione con conferma, stato server e giocatori connessi. Il ripristino è bloccato se ci sono giocatori online.

Gitea — Server Git locale

Server Git self-hosted per tenere tutto sotto versione senza dipendere da servizi esterni. Non esposto su internet — solo LAN e ZeroTier. Dati in /data/gitea/, inclusi nel backup cloud MEGA.

RepositoryContenuto
oumax-scriptsScript e configurazioni del server (/data/scripts/)
oumax-wwwSito web statico Gamedite (/data/www/)
questlogApp QuestLog — FastAPI + React
clashClash of Emperors — gioco di carte online
merchantMerchant — gioco gestionale RPG
gd-asteroidAsteroid Touch (Godot)

Calibre-Web — Libreria Ebook

Libreria ebook familiare self-hosted. Accesso da qualsiasi dispositivo in LAN o via ZeroTier. Utente unico admin, porta 8083.

ComponenteDettaglio
Libreria/data/calibre/ — metadata.db + file ebook
Formati supportatiepub, pdf, mobi, azw, cbz, cbr, fb2
ImportCopia ebook in /data/samba/libri/ via Samba, poi lancia calibre-import.sh

Script di Sistema

Tutti gli script leggono le credenziali da /data/scripts/config.env — un solo file da modificare per aggiornare token, password e percorsi.

/data/scripts/backup.sh — Backup dati su USB con rsync incrementale

#!/bin/bash
source /data/scripts/config.env

# Monta disco USB se non montato
if ! mountpoint -q $BACKUP_DIR; then
    mount UUID=$BACKUP_UUID $BACKUP_DIR
fi

# Backup incrementale con storico modifiche
rsync -a --delete --backup \
    --backup-dir="$OLD_DIR" \
    --exclude="old" --exclude="logs" \
    "/data/" "$BACKUP_DIR/"

umount $BACKUP_DIR

/data/scripts/minecraft-backup.sh — Snapshot Minecraft con verifica giocatori via RCON

#!/bin/bash
source /data/scripts/config.env

# Verifica giocatori connessi via RCON
PLAYERS=$(python3 -c "
from mcrcon import MCRcon
try:
    with MCRcon('localhost', '$RCON_PASSWORD') as m:
        print(m.command('list'))
except: print(-1)
")

if [ "$PLAYERS" -gt 0 ]; then
    echo "Giocatori online — backup saltato"; exit 1
fi

# Stop · Snapshot · Start
systemctl stop minecraft
rsync -a --exclude="logs/" --exclude="crash-reports/" \
    /data/minecraft/ /data/backup_minecraft/$(date +%Y-%m-%d_%H-%M)/
systemctl start minecraft

/data/scripts/notify.sh — Notifiche boot e ripristino internet

#!/bin/bash
source /data/scripts/config.env

send() {
    curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" \
        -d "chat_id=$TELEGRAM_CHAT_ID" -d "text=$1" -d "parse_mode=Markdown"
}

case "$1" in
    boot)
        # Attende connessione poi notifica
        for i in $(seq 1 30); do
            curl -s --max-time 3 https://api.telegram.org > /dev/null && break
            sleep 5
        done
        send "🟢 *Server OUMAX Online* — $(date '+%d/%m/%Y %H:%M')"
        ;;
    check)
        # Notifica solo al ripristino connessione
        if ping -c 1 -W 3 8.8.8.8 > /dev/null 2>&1; then
            [ "$(cat /tmp/inet-state 2>/dev/null)" = "offline" ] && \
                send "🌐 *Internet ripristinato su OUMAX*"
            echo online > /tmp/inet-state
        else
            echo offline > /tmp/inet-state
        fi
        ;;
esac

/data/scripts/notify-ssh.sh — Alert Telegram ad ogni login SSH (via PAM)

#!/bin/bash
source /data/scripts/config.env

if [ "$PAM_TYPE" = "open_session" ]; then
    curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" \
        -d "chat_id=$TELEGRAM_CHAT_ID" \
        -d "parse_mode=Markdown" \
        -d "text=🔐 *Login SSH su OUMAX*
👤 $PAM_USER · 🌐 $PAM_RHOST · 🕐 $(date '+%d/%m %H:%M')"
fi

/data/scripts/notify-telegram — Invia messaggi Telegram via relay HTTP (funziona su tutta la rete ZeroTier)

#!/bin/bash
# Uso: notify-telegram "messaggio"
# Token da $TELEGRAM_RELAY_TOKEN o da config.env (solo su OUMAX)

OUMAX_RELAY="http://192.168.191.2:9977/send"
TEXT="${1:?Uso: notify-telegram \"messaggio\"}"

if [ -z "$TELEGRAM_RELAY_TOKEN" ]; then
    TELEGRAM_RELAY_TOKEN=$(grep '^TELEGRAM_RELAY_TOKEN=' /data/scripts/config.env 2>/dev/null | cut -d= -f2)
fi

curl -s -X POST "$OUMAX_RELAY" \
    -H "Authorization: Bearer $TELEGRAM_RELAY_TOKEN" \
    -H "Content-Type: application/json" \
    -d "{\"text\": $(python3 -c "import json,sys; print(json.dumps(sys.argv[1]))" "$TEXT")}"

/data/scripts/config.env — Credenziali centralizzate (non versionato)

TELEGRAM_TOKEN=...
TELEGRAM_CHAT_ID=...
ECOFLOW_EMAIL=...
ECOFLOW_PASSWORD=...
RCON_PASSWORD=...
BACKUP_UUID=...
FTP_HOST=...
FTP_USER=...
FTP_PASS=...
TELEGRAM_RELAY_TOKEN=...

Sviluppi futuri

  • Shelly Plug US Gen4 — misurazione watt in tempo reale, storico consumi e comando /watt nel bot Telegram. Codice pronto, in attesa del dispositivo fisico.
  • Notifiche UPS via bot — alert automatici al cambio di stato EcoFlow (passaggio a batteria, carica bassa, ripristino rete).
  • Agente AI locale — hardware dedicato per LLM locali, separato dall'OUMAX per non impattare i servizi già attivi.