Installazione con Docker
Docker è il modo consigliato per far girare Arenile in produzione. L’immagine ufficiale
ghcr.io/coste360/arenile è pubblica e gratuita, multi-architettura (amd64 e arm64) e basata su
distroless: contiene solo il binario, senza shell né pacchetti superflui.
Prima di iniziare
Sezione intitolata “Prima di iniziare”| Requisito | Indicazione |
|---|---|
| Server | Linux amd64 o arm64 con Docker e Docker Compose |
| Risorse | 1 vCPU e 512 MB di RAM bastano per un lido; 1 GB di disco più lo spazio per i backup |
| Dominio | Un sottodominio, ad esempio prenota.mio-lido.it, che punti all’IP del server (record A/AAAA) |
| Email (facoltativa) | Credenziali SMTP per conferme e link di gestione ai clienti |
| Pagamenti online (facoltativi) | Un account Stripe intestato allo stabilimento |
Installazione standard (SQLite)
Sezione intitolata “Installazione standard (SQLite)”-
Prepara il server. Su Ubuntu o Debian installa Docker con lo script ufficiale e apri solo le porte necessarie:
Finestra del terminale curl -fsSL https://get.docker.com | shsudo ufw allow OpenSSHsudo ufw allow 80/tcpsudo ufw allow 443/tcpsudo ufw enable -
Crea la cartella dell’installazione e scarica il compose ufficiale e il file di esempio delle variabili:
Finestra del terminale sudo mkdir -p /opt/arenile && cd /opt/arenilecurl -fsSLO https://raw.githubusercontent.com/coste360/arenile/main/deploy/docker-compose.ymlcurl -fsSL -o .env https://raw.githubusercontent.com/coste360/arenile/main/.env.examplechmod 600 .envDirectory/opt/arenile/
- docker-compose.yml il servizio
arenilecon il volume dei dati - .env la configurazione (non condividerla mai)
- docker-compose.yml il servizio
-
Genera la chiave di cifratura e mettila in
.env:Finestra del terminale openssl rand -base64 32Poi modifica
.envalmeno con queste righe:.env ARENILE_BASE_URL=https://prenota.mio-lido.itARENILE_SECRET_KEY=la-chiave-generata-al-passo-precedente# Primo utente owner, creato al primo avvio solo se il database è vuotoARENILE_BOOTSTRAP_OWNER_EMAIL=titolare@mio-lido.itARENILE_BOOTSTRAP_OWNER_NAME=Mario RossiARENILE_BOOTSTRAP_OWNER_ORG=Lido EsempioARENILE_ADMIN_PASSWORD=scegli-una-password-lunga# Email (facoltative ma consigliate)ARENILE_SMTP_URL=smtp://utente:password@smtp.mio-provider.it:587ARENILE_MAIL_FROM=Lido Esempio <prenotazioni@mio-lido.it> -
Avvia e controlla i log:
Finestra del terminale docker compose up -ddocker compose logs -f arenileLe migrazioni del database sono applicate in automatico all’avvio (
ARENILE_AUTO_MIGRATE=true). Il database SQLite, i file caricati e i backup vivono nel volumearenile-data. -
Configura HTTPS. Metti Arenile dietro un reverse proxy (Caddy, Nginx, Traefik) oppure lascia che sia il binario a ottenere i certificati: tutte le opzioni sono in Reverse proxy e HTTPS.
-
Accedi a
https://prenota.mio-lido.it/admin/con l’email e la password del passo 3. Dopo il primo accesso puoi togliereARENILE_ADMIN_PASSWORDda.env. Prosegui con il primo avvio.
Creare il primo utente a mano
Sezione intitolata “Creare il primo utente a mano”Se non vuoi usare le variabili ARENILE_BOOTSTRAP_OWNER_*, crea l’owner con il container avviato.
L’immagine non ha una shell, ma exec lancia direttamente il binario:
docker compose exec -e ARENILE_ADMIN_PASSWORD='scegli-una-password-lunga' arenile \ /arenile admin create --email titolare@mio-lido.it --name "Mario Rossi" --org "Lido Esempio"La password deve avere almeno 10 caratteri.
Varianti
Sezione intitolata “Varianti”Il repository include deploy/docker-compose.postgres.yml, con un servizio PostgreSQL già configurato e
DATABASE_URL impostata in automatico. In .env aggiungi la password del database, generata con soli
caratteri sicuri per un URL:
echo "POSTGRES_PASSWORD=$(openssl rand -hex 24)" >> .envdocker compose -f docker-compose.postgres.yml --env-file .env up -dQuando conviene PostgreSQL e come fare i backup: SQLite o PostgreSQL.
L’immagine arm64 gira su Raspberry Pi 4 o 5 (almeno 2 GB di RAM) e su mini PC.
- Installa un sistema a 64 bit (Raspberry Pi OS Lite 64 bit o Ubuntu Server arm64).
- Usa un SSD USB al posto della microSD per i dati: più veloce e molto più affidabile.
- Proteggi l’alimentazione con un piccolo gruppo di continuità.
- Per la prenotazione online il dispositivo deve essere raggiungibile da internet: valuta un tunnel (ad esempio Cloudflare Tunnel o Tailscale Funnel) invece di aprire porte sul router.
- Crea una risorsa Docker Compose con il template di
deploy/coolify/(arenile.ymloarenile-postgres.yml). - Imposta
ARENILE_BASE_URL,ARENILE_SECRET_KEYe le variabili del primo owner (il terminale di Coolify non funziona: l’immagine non ha una shell). - Associa il dominio al servizio sulla porta
8080: Coolify gestisce il certificato. - Configura l’healthcheck su
GET /healthze impostaARENILE_TRUSTED_PROXIEScon la rete del proxy.
- Crea un’app con persistent data e mappa
/datasu un volume (template indeploy/caprover/). - Immagine
ghcr.io/coste360/arenile:latest, porta del container8080. - Imposta le variabili d’ambiente come sopra, abilita HTTPS e “Force HTTPS”.
- Crea il primo owner con le variabili
ARENILE_BOOTSTRAP_OWNER_*e impostaARENILE_TRUSTED_PROXIES.
Cosa fa il compose ufficiale per la sicurezza
Sezione intitolata “Cosa fa il compose ufficiale per la sicurezza”Il file deploy/docker-compose.yml è già irrobustito: file system in sola lettura (read_only: true, con
/tmp in memoria), nessun privilegio aggiuntivo (no-new-privileges), tutte le capability Linux rimosse
(cap_drop: ALL), utente non root e rotazione dei log Docker (5 file da 10 MB).
Risoluzione dei problemi
Sezione intitolata “Risoluzione dei problemi”| Sintomo | Cosa controllare |
|---|---|
| Il container si riavvia in continuazione | docker compose logs arenile: di solito manca ARENILE_SECRET_KEY o ARENILE_BASE_URL, o la chiave non è base64 di 32 byte |
/readyz risponde con errore |
Database non raggiungibile o migrazioni non allineate: controlla DATABASE_URL e arenile migrate status |
| Il widget non compare nel sito | Aggiungi il dominio del sito ai siti autorizzati all’incorporamento (Pagina pubblica) |
| Le email non arrivano | Verifica ARENILE_SMTP_URL, ARENILE_MAIL_FROM, i record SPF/DKIM e il registro invii (Email) |
| Gli IP nei log sono tutti uguali | Imposta ARENILE_TRUSTED_PROXIES con la rete del reverse proxy |

