Skip to content

Docker

There is a supplied docker image to make deploying a server as a container easier.

Terminal window
docker run -d -v "$HOME/.config/atuin:/config" ghcr.io/atuinsh/atuin:<LATEST TAGGED RELEASE> server start

Docker Compose

Using the already build docker image hosting your own Atuin can be done using the supplied docker-compose file.

Create a .env file next to docker-compose.yml with contents like this:

ATUIN_DB_NAME=atuin
ATUIN_DB_USERNAME=atuin
# Choose your own secure password
ATUIN_DB_PASSWORD=really-insecure

Create a docker-compose.yml:

version: '3.5'
services:
atuin:
restart: always
image: ghcr.io/atuinsh/atuin:<LATEST TAGGED RELEASE>
command: server start
volumes:
- "./config:/config"
links:
- postgresql:db
ports:
- 8888:8888
environment:
ATUIN_HOST: "0.0.0.0"
ATUIN_OPEN_REGISTRATION: "true"
ATUIN_DB_URI: postgres://$ATUIN_DB_USERNAME:$ATUIN_DB_PASSWORD@db/atuin
RUST_LOG: info,atuin_server=debug
postgresql:
image: postgres:14
restart: unless-stopped
volumes: # Don't remove permanent storage for index database files!
- "./database:/var/lib/postgresql/data/"
environment:
POSTGRES_USER: ${ATUIN_DB_USERNAME}
POSTGRES_PASSWORD: ${ATUIN_DB_PASSWORD}
POSTGRES_DB: ${ATUIN_DB_NAME}

Start the services using docker compose:

Terminal window
docker compose up -d

Using systemd to manage your atuin server

The following systemd unit file to manage your docker-compose managed service:

[Unit]
Description=Docker Compose Atuin Service
Requires=docker.service
After=docker.service
[Service]
# Where the docker-compose file is located
WorkingDirectory=/srv/atuin-server
ExecStart=/usr/bin/docker compose up
ExecStop=/usr/bin/docker compose down
TimeoutStartSec=0
Restart=on-failure
StartLimitBurst=3
[Install]
WantedBy=multi-user.target

Start and enable the service with:

Terminal window
systemctl enable --now atuin

Check if its running with:

Terminal window
systemctl status atuin

Creating backups of the Postgres database

You can add another service to your docker-compose.yml file to have it run daily backups. It should look like this:

backup:
container_name: atuin_db_dumper
image: prodrigestivill/postgres-backup-local
env_file:
- .env
environment:
POSTGRES_HOST: postgresql
POSTGRES_DB: ${ATUIN_DB_NAME}
POSTGRES_USER: ${ATUIN_DB_USERNAME}
POSTGRES_PASSWORD: ${ATUIN_DB_PASSWORD}
SCHEDULE: "@daily"
BACKUP_DIR: /db_dumps
volumes:
- ./db_dumps:/db_dumps
depends_on:
- postgresql

This will create daily backups of your database for that additional layer of comfort.

PLEASE NOTE: The ./db_dumps mount MUST be a POSIX-compliant filesystem to store the backups (mainly with support for hardlinks and softlinks). So filesystems like VFAT, EXFAT, SMB/CIFS, … can’t be used with this docker image. See https://github.com/prodrigestivill/docker-postgres-backup-local for more details on how this works. There are additional settings for the number of backups retained, etc., all explained on the linked page.