From 3ea11a99457c41d25de2d677c230b47664377343 Mon Sep 17 00:00:00 2001 From: cnphpbb Date: Wed, 2 Sep 2026 12:25:15 +0800 Subject: [PATCH] =?UTF-8?q?build(newapi):=20=E6=B7=BB=E5=8A=A0=20new-api?= =?UTF-8?q?=20=E9=83=A8=E7=BD=B2=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 docker compose 栈与环境变量模板,使用宿主机 PostgreSQL 与自建 Redis,网络采用 host 模式 --- newapi/env.cfg.example | 47 ++++++++++++++++++++++++++++++++++++++ newapi/stack.yml | 52 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) diff --git a/newapi/env.cfg.example b/newapi/env.cfg.example index e69de29..9e3ee69 100644 --- a/newapi/env.cfg.example +++ b/newapi/env.cfg.example @@ -0,0 +1,47 @@ +# ============================================================ +# new-api 部署 — 环境变量模板(不含敏感信息) +# 复制为 env.cfg 后填入真实值,env.cfg 已在 .gitignore 中忽略 +# ============================================================ +# +# 使用方式: +# cp env.cfg.example env.cfg +# $EDITOR env.cfg # 填入真实密码/密钥后保存 +# docker compose -p newapi --env-file ./env.cfg -f ./stack.yml up -d +# +# 前置:宿主机 PostgreSQL 建库建号(只需一次): +# sudo -u postgres psql -c "CREATE ROLE newapi LOGIN PASSWORD '<你的强密码>';" +# sudo -u postgres psql -c 'CREATE DATABASE new_api OWNER newapi;' +# sudo -u postgres psql -c 'GRANT ALL PRIVILEGES ON DATABASE new_api TO newapi;' +# # PG < 13 若建表报权限错,补:GRANT ALL ON SCHEMA public TO newapi; +# +# 注意:SQL_DSN / REDIS_CONN_STRING 为 URL 格式, +# 密码建议纯字母+数字,含 @ : / # 等字符时需做百分号转义 + +# ---------- 镜像 ---------- +# new-api 版本号(与 GitHub release tag 同名;拉取失败可回退 latest) +IMAGE_TAG_VER=v1.0.0-rc.30 +# 完整镜像引用 +IMAGE_TAG=calciumion/new-api:${IMAGE_TAG_VER} +# Redis 镜像 +REDIS_IMAGE_TAG=redis:8.2 + +# ---------- 数据卷 ---------- +# 宿主机持久化目录,挂载到容器 /data 与 /app/logs +# 部署前手动创建:mkdir -pv /data/volumes/newapi/{data,logs} +Volumes_Path=/data/volumes/newapi + +# ---------- 数据库(宿主机已有 PostgreSQL,建议 13+)---------- +DB_HOST=127.0.0.1 +DB_PORT=5432 +DB_NAME=new_api +DB_USER=newapi +DB_PASSWORD= + +# ---------- Redis(本栈自建容器,host 网络,只绑 127.0.0.1)---------- +REDIS_PASSWORD= + +# ---------- new-api 应用 ---------- +# 节点名,用于审计日志标识节点;多节点部署时各节点需不同 +NODE_NAME=newapi-node-1 +# 会话密钥:单机留空(自动生成并持久化);多机部署必须设为同一随机串 +SESSION_SECRET= diff --git a/newapi/stack.yml b/newapi/stack.yml index e69de29..1d1bf2b 100644 --- a/newapi/stack.yml +++ b/newapi/stack.yml @@ -0,0 +1,52 @@ +# path:: mkdir -pv /data/volumes/newapi/{data,logs} +# pull:: docker compose -p newapi --env-file ./newapi/env.cfg -f ./newapi/stack.yml pull +# run:: docker compose -p newapi --env-file ./newapi/env.cfg -f ./newapi/stack.yml up -d +# disc:: 数据库使用宿主机已有 PostgreSQL,需先建库建号(SQL 见 env.cfg.example),栈内不跑 PG +# disc:: new-api 与 redis 均为 host 网络:无 ports 映射,PG/Redis 经 127.0.0.1 直连, +# disc:: 宿主机 PG 保持默认 localhost 监听即可,无需改 listen_addresses / pg_hba.conf +# disc:: 第一个注册的账号自动成为管理员;公网只放行 80/443,3000 由 Nginx/Caddy 反代,勿直接暴露 + +services: + newapi: + image: ${IMAGE_TAG} + container_name: newapi_app + restart: always + command: --log-dir /app/logs + network_mode: host + volumes: + - ${Volumes_Path}/data:/data + - ${Volumes_Path}/logs:/app/logs + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + environment: + - SQL_DSN=postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME} + # 本机无 TLS 的 PG 也可显式关闭 SSL: + # - SQL_DSN=postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?sslmode=disable + - REDIS_CONN_STRING=redis://:${REDIS_PASSWORD}@127.0.0.1:6379 + - TZ=Asia/Shanghai + - BATCH_UPDATE_ENABLED=true + - ERROR_LOG_ENABLED=true + - NODE_NAME=${NODE_NAME} + - SESSION_SECRET=${SESSION_SECRET} + # 可选:独立日志库(PG 或 ClickHouse),不设则日志与业务同库 + # - LOG_SQL_DSN=postgresql://user:pass@127.0.0.1:5432/new_api_log + # 流式无响应超时(秒),默认 120,出现空补全时调大: + # - STREAMING_TIMEOUT=300 + healthcheck: + test: ["CMD-SHELL", "wget -q -O - http://localhost:3000/api/status > /dev/null || exit 1"] + interval: 30s + timeout: 10s + retries: 3 + + redis: + image: ${REDIS_IMAGE_TAG} + container_name: newapi_redis + restart: always + network_mode: host + # 宿主网络下只绑 127.0.0.1,外部无法直连;宿主机 6379 已被占用时先处理冲突 + command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}", "--bind", "127.0.0.1"] + healthcheck: + test: ["CMD-SHELL", "redis-cli -a ${REDIS_PASSWORD} ping | grep -q PONG"] + interval: 10s + timeout: 5s + retries: 5