这一节用于把 SovereignID 跑起来,并确认它已经具备作为 OIDC Provider 的基础能力。 Gitea、New API 等业务系统接入前,先完成这里的检查。
一、准备运行环境
SovereignID 需要 Python 运行环境、PostgreSQL、Redis 和可用的发信服务。开发环境可以使用本机已有数据库与 Redis; 生产环境建议由统一基础设施提供数据库、缓存、反向代理和 HTTPS 证书。
| 依赖 | 用途 | 建议 |
|---|---|---|
| PostgreSQL | 保存用户、邮箱验证、OAuth2/OIDC 应用与授权数据。 | 生产环境使用独立数据库,并配置备份。 |
| Redis | 作为 Celery broker、result backend 和缓存基础设施。 | Web 与 Celery worker 必须连接同一组 Redis。 |
| SMTP | 发送登录验证码、邮箱验证和重发验证码邮件。 | 上线前先用真实邮箱完成一次验证流程。 |
| HTTPS 入口 | 对外提供稳定的 issuer、登录页和 OIDC 端点。 | 生产环境不要频繁变更 SOVEREIGNID_ISSUER_URL。 |
二、配置环境变量
从示例文件复制一份环境变量配置,并按实际部署环境修改。下面只列关键项,完整字段以项目根目录的
.env.example 为准。
DJANGO_SECRET_KEY=change-me-to-a-long-random-secret
DJANGO_DEBUG=False
DJANGO_ALLOWED_HOSTS=id.example.com
DJANGO_CSRF_TRUSTED_ORIGINS=https://id.example.com
SOVEREIGNID_ISSUER_URL=https://id.example.com
DATABASE_URL=postgres://user:password@postgres:5432/sovereignid
REDIS_URL=redis://:password@redis:6379/0
CELERY_BROKER_URL=redis://:password@redis:6379/1
CELERY_RESULT_BACKEND=redis://:password@redis:6379/2
EMAIL_HOST=smtp.example.com
EMAIL_PORT=465
EMAIL_HOST_USER=notice@example.com
EMAIL_HOST_PASSWORD=change-me
EMAIL_USE_SSL=True
EMAIL_FROM=notice@example.com
PHONE_VERIFICATION_EXPIRE_MINUTES=15
PHONE_VERIFICATION_PHONE_DAILY_LIMIT=10
PHONE_VERIFICATION_IP_HOURLY_LIMIT=20
PHONE_VERIFICATION_TRUST_X_FORWARDED_FOR=True
TENCENT_SECRET_ID=secret-id
TENCENT_SECRET_KEY=secret-key
TENCENT_SDK_APPID=1400000000
TENCENT_SMS_SIGN_NAME=短信签名
TENCENT_SMS_TEMPLATE_ID=模板ID
ALIBABA_CLOUD_ACCESS_KEY_ID=access-key-id
ALIBABA_CLOUD_ACCESS_KEY_SECRET=access-key-secret
ALIYUN_SMS_SIGN_NAME=短信签名
ALIYUN_SMS_TEMPLATE_CODE=SMS_123456789
OIDC_RSA_PRIVATE_KEY=-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----\n
SOVEREIGNID_ISSUER_URL 是 OIDC issuer,也是 discovery、JWKS、userinfo 等端点返回 URL 的根地址。
它必须和用户访问的公网地址、业务系统填写的自动发现 URL 保持同一个 origin。
开发环境可用下面的命令生成测试用 RSA 私钥,并把换行转义为 \n 后填入环境变量。
openssl genrsa 2048 | awk '{printf "%s\\n", $0}'
三、初始化数据库和管理员
首次启动前执行数据库迁移,并创建一个管理员账号,用于进入 Django Admin 或后续的应用管理页面。
conda run -n SovereignID python manage.py migrate
conda run -n SovereignID python manage.py createsuperuser
四、启动 Web 和 Celery
Web 进程负责登录、自动注册、授权和 OIDC 端点;Celery worker 负责异步发送验证邮件。 两个进程需要使用同一份环境变量。
conda run -n SovereignID python manage.py runserver 0.0.0.0:8000
conda run -n SovereignID celery -A SovereignID worker -l info
容器化或生产部署时,也需要保持同样的进程边界:至少一个 Web 服务和一个 Celery worker, 并确保静态文件、数据库、Redis、邮件配置都已经就绪。
五、基础验收
- 访问 SovereignID 首页和文档中心,页面可以正常打开。
- 管理员可以登录后台,并能管理用户、用户组和 OIDC 应用。
- 新邮箱或手机号可以收到登录验证码,请求验证码时数据库中尚未创建用户。
- 验证码校验成功后自动创建账号并完成登录;手机号账号绑定验证邮箱后才允许继续 OIDC 授权。
- 访问
<SOVEREIGNID_ISSUER_URL>/.well-known/openid-configuration能看到 discovery JSON。 - discovery JSON 中的
issuer与SOVEREIGNID_ISSUER_URL完全一致。
六、下一步
快速开始完成后,再为具体业务系统创建 OIDC 应用。接入 Gitea 时,需要把 Gitea 回调地址登记到 SovereignID, 然后在 Gitea 管理后台添加 OpenID Connect 认证源。