Projekt

Obecné

Profil

Deployment » Historie » Revize 2

Revize 1 (Jakub Vašta, 2020-03-18 17:15) → Revize 2/19 (Jakub Vašta, 2020-03-31 20:14)

h1. Deployment 

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

 h2. 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. 

 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/ /zcu-open-data-application/ 
 ├── build apache 
 │     ├── nginx Dockerfile│       ├── conf.d 
 │     │       │      └── default.conf fcgi.apache.conf 
 │     │       ├── sites docker-compose.yml 
 ├── php 
│       │      └── default.conf Dockerfile 
 │     │       ├── Dockerfile database └── nginx.conf database-dump.sql 
  └── php-fpm [Bad name in repo] 
 │           application 
     └── Dockerfile source-code 
 ├── 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 Apache využíván jako proxy (https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html) , přičemž je využito _php fpm_ fmp_ 

 h3. Nginx Apache Dockerfile 

 h4. Dockerfile  

 <pre><code class="text"> 
 FROM nginx:alpine httpd:2.4.33-alpine 
 COPY nginx.conf /etc/nginx RUN apk update; \ 
	 apk upgrade; 
 COPY conf.d /etc/nginx/conf.d dev.apache.conf /usr/local/apache2/conf/dev.apache.conf 
 ADD ./sites /etc/nginx/sites-available RUN echo "Include /usr/local/apache2/conf/dev.apache.conf" \ 
	 >> /usr/local/apache2/conf/httpd.conf 
 WORKDIR /var/www/ 
 CMD ["nginx"] 

 </code></pre> 

 h4. nginx.conf  
 h3. Apache Conf 

 <pre><code class="text"> 
 user    nginx; 
 worker_processes    4; 
 daemon off; ServerName localhost 

 error_log    /var/log/nginx/error.log warn; LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so 
 pid          /var/run/nginx.pid; 

 events { 
     worker_connections    1024; LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so 
 } 


 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> LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so 

 h4. sites/default.conf 
 <pre><code class="text"> 
 server { <VirtualHost *:80> 
     listen 80 default_server; # Proxy .php requests to port 9000 of the php-fpm container 
     listen [::]:80 default_server ipv6only=on; 

     server_name localhost; ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1 
     root /var/www/symfony/public; DocumentRoot /var/www/html/ 
     index <Directory /var/www/html/> 
         DirectoryIndex index.php index.html index.htm; 

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

     location ~ \.php$ { 
         try_files $uri /index.php =404; Options Indexes FollowSymLinks 
         fastcgi_pass php-upstream; AllowOverride All 
         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; Require all granted 
     } 

     location ~ /\.ht { 
         deny all; </Directory> 
    
     # Send apache logs to stdout and stderr 
     } 
 } 
 </code></pre> 

 h4. conf.d/default.conf 
 <pre><code class="text"> 
 upstream php-upstream { CustomLog /proc/self/fd/1 common 
     server php-fpm:9000; ErrorLog /proc/self/fd/2 
 } </VirtualHost> 

 </code></pre> 


 

 h3. PHP-FPM PHP 

 h4. Dockerfile 
 <pre><code class="text"> 
 FROM php:7.4-fpm-alpine php:7.2.24-fpm-alpine3.7 
 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; 

 
 RUN docker-php-ext-install mysqli 
 </code></pre> 


 h3. Docker-compose 

 Docker-compose.yml 
 <pre><code class="yaml"> 
 version: "3.2" 
 services: 
        php-fpm: 
                
         php: 
                 build: './build/php-fm' 
                depends_on:  
                        - database 
                './php' 
                 networks: 
                    
                         - backend 
                ports:  
                        - "9000:9000" 
                
                 volumes: 
                        
                         - ./website/:/var/www/symfony 
                container_name: "heatmap_php_fpm" 
        nginx: 
                ./website/:/var/www/html 
         apache: 
                 build: './build/nginx' 
                './apache/' 
                 depends_on: 
                        
                         - php-fpm 
                        php 
                         - database 
                mysql 
                 networks: 
                        
                         - frontend 
                        
                         - backend 
                
                 ports: 
                        
                         - "80:80" 
                "-127.0.0.1-:80:80" 
                 volumes: 
                        
                         - ./logs:/var/nginx/log 
                        - ./website/:/var/www/symfony 
                container_name: "heatmap_nginx" 
        database: 
                ./website/:/var/www/html/ 
         mysql: 
                 image: 'mongo' 
                mysql:5.6.40 
                 container_name: "heatmap_mongodb" 
                database 
                 restart: always 
                
                 networks: 
                        
                         - backend 
                
                 ports: 
                        
                         - '27017-27019:27017-27019' 
                "3306:3306" 
                 environment: 
                        MONGO_INITDB_DATABASE: open-data-db 
                        MONGO_INITDB_ROOT_USERNAME: root 
                        MONGO_INITDB_ROOT_PASSWORD: root 
 
                         MYSQL_ROOT_PASSWORD: -pswd- 
                         MYSQL_USER: -user- 
                         MYSQL_PASSWORD: -pswd- 
                         MYSQL_DATABASE: -db- 
                 volumes: 
                         - ./database-dump/:/docker-entrypoint-initdb.d 

 networks: 
        
         frontend: 
        
         backend: 

 </code></pre> 

 h3. Database [Currently missing] 

 Zde je možné mít sql 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] 

 Poznámky:  
 # 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í 

 <pre><code class="yaml"> 

 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 

 </code></pre>