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.

Se você precisa de uma VPS para este setup em Laravel, eu usoVultr.Link patrocinado. Novos clientes elegíveis podem receber até US$ 300 em crédito promocional.

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