Sentry is a neat little program to report crashes. And it's the only thing available for flutter. So how do you selfhost this without a nightmare ?

First of all: Sentry is ~32 Containers. And it likes to eat a lot of RAM for doing nothing. Because who doesn't need multiple time series databases - especially if all you wanted was crash reports.

Anyway I disgress, let's get it starting. All of this assumes debian 11. I won't cover the nginx/apache setup, only wrangling the docker compose stuff.

Setup

Clone sentry somewhere. Probably sudo useradd sentry and then go to /home/sentry and perform a

git clone https://github.com/getsentry/self-hosted.git

Now if you've done that, edit the .env file as you like. My recommendation is to change the docker-compose.yml:

MAX_MEMORY_USAGE_RATIO: 0.1

Otherwise clickhouse will eat a lot of RAM for nothing, and your machine alerts might annoy you.

Running

Now we need docker compose. If you have that, you just run

# allow user sentry to run docker compose commands
sudo usermod -a -G docker sentry
# run stuff as user sentry
sudo -u sentry -g sentry bash
# install things
./install.sh
# start a test run inside the sentry user and setup prompted stuff
docker compose up

I didn't use -d here on purpose, kill it with Ctrl + C if that works and let us automate this.

Auto start

To automate the startup and updates, we want a new service file:

# /etc/systemd/system/sentry.service
[Unit]
Description=Sentry Host
Requires=docker.service
After=docker.service network-online.target
Wants=network-online.target

[Service]
User=sentry
Group=sentry
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/home/sentry/self-hosted
# prevent prompts, not perfect but works
ExecStartPre=/home/sentry/self-hosted/install.sh --report-self-hosted-issues --skip-commit-check --skip-user-creation
ExecStart=/usr/bin/docker compose up -d --remove-orphans
ExecReload=/usr/bin/docker compose up -d --remove-orphans
ExecStop=/usr/bin/docker compose down

[Install]
WantedBy=multi-user.target

Reload the systemd daemon and start it:

sudo systemctl daemon-reload
sudo systemctl start sentry

Afterwards you can check that it's running and check the logs:

sudo systemctl status sentry
sudo journalctl -u sentry -e

If you see something like

install.sh[1648810]: cp: cannot create regular file 'postgres/wal2json/wal2json.so': Permission denied

Then make sure that /home/sentry is fully owned by the sentry user:

sudo chown -R sentry:sentry /home/sentry

If all of this works, enable this for the next boot:

sudo systemctl enable sentry

Auto reloading

All of this is fine, but unless you auto-restart your VM every couple days, you might wanna restart this. Systemd timers to the rescue.

Let's create a restart unit:

# /etc/systemd/system/sentry_restart.service
[Unit]
Description=Sentry restart
Requires=docker.service
Wants=network-online.target
After=docker.service network-online.target

[Service]
Type=oneshot
ExecStart=/bin/systemctl restart sentry

And a timer unit to run this job:

# /etc/systemd/system/sentry_restart.timer
[Timer]
# or choose any other time frame for restarts
OnCalendar=weekly

[Install]
WantedBy=timer.target

Now enable it we run

sudo systemctl enable sentry_restart.timer
sudo systemctl start sentry_restart.timer

TLDR

The gist is to run the installer.sh, run sentry once for the manual stuff and then automate it via systemd units and a restart timer. Also you can't skip the install.sh, running docker compose pull + up will end in tears.