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 |
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
- Configuration: full environment variable reference
- Authentication: set up OAuth and disable password login
- Backup: back up your Postgres data