Guida utente

Da una Debian fresca a un sito funzionante con HTTPS in circa dieci minuti. Poi le cose quotidiane — backup, PHP multi-versione, filtro outbound, troubleshooting.

1. Prerequisiti

  • Una macchina Debian 12 (bookworm) o Debian 13 (trixie) pulita: VPS, Raspberry Pi 4/5 con SSD, oppure un container LXC su Proxmox. 2 GB di RAM è il minimo sensato per uno o due siti PHP; un Pi 4 da 4 GB regge un cluster homelab senza problemi.
  • Accesso root. arx gira come root perché modifica /etc/nginx/, lancia useradd, nft, certbot.
  • Un IP pubblico con porte 80 e 443 raggiungibili dall'esterno (per Let's Encrypt e per servire i siti).
  • Almeno un hostname col DNS che punta alla macchina. Per convenzione panel.example.com per arx stesso più uno per ogni sito che ospiti.
Solo su macchine pulite. arx prende in mano nginx, PHP-FPM e Squid: fa puntare la loro configurazione di sistema ai file che genera in /srv/arx (/etc/nginx/conf.d/zz-arx.conf, un pool per sito in /etc/php/<ver>/fpm/pool.d/, un drop-in systemd che fa leggere a Squid /srv/arx/squid/squid.conf). Vhost, pool o regole Squid già presenti non vengono importati, e togliere arx non li rimette a posto.

2. Installa arx

Aggiungi il repo apt di NetForge, poi installa. apt risolve nginx, certbot, Squid (squid-openssl), nftables, GoAccess, e tutto il resto dello stack che arx gestisce. (Non BIND9 né Postfix — quelli sono di nomina e missus.) Se aggiorni una macchina che ha il pacchetto squid normale, usa apt full-upgrade (o apt install arx): il semplice apt upgrade lascia arx indietro.

curl -fsSL https://apt.netforge.it/netforge.asc \
    | sudo gpg --dearmor -o /usr/share/keyrings/netforge.gpg
echo "deb [signed-by=/usr/share/keyrings/netforge.gpg] https://apt.netforge.it/free $(. /etc/os-release; echo $VERSION_CODENAME) main" \
    | sudo tee /etc/apt/sources.list.d/netforge.list
sudo apt update
sudo apt install arx

Crea il primo admin e avvia il servizio:

sudo arx admin create iltuonome
sudo systemctl start arx
sudo systemctl status arx --no-pager

