运行FastAPI官方模板”I found on GitHub the “Full Stack FastAPI and PostgreSQL – Base Project Generator” (2023年05月版)”

总结

我有些事情需要用到 FastAPI 项目。
我知道有官方的模板,但维护工作在2020年6月就停止了,而且即使运行 docker-compose up -d,也无法正常工作。因此,我进行了一些修改,暂时让它能够正常运行至少一部分。

這是關於修改項目的備忘錄。(如果處理積壓的公關問題,應該可以修正。)

 

因此

创建项目

请按照官方网站上的“如何使用”步骤来生成项目。

 

所以,一旦创建了项目,让我们首先不要思考任何事情,尝试使用 docker-compose up -d 启动容器组。

 

如果按照所期望的那样,应该会出现错误。

关于前端的 fork-ts-checker-webpack-plugin-v5 的错误。

当出现类似于 fork-ts-checker-webpack-plugin-v5 的错误时,它是在前端部分发生的情况。

错误详情
– 正在进行生产环境构建…
错误 错误:找不到模块’fork-ts-checker-webpack-plugin-v5′
错误:找不到模块’fork-ts-checker-webpack-plugin-v5′
在Function.Module._resolveFilename (internal/modules/cjs/loader.js:582:15)中
在Function.Module._load (internal/modules/cjs/loader.js:508:25)中
在Module.require (internal/modules/cjs/loader.js:637:17)中
在require (internal/modules/cjs/helpers.js:22:18)中
在api.chainWebpack.config (/app/node_modules/@vue/cli-plugin-typescript/index.js:106:16)中
在webpackChainFns.forEach.fn (/app/node_modules/@vue/cli-service/lib/Service.js:236:40)中
在Array.forEach ()中
在Service.resolveChainableWebpackConfig (/app/node_modules/@vue/cli-service/lib/Service.js:236:26)中
在PluginAPI.resolveChainableWebpackConfig (/app/node_modules/@vue/cli-service/lib/PluginAPI.js:145:25)中
在module.exports (/app/node_modules/@vue/cli-service/lib/commands/build/resolveAppConfig.js:9:22)中
在build (/app/node_modules/@vue/cli-service/lib/commands/build/index.js:147:50)中
在api.registerCommand (/app/node_modules/@vue/cli-service/lib/commands/build/index.js:89:13)中
在Service.run (/app/node_modules/@vue/cli-service/lib/Service.js:230:12)中
在Object. (/app/node_modules/@vue/cli-service/bin/vue-cli-service.js:36:9)中
在Module._compile (internal/modules/cjs/loader.js:701:30)中
在Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)中
npm ERR! 代码 ELIFECYCLE
npm ERR! 错误码 1
npm ERR! 错误号 1
npm ERR! frontend@0.1.0 build:`vue-cli-service build`
npm ERR! 状态 1
npm ERR!
npm ERR! 在 frontend@0.1.0 build 脚本中出现错误。
npm ERR! 这可能不是npm的问题。可能有其他详细日志记录。npm ERR! 可以在以下位置找到完整的运行日志:
npm ERR! /root/.npm/_logs/2023-05-04T04_01_39_533Z-debug.log
错误:服务’frontend’构建失败:命令’/bin/sh -c npm run build’返回了非零代码:1

应对措施

在谷歌中搜索会得到以下这样的页面。

 

似乎依赖于Node的版本。
我想升级Node的版本,但官方只支持到v10。
于是我在互联网上搜索,发现有一个适用于v16的docker镜像的分支,我们就用它吧。

 

所以我会进行修正。

- FROM tiangolo/node-frontend:10 as build-stage
+ FROM greenaj/node-frontend:16 as build-stage

为什么 nginx.conf 文件的文件名也被更改了,所以我们也需要修改那里。

FROM nginx:1.15

COPY --from=build-stage /app/dist/ /usr/share/nginx/html

- COPY --from=build-stage /nginx.conf /etc/nginx/conf.d/default.conf
+ COPY --from=build-stage /default.conf /etc/nginx/conf.d/default.conf
COPY ./nginx-backend-not-found.conf /etc/nginx/extra-conf.d/backend-not-found.conf

「诗歌的404错误未找到」

如果在后端出现了404:未找到的错误。

错误详细信息
第3/15步:运行curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | POETRY_HOME=/opt/poetry python && cd /usr/local/bin && ln -s /opt/poetry/bin/poetry && poetry config virtualenvs.create false
—> 运行中374e5a279887
文件“”,第1行
404:未找到
^
语法错误:无效的语法
错误:服务’celeryworker’构建失败:命令’/bin/sh -c curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | POETRY_HOME=/opt/poetry python && cd /usr/local/bin && ln -s /opt/poetry/bin/poetry && poetry config virtualenvs.create false’返回了非零代码:1

解决方案 ‘àn)

我看你想要安装 Poetry。
但是,由于安装位置的 URL 发生了变化,所以出现了错误。
我将按照以下方式更改安装位置的 URL。

 

我会把后端的两个Dockerfile都重写一遍。

