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