Self-Hosting Overview

Llamenos is designed to run on your own infrastructure. Self-hosting gives you full control over data residency, network isolation, and infrastructure choices — critical for organizations protecting against well-funded adversaries.

Deployment options

OptionBest forComplexityScaling
Docker ComposeSingle-server, recommended startLowSingle node
Kubernetes (Helm)Multi-service orchestrationMediumHorizontal (multi-replica)
Co-op CloudCo-op hosting collectivesLowSingle node (Swarm)

Docker Compose files

Docker Compose uses a layered approach:

FilePurpose
docker-compose.ymlBase configuration — all services, networks, volumes
docker-compose.production.ymlProduction overlay — TLS via Let’s Encrypt, log rotation, resource limits, strict CSP
docker-compose.test.ymlTest overlay — exposes app port directly, development mode

For local development, use the base file only. For production, stack the production overlay:

# Local
docker compose -f docker-compose.yml up -d

# Production
docker compose -f docker-compose.yml -f docker-compose.production.yml up -d

Or use the setup script, which handles this automatically:

./scripts/docker-setup.sh                                     # local
./scripts/docker-setup.sh --domain hotline.org --email a@b    # production

Core services

All deployment targets run these core services:

ComponentPurpose
Bun applicationHono API server + static file serving
PostgreSQLPrimary database
RustFSS3-compatible blob storage (voicemail, attachments, exports)
strfryNostr relay for real-time events
CaddyReverse proxy + automatic TLS (Docker Compose)
AuthentikIdentity provider — SSO, invite-based onboarding, MFA

What you need

Minimum requirements

  • A Linux server (2 CPU cores, 2 GB RAM minimum)
  • Docker and Docker Compose v2 (or a Kubernetes cluster for Helm)
  • A domain name pointing to your server
  • openssl (for generating secrets during setup)
  • At least one communication channel (voice provider, SMS, etc.)

Optional components

  • Whisper transcription — requires 4 GB+ RAM (CPU) or a GPU for faster processing
  • Asterisk — for self-hosted SIP telephony (see Asterisk setup)
  • Signal bridge — for Signal messaging (see Signal setup)

Quick comparison

Choose Docker Compose if:

  • You’re running on a single server or VPS
  • You want the simplest possible self-hosted setup
  • You’re comfortable with Docker basics

Choose Kubernetes (Helm) if:

  • You already have a K8s cluster
  • You need horizontal scaling (multiple replicas)
  • You want to integrate with existing K8s tooling (cert-manager, external-secrets, etc.)

Choose Co-op Cloud if:

  • You’re part of a tech co-op or hosting collective
  • You already use Docker Swarm + Traefik via abra
  • You want standardized recipe management with abra CLI
  • You need integrated backup via backupbot

Security considerations

Self-hosting gives you more control but also more responsibility:

  • Data at rest: PostgreSQL data is stored unencrypted by default. Use full-disk encryption (LUKS, dm-crypt) on your server, or enable PostgreSQL TDE if available. Note that call notes and transcriptions are already E2EE — the server never sees plaintext.
  • Network security: Use a firewall to restrict access. Only ports 80/443 should be publicly accessible.
  • Secrets: Never put secrets in Docker Compose files or version control. Use .env files (excluded from images) or Docker/Kubernetes secrets.
  • Updates: Pull new images regularly. Watch the changelog for security fixes.
  • Backups: Back up the PostgreSQL database and RustFS storage regularly. See the backup section in each deployment guide.

Next steps