Self-Hosting

Self-Hosting

Run Tindra on your own infrastructure. One binary, one Postgres database.

Requirements

  • Docker 20.10+
  • 512 MB RAM minimum, 1 GB recommended

Install script

The fastest way to get up and running. Run this on the server you want to host Tindra on:

bash -c "$(curl -sSL https://install.tindra.sh)"

The script will ask you a few questions, then set everything up.

Tindra installer

? Hostname (e.g. tindra.yourcompany.com): tindra.yourcompany.com
? Install directory [/opt/tindra]:
? Database password [auto-generate]:
? Email provider (smtp/postmark/brevo/skip) [skip]:

Pulling images...
Starting Tindra...

Done. Tindra is running at https://tindra.yourcompany.com
Go to /register to create your admin account.

The installer creates a docker-compose.yml and .env file in the install directory, pulls the images, and starts the stack. Everything is in one place if you need to edit it later.

Reverse proxy: The installer sets up Tindra on port 9000. It does not configure a reverse proxy or TLS for you. See Reverse proxy below.

Manual install

If you prefer to set things up yourself, or need to integrate with existing infrastructure:

# docker-compose.yml
services:
  tindra:
    image: ghcr.io/blendbyte/tindra:latest
    restart: unless-stopped
    ports:
      - "9000:9000"
    environment:
      DATABASE_URL: postgres://tindra:secret@db/tindra
      PUBLIC_URL: https://your-hostname.example.com
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: tindra
      POSTGRES_USER: tindra
      POSTGRES_PASSWORD: secret
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "tindra"]
      interval: 5s
      retries: 5

volumes:
  pgdata:
docker compose up -d

Tindra runs at http://localhost:9000. Migrations run automatically on startup.

Environment variables

Required

Variable Description
DATABASE_URL Postgres connection string
PUBLIC_URL The public URL of your Tindra instance (used in emails and DSN generation)

Optional

Variable Default Description
BIND_ADDR 0.0.0.0:9000 Listen address
DATA_DIR /data Directory for attachments and other file storage
RETENTION_DAYS 90 How long to keep events

Email

Set EMAIL_PROVIDER to one of: smtp, postmark, brevo, ahasend, lettermint, cloudflare.

Each provider requires its own set of additional variables. See Authentication for OAuth-related email settings and Configuration for the full variable reference.

Reverse proxy

Run Tindra behind nginx or Caddy for TLS termination. Pass the X-Forwarded-Proto and X-Forwarded-For headers so Tindra sees real client IPs.

Caddy

your-hostname.example.com {
    reverse_proxy localhost:9000
}

Caddy handles TLS automatically.

nginx

server {
    listen 443 ssl;
    server_name your-hostname.example.com;

    location / {
        proxy_pass http://localhost:9000;
        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;
    }
}

Updating

docker compose pull
docker compose up -d

Migrations run on startup. Downtime is typically under a second.

First login

There is no default admin account. Go to https://your-hostname/register and create your account. The first user to register automatically receives all admin permissions.

Next steps