import logging from fastapi import FastAPI from . import config, oss_store from .routes import auth, checkin, course_vote, feedback, plan, profile, survey, webview, yijing logger = logging.getLogger(__name__) app = FastAPI(title="明缘进阶场 API") app.include_router(auth.router) app.include_router(checkin.router) app.include_router(plan.router) app.include_router(profile.router) app.include_router(survey.router) app.include_router(feedback.router) app.include_router(course_vote.router) app.include_router(yijing.router) app.include_router(webview.router) # ── 启动自检:把 OSS 状态打进 stderr ──────────────────────────────────────── # 为什么必须显式打这一条:OSS 坏掉时**完全没有别的信号** —— 上传接口返 503、 # 图片地址全是空串,而 oss_store 里一处日志都没有;「没装 oss2」和「.env 没配」 # 还表现成一个样。2026-10-09 排查「部署后 OSS 不能用」时就是卡在这里。 # 这里刻意用 **error** 级:项目没有 basicConfig,root logger 未配置时只有 # WARNING 以上才会经 lastResort 落到 stderr(即 start_prd.sh 的 server.err.log)。 _oss_reason = oss_store.unavailable_reason() if _oss_reason: logger.error("对象存储(OSS) 未启用:%s" " —— 上传接口会返 503、图片地址全为空串。" "排查:用该 venv 跑 check_oss.py", _oss_reason) else: logger.info("对象存储(OSS) 已启用:bucket=%s endpoint=%s public_host=%s", config.OSS_BUCKET, config.OSS_ENDPOINT, oss_store.public_host()) @app.get("/api/v1/health") def health(): return {"ok": True} # 启动方式:相对导入(from . import ...)下不能 `python main.py` 直接运行 # (顶层会报 `attempted relative import`),必须通过 uvicorn 以包方式加载: # uvicorn wechat_backend.main:app --host 0.0.0.0 --port 8000