init: 从 /root/zikai 根目录迁入

把原本散落在 /root/zikai 的 FastAPI 服务整理到 server/ 子目录,
开启独立 git 与 venv。运行时数据(config.yaml / keys / uploads)
按 .gitignore 留在工作目录但不入仓。
This commit is contained in:
zikai
2026-06-23 16:17:31 +00:00
commit 80b96d236f
31 changed files with 1491 additions and 0 deletions

61
start.sh Executable file
View File

@@ -0,0 +1,61 @@
#!/usr/bin/env bash
# 启动 HTTPuvicorn与 SFTP已在运行则跳过幂等
set -euo pipefail
cd "$(dirname "$0")"
ROOT="$(pwd)"
VENV="$ROOT/.venv"
PY="$VENV/bin/python"
[ -x "$PY" ] || { echo "未找到 venv$VENV,请先运行 ./setup.sh" >&2; exit 1; }
[ -f "$ROOT/config.yaml" ] || { echo "未找到 config.yaml请先运行 ./setup.sh" >&2; exit 1; }
mkdir -p "$ROOT/logs" "$ROOT/uploads"
# 启动前清理upload_service.py 用 .part 后缀做原子写,进程已停时残留必为半成品。
PART_COUNT=$(find "$ROOT/uploads" -type f -name '*.part' -printf '.' 2>/dev/null | wc -c)
if [ "$PART_COUNT" -gt 0 ]; then
find "$ROOT/uploads" -type f -name '*.part' -delete
echo "清理:删除残留 .part 文件 $PART_COUNT"
fi
is_running() { [ -f "$1" ] && kill -0 "$(cat "$1")" 2>/dev/null; }
# --- HTTP ---
APP_PID="$ROOT/app.pid"
if is_running "$APP_PID"; then
echo "HTTP 已在运行 (pid $(cat "$APP_PID"))"
else
read -r HOST PORT <<<"$("$PY" - <<'PY'
import yaml
c = yaml.safe_load(open("config.yaml"))
print(c["server"]["host"], c["server"]["port"])
PY
)"
nohup "$VENV/bin/uvicorn" app.main:app \
--host "$HOST" --port "$PORT" \
>>"$ROOT/logs/app.log" 2>&1 &
echo $! > "$APP_PID"
echo "HTTP 启动 pid=$(cat "$APP_PID") 监听 ${HOST}:${PORT} 日志 logs/app.log"
fi
# --- SFTP ---
SFTP_PID="$ROOT/sftp.pid"
SFTP_ENABLED="$("$PY" - <<'PY'
import yaml
print("true" if yaml.safe_load(open("config.yaml")).get("sftp", {}).get("enabled", True) else "false")
PY
)"
if [ "$SFTP_ENABLED" = "true" ]; then
if is_running "$SFTP_PID"; then
echo "SFTP 已在运行 (pid $(cat "$SFTP_PID"))"
else
nohup "$PY" -m app.services.sftp_server >>"$ROOT/logs/sftp.log" 2>&1 &
echo $! > "$SFTP_PID"
echo "SFTP 启动 pid=$(cat "$SFTP_PID") 日志 logs/sftp.log"
fi
else
echo "SFTP 已在配置中禁用,跳过。"
fi
echo "docs: http://127.0.0.1:6867/docs (对外 https://f.zikai.wang/docs)"