feat: Docker 一键编排补齐 sftpgo 与 celldata 库,并修复镜像缺 CellData.sql/db_init
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""首次播种 Configure.json 后,按容器环境变量改写「数据库 / SFTP 连接」。
|
||||
|
||||
仅在 entrypoint 首次创建 /data/Configure.json 时调用一次;用户之后在界面里的修改不会被覆盖。
|
||||
保留数据格式相关配置(DataMappings / ExtractField / CellData.mapping 等)不变。
|
||||
"""
|
||||
import json
|
||||
import os
|
||||
|
||||
BASE_DIR = os.environ.get("CAPAREPORT_BASE_DIR", "/data")
|
||||
CONFIG_PATH = os.path.join(BASE_DIR, "Configure.json")
|
||||
|
||||
|
||||
def set_str(target: dict, key: str, env: str) -> None:
|
||||
val = os.environ.get(env)
|
||||
if val not in (None, ""):
|
||||
target[key] = val
|
||||
|
||||
|
||||
def set_int(target: dict, key: str, env: str) -> None:
|
||||
val = os.environ.get(env)
|
||||
if val not in (None, ""):
|
||||
try:
|
||||
target[key] = int(val)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
|
||||
def main() -> None:
|
||||
if not os.path.exists(CONFIG_PATH):
|
||||
return
|
||||
with open(CONFIG_PATH, "r", encoding="utf-8") as f:
|
||||
cfg = json.load(f)
|
||||
|
||||
# 主仓库 MySQL
|
||||
main_db = cfg.setdefault("MySQL_DBInfo", {})
|
||||
set_str(main_db, "host", "DB_HOST")
|
||||
set_int(main_db, "port", "DB_PORT")
|
||||
set_str(main_db, "user", "DB_USER")
|
||||
set_str(main_db, "passwd", "DB_PASSWD")
|
||||
set_str(main_db, "dbname", "MAIN_DB_NAME")
|
||||
|
||||
cell = cfg.setdefault("CellData", {})
|
||||
# CellData MySQL
|
||||
cell_db = cell.setdefault("mysql", {})
|
||||
set_str(cell_db, "host", "DB_HOST")
|
||||
set_int(cell_db, "port", "DB_PORT")
|
||||
set_str(cell_db, "user", "DB_USER")
|
||||
set_str(cell_db, "passwd", "DB_PASSWD")
|
||||
set_str(cell_db, "dbname", "CELLDATA_DB_NAME")
|
||||
|
||||
# 容量数据源 SFTP
|
||||
remote = cfg.setdefault("RemoteData", {})
|
||||
set_str(remote, "host", "SFTP_HOST")
|
||||
set_int(remote, "port", "SFTP_PORT")
|
||||
set_str(remote, "user", "SFTP_USER")
|
||||
set_str(remote, "passwd", "SFTP_PASSWD")
|
||||
|
||||
# CellData 数据源 SFTP
|
||||
cell_remote = cell.setdefault("remote_data", {})
|
||||
set_str(cell_remote, "host", "SFTP_HOST")
|
||||
set_int(cell_remote, "port", "SFTP_PORT")
|
||||
set_str(cell_remote, "user", "SFTP_USER")
|
||||
set_str(cell_remote, "passwd", "SFTP_PASSWD")
|
||||
|
||||
with open(CONFIG_PATH, "w", encoding="utf-8") as f:
|
||||
json.dump(cfg, f, ensure_ascii=False, indent=2)
|
||||
print("[entrypoint] 已按容器环境变量初始化 Configure.json 的数据库/SFTP 连接")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
+14
-2
@@ -1,9 +1,21 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
# 运行态都落在数据卷 /data:配置、脚本、历史、缓存、登录态、Token。
|
||||
# 运行态都落在数据卷 /data:配置、脚本、特征库、历史、缓存、登录态。
|
||||
mkdir -p /data/cache
|
||||
[ -f /data/Configure.json ] || cp /app/defaults/Configure.json /data/Configure.json
|
||||
|
||||
seeded=0
|
||||
if [ ! -f /data/Configure.json ]; then
|
||||
cp /app/defaults/Configure.json /data/Configure.json
|
||||
seeded=1
|
||||
fi
|
||||
[ -f /data/ReportScript.sql ] || cp /app/defaults/ReportScript.sql /data/ReportScript.sql
|
||||
[ -f /data/CellData.sql ] || cp /app/defaults/CellData.sql /data/CellData.sql
|
||||
[ -d /data/db_init ] || cp -r /app/defaults/db_init /data/db_init
|
||||
|
||||
# 首次播种时按容器环境变量改写 数据库/SFTP 连接(用户后续在界面的修改不会被覆盖)
|
||||
if [ "$seeded" = "1" ] && [ -f /app/docker/apply_env_config.py ]; then
|
||||
python /app/docker/apply_env_config.py || true
|
||||
fi
|
||||
|
||||
exec python -m uvicorn app.main:app --host 0.0.0.0 --port 9081
|
||||
|
||||
Reference in New Issue
Block a user