Dies ist eine kleine Anleitung für mich selbst wie man Keygen selber hosten kann.
Die Anleitung von Keygen selbst ist eigentlich schon sehr ausführlich und gut beschrieben, allerdings finde ich es für mich immer sinnvoll, wenn man sich ein paar Notizen dazu macht.
Hauptsächlich geht es darum, wie man den Keygen Docker Container mit Postgres und Redis auf dem Host verbinden kann.

Ich benutze hierfür einen dezidierten Benutzer der den Keygen Container startet.

Voraussetzungen bzw. mein Basissetup

  • Debian 12+
  • Docker
  • Postgres 15
  • Redis
  • Apache2 als reverse Proxy

Dies ist alles bereits installiert und konfiguriert.
Ich werde hier nur die Anpassungen beschreiben.

Postgresql Setup

Um Keygen zu installieren muss ersten Docker auf den Server zugreifen können und zweitens braucht die Datenbank Extensions die von einem normalen Benutzer nicht installiert werden können.

Um Docker zu erlauben auf den Postgres Server zuzugreifen, muss ich zwei Konfigurationsdateien anpassen.
Als erstes muss ich bei postgresql.conf die listen_addresses von listen_addresses = 'localhost' auf listen_addresses = 'localhost, 172.17.0.1' ändern

nano /etc/postgresql/15/main/postgresql.conf

Als zweites dann in der pg_hba.conf Docker als zusätzlichen Host mit Zugriffsrechten eintragen.

nano /etc/postgresql/15/main/pg_hba.conf
host    all             all             172.17.0.1/16           scram-sha-256

Anschliesend muss der Postgresql Server neu gestartet werden.

Nun muss ich in der Datenbank selber noch die Extension pg_stat_statements installieren

su - postgres
psql -d database_name
CREATE EXTENSION IF NOT EXISTS "pg_stat_statements";

User erstellen

Als erstes erstelle ich mal eine Gruppe und einen User keygen, füge den User dann der docker Gruppe hinzu und wechsle zum Benutzer.

groupadd --system keygen
useradd -m -d /opt/keygen -s /bin/bash --system -g keygen keygen
usermod -aG docker keygen
su - keygen

Nun starte ich das Setup.
Anmerkung: Der Container wird nur für diesen Task gestartet weshalb die --rm Flag gesetzt wird.

docker run --add-host=host.docker.internal:host-gateway --rm -it -e SECRET_KEY_BASE="$(openssl rand -hex 64)" \
  -e ENCRYPTION_DETERMINISTIC_KEY="$(openssl rand -base64 32)" \
  -e ENCRYPTION_PRIMARY_KEY="$(openssl rand -base64 32)" \
  -e ENCRYPTION_KEY_DERIVATION_SALT="$(openssl rand -base64 32)" \
  -e DATABASE_URL="postgres://keygen:Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.:5432/database_name" \
  -e REDIS_URL="redis://host.docker.internal:6379" \
  -e KEYGEN_HOST="api.keygen.localhost" \
  -e KEYGEN_MODE="singleplayer" \
  -e KEYGEN_EDITION="CE" \
  keygen/api setup

Anschliessend habe ich folgendes ausgefüllt:

  • Account ID -> leer lassen (default)
  • Email -> sollte selbsterklärend sein
  • Password -> ebenfalls selbsterklärend

Die Ausgabe muss man sich notieren, da die Variablen zum starten des Containers benötigt werden.
Am besten copy-paste und direkt wieder einfügen bzw. ausführen.

Nun starte ich den permanenten Keygen Container.
Anmerkung: Ich starte den Container mit einer weiterleitung auf Port 3333 da ich 3000 bereits verwende.

docker run -ti -d --user "$(id -u):$(id -g)" --add-host=host.docker.internal:host-gateway --name keygen --restart always -p 127.0.0.1:3333:3000 -e SECRET_KEY_BASE="${SECRET_KEY_BASE}" \
  -e ENCRYPTION_DETERMINISTIC_KEY="${ENCRYPTION_DETERMINISTIC_KEY}" \
  -e ENCRYPTION_PRIMARY_KEY="${ENCRYPTION_PRIMARY_KEY}" \
  -e ENCRYPTION_KEY_DERIVATION_SALT="${ENCRYPTION_KEY_DERIVATION_SALT}" \
  -e DATABASE_URL="postgres://keygen:Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.:5432/database_name" \
  -e REDIS_URL="redis://host.docker.internal:6379" \
  -e KEYGEN_LICENSE_FILE_PATH="${KEYGEN_LICENSE_FILE_PATH}" \
  -e KEYGEN_LICENSE_KEY="${KEYGEN_LICENSE_KEY}" \
  -e KEYGEN_ACCOUNT_ID="${KEYGEN_ACCOUNT_ID}" \
  -e KEYGEN_EDITION="${KEYGEN_EDITION}" \
  -e KEYGEN_MODE="${KEYGEN_MODE}" \
  -e KEYGEN_HOST="${KEYGEN_HOST}" \
  -v /etc/keygen:/etc/keygen \
  keygen/api web