Zum Inhalt springen
Kontakt

Sebastian Nawrot
Dorneystr. 45
44149 Dortmund

Webentwicklung & Technik

Alf.io selbst hosten: Open-Source Ticketing auf dem eigenen Server

Installiere Alf.io auf deinem VServer. Inklusive Java 17 Setup, PostgreSQL Konfiguration und Lösung typischer Probleme.

Sebastian Nawrot
6 Min. Lesezeit
#Java#Alf.io#VServer#PostgreSQL#Self-Hosting#DevOps
Alf.io selbst hosten: Open-Source Ticketing auf dem eigenen Server

Im ersten Teil dieser Serie haben wir die Spring Boot Grundlagen kennengelernt. Jetzt wird es praktisch: Wir installieren Alf.io auf einem eigenen Server.

Als ich das zum ersten Mal versucht habe, bin ich in einige Fallen getappt - besonders mit Java auf meinem OVZ7-VServer. Diese Erfahrungen teile ich hier, damit du sie vermeiden kannst.

Warum selbst hosten?

Es gibt gute Gründe, Alf.io auf dem eigenen Server zu betreiben statt einen SaaS-Dienst zu nutzen:

  • Datenschutz - Teilnehmerdaten bleiben bei dir
  • Keine laufenden Kosten - Nur Server-Kosten, keine Gebühren pro Ticket
  • Volle Kontrolle - Eigene Domain, eigenes Branding, eigene Backups
  • Lernen - Perfekt um Java/Spring Boot im Produktionsbetrieb zu verstehen

Systemanforderungen

Bevor du startest, prüfe diese Voraussetzungen:

KomponenteMinimumEmpfohlen
Java1721 (LTS)
PostgreSQL1015+
RAM1 GB2+ GB
Disk5 GB10+ GB

Hinweis für OVZ7-VServer: OpenVZ-Container können Probleme mit Java machen. Die JVM erkennt manchmal den Host-RAM statt des Container-RAMs. Dazu später mehr.

Java 17 auf dem VServer installieren

Die Installation von OpenJDK ist straightforward - theoretisch. In der Praxis gibt es einige Stolperfallen.

Installation auf Ubuntu/Debian

sudo apt update
sudo apt install openjdk-17-jdk

Installation auf CentOS/RHEL

sudo yum install java-17-openjdk java-17-openjdk-devel

Java-Version prüfen

java -version

Erwartete Ausgabe:

openjdk version "17.0.x" 2024-xx-xx
OpenJDK Runtime Environment (build 17.0.x+x)
OpenJDK 64-Bit Server VM (build 17.0.x+x, mixed mode, sharing)

Meine OVZ7-Probleme mit Java

Hier wird es persönlich. Als ich Alf.io auf meinem OVZ7-VServer zum Laufen bringen wollte, hatte ich mehrere Probleme:

Problem 1: Mehrere Java-Versionen

Auf meinem Server waren Java 8, 11 und 17 installiert - und Java 8 war das Default. Alf.io braucht aber mindestens Java 17.

# Das war das Problem
java -version
# Ausgabe: openjdk version "1.8.0_xxx"

Lösung: update-alternatives

Mit update-alternatives kannst du die System-Standard-Version ändern:

sudo update-alternatives --config java

Das zeigt alle installierten Versionen:

Selection    Path                                      Priority   Status
------------------------------------------------------------
  0          /usr/lib/jvm/java-17-openjdk-amd64/bin/java   1711     auto mode
  1          /usr/lib/jvm/java-11-openjdk-amd64/bin/java   1111     manual mode
* 2          /usr/lib/jvm/java-8-openjdk-amd64/bin/java    1081     manual mode

Wähle die Java 17 Option (hier: 0 oder die entsprechende Nummer).

Das gleiche für javac:

sudo update-alternatives --config javac

Problem 2: JAVA_HOME nicht gesetzt

Obwohl Java lief, konnte Alf.io es nicht finden. Das Problem: JAVA_HOME war nicht korrekt gesetzt.

echo $JAVA_HOME
# Leer oder falsche Version

Lösung: JAVA_HOME global setzen

Setze JAVA_HOME in /etc/environment (nicht nur in .bashrc, das funktioniert nicht für Services):

sudo nano /etc/environment

Füge hinzu:

JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"

Dann neu laden:

source /etc/environment
echo $JAVA_HOME

Für Systemd-Services (wichtig!) muss JAVA_HOME auch in der Service-Datei stehen - dazu gleich mehr.

PostgreSQL einrichten

Alf.io braucht PostgreSQL, nicht MySQL. Die Row-Level-Security-Features werden aktiv genutzt.

Installation

# Ubuntu/Debian
sudo apt install postgresql postgresql-contrib

# CentOS/RHEL
sudo yum install postgresql-server postgresql-contrib
sudo postgresql-setup initdb

Datenbank und User erstellen

sudo -u postgres psql
-- Datenbank erstellen
CREATE DATABASE alfio;

-- User erstellen (KEIN SUPERUSER!)
CREATE USER alfio WITH ENCRYPTED PASSWORD 'sicheres_passwort';

-- Rechte vergeben
GRANT ALL PRIVILEGES ON DATABASE alfio TO alfio;

-- Wichtig: Connect-Rechte
\c alfio
GRANT ALL ON SCHEMA public TO alfio;

\q

Wichtig: Der User darf kein SUPERUSER sein! Alf.io nutzt Row Security Policies, die bei SUPERUSER-Rechten umgangen werden.

