Projekt

Obecné

Profil

Deployment » Historie » Verze 4

Tomáš Ballák, 2020-04-01 21:15

1 1 Jakub Vašta
h1. Deployment
2
3
Pro deployment se bude používat Docker (s vuyžitím Docker-Compose) jeliko6 se bude jednat o webovou aplikaci.
4
5
h2. Zákazník
6
7
# 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.
8
# Bude si moci v případě potřeby stáhnout obraz z Docker Hub.
9
10 2 Jakub Vašta
h2. Vývojář [Not prepared for deployment to production!]
11 1 Jakub Vašta
12
Struktura velmi ovlivněna návodem: https://www.cloudreach.com/en/resources/blog/containerize-this-how-to-use-php-apache-mysql-within-docker-containers/
13
14
<pre><code class="text">
15 2 Jakub Vašta
/application-root/
16
├── build
17
│   ├── nginx
18
│   │     ├── conf.d
19
│   │     │    └── default.conf
20
│   │     ├── sites
21
│   │     │    └── default.conf
22
│   │     ├── Dockerfile
23
│   │     └── nginx.conf
24
│   └── php-fpm [Bad name in repo]
25
│         └── Dockerfile
26 1 Jakub Vašta
├── docker-compose.yml
27 2 Jakub Vašta
├── build.bat
28
├── build.sh
29
├── composer-install.bat
30
└── composer-install.sh
31
32 1 Jakub Vašta
</code></pre>
33
34 2 Jakub Vašta
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_
35 1 Jakub Vašta
36 2 Jakub Vašta
h3. Nginx
37 1 Jakub Vašta
38 2 Jakub Vašta
h4. Dockerfile 
39
40 1 Jakub Vašta
<pre><code class="text">
41 2 Jakub Vašta
FROM nginx:alpine
42
COPY nginx.conf /etc/nginx
43
COPY conf.d /etc/nginx/conf.d
44
ADD ./sites /etc/nginx/sites-available
45
WORKDIR /var/www/
46
CMD ["nginx"]
47
48 1 Jakub Vašta
</code></pre>
49
50 2 Jakub Vašta
h4. nginx.conf 
51
<pre><code class="text">
52
user  nginx;
53
worker_processes  4;
54
daemon off;
55 1 Jakub Vašta
56 2 Jakub Vašta
error_log  /var/log/nginx/error.log warn;
57
pid        /var/run/nginx.pid;
58
59
events {
60
    worker_connections  1024;
61
}
62
63
64
http {
65
    include       /etc/nginx/mime.types;
66
    default_type  application/octet-stream;
67
    access_log  /var/log/nginx/access.log;
68
    sendfile        on;
69
    keepalive_timeout  65;
70
71
    include /etc/nginx/conf.d/*.conf;
72
    include /etc/nginx/sites-available/*.conf;
73
}
74
75
76
</code></pre>
77
78
h4. sites/default.conf
79 1 Jakub Vašta
<pre><code class="text">
80 2 Jakub Vašta
server {
81
    listen 80 default_server;
82
    listen [::]:80 default_server ipv6only=on;
83 1 Jakub Vašta
84 2 Jakub Vašta
    server_name localhost;
85
    root /var/www/symfony/public;
86
    index index.php index.html index.htm;
87 1 Jakub Vašta
88 2 Jakub Vašta
    location / {
89
         try_files $uri $uri/ /index.php$is_args$args;
90
    }
91 1 Jakub Vašta
92 2 Jakub Vašta
    location ~ \.php$ {
93
        try_files $uri /index.php =404;
94
        fastcgi_pass php-upstream;
95
        fastcgi_index index.php;
96
        fastcgi_buffers 16 16k;
97
        fastcgi_buffer_size 32k;
98
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
99
        fastcgi_read_timeout 600;
100
        include fastcgi_params;
101
    }
102
103
    location ~ /\.ht {
104
        deny all;
105
    }
106
}
107 1 Jakub Vašta
</code></pre>
108
109 2 Jakub Vašta
h4. conf.d/default.conf
110
<pre><code class="text">
111
upstream php-upstream {
112
    server php-fpm:9000;
113
}
114 1 Jakub Vašta
115 2 Jakub Vašta
</code></pre>
116
117
118
h3. PHP-FPM
119
120
h4. Dockerfile
121 1 Jakub Vašta
<pre><code class="text">
122 2 Jakub Vašta
FROM php:7.4-fpm-alpine
123 1 Jakub Vašta
RUN apk update; \
124 2 Jakub Vašta
    apk upgrade; \
125
    apk add autoconf openssl-dev g++ make && \
126
    pecl install mongodb && \
127
    docker-php-ext-enable mongodb; \
128
    apk del --purge autoconf openssl-dev g++ make;
129
130 1 Jakub Vašta
</code></pre>
131
132
133 2 Jakub Vašta
h3. Docker-compose
134
135 1 Jakub Vašta
<pre><code class="yaml">
136
version: "3.2"
137
services:
138 2 Jakub Vašta
       php-fpm:
139 4 Tomáš Ballák
               build: './build/php-fpm'
140 2 Jakub Vašta
               depends_on: 
141
                       - database
142
               networks:
143
                   - backend
144
               ports: 
145
                       - "9000:9000"
146
               volumes:
147
                       - ./website/:/var/www/symfony
148
               container_name: "heatmap_php_fpm"
149
       nginx:
150
               build: './build/nginx'
151
               depends_on:
152
                       - php-fpm
153
                       - database
154
               networks:
155
                       - frontend
156
                       - backend
157
               ports:
158
                       - "80:80"
159
               volumes:
160
                       - ./logs:/var/nginx/log
161
                       - ./website/:/var/www/symfony
162
               container_name: "heatmap_nginx"
163
       database:
164
               image: 'mongo'
165
               container_name: "heatmap_mongodb"
166
               restart: always
167
               networks:
168
                       - backend
169
               ports:
170
                       - '27017-27019:27017-27019'
171
               environment:
172
                       MONGO_INITDB_DATABASE: open-data-db
173
                       MONGO_INITDB_ROOT_USERNAME: root
174
                       MONGO_INITDB_ROOT_PASSWORD: root
175 1 Jakub Vašta
networks:
176 2 Jakub Vašta
       frontend:
177
       backend:
178 1 Jakub Vašta
179
</code></pre>
180
181 2 Jakub Vašta
h3. Database [Currently missing]
182 1 Jakub Vašta
183 2 Jakub Vašta
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)
184 1 Jakub Vašta
185
h2. Spuštění
186
187
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 ...)
188 2 Jakub Vašta
189
h2. GitLab CI/CD [In progress]
190
191 3 Jakub Vašta
Zajímavá "výuková" videa:
192
# https://www.youtube.com/watch?v=gr76MNXZJfQ - nezabíhá se příliš do detailů, ale ukazuje čeho se dá dosáhnout
193
# 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
194
195
Poznámky:  
196 2 Jakub Vašta
# mít na svém serveru dvě věrze, jednu dostupnou všem a jednu jen pro vývoj
197 1 Jakub Vašta
# zjistit jak vlastně fungují testy v symfony a vytvořit nějaký jednoduchý na otestování
198 3 Jakub Vašta
# zjistit co všechno bude potřeba v before_script
199 2 Jakub Vašta
200
<pre><code class="yaml">
201
202
image: php:7.2-cli
203
204
variables:
205
    IMAGE_NAME: gitlab.kiv.zcu.cz:5000/aswi/aswi-2020/aswi2020sebela:$CI_COMMIT_REF_NAME
206
207
stages:
208
    - test
209
    - build
210
    - deploy
211
212
before_script:
213
    - some update stuff
214
    # Setup SSH deploy keys
215
    - - 'which ssh-agent || ( apt-get install -qq openssh-client )'
216
    - eval $(ssh-agent -s)
217
    - ssh-add <(echo "$SSH_PRIVATE_KEY")
218
    - mkdir -p ~/.ssh
219
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
220
221
test:
222
    stage: test
223
    tags:
224
        - test-stage
225
    script:
226
        - php ./phpunit symfony
227
    
228
229
build:
230
    stage: build
231
    tags:
232
        - build-stage
233
    script:
234
        - docker login -u $USER p $PASSWORD gitlab.kiv.zcu.cz:5000
235
        - docker-compose build $IMAGE_NAME .
236
        - docker-compose push $IMAGE_NAME
237
238
deploy_staging:
239
    stage: deploy
240
    tags:
241
        - docker-stage
242
# we could run two application first which is for developers and there will be no access for anyone else and second public
243
    script:
244
        - ssh root@example.com "docker login -u $USER p $PASSWORD gitlab.kiv.zcu.cz:5000 && docker-compose pull $IMAGE_NAME && docker-compose up"
245
    only:
246
        - master
247
248
        #   
249
deploy_prod:
250
    stage: deploy
251
    tags:
252
        - docker-prod
253
    environmnet:
254
        name: deploy
255
        url: http://whatever.zcu.cz
256
    script:
257
        - ssh root@example.com "docker login -u $USER p $PASSWORD gitlab.kiv.zcu.cz:5000 && docker-compose pull $IMAGE_NAME && docker-compose up"
258
    only:
259
        - master
260
    when: manual
261
262
</code></pre>
263
264 1 Jakub Vašta
265
266
267
268
269
270
271