Skip to content
ArenileArenile
Coste360.itCoste360.it

Install with Docker

Docker is the recommended way to run Arenile in production. The official image ghcr.io/coste360/arenile is public and free, multi-architecture (amd64 and arm64) and based on distroless: it contains only the binary, with no shell or unnecessary packages.

Requirement Guidance
Server Linux amd64 or arm64 with Docker and Docker Compose
Resources 1 vCPU and 512 MB of RAM are enough for one beach; 1 GB of disk plus room for backups
Domain A subdomain, for example prenota.mio-lido.it, pointing to the server’s IP (A/AAAA record)
Email (optional) SMTP credentials for confirmations and manage links to customers
Online payments (optional) A Stripe account in the establishment’s name
  1. Prepare the server. On Ubuntu or Debian install Docker with the official script and open only the ports you need:

    Finestra del terminale
    curl -fsSL https://get.docker.com | sh
    sudo ufw allow OpenSSH
    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp
    sudo ufw enable
  2. Create the installation folder and download the official compose file and the example variables:

    Finestra del terminale
    sudo mkdir -p /opt/arenile && cd /opt/arenile
    curl -fsSLO https://raw.githubusercontent.com/coste360/arenile/main/deploy/docker-compose.yml
    curl -fsSL -o .env https://raw.githubusercontent.com/coste360/arenile/main/.env.example
    chmod 600 .env
    • Directory/opt/arenile/
      • docker-compose.yml the arenile service with the data volume
      • .env the configuration (never share it)
  3. Generate the encryption key and put it in .env:

    Finestra del terminale
    openssl rand -base64 32

    Then edit .env with at least these lines:

    .env
    ARENILE_BASE_URL=https://prenota.mio-lido.it
    ARENILE_SECRET_KEY=the-key-generated-in-the-previous-step
    # First owner user, created on first start only if the database is empty
    ARENILE_BOOTSTRAP_OWNER_EMAIL=owner@mio-lido.it
    ARENILE_BOOTSTRAP_OWNER_NAME=Mario Rossi
    ARENILE_BOOTSTRAP_OWNER_ORG=Lido Esempio
    ARENILE_ADMIN_PASSWORD=choose-a-long-password
    # Email (optional but recommended)
    ARENILE_SMTP_URL=smtp://user:password@smtp.my-provider.com:587
    ARENILE_MAIL_FROM=Lido Esempio <bookings@mio-lido.it>
  4. Start and check the logs:

    Finestra del terminale
    docker compose up -d
    docker compose logs -f arenile

    Database migrations are applied automatically at startup (ARENILE_AUTO_MIGRATE=true). The SQLite database, uploaded files and backups live in the arenile-data volume.

  5. Set up HTTPS. Put Arenile behind a reverse proxy (Caddy, Nginx, Traefik) or let the binary obtain the certificates: every option is in Reverse proxy and HTTPS.

  6. Sign in at https://prenota.mio-lido.it/admin/ with the email and password from step 3. After the first sign-in you can remove ARENILE_ADMIN_PASSWORD from .env. Continue with the first start.

If you prefer not to use the ARENILE_BOOTSTRAP_OWNER_* variables, create the owner with the container running. The image has no shell, but exec runs the binary directly:

Finestra del terminale
docker compose exec -e ARENILE_ADMIN_PASSWORD='choose-a-long-password' arenile \
/arenile admin create --email owner@mio-lido.it --name "Mario Rossi" --org "Lido Esempio"

The password must be at least 10 characters long.

The repository includes deploy/docker-compose.postgres.yml, with a PostgreSQL service already configured and DATABASE_URL set automatically. Add the database password to .env, generated with URL-safe characters only:

Finestra del terminale
echo "POSTGRES_PASSWORD=$(openssl rand -hex 24)" >> .env
docker compose -f docker-compose.postgres.yml --env-file .env up -d

When PostgreSQL is worth it and how to back it up: SQLite or PostgreSQL.

What the official compose file does for security

Section titled “What the official compose file does for security”

deploy/docker-compose.yml is already hardened: read-only file system (read_only: true, with /tmp in memory), no privilege escalation (no-new-privileges), all Linux capabilities dropped (cap_drop: ALL), non-root user and Docker log rotation (5 files of 10 MB).

Symptom What to check
The container keeps restarting docker compose logs arenile: usually ARENILE_SECRET_KEY or ARENILE_BASE_URL is missing, or the key is not 32 bytes of base64
/readyz returns an error Database unreachable or migrations out of date: check DATABASE_URL and arenile migrate status
The widget does not show on the website Add the website’s domain to the websites allowed to embed (Public page)
Emails do not arrive Check ARENILE_SMTP_URL, ARENILE_MAIL_FROM, the SPF/DKIM records and the delivery log (Email)
All IPs in the logs are the same Set ARENILE_TRUSTED_PROXIES to the reverse proxy’s network