Deploy Symfony
Após muito trabalho árduo desenvolvendo uma aplicação com o código bem organizado no back-end e no front-end seguindo boas práticas e padrões de projeto precisamos deixar essa aplicação disponível para que as pessoas possam usar!
Para isso, precisaremos configurar um servidor.
Escolhendo o servidor
A abordagem mais comum para escolha de servidores é sempre: custo x benefício (assim como qualquer outra aquisição).
Nesse ponto temos diversas abordagens e normalmente os servidores gratuitos chamam bastante atenção.
Entretanto, servidores gratuitos costumam ter bastante restrições na infraestrutura como restrição no envio de e-mails com o bloqueio das portas FTP.
Portanto, se seu projeto depende de uma base mais robusta, a melhor ideia é sempre ir pra um servidor pago mesmo. Nesse ponto, temos diversas opções e gigantes do mercado como Amazon e Digital Ocean que trabalham bem com servidores e o respectivo suporte.
Mãos na massa
Nesse post, vou utilizar a Digital Ocean como exemplo. Mas qualquer serviço desse tipo resolve =)
A primeira coisa que precisamos fazer é, definitivamente, criar a máquina, que no nosso caso se chama droplet:
Ao clickar em create droplet vamos selecionar configuração da máquina:
Aqui vale a pena considerar o tamanho do sistema. No nosso caso, vamos fazer deploy do sistema TikTok® que é apenas os cruds de Funcionario, HoraLancada e Projeto.
Mas, no caso de sistemas maiores vale a pena pensar em uma máquina mais robusta.
Após selecionar todas as configurações, basta clickar no botão no final da página
Criando o projeto no servidor
Agora que temos nossa máquina criada, precisaremos acessá-la pelo terminal ou por FTP para jogar todos os arquivos do nossos projeto lá dentro!
O processo por FTP pode parecer mais simples por ser mais visual. Entretanto, trabalhar pelo terminar costuma ser muito menos traumático pois temos a liberdade de executar qualquer comando na máquina. O que vai se provar muito util no processo.
Acessando o servidor pelo terminal
Tendo tudo criado, basta copiar o IP da sua máquina:
E acessá-lo via SSH pelo terminal:
No primeiro acesso, é comum que sua máquina mostra uma mensagem de confirmação, basta digitar yes e prosseguir:
Nesse momento, precisamos da senha que acessa o servidor em sí. Normalmente, essa senha é enviada por email pela empresa de servidores contratada:
Basta copiar a senha disponibilizada e jogar no terminal:
No caso da Digital Ocean, o primeiro login já dispara o processo de troca de senha. Pedindo a senha atual e seguindo para a nova senha e confirmação:
Com isso, já estamos dentro do servidor =)
Preparando as dependências
Nesse momento, nosso servidor existe, está de pé, mas é uma máquina vazia. Não temos o PHP instalado, nem o Apache!
Configurando o sistema operacional
Como estamos em um sistema Ubuntu, é bem tranquilo instalar todas as dependências. Basta executar o comando:
sudo apt-get install -y python-software-properties
sudo add-apt-repository -y ppa:ondrej/php
sudo apt-get update -y
sudo apt-get install git php7.2 php-cli php-curl acl mysql-server php-mysql libapache2-mod-php7.2 php-xml
Com isso, já temos o PHP com as bibliotecas mais importantes além do Mysql e o Apache!
Além do apache, mysql, etc uma dependência essencial para qualquer aplicação Symfony é o composer.
Para instalar o composer basta executar o comando:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
Clonando o repositório
Agora que o ambiente está configurado, podemos copiar os arquivos do nosso projeto para a pasta publica do servidor /var/www:
cd /var/www
git clone https://github.com/andrechavesg/tiktok.git
Navegando para a pasta do projeto temos:
Parece estar tudo lá, certo? Errado! Ainda faltam todas as dependências do projeto que adicionamos ao longo do desenvolvimento!
Para instalar todas de uma vez basta executar o comando composer install, o comando pode levar um tempo até instalar todas as dependências do projeto
Aqui, já é um bom momento para criarmos, também, o banco de dados da aplicação com o comando php bin/console doctrine:database:create:
Também podemos criar as tabelas com o comando php bin/console doctrine:schema:create:
O ideal é sempre trabalhar com migrations, mas, no nosso caso o comando resolve bem o problema.
Arrumando as permissões
Agora que temos tudo instalado nosso sistema está pronto para rodar, certo?
Mas, se acessarmos a pasta do projeto dentro do servidor apache temos:
Isso porque não liberamos a permissão das pastas publicas para serem acessadas por fora do servidor!
Para isso, podemos usar o comando setfacl:
sudo setfacl -R -m u:www-data:rX /var/www/tiktoksudo setfacl -R -m u:www-data:rwX /var/www/tiktok/var/log/ /var/www/tiktok/var/cache/sudo setfacl -dR -m u:www-data:rwX /var/www/tiktok/var/log/ /var/www/tiktok/var/cache/
Com isso, já temos as pastas acessíveis. Mas, se atualizarmos a página, ainda não temos acesso à aplicação
Configurando o apache
Agora que temos todas as permissões corretas, basta configurarmos o apache para apontar diretamente pra nossa aplicação.
Para isso, precisaremos sobrescrever a configuração padrão do servidor apache, disponível no diretório /etc/apache2/sites-available:
Nosso arquivo é o 000-default.conf, que vem com as configurações padrões do apache. Para garantir, é sempre bom deixar um backup desse arquivo:
E, finalmente, vamos editar com o comando sudo nano /etc/apache2/sites-available/000-default.conf, e colar dentro desse arquivo nossas regras:
<VirtualHost *:80>DocumentRoot /var/www/tiktok/public<Directory /var/www/tiktok/public>AllowOverride NoneOrder Allow,DenyAllow from All<IfModule mod_rewrite.c>Options -MultiViewsRewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php [QSA,L]</IfModule></Directory>ErrorLog /var/log/apache2/symfony_error.logCustomLog /var/log/apache2/symfony_access.log combined</VirtualHost>
Aqui, estamos dizendo pro apache que a raiz não é mais /var/www/html como o padrão define. Mas, sim, /var/www/tiktok/public e que o arquivo padrão será o index..php ao invés do index.html.
A única mudança necessária de um projeto para o outro são justamente os nomes marcados em negrito =)
Após alterar e salvar o arquivo, é interessante que a gente reinicie o serviço do apache para que as alterações sejam aplicadas:
sudo service apache2 restart
E, com isso, já temos nosso sistema funcionando!
Proximos passos
O processo de deploy de toda aplicação feita em Symfony 4 sempre será muito parecido com o que vimos nesse post.
Aqui, a gente usou a Digital Ocean como exemplo de servidor SSH, mas ainda sim, estamos trabalhando com um servidor pago.
Muitas vezes a opção gratuita é essencial e por isso, no próximo post, vamos fazer o mesmo deploy na Heroku, um servidor bem famoso na comunidade que suporta bem aplicações PHP no geral =)
E ai, o que vocês acharam do processo de deploy do Symfony 4? Conhecem algum outro jeito? Compartilha aqui com a gente nos comentários!