Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file modified docker/sidekiq-entrypoint.sh
100644 → 100755
Empty file.
Empty file modified docker/web-entrypoint.sh
100644 → 100755
Empty file.
113 changes: 113 additions & 0 deletions systemd/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
# Installing dawarich with systemd

This guide is based on my experience setting up dawarich on Debian 12.

## Prerequisites

### Postgresql

You need a recent version of [Postgresql](https://www.postgresql.org/)
with [PostGIS](https://postgis.net/) support.

In Debian you can install it with
```sh
apt install postgresql-postgis
```

If you do not want to run the database on the same host as the
dawarich service, you need to reconfigure Postgresql to allow
connections from that host.

Dawarich will populate it's database itself and only needs a user
account to do so. This account needs to have superuser capabilities as
the database population includes enabling the postgis extention:
```sh
sudo -u postgres psql <<EOF
CREATE USER dawarich PASSWORD 'UseAStrongPasswordAndKeepItSecret';
ALTER USER dawarich WITH SUPERUSER;
EOF
```


### Redis

Install a recent version of [Redis](https://redis.io/).

In Debian you can install it with
```sh
apt install redis-server
```

If you do not want to run the redis service on the same host as the
dawarich service, you need to reconfigure redis to accept connection
from that host and most likely configure authentication.


### System User account

Create an account that will run the ruby services of dawarich. Of
course, you can choose another directory for it's HOME.

```sh
adduser --system --home /service/dawarich dawarich
```

### Ruby

Dawarich currently uses [Ruby](https://www.ruby-lang.org/) version
3.4.1 (yes, exactly this one). At least on Debian, this version is not
available at all in the package repositories. So I installed Ruby by
compiling from source:

```sh
apt install build-essential pkg-config libpq-dev libffi-dev libyaml-dev zlib1g-dev

# compile & install as unprivileged user
sudo -u dawarich bash

# download
cd ~
mkdir src
cd src
wget https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.1.tar.gz

# unpack
tar -xzf ruby-3.4.1.tar.gz
cd ~/ruby-3.4.1

# build & install
./configure --prefix $HOME/ruby-3.4.1
make all test install

# allow easy replacement of used ruby installation
ln -s ruby-3.4.1 ~dawarich/ruby

exit # sudo -u dawarich bash
```


## Install dawarich

0. Clone the repo to `/service/dawarich/dawarich` and install dependencies.
```sh
# install as unprivileged user
sudo -u dawarich bash

cd ~
git clone https://github.com/Freika/dawarich.git
cd dawarich

# install dependencies
bash systemd/install.sh

exit # sudo -u dawarich bash
```

0. Install, enable and start systemd services
```sh
# install systemd services
install systemd/dawarich.service systemd/dawarich-sidekiq.service /etc/systemd/system
systemctl daemon-reload
systemctl enable --now dawarich.service dawarich-sidekiq.service
systemctl status dawarich.service dawarich-sidekiq.service
```
14 changes: 14 additions & 0 deletions systemd/dawarich-sidekiq.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[Unit]
Description=DaWarIch SideKiq Service
Wants=network-online.target system-postgresql.slice redis-server.service
After=network-online.target system-postgresql.slice redis-server.service

[Service]
Type=simple
User=dawarich
WorkingDirectory=/service/dawarich/dawarich
EnvironmentFile=-/service/dawarich/dawarich/systemd/environment
ExecStart=/service/dawarich/dawarich/docker/sidekiq-entrypoint.sh sidekiq

[Install]
WantedBy=multi-user.target
14 changes: 14 additions & 0 deletions systemd/dawarich.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[Unit]
Description=DaWarIch Service
Wants=network-online.target system-postgresql.slice redis-server.service
After=network-online.target system-postgresql.slice redis-server.service

[Service]
Type=simple
User=dawarich
WorkingDirectory=/service/dawarich/dawarich
EnvironmentFile=-/service/dawarich/dawarich/systemd/environment
ExecStart=/service/dawarich/dawarich/docker/web-entrypoint.sh bin/rails server -p 3000 -b ::

[Install]
WantedBy=multi-user.target
34 changes: 34 additions & 0 deletions systemd/environment
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# this file is used by systemd, do not use $VAR as it won't be expanded!

# set PATH and GEM_HOME for locally installed ruby
PATH=/service/dawarich/ruby/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
GEM_HOME=/service/dawarich/ruby/lib/ruby/gems/3.4.0

# from docker/Dockerfile.dev
APP_PATH=/service/dawarich/dawarich
BUNDLE_VERSION=2.5.21
RAILS_LOG_TO_STDOUT=true
RAILS_PORT=3000
RAILS_ENV=development
SELF_HOSTED=true

# from docker/docker-compose.yml
RAILS_ENV=development
REDIS_URL=redis://localhost:6379/0
DATABASE_HOST=localhost
DATABASE_USERNAME=dawarich
DATABASE_PASSWORD=ayophaing8bafohnoeGa
DATABASE_NAME=dawarich
MIN_MINUTES_SPENT_IN_CITY=60
APPLICATION_HOSTS=localhost
TIME_ZONE=Europe/London
APPLICATION_PROTOCOL=http
DISTANCE_UNIT=km
PROMETHEUS_EXPORTER_ENABLED=false
PROMETHEUS_EXPORTER_HOST=0.0.0.0
PROMETHEUS_EXPORTER_PORT=9394
SELF_HOSTED=true

# Local variables:
# mode: sh
# End:
44 changes: 44 additions & 0 deletions systemd/install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#!/bin/bash

set -euo pipefail

dirname=${0%/*}
if [ "$dirname" != "systemd" ]; then
echo "This installed must be called in the repository root!" >&2
exit 1
fi

# make shellcheck happy (vars are defined in while loop below)
BUNDLE_VERSION=''
GEM_HOME=''
# "source" "$dirname"/environment and EXPORT all vars
# export all vars from env
envfile="$dirname"/environment
while IFS='#' read -r line; do
if [[ "$line" =~ ^([A-Z0-9_]+)=\"?(.*)\"?$ ]]; then
k=${BASH_REMATCH[1]}
v=${BASH_REMATCH[2]}
export "$k"="$v"
fi
done < "$envfile"

if [ "$APP_PATH" != "$PWD" ]; then
echo "Error: APP_PATH (defined in $envfile) != $PWD!" >&2
exit 1
fi

set -x

# from docker/Dockerfile.dev

# Update gem system and install bundler
gem update --system 3.6.2
gem install bundler --version "$BUNDLE_VERSION"
rm -rf "$GEM_HOME"/cache/*

# Install all gems into the image
bundle config set --local path 'vendor/bundle'
bundle install --jobs 4 --retry 3
rm -rf vendor/bundle/ruby/3.4.1/cache/*.gem

exit 0