Skip to content

Como instalar o Laravel em um VPS com Debian

Para iniciar a instalação, você deve ter:

  • Um servidor com o sistema operacional Debian 11.
  • Acesso ao servidor com um usuário com permissões para instalar e atualizar pacotes.

Instalar o Apache

sh
apt-get install apache2 -y

Você pode verificar a instalação com o seguinte comando:

sh
apache2ctl -v

# resultado
Server version: Apache/2.4.48 (Debian)

Instalar o PHP e outras extensões necessárias

sh
apt-get install apt-transport-https gnupg2 ca-certificates -y

Em seguida, adicionamos o repositório necessário para instalar o PHP 8.0:

sh
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
sh
sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'

Então atualizamos o repositório e instalamos o PHP e outras extensões:

sh
apt-get update -y
sh
apt-get install libapache2-mod-php php php-common php-xml php-gd php8.0-opcache php-mbstring php-tokenizer php-json php-bcmath php-zip php-curl unzip curl php-mysql -y

Verificamos se o PHP foi instalado corretamente:

sh
php --version

# resultado
PHP 8.0.11 (cli) (built: Sep 23 2021 22:04:05) ( NTS )  
Copyright (c) The PHP Group
Zend Engine v4.0.11, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.11, Copyright (c), by Zend Technologies

Agora vamos editar o arquivo php.ini.

sh
nano /etc/php/8.0/apache2/php.ini

Removemos o ponto e vírgula das seguintes extensões para habilitá-las:

  • extension=pdo_mysql

Instalar o Composer

Agora vamos instalar o Composer para poder adicionar as dependências do Laravel.

sh
curl -sS https://getcomposer.org/installer | php

# resultado
All settings correct for using Composer
Downloading...

Composer (version 2.1.6) successfully installed to: /root/composer.phar
Use it: php composer.phar

Agora vamos mover o arquivo para os binários do sistema operacional para que possamos executá-lo diretamente:

sh
mv composer.phar /usr/local/bin/composer

Verificamos a instalação:

sh
composer --version

# resultado  
Composer version 2.1.6 2021-08-19 17:11:08

Instalar o MySQL/MariaDB

Vamos instalar o MariaDB como mecanismo de banco de dados. No terminal:

sh
apt install mariadb-server

# resultado
Reading package lists... Done 
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  galera-4 gawk libconfig-inifiles-perl libdbi-perl libmariadb3 libmpfr6 libsigsegv2 libsnappy1v5 mariadb-client-10.5 mariadb-client-core-10.5 mariadb-common
  ...

Podemos verificar a versão instalada com o seguinte comando:

sh
mariadb --version

# resultado
mariadb Ver 15.1 Distrib 10.5.11-MariaDB, for debian-linux-gnu (x86_64) using

Verificamos o status do serviço:

sh
systemctl status mariadb

# resultado
 mariadb.service - MariaDB 10.5.11 database server
     Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)         
     Active: active (running) since Tue 2021-08-17 23:38:11 CEST; 21min ago
       Docs: man:mariadbd(8)
             https://mariadb.com/kb/en/library/systemd/
     ...

Se por algum motivo o banco de dados não estiver em execução, inicie-o com o comando:

sh
systemctl start mariadb

Agora executamos o console do MariaDB como root para criar um novo usuário de banco de dados:

sh
mysql -u root -p 

# resultado  
password:
# Pressione ENTER, pois não definimos uma senha para o usuário root.

Criamos um novo usuário, neste caso o chamamos de codalas, pois será o usuário destinado a acessar o banco de dados do sistema.

sh
create user codalas@localhost identified by 'password';

Damos a ele todos os privilégios:

sh
GRANT ALL PRIVILEGES ON *.* TO 'codalas'@localhost IDENTIFIED BY 'password';

Atualizamos os privilégios do banco de dados:

sh
FLUSH PRIVILEGES;

Aviso

Para sistemas de produção, é recomendável conceder apenas os privilégios necessários.

Agora criamos o banco de dados que usaremos para o sistema:

sh
CREATE DATABASE laravel;

Criar um usuário não root para gerenciar a aplicação (se ainda não existir)

No console do sistema operacional, criaremos um usuário não root, por exemplo chamado codalas, usando o seguinte comando:

sh
adduser codalas

Preenchemos as informações solicitadas, como senha, nome, etc. O objetivo de criar um usuário não root é poder instalar as dependências do Laravel com segurança.

Instalar o Git (opcional)

Instalamos o Git dependendo do ambiente para poder clonar e manter o projeto atualizado com as alterações durante a fase de desenvolvimento.

Atualizamos o índice de pacotes do sistema operacional:

sh
sudo apt update

Instalamos o Git:

sh
sudo apt install git

Verificamos a instalação:

sh
git --version

# resultado
git version 2.30.2

Supondo que o projeto foi clonado para a pasta /var/www/html/, usaremos laravel como pasta de exemplo, vamos gerenciar as permissões das pastas:

Adicionamos o usuário não root ao grupo de usuários www-data do servidor. Isso é para poder executar comandos dentro do projeto sem interferir nas permissões de propriedade que o servidor precisa sobre as pastas vendor, storage e bootstrap.

sh
usermod -a -G www-data codalas

Em seguida, alteramos a propriedade de todos os arquivos na pasta do projeto para codalas com o grupo www-data:

sh
cd html
sh
chown -R codalas:www-data laravel

Atualizamos as permissões das pastas:

sh
chmod -R 775 laravel

Depois de concluir isso, podemos prosseguir para executar as demais funções com o usuário recém-criado. Isso pode ser fazendo login com o novo usuário ou a partir do usuário root, executando comandos em nome do usuário não root.

