Resolvi fazer meu portfólio usando Laravel 7. Para que a página principal fosse uma landing page, e todas as informações nela contidas pudessem ser alteradas através do painel de administração. Não é esse o ponto. Chegou à implantação. Encontrei alguns bons tutoriais sobre como fazer isso em um servidor completo com todos os problemas. Não sou muito forte em implantação; geralmente sou mais front do que full stack. E, se ainda consigo escrever e testar em PHP, antes de gerenciar o servidor, etc. Eu ainda não cresci. Mas eu tive que descobrir.
Agora passaremos por todas as etapas, começando com o lançamento via SSH e terminando com o site de trabalho. Tentaremos evitar todas as armadilhas.
Você pode encontrar instruções semelhantes online. Afinal, finalmente encontrei. É verdade, não em um só lugar, não sem a ajuda do StackOverflow e dificilmente em russo. Eu sofri. Por isso decidi simplificar sua vida.
Faremos tudo com uma gota no DigitalOcean. Isso, claro, não é necessário, escolha qualquer hospedagem. Quando você chegar a um servidor em funcionamento no Ubuntu, volte. Para quem ainda decidir fazer na DigitalOcean, haverá mais dicas sobre como configurar um domínio. E
Todas as etapas específicas da DigitalOcean serão fornecidas em notas de rodapé como estas.
Vamos começar.
TL;DR (somente comandos básicos)
Crie um usuário
ssh root@[IP-адрес вашего дроплета]
adduser laravel
usermod -aG sudo laravel
su laravel
Adicione SSH a ele
mkdir ~/.ssh
chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys
- Insira a chave pública
chmod 600 ~/.ssh/authorized_keys
Firewall
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status
nginx
sudo apt update
sudo apt install -y nginx
sudo ufw allow 'Nginx HTTP'
sudo ufw status
MySQL
sudo apt install -y mysql-server
sudo mysql_secure_installation
,NYNNY
sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';
SELECT user,authentication_string,plugin,host FROM mysql.user;
FLUSH PRIVILEGES;
exit
PHP
-
sudo apt update
-
sudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-https
-
sudo apt-add-repository ppa:ondrej/php
-
sudo apt update
-
7.3:
sudo apt install -y php7.3-fpm php7.3-mysql
-
7.4:
sudo apt install -y php7.4-fpm php7.4-mysql
-
sudo vim /etc/nginx/sites-available/<Ваш домен>
Configuração básica:
server {
listen 80;
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
server_name <Ваш домен или IP>;
location / {
try_files $uri $uri/ =404;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
location ~ /.ht {
deny all;
}
}
Apenas configuração HTTP para Laravel:
server {
listen 80;
listen [::]:80;
root /var/www/html/<Имя проекта>/public;
index index.php index.html index.htm index.nginx-debian.html;
server_name <Ваш домен или IP>;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
location ~ /.ht {
deny all;
}
}
Configuração HTTPS para Laravel:
server {
listen 80;
listen [::]:80;
server_name <Ваш домен> www.<Ваш домен>;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name <Ваш домен> www.<Ваш домен>;
root /var/www/html/<Имя проекта>/public;
ssl_certificate /etc/letsencrypt/live/<Ваш домен>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<Ваш домен>/privkey.pem;
ssl_protocols TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_prefer_server_ciphers on;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.php index.html index.htm index.nginx-debian.html;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
location ~ /.ht {
deny all;
}
location ~ /.well-known {
allow all;
}
}
sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
sudo unlink /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
Laravel
-
7.3:
sudo apt install -y php7.3-mbstring php7.3-xml composer unzip
-
7.4:
sudo apt install -y php7.4-mbstring php7.4-xml composer unzip
-
mysql -u root -p
-
CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
-
GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>';
-
FLUSH PRIVILEGES;
-
exit
-
cd /var/www/html
-
sudo mkdir -p <Имя проекта>
-
sudo chown laravel:laravel <Имя проекта>
-
cd ./<Имя проекта>
-
git clone <ссылка на проект> .
/git clone -b <имя ветки> --single-branch <ссылка на проект> .
-
composer install
-
vim .env
APP_NAME=Laravel
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=http://<Ваш домен>
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=<Ваш пароль от MySQL>
-
php artisan migrate
-
php artisan key:generate
-
sudo chown -R $USER:www-data storage
-
sudo chown -R $USER:www-data bootstrap/cache
-
chmod -R 775 storage
-
chmod -R 775 bootstrap/cache
HTTPS
-
sudo add-apt-repository ppa:certbot/certbot
-
sudo apt install -y python-certbot-nginx
-
sudo certbot certonly --webroot --webroot-path=/var/www/html/<Имя проекта>/public -d <Ваш домен> -d www.<Ваш домен>
-
sudo nginx -t
-
sudo ufw allow 'Nginx HTTPS'
-
sudo ufw status
-
sudo systemctl reload nginx
Crie um droplet na DigitalOcean e registre uma nova chave SSH
Eu realmente acredito que você mesmo descobrirá como se registrar na DigitalOcean. Não é fácil, com muitas verificações e outras coisas. Se você receber constantemente um erro de rede ao verificar documentos, tente fazer tudo por meio de uma VPN, isso deve ajudar.
No menu superior, clique em Crie->Gotitas. Escolher Ubuntu.
Assim que você se registrar, você receberá $ 100 em sua conta. Mas não se deixe enganar. Você só tem 60 dias para gastá-lo. E isso é muito pouco. Você pode, como eu, querer usar um plano mais caro, para que mais tarde, quando o dinheiro real começar a fluir, você possa mudar para um mais barato. Direi imediatamente que não vai funcionar. Você pode aumentá-lo, mas não pode diminuí-lo. Assim vai. eu escolho Padrão->$5.
Eu escolho a região mais próxima de nós Frankfurt. Rede VPC->padrão-fra1
Realizaremos imediatamente a autenticação via SSH. Clique Nova Chave SSH. Se você não possui SSH, há instruções muito simples à direita. Abra um terminal bash e cole
ssh-keygen
. Então vamos para o arquivo com a chave pública/Users/<Ваше имя пользователя>/.ssh/id_rsa.pub
(ou simplesmentecat ~/.ssh/id_rsa.pub
), copie o conteúdo e cole na janela à esquerda. Qualquer nome.Criamos um nome de host para o droplet.
Clique aqui Criar gota
Criar um novo usuário
ssh root@[IP-адрес вашего дроплета]
- Tem certeza de que deseja continuar se conectando (sim/não/[impressão digital])?
yes
- Digite sua senha SSH
- Crie um usuário laravel:
adduser laravel
- Digite sua senha e outras informações (só insiro o nome completo)
- Adicione o usuário ao grupo sudo:
usermod -aG sudo laravel
SSH para novo usuário
- Mude para o novo usuário:
su laravel
Realizamos todas as ações posteriormente, até o final do artigo, em nome do usuário laravel. Portanto, se você for interrompido repentinamente, faça login novamente e digite su laravel
mkdir ~/.ssh
chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys
Abrimos o arquivo no Vim. Se você não está familiarizado com isso, você pode trabalhar no Nano, seu direito.
Os comandos mais básicos do Vim
Para usar o editor Vim ao longo do artigo, você só precisa saber o seguinte.
- O Vim possui diferentes modos: Modo normal, no qual você insere comandos e seleciona modos e outros.
- Para sair de qualquer modo e retornar ao modo normal, basta pressionar
Esc
- Mova-se: você pode apenas usar as setas
- Sair sem salvar
<Normal mode>
::q!
- Sair e salvar
<Normal mode>
::wq
- Mudar para o modo de entrada de texto
<Normal mode>
:i
(do inglês. inserir)
- Inserimos nossa chave pública (o que fizemos acima)
- Protegemos contra mudanças:
chmod 600 ~/.ssh/authorized_keys
Instalando um firewall
- Vejamos todas as configurações disponíveis:
sudo ufw app list
- Permitir OpenSSH (caso contrário, ele nos bloqueará):
sudo ufw allow OpenSSH
- Vamos iniciar o firewall:
sudo ufw enable
,y
- Verificamos:
sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Está tudo bem.
Instalando o Nginx
Durante a instalação, às vezes será perguntado "Tem certeza?" Responder y
(bem, só se você tiver certeza).
sudo apt update
sudo apt install nginx
Adicionando Nginx às configurações do firewall
sudo ufw app list
sudo ufw allow 'Nginx HTTP'
sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
Vá para o seu IP. Se tudo correr bem, você deverá ver o seguinte.
Instalando MySQL
sudo apt install mysql-server
- Iniciando um script de proteção automática
sudo mysql_secure_installation
Responda às perguntas feitas. Se você não sabe o que responder, aqui estão algumas opções sugeridas:
-
Plug-in de validação de senha -
N
-
Remover usuários anônimos? -
Y
-
Proibir login root remotamente? -
N
-
Remover banco de dados de teste e acesso a ele? -
N
-
Recarregar tabelas de privilégios agora? -
Y
-
Vamos para o MySQL:
sudo mysql
-
Vejamos os métodos de acesso:
SELECT user,authentication_string,plugin,host FROM mysql.user;
-
Defina uma senha para root:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';
-
Vejamos os métodos de acesso novamente:
SELECT user,authentication_string,plugin,host FROM mysql.user;
-
Aplique as alterações e saia do MySQL:
FLUSH PRIVILEGES;
иexit
-
Agora, para entrar no MySQL você precisa usar
mysql -u root -p
e digite a senha
Instalando PHP
Vamos usar um repositório de terceiros de
sudo apt update
sudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-https
sudo apt-add-repository ppa:ondrej/php
sudo apt update
Agora vamos escolher. Para Laravel 7, você pode escolher PHP 7.3 ou 7.4. A única diferença estará nos números 3 e 4.
- 7.3:
sudo apt install -y php7.3-fpm php7.3-mysql
- 7.4:
sudo apt install -y php7.4-fpm php7.4-mysql
PHP FastCGI Process Manager (fpm) funciona com solicitações PHP. mysql, claro, para trabalhar com MySQL.
De agora em diante farei tudo no 7.4.
Configurando o Nginx
sudo vim /etc/nginx/sites-available/<Ваш домен>
Em vez de "<Seu domínio>" insira o domínio (por exemplo, mysite.ru
) que você deseja usar no futuro. Se você ainda não tem um, escreva um e repita as etapas deste capítulo para o seu domínio ao selecioná-lo.
Digite o seguinte:
server {
listen 80;
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
server_name <Ваш домен или IP>;
location / {
try_files $uri $uri/ =404;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
location ~ /.ht {
deny all;
}
}
Se você escolheu a versão 7.3 php7.4-fpm.sock
escrever em php7.4-fpm.sock
.
Ouça a porta 80 ligada server_name
quando chegamos à solicitação root /var/www/html
pegue o arquivo de índice. Se depois server_name
Há algo, estamos procurando esse arquivo. Se não encontrarmos, jogamos fora 404. Se terminar com .php
, percorrer fpm
. Se houver .ht
, proibir (403).
- Fazendo um link de
sites-available
вsites-enabled
:sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
- Removendo o link para
default
:sudo unlink /etc/nginx/sites-enabled/default
- Verificando erros:
sudo nginx -t
- Reinício:
sudo systemctl reload nginx
Verificando o trabalho:
sudo vim /var/www/html/info.php
- Nós escrevemos:
<?php phpinfo();
- Seguir em frente
<Ваш IP>/info.php
Você deverá ver algo assim:
Agora este arquivo pode ser excluído: sudo rm /var/www/html/info.php
Instale o Laravel
-
7.3:
sudo apt install php7.3-mbstring php7.3-xml composer unzip
-
7.4:
sudo apt install php7.4-mbstring php7.4-xml composer unzip
-
Vamos para o MySQL:
mysql -u root -p
-
Crie um banco de dados com o nome laravel:
CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
-
Fornecemos acesso root para laravel:
GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>';
-
FLUSH PRIVILEGES;
-
exit
-
cd /var/www/html
-
Crie uma pasta para o projeto:
sudo mkdir -p <Имя проекта>
-
Fornecemos ao usuário laravel direitos sobre o projeto:
sudo chown laravel:laravel <Имя проекта>
Em seguida, você precisa transferir o projeto. Por exemplo, clonagem do Github.
cd ./<Имя проекта>
git clone <ссылка на проект> .
Vale a pena considerar que se você não salvou arquivos estáticos (por exemplo, de /public
) no Github, então naturalmente você não os terá. Por exemplo, criei um tópico separado para resolver isso deploy
, do qual já clonei: git clone -b <имя ветки> --single-branch <ссылка на проект> .
.
- Instalando dependências:
composer install
- Crie .env:
vim .env
A versão básica é assim:
APP_NAME=Laravel
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=http://<Ваш домен>
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=<Ваш пароль от MySQL>
Se você copiar seu .env, substitua APP_ENV por produção, APP_DEBUG por false e insira as configurações corretas para MySQL.
- Migrando o banco de dados:
php artisan migrate
- Gerando o código:
php artisan key:generate
Alterando permissões:
sudo chown -R $USER:www-data storage
sudo chown -R $USER:www-data bootstrap/cache
chmod -R 775 storage
chmod -R 775 bootstrap/cache
A última coisa que resta é reconfigurar o Nginx para Laravel:
sudo vim /etc/nginx/sites-available/<Ваш домен>
server {
listen 80;
listen [::]:80;
root /var/www/html/<Имя проекта>/public;
index index.php index.html index.htm index.nginx-debian.html;
server_name <Ваш домен или IP>;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
location ~ /.ht {
deny all;
}
}
Como da última vez, se você escolheu a versão 7.3 php7.4-fpm.sock
escrever em php7.4-fpm.sock
.
Configurando um domínio na DigitalOcean
Na verdade, tudo é muito simples. Você compra um domínio (em qualquer lugar), muda para DigitalOcean em Crie->Domínios/DNS... Em campo Adicione um domínio você insere este domínio e clica em adicionar. Em seguida, vá para as configurações do domínio e para o campo NOME DE ANFITRIÃO digitar @. Selecione um projeto e clique Criar registro.
Agora vá ao site onde comprou o domínio, encontre lá “Servidores DNS” (ou algo semelhante) e entre nos servidores DigitalOcean (nomeadamentens1.digitalocean.com
,ns2.digitalocean.com
,ns3.digitalocean.com
). Agora é preciso esperar um pouco (ou muito) até que essas configurações sejam aceitas. Preparar!
O único problema é que seu site abrirá apenas como HTTP. Para ter HTTPS, passe para a próxima parte.
Configurando HTTPS
Instale o certbot e passe o nome de domínio (formato mysite.ru
) e nome de domínio com www (www.mysite.ru
).
sudo add-apt-repository ppa:certbot/certbot
sudo apt install python-certbot-nginx
sudo certbot certonly --webroot --webroot-path=/var/www/html/<Имя проекта>/public -d <Ваш домен> -d www.<Ваш домен>
Agora você precisa reconfigurar o Nginx (não se esqueça de substituir seus valores):
server {
listen 80;
listen [::]:80;
server_name <Ваш домен> www.<Ваш домен>;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name <Ваш домен> www.<Ваш домен>;
root /var/www/html/<Имя проекта>/public;
ssl_certificate /etc/letsencrypt/live/<Ваш домен>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<Ваш домен>/privkey.pem;
ssl_protocols TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_prefer_server_ciphers on;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.php index.html index.htm index.nginx-debian.html;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
location ~ /.ht {
deny all;
}
location ~ /.well-known {
allow all;
}
}
Acho que você já entendeu o que precisa ser mudado no PHP 7.3.
Aqui, na verdade, tudo é simples. Simplesmente redirecionamos todas as solicitações de HTTP (porta 80) para HTTPS (porta 443). E aí fazemos tudo igual a antes, mas com criptografia.
Resta definir as permissões no firewall:
sudo nginx -t
sudo ufw app list
sudo ufw allow 'Nginx HTTPS'
sudo ufw status
sudo systemctl reload nginx
Agora tudo deve funcionar como deveria.
[Avançado] Instalando Node.js
Se de repente você precisar executar comandos npm diretamente no servidor, será necessário instalar o Node.js.
sudo apt update
sudo apt install -y nodejs npm
nodejs -v
É isso, parei nesta fase. Em princípio, estou satisfeito com o resultado. Talvez eu mude do DigitalOcean para algum lugar mais próximo da Rússia e mais barato. Mas como já passei por todas as rodadas de verificação do site e fiz tudo lá, mostrei pelo exemplo. Além disso, os US$ 100 iniciais são um excelente trampolim para o treinamento.
PS Agradecimento especial ao autor
PPS Se acontecer de você ser um engenheiro de ponta que pensa em comandos bash, por favor, não julgue severamente. Você pode achar que este artigo é de baixo nível, mas eu ficaria feliz em encontrar um quando precisasse. Se houver sugestões de melhoria, sou totalmente a favor.
Fonte: habr.com