Skip to content

Self-host Keila

updated Sep 2026prices checked · Jul 2026Install verified on Ubuntu 26.04 · Sep 2026 · how we test
We earn commissions when you shop through the links below. Full disclosure →

An open-source newsletter tool with a visual and Markdown campaign editor, sign-up forms, contact segments and campaign analytics. It sends through SMTP or providers such as Amazon SES, SendGrid, Mailgun and Postmark.

Key facts

CategoryNewsletter
LicenseAGPL-3.0
StackElixir, Phoenix, PostgreSQL
Min RAM512 MB
Official imageyes
Measured idle RAM291 MB
Difficulty

What you need

  • Any VPS with at least 512 MB of RAM
  • A domain you control — most self-hosted setups need HTTPS in front of them
  • Under an hour if you've used Docker before
Where to host itaffiliate disclosure
Hetzner Cloudrun it on
From $23.59/mo · 2 vCPU / 4 GB / 80 GB · EU + US
Get Hetzner Cloud (opens in new tab)
Kamaterafree trial
From $4/mo · 1 vCPU / 1 GB / 20 GB · US + EU + Asia
Start free on Kamatera → (opens in new tab)
DigitalOceanalso works on
From $6/mo · 1 vCPU / 1 GB / 25 GB · US + EU + Asia
Deploy on DigitalOcean → (opens in new tab)

Paid link — we earn a commission if you shop through it.

Install

Run these commands on your server:

# Keila + Postgres — replace the MAILER_* values with your real SMTP account
cat > .env <<EOF
SECRET_KEY_BASE=$(openssl rand -hex 48)
POSTGRES_PASSWORD=$(openssl rand -hex 16)
EOF
cat > docker-compose.yml <<'EOF'
services:
  keila:
    image: pentacent/keila:0.30.3
    restart: unless-stopped
    ports: ["4000:4000"]
    depends_on: [postgres]
    environment:
      SECRET_KEY_BASE: ${SECRET_KEY_BASE}
      DB_URL: postgres://postgres:${POSTGRES_PASSWORD}@postgres/postgres
      URL_HOST: SERVER_IP
      MAILER_SMTP_HOST: smtp.example.com
      MAILER_SMTP_FROM_EMAIL: newsletter@example.com
      MAILER_SMTP_PASSWORD: change-me
  postgres:
    image: postgres:17-alpine
    restart: unless-stopped
    environment: { POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}" }
    volumes: ["pgdata:/var/lib/postgresql/data"]
volumes: { pgdata: }
EOF
docker compose up -d
# open http://SERVER_IP:4000 — the root user's password is in: docker compose logs keila

Head-to-head

More self-hosted tools

Newsletter

listmonk

A self-hosted newsletter and mailing-list manager distributed as a single Go binary backed by PostgreSQL. It handles subscriber lists, campaigns, templates and transactional mail sent through your own SMTP servers.
GoVuePostgreSQL
easyRead guide →
Wiki & docs

Wiki.js

A Node.js wiki with a modern admin area, Markdown and visual (WYSIWYG) editors, and a wide set of pluggable modules — local, social, and enterprise auth (LDAP, SAML, OIDC, CAS) with optional 2FA are all part of the free AGPL-3.0 build. It brings its own web server but no database: PostgreSQL is the recommended engine, and the other supported engines are slated to be dropped in the next major version.
Node.jsVuePostgreSQL
easyRead guide →
Backup

restic

A single-binary command-line backup program: deduplicated (content-defined chunking), encrypted (AES-256 with Poly1305-AES) and, since repository format v2, zstd-compressed snapshots, written straight to local disk, SFTP, S3-compatible storage, Backblaze B2, Azure, Google Cloud, its own REST server or anything rclone reaches. No daemon and no GUI upstream: you schedule it with cron or a systemd timer.
Go
easyRead guide →
Code hosting

Soft Serve

An SSH-first Git server you drive from a terminal UI: clone over SSH, HTTP or the Git protocol, browse repositories, files and commits without leaving the shell, and manage access entirely with SSH public keys. It has no pull requests, no issues and no web forge UI, so it sits alongside a hosted forge rather than replacing one.
Go
easyRead guide →

We use analytics cookies (Google Analytics, PostHog) to see which guides are useful. No ad networks, no cross-site tracking. See our privacy policy.