From b1f000e42a26b1fe35c837c4021045bbad518a27 Mon Sep 17 00:00:00 2001 From: Pavel Kirilin <win10@list.ru> Date: Sat, 2 Oct 2021 17:05:17 +0400 Subject: [PATCH] Fixed k8s configs. (#27) Closes #25. Signed-off-by: Pavel <win10@list.ru> --- .../.pre-commit-config.yaml | 10 +++-- .../deploy/Dockerfile | 2 +- .../deploy/docker-compose.yml | 42 +++++++++++-------- .../deploy/kube/app.yml | 30 ++++++++++--- .../deploy/kube/db.yml | 33 +++++++++------ .../deploy/kube/namespace.yml | 7 ++++ .../deploy/kube/redis.yml | 9 ++++ pyproject.toml | 2 +- 8 files changed, 96 insertions(+), 39 deletions(-) create mode 100644 fastapi_template/template/{{cookiecutter.project_name}}/deploy/kube/namespace.yml diff --git a/fastapi_template/template/{{cookiecutter.project_name}}/.pre-commit-config.yaml b/fastapi_template/template/{{cookiecutter.project_name}}/.pre-commit-config.yaml index 2dac1b2..173e5b9 100644 --- a/fastapi_template/template/{{cookiecutter.project_name}}/.pre-commit-config.yaml +++ b/fastapi_template/template/{{cookiecutter.project_name}}/.pre-commit-config.yaml @@ -15,10 +15,14 @@ repos: hooks: - id: add-trailing-comma - - repo: https://github.com/jumanjihouse/pre-commit-hook-yamlfmt - rev: 0.0.11 # or specific tag + - repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks + rev: v2.1.0 hooks: - - id: yamlfmt + - id: pretty-format-yaml + args: + - --autofix + - --preserve-quotes + - --indent=2 - repo: local hooks: diff --git a/fastapi_template/template/{{cookiecutter.project_name}}/deploy/Dockerfile b/fastapi_template/template/{{cookiecutter.project_name}}/deploy/Dockerfile index 9a5c226..d6dee13 100644 --- a/fastapi_template/template/{{cookiecutter.project_name}}/deploy/Dockerfile +++ b/fastapi_template/template/{{cookiecutter.project_name}}/deploy/Dockerfile @@ -18,4 +18,4 @@ RUN poetry install COPY . /app/src/ RUN pip install --use-feature=in-tree-build . -CMD python -m {{cookiecutter.project_name}} +CMD ["/usr/local/bin/python", "-m", "{{cookiecutter.project_name}}"] diff --git a/fastapi_template/template/{{cookiecutter.project_name}}/deploy/docker-compose.yml b/fastapi_template/template/{{cookiecutter.project_name}}/deploy/docker-compose.yml index 639a7ee..75b8611 100644 --- a/fastapi_template/template/{{cookiecutter.project_name}}/deploy/docker-compose.yml +++ b/fastapi_template/template/{{cookiecutter.project_name}}/deploy/docker-compose.yml @@ -47,14 +47,18 @@ services: image: {{cookiecutter.db_info.image}} hostname: {{cookiecutter.project_name}}-db environment: - - "POSTGRES_PASSWORD={{cookiecutter.project_name}}" - - "POSTGRES_USER={{cookiecutter.project_name}}" - - "POSTGRES_DB={{cookiecutter.project_name}}" + POSTGRES_PASSWORD: "{{cookiecutter.project_name}}" + POSTGRES_USER: "{{cookiecutter.project_name}}" + POSTGRES_DB: "{{cookiecutter.project_name}}" volumes: - {{cookiecutter.project_name}}-db-data:/var/lib/postgresql/data restart: always healthcheck: - test: pg_isready -U {{cookiecutter.project_name}} + test: + - CMD + - pg_isready + - -U + - {{cookiecutter.project_name}} interval: 2s timeout: 3s retries: 40 @@ -66,19 +70,19 @@ services: hostname: {{cookiecutter.project_name}}-db restart: always environment: - - "ALLOW_EMPTY_PASSWORD=yes" - - "MYSQL_ROOT_PASSWORD={{cookiecutter.project_name}}" - - "MYSQL_ROOT_USER={{cookiecutter.project_name}}" - - "MYSQL_DATABASE={{cookiecutter.project_name}}" + ALLOW_EMPTY_PASSWORD: "yes" + MYSQL_ROOT_PASSWORD: "{{cookiecutter.project_name}}" + MYSQL_ROOT_USER: "{{cookiecutter.project_name}}" + MYSQL_DATABASE: "{{cookiecutter.project_name}}" healthcheck: test: - - "CMD" - - "mysql" - - "-u" - - "{{cookiecutter.project_name}}" - - "-p{{cookiecutter.project_name}}" - - "-e" - - "SELECT 1" + - CMD + - mysql + - -u + - {{cookiecutter.project_name}} + - -p{{cookiecutter.project_name}} + - -e + - SELECT 1 interval: 3s timeout: 3s retries: 40 @@ -89,6 +93,7 @@ services: {% if cookiecutter.enable_migrations == 'True' -%} migrator: image: {{cookiecutter.project_name}}:{{"${" }}{{cookiecutter.project_name | upper }}_VERSION:-latest{{"}"}} + restart: "no" {%- if cookiecutter.orm == 'sqlalchemy' %} command: alembic upgrade head {%- elif cookiecutter.orm == 'tortoise' %} @@ -120,9 +125,12 @@ services: hostname: {{cookiecutter.project_name}}-redis restart: always environment: - - "ALLOW_EMPTY_PASSWORD=yes" + ALLOW_EMPTY_PASSWORD: "yes" healthcheck: - test: redis-cli ping + test: + - CMD + - redis-cli + - ping interval: 1s timeout: 3s retries: 30 diff --git a/fastapi_template/template/{{cookiecutter.project_name}}/deploy/kube/app.yml b/fastapi_template/template/{{cookiecutter.project_name}}/deploy/kube/app.yml index 8c44a37..2a4ed89 100644 --- a/fastapi_template/template/{{cookiecutter.project_name}}/deploy/kube/app.yml +++ b/fastapi_template/template/{{cookiecutter.project_name}}/deploy/kube/app.yml @@ -2,8 +2,10 @@ apiVersion: apps/v1 kind: Deployment metadata: + namespace: {{cookiecutter.kube_name}} name: {{cookiecutter.kube_name}}-app spec: + replicas: 2 selector: matchLabels: app: {{cookiecutter.kube_name}}-app @@ -15,12 +17,22 @@ spec: containers: - name: app image: {{cookiecutter.project_name}}:latest + livenessProbe: + httpGet: + path: /api/health + port: api-port + initialDelaySeconds: 10 + periodSeconds: 10 {%- if cookiecutter.db_info.name == "sqlite" %} command: ["/bin/sh"] args: - -c - >- + {%- if cookiecutter.orm == 'sqlalchemy' %} alembic upgrade head && + {%- elif cookiecutter.orm == 'tortoise' %} + aerich upgrade && + {%- endif %} python -m {{cookiecutter.project_name }} {%- endif %} env: @@ -29,12 +41,12 @@ spec: {%- if cookiecutter.db_info.name != "none" %} {%- if cookiecutter.db_info.name != "sqlite" %} - name: {{cookiecutter.project_name | upper }}_DB_HOST - value: {{cookiecutter.kube_name}}-db-service + value: "{{cookiecutter.kube_name}}-db-service" {%- endif %} {%- endif %} {%- if cookiecutter.enable_redis == 'True' %} - name: {{cookiecutter.project_name | upper }}_REDIS_HOST - value: {{cookiecutter.kube_name}}-redis-service + value: "{{cookiecutter.kube_name}}-redis-service" {%- endif %} resources: limits: @@ -42,22 +54,28 @@ spec: cpu: "200m" ports: - containerPort: 8000 + name: api-port --- apiVersion: v1 kind: Service metadata: + namespace: {{cookiecutter.kube_name}} name: {{cookiecutter.kube_name}}-app-service spec: selector: app: {{cookiecutter.kube_name}}-app ports: - - port: 80 - targetPort: 8000 + - protocol: TCP + port: 80 + targetPort: api-port + name: api-port + --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: {{cookiecutter.kube_name}}-app + namespace: {{cookiecutter.kube_name}} labels: name: {{cookiecutter.kube_name}}-app spec: @@ -71,4 +89,6 @@ spec: service: name: {{cookiecutter.kube_name}}-app-service port: - number: 80 + name: api-port + +--- diff --git a/fastapi_template/template/{{cookiecutter.project_name}}/deploy/kube/db.yml b/fastapi_template/template/{{cookiecutter.project_name}}/deploy/kube/db.yml index e488897..817e177 100644 --- a/fastapi_template/template/{{cookiecutter.project_name}}/deploy/kube/db.yml +++ b/fastapi_template/template/{{cookiecutter.project_name}}/deploy/kube/db.yml @@ -2,6 +2,7 @@ apiVersion: apps/v1 kind: Deployment metadata: + namespace: {{cookiecutter.kube_name}} name: {{cookiecutter.kube_name}}-db spec: selector: @@ -22,18 +23,18 @@ spec: env: {%- if cookiecutter.db_info.name == 'postgresql' %} - name: POSTGRES_PASSWORD - value: {{cookiecutter.project_name}} + value: "{{cookiecutter.project_name}}" - name: POSTGRES_USER - value: {{cookiecutter.project_name}} + value: "{{cookiecutter.project_name}}" - name: POSTGRES_DB - value: {{cookiecutter.project_name}} + value: "{{cookiecutter.project_name}}" {%- elif cookiecutter.db_info.name == 'mysql' %} - name: MYSQL_PASSWORD - value: {{cookiecutter.project_name}} + value: "{{cookiecutter.project_name}}" - name: MYSQL_USER - value: {{cookiecutter.project_name}} + value: "{{cookiecutter.project_name}}" - name: MYSQL_DATABASE - value: {{cookiecutter.project_name}} + value: "{{cookiecutter.project_name}}" - name: ALLOW_EMPTY_PASSWORD value: "yes" {%- endif %} @@ -43,6 +44,7 @@ spec: apiVersion: v1 kind: Service metadata: + namespace: {{cookiecutter.kube_name}} name: "{{cookiecutter.kube_name}}-db-service" spec: selector: @@ -54,6 +56,7 @@ spec: apiVersion: batch/v1 kind: Job metadata: + namespace: {{cookiecutter.kube_name}} name: {{cookiecutter.kube_name}}-migrator spec: ttlSecondsAfterFinished: 100 @@ -63,11 +66,6 @@ spec: - name: migrator image: {{cookiecutter.project_name}}:latest command: - - "wait-for-it" - - "-t" - - "180" - - "{{cookiecutter.kube_name}}-db-service:{{cookiecutter.db_info.port}}" - - "--" {%- if cookiecutter.orm == 'sqlalchemy' %} - "alembic" - "upgrade" @@ -76,7 +74,18 @@ spec: - "aerich" - "upgrade" {%- endif %} + resources: + limits: + memory: "200Mi" + cpu: "250m" env: - name: {{cookiecutter.project_name | upper }}_DB_HOST - value: {{cookiecutter.kube_name}}-db-service + value: "{{cookiecutter.kube_name}}-db-service" + initContainers: + - name: wait-for-db + image: toschneck/wait-for-it:latest + command: ["./wait-for-it.sh", "-t", "60", "{{cookiecutter.kube_name}}-db-service:{{cookiecutter.db_info.port}}"] restartPolicy: Never + + +--- diff --git a/fastapi_template/template/{{cookiecutter.project_name}}/deploy/kube/namespace.yml b/fastapi_template/template/{{cookiecutter.project_name}}/deploy/kube/namespace.yml new file mode 100644 index 0000000..4e1e543 --- /dev/null +++ b/fastapi_template/template/{{cookiecutter.project_name}}/deploy/kube/namespace.yml @@ -0,0 +1,7 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: "{{cookiecutter.project_name}}" + +--- diff --git a/fastapi_template/template/{{cookiecutter.project_name}}/deploy/kube/redis.yml b/fastapi_template/template/{{cookiecutter.project_name}}/deploy/kube/redis.yml index 6ad232f..72fcc7d 100644 --- a/fastapi_template/template/{{cookiecutter.project_name}}/deploy/kube/redis.yml +++ b/fastapi_template/template/{{cookiecutter.project_name}}/deploy/kube/redis.yml @@ -2,6 +2,7 @@ apiVersion: apps/v1 kind: Deployment metadata: + namespace: {{cookiecutter.kube_name}} name: {{cookiecutter.kube_name}}-redis spec: selector: @@ -15,6 +16,11 @@ spec: containers: - name: redis image: bitnami/redis:6.2.5 + startupProbe: + exec: + command: ["redis-cli", "ping"] + failureThreshold: 30 + periodSeconds: 5 env: - name: ALLOW_EMPTY_PASSWORD value: "yes" @@ -28,6 +34,7 @@ spec: apiVersion: v1 kind: Service metadata: + namespace: {{cookiecutter.kube_name}} name: "{{cookiecutter.kube_name}}-redis-service" spec: selector: @@ -35,3 +42,5 @@ spec: ports: - port: 6379 targetPort: 6379 + +--- diff --git a/pyproject.toml b/pyproject.toml index 39133be..8e433f3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "fastapi_template" -version = "3.1.3" +version = "3.1.4" description = "Feature-rich robust FastAPI template" authors = ["Pavel Kirilin <win10@list.ru>"] packages = [{ include = "fastapi_template" }] -- GitLab