
Rozhodl jsem se vytvořit své portfolio na Laravel 7. Hlavní stránka by měla být landing page, kde lze všechny informace měnit pomocí administrace. Není to podstatné. Dospěl jsem k nasazení. Našel jsem několik dobrých tutoriálů, jak to udělat na plnohodnotném serveru se všemi komplikacemi. V oblasti nasazení nemám moc zkušeností, více se orientuji ve front-endu než v fullstacku. A zatímco psát a testovat v PHP ještě zvládnu, s řízením serveru a podobně jsem se ještě nedostal. Ale musel jsem se do toho pustit.
Teď projdeme všemi kroky, od spuštění přes SSH až po funkční web. Pokusíme se obejít všechny nástrahy.
Možná najdete podobné instrukce na internetu. Koneckonců, já jsem je nakonec našel. A to ne na jednom místě, nebylo to bez pomoci StackOverflow a pravděpodobně ne v ruštině. Potrápil jsem se. Proto jsem se rozhodl vám usnadnit život.
Vše budeme dělat s dropletem na DigitalOcean. To samozřejmě není nutné, vyberte si jakýkoli hosting. Až se dostanete k funkčnímu serveru na Ubuntu, vraťte se. Pro ty, kteří se přece jen rozhodli pro DigitalOcean, budou další rady ohledně nastavení domény. A také .
Všechny specifické kroky pro DigitalOcean budou uvedeny v podobných poznámkách.
Začněme.
TL;DR (pouze základní příkazy)
Vytváříme uživatele
ssh root@[IP-adresa vašeho dropletu]adduser laravelusermod -aG sudo laravelsu laravel
Přidáváme mu SSH
mkdir ~/.sshchmod 700 ~/.sshvim ~/.ssh/authorized_keys- Vkládáme veřejný klíč
chmod 600 ~/.ssh/authorized_keys
Firewall
sudo ufw allow OpenSSHsudo ufw enablesudo ufw status
Nginx
sudo apt updatesudo apt install -y nginxsudo ufw allow 'Nginx HTTP'sudo ufw status
MySQL
sudo apt install -y mysql-serversudo mysql_secure_installation,NYNNYsudo mysqlALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';SELECT user,authentication_string,plugin,host FROM mysql.user;FLUSH PRIVILEGES;exit
PHP
sudo apt updatesudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-httpssudo apt-add-repository ppa:ondrej/phpsudo apt update7.3:
sudo apt install -y php7.3-fpm php7.3-mysql7.4:
sudo apt install -y php7.4-fpm php7.4-mysqlsudo vim /etc/nginx/sites-available/
Základní nastavení:
server {
listen 80;
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
server_name ;
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;
}
}Pouze HTTP nastavení pro Laravel:
server {
listen 80;
listen [::]:80;
root /var/www/html//public;
index index.php index.html index.htm index.nginx-debian.html;
server_name ;
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;
}
}Nastavení HTTPS pro 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:ECDHE-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/defaultsudo nginx -tsudo systemctl reload nginx
Laravel
7.3:
sudo apt install -y php7.3-mbstring php7.3-xml composer unzip7.4:
sudo apt install -y php7.4-mbstring php7.4-xml composer unzipmysql -u root -pCREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '';FLUSH PRIVILEGES;exitcd /var/www/htmlsudo mkdir -psudo chown laravel:laravelcd ./git clone ./git clone -b --single-branch .composer installvim .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=php artisan migratephp artisan key:generatesudo chown -R $USER:www-data storagesudo chown -R $USER:www-data bootstrap/cachechmod -R 775 storagechmod -R 775 bootstrap/cache
HTTPS
sudo add-apt-repository ppa:certbot/certbotsudo apt install -y python-certbot-nginxsudo certbot certonly --webroot --webroot-path=/var/www/html//public -d -d www.sudo nginx -tsudo ufw allow 'Nginx HTTPS'sudo ufw statussudo systemctl reload nginx
Vytvořte droplet na DigitalOcean a zaregistrujte nový SSH klíč
Upřímně věřím, že si s registrací na DigitalOcean poradíte sami. Není to snadné, je tam spousta ověřování a dalších nesnází. Pokud máte při ověřování pomocí dokumentů neustále chybu s připojením, zkuste to udělat přes VPN, mělo by to pomoci.
V horním menu klikněte na Vytvořit->Droplety. Vyberte Ubuntu.
Jakmile se zaregistrujete, dostanete 100$ na účet. Ale nenechte se mýlit. Máte pouze 60 dní na jejich utracení. To je velmi málo. Můžete, stejně jako já, chtít použít dražší plán, abyste se později, když už přijdou skutečné peníze, přepli na levnější. Hned říkám, to nepůjde. Můžete pouze zvyšovat, snižovat nelze. Tak to je. Volím Standard->$5.
Vyberám region nejblíže k nám Frankfurt. VPC Network->default-fra1
Autentizaci provedeme ihned přes SSH. Klikneme na Nový SSH klíč. Pokud nemáte SSH, napravo je velmi jednoduchý návod. Otevřete bash terminál, vložte
ssh-keygen. Poté přejdeme do souboru s veřejným klíčem/Users/<Ваше имя пользователя>/.ssh/id_rsa.pub(nebo jednodušecat ~/.ssh/id_rsa.pub), zkopírujeme obsah a vložíme do okna vlevo. Jméno může být libovolné.Vymýšlíme pro droplet hostname.
Klikneme Vytvořit Droplet
Vytváříme nového uživatele
ssh root@[IP-adresa vašeho dropletu]- Jste si jistí, že chcete pokračovat v připojení (ano/ne/[otisk])?
ano - Zadejte své SSH heslo
- Vytváříme uživatele laravel:
adduser laravel - Zadejte heslo a další informace (já zadávám pouze celé jméno)
- Přidáváme uživatele do skupiny sudo:
usermod -aG sudo laravel
SSH pro nového uživatele
- Přepínáme na nového uživatele:
su laravel
Všechny akce dále, až do konce článku, provádíme jménem uživatele laravel. Proto, pokud jste se náhodou přerušili, znovu se přihlaste a zadejte su laravel
mkdir ~/.sshchmod 700 ~/.sshvim ~/.ssh/authorized_keys
Otevřeli jsme soubor ve Vimu. Pokud ho vůbec neznáte, můžete pracovat v Naně, je to vaše právo.
Nejzákladnější příkazy Vimu
Abyste mohli v průběhu článku používat editor Vim, stačí znát následující.
- Vimu existují různé režimy: normální (Normal mode), ve kterém zadáváte příkazy a vybíráte režimy a další.
- Abyste se dostali z jakéhokoli režimu do normálního režimu, stačí stisknout
Esc - Pohyb: můžete jednoduše použít šipky
- Vyjít bez uložení
<Normal mode>::q! - Vyjít a uložit
<Normal mode>::wq - Přejít do režimu vložení textu
<Normal mode>:i(z angličtiny vložit)
- Vkládáme náš veřejný klíč (který jsme dělali výše)
- Chceme se chránit před změnami:
chmod 600 ~/.ssh/authorized_keys
Nastavujeme firewall
- Podíváme se na všechna dostupná nastavení:
sudo ufw app list - Povolujeme OpenSSH (jinak nás zablokuje):
sudo ufw allow OpenSSH - Spouštíme firewall:
sudo ufw enable,y - Kontrolujeme:
sudo ufw status
Status: aktivní
Do Akce Z
-- ------ ----
OpenSSH POVOLIT Kdekoli
OpenSSH (v6) POVOLIT Kdekoli (v6)Všechno v pořádku.
Instalujeme Nginx
Při instalaci se vás někdy bude ptát "Jste si jisti?". Odpovězte y (no jen pokud jste si jisti).
sudo apt updatesudo apt install nginx
Přidáváme Nginx do nastavení firewallu
sudo ufw app listsudo ufw allow 'Nginx HTTP'sudo ufw status
Stav: aktivní
K Akce Z
-- ------ ----
OpenSSH DOVOLIT Kdekoli
Nginx HTTP DOVOLIT Kdekoli
OpenSSH (v6) DOVOLIT Kdekoli (v6)
Nginx HTTP (v6) DOVOLIT Kdekoli (v6)Přejděte na svou IP adresu. Pokud vše jde dobře, měli byste vidět následující.

