docs(readme): 更新 README docker-compose 以包含环境变量配置说明

This commit is contained in:
cnlimiter
2026-03-17 18:36:40 +08:00
parent 0c0dba5755
commit e2e5c4a232
6 changed files with 110 additions and 8 deletions

19
.env.example Normal file
View File

@@ -0,0 +1,19 @@
# OpenAI 自动注册系统 - 环境变量配置示例
# 复制此文件为 .env 并填写对应值
# ── Web UI 监听地址 ──────────────────────────────────────────
# 监听主机(默认 0.0.0.0
# APP_HOST=0.0.0.0
# 监听端口(默认 8000
# APP_PORT=8000
# Web UI 访问密钥(默认 admin123强烈建议修改
# APP_ACCESS_PASSWORD=your_secret_password
# ── 数据库 ───────────────────────────────────────────────────
# 本地 SQLite默认无需配置
# APP_DATABASE_URL=data/database.db
# 远程 PostgreSQL优先
# APP_DATABASE_URL=postgresql://user:password@host:5432/dbname

View File

@@ -63,17 +63,37 @@ jobs:
contents: write
steps:
- name: 检出代码(获取附加文件)
uses: actions/checkout@v4
- name: 下载所有构建产物
uses: actions/download-artifact@v4
with:
path: dist/
- name: 整理文件
- name: 整理文件并打包 zip
run: |
mkdir -p release
# 为每个平台二进制文件打包成 zip
find dist/ -type f | while read f; do
name=$(basename "$f")
cp "$f" "release/$name"
# 根据文件名确定平台标识
case "$name" in
*windows*) platform=$(echo "$name" | sed 's/\.[^.]*$//') ;;
*linux*) platform="$name" ;;
*macos*) platform="$name" ;;
*) platform="$name" ;;
esac
tmpdir="tmp_${platform}"
mkdir -p "$tmpdir"
cp "$f" "$tmpdir/"
cp README.md "$tmpdir/README.md"
cp .env.example "$tmpdir/.env.example"
[ -f LICENSE ] && cp LICENSE "$tmpdir/LICENSE" || true
cd "$tmpdir"
zip -r "../release/${platform}.zip" .
cd ..
rm -rf "$tmpdir"
done
ls -lh release/
@@ -83,7 +103,7 @@ jobs:
files: release/*
generate_release_notes: true
body: |
## OpenAI/Codex CLI 自动注册系统
## OpenAI 自动注册系统 v2
### 下载说明
| 平台 | 文件 |
@@ -102,4 +122,10 @@ jobs:
# 指定端口
./codex-register --port 8080
# 调试模式(热重载)
./codex-register --debug
# 设置 Web UI 访问密钥
./codex-register --access-password mypassword
```

View File

@@ -77,6 +77,23 @@ uv sync
pip install -r requirements.txt
```
### 环境变量配置(可选)
复制 `.env.example``.env`,按需填写:
```bash
cp .env.example .env
```
| 变量 | 说明 | 默认值 |
|------|------|--------|
| `APP_HOST` | 监听主机 | `0.0.0.0` |
| `APP_PORT` | 监听端口 | `8000` |
| `APP_ACCESS_PASSWORD` | Web UI 访问密钥 | `admin123` |
| `APP_DATABASE_URL` | 数据库连接字符串 | `data/database.db` |
> 优先级:命令行参数 > 环境变量(`.env`> 数据库设置 > 默认值
### 启动 Web UI
```bash

View File

@@ -5,14 +5,22 @@ services:
build: .
container_name: codex-register
ports:
- "8000:8000"
- "${APP_PORT:-8000}:8000"
volumes:
- ./data:/app/data
- ./logs:/app/logs
environment:
- PYTHONUNBUFFERED=1
# Web UI 配置(也可在 .env 文件中设置)
- APP_HOST=0.0.0.0
- APP_PORT=${APP_PORT:-8000}
- APP_ACCESS_PASSWORD=${APP_ACCESS_PASSWORD:-admin123}
# 数据库(默认 SQLite如需 PostgreSQL 取消下方注释)
# - APP_DATABASE_URL=postgresql://user:password@db:5432/codex
# HTTP 代理(如需代理取消下方注释)
# - HTTP_PROXY=http://your-proxy:port
# - HTTPS_PROXY=http://your-proxy:port
env_file:
- path: .env
required: false
restart: unless-stopped
# 如果需要代理,取消下面注释并修改地址
# environment:
# - HTTP_PROXY=http://your-proxy:port
# - HTTPS_PROXY=http://your-proxy:port

View File

@@ -535,6 +535,18 @@ def _load_settings_from_db() -> Dict[str, Any]:
env_url = os.environ.get("APP_DATABASE_URL") or os.environ.get("DATABASE_URL")
if env_url:
settings_dict["database_url"] = _normalize_database_url(env_url)
env_host = os.environ.get("APP_HOST")
if env_host:
settings_dict["webui_host"] = env_host
env_port = os.environ.get("APP_PORT")
if env_port:
try:
settings_dict["webui_port"] = int(env_port)
except ValueError:
pass
env_password = os.environ.get("APP_ACCESS_PASSWORD")
if env_password:
settings_dict["webui_access_password"] = env_password
return settings_dict
except Exception as e:
print(f"[Settings] 从数据库加载设置失败: {e},使用默认值")

View File

@@ -24,8 +24,28 @@ from src.database.init_db import initialize_database
from src.config.settings import get_settings
def _load_dotenv():
"""加载 .env 文件(可执行文件同目录或项目根目录)"""
env_path = project_root / ".env"
if not env_path.exists():
return
with open(env_path, encoding="utf-8") as f:
for line in f:
line = line.strip()
if not line or line.startswith("#") or "=" not in line:
continue
key, _, value = line.partition("=")
key = key.strip()
value = value.strip().strip('"').strip("'")
if key and key not in os.environ:
os.environ[key] = value
def setup_application():
"""设置应用程序"""
# 加载 .env 文件(优先级低于已有环境变量)
_load_dotenv()
# 确保数据目录和日志目录在可执行文件所在目录(打包后也适用)
data_dir = project_root / "data"
logs_dir = project_root / "logs"