# Install Poetry
- RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | POETRY_HOME=/opt/poetry python && \
+ RUN curl -sSL https://install.python-poetry.org | POETRY_HOME=/opt/poetry python && \
    cd /usr/local/bin && \
    ln -s /opt/poetry/bin/poetry && \
    poetry config virtualenvs.create false
# Install Poetry
- RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | POETRY_HOME=/opt/poetry python && \
+ RUN curl -sSL https://install.python-poetry.org | POETRY_HOME=/opt/poetry python && \
    cd /usr/local/bin && \
    ln -s /opt/poetry/bin/poetry && \
    poetry config virtualenvs.create false

花朵发生错误,无法启动。

如果花朵发生错误并无法启动。

错误详细信息:
正在创建full-stack-fastapi-postgresql_db_1 … 已完成
正在创建full-stack-fastapi-postgresql_flower_1 … 错误
正在创建full-stack-fastapi-postgresql_queue_1 … 已完成
正在创建full-stack-fastapi-postgresql_frontend_1 … 已完成
正在创建full-stack-fastapi-postgresql_proxy_1 … 已完成
正在创建full-stack-fastapi-postgresql_pgadmin_1 …
正在创建full-stack-fastapi-postgresql_backend_1 …
正在创建full-stack-fastapi-postgresql_celeryworker_1 …错误:无法启动flower服务 full-stack-fastapi-postgresql_flower_1: 正在创建full-stack-fastapi-postgresql_pgadmin_1 … 已完成
正在创建full-stack-fastapi-postgresql_backend_1 … 已完成
正在创建full-stack-fastapi-postgresql_celeryworker_1 … 已完成

错误:无法启动flower服务 flower:无法创建shim任务:OCI运行时创建失败:runc创建失败:无法启动容器进程:exec:“–broker=amqp://guest@queue:5672//”:stat –broker=amqp://guest@queue:5672//: 没有该文件或目录:未知
错误:在启动项目时遇到错误。

应对措施

不知道原因是什么,但似乎新版本不行。

 

既然如此,为了暂时使其运行起来,我会使用评论中提到的旧版本来进行操作。

  flower:
-   image: mher/flower
+   image: mher/flower:0.9.7
    networks:
      - ${TRAEFIK_PUBLIC_NETWORK?Variable not set}
      - default
    env_file:

后端出现 AttributeError 错误:模块 ‘h11’ 没有 ‘Event’ 属性。

当到达此处时,表面上看似乎正在运作,但实际上可能并未动作。
通过运行docker-compose ps命令进行确认,结果如下。

              Name                             Command               State                 Ports              
--------------------------------------------------------------------------------------------------------------
full-stack-fastapi-                 /start-reload.sh                 Exit 1                                   
postgresql_backend_1                                                                                          
full-stack-fastapi-                 bash /worker-start.sh            Exit 1                                   
postgresql_celeryworker_1                                                                                     
full-stack-fastapi-                 docker-entrypoint.sh postgres    Up       5432/tcp                        
postgresql_db_1                                                                                               
full-stack-fastapi-                 flower --broker=amqp://gue ...   Up       0.0.0.0:5555->5555/tcp,:::5555->
postgresql_flower_1                                                           5555/tcp                        
full-stack-fastapi-                 nginx -g daemon off;             Up       80/tcp                          
postgresql_frontend_1                                                                                         
full-stack-fastapi-                 /entrypoint.sh                   Up       443/tcp, 0.0.0.0:5050->5050/tcp,
postgresql_pgadmin_1                                                          :::5050->5050/tcp, 80/tcp       
full-stack-fastapi-                 /entrypoint.sh --providers ...   Up       0.0.0.0:80->80/tcp,:::80->80/tcp
postgresql_proxy_1                                                            , 0.0.0.0:8090->8080/tcp,:::8090
                                                                              ->8080/tcp                      
full-stack-fastapi-                 docker-entrypoint.sh rabbi ...   Up       15691/tcp, 15692/tcp, 25672/tcp,
postgresql_queue_1                                                            4369/tcp, 5671/tcp, 5672/tcp   

后端和celeryworker崩溃了,退出码为1。
因此,让我们从后端中使用docker-compose logs backend来检查。

当我试图查看时,出现了错误信息:AttributeError:模块’h11’没有’Event’属性。

错误详细信息
backend_1 | 文件“/usr/local/lib/python3.7/site-packages/httpcore/_sync/__init__.py”的第1行
backend_1 | 来自 .connection 导入 HTTPConnection
backend_1 | 文件“/usr/local/lib/python3.7/site-packages/httpcore/_sync/connection.py”的第13行
backend_1 | 来自 .http11 导入 HTTP11Connection
backend_1 | 文件“/usr/local/lib/python3.7/site-packages/httpcore/_sync/http11.py”的第44行
backend_1 | 类 HTTP11Connection(ConnectionInterface):
backend_1 | 文件“/usr/local/lib/python3.7/site-packages/httpcore/_sync/http11.py”的第144行
backend_1 | self, event: h11.Event, timeout: Optional[float] = None
backend_1 | AttributeError: 模块 ‘h11’ 没有属性 ‘Event’

