Skip to content

Commit 2db45f5

Browse files
authored
Merge pull request #374 from leandroembu/feature/dokku-deploy
Feature/dokku deploy
2 parents e1e5626 + c8f8295 commit 2db45f5

6 files changed

Lines changed: 327 additions & 0 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,6 @@ php.ini
2424

2525
# vim bkp
2626
*.*~
27+
28+
# DDEV
29+
.ddev

Dockerfile

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
FROM php:8.3-apache
2+
3+
ENV DEBIAN_FRONTEND=noninteractive
4+
5+
RUN apt-get update && apt-get install -y \
6+
unixodbc \
7+
unixodbc-dev \
8+
freetds-dev \
9+
freetds-bin \
10+
tdsodbc \
11+
libsybdb5 \
12+
unzip \
13+
git \
14+
curl \
15+
libpng-dev \
16+
libjpeg-dev \
17+
libfreetype6-dev \
18+
libzip-dev \
19+
libonig-dev \
20+
libxml2-dev \
21+
&& rm -rf /var/lib/apt/lists/*
22+
23+
RUN docker-php-ext-configure gd --with-freetype --with-jpeg
24+
RUN docker-php-ext-install \
25+
pdo_mysql \
26+
pdo_dblib \
27+
gd \
28+
mbstring \
29+
zip \
30+
xml \
31+
bcmath \
32+
pcntl \
33+
opcache
34+
35+
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
36+
37+
RUN echo "[FreeTDS]" >> /etc/odbcinst.ini \
38+
&& echo "Description = FreeTDS Driver" >> /etc/odbcinst.ini \
39+
&& echo "Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so" >> /etc/odbcinst.ini \
40+
&& echo "Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so" >> /etc/odbcinst.ini
41+
42+
RUN a2enmod rewrite
43+
44+
COPY dokku-deploy/apache-php.conf /etc/apache2/conf-available/
45+
RUN a2enconf apache-php
46+
47+
RUN sed -ri -e 's!/var/www/html!/var/www/html/public!g' /etc/apache2/sites-available/*.conf \
48+
&& sed -ri -e 's!/var/www/!/var/www/html/public!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
49+
50+
WORKDIR /var/www/html
51+
52+
COPY composer.json composer.lock ./
53+
54+
RUN composer install --no-dev --optimize-autoloader --no-interaction --no-scripts
55+
56+
COPY . .
57+
58+
RUN mkdir -p storage/framework/cache storage/framework/sessions storage/framework/views storage/logs bootstrap/cache \
59+
&& chown -R www-data:www-data storage bootstrap/cache \
60+
&& chmod -R 775 storage bootstrap/cache
61+
62+
EXPOSE 80
63+
64+
CMD ["apache2-foreground"]

Procfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
release: dokku-deploy/release.sh
2+
web: apache2-foreground
3+
worker: php artisan queue:work --sleep=3 --tries=3 --timeout=60

docs/dokku-deploy.md

Lines changed: 242 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,242 @@
1+
# Deploy do Chamados com Dokku
2+
3+
## Instalação do Docker e do Dokku
4+
5+
```bash=
6+
wget -NP . https://dokku.com/install/v0.36.7/bootstrap.sh
7+
sudo DOKKU_TAG=v0.36.7 bash bootstrap.sh
8+
```
9+
10+
Adicione sua chave SSH pública ao dokku:
11+
12+
```bash=
13+
echo 'conteudo-da-sua-chave-publica' | sudo dokku ssh-keys:add admin
14+
```
15+
16+
## No servidor Dokku
17+
18+
### Criação e configuração do app
19+
20+
Variáveis de ambiente:
21+
22+
```bash=
23+
export ADMIN_EMAIL="leandro@if.usp.br"
24+
export APP_NAME="chamados"
25+
export APP_DOMAIN="$APP_NAME.if.usp.br"
26+
export MYSQL_NAME="mysql_$APP_NAME"
27+
```
28+
29+
Instalação dos plugins necessários:
30+
31+
```bash=
32+
sudo dokku plugin:install https://github.com/dokku/dokku-mysql.git --name mysql
33+
sudo dokku plugin:install https://github.com/dokku/dokku-maintenance.git
34+
sudo dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git
35+
```
36+
37+
Criação do app:
38+
39+
```bash=
40+
dokku apps:create $APP_NAME
41+
dokku checks:disable $APP_NAME
42+
dokku domains:set $APP_NAME $APP_DOMAIN
43+
dokku letsencrypt:set $APP_NAME email $ADMIN_EMAIL
44+
```
45+
46+
O Dokku faz o link do _service_ MySQL com a aplicação através da variável de ambiente **DATABASE_URL**. O Laravel já tem a variável no arquivo `config/database.php`. Sendo assim, só precisamos criar o banco de dados e fazer o link com a aplicação. No ".env" basta setar **DB_CONNECTION="mysql"**, os parâmetros da conexão já estarão na **DATABASE_URL**.
47+
48+
```bash=
49+
dokku mysql:create $MYSQL_NAME
50+
dokku mysql:link $MYSQL_NAME $APP_NAME
51+
```
52+
53+
Criação das variáveis de ambiente para reproduzir o `.env`:
54+
55+
```bash=
56+
dokku config:set --no-restart $APP_NAME \
57+
APP_NAME="Chamados" \
58+
APP_KEY="base64:$(openssl rand -base64 32)" \
59+
APP_ENV="production" \
60+
APP_DEBUG="false" \
61+
APP_URL="https://chamados.example.com" \
62+
UPLOAD_MAX_FILESIZE="16" \
63+
USAR_REPLICADO="true" \
64+
DB_CONNECTION="mysql" \
65+
MAIL_MAILER="smtp" \
66+
MAIL_HOST="smtp.example.com" \
67+
MAIL_PORT="587" \
68+
MAIL_ENCRYPTION="tls" \
69+
MAIL_USERNAME="johndoe" \
70+
MAIL_PASSWORD="senhaForte" \
71+
MAIL_FROM_ADDRESS="mensageiro@example.com" \
72+
MAIL_FROM_NAME="Sistema de Chamados" \
73+
USP_THEME_SKIN="if" \
74+
SENHAUNICA_KEY="if" \
75+
SENHAUNICA_SECRET="leveiocavaloparabeberaguanoacude" \
76+
SENHAUNICA_CALLBACK_ID="36" \
77+
SENHAUNICA_ADMINS="7654321,1234567" \
78+
SENHAUNICA_GERENTES="7654321,1234567" \
79+
SENHAUNICA_CODIGO_UNIDADE="43" \
80+
REPLICADO_HOST="replicado.usp.br" \
81+
REPLICADO_PORT="5000" \
82+
REPLICADO_DATABASE="replicado" \
83+
REPLICADO_USERNAME="replicante" \
84+
REPLICADO_PASSWORD="etnacilper" \
85+
REPLICADO_CODUNDCLG="43" \
86+
REPLICADO_CODUNDCLGS="43" \
87+
REPLICADO_SYBASE="true" \
88+
LARAVEL_TOOLS_FORCAR_HTTPS="true" \
89+
QUEUE_CONNECTION="database" \
90+
CHAMADO_CAMPOS_A_ESQUERDA=""
91+
```
92+
93+
### Volumes da aplicação
94+
95+
```bash=
96+
dokku storage:ensure-directory $APP_NAME
97+
dokku storage:mount $APP_NAME /var/lib/dokku/data/storage/$APP_NAME/storage:/var/www/html/storage
98+
dokku storage:mount $APP_NAME /var/lib/dokku/data/storage/$APP_NAME/bootstrap-cache:/var/www/html/bootstrap/cache
99+
```
100+
101+
## Na máquina de desenvolvimento
102+
103+
### Dockerfile
104+
105+
Arquivo `Dockerfile` na pasta raiz do projeto:
106+
107+
```Dockerfile=
108+
FROM php:8.3-apache
109+
110+
ENV DEBIAN_FRONTEND=noninteractive
111+
112+
RUN apt-get update && apt-get install -y \
113+
unixodbc \
114+
unixodbc-dev \
115+
freetds-dev \
116+
freetds-bin \
117+
tdsodbc \
118+
libsybdb5 \
119+
unzip \
120+
git \
121+
curl \
122+
libpng-dev \
123+
libjpeg-dev \
124+
libfreetype6-dev \
125+
libzip-dev \
126+
libonig-dev \
127+
libxml2-dev \
128+
&& rm -rf /var/lib/apt/lists/*
129+
130+
RUN docker-php-ext-configure gd --with-freetype --with-jpeg
131+
RUN docker-php-ext-install \
132+
pdo_mysql \
133+
pdo_dblib \
134+
gd \
135+
mbstring \
136+
zip \
137+
xml \
138+
bcmath \
139+
pcntl \
140+
opcache
141+
142+
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
143+
144+
RUN echo "[FreeTDS]" >> /etc/odbcinst.ini \
145+
&& echo "Description = FreeTDS Driver" >> /etc/odbcinst.ini \
146+
&& echo "Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so" >> /etc/odbcinst.ini \
147+
&& echo "Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so" >> /etc/odbcinst.ini
148+
149+
RUN a2enmod rewrite
150+
151+
COPY dokku-deploy/apache-php.conf /etc/apache2/conf-available/
152+
RUN a2enconf apache-php
153+
154+
RUN sed -ri -e 's!/var/www/html!/var/www/html/public!g' /etc/apache2/sites-available/*.conf \
155+
&& sed -ri -e 's!/var/www/!/var/www/html/public!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
156+
157+
WORKDIR /var/www/html
158+
159+
COPY composer.json composer.lock ./
160+
161+
RUN composer install --no-dev --optimize-autoloader --no-interaction --no-scripts
162+
163+
COPY . .
164+
165+
RUN mkdir -p storage/framework/cache storage/framework/sessions storage/framework/views storage/logs bootstrap/cache \
166+
&& chown -R www-data:www-data storage bootstrap/cache \
167+
&& chmod -R 775 storage bootstrap/cache
168+
169+
EXPOSE 80
170+
171+
CMD ["apache2-foreground"]
172+
```
173+
174+
### Configurações personalizadas do PHP
175+
176+
Arquivo `./dokku-deploy/apache-php.conf` na pasta raiz do projeto (opcional, mas fica para referência caso precisemos alterar as configs do PHP):
177+
178+
```ini=
179+
php_value upload_max_filesize 2M
180+
php_value post_max_size 2M
181+
php_value memory_limit 256M
182+
php_value max_execution_time 300
183+
php_value max_input_time 300
184+
php_value max_input_vars 1000
185+
php_value max_file_uploads 2
186+
```
187+
188+
### Arquivo de release
189+
190+
Arquivo `./dokku-deploy/release.sh`:
191+
192+
```bash=
193+
#!/bin/bash
194+
195+
mkdir -p storage/framework/cache storage/framework/sessions storage/framework/views storage/logs bootstrap/cache
196+
chown -R www-data:www-data storage bootstrap/cache
197+
chmod -R 775 storage bootstrap/cache
198+
199+
composer install --no-dev --optimize-autoloader --no-interaction --no-scripts
200+
php artisan migrate --force
201+
```
202+
203+
### Procfile
204+
205+
O arquivo `Procfile`, na raiz do projeto, tem as linhas de comando que o Dokku vai executar durante o deploy (após o build):
206+
207+
```=
208+
release: dokku-deploy/release.sh
209+
web: apache2-foreground
210+
worker: php artisan queue:work --sleep=3 --tries=3 --timeout=60
211+
```
212+
213+
### Criação do git remote e deploy
214+
215+
Configuração do _git remote_ para o deploy:
216+
217+
```bash=
218+
git remote add dokku dokku@dokku-server:chamados
219+
```
220+
221+
Deploy:
222+
223+
```bash=
224+
git push dokku <algum-branch>:main
225+
```
226+
227+
## Pós-deploy
228+
229+
Depois de subir a aplicação, entre no container e execute:
230+
231+
```bash=
232+
# Rodar o worker, que vai cuidar das filas de e-mails
233+
dokku ps:scale chamados worker=1
234+
235+
# Se souber o nome do container e quiser rodar só uma linha de comando:
236+
docker container exec datagrad.web.1 bash -c 'composer install --no-dev --optimize-autoloader && php artisan migrate --force'
237+
238+
# Outra opção, entrando no container
239+
dokku enter $APP_NAME
240+
composer install --no-dev --optimize-autoloader
241+
php artisan migrate
242+
```

dokku-deploy/apache-php.conf

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
php_value upload_max_filesize 2M
2+
php_value post_max_size 2M
3+
php_value memory_limit 256M
4+
php_value max_execution_time 300
5+
php_value max_input_time 300
6+
php_value max_input_vars 1000
7+
php_value max_file_uploads 2

dokku-deploy/release.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/bin/bash
2+
3+
mkdir -p storage/framework/cache storage/framework/sessions storage/framework/views storage/logs bootstrap/cache
4+
chown -R www-data:www-data storage bootstrap/cache
5+
chmod -R 775 storage bootstrap/cache
6+
7+
composer install --no-dev --optimize-autoloader --no-interaction --no-scripts
8+
php artisan migrate --force

0 commit comments

Comments
 (0)