init: 初始化 dpb 桃育种系统代码库

前后端 + 后端 FastAPI 全量源码、部署脚本与文档。
This commit is contained in:
34047007@qq.com
2026-08-06 00:17:49 +08:00
commit b95053c52c
1469 changed files with 322298 additions and 0 deletions
+57
View File
@@ -0,0 +1,57 @@
# Docker 部署环境变量(案例)
# 生产配置已全部收敛到本文件,由 docker-compose 注入后端(镜像不再包含 backend/env
# ── 数据库配置(PostgreSQL 16)──
DATABASE_TYPE=postgres
DATABASE_HOST=postgres
DATABASE_PORT=5432
DATABASE_USER=dpb
DATABASE_PASSWORD=your_database_password
DATABASE_NAME=dpb
# ── Redis 配置 ──
REDIS_PASSWORD=your_redis_password
REDIS_PORT=6379
# ── JWT 签名密钥(生产必须为独立随机值,如:openssl rand -hex 32;禁止默认值)──
SECRET_KEY=your_random_secret_key_at_least_32_chars
# ── 应用层配置 ──
# CORS 域名白名单(逗号分隔的具体域名;为空时后端 prod 校验将拒绝启动)
PROD_CORS_ORIGINS=https://admin.example.com,https://www.example.com
# Host 头白名单(nginx 反代时后端据此校验 Host,必须包含真实域名)
ALLOWED_HOSTS=["admin.example.com","*.example.com"]
# 是否信任 nginx 透传的客户端 IP 头(经可信代理时必须 true)
IP_TRUST_PROXY_HEADERS=true
# 登录暴力破解防护
LOGIN_MAX_FAILURES=5
LOGIN_FAILURE_WINDOW_SECONDS=900
LOGIN_LOCKOUT_SECONDS=900
# 登录验证码 / 演示模式 / 开发默认密码(生产必须保持为空!)
CAPTCHA_ENABLE=true
DEMO_ENABLE=false
DEV_DEFAULT_PASSWORD=
# ── SMTP 邮件(按需)──
SMTP_HOST=
SMTP_PORT=465
SMTP_USER=
SMTP_PASSWORD=
SMTP_FROM=
SMTP_FROM_NAME=客户服务
SMTP_TLS=true
EMAIL_CODE_EXPIRE_SECONDS=300
# ── 大模型(按需)──
OPENAI_BASE_URL=https://api.deepseek.com
OPENAI_API_KEY=
OPENAI_MODEL=deepseek-chat
# ── 服务端口 ──
BACKEND_PORT=8001
HTTP_PORT=80
HTTPS_PORT=443
# ── 部署 ──
DEPLOY_ENV=prod
PROJECT_NAME=FastapiAdmin
+224
View File
@@ -0,0 +1,224 @@
# FastapiAdmin 部署说明
> **与仓库根文档的关系**:项目总览、快速开始、演示账号等请以 [根目录 README.md](../README.md) 为准;**本文档**侧重 Docker 部署的详细操作。
## 项目结构
```
docker/
├── backend/ # 后端服务配置
│ └── Dockerfile # 后端 Dockerfile(多阶段构建)
├── nginx/ # Nginx 配置
│ ├── nginx.conf # Nginx 配置文件
│ ├── ssl/ # SSL 证书目录(放置 server.key / server.pem
│ │ ├── server.key # SSL 私钥
│ │ └── server.pem # SSL 证书
│ ├── web/ # 前端静态文件(构建后自动放置 dist/)
│ └── app/ + docs/ # 移动端 H5 / 文档站点(按需启用)
├── postgres/ # PostgreSQL 持久化
│ └── data/ # 数据库数据文件(自动生成)
├── redis/ # Redis 持久化 & 配置
│ ├── conf/
│ │ └── redis.conf # Redis 持久化配置文件
│ └── data/ # Redis 数据文件(自动生成)
├── docker-compose.yaml # Docker Compose 编排文件
├── docker-compose-example.yaml # 编排文件示例
├── .env # 环境变量配置文件(.gitignore 已排除)
├── .env.example # 环境变量示例文件
├── env.sh # 环境变量加载脚本
└── README.md # 本文档
```
> `.gitkeep` 仅用于保留空目录结构,不包含任何实际内容。
## 部署准备
### 系统依赖
- Docker (>= 20.10)
- Docker Compose (v2Docker 内置的 `docker compose` 命令)
- 如需构建前端:Node.js (>= 18) 和 npm / pnpm
### 环境配置
1. **配置环境变量**
```bash
cp docker/.env.example docker/.env
chmod 600 docker/.env # 限制权限,防止其他用户读取密码
```
主要配置项:
| 变量 | 必填 | 默认值 | 说明 |
|------|------|--------|------|
| `DATABASE_USER` | 否 | `dpb` | 数据库用户 |
| `DATABASE_PASSWORD` | 是 | - | 数据库密码 |
| `DATABASE_NAME` | 否 | `dpb` | 数据库名 |
| `DATABASE_PORT` | 否 | `5432` | 数据库端口 |
| `REDIS_PASSWORD` | 是 | - | Redis 密码 |
| `BACKEND_PORT` | 否 | `8001` | 后端服务宿主机端口 |
| `HTTP_PORT` | 否 | `80` | HTTP 宿主机端口 |
| `HTTPS_PORT` | 否 | `443` | HTTPS 宿主机端口 |
| `DEPLOY_ENV` | 否 | `prod` | 部署环境(dev/prod |
| `BACKEND_IMAGE_TAG` | 否 | `3.0.0` | 后端镜像标签 |
| `BUILD_WEB` | 否 | `false` | 部署时构建前端 Web |
| `NGINX_SERVER_NAME` | 否 | `service.fastapiadmin.com` | Nginx 域名 |
2. **SSL 证书配置**(可选,但生产环境必须)
```bash
# 自签名证书(测试用):
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout docker/nginx/ssl/server.key \
-out docker/nginx/ssl/server.pem \
-subj "/CN=service.fastapiadmin.com"
# 生产环境请使用正规 CA 签发的证书
```
## 部署方式
### 方式一:使用部署脚本(推荐)
在项目根目录执行:
```bash
./deploy.sh
```
脚本会自动执行:检查依赖 → 创建目录 → 停止旧容器 → 更新代码 → 构建镜像 → 启动容器 → 验证部署 → 清理旧资源。
**命令选项**
| 命令 | 说明 |
|------|------|
| `./deploy.sh` | 完整部署(跳过前端构建) |
| `./deploy.sh start` | 启动所有容器 |
| `./deploy.sh stop` | 停止所有容器 |
| `./deploy.sh restart` | 重启所有容器 |
| `./deploy.sh logs` | 查看所有容器日志 |
| `./deploy.sh verify` | 验证部署状态 |
| `./deploy.sh clean` | 清理旧镜像和构建缓存 |
| `./deploy.sh --build-frontend` | 完整部署并构建前端(web / app / docs |
| `./deploy.sh --skip-frontend` | 完整部署并跳过前端构建(默认) |
或在 `.env` 中设置 `BUILD_WEB=true` 使部署脚本自动构建前端。
### 方式二:手动操作
```bash
cd docker
# 启动所有服务
docker compose --env-file .env up -d
# 查看状态
docker compose ps
# 查看日志
docker compose logs -f [service_name]
# 停止服务
docker compose down
# 仅重建某个服务
docker compose up -d --no-deps --build [service_name]
```
## 访问信息
部署完成后,可以通过以下地址访问:
| 服务 | 地址 |
|------|------|
| 前端 | `https://your-domain/web` |
| Swagger API 文档 | `https://your-domain/docs` |
| ReDoc API 文档 | `https://your-domain/redoc` |
| API 健康检查 | `https://your-domain/health` |
| 后台登录 | 默认账号 `admin`,密码 `123456` |
> **注意**: `docs`(官网)和 `app`(移动端 H5)默认不参与部署,如需启用请取消 docker-compose.yaml 中相关卷挂载注释。
## 容器资源限制
| 服务 | CPU 限制 | 内存限制 | 内存预留 |
|------|----------|----------|----------|
| PostgreSQL | 无限制 | 1 GB | 256 MB |
| Redis | 无限制 | 512 MB | 128 MB |
| Backend | 1 核 | 1 GB | 256 MB |
| Nginx | 0.5 核 | 256 MB | 64 MB |
如需调整,修改 `docker-compose.yaml` 中对应服务的 `deploy.resources` 字段。
## 日志管理
```bash
# 查看所有容器日志
./deploy.sh logs
# 查看实时日志
cd docker
docker compose logs -f [服务名]
# 服务名:backend, nginx, postgres, redis
```
各容器的日志会被 Docker 自动轮转,限制为每个容器最多保留 3 个日志文件,每个最大 10MB。可在 `docker-compose.yaml` 中调整 `logging` 配置。
## 前端构建
构建前端有三种方式:
1. **本地构建后手动部署**(推荐)
```bash
cd frontend/web
npm install && npm run build
cp -r dist ../docker/nginx/web/
```
2. **使用部署脚本**
```bash
./deploy.sh --build-frontend
```
3. **自动构建**:在 `.env` 中设置
```env
BUILD_WEB=true
# BUILD_APP=true
# BUILD_DOCS=true
```
## 生产部署建议
1. **移除开发卷挂载**:生产环境下,在 `docker-compose.yaml` 中注释掉 `backend` 服务的 `volumes` 挂载,使用镜像内自带的代码
2. **使用正规 SSL 证书**:将 CA 签发的证书替换 `nginx/ssl/` 下的文件
3. **修改域名**:在 `nginx/nginx.conf` 和 `.env` 中修改 `server_name`
4. **关闭调试**:确保 `.env` 中 `DEPLOY_ENV=prod`
5. **限制数据库端口**:生产环境建议注释 PostgreSQL/Redis 的 `ports` 映射,仅通过容器内部网络访问
## 常见问题
| 问题 | 解决方案 |
|------|----------|
| 环境变量文件不存在 | 部署脚本会自动从 `.env.example` 创建,或手动 `cp docker/.env.example docker/.env` |
| 前端构建失败 | 建议在本地构建前端,将 `dist` 目录复制到 `docker/nginx/web/` 目录 |
| 容器启动失败 | `cd docker && docker compose logs [服务名]` 查看具体错误 |
| 数据库连接失败 | 确保 `.env` 中数据库配置正确,postgres 容器正常运行 |
| 端口冲突 | 修改 `.env` 中的端口配置,重新部署 |
| PostgreSQL 数据目录权限问题 | `sudo chown -R 999:999 docker/postgres/data`(postgres 镜像启动时也会自动 chown |
| 后端健康检查失败 | 确保 postgres 和 Redis 容器已就绪,查看后端日志:`docker compose logs backend` |
## 安全建议
1. **修改默认密码**:部署后请修改 `.env` 中的密码
2. **保护 `.env` 文件**:已加入 `.gitignore`,请勿手动提交
3. **使用正规 SSL 证书**:生产中不要使用自签名证书
4. **限制端口访问**:通过防火墙只开放 80/443 端口
5. **及时更新**:定期执行部署脚本获取最新版本
## 版本更新
```bash
./deploy.sh # 自动拉取最新代码 → 构建新镜像 → 重启容器
```
+33
View File
@@ -0,0 +1,33 @@
# 使用python:3.12-slim 镜像作为基础镜像
FROM python:3.12-slim
# 使用 LABEL 替代 MAINTAINER
LABEL maintainer="948080782@qq.com"
# 设置时区
ENV TZ Asia/Shanghai
# 设置容器内工作目录
WORKDIR /home
# 复制依赖清单并安装
COPY ./backend/requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 复制整个后端代码进镜像(镜像自包含,生产不依赖宿主机代码挂载)
COPY ./backend/ .
# 创建非 root 运行用户(固定 uid/gid 1001,与 docker-compose 的 user: "1001:1001" 对应),
# 授权 /home 供日志(logs)、上传目录(static/upload)写入
RUN addgroup --system --gid 1001 app \
&& adduser --system --uid 1001 --ingroup app --home /home app \
&& chown -R app:app /home
# 暴露端口
EXPOSE 8001
# 切换非 root 用户运行(应用被攻破时不以 root 执行,降低容器逃逸风险)
USER app
# 运行应用
CMD ["python", "main.py", "run", "--env=prod"]
+255
View File
@@ -0,0 +1,255 @@
# ============================================
# FastapiAdmin Docker Compose 配置文件
# ============================================
# 使用方式:
# 开发环境: docker compose --env-file .env up -d
# 生产环境: docker compose --env-file .env -f docker-compose.yaml up -d
# ============================================
services:
# ==================== 数据库服务(PostgreSQL 16 ====================
postgres:
container_name: postgres
image: postgres:16
restart: unless-stopped
platform: linux/amd64
environment:
TZ: "Asia/Shanghai"
POSTGRES_DB: "${DATABASE_NAME:-dpb}"
POSTGRES_USER: "${DATABASE_USER:-dpb}"
POSTGRES_PASSWORD: "${DATABASE_PASSWORD:?错误: 请设置 DATABASE_PASSWORD 环境变量}"
# 仅绑定本机回环:数据库不应暴露到公网/局域网,只允许后端容器与运维本机访问
ports:
- "127.0.0.1:${DATABASE_PORT:-5432}:5432"
volumes:
- pg_data:/var/lib/postgresql/data
- /etc/localtime:/etc/localtime:ro
networks:
- app_network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DATABASE_USER:-dpb}"]
interval: 10s
timeout: 10s
retries: 10
start_period: 30s
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
deploy:
resources:
limits:
memory: 1g
reservations:
memory: 256m
# ==================== Redis 服务 ====================
redis:
container_name: redis
image: redis:7-alpine
restart: unless-stopped
platform: linux/amd64
environment:
TZ: "Asia/Shanghai"
# 仅绑定本机回环:Redis 不应暴露到公网/局域网
ports:
- "127.0.0.1:${REDIS_PORT:-6379}:6379"
volumes:
- redis_data:/data
# 挂载自定义 redis.conf(若存在则覆盖默认配置)
- ./redis/conf/redis.conf:/usr/local/etc/redis/redis.conf:ro
command: >
redis-server /usr/local/etc/redis/redis.conf
--requirepass ${REDIS_PASSWORD:?错误: 请设置 REDIS_PASSWORD 环境变量}
networks:
- app_network
healthcheck:
test:
["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
deploy:
resources:
limits:
memory: 512m
reservations:
memory: 128m
# ==================== 后端服务 ====================
backend:
container_name: backend
build:
context: ../
dockerfile: ./docker/backend/Dockerfile
args:
DEPLOY_ENV: "${DEPLOY_ENV:-prod}"
image: "backend:${BACKEND_IMAGE_TAG:-3.0.0}"
restart: unless-stopped
platform: linux/amd64
# 以非 root 运行(与 Dockerfile USER app 一致),降权容器内进程
user: "1001:1001"
# 纵深防御:禁止提权、丢弃全部 capabilitiesuvicorn 绑 8001 端口无需特权)
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
tmpfs:
- /tmp
environment:
TZ: "Asia/Shanghai"
# 运行环境,对应 backend/env/.env.{dev,prod}
ENVIRONMENT: "${DEPLOY_ENV:-prod}"
# PostgreSQL 连接配置(对应 backend/env/.env.prod 的 DATABASE_*
DATABASE_TYPE: "postgres"
DATABASE_HOST: "postgres"
DATABASE_PORT: "5432"
DATABASE_USER: "${DATABASE_USER:-dpb}"
DATABASE_PASSWORD: "${DATABASE_PASSWORD:?错误: 请设置 DATABASE_PASSWORD 环境变量}"
DATABASE_NAME: "${DATABASE_NAME:-dpb}"
# Redis 连接配置
REDIS_HOST: "redis"
REDIS_PORT: "6379"
REDIS_PASSWORD: "${REDIS_PASSWORD}"
REDIS_DB_NAME: "1"
REDIS_ENABLE: "true"
# JWT 签名密钥:必须通过 docker/.env 配置独立随机值(settings 会在 prod 下拒绝默认密钥)
SECRET_KEY: "${SECRET_KEY:?错误: 请设置 SECRET_KEY 环境变量(生产 JWT 密钥,勿用默认值)}"
# ── 应用层配置:镜像已排除 backend/env,以下全部由 docker/.env 注入(勿再依赖 .env.prod)──
# CORS 白名单:生产必须配置具体域名,为空时后端 prod 校验将拒绝启动
PROD_CORS_ORIGINS: "${PROD_CORS_ORIGINS:-}"
# Host 头白名单(nginx 反代时后端据此校验 Host,必须配置真实域名,否则请求 403)
ALLOWED_HOSTS: "${ALLOWED_HOSTS:?错误: 请设置 ALLOWED_HOSTS(如 [\"admin.example.com\",\"*.example.com\"]}"
# 是否信任 nginx 透传的客户端 IP 头(经可信代理时必须 true)
IP_TRUST_PROXY_HEADERS: "${IP_TRUST_PROXY_HEADERS:-true}"
# 登录暴力破解防护
LOGIN_MAX_FAILURES: "${LOGIN_MAX_FAILURES:-5}"
LOGIN_FAILURE_WINDOW_SECONDS: "${LOGIN_FAILURE_WINDOW_SECONDS:-900}"
LOGIN_LOCKOUT_SECONDS: "${LOGIN_LOCKOUT_SECONDS:-900}"
# 登录验证码 / 演示模式 / 开发默认密码(生产必须保持为空)
CAPTCHA_ENABLE: "${CAPTCHA_ENABLE:-true}"
DEMO_ENABLE: "${DEMO_ENABLE:-false}"
DEV_DEFAULT_PASSWORD: "${DEV_DEFAULT_PASSWORD:-}"
# SMTP 邮件
SMTP_HOST: "${SMTP_HOST:-}"
SMTP_PORT: "${SMTP_PORT:-465}"
SMTP_USER: "${SMTP_USER:-}"
SMTP_PASSWORD: "${SMTP_PASSWORD:-}"
SMTP_FROM: "${SMTP_FROM:-}"
SMTP_FROM_NAME: "${SMTP_FROM_NAME:-客户服务}"
SMTP_TLS: "${SMTP_TLS:-true}"
EMAIL_CODE_EXPIRE_SECONDS: "${EMAIL_CODE_EXPIRE_SECONDS:-300}"
# 大模型
OPENAI_BASE_URL: "${OPENAI_BASE_URL:-https://api.deepseek.com}"
OPENAI_API_KEY: "${OPENAI_API_KEY:-}"
OPENAI_MODEL: "${OPENAI_MODEL:-deepseek-chat}"
# 日志级别
LOGGER_LEVEL: "${LOGGER_LEVEL:-INFO}"
# 非 root 容器下禁止写 __pycache__/home 已 chown 可写,此处避免 import 时缓存字节码)
PYTHONDONTWRITEBYTECODE: "1"
# 仅绑定本机回环:后端只经 nginx 对外,避免 8001 直连暴露(否则可绕过 Host 头/CORS/HTTPS 约束)
ports:
- "127.0.0.1:${BACKEND_PORT:-8001}:8001"
# volumes:
# ── 注意 ──────────────────────────────────
# 生产环境禁用代码挂载:镜像已自包含(见 Dockerfile COPY ./backend/)。
# 仅本地开发需要热更新时取消注释下面这行(宿主机代码覆盖容器内代码)。
# ─────────────────────────────────────────
# - ../backend:/home
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
networks:
- app_network
healthcheck:
test:
[
"CMD-SHELL",
"python -c 'import urllib.request; urllib.request.urlopen(\"http://localhost:8001/common/health/check\")' || exit 1",
]
interval: 15s
timeout: 10s
retries: 5
start_period: 40s
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
deploy:
resources:
limits:
memory: 1g
cpus: "1.0"
reservations:
memory: 256m
# ==================== Nginx 服务 ====================
nginx:
container_name: nginx
image: nginx:1.25-alpine
restart: unless-stopped
platform: linux/amd64
environment:
TZ: "Asia/Shanghai"
ports:
- "${HTTP_PORT:-80}:80"
- "${HTTPS_PORT:-443}:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/web:/usr/share/nginx/html/web:ro
- ./nginx/ssl:/etc/nginx/ssl:ro
# 按需启用(取消注释):
- ./nginx/app:/usr/share/nginx/html/app:ro
- ./nginx/docs:/usr/share/nginx/html/docs:ro
depends_on:
backend:
condition: service_started
networks:
- app_network
healthcheck:
test: ["CMD", "nginx", "-t"]
interval: 30s
timeout: 5s
retries: 3
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
deploy:
resources:
limits:
memory: 256m
cpus: "0.5"
reservations:
memory: 64m
# ==================== 持久化卷 ====================
volumes:
pg_data:
driver: local
driver_opts:
type: none
device: ./postgres/data
o: bind
redis_data:
driver: local
driver_opts:
type: none
device: ./redis/data
o: bind
# ==================== 网络 ====================
networks:
app_network:
driver: bridge
+2
View File
@@ -0,0 +1,2 @@
This directory contains private mobile app / miniprogram source code.
This content is not open source.
+2
View File
@@ -0,0 +1,2 @@
This directory contains private mobile app / miniprogram source code.
This content is not open source.
+141
View File
@@ -0,0 +1,141 @@
# ============================================
# FastapiAdmin Nginx 配置文件
# ============================================
# 自动检测 CPU 核心数,多核服务器自动利用所有核心
worker_processes auto;
# 错误日志输出到 stdout(Docker 容器日志最佳实践)
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
accept_mutex on; # 设置网络连接序列化,防止惊群现象发生,默认为on
multi_accept on; # 设置一个进程是否同时接受多个网络连接,默认为off
use epoll; # 事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; # 最大连接数,默认为512
}
http {
include mime.types; # 文件扩展名与文件类型映射表
default_type application/octet-stream; # 默认文件类型,默认为text/plain
# ==================== 基础优化 ====================
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
types_hash_max_size 2048;
client_max_body_size 50m;
server_tokens off;
# ==================== 日志格式 ====================
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'$request_time $upstream_response_time';
access_log /var/log/nginx/access.log main buffer=32k flush=5s;
# ==================== Gzip 压缩 ====================
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 256;
gzip_types
text/plain
text/css
text/javascript
application/javascript
application/json
application/xml
application/x-javascript
image/svg+xml
image/x-icon;
# ==================== 安全头 ====================
# 全局安全头,默认被所有 server 块继承
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
# HSTS:强制浏览器仅用 HTTPS 访问(仅 HTTPS 响应生效;配合下方 HTTP->HTTPS 301
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# 限制浏览器 API 能力(相机/麦克风/定位一律禁用)
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# ==================== 速率限制 ====================
# API 请求速率限制: 每 IP 每秒 30 个请求
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=30r/s;
# 连接数限制: 每 IP 最多 100 个并发连接
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
# ==================== HTTP -> HTTPS 重定向 ====================
# HTTP server块 - 重定向到HTTPS
server {
listen 80;
server_name service.fastapiadmin.com;
return 301 https://$server_name$request_uri;
}
# ==================== HTTPS Server ====================
server {
listen 443 ssl http2;
server_name service.fastapiadmin.com;
# ==================== SSL 配置 ====================
ssl_certificate /etc/nginx/ssl/server.pem;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# ==================== 官网(根路径) ====================
# 已禁用:docs 不开源,如需使用请取消注释
location / {
root /usr/share/nginx/html/docs/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html; #解决页面刷新404问题
}
# ==================== 前端(/web ====================
location /web {
alias /usr/share/nginx/html/web/dist;
try_files $uri $uri/ /web/index.html; #解决页面刷新404问题
}
# ==================== 小程序 H5/app ====================
# 已禁用:app 不开源,如需使用请取消注释
location /app {
alias /usr/share/nginx/html/app/dist/build/h5;
try_files $uri $uri/ /app/index.html; #解决页面刷新404问题
}
# ==================== 后端 API 代理 ====================
location /api/v1 {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
proxy_pass http://backend:8001;
# WebSocket 支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# ==================== 错误页面 ====================
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
+2
View File
@@ -0,0 +1,2 @@
This directory contains private mobile app / miniprogram source code.
This content is not open source.
+2
View File
@@ -0,0 +1,2 @@
This directory contains private mobile app / miniprogram source code.
This content is not open source.
+1
View File
@@ -0,0 +1 @@
This directory stores PostgreSQL data files (generated automatically).