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 |