Deployment » Historie » Verze 18
Jakub Vašta, 2020-05-27 18:18
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 | 18 | Jakub Vašta | # -Bude si moci v případě potřeby stáhnout obraz z Docker Hub.- |
19 | 1 | Jakub Vašta | |
20 | 18 | Jakub Vašta | h2. Vývojář |
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 | 16 | Jakub Vašta | h2. GitLab CI/CD |
200 | 5 | Jakub Vašta | |
201 | 11 | Tomáš Ballák | Gitlab-runner nainstalován na *aether48.zcu.cz* |
202 | 12 | Jakub Vašta | > * https://gitlab.com/gitlab-org/gitlab-runner/issues/4449 |
203 | > * práva gitlab-runner změněna na root kvůli instalacím dalších balíčků z pipeline |
||
204 | > * do runneru je přes @compose require@ přidán program, který testuje kód podle metriky *PSR-2* |
||
205 | 5 | Jakub Vašta | |
206 | 2 | Jakub Vašta | Poznámky: |
207 | 9 | Tomáš Ballák | # mít na svém serveru dvě verze, jednu dostupnou všem a jednu jen pro vývoj ✓ |
208 | 17 | Jakub Vašta | # prozkoumat integrační testy v symfony ✓ |
209 | # -zjistit co všechno bude potřeba v before_script- |
||
210 | 9 | Tomáš Ballák | # nasadit nějaké nástroje na metriku kódu ✓ |
211 | 1 | Jakub Vašta | |
212 | <pre><code class="yaml"> |
||
213 | |||
214 | 5 | Jakub Vašta | # variables: |
215 | # IMAGE_NAME: zcu-campus-life-app:$CI_COMMIT_REF_NAME |
||
216 | 1 | Jakub Vašta | |
217 | stages: |
||
218 | - linter |
||
219 | - build |
||
220 | 17 | Jakub Vašta | - test |
221 | 5 | Jakub Vašta | - deploy |
222 | 17 | Jakub Vašta | |
223 | 5 | Jakub Vašta | php_linter: |
224 | 8 | Tomáš Ballák | stage: linter |
225 | tags: |
||
226 | 1 | Jakub Vašta | - linter |
227 | script: |
||
228 | 8 | Tomáš Ballák | - cd website |
229 | 1 | Jakub Vašta | - composer require --dev squizlabs/php_codesniffer |
230 | - ./vendor/bin/php-cs-fixer fix --dry-run --config .php_cs --stop-on-violation --using-cache=no |
||
231 | 17 | Jakub Vašta | |
232 | 1 | Jakub Vašta | build: |
233 | stage: build |
||
234 | tags: |
||
235 | - build |
||
236 | script: |
||
237 | # Test whether container can be build or not |
||
238 | 17 | Jakub Vašta | - ./scripts/build.sh |
239 | - docker-compose stop crawler nginx |
||
240 | 8 | Tomáš Ballák | # We could also push docker image to some registry or docker hub |
241 | 17 | Jakub Vašta | |
242 | tests: |
||
243 | stage: test |
||
244 | tags: |
||
245 | - test |
||
246 | script: |
||
247 | - cd website |
||
248 | - composer require --dev symfony/phpunit-bridge |
||
249 | - composer require --dev symfony/browser-kit symfony/css-selector |
||
250 | - docker-compose exec -T php-fpm /bin/sh -c "export APP_ENV=test && cd ../symfony && php bin/phpunit" |
||
251 | - docker stop $(docker ps -q) |
||
252 | 5 | Jakub Vašta | |
253 | deploy_prod: |
||
254 | 1 | Jakub Vašta | stage: deploy |
255 | 5 | Jakub Vašta | tags: |
256 | - deploy |
||
257 | variables: |
||
258 | 2 | Jakub Vašta | GIT_STRATEGY: none |
259 | 5 | Jakub Vašta | environment: |
260 | name: heatmap |
||
261 | url: https://heatmap.zcu.cz |
||
262 | script: |
||
263 | - 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" |
||
264 | 8 | Tomáš Ballák | only: |
265 | 1 | Jakub Vašta | - master |
266 | when: manual |
||
267 | 17 | Jakub Vašta | |
268 | 1 | Jakub Vašta | |
269 | </code></pre> |
||
270 | |||
271 | |||
272 | |||
273 | |||
274 | |||
275 | |||
276 | |||
277 | |||
278 |