Projekt

Obecné

Profil

Deployment » Historie » Verze 13

Jakub Vašta, 2020-05-20 17:42

1 1 Jakub Vašta
h1. Deployment
2
3 7 Martin Šebela
Pro deployment se bude používat Docker (s vuyžitím Docker-Compose) jelikož se bude jednat o webovou aplikaci.
4 1 Jakub Vašta
5 7 Martin Šebela
h2. Produkční a testovací server
6
7
*Produkční* server: http://heatmap.zcu.cz (VPS aether43.zcu.cz)
8
Server pro *testování*: http://aether48.zcu.cz (VPS aether48.zcu.cz)
9
10
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).
11
<pre><code class="text">
12
ssh root@heatmap.zcu.cz
13
</code></pre>
14
15 1 Jakub Vašta
h2. Zákazník
16
17 7 Martin Šebela
# Bude mít přístup k testovacímu serveru, kde bude naše poslední funkční verze aplikace.
18 1 Jakub Vašta
# Bude si moci v případě potřeby stáhnout obraz z Docker Hub.
19
20 2 Jakub Vašta
h2. Vývojář [Not prepared for deployment to production!]
21 1 Jakub Vašta
22
Struktura velmi ovlivněna návodem: https://www.cloudreach.com/en/resources/blog/containerize-this-how-to-use-php-apache-mysql-within-docker-containers/
23
24
<pre><code class="text">
25 2 Jakub Vašta
/application-root/
26
├── build
27
│   ├── nginx
28
│   │     ├── conf.d
29
│   │     │    └── default.conf
30
│   │     ├── sites
31
│   │     │    └── default.conf
32
│   │     ├── Dockerfile
33
│   │     └── nginx.conf
34
│   └── php-fpm [Bad name in repo]
35 1 Jakub Vašta
│         └── Dockerfile
36 2 Jakub Vašta
├── docker-compose.yml
37
├── build.bat
38
├── build.sh
39
├── composer-install.bat
40
└── composer-install.sh
41 1 Jakub Vašta
42
</code></pre>
43
44 7 Martin Šebela
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_
45 1 Jakub Vašta
46 2 Jakub Vašta
h3. Nginx
47 1 Jakub Vašta
48 2 Jakub Vašta
h4. Dockerfile 
49
50 1 Jakub Vašta
<pre><code class="text">
51 2 Jakub Vašta
FROM nginx:alpine
52
COPY nginx.conf /etc/nginx
53
COPY conf.d /etc/nginx/conf.d
54
ADD ./sites /etc/nginx/sites-available
55
WORKDIR /var/www/
56
CMD ["nginx"]
57
58 1 Jakub Vašta
</code></pre>
59
60 2 Jakub Vašta
h4. nginx.conf 
61
<pre><code class="text">
62
user  nginx;
63
worker_processes  4;
64
daemon off;
65 1 Jakub Vašta
66 2 Jakub Vašta
error_log  /var/log/nginx/error.log warn;
67
pid        /var/run/nginx.pid;
68
69
events {
70
    worker_connections  1024;
71
}
72
73
74
http {
75
    include       /etc/nginx/mime.types;
76
    default_type  application/octet-stream;
77
    access_log  /var/log/nginx/access.log;
78
    sendfile        on;
79
    keepalive_timeout  65;
80
81
    include /etc/nginx/conf.d/*.conf;
82
    include /etc/nginx/sites-available/*.conf;
83
}
84
85
86
</code></pre>
87
88
h4. sites/default.conf
89 1 Jakub Vašta
<pre><code class="text">
90 2 Jakub Vašta
server {
91
    listen 80 default_server;
92
    listen [::]:80 default_server ipv6only=on;
93 1 Jakub Vašta
94 2 Jakub Vašta
    server_name localhost;
95
    root /var/www/symfony/public;
96
    index index.php index.html index.htm;
97 1 Jakub Vašta
98 2 Jakub Vašta
    location / {
99
         try_files $uri $uri/ /index.php$is_args$args;
100
    }
101 1 Jakub Vašta
102 2 Jakub Vašta
    location ~ \.php$ {
103
        try_files $uri /index.php =404;
104
        fastcgi_pass php-upstream;
105
        fastcgi_index index.php;
106
        fastcgi_buffers 16 16k;
107
        fastcgi_buffer_size 32k;
108
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
109
        fastcgi_read_timeout 600;
110
        include fastcgi_params;
111
    }
112
113
    location ~ /\.ht {
114
        deny all;
115
    }
116
}
117 1 Jakub Vašta
</code></pre>
118
119 2 Jakub Vašta
h4. conf.d/default.conf
120
<pre><code class="text">
121
upstream php-upstream {
122
    server php-fpm:9000;
123
}
124 1 Jakub Vašta
125 2 Jakub Vašta
</code></pre>
126
127
128
h3. PHP-FPM
129
130
h4. Dockerfile
131 1 Jakub Vašta
<pre><code class="text">
132 2 Jakub Vašta
FROM php:7.4-fpm-alpine
133 1 Jakub Vašta
RUN apk update; \
134 2 Jakub Vašta
    apk upgrade; \
135
    apk add autoconf openssl-dev g++ make && \
136
    pecl install mongodb && \
137
    docker-php-ext-enable mongodb; \
138
    apk del --purge autoconf openssl-dev g++ make;
139
140 1 Jakub Vašta
</code></pre>
141
142
143 2 Jakub Vašta
h3. Docker-compose
144
145 1 Jakub Vašta
<pre><code class="yaml">
146
version: "3.2"
147
services:
148 2 Jakub Vašta
       php-fpm:
149 4 Tomáš Ballák
               build: './build/php-fpm'
150 2 Jakub Vašta
               depends_on: 
151
                       - database
152
               networks:
153
                   - backend
154
               ports: 
155
                       - "9000:9000"
156
               volumes:
157
                       - ./website/:/var/www/symfony
158
               container_name: "heatmap_php_fpm"
159
       nginx:
160
               build: './build/nginx'
161
               depends_on:
162
                       - php-fpm
163
                       - database
164
               networks:
165
                       - frontend
166
                       - backend
167
               ports:
168
                       - "80:80"
169
               volumes:
170
                       - ./logs:/var/nginx/log
171
                       - ./website/:/var/www/symfony
172
               container_name: "heatmap_nginx"
173
       database:
174
               image: 'mongo'
175
               container_name: "heatmap_mongodb"
176
               restart: always
177
               networks:
178
                       - backend
179
               ports:
180
                       - '27017-27019:27017-27019'
181
               environment:
182
                       MONGO_INITDB_DATABASE: open-data-db
183
                       MONGO_INITDB_ROOT_USERNAME: root
184
                       MONGO_INITDB_ROOT_PASSWORD: root
185 1 Jakub Vašta
networks:
186 2 Jakub Vašta
       frontend:
187
       backend:
188 1 Jakub Vašta
189
</code></pre>
190
191 2 Jakub Vašta
h3. Database [Currently missing]
192 1 Jakub Vašta
193 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)
194 1 Jakub Vašta
195
h2. Spuštění
196
197
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 ...)
198 2 Jakub Vašta
199
h2. GitLab CI/CD [In progress]
200
201 1 Jakub Vašta
202 12 Jakub Vašta
Zajímavá videa pro seznámení se s problematikou:
203
> # https://www.youtube.com/watch?v=gr76MNXZJfQ
204
> + Big picture
205
> + 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.
206
207 13 Jakub Vašta
> # https://www.youtube.com/watch?v=34u4wbeEYEo&list=PLaFCDlD-mVOlnL0f9rl3jyOHNdHU--vlJ&index=1
208 12 Jakub Vašta
> + Indian guy saves the day :)
209
> + Víc prakticky zaměřené
210
> + Celá série
211
212 5 Jakub Vašta
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.
213
214 11 Tomáš Ballák
Gitlab-runner nainstalován na *aether48.zcu.cz*
215 12 Jakub Vašta
> * https://gitlab.com/gitlab-org/gitlab-runner/issues/4449
216
> * práva gitlab-runner změněna na root kvůli instalacím dalších balíčků z pipeline
217
> * do runneru je přes @compose require@ přidán program, který testuje kód podle metriky *PSR-2*
218 5 Jakub Vašta
219 2 Jakub Vašta
Poznámky:  
220 9 Tomáš Ballák
# mít na svém serveru dvě verze, jednu dostupnou všem a jednu jen pro vývoj ✓ 
221 5 Jakub Vašta
# prozkoumat integrační testy v symfony
222 1 Jakub Vašta
# zjistit co všechno bude potřeba v before_script
223 9 Tomáš Ballák
# nasadit nějaké nástroje na metriku kódu ✓ 
224 1 Jakub Vašta
225
<pre><code class="yaml">
226
227 5 Jakub Vašta
# variables:
228
#     IMAGE_NAME: zcu-campus-life-app:$CI_COMMIT_REF_NAME
229 1 Jakub Vašta
230
stages:
231
    - test
232 8 Tomáš Ballák
    - linter
233 1 Jakub Vašta
    - build
234
    - deploy
235
236
unit_tests:
237
    stage: test
238 8 Tomáš Ballák
    tags:
239
        - test
240 5 Jakub Vašta
    script:
241
        - cd website
242
        - composer require --dev symfony/phpunit-bridge
243
        - php bin/phpunit
244 8 Tomáš Ballák
php_linter: 
245
    stage: linter
246
    tags:
247
        - linter
248
    script:
249
        - cd website
250
        - composer require --dev squizlabs/php_codesniffer
251
        - ./vendor/bin/php-cs-fixer fix --dry-run --config .php_cs --stop-on-violation --using-cache=no
252 2 Jakub Vašta
build:
253
    stage: build
254
    tags:
255 5 Jakub Vašta
        - build
256 2 Jakub Vašta
    script:
257 1 Jakub Vašta
        # Test whether container can be build or not
258 5 Jakub Vašta
        - docker-compose build
259
        # We could also push docker image to some registry or docker hub
260
        
261
deploy_prod:
262
    stage: deploy
263
    tags:
264
        - deploy
265 2 Jakub Vašta
    variables:
266 5 Jakub Vašta
        GIT_STRATEGY: none
267
    environment:
268
        name: heatmap
269
        url: https://heatmap.zcu.cz
270
    script:
271 8 Tomáš Ballák
        - 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"
272 1 Jakub Vašta
    only:
273
        - master
274
    when: manual
275
276
</code></pre>
277
278
279
280
281
282
283
284
285