Projekt

Obecné

Profil

Deployment » Historie » Verze 2

Jakub Vašta, 2020-03-31 20:14

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
               build: './build/php-fm'
140
               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
Poznámky: 
192
# mít na svém serveru dvě věrze, jednu dostupnou všem a jednu jen pro vývoj
193
# zjistit jak vlastně fungují testy v symfony a vytvořit nějaký jednoduchý na otestování
194
195
<pre><code class="yaml">
196
197
image: php:7.2-cli
198
199
variables:
200
    IMAGE_NAME: gitlab.kiv.zcu.cz:5000/aswi/aswi-2020/aswi2020sebela:$CI_COMMIT_REF_NAME
201
202
stages:
203
    - test
204
    - build
205
    - deploy
206
207
before_script:
208
    - some update stuff
209
    # Setup SSH deploy keys
210
    - - 'which ssh-agent || ( apt-get install -qq openssh-client )'
211
    - eval $(ssh-agent -s)
212
    - ssh-add <(echo "$SSH_PRIVATE_KEY")
213
    - mkdir -p ~/.ssh
214
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
215
216
test:
217
    stage: test
218
    tags:
219
        - test-stage
220
    script:
221
        - php ./phpunit symfony
222
    
223
224
build:
225
    stage: build
226
    tags:
227
        - build-stage
228
    script:
229
        - docker login -u $USER p $PASSWORD gitlab.kiv.zcu.cz:5000
230
        - docker-compose build $IMAGE_NAME .
231
        - docker-compose push $IMAGE_NAME
232
233
deploy_staging:
234
    stage: deploy
235
    tags:
236
        - docker-stage
237
# we could run two application first which is for developers and there will be no access for anyone else and second public
238
    script:
239
        - ssh root@example.com "docker login -u $USER p $PASSWORD gitlab.kiv.zcu.cz:5000 && docker-compose pull $IMAGE_NAME && docker-compose up"
240
    only:
241
        - master
242
243
        #   
244
deploy_prod:
245
    stage: deploy
246
    tags:
247
        - docker-prod
248
    environmnet:
249
        name: deploy
250
        url: http://whatever.zcu.cz
251
    script:
252
        - ssh root@example.com "docker login -u $USER p $PASSWORD gitlab.kiv.zcu.cz:5000 && docker-compose pull $IMAGE_NAME && docker-compose up"
253
    only:
254
        - master
255
    when: manual
256
257
</code></pre>
258
259 1 Jakub Vašta
260
261
262
263
264
265
266