From e2e5c4a23229d537d3cde17542c8ba20db62426d Mon Sep 17 00:00:00 2001 From: cnlimiter Date: Tue, 17 Mar 2026 18:36:40 +0800 Subject: [PATCH] =?UTF-8?q?docs(readme):=20=E6=9B=B4=E6=96=B0=20README=20d?= =?UTF-8?q?ocker-compose=20=E4=BB=A5=E5=8C=85=E5=90=AB=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E9=85=8D=E7=BD=AE=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 19 +++++++++++++++++++ .github/workflows/build.yml | 32 +++++++++++++++++++++++++++++--- README.md | 17 +++++++++++++++++ docker-compose.yml | 18 +++++++++++++----- src/config/settings.py | 12 ++++++++++++ webui.py | 20 ++++++++++++++++++++ 6 files changed, 110 insertions(+), 8 deletions(-) create mode 100644 .env.example diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..b21ea40 --- /dev/null +++ b/.env.example @@ -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 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4bd80d3..adc71d9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -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 ``` diff --git a/README.md b/README.md index d378e38..2b70647 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/docker-compose.yml b/docker-compose.yml index cab624b..80c8fd6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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 diff --git a/src/config/settings.py b/src/config/settings.py index fd119eb..5bf4064 100644 --- a/src/config/settings.py +++ b/src/config/settings.py @@ -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},使用默认值") diff --git a/webui.py b/webui.py index a0f9dcb..1ce7222 100644 --- a/webui.py +++ b/webui.py @@ -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"