Repovio installieren
Repovio installieren
Ein Beispiel für eine Neuinstallation auswählen. Erforderlich sind Docker Engine, Compose v2, öffentliches DNS und ein TLS-Reverse-Proxy. Für Repovio und Authentik getrennte HTTPS-Hostnamen verwenden. Private Anwendungsimages benötigen GHCR-Zugriff. Bestehende Installationen verwenden die zur Version passende Deployment- und PostgreSQL-Upgrade-Anleitung; ältere PostgreSQL-Volumes nicht mit diesen Neuinstallationsbeispielen verwenden.
Gemeinsame Konfiguration
Das gewählte YAML als compose.yml und folgende Werte als .env in einem privaten Verzeichnis speichern. Alle Platzhalter ersetzen. Für beide Repovio-Images denselben exakten Release-Tag auswählen. Datenbankpasswort und JWT-Schlüssel jeweils separat mit dem ersten Befehl erzeugen, den Verschlüsselungsschlüssel mit dem zweiten. Hexadezimale Datenbankpasswörter vermeiden URL-Kodierungsfehler.
openssl rand -hex 32
openssl rand -base64 32
REPOVIO_VERSION=REPLACE_WITH_EXACT_RELEASE_TAG
POSTGRES_PASSWORD=REPLACE_WITH_RANDOM_HEX_PASSWORD
AUTH_JWT_SECRET=REPLACE_WITH_RANDOM_HEX_SECRET
TOKEN_ENCRYPTION_KEY=REPLACE_WITH_BASE64_32_BYTE_KEY
Ohne OIDC
Dieser Stack verwendet lokale Konten. In Repovio die Ersteinrichtung abschließen und die erste Systemadministration anlegen. OIDC deaktiviert lassen; weitere Konten unter Administration → Benutzer erstellen.
services:
postgres:
image: postgres:18-alpine
restart: unless-stopped
environment:
POSTGRES_DB: repovio
POSTGRES_USER: repovio
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD}
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U repovio -d repovio']
interval: 5s
timeout: 5s
retries: 12
volumes:
- repovio-postgres:/var/lib/postgresql
migrate:
image: ghcr.io/repovio/repovio-api:${REPOVIO_VERSION:?Set an exact release version}
restart: 'no'
command: ['node_modules/.bin/prisma', 'migrate', 'deploy', '--config', 'prisma.config.ts']
environment: &api-environment
NODE_ENV: production
PORT: 3001
DATABASE_URL: postgresql://repovio:${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD}@postgres:5432/repovio?schema=public
SHADOW_DATABASE_URL:
postgresql://repovio:${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD}@postgres:5432/repovio_shadow?schema=public
AUTH_JWT_SECRET: ${AUTH_JWT_SECRET:?Set AUTH_JWT_SECRET}
TOKEN_ENCRYPTION_KEY: ${TOKEN_ENCRYPTION_KEY:?Set TOKEN_ENCRYPTION_KEY}
PUBLIC_URL: https://repovio.example.com
CORS_ORIGIN: https://repovio.example.com
depends_on:
postgres:
condition: service_healthy
api:
image: ghcr.io/repovio/repovio-api:${REPOVIO_VERSION:?Set an exact release version}
restart: unless-stopped
environment: *api-environment
depends_on:
migrate:
condition: service_completed_successfully
ports:
- '127.0.0.1:3001:3001'
web:
image: ghcr.io/repovio/repovio-web:${REPOVIO_VERSION:?Set an exact release version}
restart: unless-stopped
environment:
PORT: 3000
NUXT_PUBLIC_API_BASE_URL: https://repovio.example.com/api/v1
depends_on:
api:
condition: service_healthy
ports:
- '127.0.0.1:3000:3000'
volumes:
repovio-postgres:
Mit Authentik
Diesen vollständigen alternativen Stack verwenden, nicht beide Beispiele gleichzeitig. Folgende Authentik-Werte an .env anhängen; ein eigenes Datenbankpasswort und einen eigenen geheimen Schlüssel erzeugen. Die festgelegte Authentik-Version verwendet eine eigene PostgreSQL-Datenbank, Server und Worker; Redis und Docker-Socket werden für dieses OIDC-Beispiel nicht benötigt.
AUTHENTIK_POSTGRES_PASSWORD=REPLACE_WITH_SEPARATE_RANDOM_HEX_PASSWORD
AUTHENTIK_SECRET_KEY=REPLACE_WITH_RANDOM_HEX_SECRET
services:
postgres:
image: postgres:18-alpine
restart: unless-stopped
environment:
POSTGRES_DB: repovio
POSTGRES_USER: repovio
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD}
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U repovio -d repovio']
interval: 5s
timeout: 5s
retries: 12
volumes:
- repovio-postgres:/var/lib/postgresql
migrate:
image: ghcr.io/repovio/repovio-api:${REPOVIO_VERSION:?Set an exact release version}
restart: 'no'
command: ['node_modules/.bin/prisma', 'migrate', 'deploy', '--config', 'prisma.config.ts']
environment: &api-environment
NODE_ENV: production
PORT: 3001
DATABASE_URL: postgresql://repovio:${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD}@postgres:5432/repovio?schema=public
SHADOW_DATABASE_URL:
postgresql://repovio:${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD}@postgres:5432/repovio_shadow?schema=public
AUTH_JWT_SECRET: ${AUTH_JWT_SECRET:?Set AUTH_JWT_SECRET}
TOKEN_ENCRYPTION_KEY: ${TOKEN_ENCRYPTION_KEY:?Set TOKEN_ENCRYPTION_KEY}
PUBLIC_URL: https://repovio.example.com
CORS_ORIGIN: https://repovio.example.com
OIDC_CALLBACK_URL: https://repovio.example.com/api/v1/auth/oidc/callback
depends_on:
postgres:
condition: service_healthy
api:
image: ghcr.io/repovio/repovio-api:${REPOVIO_VERSION:?Set an exact release version}
restart: unless-stopped
environment: *api-environment
depends_on:
migrate:
condition: service_completed_successfully
ports:
- '127.0.0.1:3001:3001'
web:
image: ghcr.io/repovio/repovio-web:${REPOVIO_VERSION:?Set an exact release version}
restart: unless-stopped
environment:
PORT: 3000
NUXT_PUBLIC_API_BASE_URL: https://repovio.example.com/api/v1
depends_on:
api:
condition: service_healthy
ports:
- '127.0.0.1:3000:3000'
authentik-postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: authentik
POSTGRES_USER: authentik
POSTGRES_PASSWORD: ${AUTHENTIK_POSTGRES_PASSWORD:?Set AUTHENTIK_POSTGRES_PASSWORD}
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U authentik -d authentik']
interval: 5s
timeout: 5s
retries: 12
volumes:
- authentik-postgres:/var/lib/postgresql/data
authentik-server:
image: ghcr.io/goauthentik/server:2026.8.5
command: server
restart: unless-stopped
shm_size: 512mb
environment: &authentik-environment
AUTHENTIK_POSTGRESQL__HOST: authentik-postgres
AUTHENTIK_POSTGRESQL__NAME: authentik
AUTHENTIK_POSTGRESQL__USER: authentik
AUTHENTIK_POSTGRESQL__PASSWORD: ${AUTHENTIK_POSTGRES_PASSWORD:?Set AUTHENTIK_POSTGRES_PASSWORD}
AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY:?Set AUTHENTIK_SECRET_KEY}
depends_on:
authentik-postgres:
condition: service_healthy
ports:
- '127.0.0.1:9000:9000'
healthcheck:
test: ['CMD', 'ak', 'healthcheck']
interval: 30s
timeout: 10s
retries: 10
start_period: 90s
volumes:
- authentik-data:/data
- authentik-templates:/templates
authentik-worker:
image: ghcr.io/goauthentik/server:2026.8.5
command: worker
restart: unless-stopped
shm_size: 512mb
environment: *authentik-environment
depends_on:
authentik-postgres:
condition: service_healthy
healthcheck:
test: ['CMD', 'ak', 'healthcheck']
interval: 30s
timeout: 10s
retries: 10
start_period: 90s
volumes:
- authentik-data:/data
- authentik-templates:/templates
volumes:
repovio-postgres:
authentik-postgres:
authentik-data:
authentik-templates:
Proxy und Start
Beispielhostnamen im gesamten YAML, in Umgebungswerten und Proxy-Konfiguration ersetzen. Der Proxy läuft auf dem Docker-Host; beide Namen benötigen gültige TLS-Zertifikate. Bei einem Proxy im Container über ein gemeinsames Docker-Netzwerk statt dessen eigene Loopback-Adresse routen. Datenbankports privat halten.
repovio.example.com {
reverse_proxy /api/* 127.0.0.1:3001
reverse_proxy /socket.io/* 127.0.0.1:3001
reverse_proxy /mcp 127.0.0.1:3001
reverse_proxy 127.0.0.1:3000
}
auth.example.com {
reverse_proxy 127.0.0.1:9000
}
OIDC konfigurieren
Den Authentik-Hostnamen öffnen und die Ersteinrichtung für akadmin abschließen. Eine OAuth2/OpenID-Anwendung samt Provider mit Slug repovio, vertraulichem Client, Authorization-Code-Flow, Signaturschlüssel, providerspezifischem Issuer und exakt folgender strikter Redirect-URI erstellen. Scope-Mappings für openid, profile und email aufnehmen; das Profil-Mapping muss Gruppennamen im Claim groups liefern.
Issuer: https://auth.example.com/application/o/repovio/
Discovery: https://auth.example.com/application/o/repovio/.well-known/openid-configuration
Redirect URI: https://repovio.example.com/api/v1/auth/oidc/callback
Zuerst mit der lokalen Systemadministration bei Repovio anmelden. Unter Einstellungen → Authentifizierung Issuer, Client-ID und Client-Secret eintragen; groups als Gruppen-Claim und openid profile email als Scopes wählen. In Authentik Gruppen repovio-admins, repovio-managers und repovio-viewers erstellen und den entsprechenden Repovio-Rollen zuordnen. Konfiguration testen, OIDC aktivieren und danach eine Anmeldung ohne Administrationsrechte sowie ein nicht zugeordnetes Konto prüfen. Provider-Einstellungen werden in Repovio gespeichert, nicht über erfundene OIDC-Umgebungsvariablen. Die lokale Anmeldung bleibt zur Wiederherstellung verfügbar.
OIDC-Gruppen bestimmen ausschließlich globale Rollen. Lokale Zugriffsgruppen und direkte Repository-Zuweisungen gewähren separat Sichtbarkeit; Manager benötigen zusätzlich eine Manager-Zuweisung am Repository. Es gibt keine OIDC-Gruppensynchronisierung.
Prüfung und Upgrades
Aufgelöste Konfiguration ohne Ausgabe von Geheimnissen validieren, dann Stack starten. Migrationen, API-Health und Webzugriff prüfen; beim zweiten Beispiel zusätzlich Authentik-Health und OIDC-Anmeldung. .env privat halten und beide Datenbanken sowie Authentik-Volumes sichern. Bestehende Installationen behalten ihre Volume-Namen. Ältere Repovio-Versionen ignorieren Gruppenrechte: Ein Anwendungsrollback kann geerbte Zugriffe entziehen; direkte Zuweisungen bleiben bestehen.
chmod 600 .env
docker compose config --quiet
docker compose pull
docker compose up --detach --wait
docker compose logs migrate
curl --fail http://127.0.0.1:3001/api/health
Weitere Anleitungen
Weitere Anleitungen · Melden Sie sich an · Repovio · OIDC
Weitere Anleitungen: Authentik Compose · Authentik OIDC