Deployment » Historie » Revize 16
Revize 15 (Jakub Vašta, 2020-05-20 17:43) → Revize 16/19 (Jakub Vašta, 2020-05-20 18:24)
h1. Deployment
Pro deployment se bude používat Docker (s vuyžitím Docker-Compose) jelikož se bude jednat o webovou aplikaci.
h2. 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).
<pre><code class="text">
ssh root@heatmap.zcu.cz
</code></pre>
h2. Zákazník
# Bude mít přístup k testovacímu serveru, kde bude naše poslední funkční verze aplikace.
# Bude si moci v případě potřeby stáhnout obraz z Docker Hub.
h2. 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/
<pre><code class="text">
/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
</code></pre>
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_
h3. Nginx
h4. Dockerfile
<pre><code class="text">
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"]
</code></pre>
h4. nginx.conf
<pre><code class="text">
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;
}
</code></pre>
h4. sites/default.conf
<pre><code class="text">
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;
}
}
</code></pre>
h4. conf.d/default.conf
<pre><code class="text">
upstream php-upstream {
server php-fpm:9000;
}
</code></pre>
h3. PHP-FPM
h4. Dockerfile
<pre><code class="text">
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;
</code></pre>
h3. Docker-compose
<pre><code class="yaml">
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:
</code></pre>
h3. 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)
h2. 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 ...)
h2. GitLab CI/CD [In progress]
Zajímavá videa pro seznámení se s problematikou:
> * https://www.youtube.com/watch?v=gr76MNXZJfQ
> + Big picture
> + Nezabíhá se příliš do detailů, ale je ukázáno čeho se dá dosáhnout, aneb hodí se vědět co vše to dokáže.
> * 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 *aether48.zcu.cz*
> * https://gitlab.com/gitlab-org/gitlab-runner/issues/4449
> * práva gitlab-runner změněna na root kvůli instalacím dalších balíčků z pipeline
> * do runneru je přes @compose require@ přidán program, který testuje kód podle metriky *PSR-2*
Poznámky:
# mít na svém serveru dvě verze, jednu dostupnou všem a jednu jen pro vývoj ✓
# prozkoumat integrační testy v symfony
# zjistit co všechno bude potřeba v before_script
# nasadit nějaké nástroje na metriku kódu ✓
<pre><code class="yaml">
# 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
</code></pre>