feat: let administrators view and copy encrypted integration credentials

This commit is contained in:
2026-09-27 13:48:26 +08:00
parent 5555a7b342
commit d54bdd9847
38 changed files with 905 additions and 71 deletions

View File

@@ -1,6 +1,7 @@
#!/usr/bin/env python3
"""部署持久化的本地联调环境;私密配置只保存在 .local/compose-test。"""
import datetime
import base64
import json
import os
from pathlib import Path
@@ -86,12 +87,22 @@ def setup():
'ORBIT_BUILD_TIME': datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ')})
private_write(PRIVATE / 'admin.password', secrets.token_urlsafe(24) + '\n')
values = settings()
key_file = PRIVATE / 'credential-keys.json'
if not key_file.exists():
# 已启用后丢失主密钥,必须恢复备份,不能生成替代密钥使已有密文不可读。
key_volumes = subprocess.check_output(['docker', 'volume', 'ls', '--filter', 'name=orbit-test_orbit-keys', '-q'], text=True).strip()
if values.get('ORBIT_CREDENTIAL_VAULT_INITIALIZED') or key_volumes:
raise RuntimeError('Token 保管密钥缺失,请恢复 credential-keys.json;不会替换既有密钥。')
private_write(key_file, json.dumps({'active': 'local-v1', 'keys': {'local-v1': base64.b64encode(secrets.token_bytes(32)).decode()}}) + '\n')
values['ORBIT_CREDENTIAL_VAULT_INITIALIZED'] = '1'
values['ORBIT_BUILD_REVISION'] = subprocess.check_output(
['git', 'rev-parse', 'HEAD'], cwd=ROOT, text=True).strip()
save_settings(values)
compose('config', '--quiet')
compose('build', 'orbit')
compose('up', '-d', 'mysql', 'verify', 'archive-init')
# 完成构建后再优雅停止旧写节点,避免迁移期间混用凭据存储版本。
compose('stop', 'orbit')
compose('up', '-d', 'mysql', 'verify', 'archive-init', 'credential-key-init')
# 显式再核验一次,失败不初始化身份、不启动流量。
compose('run', '--rm', '-T', '--no-deps', 'verify')
if not CREDENTIALS.exists():