Como usuário root, podemos executar comandos em nome do usuário criado usando:

sh
sudo -u codalas bash

Isso iniciará um terminal como o usuário codalas.

Vamos criar o arquivo com as variáveis de ambiente:

Criamos um arquivo .env com as seguintes informações:

sh
APP_NAME="Laravel"
APP_ENV=local
APP_DEBUG=true
APP_URL=https://localhost  
APP_KEY=

LOG_CHANNEL=stack
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306  
DB_DATABASE=laravel
DB_USERNAME=codalas
DB_PASSWORD=password

MAIL_MAILER=smtp
MAIL_FROM_ADDRESS=  
MAIL_FROM_NAME=

MAIL_HOST=
MAIL_PORT=587
MAIL_ENCRYPTION=tls
MAIL_USERNAME=  
MAIL_PASSWORD=

BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DRIVER=local
QUEUE_CONNECTION=sync  
SESSION_DRIVER=file
SESSION_LIFETIME=120

Instalar as dependências do sistema

Executamos composer install para instalar as dependências do sistema.

sh
composer install

# resultado
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Package operations: 117 installs, 0 updates, 0 removals
  - Installing doctrine/inflector (2.0.3): Extracting archive    
  - Installing doctrine/lexer (1.2.1): Extracting archive
  - Installing symfony/polyfill-ctype (v1.23.0): Extracting archive
  - Installing webmozart/assert (1.10.0): Extracting archive
  - Installing dragonmantank/cron-expression (v3.1.0): Extracting archive
  - Installing symfony/polyfill-php80 (v1.23.1): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.23.1): Extracting archive    
  ...

Atualizar a configuração

Vamos atualizar o cache da aplicação:

sh
php artisan config:cache

# resultado
Configuration cache cleared!  
Configuration cached successfully!
sh
php artisan route:cache

# resultado
Route cache cleared!  
Routes cached successfully!
sh
php artisan view:cache

# resultado  
Compiled views cleared!
Blade templates cached successfully!

Migrações

Executamos as migrações para criar as tabelas no banco de dados:

sh
php artisan migrate

Configurar o Apache

Usando o usuário root, vamos criar uma configuração de virtual host para a aplicação.

Criamos um novo arquivo de configuração para o laravel:

sh
nano /etc/apache2/sites-available/laravel.conf

Modificamos o arquivo com o seguinte conteúdo:

sh
<VirtualHost *:80>
    ServerName http://localhost

    ServerAdmin example@example.com
    DocumentRoot /var/www/html/laravel/public

    <Directory /var/www/html/laravel>
      Options +Indexes +MultiViews
      AllowOverride None
      Require all granted
    </Directory>

    <Directory /var/www/html/laravel/public>
      Options +Indexes +MultiViews 
      AllowOverride None
      Require all granted

      <IfModule mod_rewrite.c>
          RewriteEngine On

          # Lidar com cabeçalho de autorização
          RewriteCond %{HTTP:Authorization} .
          RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

          # Redirecionar barras no final se não for uma pasta...
          RewriteCond %{REQUEST_FILENAME} !-d
          RewriteCond %{REQUEST_URI} (.+)/$
          RewriteRule ^ %1 [L,R=301]

          # Enviar solicitações para o controlador frontal...  
          RewriteCond %{REQUEST_FILENAME} !-d
          RewriteCond %{REQUEST_FILENAME} !-f
          RewriteRule ^ index.php [L]
      </IfModule>
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined  
</VirtualHost>

Dica

Atualize as propriedades ServerName, ServerAdmin, DocumentRoot e Directory de acordo com a configuração do servidor.

Verificamos se a configuração está correta:

sh
apachectl configtest

# resultado
Syntax OK

Habilitamos o virtual host criado e o módulo rewrite:

sh
a2enmod rewrite
sh
a2ensite laravel.conf

Dica

O console indicará que você deve reiniciar o servidor após cada comando para que ele tenha efeito. Você pode reiniciar o servidor após executar ambos.

Reiniciamos o servidor:

sh
systemctl restart apache2

Configurar o firewall

Por padrão, o servidor tem apenas a porta 22 aberta, que é usada para conexão SSH. Como a aplicação é executada na porta 80, precisamos abri-la para que a aplicação seja acessível externamente.

Verificamos o status do firewall:

sh
ufw status

# resultado   
Status: active

To                         Action      From 
--                         ------      ----
22                         ALLOW       Anywhere

Habilitamos a porta 80:

sh
ufw allow 80

Se verificarmos o status novamente, a nova porta deve ser mostrada:

sh
ufw status

# Resultado
Status: active

To                         Action      From
--                         ------      ----  
22                         ALLOW       Anywhere
80                         ALLOW       Anywhere
80 (v6)                    ALLOW       Anywhere (v6)

Etapas finais

Em seguida, execute os seguintes comandos na raiz do projeto para atualizar as permissões das pastas.

sh
sudo chown -R codalas:www-data storage

sudo chmod 775 -R storage

Geramos o identificador único usado para gerar tokens de autenticação.

sh
php artisan key:generate

Atualizamos a configuração da aplicação.

sh
php artisan config:cache

# resultado
Configuration cache cleared!  
Configuration cached successfully!
sh
php artisan route:cache

# resultado  
Route cache cleared!
Routes cached successfully!
sh
php artisan view:cache

# resultado   
Compiled views cleared!
Blade templates cached successfully!

Acessamos o endereço do servidor na porta 80, seja por IP ou se ele tiver uma URL atribuída. Exemplo http://localhost