Instalujeme MySQL
sudo apt install mysql-server- Spouštíme automatický skript na ochranu
sudo mysql_secure_installation
Odpovězte na kladené otázky. Pokud nevíte, co odpovědět, zde jsou doporučené varianty:
Plugin pro ověření hesla —
NOdstranit anonymní uživatele? —
YZakázat vzdálené přihlášení roota? —
NOdstranit testovací databázi a přístup k ní? —
NNačíst privilegované tabulky nyní? —
YPřihlašujeme se do MySQL:
sudo mysqlPodíváme se na metody přístupu:
SELECT user,authentication_string,plugin,host FROM mysql.user;Nastavujeme heslo pro roota:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';Podíváme se na metody přístupu znovu:
SELECT user,authentication_string,plugin,host FROM mysql.user;Použijeme změny a odhlásíme se z MySQL:
FLUSH PRIVILEGES;aexitNyní, abychom se dostali do MySQL, musíme použít
mysql -u root -pa zadat heslo
Instalujeme PHP
Využijeme externí repozitář od
sudo apt updatesudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-httpssudo apt-add-repository ppa:ondrej/phpsudo apt update
Nyní vybíráme. Pro Laravel 7 můžeme zvolit PHP 7.3 nebo 7.4. Rozdíl bude pouze v číslech 3 a 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) pracuje s PHP dotazy. MySQL, samozřejmě, pro práci s MySQL.
Dál budu všechno dělat na 7.4.
Nastavujeme Nginx
sudo vim /etc/nginx/sites-available/
Místo "<Váš domén>" vložte doménu (například, mysite.ru), kterou chcete používat v budoucnu. Pokud takovou zatím nemáte, napište jakoukoli, pak prostě opakujte krok v této kapitole pro svou doménu, když si ji vyberete.
Zapíšeme následující:
server {
listen 80;
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
server_name ;
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;
}
}Pokud jste zvolili verzi 7.3 místo php7.4-fpm.sock napište php7.4-fpm.sock.
Posloucháme port 80 na server_name, když přijde dotaz v kořenovém adresáři /var/www/html vezmeme indexový soubor. Pokud po server_name něčem zbývá, hledáme takový soubor. Pokud nenajdeme, vracíme 404. Pokud končí na .php, zbíháme přes fpm. Pokud je .ht, zakážeme (403).
- Vytváříme odkaz z
sites-availablevsites-enabled:sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/ - Odstraňujeme odkaz na
default:sudo unlink /etc/nginx/sites-enabled/default - Kontrolujeme na chyby:
sudo nginx -t - Restartujeme:
sudo systemctl reload nginx
Kontrolujeme funkčnost:
sudo vim /var/www/html/info.php- Píšeme:
<?php phpinfo(); - Přejdeme na
<Vaše IP>/info.php
Měli byste vidět něco podobného:

