selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

aeterna logo

Self-host aeterna

v1.5.5

Dead man's switch for digital legacy messaging

ReleaseOpen SourceGPL-3.0
Updated7 hours ago
LanguageGo
Setup difficultyModerate
Stars
306
Ports
80 (HTTP proxy (nginx) serving frontend and API), 3000 (Backend API server), 5173 (Frontend development server (Vite))
Requires
SMTP server
Docker
ghcr.io/alpyxn/aeterna-backend
Install with Docker Compose
Dashboard showing switches overviewCreating a new dead man's switchSettings page for configurationSwitch creation interface

What is aeterna?

Aeterna is a self-hosted dead man's switch designed for end-of-life planning and digital legacy. Users write messages and attach files, then check in periodically via a web UI or email link. If check-ins stop, Aeterna automatically delivers the messages and attachments to designated recipients via email and can trigger webhooks for home automation or custom scripts. All data is encrypted at rest using AES-256-GCM, with the encryption key stored securely on the server and never exposed in environment variables. Attachments are automatically deleted after delivery for privacy. The software runs as a Go backend API and React frontend, using SQLite for storage. It can be deployed via an interactive install.sh script (which handles Nginx, Let's Encrypt SSL, and key generation), Docker Compose with published images from GHCR or Docker Hub, or compiled natively from source (Go 1.21+ and Node.js). SMTP settings are configured post-installation through the web UI. The project is licensed under GPL-3.0.

Should you self-host aeterna?

aeterna scores 48/100 on selfhost.directory (how scoring works) and ranks #18 of 38 in Personal Productivity. It has 306 GitHub stars.

It shipped 4 stable releases in the past year. The latest, v1.5.5, came out on 6 September 2026. New versions land roughly every 6 weeks.

Setup is moderate: expect some configuration beyond a single command. An official Docker image is available. It is GPL-3.0-licensed and written mostly in Go.

Its closest alternative on selfhost.directory is LanguageTool (75/100, 15 205 stars). It scores higher overall, so compare the two before you pick. See aeterna vs LanguageTool side by side.

Features

  • Auto-Cleanup
  • Automated installation wizard
  • Backup and update management
  • Dead man's switch
  • Email delivery
  • Encryption at Rest
  • File attachments
  • Heartbeat check-in
  • Reverse proxy templates
  • SQLite encryption (optional)Optional feature enabled via DB_ENCRYPTION_ENABLED=true
  • Webhook Integration

aeterna README

How to install aeterna

Install aeterna with Docker Compose

Docker and Docker Compose
Environment variables
DATABASE_PATH, ENV, ALLOWED_ORIGINS, BASE_URL, VITE_API_URL, DB_ENCRYPTION_ENABLED, DB_ENCRYPTION_AUTO_MIGRATE, DB_ENCRYPTION_KDF_CONTEXT_FILE, PROXY_MODE, DOMAIN, SERVER_IP

mkdir -p aeterna && cd aeterna mkdir -p data secrets openssl rand -base64 32 | tr -d '\n' > secrets/encryption_key chmod 600 secrets/encryption_key

SERVER_IP="$(curl -4fsS ifconfig.me || curl -4fsS icanhazip.com || true)" if [ -z "$SERVER_IP" ]; then echo "Could not detect public IPv4 automatically. Set SERVER_IP manually." >&2 exit 1 fi

cat > .env <<EOF

Use your public domain (recommended) or server IP

DOMAIN=${SERVER_IP} ENV=production VITE_API_URL=/api DB_ENCRYPTION_ENABLED=false DB_ENCRYPTION_AUTO_MIGRATE=true

Fixed path, do not change:

DB_ENCRYPTION_KDF_CONTEXT_FILE=./secrets/db_kdf_context

Must match exactly what you open in the browser

ALLOWED_ORIGINS=http://${SERVER_IP}:5000,http://localhost:5000,http://127.0.0.1:5000 BASE_URL=http://${SERVER_IP}:5000 PROXY_MODE=simple EOF

cat > docker-compose.yml <<'EOF' services: backend: image: ghcr.io/alpyxn/aeterna-backend:main env_file: - .env environment: - DATABASE_PATH=/app/data/aeterna.db - ENV=production - ALLOWED_ORIGINS=${ALLOWED_ORIGINS:-*} - BASE_URL=${BASE_URL:-http://${DOMAIN}:5000} command: ["./main", "--encryption-key-file=/run/secrets/encryption_key"] secrets: - encryption_key volumes: - ./data:/app/data - ./secrets:/app/secrets restart: always networks: - aeterna-net

frontend: image: ghcr.io/alpyxn/aeterna-frontend:main depends_on: - backend restart: always networks: - aeterna-net

proxy: image: nginx:alpine ports: - "5000:80" volumes: - ./proxy-simple.conf:/etc/nginx/conf.d/default.conf:ro depends_on: - backend - frontend restart: always networks: - aeterna-net

secrets: encryption_key: file: ./secrets/encryption_key

networks: aeterna-net: driver: bridge EOF

cat > proxy-simple.conf <<'EOF' server { listen 80; server_name localhost;

resolver 127.0.0.11 valid=30s;
set $backend_upstream http://backend:3000;

location / {
    proxy_pass http://frontend:80;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

location /api/ {
    proxy_pass $backend_upstream;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

} EOF

docker compose up -d

Uses published images from GHCR (ghcr.io/alpyxn/aeterna-backend:main and ghcr.io/alpyxn/aeterna-frontend:main). Docker Hub mirrors also available.

How to configure aeterna

  • ALLOWED_ORIGINSComma-separated list of allowed CORS origins (must match browser address bar exactly)

    Comma-separated list of allowed CORS origins (must match browser address bar exactly)

  • BASE_URLBase URL of the application (must match what you open in the browser)

    Base URL of the application (must match what you open in the browser)

  • DATABASE_PATH/app/data/aeterna.dbPath to the SQLite database file inside the container

    Path to the SQLite database file inside the container

  • DB_ENCRYPTION_AUTO_MIGRATEtrueAutomatically migrate between plain and encrypted database modes

    Automatically migrate between plain and encrypted database modes

    values: true, false

  • DB_ENCRYPTION_ENABLEDfalseEnable full SQLite database encryption

    Enable full SQLite database encryption

    values: true, false

  • DB_ENCRYPTION_KDF_CONTEXT_FILE./secrets/db_kdf_contextFixed path to the KDF context file for SQLite encryption key derivation

    Fixed path to the KDF context file for SQLite encryption key derivation

  • DOMAINPublic domain or server IP for the installation

    Public domain or server IP for the installation

  • ENVproductionEnvironment mode (production or development)

    Environment mode (production or development)

    values: production, development

  • PROXY_MODEsimpleProxy mode for the installation (simple or production)

    Proxy mode for the installation (simple or production)

    values: simple, production

  • SERVER_IPServer public IPv4 address (auto-detected if not set)

    Server public IPv4 address (auto-detected if not set)

  • VITE_API_URL/apiAPI URL path for the frontend

    API URL path for the frontend

aeterna releases & version history

More in Backup Management

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…