Il postinst crea /srv/arx/ (siti, stato, backup, certificati), genera un session secret a 256 bit in /etc/arx/env, e abilita tre timer: arx-renew (Let's Encrypt due volte al giorno), arx-refresh-cf-ips (range Cloudflare ogni settimana), arx-stats-refresh (GoAccess ogni giorno).

3. Primo login

arx si lega a 127.0.0.1:9443 di proposito — il pannello non è esposto sul mondo. Raggiungilo dal tuo portatile con un tunnel SSH:

ssh -L 9443:127.0.0.1:9443 root@tuo-server

Apri http://127.0.0.1:9443/ nel browser. Login con l'admin che hai creato, attiva 2FA su /account (consigliato).

Promuovi a HTTPS pubblico appena puoi: crea un sito di tipo reverse_proxy (vedi prossima sezione) che punti a 127.0.0.1:9443 con hostname panel.example.com. arx richiede un certificato Let's Encrypt e serve sé stesso in HTTPS — a quel punto puoi chiudere il tunnel SSH e usare l'URL del pannello.

4. Crea il primo sito

arx supporta tre tipi di sito. Scegli al click di + Nuovo sito su /sites:

TipoCosa fa nginxPer cosa
PHPServe i file da htdocs/, passa i .php a un pool PHP-FPM dedicatoWordPress, Laravel, PHP custom
StaticServe i file da htdocs/, restituisce 404 per quello che mancaOutput Hugo/Astro/Jekyll, SPA statiche
Reverse proxyInoltra ogni richiesta a un upstream — o bilancia su più backendmissus, nomina, app Node/Go, qualsiasi cosa con un proprio listener
Load balancing: un sito reverse proxy può distribuire il traffico su più backend con qualunque metodo nginx open-source — round-robin (default), least_conn, ip_hash (sticky per IP client), hash (sticky su una chiave a scelta, anche consistent) o random. Ogni backend accetta i parametri per-server weight, max_fails, fail_timeout, max_conns, più backup e down (per svuotare un nodo in manutenzione), e il pool può tenere aperte connessioni keepalive inattive. Il pool si modifica in qualsiasi momento dalla pagina di dettaglio del sito. Il rilevamento guasti è passivo (max_fails/fail_timeout): gli health check attivi richiedono NGINX Plus e non sono offerti qui.

Per ogni sito arx crea un utente Unix dedicato e una webroot isolata in /srv/arx/sites/<dominio>/htdocs/. L'utente possiede i suoi file; nginx li legge tramite group membership. Gli utenti di altri siti non possono leggere le webroot altrui.

Solo SFTP: puoi marcare un sito come "SFTP-only" — l'utente Unix riceve shell /usr/sbin/nologin e la home è chrootata. Utile quando dai accesso a un developer su un sito senza dargli shell sulla macchina.

5. SSL con Let's Encrypt

Ogni sito ha un pannello SSL. Click su Emetti certificato; arx lancia certbot --webroot contro /.well-known/acme-challenge/ sull'nginx live (zero downtime), salva il cert in /etc/letsencrypt/live/<dominio>/ e ricarica nginx.

Il timer systemd arx-renew.timer esegue arx ssl renew due volte al giorno con jitter di 1 h (stessa cadenza del certbot.timer standard). I rinnovi vengono deployati e nginx ricaricato in automatico.

Puoi anche caricare un certificato emesso a mano (intermediate + chiave + chain) dallo stesso pannello — utile per wildcard di altre CA.

6. PHP multi-versione

arx pre-configura il repo di Ondřej Surý (packages.sury.org/php) al momento dell'install, quindi tutte le versioni PHP da 7.x a 8.4 sono a un apt di distanza:

sudo apt install php8.4-fpm php8.4-mysql php8.4-curl php8.4-mbstring \
                 php8.4-xml php8.4-zip php8.4-gd php8.4-intl

Il pannello rileva ogni versione installata. Quando crei un sito PHP scegli la versione da un dropdown; arx genera un pool FPM per-sito sotto /srv/arx/php/pools/<versione>/<dominio>.conf e fa il symlink in /etc/php/<versione>/fpm/pool.d/.

Ogni pool riceve open_basedir, una directory tmp dedicata e un tuning FPM editabile per sito (preset minimal, light, wordpress, heavy, custom) — oppure lascia stare, i default vanno bene per il tipo di workload che hai scelto.

7. Filtro outbound per sito

Per default un sito ospitato può connettersi ovunque. Plugin WordPress, pacchetti Composer, API esterne — a volte utile, a volte un appiglio per un attaccante. arx filtra l'outbound a livello HTTP/HTTPS, per sito:

  • Squid SNI peek + nftables NAT per-UID — il TCP outbound dell'UID Unix del sito viene rediretto verso Squid; Squid sbircia l'SNI TLS e accetta solo gli hostname nell'allowlist del sito. Nessuna config dell'app, nessuna variabile proxy — è imposto a livello di rete, per UID.

Un'allowlist per sito in /srv/arx/whitelist/<dominio>.txt. Modifica, poi click su Applica — arx rigenera l'ACL Squid in modo atomico.

Profili: wordpress (api.wordpress.org, repo plugin, gravatar, ...), laravel, static, custom. Parti da un profilo e aggiungi quel che serve davvero al tuo sito.

Modalità learning: con il toggle in passthru + log verbose, lasci il sito girare un giorno, poi leggi quali hostname ha chiamato davvero e li trasformi in un'allowlist stretta. Molto meno tirar a indovinare.
Il filtro a livello DNS non è compito di arx. arx non tocca mai BIND — niente RPZ, niente zone. Se vuoi anche il blocco a livello DNS (NXDOMAIN per i nomi fuori lista), affianca ad arx nomina e configura lì la RPZ. I due coesistono puliti sulla stessa box.

8. Firewall

Il firewall di arx è solo in uscita: una tabella nftables, inet arx, generata in /srv/arx/nftables/arx.nft. L'utente di ogni sito passa dalla sua catena e raggiunge solo le destinazioni che autorizzi nella pagina del sito; con Squid acceso, il traffico web viene controllato per dominio. Il traffico di sistema (root, apt, SSH, nginx) non viene mai filtrato. Caricato a ogni avvio, e ricaricato entro un minuto se qualcosa svuota le regole.

Il firewall in ingresso della macchina è tuo. NetForge ha un template pronto per ogni combinazione di arx, nomina e missus (SSH aperto con limite per IP, 80/443, 53, porte della posta). Caricalo in modo che sostituisca solo la sua tabella, mai con flush ruleset, che toglierebbe anche quella di arx. La pagina System rules mostra tutte le tabelle della macchina, in sola lettura.

Per spegnerlo: il pulsante Turn off now del pannello, oppure nft delete table inet arx, toglie le regole di arx. Non può chiuderti fuori: arx non ha regole in ingresso.

9. Backup e migrazione

Tutto quello che arx possiede vive in /srv/arx/: webroot dei siti, state.db, cache certificati, sorgenti dei pool FPM, whitelist per sito. Il backup è rsync.

# sulla macchina sorgente
sudo rsync -aHAX --delete /srv/arx/ backup-host:/srv/arx-snapshot/

# sulla nuova macchina, dopo `apt install arx`
sudo rsync -aHAX backup-host:/srv/arx-snapshot/ /srv/arx/
sudo arx rehydrate

arx rehydrate legge /srv/arx/ e ricrea i side-effect che non vivono lì: utenti Unix per sito (useradd), i symlink dei pool FPM in /etc/php/<ver>/fpm/pool.d/, lo stub di include nginx, il ruleset nftables, e ricarica i demoni.

Per i tarball per sito, la pagina Backup dentro ogni sito impacchetta webroot + dump DB (se hai configurato un host DB) in un singolo <dominio>_<timestamp>.tar.gz in /srv/arx/backups/.

10. Troubleshooting

Prima fermata:

sudo arx check

Cammina sul filesystem, demoni, porte in ascolto, certificati SSL, e riporta ogni voce ✓ / ! / ✗. Quasi tutte le domande "perché non funziona?" hanno risposta chiara nell'output di arx check.

Log dei servizi:

sudo journalctl -u arx -n 100 --no-pager
sudo journalctl -u nginx -n 100 --no-pager
sudo journalctl -u php8.4-fpm -n 100 --no-pager

Log per sito (nginx access + error):

tail -f /srv/arx/logs/nginx/<dominio>/access.log
tail -f /srv/arx/logs/nginx/<dominio>/error.log

La dashboard Live del pannello (/system/live) aggrega connessioni attive nginx e request rate con i worker dei pool PHP-FPM per sito, aggiornata ogni pochi secondi.

Se devi rifare arx da zero: apt purge arx di proposito non cancella /srv/arx/. Anche le purge a cascata da rimozione di pacchetti non collegati lasciano i tuoi dati intatti. Per cancellare davvero, rimuovi le directory a mano — sudo rm -rf /srv/arx /etc/arx — è un'azione esplicita e deliberata che devi prendere tu.