Nyní je možné tento soubor smazat: sudo rm /var/www/html/info.php
Instalujeme Laravel
7.3:
sudo apt install php7.3-mbstring php7.3-xml composer unzip7.4:
sudo apt install php7.4-mbstring php7.4-xml composer unzipPřihlašujeme se do MySQL:
mysql -u root -pVytváříme databázi s názvem laravel:
CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;Poskytujeme root přístup k laravel:
GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '';FLUSH PRIVILEGES;exitcd /var/www/htmlVytváříme složku pro projekt:
sudo mkdir -pPoskytujeme uživateli laravel práva na projekt:
sudo chown laravel:laravel
Dále je třeba přenést projekt. Například klonováním z Githubu.
cd ./git clone .
Je třeba mít na paměti, že pokud jste nesložili statické soubory (například z /public) na Github, tak je samozřejmě mít nebudete. Já jsem například pro to vytvořil samostatnou větev deploy, ze které jsem už klonoval: git clone -b --single-branch ..
- Instalujeme závislosti:
composer install - Vytváříme .env:
vim .env
Základní verze vypadá takto:
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=Pokud kopírujete svůj .env, změňte APP_ENV na production, APP_DEBUG na false a zadejte správná nastavení pro MySQL.
- Migrujeme DB:
php artisan migrate - Generujeme kód:
php artisan key:generate
Měníme oprávnění:
sudo chown -R $USER:www-data storagesudo chown -R $USER:www-data bootstrap/cachechmod -R 775 storagechmod -R 775 bootstrap/cache
Poslední, co zbývá, je přenastavit Nginx pro 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 ;
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;
}
}Jak už víte, pokud jste zvolili verzi 7.3 místo php7.4-fpm.sock napište php7.4-fpm.sock.
Nastavení domény na DigitalOcean
Všechno je ve skutečnosti velmi jednoduché. Koupíte doménu (kdekoli), přejdete na DigitalOcean do Vytvořit->Domains/DNS. Do pole Přidat doménu zadáte tuto doménu, kliknete na přidat. Poté přejdete do nastavení domény a do pole HOSTNAME zadáte @. Vyberete projekt a kliknete na Vytvořit záznam.
Nyní přejděte na web, kde jste koupili doménu, najděte "DNS servery" (nebo něco podobného) a zadejte servery DigitalOcean (a to konkrétněns1.digitalocean.com,ns2.digitalocean.com,ns3.digitalocean.com). Nyní je třeba chvíli (nebo déle) čekat, dokud budou tato nastavení přijata. Hotovo!
Jediný problém je, že se váš web otevře pouze jako HTTP. Aby byl HTTPS, přejdeme k další části.
Nastavujeme HTTPS
Instalujeme certbot a předáváme mu název domény (formátu mysite.ru) a název domény s www (www.mysite.cz).
sudo add-apt-repository ppa:certbot/certbotsudo apt install python-certbot-nginxsudo certbot certonly --webroot --webroot-path=/var/www/html//public -d -d www.
Nyní je třeba znovu nastavit Nginx (nezapomeňte použít své hodnoty):
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:ECDHE-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;
}
}Myslím, že už jste pochopili, co je třeba změnit pro PHP 7.3.
Tady je to vlastně jednoduché. Jen přesměrováváme všechny požadavky z HTTP (port 80) na HTTPS (port 443). A tam děláme vše stejné jako dříve, ale už s šifrováním.
Zbývá nastavit oprávnění v firewallu:
sudo nginx -tsudo ufw app listsudo ufw allow 'Nginx HTTPS'sudo ufw statussudo systemctl reload nginx
Nyní by vše mělo fungovat, jak má.
[Дополнительно] Установка Node.js
Pokud byste potřebovali spouštět příkazy npm přímo na serveru, musíte nainstalovat Node.js.
sudo apt updatesudo apt install -y nodejs npmnodejs -v
Tak, tady jsem na tomto kroku skončil. V zásadě jsem spokojen s výsledkem. Možná se přestěhuji z DigitalOcean někam blíže k Česku a levněji. Ale protože jsem už prošel celým ověřovacím procesem na webu a vše tam dělal, ukázal jsem to na jejich příkladu. Kromě toho jejich startovacích 100 dolarů je skvělá platforma pro trénink.
P.S. Děkuji zvlášť autorovi , který posloužil jako základ pro všechny výše uvedené kroky. V některých ohledech nefunguje pro Laravel 7, to jsem opravil.
P.P.S. Pokud jste náhodou špičkový inženýr, který myslí v bashi, prosím, nebuďte příliš přísní. Možná se vám úroveň tohoto článku bude zdát nízká, ale byl bych rád, kdybych takový našel, když jsem ho potřeboval. Pokud máte návrhy na zlepšení, jsem pro.
Zdroj: habr.com
