Installation - buenaventure/verkel GitHub Wiki

Server Setup mit Docker

Diese Anleitung basiert auf Ubuntu Server 22.04.

Installiere zuerst alle benötigten Pakete:

sudo apt install pwgen postgresql-14 docker.io nginx

Datenbank

Erstelle einen neuen User für Postgres. Ein sicheres Passwort dafür kannst du z.B. mit pwgen -s 16 generieren.

sudo -u postgres createuser -P verkel

Danach lege die Datenbank mit dem entsprechenden User als Besitzer an.

sudo -u postgres createdb -O verkel verkel

Damit aus dem Docker-Netz auf die Datenbank zugegriffen werden kann, müssen in der Server-Konfiguration /etc/postgresql/14/main/postgresql.conf die listen_addresses erweitert werden, die per default auf localhost beschränkt sind.

listen_addresses = 'localhost,172.17.0.1'

Außerdem muss in der Datei /etc/postgresql/14/main/pg_hba.conf folgende Zeile hinzugefügt werden.

host verkel verkel 172.17.0.1/16 md5

Jetzt Postgres neu starten, damit die Konfiguration aktiv wird.

sudo systemctl restart postgresql

Anwendung installieren

Erteile mit sudo usermod -a -G docker $USER deinem User die Rechte, Docker zu benutzen. Damit sie aktiv werden, musst du dich eventuell neu einloggen.

Die Anwendung benötigt für den Betrieb ein Secret, das wir initial generieren müssen. Es wird verwendet, um z.B. Cookies zu signieren und zu verschlüsseln, um sie so gegen Manipulation zu schützen. Erstelle einen temporären Container, in dem das Secret generiert wird.

docker run --rm ghcr.io/buenaventure/verkel:main bundle exec rails secret.

Durch das --rm-Flag wird er direkt danach automatisch gelöscht. Dieses Secret brauchen wir im nächsten Abschnitt.

Konfiguration

Um Verkel zu konfigurieren, muss ein .env-File erstellt werden, z.B. unter /etc/verkel/verkel.env. Es enthält alle Environment-Variablen, die für den Container gesetzt sein müssen. Dabei die Kommentare weglassen.

# IP der Datenbank, unter dieser IP erreicht man den Host aus dem Docker-Container
DATABASE_HOST=172.17.0.1
# User für die Datenbank
DATABASE_USER=verkel
# Das zuvor vergebene Passwort für den Datenbank-User
DATABASE_PASSWORD=s3cret
# Name der zuvor erstellten Datenbank
DATABASE_NAME=verkel
# hier das zuvor generierte Secret einfügen
SECRET_KEY_BASE=
# der Port, unter dem Verkel erreichbar sein soll
UPSTREAM_PORT=8080

Der hier verwendete Port sollte nicht öffentlich erreichbar sein! Im Abschnitt NGinX wird beschrieben, wie man Verkel mit NGinX als Reverse-Proxy erreichbar machen kann.

SystemD Service anlegen und starten

Damit der Container automatisch von SystemD gestarted wird, muss eine Service-Unit angelegt werden. Diese wird unter /etc/systemd/system/verkel.service mit folgendem Inhalt angelegt:

[Unit]
Description=verkel
After=docker.service
Requires=docker.service

[Service]
TimeoutStartSec=0
# hier referenzieren wir die Datei aus dem vorherigen Abschnitt
EnvironmentFile=/etc/verkel/verkel.env
ExecStartPre=-/usr/bin/docker kill verkel
ExecStartPre=-/usr/bin/docker rm verkel
ExecStart=/usr/bin/docker run --name verkel -p 127.0.0.1:${UPSTREAM_PORT}:3000 \
    --env-file /etc/verkel/verkel.env \
    ghcr.io/buenaventure/verkel:main
ExecStop=/usr/bin/docker stop verkel

[Install]
WantedBy=multi-user.target

Jetzt starte den Service mit sudo systemctl start verkel und überprüfe mit sudo systemctl status verkel, ob alles geklappt hat. Damit der Service bein nächsten Booten automatisch wieder gestartet wird, muss er mit sudo systemctl enable verkel enabled werden.

Datenbank-Schema laden und Admin-User anlegen

Mit docker exec -it verkel bundle exec rails db:schema:load initalisierst du die Datenbank und erstellst alle benötigten Tabellen usw.

Auch der altersabhängige Hungerfaktor muss initial einmal in die Datenbank geladen werden.

docker exec -it verkel bundle exec rails hunger_factor:import

Danach kannst du mit docker exec -it verkel bundle exec rails c auf eine interaktive Ruby-Console wechseln und den ersten Admin-User anlegen.

User.create(email: '[email protected]', password: 's3cr3tpwd', role: :admin)

NGinX

Um SSL zu nutzen, kann z.B. https://letsencrypt.org verwendet werden.

upstream verkel {
        server 127.0.0.1:8080;
}
server {
	listen 443 ssl;
        listen [::]:443 ssl;
        include snippets/ssl.conf;

	server_name verkel.example.com;

	location / {
 		try_files $uri @rails;
	}
	location @rails {
		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 https;
		proxy_set_header X-Forwarded-Server $host;
		proxy_set_header Host $http_host;
		proxy_redirect off;
		proxy_pass http://verkel;
        }
}

Konfiguration neu laden mit sudo nginx -s reload

Updates

Falls es eine neue Version auf GitHub gibt, kannst du sie lokal einfach aktualisieren. Zuerst mit docker pull ghcr.io/buenaventure/verkel:main das Docker-Image aktualisieren. Danach den Service mit systemctl restart verkel.service neu starten . Für den Fall, dass für die neue Version die Datenbank migriert werden muss, können diese Migrationen mit docker exec -it verkel bundle exec rails db:migrate ausgeführt werden.