Debian & Ubuntu

Debian & Ubuntu

Install Tindra as a native package from freshdeb, our APT repository. No Docker needed. You get a systemd service, a local Postgres database, and your first account, all set up by the installer.

Supported systems

  • Debian 12 (bookworm) and 13 (trixie)
  • Ubuntu 22.04 (jammy), 24.04 (noble) and 26.04 (resolute)
  • amd64 and arm64

The repository follows every Tindra release, so apt upgrade keeps you current.

Install

1. Trust the signing key

You only do this once per machine:

sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.freshdeb.com/freshdeb-archive-keyring.gpg \
  | sudo tee /etc/apt/keyrings/freshdeb-archive-keyring.gpg >/dev/null

Check the fingerprint:

gpg --show-keys --with-fingerprint /etc/apt/keyrings/freshdeb-archive-keyring.gpg

It must be 3BBD F03A 9C0B F890 F8CA 9510 7595 CC55 468F 3161. If it isn't, delete the file and stop.

2. Add the repository

sudo tee /etc/apt/sources.list.d/freshdeb-tindra.sources >/dev/null <<EOF
Types: deb
URIs: https://deb.freshdeb.com/tindra
Suites: $(. /etc/os-release && echo $VERSION_CODENAME)
Components: main
Signed-By: /etc/apt/keyrings/freshdeb-archive-keyring.gpg
EOF

The shell fills in your release's codename when you paste this.

3. Install Tindra

sudo apt update
sudo apt install tindra

apt installs postgresql along with it, as a recommended package. Skip it with --no-install-recommends if your database lives on another server.

Setup questions

The installer asks a few questions:

Question What it does
Public URL The address users and SDKs reach Tindra at, e.g. https://tindra.example.com. An https:// URL turns on secure cookies.
Port The port Tindra listens on. Default 8080.
Reverse proxy on this machine? Yes: Tindra listens on 127.0.0.1 only and trusts the local proxy. No: it listens on all interfaces and asks for your proxy addresses.
Local database? Yes: creates a tindra role and database on this machine's Postgres, with a random password. No: asks for a DATABASE_URL.
First account Email, name and password (12 characters or more) of your admin account. Leave the email empty to skip it.

The installer then runs the migrations, creates your account, and starts the tindra service. Check it's up:

systemctl status tindra
curl --fail http://127.0.0.1:8080/healthz

Left the URL empty? Tindra isn't started until it has a public URL and a database. Run sudo dpkg-reconfigure tindra when you're ready.

The account password is only used once. It's removed from debconf as soon as the account exists.

Reverse proxy

Tindra serves plain HTTP. Put Caddy or nginx in front for TLS. With Caddy on the same machine, this is the whole config:

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

The Self-Hosting guide has an nginx example and explains TRUSTED_PROXIES. The package ships both examples in /usr/share/doc/tindra/README.Debian too.

Configuration

Settings live in /etc/tindra/tindra.env, owned by root:tindra with mode 0640.

dpkg-reconfigure tindra manages PUBLIC_URL, BIND_ADDR, TRUSTED_PROXIES, COOKIE_SECURE and DATABASE_URL. Change those by running it again:

sudo dpkg-reconfigure tindra

Add anything else (email, SSO, retention, limits) to the file yourself. Upgrades and dpkg-reconfigure keep your additions. /usr/share/doc/tindra/examples/env.example lists every option, and Configuration explains them. Then restart:

sudo systemctl restart tindra

Only changed PROJECT_LIMIT, EVENT_LIMIT or USER_LIMIT? sudo systemctl reload tindra applies them without a restart.

Prefer a Unix socket? Set BIND_ADDR=unix:/run/tindra/tindra.sock. dpkg-reconfigure leaves a socket alone.

Running the CLI

Run CLI commands as the tindra user. They read the same configuration file as the service:

sudo -u tindra tindra users create --email you@example.com --name "Your Name"
sudo -u tindra tindra users send-password-reset you@example.com

Wherever the docs show docker compose exec tindra /tindra ..., use sudo -u tindra tindra ... instead. Bash completion is included.

Unattended installs

Preseed the answers, then install. Put this in answers.txt:

tindra tindra/public_url string https://tindra.example.com
tindra tindra/port string 8080
tindra tindra/local_proxy boolean true
tindra tindra/local_database boolean true
tindra tindra/admin_email string you@example.com
tindra tindra/admin_name string Your Name
tindra tindra/admin_password password your-password-of-12-or-more-characters
sudo debconf-set-selections answers.txt
sudo DEBIAN_FRONTEND=noninteractive apt install -y tindra
rm answers.txt

For an external database, set tindra/local_database to false and add tindra tindra/database_url string postgres://.... For a proxy on another machine, set tindra/local_proxy to false and list its addresses in tindra/trusted_proxies.

Updating

sudo apt update
sudo apt install --only-upgrade tindra

A regular sudo apt upgrade works too. The package runs the migrations and restarts the service. Back up first and read the Upgrades notes for the target version. To stay on your current version, run sudo apt-mark hold tindra.

Backup

Back up the database, the data directory (source maps, attachments) and your configuration. This assumes the local database the installer created:

sudo systemctl stop tindra
sudo -u postgres pg_dump -Fc tindra > tindra-db.dump
sudo tar -czf tindra-files.tar.gz -C / etc/tindra var/lib/tindra
sudo systemctl start tindra

Stopping Tindra first keeps the dump and the files in sync. tindra-files.tar.gz contains your database password, so keep it private.

Restoring on the same machine

sudo systemctl stop tindra
sudo -u postgres dropdb --force --if-exists tindra
sudo -u postgres createdb -O tindra tindra
sudo -u postgres pg_restore -d tindra --no-owner --role=tindra < tindra-db.dump
sudo tar -xzf tindra-files.tar.gz -C /
sudo systemctl start tindra

Restoring on a new machine

Install the package and let it set up a local database. Then follow the steps above, but extract only the data directory, so the new database password stays in place:

sudo tar -xzf tindra-files.tar.gz -C / var/lib/tindra

Copy any settings you added from the old tindra.env by hand. Keep the new DATABASE_URL.

Uninstalling

sudo apt purge tindra

Purging removes /etc/tindra and /var/lib/tindra, but not the database. Drop that too if you're done with it:

sudo -u postgres dropdb tindra
sudo -u postgres dropuser tindra

Files

Path What it is
/usr/bin/tindra The server and CLI, web UI included
/etc/tindra/tindra.env Configuration
/var/lib/tindra Data directory: source maps and attachments
tindra.service The systemd unit, running as the tindra user
/usr/share/doc/tindra/README.Debian Package notes and proxy examples
/usr/share/doc/tindra/examples/env.example Every configuration option