Replace gunicorn deployment to granian (#705)

* Replace gunicorn deployment to granian

* Update env comments

* Fix the granian env
This commit is contained in:
Wu Clan
2025-07-01 21:33:49 +08:00
committed by GitHub
parent 7b5ae4696f
commit 4ed49d2d13
6 changed files with 119 additions and 66 deletions

View File

@ -38,24 +38,39 @@ COPY --from=builder /usr/local /usr/local
COPY deploy/backend/supervisord.conf /etc/supervisor/supervisord.conf
WORKDIR /fba/backend
# === FastAPI server image ===
FROM base_server AS fastapi_server
WORKDIR /fba
COPY deploy/backend/fastapi_server.conf /etc/supervisor/conf.d/
RUN mkdir -p /var/log/fastapi_server
EXPOSE 8001
CMD ["uvicorn", "backend.main:app", "--host", "0.0.0.0", "--port","8000"]
# Granian env
ENV GRANIAN_HOST=0.0.0.0 \
GRANIAN_PORT=8001 \
# 并行工作进程数
GRANIAN_WORKERS=1 \
# 监听队列
GRANIAN_BACKLOG=1024 \
# 每个工作进程处理超时时间
GRANIAN_WORKERS_KILL_TIMEOUT=120 \
# 每个工作进程最大并发量
GRANIAN_BACKPRESSURE=2000 \
# PID 文件
GRANIAN_PID_FILE='/var/run/granian.pid' \
# 日志
GRANIAN_LOG_ENABLED=true \
GRANIAN_LOG_LEVEL='debug'
CMD ["/usr/local/bin/granian", "main:app", "--interface", "asgi", "--host", "0.0.0.0", "--port","8000"]
# === Celery server image ===
FROM base_server AS celery
WORKDIR /fba/backend
COPY deploy/backend/celery.conf /etc/supervisor/conf.d/
RUN mkdir -p /var/log/celery

View File

@ -1,6 +1,6 @@
[program:fastapi_server]
directory=/fba
command=/usr/local/bin/gunicorn -c /fba/deploy/backend/gunicorn.conf.py main:app
directory=/fba/backend
command=/usr/local/bin/granian main:app --interface asgi
user=root
autostart=true
autorestart=true

View File

@ -1,44 +0,0 @@
# fmt: off
# 监听内网端口
bind = '0.0.0.0:8001'
# 工作目录
chdir = '/fba/backend/'
# 并行工作进程数
workers = 1
# 监听队列
backlog = 512
# 超时时间
timeout = 120
# 设置守护进程,将进程交给 supervisor 管理;如果设置为 True 时supervisor 启动日志为:
# gave up: fastapi_server entered FATAL state, too many start retries too quickly
# 则需要将此改为: False
daemon = False
# 工作模式协程
worker_class = 'uvicorn.workers.UvicornWorker'
# 设置最大并发量
worker_connections = 2000
# 设置进程文件目录
pidfile = '/var/run/gunicorn.pid'
# 设置访问日志和错误信息日志
accesslog = '-'
errorlog = '-'
# 设置这个值为true 才会把打印信息记录到错误日志里
capture_output = True
# 设置日志记录水平
loglevel = 'debug'
# python程序
pythonpath = '/usr/local/lib/python3.10/site-packages'
# 启动 gunicorn -c gunicorn.conf.py main:app

View File

@ -13,6 +13,7 @@ services:
volumes:
- ./deploy/backend/docker-compose/.env.server:/fba/backend/.env
- fba_static:/fba/backend/app/static
- fba_static_upload:/fba/backend/static/upload
networks:
- fba_network
command:

View File

@ -60,8 +60,8 @@ lint = [
"pre-commit>=4.0.0",
]
server = [
"gunicorn>=21.2.0",
"aio-pika>=9.4.3",
"granian>=2.4.0",
"wait-for-it>=2.2.2",
]

109
uv.lock generated
View File

@ -691,7 +691,7 @@ lint = [
]
server = [
{ name = "aio-pika" },
{ name = "gunicorn" },
{ name = "granian" },
{ name = "wait-for-it" },
]
@ -742,7 +742,7 @@ dev = [
lint = [{ name = "pre-commit", specifier = ">=4.0.0" }]
server = [
{ name = "aio-pika", specifier = ">=9.4.3" },
{ name = "gunicorn", specifier = ">=21.2.0" },
{ name = "granian", specifier = ">=2.4.0" },
{ name = "wait-for-it", specifier = ">=2.2.2" },
]
@ -863,6 +863,99 @@ wheels = [
{ url = "https://mirrors.aliyun.com/pypi/packages/86/63/197aa67250943b508b34995c2aa6b46402e7e6f11785487740c2057bfb20/gevent-24.11.1-pp310-pypy310_pp73-macosx_11_0_universal2.whl", hash = "sha256:f43f47e702d0c8e1b8b997c00f1601486f9f976f84ab704f8f11536e3fa144c9" },
]
[[package]]
name = "granian"
version = "2.4.0"
source = { registry = "https://mirrors.aliyun.com/pypi/simple" }
dependencies = [
{ name = "click" },
]
sdist = { url = "https://mirrors.aliyun.com/pypi/packages/1d/e0/74374a6904a77c71b1e757215e38f0b4a6f629a3251361da9dffd390fdec/granian-2.4.0.tar.gz", hash = "sha256:0b49a522bb485823404daae49160b81c7cbf8e2a402dcd9b02f48da8465da8b7" }
wheels = [
{ url = "https://mirrors.aliyun.com/pypi/packages/ec/1f/d25d0e34d4adaa611ec196bcbb8f3535fccead3d534d5310145397f07a47/granian-2.4.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5c03caded738d0e05258134b321e91b6e7a449fbfb9f2e93cc0f7bea1c85cc6c" },
{ url = "https://mirrors.aliyun.com/pypi/packages/2a/07/0cf15e454942e906745d871fae7392bd1b4017eb61c25050eac25076174f/granian-2.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0a1112233b46e8cd8451afbf9136a489169f5d7a4c6e63696cbe9e6e8e0a15b7" },
{ url = "https://mirrors.aliyun.com/pypi/packages/ec/4b/7559d412251618237ad184832c5d84090ea3d8fac93a8361ae820872bd68/granian-2.4.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c31dda9cf9146dc0aca0f2773ac3828489a2fb88e680d71b5a353bb7a0993bc" },
{ url = "https://mirrors.aliyun.com/pypi/packages/88/93/66db068f45a13bf7e0dd1ef7d6a69786d6a8e1f631926f90411c2190fc46/granian-2.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:75ab562286d76ccc87a4a7a0ee10949c14517a80a1b1c1d86bde6a66561a1c31" },
{ url = "https://mirrors.aliyun.com/pypi/packages/c3/dc/dee29d9e9243f7c629eadee1ac1cef36a24e0f89e05953b2a6a0021a5b37/granian-2.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d603dd4c8bef33592288b63612d16abc53c9d34107748704fbd329d06d5243de" },
{ url = "https://mirrors.aliyun.com/pypi/packages/62/9a/71e3f86f232d19fd95ff344169b13fbb905c74e8ac94be9ac6e55c63b259/granian-2.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:022a334a7d0a44fef1c177a7403dd1e3f12db3761ea7088c23485337b7628580" },
{ url = "https://mirrors.aliyun.com/pypi/packages/71/97/ca1d0ef70721bcc2e5b113797abd00718ad7290f45f164a7a46b56ba7686/granian-2.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2d776b38887fce3d6afbf9e7d11d871780dea1e04a363977ff4e7f044dfb0060" },
{ url = "https://mirrors.aliyun.com/pypi/packages/9f/a4/2a7cbbedb73feea44416cccb14c2d0816a50229da1b80230bdd1f40d4ae5/granian-2.4.0-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:108dd7223263955306ac4d4add2e881cbf3ad5570220a7f242a63cce9cdb684c" },
{ url = "https://mirrors.aliyun.com/pypi/packages/14/ed/cc550e3380e295b5d315f8e09831a93b48d38eeebc4b6f07a3d03cd74e67/granian-2.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bdcb2aea674e4b781604cc4b6788d0913b687996a8c313cbd0ca025d94b75efa" },
{ url = "https://mirrors.aliyun.com/pypi/packages/60/42/55aec33f33234b62446f6e7126a587d7776e52ed1fe06d62683b0c4afa4d/granian-2.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:38de645d1b7fb6df413e9e98ef868ec431d7fdd410a45c9b892413cc335f30ca" },
{ url = "https://mirrors.aliyun.com/pypi/packages/7d/94/0eb7efcb3543f1e26e147d6a190e3c9520e7dcc11ca029d10b60ace35058/granian-2.4.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:93492d0b5263e7f9f4fd1ccb71ec19ffbd62ca604acb49cb6678fedfec470673" },
{ url = "https://mirrors.aliyun.com/pypi/packages/9b/d4/a77416bf32b03df291bc8b38a814048c8b782c2cfd782352419ac8db126e/granian-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c883d2fc5155724ebe8387f069f9de54280bf52870c593bb75a64a5a54cc34c7" },
{ url = "https://mirrors.aliyun.com/pypi/packages/df/7a/4c6b6130833f2348ea601bd7261622d43c3ab574cd60d96f7517647eeb55/granian-2.4.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:374183e6368b3927ff4834814b9181813e49dd8d13a0509c7eeaeb359730b458" },
{ url = "https://mirrors.aliyun.com/pypi/packages/23/ec/eae758ddfcaf6ddcd48d0497bd3903f6a660615a2f5f0a89565af288cb8e/granian-2.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b964bf9b692eff6d33bfbd35ec47a2b1791daeaf8a0ab7a3660913493f0c8c99" },
{ url = "https://mirrors.aliyun.com/pypi/packages/f8/c5/d0721a216004fec33392b22443c494cdc8cb80519fdd21f2d27d19d29fa4/granian-2.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d314daaca4914ca7fa61b4ff310b5581060ccd555a62e9f46ebe054d862bd01" },
{ url = "https://mirrors.aliyun.com/pypi/packages/4a/67/631e0cf5d6751790f12fffb8056dba3c37d7b2f0163237647cf7c523d462/granian-2.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:620f4cd8e195a6cac4b88dbbedca8c4c70c1bc23aed792d731d803ba411dfc99" },
{ url = "https://mirrors.aliyun.com/pypi/packages/24/8b/6f7119f3c79052563a63487b723efa210cbe648f370cef85027eeec5964d/granian-2.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:59658b8d5ad955967347d285df82e2c9cf566ad239b30a3720cc8ed461951017" },
{ url = "https://mirrors.aliyun.com/pypi/packages/c6/03/5b8463230ba4be819251f8d630cd1cf5f9438348e9af7d0e9118c69a280a/granian-2.4.0-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:6a7e023ad748deb72d80de88bf09437acab8515bfc3943de67e9a71c278ed5ee" },
{ url = "https://mirrors.aliyun.com/pypi/packages/67/d8/282ad7d5b67dc2b50778e385e2be8d21f4cd7736c6b61b1c6a9deaa9c806/granian-2.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d966484981202602c9ca77d7544112d34beccc9426dff3f4ee3da3b97f4acc28" },
{ url = "https://mirrors.aliyun.com/pypi/packages/ed/ca/4c557b88a58fcc8b1ce35d8df7d786145fd43e4fc9c06a5907416fe3129e/granian-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ffe9ca0252b7e63775a1674e478860a30358b400a27a0e2abf6dfcb3bb187cee" },
{ url = "https://mirrors.aliyun.com/pypi/packages/23/82/319fa75a338d83b6d17993c73357faaf98e4dbde44f221d929096da64a8e/granian-2.4.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f4bf64664e0fa796858ec28f22de26eb586b40b9060175d7f319891b9f4d0538" },
{ url = "https://mirrors.aliyun.com/pypi/packages/15/1d/6355fe53bb90e4e6af6c7bab1a458d6e93d4e83e6a0c4d2cb1e3b56060ec/granian-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ebc6fad728210c0c2ebf451b5ece76b1ae7086bf1da96d6c60221a59776b560d" },
{ url = "https://mirrors.aliyun.com/pypi/packages/1d/82/35b9c22d45fab73a453734c116f731ab67df338f6d83090a76fd42b040c9/granian-2.4.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:22df3c96315273b475749b83cb6a8b77e679703c9b900ffaf0c4dfb07bfc35a1" },
{ url = "https://mirrors.aliyun.com/pypi/packages/56/c3/6da36de59d827edab0b5fbaed120a3276ec5a5aa9186ef593f87e77aac23/granian-2.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1222a55b974281b49824aa60610e79bf6fa1949ddb52083b6a31534d500689e9" },
{ url = "https://mirrors.aliyun.com/pypi/packages/db/1f/a2dcf0cc50e33094e6cfb4a38ce0acac5af83b15d5c7b8a5584a19d96b6f/granian-2.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05245be8770e5b6bf87071694a9c15d6bb9d008beb206b304f28ea82f70aae1c" },
{ url = "https://mirrors.aliyun.com/pypi/packages/ec/43/b7bd75239be483cc35fc140d275fdb66c7622ea87a68980edff2938570de/granian-2.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e8c38c593252eb9b3c897fa717edb7c782cfff38a57b197ec3f068b00361e650" },
{ url = "https://mirrors.aliyun.com/pypi/packages/8e/29/7db9a1e79f5dbdfbbfc904f18a6abead57b345f443e9db639853e9495ace/granian-2.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:36fd7ef64a8c41104c1e96a5d38a75b11c8bb36eee965a6fb8d4a5918af6b24b" },
{ url = "https://mirrors.aliyun.com/pypi/packages/59/d4/bfb7f02ba767788a3d8c10edd3451a6e38793345ace52146837fafcc224b/granian-2.4.0-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:e07f918a618b2916621978b8dce1168f8149b64e26d3375340f837efa75bbcf2" },
{ url = "https://mirrors.aliyun.com/pypi/packages/2e/dc/e26d44be446934c33927401cbdbc7cf69ff30e540db6c14632fadfda5f50/granian-2.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:651518714ec38b53a94af2278dd291d9bfca12f79f0f704b4f1f58048ec11da8" },
{ url = "https://mirrors.aliyun.com/pypi/packages/52/75/e4318508cf307e407121f344da1f1df54d3440d57bbead913d5c9ff67d7e/granian-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:f34798c5241fd8ff895c946e02c0ed03e73f4015571ccfe229aed7e0779c5f51" },
{ url = "https://mirrors.aliyun.com/pypi/packages/7c/3b/f4cd667831f5a2bc1bb6fd67a7cd56949fde4023e0607ddef93460930e30/granian-2.4.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:8e674ac4f21f094e96541557a5f53dc0a884d995114f24a7004ab187c5c514bd" },
{ url = "https://mirrors.aliyun.com/pypi/packages/be/3b/076543d9831c879bdf8de0034448955fc69613753b624d5af9f3476cac33/granian-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cbda99cdac70e4e3813438ce463492d06858d1070d9c42f250bad5b96d5a8546" },
{ url = "https://mirrors.aliyun.com/pypi/packages/06/14/6ffd808691b18b94b84c4f62db7ebb7641c7ff36fde028effdadf98ea030/granian-2.4.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:447e8f7fd5f1bde5f72452be420ca58cf753be26e00654d950e9149d407abbaf" },
{ url = "https://mirrors.aliyun.com/pypi/packages/af/db/ccbf4a03b1bac49eae23b8ec2542a169401517b81ffd5a9d51e17bc5247b/granian-2.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:614dbcc128265367ca80e00a8a40970b30281f8e496f52fe9adb8f5c3c82d991" },
{ url = "https://mirrors.aliyun.com/pypi/packages/1f/c3/04af2b89476464236239a03398a180cf71c81c52233a3a8bfa6394884e6f/granian-2.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16fb11d30e58fb486db19135b5bb4acabdfbeb923f460f9857f674f9b07c9b0a" },
{ url = "https://mirrors.aliyun.com/pypi/packages/48/9c/01e28ea016631694ae43523b27fff353402746d78ada96f1955a16cbfd2e/granian-2.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:b7bac7cc343bac4feab7b4c3cb69761457f29d768cf268d50a6b850d82ebe07e" },
{ url = "https://mirrors.aliyun.com/pypi/packages/ef/26/717d5bac3d00f799e84af052fc294ba1a35305146af89a3ec39a5911fb15/granian-2.4.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:fb45d3ab545899b3041a3ee88e61ea58abca2f1cbcd61299b20bc5fbddc9a6b6" },
{ url = "https://mirrors.aliyun.com/pypi/packages/83/85/325e60028abaed83eb937ef930930d9a649d497a73eabd3197b138f642ed/granian-2.4.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:e2d92b31788af9ddb330acafd919e9ef7566c6c21b9f83940bbb5bee271c09b2" },
{ url = "https://mirrors.aliyun.com/pypi/packages/dd/7f/2b3f89790eb685de64b6baee18e317bacf866832118f2059d286e3e40505/granian-2.4.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:85541cbb7b8c4f2df88b6d9c757eb00c09804d6923b72e117196aca2b5892d01" },
{ url = "https://mirrors.aliyun.com/pypi/packages/81/fd/5a71563fe3ac15d0184130adf9e37507ee6f223961c960dc27ea799859db/granian-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:283b12ef8e4e780df4016fd5eeb5cb632eb3248d4c2a9d91cbaa89f467d76b33" },
{ url = "https://mirrors.aliyun.com/pypi/packages/cd/af/5d87657644d378883a05a2d6ee2a89a8cc640d73a30cd4a29b0ba76775af/granian-2.4.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:e97f87bfc82a9661c548372ac2e25c60a124fb8a9b76d14a7a544d36b9d3df8e" },
{ url = "https://mirrors.aliyun.com/pypi/packages/b4/62/ad2286bb489a408a01d4c103c10c27f7fb65398b3da688e02980c6b83d0a/granian-2.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fd31d635112323e9c6a88ccaed1eed97a5df7b3fd60ce721b798b74a0eaefa8b" },
{ url = "https://mirrors.aliyun.com/pypi/packages/fd/d4/bad337f5e3702015daa8aa91486329a0fb29d4602895e668a9a9350e05ee/granian-2.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbae0729767b3d08dd11a6abc5a026dfb8ddd43f50ea471c9acaa66e514887e6" },
{ url = "https://mirrors.aliyun.com/pypi/packages/9f/9d/74ec74e787241516409392f28aba4c4c1e99b8e6be6698b462685ae872da/granian-2.4.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:37c3510d2d2904b1108bc9bcd5c9dce2ee0e302a1b5484dba9b9bd16dd5ad736" },
{ url = "https://mirrors.aliyun.com/pypi/packages/60/2f/d80f078e21f2b07655341a64a5d97e9263471ec3370908ccc3547e734aec/granian-2.4.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831dbeeea6b388d22398cf5cdf031353fc53d4a46d931c36818a418e1ebfbacb" },
{ url = "https://mirrors.aliyun.com/pypi/packages/df/0f/68a563001cbdcbda06cd1e9a811549376cd7b4d77ccb173b9c28cb57f3b8/granian-2.4.0-cp313-cp313t-musllinux_1_1_armv7l.whl", hash = "sha256:2d22bf6cf26f841a4dc0e3c8be954b4498080882f45c3e3a2b50a3d29b70e803" },
{ url = "https://mirrors.aliyun.com/pypi/packages/62/72/ccb78304c9db5c35e148bddfcd02e3fcfdc037ddd5e5b7524a298e22deeb/granian-2.4.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:d3dafc5fba7feee2f6f88379dce7eb01e9662ff71e46499295e8b1b012dbccb6" },
{ url = "https://mirrors.aliyun.com/pypi/packages/41/17/7e3871f7361b9daef94385e64b1388a3dc7fd7add93fbe82a4ca6fc2e9e3/granian-2.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e0ec4ba1c9cfcc318b27b51dfc6a7fb9d2d9e6d6641df7f2a573b1e49877fe09" },
{ url = "https://mirrors.aliyun.com/pypi/packages/80/a9/b9dbc7ec6ef022c2071b2b3d4cbdb065f197be8ed1225b3ce96db903666a/granian-2.4.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:602832d514234679c376607a81fa056972af9402d7f2a96c1728e2cd28f6ae09" },
{ url = "https://mirrors.aliyun.com/pypi/packages/0f/92/9e26ae70245438e703a415598524b0b57b5a6cc2b68ec9af01fdc89504de/granian-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ef724b322c79fcce6f941ec08442c8e013e730d4913dd3c8ad8a8c6a2d824fa6" },
{ url = "https://mirrors.aliyun.com/pypi/packages/ad/da/0025ae1b2558ddee9b9231a9f8911fc5dd6002ceb18aca7c9548edc974d8/granian-2.4.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9d377983655a8481336eed3d44ec0fc74481afbf725e1b6142ebc96ac232829a" },
{ url = "https://mirrors.aliyun.com/pypi/packages/2b/4d/564aa81a20112994a43db4d9948e27106ae0902af0b262496271df965dcc/granian-2.4.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:deaefceafc136d0f6e4929355ede3f44c840df471f436e7ba3b03ee7d752c344" },
{ url = "https://mirrors.aliyun.com/pypi/packages/b9/cd/6aa5440a9ca9fdd670c4d18861ea868b00f3f6285de78aa8e783981f4698/granian-2.4.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17ea28beeee01cbd108f532c8efd1096f3235da04f45a0c651f32d88e63e0d9d" },
{ url = "https://mirrors.aliyun.com/pypi/packages/5a/4c/95079033b976e3a9ec93a99fe3ee81981d6e1f86fea88cd6cb662ccb3170/granian-2.4.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:8bbd7ca62f7e184328795421ac32e85f9b824836c12c099682db48ecec65584d" },
{ url = "https://mirrors.aliyun.com/pypi/packages/f4/e4/8d52b03325c8bfb28f2a31836938e827aaf5ce8b65c7f90dbde8ce955acb/granian-2.4.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:433ccabe8d8bed71a0c7202604ffa96e9c5c4200c7d51ee57bced2b5e78a70cd" },
{ url = "https://mirrors.aliyun.com/pypi/packages/0a/cd/1b8c86102a1575c9ba1f309ffa5a2827ad8f2f8c48544aa081fbfd09c40f/granian-2.4.0-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:470844de80920a93afcdf5b83884ca69b7845d56fca8a5077004096a2018add5" },
{ url = "https://mirrors.aliyun.com/pypi/packages/6c/8b/3046a504a681d0a929a95fdc2ad9bb91127bbed547e978cf304a8d670dd9/granian-2.4.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:21ee68b9b244a90fe3df0945207ddc5d8edfbeb10ada9ef42759e60650b8241d" },
{ url = "https://mirrors.aliyun.com/pypi/packages/8d/f4/180c856cb224949ba5dd783d51e40c7e7b60070644d4931addcbfe87dc34/granian-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:7d8842d534faaaa0774121c27bc0b6a2df0fe96bcc1ddae31bb7baad30352e7e" },
{ url = "https://mirrors.aliyun.com/pypi/packages/d9/46/cd785dd0436b77670267a0b0464763e5faa6409d7489be0dce398e6dd6b0/granian-2.4.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:30b1e139e64a9bc01473cae24fef8470cf8d451585f7e946453a20450da0bfc4" },
{ url = "https://mirrors.aliyun.com/pypi/packages/be/9c/c90263037fea81d45ced91e96ddecad763d303f70d7239030992cbb68ef1/granian-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8ec228e1e6c89d475f94fceb36e7e677bae311db7d6a60d4c3a81f483211961b" },
{ url = "https://mirrors.aliyun.com/pypi/packages/87/00/f704935841f065b9d89dd4e1cc5027104243d4ef205e2f1805d0b0aabb9a/granian-2.4.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bbad40cbdd529d1eaa9a735cb2fc39afabd6f3a577898ba4b4427a80e6a1c82" },
{ url = "https://mirrors.aliyun.com/pypi/packages/e7/ba/f329acc5a6cf8b23dc989047393f321fd821dcc989ed0a36aab654e27117/granian-2.4.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:57fe9751528b93ebfb2d4c8dbe2f7a2fc7db79f28a28986215a88a131099323b" },
{ url = "https://mirrors.aliyun.com/pypi/packages/f2/5a/67cf777ee4d26671351c20b1f80faab3635aa7354a869485b2d95d8f3269/granian-2.4.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:c4548266a7db5cd4f58f666396a9f354a62e8c6c931d2bc99b8d26140626976d" },
{ url = "https://mirrors.aliyun.com/pypi/packages/78/00/6941b711dca297c7678dd2fdbd43100654c27e57701e6cf2f4f7fc82b500/granian-2.4.0-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:5b46564afbc2f9456cf03ef5b8ad8adb8c7c08e551c3d13e8aa5bcc4da5eb0e4" },
{ url = "https://mirrors.aliyun.com/pypi/packages/3a/df/9b190a6e63ccb0fb0ddd3f22131858807086208b2ba5ccbab562dc6443be/granian-2.4.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2dcd6f320f86399303914d1c1d49d6228daf43d3ddbaada05a6fd9631dbeb421" },
{ url = "https://mirrors.aliyun.com/pypi/packages/6d/17/bbc06e8963a91b0f5b97c3068192e8d53eb5041e6dd3d2034db65bcc4c82/granian-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:48a13420cbf11ba31a5222f1387bb54aa083ca9b072e30e632189fd4906bc7a8" },
{ url = "https://mirrors.aliyun.com/pypi/packages/9d/b5/87eb284f56fd3049a4e1fe67067dc0ae4b25693ed165d0da6d2298fe0a3f/granian-2.4.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:019c71c7b230a61e015913f54417095c76d8841cd52fc03fc0aa5efde917c812" },
{ url = "https://mirrors.aliyun.com/pypi/packages/58/21/5fef309e7f84913dd458917c1ed3c26d726e83efa2aca70ab14c1dab54a7/granian-2.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:59c69c8981fecf5600e05857c96c7acd529ba6870bdbbc1967f2c1180c3fcda7" },
{ url = "https://mirrors.aliyun.com/pypi/packages/14/4c/8b7c68bb23df1380bfb85aa8e9a0fa33942d7742d2780702f20908fd1399/granian-2.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dc06330dc8f9cf3076d73ae1f6197c4e8af91840c0e34482b17d3e0d5b466b1" },
{ url = "https://mirrors.aliyun.com/pypi/packages/91/70/2725284d0b9674f35eb1df522648f051788ddad8b6d7659f83bc8c0f8d6e/granian-2.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:6ac2e3d6974f995b525c48d47303fe94620c8ad934ccd6e12f33bea4a4a508d3" },
{ url = "https://mirrors.aliyun.com/pypi/packages/93/67/858cc63c401b5103c3913d60581ba5e70545093ca7e93c4c751328ef59eb/granian-2.4.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1c7961665435415694fd90bfb50fdfb0fb4c5838002d8768f9eef0da77bfba70" },
{ url = "https://mirrors.aliyun.com/pypi/packages/95/c7/e5c7c0025a1c1322e1816494ebe214751402cc44dc1096ada3a2463c4622/granian-2.4.0-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0f87be961ba7ea79c65740b4c4573556cd3f4879ac3e5313293f97c27c2a6881" },
{ url = "https://mirrors.aliyun.com/pypi/packages/47/f8/8cd5d3d23b6718755334447cd33129f70eb86f196c3be5947aa4d015b289/granian-2.4.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:85f4c1863300d040dd23735ed12002894a658a8c87421c3e8f759d996a7032df" },
{ url = "https://mirrors.aliyun.com/pypi/packages/27/40/fdb21c2a60a5fe03d86b7e95ef7efc41edb2e54b0a45ea78d64b8d9782b1/granian-2.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:32b2faf52304ac7d42cafe2bd69a26bfa9074187a997d9ff7a0cb68610113cce" },
{ url = "https://mirrors.aliyun.com/pypi/packages/91/c8/9b4e4e350f10b54ccafc1f1e116cd5c45f8b79677aa81de8c676ee404180/granian-2.4.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0ec52f3a593e1349e0747988784013b794722dc44cb4807779b4a304008a17aa" },
{ url = "https://mirrors.aliyun.com/pypi/packages/31/02/cd25ffe40cdec628466ef939192d5a48a53fcf410954ae74587babb5296b/granian-2.4.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:cea3e358d0b0d6710b2c0bf957b760df2e1ca2589c0efc6457de978265c3b8d9" },
{ url = "https://mirrors.aliyun.com/pypi/packages/5f/0d/65756e7c886ac1a6aeba3dca6fd00094773e0f957ebe9be01333683d9629/granian-2.4.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f374a9eedaff75d9fecc349e492bd54a9d05437d4e94d72ed179e7c8c5f7c95f" },
{ url = "https://mirrors.aliyun.com/pypi/packages/76/11/c8c20c55c0d1babae33dad305ae946e39e73657e5c86249686ab0acc2a95/granian-2.4.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7109260ba1fe26329845556a37d46d6cf9f822018999d87aa0730b41a28cb7d8" },
{ url = "https://mirrors.aliyun.com/pypi/packages/02/46/c855d7c116d940b4706e5357c999609cde3abfa0f894e757cc692403eb43/granian-2.4.0-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:06ed382f1b4d575b6f281ba3be158c8ff0ad0ad0633bbae703ac232d38cd9587" },
{ url = "https://mirrors.aliyun.com/pypi/packages/c9/a2/0e64a67a64aaf0f6e1d6e74ceaf4efa5472596f9452798e88dd0256e3117/granian-2.4.0-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:d0e3fc3cf26d9b1fd0c8b1da0d11182704ffc90b8cdf4182b1fed76b576a2def" },
{ url = "https://mirrors.aliyun.com/pypi/packages/65/bf/34db5011dcb56e9067f6278107922b6b3abd020c198fd0861dcc17fff50c/granian-2.4.0-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0836f4ef7b5a5f3b95aeeff3ed72b9b3c7b66c796cb7577bbfd390683e81f558" },
{ url = "https://mirrors.aliyun.com/pypi/packages/f9/e2/d7784d81804ccfc964c571e1cd76539cac5daaa240c617734c2fd46e7304/granian-2.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:de76e9f4e85a99c5db5e244153edc15e2d77d9cec77741a278b723255755720d" },
]
[[package]]
name = "greenlet"
version = "3.1.1"
@ -914,18 +1007,6 @@ wheels = [
{ url = "https://mirrors.aliyun.com/pypi/packages/ac/38/08cc303ddddc4b3d7c628c3039a61a3aae36c241ed01393d00c2fd663473/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6" },
]
[[package]]
name = "gunicorn"
version = "23.0.0"
source = { registry = "https://mirrors.aliyun.com/pypi/simple" }
dependencies = [
{ name = "packaging" },
]
sdist = { url = "https://mirrors.aliyun.com/pypi/packages/34/72/9614c465dc206155d93eff0ca20d42e1e35afc533971379482de953521a4/gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec" }
wheels = [
{ url = "https://mirrors.aliyun.com/pypi/packages/cb/7d/6dac2a6e1eba33ee43f318edbed4ff29151a49b5d37f080aad1e6469bca4/gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d" },
]
[[package]]
name = "h11"
version = "0.14.0"