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
apt-get install apache2 -y
Você pode verificar a instalação com o seguinte comando:
apache2ctl -v
# resultado
Server version: Apache/2.4.48 (Debian)
Instalar o PHP e outras extensões necessárias
apt-get install apt-transport-https gnupg2 ca-certificates -y
Em seguida, adicionamos o repositório necessário para instalar o PHP 8.0:
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
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:
apt-get update -y
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:
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
.
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.
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:
mv composer.phar /usr/local/bin/composer
Verificamos a instalação:
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:
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:
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:
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:
systemctl start mariadb
Agora executamos o console do MariaDB como root
para criar um novo usuário de banco de dados:
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.
create user codalas@localhost identified by 'password';
Damos a ele todos os privilégios:
GRANT ALL PRIVILEGES ON *.* TO 'codalas'@localhost IDENTIFIED BY 'password';
Atualizamos os privilégios do banco de dados:
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:
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:
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:
sudo apt update
Instalamos o Git:
sudo apt install git
Verificamos a instalação:
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
.
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
:
cd html
chown -R codalas:www-data laravel
Atualizamos as permissões das pastas:
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:
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:
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.
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:
php artisan config:cache
# resultado
Configuration cache cleared!
Configuration cached successfully!
php artisan route:cache
# resultado
Route cache cleared!
Routes cached successfully!
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:
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
:
nano /etc/apache2/sites-available/laravel.conf
Modificamos o arquivo com o seguinte conteúdo:
<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:
apachectl configtest
# resultado
Syntax OK
Habilitamos o virtual host criado e o módulo rewrite:
a2enmod rewrite
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:
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:
ufw status
# resultado
Status: active
To Action From
-- ------ ----
22 ALLOW Anywhere
Habilitamos a porta 80:
ufw allow 80
Se verificarmos o status novamente, a nova porta deve ser mostrada:
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.
sudo chown -R codalas:www-data storage
sudo chmod 775 -R storage
Geramos o identificador único usado para gerar tokens de autenticação.
php artisan key:generate
Atualizamos a configuração da aplicação.
php artisan config:cache
# resultado
Configuration cache cleared!
Configuration cached successfully!
php artisan route:cache
# resultado
Route cache cleared!
Routes cached successfully!
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