Projekt

Obecné

Profil

Akce

Deployment » Historie » Revize 9

« Předchozí | Revize 9/19 (rozdíl) | Další »
Tomáš Ballák, 2020-04-06 16:50


Deployment

Pro deployment se bude používat Docker (s vuyžitím Docker-Compose) jelikož se bude jednat o webovou aplikaci.

Produkční a testovací server

Produkční server: http://heatmap.zcu.cz (VPS aether43.zcu.cz)
Server pro testování: http://aether48.zcu.cz (VPS aether48.zcu.cz)

Přihlášení je možné pouze přes SSH klíč a pouze z univerzitního rozsahu 147.228.*.* (https://support.zcu.cz/index.php/VPN) a dále pak zadáním příkazu v terminálu (příklad pro produkční server).

ssh root@heatmap.zcu.cz

Zákazník

  1. Bude mít přístup k testovacímu serveru, kde bude naše poslední funkční verze aplikace.
  2. Bude si moci v případě potřeby stáhnout obraz z Docker Hub.

Vývojář [Not prepared for deployment to production!]

Struktura velmi ovlivněna návodem: https://www.cloudreach.com/en/resources/blog/containerize-this-how-to-use-php-apache-mysql-within-docker-containers/

/application-root/
├── build
│   ├── nginx
│   │     ├── conf.d
│   │     │    └── default.conf
│   │     ├── sites
│   │     │    └── default.conf
│   │     ├── Dockerfile
│   │     └── nginx.conf
│   └── php-fpm [Bad name in repo]
│         └── Dockerfile
├── docker-compose.yml
├── build.bat
├── build.sh
├── composer-install.bat
└── composer-install.sh

Jak je možné vidět, tak každá "služba" je v samostatném kontaineru a navíc je Nginx využíván jako proxy (https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html), přičemž je využito php fpm

Nginx

Dockerfile

FROM nginx:alpine
COPY nginx.conf /etc/nginx
COPY conf.d /etc/nginx/conf.d
ADD ./sites /etc/nginx/sites-available
WORKDIR /var/www/
CMD ["nginx"]

nginx.conf
user  nginx;
worker_processes  4;
daemon off;

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;
    access_log  /var/log/nginx/access.log;
    sendfile        on;
    keepalive_timeout  65;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-available/*.conf;
}

sites/default.conf
server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    server_name localhost;
    root /var/www/symfony/public;
    index index.php index.html index.htm;

    location / {
         try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass php-upstream;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

conf.d/default.conf
upstream php-upstream {
    server php-fpm:9000;
}

PHP-FPM

Dockerfile
FROM php:7.4-fpm-alpine
RUN apk update; \
    apk upgrade; \
    apk add autoconf openssl-dev g++ make && \
    pecl install mongodb && \
    docker-php-ext-enable mongodb; \
    apk del --purge autoconf openssl-dev g++ make;

Docker-compose

version: "3.2" 
services:
       php-fpm:
               build: './build/php-fpm'
               depends_on: 
                       - database
               networks:
                   - backend
               ports: 
                       - "9000:9000" 
               volumes:
                       - ./website/:/var/www/symfony
               container_name: "heatmap_php_fpm" 
       nginx:
               build: './build/nginx'
               depends_on:
                       - php-fpm
                       - database
               networks:
                       - frontend
                       - backend
               ports:
                       - "80:80" 
               volumes:
                       - ./logs:/var/nginx/log
                       - ./website/:/var/www/symfony
               container_name: "heatmap_nginx" 
       database:
               image: 'mongo'
               container_name: "heatmap_mongodb" 
               restart: always
               networks:
                       - backend
               ports:
                       - '27017-27019:27017-27019'
               environment:
                       MONGO_INITDB_DATABASE: open-data-db
                       MONGO_INITDB_ROOT_USERNAME: root
                       MONGO_INITDB_ROOT_PASSWORD: root
networks:
       frontend:
       backend:

Database [Currently missing]

Zde je možné mít dump databáze, kterou chcete využívat při startu aplikace (možné použít například jako testovací databázi)

Spuštění

Pokud máte spuštěný Docker, tak stačí pouze ze složky se souborem docker-composer.yml zavolat příkaz docker-compose up z příkazové řádky (power shellu, shellu ...)

GitLab CI/CD [In progress]

Zajímavá "výuková" videa:
  1. https://www.youtube.com/watch?v=gr76MNXZJfQ - nezabíhá se příliš do detailů, ale ukazuje čeho se dá dosáhnout
  2. https://www.youtube.com/watch?v=34u4wbeEYEo&list=PLaFCDlD-mVOlnL0f9rl3jyOHNdHU--vlJ&index=1 - Indian guy saves the day, víc prakticky zaměřené, celá série

Shared runner na GitLabu nemá nainstalovaný docker (nebo sám běží v dockeru), proto se na něm nedá (alespoň ne snadno tzn. nepovedlo se mi to) rozběhnout docker resp. docker-compose pro testování zda jde projekt přeložit.

Gitlab-runner nainstalován na heatmap.zcu.cz

*gitlab-runner běží na testovacím serveru aether48.zcu.cz.

Poznámky:
  1. mít na svém serveru dvě verze, jednu dostupnou všem a jednu jen pro vývoj ✓
  2. prozkoumat integrační testy v symfony
  3. zjistit co všechno bude potřeba v before_script
  4. nasadit nějaké nástroje na metriku kódu ✓

# variables:
#     IMAGE_NAME: zcu-campus-life-app:$CI_COMMIT_REF_NAME

stages:
    - test
    - linter
    - build
    - deploy

unit_tests:
    stage: test
    tags:
        - test
    script:
        - cd website
        - composer require --dev symfony/phpunit-bridge
        - php bin/phpunit
php_linter: 
    stage: linter
    tags:
        - linter
    script:
        - cd website
        - composer require --dev squizlabs/php_codesniffer
        - ./vendor/bin/php-cs-fixer fix --dry-run --config .php_cs --stop-on-violation --using-cache=no
build:
    stage: build
    tags:
        - build
    script:
        # Test whether container can be build or not
        - docker-compose build
        # We could also push docker image to some registry or docker hub

deploy_prod:
    stage: deploy
    tags:
        - deploy
    variables:
        GIT_STRATEGY: none
    environment:
        name: heatmap
        url: https://heatmap.zcu.cz
    script:
        - ssh root@heatmap.zcu.cz "cd ~ && rm -rf aswi2020sebela && git clone https://gitlab.kiv.zcu.cz/aswi/aswi-2020/aswi2020sebela.git && cd aswi2020sebela && ./scripts/build.sh && exit" 
    only:
        - master
    when: manual

Aktualizováno uživatelem Tomáš Ballák před asi 4 roky(ů) · 9 revizí