安装 Repovio
安装 Repovio
为全新安装选择一个示例。需要 Docker Engine、Compose v2、公共 DNS 和 TLS 反向代理。Repovio 与 Authentik 使用不同的 HTTPS 主机名。私有镜像需要 GHCR 访问权限。现有部署必须遵循对应版本的部署及 PostgreSQL 升级指南;不要在这些全新安装示例中重用旧数据库卷。
通用配置
将所选 YAML 保存为 compose.yml,将以下配置保存到私有目录的 .env。替换全部占位符,两张 Repovio 镜像使用相同的精确发行标签。用第一条命令分别生成数据库密码和 JWT 密钥,用第二条生成加密密钥。十六进制密码可避免 URL 编码错误。
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
不使用 OIDC
此堆栈使用本地账户。在 Repovio 完成首次设置并创建首位系统管理员。保持 OIDC 关闭,在管理 → 用户中创建其他账户。
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:
使用 Authentik
使用此完整替代堆栈,不要同时运行两个示例。将以下 Authentik 配置追加到 .env,并单独生成数据库密码与密钥。固定版本使用独立 PostgreSQL、服务器和工作进程;此 OIDC 示例不需要 Redis 或 Docker 套接字。
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:
代理与启动
替换 YAML、环境配置与代理中的示例域名。代理运行于 Docker 主机,两域名均须有效 TLS 证书。如果代理位于容器内,使用共享 Docker 网络,不要使用容器自身回环地址。不要公开数据库端口。
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
打开 Authentik 并完成 akadmin 初始设置。创建 OAuth2/OpenID 应用及提供程序:slug 为 repovio,使用机密客户端、授权码流程、签名密钥、按提供程序划分的发行者,以及下面的精确严格重定向 URI。包含 openid、profile、email 映射,并确保 profile 在 groups 声明返回组名。
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
先用本地管理员登录 Repovio。在设置 → 身份验证中输入发行者、客户端 ID 与密钥,选择 groups 声明及 openid profile email 范围。在 Authentik 创建 repovio-admins、repovio-managers、repovio-viewers 并映射对应角色。测试配置后启用 OIDC,再检查非管理员及未分配账户。提供程序配置存储于 Repovio,而非虚构 OIDC 环境变量。本地登录仍可用于恢复。
OIDC 组映射仅决定全局角色。本地访问组与直接仓库分配单独授予仓库可见性;经理还需要仓库的 Manager 权限。不执行 OIDC 组同步。
验证与升级
验证展开的配置但不输出密钥,然后启动。检查迁移、API 健康和网页,第二个示例还需验证 Authentik 健康与 OIDC 登录。保护 .env,备份两套数据库和 Authentik 卷。现有部署保持原卷名。旧版本忽略组权限,回退应用可能移除继承访问,但保留直接分配。
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
更多指南
更多指南: Authentik Compose · Authentik OIDC