تثبيت Repovio
تثبيت Repovio
اختر مثالاً لتثبيت جديد. يلزم Docker Engine وCompose v2 وDNS عام ووكيل عكسي TLS. استخدم اسمَي HTTPS منفصلين لـ Repovio وAuthentik. الصور الخاصة تتطلب صلاحية GHCR. للتثبيتات الحالية اتبع دليل النشر وترقية PostgreSQL المطابق للإصدار؛ لا تستخدم وحدات 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
تستخدم الحزمة حسابات محلية. أكمل الإعداد الأول لإنشاء مسؤول النظام الأول. اترك 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
استخدم هذه الحزمة البديلة الكاملة ولا تشغل المثالين معاً. أضف القيم التالية إلى .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 مشتركة بدلاً من loopback الخاص به. أبق منافذ قواعد البيانات خاصة.
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 بالمسؤول المحلي أولاً. في الإعدادات ← المصادقة أدخل المُصدر ومعرف العميل وسره واختر groups ونطاقات openid profile email. أنشئ repovio-admins وrepovio-managers وrepovio-viewers في Authentik واربط الأدوار. اختبر الإعداد ثم فعّل 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
إرشادات إضافية
إرشادات إضافية · تسجيل الدخول · Repovio · OIDC
إرشادات إضافية: Authentik Compose · Authentik OIDC