From da4ccdb1c92cf87e3b15955883b0465cd68cb06e Mon Sep 17 00:00:00 2001 From: Ilya Fedorov Date: Sat, 15 Jan 2022 15:39:00 +0000 Subject: [PATCH] deploy into k8s --- .editorconfig | 2 +- .gitlab-ci.yml | 14 +-- Makefile | 14 +-- app/config/packages/cache.yaml | 2 +- app/config/packages/dev/web_profiler.yaml | 6 +- app/config/packages/framework.yaml | 26 +++--- app/config/packages/nelmio_api_doc.yaml | 28 +++--- app/config/packages/routing.yaml | 10 +-- app/config/packages/test/web_profiler.yaml | 6 +- app/config/packages/twig.yaml | 6 +- app/config/routes.yaml | 6 +- app/config/routes/annotations.yaml | 8 +- app/config/routes/dev/web_profiler.yaml | 8 +- app/config/routes/framework.yaml | 6 +- app/config/routes/nelmio_api_doc.yaml | 12 +-- app/config/services.yaml | 44 +++++----- devops/docker/{php => }/Dockerfile | 8 +- devops/k8s/0_ConfigMap/.gitignore | 1 + devops/k8s/0_ConfigMap/nginx-dev.yaml | 55 ++++++++++++ devops/k8s/0_Secret/.gitignore | 1 + devops/k8s/1_Service/nginx.yaml | 22 +++++ .../2_Deployment/notification-provider.yaml | 87 +++++++++++++++++++ docker-compose-local.yml | 40 --------- docker-compose.yml | 49 +++++++---- 24 files changed, 298 insertions(+), 163 deletions(-) rename devops/docker/{php => }/Dockerfile (85%) create mode 100644 devops/k8s/0_ConfigMap/.gitignore create mode 100644 devops/k8s/0_ConfigMap/nginx-dev.yaml create mode 100644 devops/k8s/0_Secret/.gitignore create mode 100644 devops/k8s/1_Service/nginx.yaml create mode 100644 devops/k8s/2_Deployment/notification-provider.yaml delete mode 100644 docker-compose-local.yml diff --git a/.editorconfig b/.editorconfig index 1644e9c..73069d4 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,7 +4,7 @@ root = true charset = utf-8 end_of_line = lf indent_style = space -indent_size = 4 +indent_size = 2 trim_trailing_whitespace = true insert_final_newline = true max_line_length = 100 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1635142..24534ac 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,12 +1,12 @@ --- variables: - DOCKER_BUILD_TEST_BUILD_FILE: devops/docker/php/Dockerfile - DOCKER_BUILD_TEST_TARGET: test - DOCKER_RELEASE_BUILD_FILE: devops/docker/php/Dockerfile - DOCKER_RELEASE_BUILD_TARGET: test + DOCKER_BUILD_TEST_BUILD_FILE: devops/docker/Dockerfile + DOCKER_BUILD_TEST_TARGET: test + DOCKER_RELEASE_BUILD_FILE: devops/docker/Dockerfile + DOCKER_RELEASE_BUILD_TARGET: test include: - - project: infra/kernel/ci-templates - ref: master - file: /${CI_PROJECT_PATH}.yml + - project: infra/kernel/ci-templates + ref: master + file: /${CI_PROJECT_PATH}.yml ... diff --git a/Makefile b/Makefile index 3da0a19..771596a 100644 --- a/Makefile +++ b/Makefile @@ -1,18 +1,12 @@ MAKEFLAGS += --silent .PHONY: * -restart-local: - docker-compose -f docker-compose-local.yml pull - docker-compose -f docker-compose-local.yml down - docker-compose -f docker-compose-local.yml up -d --build +apply: + kubectl apply --recursive=true --filename=devops/k8s restart: docker-compose -f docker-compose.yml pull docker-compose -f docker-compose.yml down - docker-compose -f docker-compose.yml up -d + docker-compose -f docker-compose.yml up -d --build -cleanup: - docker system prune --all --force - docker system prune --volumes --force - -.DEFAULT_GOAL := restart +.DEFAULT_GOAL := apply diff --git a/app/config/packages/cache.yaml b/app/config/packages/cache.yaml index 8d34b73..fbca9d9 100644 --- a/app/config/packages/cache.yaml +++ b/app/config/packages/cache.yaml @@ -1,4 +1,4 @@ --- framework: - cache: + cache: ... diff --git a/app/config/packages/dev/web_profiler.yaml b/app/config/packages/dev/web_profiler.yaml index 405cdaf..ada114b 100644 --- a/app/config/packages/dev/web_profiler.yaml +++ b/app/config/packages/dev/web_profiler.yaml @@ -1,8 +1,8 @@ --- web_profiler: - toolbar: true - intercept_redirects: false + toolbar: true + intercept_redirects: false framework: - profiler: { only_exceptions: false } + profiler: { only_exceptions: false } ... diff --git a/app/config/packages/framework.yaml b/app/config/packages/framework.yaml index d1cf60a..a51f24f 100644 --- a/app/config/packages/framework.yaml +++ b/app/config/packages/framework.yaml @@ -1,20 +1,20 @@ --- framework: - secret: '%env(APP_SECRET)%' - http_method_override: false + secret: '%env(APP_SECRET)%' + http_method_override: false - session: - handler_id: null - cookie_secure: auto - cookie_samesite: lax - storage_factory_id: session.storage.factory.native + session: + handler_id: null + cookie_secure: auto + cookie_samesite: lax + storage_factory_id: session.storage.factory.native - php_errors: - log: true + php_errors: + log: true when@test: - framework: - test: true - session: - storage_factory_id: session.storage.factory.mock_file + framework: + test: true + session: + storage_factory_id: session.storage.factory.mock_file ... diff --git a/app/config/packages/nelmio_api_doc.yaml b/app/config/packages/nelmio_api_doc.yaml index 869951e..9e50071 100644 --- a/app/config/packages/nelmio_api_doc.yaml +++ b/app/config/packages/nelmio_api_doc.yaml @@ -1,17 +1,17 @@ --- nelmio_api_doc: - documentation: - servers: - - url: https://notification-provider.fedy95.com - description: server API over HTTPS - - url: http://127.0.0.1:8054 - description: localhost API over HTTP - info: - title: notification-provider - description: notification-provider api doc - version: 0.0.1 - areas: - default: - path_patterns: - - ^/api/v1 + documentation: + servers: + - url: https://notification-provider.fedy95.com + description: server API over HTTPS + - url: http://127.0.0.1:8054 + description: localhost API over HTTP + info: + title: notification-provider + description: notification-provider api doc + version: 0.0.1 + areas: + default: + path_patterns: + - ^/api/v1 ... diff --git a/app/config/packages/routing.yaml b/app/config/packages/routing.yaml index 5738f8f..ca80a94 100644 --- a/app/config/packages/routing.yaml +++ b/app/config/packages/routing.yaml @@ -1,10 +1,10 @@ --- framework: - router: - utf8: true + router: + utf8: true when@prod: - framework: - router: - strict_requirements: null + framework: + router: + strict_requirements: null ... diff --git a/app/config/packages/test/web_profiler.yaml b/app/config/packages/test/web_profiler.yaml index 0c332aa..0f37da0 100644 --- a/app/config/packages/test/web_profiler.yaml +++ b/app/config/packages/test/web_profiler.yaml @@ -1,8 +1,8 @@ --- web_profiler: - toolbar: false - intercept_redirects: false + toolbar: false + intercept_redirects: false framework: - profiler: { collect: false } + profiler: { collect: false } ... diff --git a/app/config/packages/twig.yaml b/app/config/packages/twig.yaml index d964a53..e5d72cf 100644 --- a/app/config/packages/twig.yaml +++ b/app/config/packages/twig.yaml @@ -1,8 +1,8 @@ --- twig: - default_path: '%kernel.project_dir%/templates' + default_path: '%kernel.project_dir%/templates' when@test: - twig: - strict_variables: true + twig: + strict_variables: true ... diff --git a/app/config/routes.yaml b/app/config/routes.yaml index eb5849d..0fc03b2 100644 --- a/app/config/routes.yaml +++ b/app/config/routes.yaml @@ -1,6 +1,6 @@ --- app.swagger_ui: - path: /api/doc/{area} - methods: GET - defaults: { _controller: nelmio_api_doc.controller.swagger_ui, area: default } + path: /api/doc/{area} + methods: GET + defaults: { _controller: nelmio_api_doc.controller.swagger_ui, area: default } ... diff --git a/app/config/routes/annotations.yaml b/app/config/routes/annotations.yaml index 6a7cb3c..3a4152d 100644 --- a/app/config/routes/annotations.yaml +++ b/app/config/routes/annotations.yaml @@ -1,9 +1,9 @@ --- controllers: - resource: ../../src/Controller/ - type: annotation + resource: ../../src/Controller/ + type: annotation kernel: - resource: ../../src/Kernel.php - type: annotation + resource: ../../src/Kernel.php + type: annotation ... diff --git a/app/config/routes/dev/web_profiler.yaml b/app/config/routes/dev/web_profiler.yaml index f998a82..938b674 100644 --- a/app/config/routes/dev/web_profiler.yaml +++ b/app/config/routes/dev/web_profiler.yaml @@ -1,9 +1,9 @@ --- web_profiler_wdt: - resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' - prefix: /_wdt + resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' + prefix: /_wdt web_profiler_profiler: - resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' - prefix: /_profiler + resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' + prefix: /_profiler ... diff --git a/app/config/routes/framework.yaml b/app/config/routes/framework.yaml index d7f7419..158446c 100644 --- a/app/config/routes/framework.yaml +++ b/app/config/routes/framework.yaml @@ -1,6 +1,6 @@ --- when@dev: - _errors: - resource: '@FrameworkBundle/Resources/config/routing/errors.xml' - prefix: /_error + _errors: + resource: '@FrameworkBundle/Resources/config/routing/errors.xml' + prefix: /_error ... diff --git a/app/config/routes/nelmio_api_doc.yaml b/app/config/routes/nelmio_api_doc.yaml index 3bd2d61..f8bfac0 100644 --- a/app/config/routes/nelmio_api_doc.yaml +++ b/app/config/routes/nelmio_api_doc.yaml @@ -1,11 +1,11 @@ --- app.swagger: - path: /api/doc.json - methods: GET - defaults: { _controller: nelmio_api_doc.controller.swagger } + path: /api/doc.json + methods: GET + defaults: { _controller: nelmio_api_doc.controller.swagger } app.swagger_ui: - path: /api/doc - methods: GET - defaults: { _controller: nelmio_api_doc.controller.swagger_ui } + path: /api/doc + methods: GET + defaults: { _controller: nelmio_api_doc.controller.swagger_ui } ... diff --git a/app/config/services.yaml b/app/config/services.yaml index 4af77a4..91a7f38 100644 --- a/app/config/services.yaml +++ b/app/config/services.yaml @@ -1,29 +1,29 @@ --- parameters: - app.mattermost.url: '%env(resolve:MATTERMOST_URL)%' - app.mattermost.uri: '%env(resolve:MATTERMOST_URI)%' - app.mattermost.channel_name: '%env(resolve:MATTERMOST_CHANNEL_NAME)%' - app.mattermost.bot.name: '%env(resolve:MATTERMOST_BOT_NAME)%' - app.mattermost.bot.icon: '%env(resolve:MATTERMOST_BOT_ICON)%' + app.mattermost.url: '%env(resolve:MATTERMOST_URL)%' + app.mattermost.uri: '%env(resolve:MATTERMOST_URI)%' + app.mattermost.channel_name: '%env(resolve:MATTERMOST_CHANNEL_NAME)%' + app.mattermost.bot.name: '%env(resolve:MATTERMOST_BOT_NAME)%' + app.mattermost.bot.icon: '%env(resolve:MATTERMOST_BOT_ICON)%' services: - _defaults: - autowire: true - autoconfigure: true + _defaults: + autowire: true + autoconfigure: true - App\: - resource: '../src/' - exclude: - - '../src/DependencyInjection/' - - '../src/Entity/' - - '../src/Kernel.php' - - '../src/Tests/' + App\: + resource: '../src/' + exclude: + - '../src/DependencyInjection/' + - '../src/Entity/' + - '../src/Kernel.php' + - '../src/Tests/' - App\Service\Mattermost\MattermostService: - arguments: - $mattermostUrl: '%app.mattermost.url%' - $mattermostUri: '%app.mattermost.uri%' - $channelName: '%app.mattermost.channel_name%' - $botName: '%app.mattermost.bot.name%' - $botIcon: '%app.mattermost.bot.icon%' + App\Service\Mattermost\MattermostService: + arguments: + $mattermostUrl: '%app.mattermost.url%' + $mattermostUri: '%app.mattermost.uri%' + $channelName: '%app.mattermost.channel_name%' + $botName: '%app.mattermost.bot.name%' + $botIcon: '%app.mattermost.bot.icon%' ... diff --git a/devops/docker/php/Dockerfile b/devops/docker/Dockerfile similarity index 85% rename from devops/docker/php/Dockerfile rename to devops/docker/Dockerfile index aedc14a..63ddbf5 100644 --- a/devops/docker/php/Dockerfile +++ b/devops/docker/Dockerfile @@ -2,9 +2,8 @@ FROM php:8.0-fpm-alpine3.14 AS base RUN apk update && apk upgrade && \ apk add --no-cache $PHPIZE_DEPS libzip-dev composer && \ docker-php-ext-install zip pcntl - -RUN mkdir -p /var/www/localhost -WORKDIR /var/www/localhost +RUN mkdir -p /app +WORKDIR /app FROM base AS pre_test @@ -20,7 +19,8 @@ COPY devops/docker/php/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini FROM pre_test AS test COPY ./app . COPY env/app/app.env-dist .env -RUN composer install --no-progress --optimize-autoloader --no-interaction +RUN chown -R www-data:www-data /app/* && \ + composer install --no-progress --optimize-autoloader --no-interaction FROM pre_test AS local diff --git a/devops/k8s/0_ConfigMap/.gitignore b/devops/k8s/0_ConfigMap/.gitignore new file mode 100644 index 0000000..18a08e0 --- /dev/null +++ b/devops/k8s/0_ConfigMap/.gitignore @@ -0,0 +1 @@ +app-dev.yml diff --git a/devops/k8s/0_ConfigMap/nginx-dev.yaml b/devops/k8s/0_ConfigMap/nginx-dev.yaml new file mode 100644 index 0000000..c9452a0 --- /dev/null +++ b/devops/k8s/0_ConfigMap/nginx-dev.yaml @@ -0,0 +1,55 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: notification-provider-nginx-configmap0-dev + namespace: default + labels: + tier: notification-provider + component: nginx + environment: dev +data: + default.conf: | + server { + root /var/www/localhost/public; + error_log /var/log/nginx/localhost-error.log; + access_log /var/log/nginx/localhost-access.log; + + location / { + try_files $uri /index.php$is_args$args; + } + + location ~ \.php { + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_pass 127.0.0.1:9000; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param DOCUMENT_ROOT $document_root; + internal; + } + location ~ \.php$ { + return 404; + } + } + nginx.conf: | + user nginx; + worker_processes auto; + error_log /var/log/nginx/error.log warn; + pid /var/run/nginx.pid; + events { + worker_connections 1024; + } + http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + access_log /var/log/nginx/access.log main; + sendfile on; + #tcp_nopush on; + keepalive_timeout 65; + #gzip on; + include /etc/nginx/conf.d/default.conf; + } +... diff --git a/devops/k8s/0_Secret/.gitignore b/devops/k8s/0_Secret/.gitignore new file mode 100644 index 0000000..fa5e280 --- /dev/null +++ b/devops/k8s/0_Secret/.gitignore @@ -0,0 +1 @@ +gitlab-docker.yaml diff --git a/devops/k8s/1_Service/nginx.yaml b/devops/k8s/1_Service/nginx.yaml new file mode 100644 index 0000000..8786f22 --- /dev/null +++ b/devops/k8s/1_Service/nginx.yaml @@ -0,0 +1,22 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: notification-provider-nginx-service-dev + namespace: default + labels: + tier: notification-provider + component: nginx + environment: dev +spec: + selector: + app: notification-provider + tier: notification-provider + type: NodePort + ports: + - name: http + protocol: TCP + port: 80 + targetPort: 80 + nodePort: 30036 +... diff --git a/devops/k8s/2_Deployment/notification-provider.yaml b/devops/k8s/2_Deployment/notification-provider.yaml new file mode 100644 index 0000000..dd1de80 --- /dev/null +++ b/devops/k8s/2_Deployment/notification-provider.yaml @@ -0,0 +1,87 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: notification-provider + namespace: default + labels: + tier: notification-provider + environment: dev +spec: + replicas: 1 + selector: + matchLabels: + app: notification-provider + tier: notification-provider + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + template: + metadata: + labels: + app: notification-provider + tier: notification-provider + spec: + volumes: + - name: shared-files + emptyDir: { } + - name: notification-provider-app-configmap0-dev + configMap: + defaultMode: 0664 + name: notification-provider-app-configmap0-dev + - name: notification-provider-nginx-configmap0-dev + configMap: + defaultMode: 0664 + name: notification-provider-nginx-configmap0-dev + containers: + - name: php + image: gitlab-registry.fedy95.com:5002/dev/notification-provider:latest + resources: + requests: + cpu: "125m" + memory: "64Mi" + limits: + cpu: "250m" + memory: "128Mi" + volumeMounts: + - name: shared-files + mountPath: /var/www/localhost + - name: notification-provider-app-configmap0-dev + mountPath: /var/www/localhost/.env + subPath: .env + lifecycle: + postStart: + exec: + command: + - "/bin/sh" + - "-c" + - > + cp -rp /app/* /var/www/localhost + + - name: nginx + image: nginx:1.21-alpine + resources: + requests: + cpu: "125m" + memory: "64Mi" + limits: + cpu: "250m" + memory: "128Mi" + volumeMounts: + - name: shared-files + mountPath: /var/www/localhost + - name: notification-provider-app-configmap0-dev + mountPath: /var/www/localhost/.env + subPath: .env + - name: notification-provider-nginx-configmap0-dev + mountPath: /etc/nginx/nginx.conf + subPath: nginx.conf + - name: notification-provider-nginx-configmap0-dev + mountPath: /etc/nginx/conf.d/default.conf + subPath: default.conf + restartPolicy: Always + imagePullSecrets: + - name: gitlab-docker +... diff --git a/docker-compose-local.yml b/docker-compose-local.yml deleted file mode 100644 index bc9526f..0000000 --- a/docker-compose-local.yml +++ /dev/null @@ -1,40 +0,0 @@ ---- -version: "3.4" - -networks: - monitoring_monitor-net: - external: true - -services: - app: - build: - context: . - dockerfile: devops/docker/php/Dockerfile - target: local - restart: always - - environment: - COMPOSER_MEMORY_LIMIT: "-1" - PHP_IDE_CONFIG: "serverName=notification-provider_app" - volumes: - - ${HOME}/.composer:${HOME}/.composer - - ./app:/var/www/localhost - expose: - - "9000" - networks: - - monitoring_monitor-net - - nginx: - image: nginx:1.21-alpine - restart: always - - depends_on: - - app - volumes: - - ./app:/var/www/localhost - - ./devops/docker/nginx/etc/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf - ports: - - "8054:80" - networks: - - monitoring_monitor-net -... diff --git a/docker-compose.yml b/docker-compose.yml index 3cca270..fd28663 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,25 +1,40 @@ --- version: "3.4" +networks: + monitoring_monitor-net: + external: true + services: - app: - image: gitlab-registry.fedy95.com:5002/dev/notification-provider:latest - restart: always + app: + build: + context: . + dockerfile: devops/docker/Dockerfile + target: local + restart: always - volumes: - - ./env/app/app.env:/var/www/localhost/.env - expose: - - "9000" + environment: + COMPOSER_MEMORY_LIMIT: "-1" + PHP_IDE_CONFIG: "serverName=notification-provider_app" + volumes: + - ${HOME}/.composer:${HOME}/.composer + - ./app:/var/www/localhost + expose: + - "9000" + networks: + - monitoring_monitor-net - nginx: - image: nginx:1.21-alpine - restart: always + nginx: + image: nginx:1.21-alpine + restart: always - depends_on: - - app - volumes: - - ./app:/var/www/localhost - - ./devops/docker/nginx/etc/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf - ports: - - "8054:80" + depends_on: + - app + volumes: + - ./app:/var/www/localhost + - ./devops/docker/nginx/etc/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf + ports: + - "8054:80" + networks: + - monitoring_monitor-net ...