Merge pull request #12 from 1014TaoTao/dev

Dev
This commit is contained in:
1014TaoTao
2025-05-17 09:07:21 +08:00
committed by GitHub
21 changed files with 147 additions and 1706 deletions
+3 -3
View File
@@ -11,13 +11,13 @@ ENV TZ Asia/Shanghai
WORKDIR /home WORKDIR /home
# 将当前主机目录全部文件复制至容器工作目录 # 将当前主机目录全部文件复制至容器工作目录
COPY ./backend . COPY backend/requirements.txt .
# 安装依赖 # 安装依赖
RUN pip install --no-cache-dir -r ./requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 运行应用 # 运行应用
CMD ["python", "main.py", "run", "--env=prod"] CMD ["python", "main.py", "run", "--env=prod"]
# 暴露端口 # 暴露端口
EXPOSE 8000 EXPOSE 8001
-20
View File
@@ -1,20 +0,0 @@
# 使用官方的 Python 3.10 镜像作为基础镜像
FROM nginx:latest
# 使用 LABEL 替代 MAINTAINER
LABEL maintainer="948080782@qq.com"
# 设置时区
ENV TZ Asia/Shanghai
# 设置容器内工作目录
WORKDIR /home
# 将当前主机目录全部文件复制至容器工作目录
COPY ./frontend/dist /usr/share/nginx/html
# 用本地的nginx配置文件覆盖镜像的Nginx配置
COPY ./nginx.conf /etc/nginx/nginx.conf
# 暴露端口
EXPOSE 80
+18
View File
@@ -225,6 +225,24 @@ git clone https://gitee.com/tao__tao/fastapi_vue3_admin.git
- Username: `admin` Password: `123456` - Username: `admin` Password: `123456`
- API URL: <http://127.0.0.1:8000/api/v1/docs> - API URL: <http://127.0.0.1:8000/api/v1/docs>
### Docker Deployment
- cd fastapi_vue3_amdin/frontend
- npm run build Ensure the dist directory exists; otherwise, errors will occur during execution
- cd fastapi_vue3_amdin
- docker compose up -d
- Notes
- In the frontend .env.production file, change VITE_API_BASE_URL to the public IP address.
- In the backend .env.prod file, set MYSQL_HOST and REDIS_HOST to private IP addresses.
- Common Issues
- Backend fails to start: Usually because the initialization script was not executed. The script directory is backend/sql/mysql_xxx.sql. Another possibility is that the MySQL or Redis services are not running and need to be started manually.
- Deployment Order
- 1. Start MySQL and Redis services
- 2. Execute database initialization scripts.
- 3. Start the backend service.
- 4. Start the frontend service.
- Access URL:Public IP address on port 80; login with username admin and password 123456.
## 🔧 Module Showcase ## 🔧 Module Showcase
<table> <table>
+23 -4
View File
@@ -138,7 +138,7 @@ fastapi_vue_admin
git clone https://gitee.com/tao__tao/fastapi_vue3_admin.git git clone https://gitee.com/tao__tao/fastapi_vue3_admin.git
``` ```
### 后端 ### 本地后端启动
1. 安装依赖 1. 安装依赖
@@ -177,7 +177,7 @@ git clone https://gitee.com/tao__tao/fastapi_vue3_admin.git
# python main.py upgrade --env=dev(不加默认为dev) # python main.py upgrade --env=dev(不加默认为dev)
``` ```
### 前端 ### 本地前端启动
1. 安装依赖 1. 安装依赖
@@ -198,7 +198,7 @@ git clone https://gitee.com/tao__tao/fastapi_vue3_admin.git
npm run build npm run build
``` ```
### 小程序 ### 本地小程序启动
1. 安装依赖 1. 安装依赖
@@ -219,12 +219,31 @@ git clone https://gitee.com/tao__tao/fastapi_vue3_admin.git
npm run build npm run build
``` ```
### 访问项目 ### 本地访问项目
- 前端地址:<http://127.0.0.1:5180> - 前端地址:<http://127.0.0.1:5180>
- 账号:`admin` 密码:`123456` - 账号:`admin` 密码:`123456`
- 接口地址:<http://127.0.0.1:8000/api/v1/docs> - 接口地址:<http://127.0.0.1:8000/api/v1/docs>
### docker 部署
- cd fastapi_vue3_amdin/frontend
- npm run build (保证dist前端打包内容存在,否则运行会报错)
- cd fastapi_vue3_amdin
- docker compose up -d
- 注意事项:
- 前端.env.production 中 VITE_API_BASE_URL需要修改为公网地址
- 后端.env.prod 中 MYSQL_HOST、REDIS_HOST需要改为私网地址
- 遇到问题:
- 后端启动报错:一般是由于初始化脚本没有执行,脚本目录:backend/sql/mysql_xxx.sql
- 还有可能是因为mysql、redis中间件没有启动,需要手动启动
- 部署顺序:
- 1. 启动mysql、redis中间件
- 2. 执行初始化脚本
- 3. 启动后端服务
- 4. 启动前端服务
- 访问地址:公网地址,80端口;登录admin/123456
## 🔧 模块展示 ## 🔧 模块展示
<table> <table>
Binary file not shown.
+4 -13
View File
@@ -38,14 +38,12 @@ services:
# 构建镜像 # 构建镜像
build: build:
context: . context: .
dockerfile: Dockerfile.backend dockerfile: Dockerfile
# 端口映射 # 端口映射
ports: ports:
- "8001:8001" - "8001:8001"
volumes: volumes:
- /home/backend/static:/home/backend/static - ./backend:/home
- /home/backend/logs:/home/backend/logs
- /home/backend/env:/home/backend/env
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
networks: networks:
- backend-network - backend-network
@@ -59,14 +57,11 @@ services:
container_name: nginx container_name: nginx
image: "nginx:latest" image: "nginx:latest"
restart: always restart: always
build:
context: .
dockerfile: Dockerfile.frontend
ports: ports:
- "80:80" - "80:80"
volumes: volumes:
- /home/frontend/nginx/conf:/etc/nginx/conf - ./nginx.conf:/etc/nginx/nginx.conf
- /home/frontend/nginx/dist:/usr/share/nginx/html - ./frontend/dist:/usr/share/nginx/html
networks: networks:
- frontend_network - frontend_network
depends_on: depends_on:
@@ -76,16 +71,12 @@ services:
networks: networks:
mysql_network: mysql_network:
driver: bridge driver: bridge
name: mysql_network
redis_network: redis_network:
driver: bridge driver: bridge
name: redis_network
frontend_network: frontend_network:
driver: bridge driver: bridge
name: frontend_network
backend-network: backend-network:
driver: bridge driver: bridge
name: backend-network
# 文件挂载 # 文件挂载
volumes: volumes:
+1 -1
View File
@@ -9,7 +9,7 @@ VITE_APP_TITLE=生产环境
VITE_APP_BASE_API=/api/v1 VITE_APP_BASE_API=/api/v1
# 网络请求公用地址 # 网络请求公用地址
VITE_API_BASE_URL='https://fastapi-vue-admin.cn' VITE_API_BASE_URL='http://8.137.99.5:8001'
# 请求超时时间 # 请求超时时间
VITE_TIMEOUT=10000 VITE_TIMEOUT=10000
+1 -87
View File
@@ -214,24 +214,6 @@
<li class="md-tabs__item">
<a href="/doc/build.html" class="md-tabs__link">
部署指南
</a>
</li>
<li class="md-tabs__item"> <li class="md-tabs__item">
<a href="/doc/mkdocs.html" class="md-tabs__link"> <a href="/doc/mkdocs.html" class="md-tabs__link">
@@ -430,7 +412,7 @@
<span class="md-ellipsis"> <span class="md-ellipsis">
部署指南 文档指南
</span> </span>
@@ -440,74 +422,6 @@
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3"> <label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
部署指南
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="/doc/build.html" class="md-nav__link">
<span class="md-ellipsis">
本地部署
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-ellipsis">
文档指南
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span> <span class="md-nav__icon md-icon"></span>
文档指南 文档指南
</label> </label>
+1 -87
View File
@@ -227,24 +227,6 @@
<li class="md-tabs__item">
<a href="build.html" class="md-tabs__link">
部署指南
</a>
</li>
<li class="md-tabs__item"> <li class="md-tabs__item">
<a href="mkdocs.html" class="md-tabs__link"> <a href="mkdocs.html" class="md-tabs__link">
@@ -498,7 +480,7 @@
<span class="md-ellipsis"> <span class="md-ellipsis">
部署指南 文档指南
</span> </span>
@@ -508,74 +490,6 @@
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3"> <label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
部署指南
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="build.html" class="md-nav__link">
<span class="md-ellipsis">
本地部署
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-ellipsis">
文档指南
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span> <span class="md-nav__icon md-icon"></span>
文档指南 文档指南
</label> </label>
-998
View File
@@ -1,998 +0,0 @@
<!doctype html>
<html lang="zh" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="这里是网站描述">
<meta name="author" content="948080782x@qq.com">
<link rel="canonical" href="http://127.0.0.1:8888/doc/build.html">
<link rel="prev" href="frontend.html">
<link rel="next" href="mkdocs.html">
<link rel="icon" href="../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.7">
<title>本地部署 - Fastapi_Vue_Admin在线文档</title>
<link rel="stylesheet" href="../assets/stylesheets/main.8608ea7d.min.css">
<link rel="stylesheet" href="../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#_1" class="md-skip">
跳转至
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow md-header--lifted" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="页眉">
<a href="../index.html" title="Fastapi_Vue_Admin在线文档" class="md-header__button md-logo" aria-label="Fastapi_Vue_Admin在线文档" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Fastapi_Vue_Admin在线文档
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
本地部署
</span>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="搜索" placeholder="搜索" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="查找">
<button type="reset" class="md-search__icon md-icon" title="清空当前内容" aria-label="清空当前内容" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
正在初始化搜索引擎
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://gitee.com/tao__tao/fastapi_vue3_admin.git" title="前往仓库" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
</div>
<div class="md-source__repository">
fastapi_vue_admin
</div>
</a>
</div>
</nav>
<nav class="md-tabs" aria-label="标签" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../index.html" class="md-tabs__link">
项目概述
</a>
</li>
<li class="md-tabs__item">
<a href="backend.html" class="md-tabs__link">
开发指南
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="build.html" class="md-tabs__link">
部署指南
</a>
</li>
<li class="md-tabs__item">
<a href="mkdocs.html" class="md-tabs__link">
文档指南
</a>
</li>
</ul>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="导航栏" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../index.html" title="Fastapi_Vue_Admin在线文档" class="md-nav__button md-logo" aria-label="Fastapi_Vue_Admin在线文档" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
Fastapi_Vue_Admin在线文档
</label>
<div class="md-nav__source">
<a href="https://gitee.com/tao__tao/fastapi_vue3_admin.git" title="前往仓库" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
</div>
<div class="md-source__repository">
fastapi_vue_admin
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../index.html" class="md-nav__link">
<span class="md-ellipsis">
项目概述
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
开发指南
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
开发指南
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="backend.html" class="md-nav__link">
<span class="md-ellipsis">
后端开发
</span>
</a>
</li>
<li class="md-nav__item">
<a href="frontend.html" class="md-nav__link">
<span class="md-ellipsis">
前端开发
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-ellipsis">
部署指南
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
部署指南
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
本地部署
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="build.html" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
本地部署
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="目录">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
目录
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#docker" class="md-nav__link">
<span class="md-ellipsis">
docker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#docker-componse" class="md-nav__link">
<span class="md-ellipsis">
docker-componse
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#nginx" class="md-nav__link">
<span class="md-ellipsis">
nginx
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-ellipsis">
文档指南
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
文档指南
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="mkdocs.html" class="md-nav__link">
<span class="md-ellipsis">
文档开发
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="目录">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
目录
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#docker" class="md-nav__link">
<span class="md-ellipsis">
docker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#docker-componse" class="md-nav__link">
<span class="md-ellipsis">
docker-componse
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#nginx" class="md-nav__link">
<span class="md-ellipsis">
nginx
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="_1">部署介绍</h1>
<h2 id="docker">docker</h2>
<pre><code class="language-dockerfile"># 使用官方的 Python 3.10 镜像作为基础镜像
FROM python:3.10
# 使用 LABEL 替代 MAINTAINER
LABEL maintainer=&quot;管理员&quot;
# 设置 python 环境变量
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1
# 设置时区
ENV TZ Asia/Shanghai
# 升级pip版本
# RUN python -m pip install --upgrade pip
# 创建容器工作目录
RUN mkdir -p /opt/fastapi_project
# 设置容器内工作目录
WORKDIR /opt/fastapi_project
# 将当前主机目录全部文件复制至容器工作目录
COPY ./requirements.txt /code/requirements.txt
# 安装依赖
RUN pip install --no-cache-dir --upgrade -r /opt/fastapiproject/backend/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 部署 nginx
RUN apt-get update &amp;&amp; apt-get install -y nginx
RUN rm /etc/nginx/sites-enabled/default
COPY nginx.conf /etc/nginx/sites-available/
RUN ln -s /etc/nginx/sites-available/nginx.conf /etc/nginx/sites-enabled/
RUN echo &quot;daemon off;&quot; &gt;&gt; /etc/nginx/nginx.conf
# # 部署mysql
# RUN apt-get install -y mysql-server
# # 部署redis
# RUN apt-get install -y redis-server
# # 部署mongo
# RUN apt-get install -y mongodb
#CMD 运行以下命令,daemon off后台运行,否则启动完就自动关闭
CMD [&quot;nginx&quot;, &quot;-g&quot;, &quot;daemon off;&quot;]
CMD [&quot;uvicorn&quot;, &quot;app.main:app&quot;, &quot;--host&quot;, &quot;0.0.0.0&quot;, &quot;--port&quot;, &quot;80&quot;]
# 暴露端口
EXPOSE 8000
# python main.py run 或者 uvicorn main:create_app --host 0.0.0.0 --port 8000 --workers 4
ENTRYPOINT [&quot;uvicorn&quot;, &quot;backend.main:create_app&quot;, &quot;--host&quot;, &quot;0.0.0.0&quot;, &quot;--port&quot;, &quot;8000&quot;, &quot;--workers&quot;, 4]
# ENTRYPOINT [&quot;gunicorn&quot;, &quot;-c&quot;, &quot;gunicorn.py&quot;, &quot;main:create_app&quot;]
</code></pre>
<h2 id="docker-componse">docker-componse</h2>
<pre><code class="language-yaml">version: &quot;3.10.11&quot;
# 应用服务
services:
# 应用服务
fastapi_getway:
# 容器名称
container_name: fastapi
# 镜像名称
image: fastapi
env_file: .env
networks:
- db_network
- web_network
# 构建镜像
build:
context: ./
dockerfile: Dockerfile
#build: .
# 将容器运行在特权模式下,意味着容器内的进程将具
# 有访问宿主机的权限,包括文件系统、设备和系统功能等
privileged: true
# 指定容器中运行的用户
user: root
# 启动策略为始终重启
restart: always
# 设置网络模式为host模式
network_mode: host
# 端口映射
ports:
- 8020:8020
# 文件挂载
volumes:
- ./:/data/apps
- ./uploads:/data/apps/uploads
# 执行命令
command: python app.py runserver 0.0.0.0:8020 --noreload
# 日志配置
logging:
driver: &quot;json-file&quot;
options:
max-size: &quot;500m&quot;
max-file: &quot;10&quot;
# nginx服务
nginx:
container_name: nginx
restart: always
image: &quot;nginx:latest&quot;
ports:
- &quot;5000:5000&quot;
volumes:
- ./nginx:/etc/nginx/conf.d
networks:
- web_network
depends_on:
- flask_api
# 中间件服务
mysql:
container_name: mysql
image: mysql:latest
restart: always
ports:
- &quot;3306:3306&quot;
# 数据卷挂载
networks:
db_network:
driver: bridge
web_network:
driver: bridge
</code></pre>
<h2 id="nginx">nginx</h2>
<pre><code class="language-nginx">########### 每个指令必须有分号结束。#################
user administrator administrators; # 配置用户或组,默认为nobody nobody
worker_processes 2; # 允许生成的进程数,默认为1
pid /nginx/pid/nginx.pid; # 指定 Nginx 进程运行文件存放地址
error_log log/error.log debug; # 制定日志路径,级别。这个设置可以放入全局块、http块、server块,级别依次为:debug|info|notice|warn|error|crit|alert|emerg
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
# 取消服务日志
access_log off;
# 自定义日志格式
log_format access '$remote_addr$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for';
# 启用访问日志
access_log log/access.log access; # combined为日志格式的默认值
sendfile on; # 允许sendfile方式传输文件,默认为off,可以在http块、server块、location块
sendfile_max_chunk 100k; # 每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限
keepalive_timeout 65; # 连接超时时间,默认为75秒,可以在http、server、location块
# 定义上游服务器
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; # 热备
}
# 错误页
error_page 404 https://www.baidu.com;
# 定义一个 server 块
server {
# 单连接请求上限次数
keepalive_requests 120;
# 监听端口
listen 4545;
# 监听地址
server_name 127.0.0.1;
# 前端代理
location / {
proxy_set_header Host $host;
root /web/front/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
try_files $uri $uri/ /index.html;
index /index.html;
}
# 后端代理
location /api/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header Access-Control-Allow-Methods *;
add_header Access-Control-Allow-Origin $http_origin;
proxy_pass http://127.0.0.1:8010/;
}
}
}
</code></pre>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="页脚" >
<a href="frontend.html" class="md-footer__link md-footer__link--prev" aria-label="上一页: 前端开发">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</div>
<div class="md-footer__title">
<span class="md-footer__direction">
上一页
</span>
<div class="md-ellipsis">
前端开发
</div>
</div>
</a>
<a href="mkdocs.html" class="md-footer__link md-footer__link--next" aria-label="下一页: 文档开发">
<div class="md-footer__title">
<span class="md-footer__direction">
下一页
</span>
<div class="md-ellipsis">
文档开发
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright © 2022 <a href="http://127.0.0.1:8888">Powered by xxxxx@qq.com 版权所有</a>
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.tabs", "navigation.tabs.sticky", "navigation.instant", "search.highlight", "search.suggest", "navigation.footer"], "search": "../assets/javascripts/workers/search.f8cc74c7.min.js", "translations": {"clipboard.copied": "\u5df2\u590d\u5236", "clipboard.copy": "\u590d\u5236", "search.result.more.one": "\u5728\u8be5\u9875\u4e0a\u8fd8\u6709 1 \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.more.other": "\u5728\u8be5\u9875\u4e0a\u8fd8\u6709 # \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.none": "\u6ca1\u6709\u627e\u5230\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.one": "\u627e\u5230 1 \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.other": "# \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.placeholder": "\u952e\u5165\u4ee5\u5f00\u59cb\u641c\u7d22", "search.result.term.missing": "\u7f3a\u5c11", "select.version": "\u9009\u62e9\u5f53\u524d\u7248\u672c"}}</script>
<script src="../assets/javascripts/bundle.c8b220af.min.js"></script>
</body>
</html>
+4 -90
View File
@@ -18,7 +18,7 @@
<link rel="prev" href="backend.html"> <link rel="prev" href="backend.html">
<link rel="next" href="build.html"> <link rel="next" href="mkdocs.html">
<link rel="icon" href="../assets/images/favicon.png"> <link rel="icon" href="../assets/images/favicon.png">
@@ -227,24 +227,6 @@
<li class="md-tabs__item">
<a href="build.html" class="md-tabs__link">
部署指南
</a>
</li>
<li class="md-tabs__item"> <li class="md-tabs__item">
<a href="mkdocs.html" class="md-tabs__link"> <a href="mkdocs.html" class="md-tabs__link">
@@ -558,7 +540,7 @@
<span class="md-ellipsis"> <span class="md-ellipsis">
部署指南 文档指南
</span> </span>
@@ -568,74 +550,6 @@
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3"> <label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
部署指南
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="build.html" class="md-nav__link">
<span class="md-ellipsis">
本地部署
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-ellipsis">
文档指南
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span> <span class="md-nav__icon md-icon"></span>
文档指南 文档指南
</label> </label>
@@ -852,13 +766,13 @@ npm run lint
<a href="build.html" class="md-footer__link md-footer__link--next" aria-label="下一页: 本地部署"> <a href="mkdocs.html" class="md-footer__link md-footer__link--next" aria-label="下一页: 文档开发">
<div class="md-footer__title"> <div class="md-footer__title">
<span class="md-footer__direction"> <span class="md-footer__direction">
下一页 下一页
</span> </span>
<div class="md-ellipsis"> <div class="md-ellipsis">
本地部署 文档开发
</div> </div>
</div> </div>
<div class="md-footer__button md-icon"> <div class="md-footer__button md-icon">
+7 -93
View File
@@ -15,7 +15,7 @@
<link rel="canonical" href="http://127.0.0.1:8888/doc/mkdocs.html"> <link rel="canonical" href="http://127.0.0.1:8888/doc/mkdocs.html">
<link rel="prev" href="build.html"> <link rel="prev" href="frontend.html">
@@ -220,24 +220,6 @@
<li class="md-tabs__item">
<a href="build.html" class="md-tabs__link">
部署指南
</a>
</li>
@@ -421,74 +403,6 @@
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<span class="md-ellipsis">
部署指南
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
部署指南
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="build.html" class="md-nav__link">
<span class="md-ellipsis">
本地部署
</span>
</a>
</li>
</ul>
</nav>
</li>
@@ -507,10 +421,10 @@
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" checked> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex=""> <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-ellipsis"> <span class="md-ellipsis">
@@ -522,8 +436,8 @@
<span class="md-nav__icon md-icon"></span> <span class="md-nav__icon md-icon"></span>
</label> </label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="true"> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_4"> <label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span> <span class="md-nav__icon md-icon"></span>
文档指南 文档指南
</label> </label>
@@ -882,7 +796,7 @@ mkdocs-git-revision-date-localized-plugin
<nav class="md-footer__inner md-grid" aria-label="页脚" > <nav class="md-footer__inner md-grid" aria-label="页脚" >
<a href="build.html" class="md-footer__link md-footer__link--prev" aria-label="上一页: 本地部署"> <a href="frontend.html" class="md-footer__link md-footer__link--prev" aria-label="上一页: 前端开发">
<div class="md-footer__button md-icon"> <div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
@@ -892,7 +806,7 @@ mkdocs-git-revision-date-localized-plugin
上一页 上一页
</span> </span>
<div class="md-ellipsis"> <div class="md-ellipsis">
本地部署 前端开发
</div> </div>
</div> </div>
</a> </a>
+54 -87
View File
@@ -225,24 +225,6 @@
<li class="md-tabs__item">
<a href="doc/build.html" class="md-tabs__link">
部署指南
</a>
</li>
<li class="md-tabs__item"> <li class="md-tabs__item">
<a href="doc/mkdocs.html" class="md-tabs__link"> <a href="doc/mkdocs.html" class="md-tabs__link">
@@ -445,6 +427,15 @@
</span> </span>
</a> </a>
</li>
<li class="md-nav__item">
<a href="#docker" class="md-nav__link">
<span class="md-ellipsis">
docker 部署
</span>
</a>
</li> </li>
</ul> </ul>
@@ -829,7 +820,7 @@
<span class="md-ellipsis"> <span class="md-ellipsis">
部署指南 文档指南
</span> </span>
@@ -839,74 +830,6 @@
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3"> <label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
部署指南
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="doc/build.html" class="md-nav__link">
<span class="md-ellipsis">
本地部署
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-ellipsis">
文档指南
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span> <span class="md-nav__icon md-icon"></span>
文档指南 文档指南
</label> </label>
@@ -1054,6 +977,15 @@
</span> </span>
</a> </a>
</li>
<li class="md-nav__item">
<a href="#docker" class="md-nav__link">
<span class="md-ellipsis">
docker 部署
</span>
</a>
</li> </li>
</ul> </ul>
@@ -1578,6 +1510,41 @@
<li>账号:<code>admin</code> 密码:<code>123456</code></li> <li>账号:<code>admin</code> 密码:<code>123456</code></li>
<li>接口地址:<a href="http://127.0.0.1:8000/api/v1/docs">http://127.0.0.1:8000/api/v1/docs</a></li> <li>接口地址:<a href="http://127.0.0.1:8000/api/v1/docs">http://127.0.0.1:8000/api/v1/docs</a></li>
</ul> </ul>
<h3 id="docker">docker 部署</h3>
<ul>
<li>cd fastapi_vue3_amdin/frontend</li>
<li>npm run build (保证dist前端打包内容存在,否则运行会报错)</li>
<li>cd fastapi_vue3_amdin</li>
<li>docker compose up -d</li>
<li>注意事项:</li>
<li>前端.env.production 中 VITE_API_BASE_URL需要修改为公网地址</li>
<li>后端.env.prod 中 MYSQL_HOST、REDIS_HOST需要改为私网地址</li>
<li>遇到问题:</li>
<li>后端启动报错:一般是由于初始化脚本没有执行,脚本目录:backend/sql/mysql_xxx.sql</li>
<li>还有可能是因为mysql、redis中间件没有启动,需要手动启动</li>
<li>部署顺序:</li>
<li>
<ol>
<li>启动mysql、redis中间件</li>
</ol>
</li>
<li>
<ol>
<li>执行初始化脚本</li>
</ol>
</li>
<li>
<ol>
<li>启动后端服务</li>
</ol>
</li>
<li>
<ol>
<li>启动前端服务</li>
</ol>
</li>
<li>访问地址:公网地址,80端口;登录admin/123456</li>
</ul>
<h2 id="_11">🔧 模块展示</h2> <h2 id="_11">🔧 模块展示</h2>
<h3 id="_12">登陆</h3> <h3 id="_12">登陆</h3>
<p><img alt="登陆" src="resources/images/login.png" /></p> <p><img alt="登陆" src="resources/images/login.png" /></p>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 KiB