应对方法

经过调查,似乎是与依赖于httpcore库的版本有关的问题。

 

因此,让我们将 httpcore 版本固定为较旧的版本,并将其添加到 pyproject.toml 中。

[tool.poetry.dependencies]
python = "^3.7"
uvicorn = "^0.11.3"
fastapi = "^0.54.1"
...
python-jose = {extras = ["cryptography"], version = "^3.1.0"}
httpcore = "<=0.15"
importlib-metadata = "<5"
+ httpcore = "<=0.15"

修改后,请重建docker-compose构建并启动。

celeryworker发生AttributeError错误:’EntryPoints’对象没有’get’属性。

如果 celeryworker 出现 AttributeError: ‘EntryPoints’ 对象没有 ‘get’ 属性的错误时,请考虑以下情况。

错误详情
celeryworker_1 | 文件 “/usr/local/lib/python3.7/site-packages/celery/bin/base.py”,第16行,模块名称,来自 celery 中的 VERSION_BANNER,Celery,maybe_patch_concurrency,signals
celeryworker_1 | 文件 “/usr/local/lib/python3.7/site-packages/celery/signals.py”,第16行,模块名称,来自 celery.utils.dispatch 中的 Signal
celeryworker_1 | 文件 “/usr/local/lib/python3.7/site-packages/celery/utils/__init__.py”,第19行,模块名称,来自 celery.utils.nodenames 中的 nodename,nodesplit,worker_direct
celeryworker_1 | 文件 “/usr/local/lib/python3.7/site-packages/celery/utils/nodenames.py”,第9行,模块名称,来自 kombu.entity 中的 Exchange,Queue
celeryworker_1 | 文件 “/usr/local/lib/python3.7/site-packages/kombu/entity.py”,第9行,模块名称,来自 .serialization 中的 prepare_accept_content
celeryworker_1 | 文件 “/usr/local/lib/python3.7/site-packages/kombu/serialization.py”,第456行,模块名称,entrypoints(‘kombu.serializers’) 中的 ep,args(覆盖率不适用)
celeryworker_1 | 文件 “/usr/local/lib/python3.7/site-packages/kombu/utils/compat.py”,第93行,模块名称,importlib_metadata.entry_points().get(namespace,[]) 中的 ep
celeryworker_1 | AttributeError: ‘EntryPoints’ 对象没有 ‘get’ 属性

对策 (duì cè)

似乎是依赖于 importlib-metadata 库的版本的问题。

 

那么,让我们将 importlib-metadata 的版本固定为旧版本。我们在 pyproject.toml 中进行追加。

[tool.poetry.dependencies]
python = "^3.7"
uvicorn = "^0.11.3"
fastapi = "^0.54.1"
...
python-jose = {extras = ["cryptography"], version = "^3.1.0"}
httpcore = "<=0.15"
importlib-metadata = "<5"
httpcore = "<=0.15"
+ importlib-metadata = "<5"

修改后,执行 docker-compose build celeryworker 进行重新构建,然后再运行。

他动了!

修正完之后,我们先刷新一下页面。

docker-compose stop
docker-compose build
docker-compose up -d

当您运行`docker-compose ps`命令时,所有服务应该都已经启动了。

              Name                             Command               State                 Ports              
--------------------------------------------------------------------------------------------------------------
full-stack-fastapi-                 /start-reload.sh                 Up      80/tcp, 0.0.0.0:8888->8888/tcp,::
postgresql_backend_1                                                         :8888->8888/tcp                  
full-stack-fastapi-                 bash /worker-start.sh            Up                                       
postgresql_celeryworker_1                                                                                     
full-stack-fastapi-                 docker-entrypoint.sh postgres    Up      5432/tcp                         
postgresql_db_1                                                                                               
full-stack-fastapi-                 flower --broker=amqp://gue ...   Up      0.0.0.0:5555->5555/tcp,:::5555->5
postgresql_flower_1                                                          555/tcp                          
full-stack-fastapi-                 nginx -g daemon off;             Up      80/tcp                           
postgresql_frontend_1                                                                                         
full-stack-fastapi-                 /entrypoint.sh                   Up      443/tcp, 0.0.0.0:5050->5050/tcp,:
postgresql_pgadmin_1                                                         ::5050->5050/tcp, 80/tcp         
full-stack-fastapi-                 /entrypoint.sh --providers ...   Up      0.0.0.0:80->80/tcp,:::80->80/tcp,
postgresql_proxy_1                                                           0.0.0.0:8090->8080/tcp,:::8090->8
                                                                             080/tcp                          
full-stack-fastapi-                 docker-entrypoint.sh rabbi ...   Up      15691/tcp, 15692/tcp, 25672/tcp, 
postgresql_queue_1                                                           4369/tcp, 5671/tcp, 5672/tcp   

以上!辛苦了! yǐ, kǔ le!)

广告
将在 10 秒后关闭
bannerAds