Deploy Symfony

André Chaves
Code Maestro
Published in
6 min readApr 2, 2018

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:

create droplet

Ao clickar em create droplet vamos selecionar configuração da máquina:

seleção de configurações

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

create droplet

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:

IP da máquina

E acessá-lo via SSH pelo terminal:

primeiro acesso SSH

No primeiro acesso, é comum que sua máquina mostra uma mensagem de confirmação, basta digitar yes e prosseguir:

pedido de senha

Nesse momento, precisamos da senha que acessa o servidor em sí. Normalmente, essa senha é enviada por email pela empresa de servidores contratada:

Email com ip e senha

Basta copiar a senha disponibilizada e jogar no terminal:

Primeiro login

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

clone do projeto na pasta pública

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

composer install

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:

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:

not found ao acessar a url do sistema

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:

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:

criando o backup

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!

TikTok deployado!

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!

--

--

André Chaves
Code Maestro

Empreendedor, CTO, desenvolvedor e apaixonado por automação.