Deployment » Historie » Verze 6
Jakub Vašta, 2020-04-03 14:25
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 | 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. |
196 | |||
197 | Gitlab-runner nainstalován na heatmap.zcu.cz |
||
198 | * https://gitlab.com/gitlab-org/gitlab-runner/issues/4449 |
||
199 | 6 | Jakub Vašta | * práva gitlab-runner změněna na root kvůli instalacím dalších balíčků z pipeline |
200 | 5 | Jakub Vašta | |
201 | *Zatím běží gitlab-runner na produkčním serveru heatmap.zcu.cz což není úplně dobré řešení*, bylo by vhodné mít oddělený server pro gitlab-runner. |
||
202 | |||
203 | 2 | Jakub Vašta | Poznámky: |
204 | 1 | Jakub Vašta | # mít na svém serveru dvě věrze, jednu dostupnou všem a jednu jen pro vývoj |
205 | 5 | Jakub Vašta | # prozkoumat integrační testy v symfony |
206 | 1 | Jakub Vašta | # zjistit co všechno bude potřeba v before_script |
207 | 5 | Jakub Vašta | # nasadit nějaké nástroje na metriku kódu |
208 | 1 | Jakub Vašta | |
209 | <pre><code class="yaml"> |
||
210 | |||
211 | 5 | Jakub Vašta | # variables: |
212 | # IMAGE_NAME: zcu-campus-life-app:$CI_COMMIT_REF_NAME |
||
213 | 1 | Jakub Vašta | |
214 | stages: |
||
215 | - test |
||
216 | - build |
||
217 | - deploy |
||
218 | |||
219 | 5 | Jakub Vašta | # Now the runner is on the same server as production environment - which is not good - so ssh is not needed |
220 | # before_script: |
||
221 | # - apt-get update -qq |
||
222 | # - apt-get install -qq git |
||
223 | # # Setup SSH deploy keys |
||
224 | # - 'which ssh-agent || ( apt-get install -qq openssh-client )' |
||
225 | # - eval $(ssh-agent -s) |
||
226 | # - ssh-add <(echo "$SSH_PRIVATE_KEY") |
||
227 | # - mkdir -p ~/.ssh |
||
228 | # - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config' |
||
229 | |||
230 | unit_tests: |
||
231 | image: php:7.2-alpine |
||
232 | 2 | Jakub Vašta | stage: test |
233 | script: |
||
234 | 5 | Jakub Vašta | - apk add composer |
235 | - cd website |
||
236 | - composer require --dev symfony/phpunit-bridge |
||
237 | - php bin/phpunit |
||
238 | 2 | Jakub Vašta | |
239 | build: |
||
240 | stage: build |
||
241 | tags: |
||
242 | 5 | Jakub Vašta | - build |
243 | 2 | Jakub Vašta | script: |
244 | 5 | Jakub Vašta | # Test whether container can be build or not |
245 | - docker-compose build |
||
246 | # We could also push docker image to some registry or docker hub |
||
247 | |||
248 | 2 | Jakub Vašta | deploy_prod: |
249 | stage: deploy |
||
250 | tags: |
||
251 | 5 | Jakub Vašta | - deploy |
252 | variables: |
||
253 | GIT_STRATEGY: none |
||
254 | environment: |
||
255 | name: heatmap |
||
256 | url: https://heatmap.zcu.cz |
||
257 | 2 | Jakub Vašta | script: |
258 | 5 | Jakub Vašta | # - ssh root@example.com "cd ~ && rm -rf aswi2020sebela && git clone https://gitlab.kiv.zcu.cz/aswi/aswi-2020/aswi2020sebela.git && cd aswi2020sebela && ./build.sh && exit" |
259 | - cd ~ |
||
260 | - rm -rf aswi2020sebela |
||
261 | - git clone https://gitlab.kiv.zcu.cz/aswi/aswi-2020/aswi2020sebela.git |
||
262 | - cd aswi2020sebela |
||
263 | - ./build.sh |
||
264 | 1 | Jakub Vašta | only: |
265 | - master |
||
266 | when: manual |
||
267 | |||
268 | </code></pre> |
||
269 | |||
270 | |||
271 | |||
272 | |||
273 | |||
274 | |||
275 | |||
276 | |||
277 |