Открыть боковую панель
Профком студентов физического факультета МГУ
FastAPI Project Template
Коммиты
a205c898
Не подтверждена
Коммит
a205c898
создал
Мар 12, 2023
по автору
Dyakov Roman
Зафиксировано автором
GitHub
Мар 12, 2023
Просмотр файлов
Logging, Auth and styles in template (#6)
владелец
672a84ff
Изменения
13
Скрыть пробелы
Построчно
Рядом
reqirements.txt
удалено
100644 → 0
Просмотр файла @
672a84ff
cookiecutter
\ Нет новой строки в конце файла
requirements.txt
0 → 100644
Просмотр файла @
a205c898
cookiecutter
{{cookiecutter.repo_name}}/.github/workflows/build_and_publish.yml
0 → 100644
Просмотр файла @
a205c898
name
:
Build, publish and deploy docker
on
:
push
:
branches
:
[
'
main'
]
tags
:
-
'
v*'
env
:
REGISTRY
:
ghcr.io
IMAGE_NAME
:
{{
"
${{
github.repository
}}"
}}
jobs
:
build-and-push-image
:
name
:
Build and push
runs-on
:
ubuntu-latest
permissions
:
contents
:
read
packages
:
write
steps
:
-
name
:
Checkout repository
uses
:
actions/checkout@v2
-
name
:
Log in to the Container registry
uses
:
docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
with
:
registry
:
{{
"
${{
env.REGISTRY
}}"
}}
username
:
{{
"
${{
github.actor
}}"
}}
password
:
{{
"
${{
secrets.GITHUB_TOKEN
}}"
}}
-
name
:
Extract metadata (tags, labels) for Docker
id
:
meta
uses
:
docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
with
:
images
:
{{
"
${{
env.REGISTRY
}}"
}}
/{{"${{ env.IMAGE_NAME }}"}}
tags
:
|
type=ref,event=tag,enable={{"${{ startsWith(github.ref, 'refs/tags/v') }}"}}
type=raw,value=latest,enable={{"${{ startsWith(github.ref, 'refs/tags/v') }}"}}
type=raw,value=test,enable=true
-
name
:
Build and push Docker image
uses
:
docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
with
:
context
:
.
push
:
true
tags
:
{{
"
${{
steps.meta.outputs.tags
}}"
}}
labels
:
{{
"
${{
steps.meta.outputs.labels
}}"
}}
deploy-testing
:
name
:
Deploy Testing
needs
:
build-and-push-image
runs-on
:
[
self-hosted
,
Linux
]
environment
:
name
:
Testing
url
:
https://{{cookiecutter.module_name}}.api.test.profcomff.com/
env
:
CONTAITER_NAME
:
com_profcomff_api_{{cookiecutter.module_name}}_test
permissions
:
packages
:
read
steps
:
-
name
:
Pull new version
run
:
docker pull {{"${{ env.REGISTRY }}"}}/{{"${{ env.IMAGE_NAME }}"}}:test
-
name
:
Migrate DB
run
:
|
docker run \
--rm \
--network=web \
--env DB_DSN={{"${{ secrets.DB_DSN }}"}} \
--name {{"${{ env.CONTAITER_NAME }}"}}_migration \
--workdir="/" \
{{"${{ env.REGISTRY }}"}}/{{"${{ env.IMAGE_NAME }}"}}:test \
alembic upgrade head
-
name
:
Run new version
id
:
run_test
run
:
|
docker stop {{"${{ env.CONTAITER_NAME }}"}} || true && docker rm {{"${{ env.CONTAITER_NAME }}"}} || true
docker run \
--detach \
--restart on-failure:3 \
--network=web \
--env DB_DSN='{{"${{ secrets.DB_DSN }}"}}' \
--env GUNICORN_CMD_ARGS='--log-config logging_test.conf' \
--name {{"${{ env.CONTAITER_NAME }}"}} \
{{"${{ env.REGISTRY }}"}}/{{"${{ env.IMAGE_NAME }}"}}:test
deploy-production
:
name
:
Deploy Production
needs
:
build-and-push-image
if
:
startsWith(github.ref, 'refs/tags/v')
runs-on
:
[
self-hosted
,
Linux
]
environment
:
name
:
Production
url
:
https://{{cookiecutter.module_name}}.api.profcomff.com/
env
:
CONTAITER_NAME
:
com_profcomff_api_{{cookiecutter.module_name}}
permissions
:
packages
:
read
steps
:
-
name
:
Pull new version
run
:
docker pull {{"${{ env.REGISTRY }}"}}/{{"${{ env.IMAGE_NAME }}"}}:latest
-
name
:
Migrate DB
run
:
|
docker run \
--rm \
--network=web \
--env DB_DSN={{"${{ secrets.DB_DSN }}"}} \
--name {{"${{ env.CONTAITER_NAME }}"}}_migration \
--workdir="/" \
{{"${{ env.REGISTRY }}"}}/{{"${{ env.IMAGE_NAME }}"}}:latest \
alembic upgrade head
-
name
:
Run new version
id
:
run_test
run
:
|
docker stop {{"${{ env.CONTAITER_NAME }}"}} || true && docker rm {{"${{ env.CONTAITER_NAME }}"}} || true
docker run \
--detach \
--restart always \
--network=web \
--env DB_DSN='{{"${{ secrets.DB_DSN }}"}}' \
--env GUNICORN_CMD_ARGS='--log-config logging_prod.conf' \
--name {{"${{ env.CONTAITER_NAME }}"}} \
{{"${{ env.REGISTRY }}"}}/{{"${{ env.IMAGE_NAME }}"}}:latest
{{cookiecutter.repo_name}}/Dockerfile
Просмотр файла @
a205c898
...
...
@@ -3,6 +3,8 @@ ENV APP_NAME={{cookiecutter.module_name}}
ENV
APP_MODULE=${APP_NAME}.routes.base:app
COPY
./requirements.txt /app/
COPY
./logging_prod.conf /app/
COPY
./logging_test.conf /app/
RUN
pip
install
-U
-r
/app/requirements.txt
COPY
./alembic.ini /alembic.ini
...
...
{{cookiecutter.repo_name}}/Makefile
Просмотр файла @
a205c898
run
:
source
./venv/bin/activate
&&
uvicorn
--reload
--log-
level
debug
{{
cookiecutter.module_name
}}
.routes.base:app
source
./venv/bin/activate
&&
uvicorn
--reload
--log-
config
logging_test.conf
{{
cookiecutter.module_name
}}
.routes.base:app
db
:
docker run
-d
-p
5432:5432
-e
POSTGRES_HOST_AUTH_METHOD
=
trust
--name
db-
{{
cookiecutter.module_name
}}
postgres:15
sleep
3
migrate
:
db
migrate
:
alembic upgrade
head
{{cookiecutter.repo_name}}/logging_prod.conf
0 → 100644
Просмотр файла @
a205c898
[
loggers
]
keys
=
root
,
gunicorn
.
error
,
gunicorn
.
access
[
handlers
]
keys
=
all
[
formatters
]
keys
=
json
[
logger_root
]
level
=
INFO
handlers
=
all
[
logger_gunicorn
.
error
]
level
=
INFO
handlers
=
all
propagate
=
0
qualname
=
gunicorn
.
error
formatter
=
json
[
logger_gunicorn
.
access
]
level
=
INFO
handlers
=
all
propagate
=
0
qualname
=
gunicorn
.
access
formatter
=
json
[
handler_all
]
class
=
StreamHandler
formatter
=
json
level
=
INFO
args
=(
sys
.
stdout
,)
[
formatter_json
]
class
=
logger
.
formatter
.
JSONLogFormatter
{{cookiecutter.repo_name}}/logging_test.conf
0 → 100644
Просмотр файла @
a205c898
[
loggers
]
keys
=
root
,
gunicorn
.
error
,
gunicorn
.
access
,
uvicorn
.
error
,
uvicorn
.
access
[
handlers
]
keys
=
all
[
formatters
]
keys
=
json
[
logger_root
]
level
=
DEBUG
handlers
=
all
[
logger_gunicorn
.
error
]
level
=
DEBUG
handlers
=
all
propagate
=
0
qualname
=
gunicorn
.
error
formatter
=
json
[
logger_gunicorn
.
access
]
level
=
DEBUG
handlers
=
all
propagate
=
0
qualname
=
gunicorn
.
access
formatter
=
json
[
handler_all
]
class
=
StreamHandler
formatter
=
json
level
=
DEBUG
args
=(
sys
.
stdout
,)
[
formatter_json
]
class
=
logger
.
formatter
.
JSONLogFormatter
{{cookiecutter.repo_name}}/requirements.dev.txt
0 → 100644
Просмотр файла @
a205c898
black
httpx
pytest
pytest-cov
pytest-mock
{{cookiecutter.repo_name}}/requirements.txt
Просмотр файла @
a205c898
...
...
@@ -6,3 +6,5 @@ uvicorn
alembic
SQLAlchemy
gunicorn
logging-profcomff
auth-lib-profcomff[fastapi]
{{cookiecutter.repo_name}}/{{cookiecutter.module_name}}/models/base.py
Просмотр файла @
a205c898
...
...
@@ -18,4 +18,4 @@ class Base:
attrs
=
[]
for
c
in
self
.
__table__
.
columns
:
attrs
.
append
(
f
"
{
c
.
name
}
=
{
getattr
(
self
,
c
.
name
)
}
"
)
return
"{}({})"
.
format
(
self
.
__class__
.
__name__
,
', '
.
join
(
attrs
))
\ Нет новой строки в конце файла
return
"{}({})"
.
format
(
self
.
__class__
.
__name__
,
', '
.
join
(
attrs
))
{{cookiecutter.repo_name}}/{{cookiecutter.module_name}}/routes/base.py
Просмотр файла @
a205c898
from
fastapi
import
FastAPI
from
..settings
import
Settings
from
fastapi.middleware.cors
import
CORSMiddleware
from
fastapi_sqlalchemy
import
DBSessionMiddleware
settings
=
Settings
()
from
{{
cookiecutter
.
module_name
}}.
settings
import
get_settings
settings
=
get_settings
()
app
=
FastAPI
()
app
.
add_middleware
(
DBSessionMiddleware
,
db_url
=
settings
.
DB_DSN
,
...
...
{{cookiecutter.repo_name}}/{{cookiecutter.module_name}}/routes/models/base.py
Просмотр файла @
a205c898
...
...
@@ -9,4 +9,4 @@ class Base(BaseModel):
return
"{}({})"
.
format
(
self
.
__class__
.
__name__
,
', '
.
join
(
attrs
))
class
Config
:
orm_mode
=
True
\ Нет новой строки в конце файла
orm_mode
=
True
{{cookiecutter.repo_name}}/{{cookiecutter.module_name}}/settings.py
Просмотр файла @
a205c898
...
...
@@ -4,6 +4,7 @@ from functools import lru_cache
class
Settings
(
BaseSettings
):
"""Application settings"""
DB_DSN
:
PostgresDsn
CORS_ALLOW_ORIGINS
:
list
[
str
]
=
[
'*'
]
...
...
@@ -21,4 +22,4 @@ class Settings(BaseSettings):
@
lru_cache
def
get_settings
()
->
Settings
:
settings
=
Settings
()
return
settings
\ Нет новой строки в конце файла
return
settings
Редактирование
Предварительный просмотр
Поддерживает Markdown
0%
Попробовать снова
или
прикрепить новый файл
.
Отмена
You are about to add
0
people
to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Отмена
Пожалуйста,
зарегистрируйтесь
или
войдите
чтобы прокомментировать