After

Width:  |  Height:  |  Size: 207 KiB

File diff suppressed because one or more lines are too long
+4 -8
View File
@@ -2,22 +2,18 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url> <url>
<loc>http://127.0.0.1:8888/index.html</loc> <loc>http://127.0.0.1:8888/index.html</loc>
<lastmod>2025-04-16</lastmod> <lastmod>2025-05-17</lastmod>
</url> </url>
<url> <url>
<loc>http://127.0.0.1:8888/doc/backend.html</loc> <loc>http://127.0.0.1:8888/doc/backend.html</loc>
<lastmod>2025-04-16</lastmod> <lastmod>2025-05-17</lastmod>
</url>
<url>
<loc>http://127.0.0.1:8888/doc/build.html</loc>
<lastmod>2025-04-16</lastmod>
</url> </url>
<url> <url>
<loc>http://127.0.0.1:8888/doc/frontend.html</loc> <loc>http://127.0.0.1:8888/doc/frontend.html</loc>
<lastmod>2025-04-16</lastmod> <lastmod>2025-05-17</lastmod>
</url> </url>
<url> <url>
<loc>http://127.0.0.1:8888/doc/mkdocs.html</loc> <loc>http://127.0.0.1:8888/doc/mkdocs.html</loc>
<lastmod>2025-04-16</lastmod> <lastmod>2025-05-17</lastmod>
</url> </url>
</urlset> </urlset>
Binary file not shown.
-210
View File
@@ -1,210 +0,0 @@
# 部署介绍
## docker
``` dockerfile
# 使用官方的 Python 3.10 镜像作为基础镜像
FROM python:3.10
# 使用 LABEL 替代 MAINTAINER
LABEL maintainer="管理员"
# 设置 python 环境变量
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1
# 设置时区
ENV TZ Asia/Shanghai
# 升级pip版本
# RUN python -m pip install --upgrade pip
# 创建容器工作目录
RUN mkdir -p /opt/fastapi_project
# 设置容器内工作目录
WORKDIR /opt/fastapi_project
# 将当前主机目录全部文件复制至容器工作目录
COPY ./requirements.txt /code/requirements.txt
# 安装依赖
RUN pip install --no-cache-dir --upgrade -r /opt/fastapiproject/backend/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 部署 nginx
RUN apt-get update && apt-get install -y nginx
RUN rm /etc/nginx/sites-enabled/default
COPY nginx.conf /etc/nginx/sites-available/
RUN ln -s /etc/nginx/sites-available/nginx.conf /etc/nginx/sites-enabled/
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
# # 部署mysql
# RUN apt-get install -y mysql-server
# # 部署redis
# RUN apt-get install -y redis-server
# # 部署mongo
# RUN apt-get install -y mongodb
#CMD 运行以下命令,daemon off后台运行,否则启动完就自动关闭
CMD ["nginx", "-g", "daemon off;"]
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
# 暴露端口
EXPOSE 8000
# python main.py run 或者 uvicorn main:create_app --host 0.0.0.0 --port 8000 --workers 4
ENTRYPOINT ["uvicorn", "backend.main:create_app", "--host", "0.0.0.0", "--port", "8000", "--workers", 4]
# ENTRYPOINT ["gunicorn", "-c", "gunicorn.py", "main:create_app"]
```
## docker-componse
```yaml
version: "3.10.11"
# 应用服务
services:
# 应用服务
fastapi_getway:
# 容器名称
container_name: fastapi
# 镜像名称
image: fastapi
env_file: .env
networks:
- db_network
- web_network
# 构建镜像
build:
context: ./
dockerfile: Dockerfile
#build: .
# 将容器运行在特权模式下,意味着容器内的进程将具
# 有访问宿主机的权限,包括文件系统、设备和系统功能等
privileged: true
# 指定容器中运行的用户
user: root
# 启动策略为始终重启
restart: always
# 设置网络模式为host模式
network_mode: host
# 端口映射
ports:
- 8020:8020
# 文件挂载
volumes:
- ./:/data/apps
- ./uploads:/data/apps/uploads
# 执行命令
command: python app.py runserver 0.0.0.0:8020 --noreload
# 日志配置
logging:
driver: "json-file"
options:
max-size: "500m"
max-file: "10"
# nginx服务
nginx:
container_name: nginx
restart: always
image: "nginx:latest"
ports:
- "5000:5000"
volumes:
- ./nginx:/etc/nginx/conf.d
networks:
- web_network
depends_on:
- flask_api
# 中间件服务
mysql:
container_name: mysql
image: mysql:latest
restart: always
ports:
- "3306:3306"
# 数据卷挂载
networks:
db_network:
driver: bridge
web_network:
driver: bridge
```
## nginx
```nginx
########### 每个指令必须有分号结束。#################
user administrator administrators; # 配置用户或组,默认为nobody nobody
worker_processes 2; # 允许生成的进程数,默认为1
pid /nginx/pid/nginx.pid; # 指定 Nginx 进程运行文件存放地址
error_log log/error.log debug; # 制定日志路径,级别。这个设置可以放入全局块、http块、server块,级别依次为:debug|info|notice|warn|error|crit|alert|emerg
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
# 取消服务日志
access_log off;
# 自定义日志格式
log_format access '$remote_addr$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for';
# 启用访问日志
access_log log/access.log access; # combined为日志格式的默认值
sendfile on; # 允许sendfile方式传输文件,默认为off,可以在http块、server块、location块
sendfile_max_chunk 100k; # 每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限
keepalive_timeout 65; # 连接超时时间,默认为75秒,可以在http、server、location块
# 定义上游服务器
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; # 热备
}
# 错误页
error_page 404 https://www.baidu.com;
# 定义一个 server 块
server {
# 单连接请求上限次数
keepalive_requests 120;
# 监听端口
listen 4545;
# 监听地址
server_name 127.0.0.1;
# 前端代理
location / {
proxy_set_header Host $host;
root /web/front/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
try_files $uri $uri/ /index.html;
index /index.html;
}
# 后端代理
location /api/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header Access-Control-Allow-Methods *;
add_header Access-Control-Allow-Origin $http_origin;
proxy_pass http://127.0.0.1:8010/;
}
}
}
```
+19
View File
@@ -183,6 +183,25 @@ git clone https://gitee.com/tao__tao/fastapi_vue3_admin.git
- 账号:`admin` 密码:`123456` - 账号:`admin` 密码:`123456`
- 接口地址:<http://127.0.0.1:8000/api/v1/docs> - 接口地址:<http://127.0.0.1:8000/api/v1/docs>
### docker 部署
- cd fastapi_vue3_amdin/frontend
- npm run build (保证dist前端打包内容存在,否则运行会报错)
- cd fastapi_vue3_amdin
- docker compose up -d
- 注意事项:
- 前端.env.production 中 VITE_API_BASE_URL需要修改为公网地址
- 后端.env.prod 中 MYSQL_HOST、REDIS_HOST需要改为私网地址
- 遇到问题:
- 后端启动报错:一般是由于初始化脚本没有执行,脚本目录:backend/sql/mysql_xxx.sql
- 还有可能是因为mysql、redis中间件没有启动,需要手动启动
- 部署顺序:
- 1. 启动mysql、redis中间件
- 2. 执行初始化脚本
- 3. 启动后端服务
- 4. 启动前端服务
- 访问地址:公网地址,80端口;登录admin/123456
## 🔧 模块展示 ## 🔧 模块展示
### 登陆 ### 登陆
-2
View File
@@ -33,8 +33,6 @@ nav:
- 开发指南: - 开发指南:
- 后端开发: doc/backend.md - 后端开发: doc/backend.md
- 前端开发: doc/frontend.md - 前端开发: doc/frontend.md
- 部署指南:
- 本地部署: doc/build.md
- 文档指南: - 文档指南:
- 文档开发: doc/mkdocs.md - 文档开发: doc/mkdocs.md
+7 -2
View File
@@ -17,7 +17,6 @@ http {
# 访问服务日志 # 访问服务日志
access_log on; access_log on;
access_log /var/log/nginx/host.access.log info;
sendfile on; # 允许sendfile方式传输文件,默认为off,可以在http块、server块、location块 sendfile on; # 允许sendfile方式传输文件,默认为off,可以在http块、server块、location块
@@ -35,10 +34,16 @@ http {
location / { location / {
root /usr/share/nginx/html; #nginx容器规定位置; root /usr/share/nginx/html; #nginx容器规定位置;
index index.html index.htm; index index.html index.htm;
try_files $uri $uri/ /index.html; #解决页面刷新404问题
} }
# 后端代理 # 后端代理
location /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-NginX-Proxy true;
proxy_pass http://172.18.52.77:8001; proxy_pass http://172.18.52.77:8001;
} }