pg_hba.conf für lokale Verbindungen

Bearbeite /etc/postgresql/15/main/pg_hba.conf (Pfad kann variieren):

# IPv4 local connections:
host    alfio    alfio    127.0.0.1/32    scram-sha-256

PostgreSQL neu starten:

sudo systemctl restart postgresql

Verbindung testen:

psql -h localhost -U alfio -d alfio

Alf.io installieren

Download

Hole die neueste Version von GitHub Releases:

cd /opt
sudo mkdir alfio
cd alfio
sudo wget https://github.com/alfio-event/alf.io/releases/download/2.0-M5/alfio-2.0-M5-boot.war

Konfigurationsdatei erstellen

Erstelle /opt/alfio/application.properties:

# Datenbank
spring.datasource.url=jdbc:postgresql://localhost:5432/alfio
spring.datasource.username=alfio
spring.datasource.password=sicheres_passwort
spring.datasource.driver-class-name=org.postgresql.Driver

# Basis-URL (deine Domain)
alfio.base-url=https://tickets.deine-domain.de

# Admin-Zugangsdaten (werden beim ersten Start erstellt)
alfio.admin.username=admin
alfio.admin.password=admin_passwort

# Spring Profile
spring.profiles.active=jdbc-session

# Server-Port (intern, Nginx macht HTTPS)
server.port=8080

Erster Teststart

cd /opt/alfio
sudo java -jar alfio-2.0-M5-boot.war

Wenn alles funktioniert, siehst du:

Started AlfioBootApplication in xx seconds

Stoppe mit Ctrl+C und richte den Systemd-Service ein.

Als Systemd Service einrichten

Erstelle /etc/systemd/system/alfio.service:

[Unit]
Description=Alf.io Ticketing System
After=network.target postgresql.service

[Service]
User=www-data
Group=www-data

# JAVA_HOME hier setzen!
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
Environment="PATH=/usr/lib/jvm/java-17-openjdk-amd64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"

# Arbeitsverzeichnis
WorkingDirectory=/opt/alfio

# JVM Parameter - anpassen an deinen RAM!
ExecStart=/usr/lib/jvm/java-17-openjdk-amd64/bin/java \
    -Xms512m \
    -Xmx1024m \
    -jar alfio-2.0-M5-boot.war \
    --spring.config.location=file:/opt/alfio/application.properties

# Neustart bei Absturz
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Wichtig für kleine VServer: Passe -Xms und -Xmx an. Bei 2GB RAM sind 512m/1024m vernünftig. Bei 1GB RAM versuche 256m/512m.

Service aktivieren und starten:

sudo chown -R www-data:www-data /opt/alfio
sudo systemctl daemon-reload
sudo systemctl enable alfio
sudo systemctl start alfio

Status prüfen:

sudo systemctl status alfio
sudo journalctl -u alfio -f

Reverse Proxy mit Nginx

Alf.io sollte hinter einem Reverse Proxy laufen, der HTTPS terminiert.

Nginx Konfiguration

Erstelle /etc/nginx/sites-available/alfio:

server {
    listen 80;
    server_name tickets.deine-domain.de;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name tickets.deine-domain.de;

    # SSL (Let's Encrypt)
    ssl_certificate /etc/letsencrypt/live/tickets.deine-domain.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/tickets.deine-domain.de/privkey.pem;

    # SSL Settings
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        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 $scheme;

        # WebSocket Support für Live-Updates
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # Timeouts
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}

Aktivieren:

sudo ln -s /etc/nginx/sites-available/alfio /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

SSL mit Let's Encrypt

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d tickets.deine-domain.de

Troubleshooting

Java-Version-Konflikte

# Welches Java wird genutzt?
which java
readlink -f $(which java)

# Alle installierten Versionen
update-alternatives --list java

Alf.io startet nicht

Logs prüfen:

sudo journalctl -u alfio -n 100

Häufige Fehler:

  • Datenbank-Verbindung - PostgreSQL läuft? Passwort korrekt?
  • Port belegt - sudo lsof -i :8080
  • Memory-Fehler - -Xmx zu hoch für den Container

Memory-Probleme auf OVZ7

Wenn Java mit "Could not reserve enough space for object heap" abstürzt:

  1. Reduziere -Xmx in der Service-Datei
  2. Prüfe verfügbaren RAM: free -m
  3. Bei OVZ7: Die JVM sieht manchmal den Host-RAM statt Container-RAM
# JVM zwingen, weniger RAM zu nutzen
-XX:MaxRAM=1g

Fazit

Alf.io ist ein ausgereiftes Ticketing-System, das selbst zu hosten sich lohnt. Die größten Hürden sind:

  1. Java korrekt installieren - update-alternatives und JAVA_HOME beachten
  2. PostgreSQL richtig konfigurieren - Kein SUPERUSER!
  3. JVM-Speicher anpassen - Besonders auf kleineren VServern

Wenn es einmal läuft, ist es stabil. Die Alf.io-Community auf GitHub hilft bei Problemen.

Für mich war dieses Projekt der beste Weg, Java und Spring Boot praktisch zu lernen. Nichts lehrt besser als echten Produktionscode zu verstehen und zum Laufen zu bringen.


Weiterführende Links:

Möchtest du auch so einen Blog?

Ich entwickle moderne, SEO-optimierte Websites und Blogs mit Next.js, React und Tailwind CSS.