fix: healthz 路径改成 /api/v1/healthz(归到 API 前缀下)
This commit is contained in:
10
Caddyfile
10
Caddyfile
@@ -12,15 +12,11 @@
|
|||||||
# 如果有域名,改用下面的 https 配置块
|
# 如果有域名,改用下面的 https 配置块
|
||||||
|
|
||||||
http://{$DOMAIN:NEWS_DOMAIN_FALLBACK} {
|
http://{$DOMAIN:NEWS_DOMAIN_FALLBACK} {
|
||||||
# /api/* 转发到 api:8000,handle_path 会自动 strip 匹配的 /api 前缀
|
# /api/* 直接转发,保留路径(后端 FastAPI 路由就是 /api/v1/*)
|
||||||
handle_path /api/* {
|
reverse_proxy /api/* api:8000
|
||||||
reverse_proxy api:8000
|
|
||||||
}
|
|
||||||
|
|
||||||
# 其余走前端 SPA
|
# 其余走前端 SPA
|
||||||
handle {
|
reverse_proxy /* frontend:80
|
||||||
reverse_proxy frontend:80
|
|
||||||
}
|
|
||||||
|
|
||||||
encode gzip zstd
|
encode gzip zstd
|
||||||
|
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ app.include_router(admin.router, prefix=API_PREFIX)
|
|||||||
|
|
||||||
|
|
||||||
# === 健康检查 ===
|
# === 健康检查 ===
|
||||||
@app.get("/healthz", include_in_schema=False)
|
@app.get(f"{API_PREFIX}/healthz", include_in_schema=False)
|
||||||
async def healthz():
|
async def healthz():
|
||||||
try:
|
try:
|
||||||
await get_redis().ping()
|
await get_redis().ping()
|
||||||
@@ -112,6 +112,6 @@ async def healthz():
|
|||||||
return {"status": "ok"}
|
return {"status": "ok"}
|
||||||
|
|
||||||
|
|
||||||
@app.get("/", include_in_schema=False)
|
@app.get(f"{API_PREFIX}/", include_in_schema=False)
|
||||||
async def root():
|
async def root():
|
||||||
return {"name": "diary-news", "version": app.version, "docs": "/api/docs"}
|
return {"name": "diary-news", "version": app.version, "docs": f"{API_PREFIX}/docs"}
|
||||||
|
|||||||
28
scripts/_restart_caddy.py
Normal file
28
scripts/_restart_caddy.py
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import os, paramiko, time
|
||||||
|
PW = os.environ["REMOTE_PASS"]
|
||||||
|
c = paramiko.SSHClient()
|
||||||
|
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||||
|
c.connect("207.57.129.228", port=19717, username="root", password=PW, timeout=15, allow_agent=False, look_for_keys=False)
|
||||||
|
|
||||||
|
def run(cmd, t=60):
|
||||||
|
si, so, se = c.exec_command(cmd, timeout=t)
|
||||||
|
out = so.read().decode("utf-8", "replace")
|
||||||
|
err = se.read().decode("utf-8", "replace")
|
||||||
|
rc = so.channel.recv_exit_status()
|
||||||
|
print(f"$ {cmd}")
|
||||||
|
if out: print(out, end="")
|
||||||
|
if err: print("[err]", err, end="", file=__import__("sys").stderr)
|
||||||
|
print(f" rc={rc}")
|
||||||
|
return out
|
||||||
|
|
||||||
|
run("cd /srv/news && sudo -u news git pull --rebase 2>&1 | tail -3")
|
||||||
|
run("cd /srv/news && sg docker -c 'docker compose up -d --force-recreate caddy' 2>&1 | tail -10")
|
||||||
|
time.sleep(5)
|
||||||
|
|
||||||
|
# 测试路径
|
||||||
|
print("\n=== healthz 测试 ===")
|
||||||
|
run("curl -s -o /dev/null -w 'healthz: %{http_code}\\n' http://localhost/healthz")
|
||||||
|
run("curl -s -o /dev/null -w 'api/healthz: %{http_code}\\n' http://localhost/api/healthz")
|
||||||
|
run("curl -s -o /dev/null -w 'api/v1/articles: %{http_code}\\n' http://localhost/api/v1/articles")
|
||||||
|
run("curl -s http://localhost/api/healthz 2>&1")
|
||||||
|
c.close()
|
||||||
Reference in New Issue
Block a user