Knowledge Observatory Obsidian notes, RSS insights, and lightweight AI summaries.
2026年3月28日 未分类

6.5.1 准备阶段

服务器安装

查询服务器配置版本

# 查询Linux服务器系统
cat /etc/os-release

# 查询python版本
python3 --version

在 Linux 服务器上更新 Python 时,注意不要动系统自带的 Python(通常是 /usr/bin/python3),Linux 系统的许多核心工具(如 Ubuntu 的 apt 或 CentOS 的 yum)都深度依赖系统自带的 Python 版本。

GitHub Actions 自动化 (CI/CD) —— 高级、无感、终极目标

当你们团队的接口越来越多,频繁登录服务器敲 git pull 会变得繁琐。这时候就需要引入 GitHub Actions

它的核心逻辑是:你只需要把代码 git push 到 GitHub 的 main 分支,GitHub 会自动连上你的服务器,帮你执行部署命令。

实现这个方案需要:

  1. 在代码仓库新建一个 .github/workflows/deploy.yml 文件。

  2. 在 GitHub 仓库的 Settings -> Secrets 中,存入你服务器的 IP、SSH 私钥和密码。

  3. 每次合并代码,GitHub 机器人会自动登录服务器执行方案一里的那两行命令。

⚠️ 生产环境必须避开的一个坑

如果你的云服务器防火墙没开端口,外部是访问不到这个 API 的。 但是,强烈不建议直接在云服务器的安全组里把 8000 端口暴露给公网(这不安全,也无法配置 HTTPS 证书)。

工业界的标准做法是使用反向代理(Reverse Proxy): 让服务器的 80 端口(HTTP)和 443 端口(HTTPS)对外开放,使用 NginxCaddy 接收用户的请求,然后再在服务器内部悄悄转发给本地的 Docker 8000 端口。

这是一个非常经典的前后端分离架构方案。你的前端(Astro/Svelte)跑在阿里云 ESA 的边缘节点上,而你的后端(FastAPI)跑在自己的 Linux 服务器容器里。

既然前端已经在 ESA 配置好了 HTTPS,你的后端也必须具备 HTTPS 地址,否则浏览器会因为“混合内容(Mixed Content)”安全性错误而拦截前端对后端的请求。

以下是针对你这种情况的最优反向代理配置方案


1. 架构设计:双重保护方案

由于你已经使用了 ESA,最省心的方法是让 ESA 同时代理你的前端和后端

  • 前端www.liteascii.com (部署在 ESA Pages)。

  • 后端api.liteascii.com (解析到你的服务器 IP,并通过 ESA 开启 CDN 加速)。


2. 第一步:在 ESA 配置后端域名 (DNS)

  1. 登录阿里云 ESA 控制台,进入你的站点。

  2. 添加 DNS 记录

    • 类型:A

    • 主机名:api (或者你想用的后缀)

    • 值:你的服务器公网 IP

    • 代理状态:务必开启(橙色小云朵),这样 ESA 会隐藏你的服务器真实 IP,并自动处理 SSL 证书。


3. 第二步:服务器端的反向代理 (推荐使用 Caddy)

虽然 Nginx 很出名,但对于团队协作和快速部署,我更推荐 Caddy。它最大的优点是自动配置 SSL 且配置文件极其简洁。

如果你依然想用 Docker 管理一切,可以在 docker-compose.yml 中增加一个 Caddy 容器:

方案 A:使用 Caddy (最简单)

在项目根目录创建 Caddyfile

代码段

api.yourdomain.com {
    reverse_proxy api:8000
}

方案 B:使用 Nginx (最通用)

如果你更习惯 Nginx,配置如下:

Nginx

server {
    listen 80;
    server_name api.yourdomain.com;

    location / {
        proxy_pass http://localhost:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

注:由于 ESA 已经在最外层处理了 HTTPS,你的服务器内部只需要监听 80 端口,ESA 会通过加密隧道与你的服务器通信(这叫 SSL 卸载)。


4. 第三步:解决跨域问题 (CORS) —— 必做!

因为你的前端在 www 域名,后端在 api 域名,浏览器默认会拦截请求。你必须在 FastAPI 代码中显式允许你的前端域名。

在你的 app/main.py 中添加:

Python

from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

# 定义允许访问的域名列表
origins = [
    "https://www.yourdomain.com", # 你的 ESA 前端地址
    "http://localhost:4321",      # 允许本地开发调试
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],           # 允许所有方法 (GET, POST 等)
    allow_headers=["*"],           # 允许所有请求头
)

5. 为什么这是最优解?

  1. 统一管理:你所有的域名安全、防 CC 攻击、SSL 证书都在阿里云 ESA 后台统一管理。

  2. 隐藏 IP:别人只能查到 ESA 的 IP,查不到你真实服务器的 IP,安全性大增。

  3. 极速访问:ESA 的边缘节点会缓存你的静态 API 响应(如果配置了缓存策略),让全球访问都变快。


💡 给团队的小贴士

如果在配置过程中发现 API 调不通,请按以下顺序排查:

  1. 服务器防火墙:是否放行了 80 和 443 端口?(阿里云安全组也记得开)。

  2. Docker 端口映射docker ps 看看 8000 端口是否真的映射出来了。

  3. ESA SSL 模式:在 ESA 控制台将 SSL/TLS 模式设置为 “完全 (Strict)”“灵活”

既然你已经在处理域名和部署了,需要我帮你写一个自动化的脚本,让你在更新代码后,一行命令就能完成“拉取代码 + 重启 Nginx + 重启 FastAPI”吗?