Deployment » Historie » Revize 3
« Předchozí |
Revize 3/19
(rozdíl)
| Další »
Jakub Vašta, 2020-03-31 20:18
Deployment¶
Pro deployment se bude používat Docker (s vuyžitím Docker-Compose) jeliko6 se bude jednat o webovou aplikaci.
Zákazník¶
- Bude mít přístup k testovacímu serveru, který budeme mít (pravděpodobně na ZČU), kde bude naše poslední funkční verze aplikace.
- 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;
}
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;
}
}
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;
}
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;
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-fm'
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:- https://www.youtube.com/watch?v=gr76MNXZJfQ - nezabíhá se příliš do detailů, ale ukazuje čeho se dá dosáhnout
- 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
- mít na svém serveru dvě věrze, jednu dostupnou všem a jednu jen pro vývoj
- zjistit jak vlastně fungují testy v symfony a vytvořit nějaký jednoduchý na otestování
- zjistit co všechno bude potřeba v before_script
image: php:7.2-cli
variables:
IMAGE_NAME: gitlab.kiv.zcu.cz:5000/aswi/aswi-2020/aswi2020sebela:$CI_COMMIT_REF_NAME
stages:
- test
- build
- deploy
before_script:
- some update stuff
# Setup SSH deploy keys
- - 'which ssh-agent || ( apt-get install -qq openssh-client )'
- eval $(ssh-agent -s)
- ssh-add <(echo "$SSH_PRIVATE_KEY")
- mkdir -p ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
test:
stage: test
tags:
- test-stage
script:
- php ./phpunit symfony
build:
stage: build
tags:
- build-stage
script:
- docker login -u $USER p $PASSWORD gitlab.kiv.zcu.cz:5000
- docker-compose build $IMAGE_NAME .
- docker-compose push $IMAGE_NAME
deploy_staging:
stage: deploy
tags:
- docker-stage
# we could run two application first which is for developers and there will be no access for anyone else and second public
script:
- ssh root@example.com "docker login -u $USER p $PASSWORD gitlab.kiv.zcu.cz:5000 && docker-compose pull $IMAGE_NAME && docker-compose up"
only:
- master
#
deploy_prod:
stage: deploy
tags:
- docker-prod
environmnet:
name: deploy
url: http://whatever.zcu.cz
script:
- ssh root@example.com "docker login -u $USER p $PASSWORD gitlab.kiv.zcu.cz:5000 && docker-compose pull $IMAGE_NAME && docker-compose up"
only:
- master
when: manual
Aktualizováno uživatelem Jakub Vašta před téměř 5 roky(ů) · 3 revizí