Не подтверждена Коммит a205c898 создал по автору Dyakov Roman's avatar Dyakov Roman Зафиксировано автором GitHub
Просмотр файлов

Logging, Auth and styles in template (#6)

владелец 672a84ff
cookiecutter
\ Нет новой строки в конце файла
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
......@@ -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
......
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
[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
[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
......@@ -6,3 +6,5 @@ uvicorn
alembic
SQLAlchemy
gunicorn
logging-profcomff
auth-lib-profcomff[fastapi]
......@@ -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))
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,
......
......@@ -9,4 +9,4 @@ class Base(BaseModel):
return "{}({})".format(self.__class__.__name__, ', '.join(attrs))
class Config:
orm_mode = True
\ Нет новой строки в конце файла
orm_mode = True
......@@ -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.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать