
Rozhodol som sa vytvoriť svoje portfólio na Laravel 7. Cieľom je, aby hlavnú stránku tvoril landing a všetky informácie na nej sa dali meniť pomocou administratívneho rozhrania. Nejde o podstatu. Dostal som sa k nasadeniu. Našiel som niekoľko dobrých tutoriálov, ako to spraviť na plnohodnotnom serveri so všetkými náležitosťami. V nasadení nie som veľmi silný, ja som skôr front-end ako fullstack. A ak ešte viem písať a testovať na PHP, tak na správu servera a podobne som sa ešte nedostal. Ale musel som sa do toho pustiť.
Teraz prejdeme všetkými krokmi, začínajúc spustením cez SSH a končiac funkčnou stránkou. Snažíme sa obísť všetky úskalia.
Možno nájdete podobné pokyny na internete. Nakoniec, aj ja som ich našiel. Pravda nie na jednom mieste, nie bez pomoci StackOverflow a pravdepodobne nie v slovenčine. Mne to dalo zabrať. Preto som sa rozhodol vám uľahčiť život.
Všetko budeme robiť s dropletom na DigitalOcean. To nie je povinné, vyberte si akékoľvek hostingové služby. Keď sa dostanete k funkčnému serveru na Ubuntu, vráťte sa. Pre tých, ktorí sa rozhodli pre DigitalOcean, budú ďalšie tipy na nastavenie domény. A tiež .
Všetky špecifické kroky pre DigitalOcean budú uvedené v podobných poznámkach.
Začneme.
TL;DR (len základné príkazy)
Vytvárame používateľa
ssh root@[IP-adresa vášho dropletu]adduser laravelusermod -aG sudo laravelsu laravel
Pridávame mu SSH
mkdir ~/.sshchmod 700 ~/.sshvim ~/.ssh/authorized_keys- Vkladáme verejný kľúč
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é nastavenie:
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;
}
}Len HTTP nastavenie pre 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;
}
}Nastavenie HTTPS pre 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/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
Vytvárame droplet na DigitalOcean a registrujeme nový SSH kľúč
Úprimne verím, že sa sami vyznáte v registrácii na DigitalOcean. Nie je to jednoduché, s množstvom overení a iných záležitostí. Ak máte pri overení pomocou dokumentov neustále problémy s chybou siete, skúste všetko urobiť cez VPN, malo by to pomôcť.
V hornom menu klikneme na Vytvoriť->Droplets. Vyberáme Ubuntu.
Akonáhle sa zaregistrujete, dostanete 100$ na svoj účet. Ale nesmieme sa nechať oklamať. Môžete ich minúť iba za 60 dní. A to je veľmi málo. Môžete, ako ja, chcieť využiť drahší plán, aby ste sa potom, keď už pôjdu reálne peniaze, prepli na lacnejší. Hneď hovorím, že to nepôjde. Zvyšovať môžete, znižovať nie. Tak to je. Vyberám si Štandardný->$5.
Vyberám región najbližší k nám Frankfurt. VPC Sieť->default-fra1
Autentifikáciu okamžite vykonáme cez SSH. Kliknite na Nový SSH Kľúč. Ak nemáte SSH, vpravo je veľmi jednoduchý návod. Otvorte bash terminál, vložte
ssh-keygen. Potom prejdite do súboru s verejným kľúčom/Users/<Ваше имя пользователя>/.ssh/id_rsa.pub(alebo jednoduchocat ~/ .ssh/ id_rsa.pub), skopírujte obsah a vložte do okna vľavo. Meno môže byť akékoľvek.Vymyslíme pre droplet názov hostiteľa.
Klikneme na Vytvoriť Droplet
Vytvárame nového používateľa
ssh root@[IP-adresa vášho dropletu]- Ste si istí, že chcete pokračovať v pripojení (áno/nie/[otlačok])?
yes - Zadajte svoje heslo k SSH
- Vytvárame používateľa laravel:
adduser laravel - Zadajte heslo a ďalšie informácie (ja zadávam iba celé meno)
- Pridávame používateľa do skupiny sudo:
usermod -aG sudo laravel
SSH pre nového používateľa
- Prepnite sa na nového používateľa:
su laravel
Všetky akcie ďalej, až do konca článku, vykonávame v mene používateľa laravel. Takže, ak ste sa náhodou prerušili, prihláste sa znova a zadajte su laravel
mkdir ~/.sshchmod 700 ~/.sshvim ~/.ssh/authorized_keys
Otvorte súbor vo Vim. Ak s ním vôbec nie ste oboznámení, môžete pracovať v Nano, je to vaše právo.
Najzákladnejšie príkazy Vim
Na to, aby ste mohli počas článku používať editor Vim, stačí vedieť nasledovné.
- Vo Vime sú rôzne režimy: normálny (Normal mode), v ktorom zadávate príkazy a vyberáte režimy, a ostatné.
- Aby ste vyšli z akéhokoľvek režimu a prešli do normálneho režimu, stačí stlačiť
Esc - Pohybovať sa: môžete jednoducho šípkami
- Vytvoriť bez uloženia
<Normal mode>::q! - Vytvoriť a uložiť
<Normal mode>::wq - Prejsť do režimu vkladania textu
<Normal mode>:i(z anglického. insert)
- Vkladáme náš verejný kľúč (ktorý sme vytvorili vyššie)
- Chráňte pred zmenami:
chmod 600 ~/.ssh/authorized_keys
Nastavujeme firewall
- Pozeráme všetky dostupné nastavenia:
sudo ufw app list - Povoľujeme OpenSSH (inak nás zablokuje):
sudo ufw allow OpenSSH - Spúšťame firewall:
sudo ufw enable,y - Kontrolujeme:
sudo ufw status
Stav: aktívny
Do Akcia Z
-- ------ ----
OpenSSH POVOLENÉ Kdekoľvek
OpenSSH (v6) POVOLENÉ Kdekoľvek (v6)Všetko je v poriadku.
Inštalujeme Nginx
Pri inštalácii sa vás niekedy bude pýtať "Ste si istí?". Odpovedzte y (no len, ak ste si istí).
sudo apt updatesudo apt install nginx
Pridávame Nginx do nastavení firewallu
sudo ufw app listsudo ufw allow 'Nginx HTTP'sudo ufw status
Stav: aktívny
Do Akcia Od
-- ------ ----
OpenSSH POVOLIŤ Kdekoľvek
Nginx HTTP POVOLIŤ Kdekoľvek
OpenSSH (v6) POVOLIŤ Kdekoľvek (v6)
Nginx HTTP (v6) POVOLIŤ Kdekoľvek (v6)Prejdite na svoju IP adresu. Ak všetko ide dobre, mali by ste vidieť nasledujúce.

Inštalujeme MySQL
sudo apt install mysql-server- Spúšťame automatický skript na ochranu
sudo mysql_secure_installation
Odpovedzte na položené otázky. Ak neviete, čo odpovedať, tu sú odporúčané možnosti:
Validácia hesla pluginu —
NOdstrániť anonymných používateľov? —
YZakázať diaľkové prihlásenie ako root? —
NOdstrániť testovaciu databázu a prístup k nej? —
NObnoviť privilegované tabuľky teraz? —
YPrihlásenie do MySQL:
sudo mysqlZobrazenie metód prístupu:
SELECT user,authentication_string,plugin,host FROM mysql.user;Nastavenie hesla pre root:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';Zobrazenie metód prístupu znova:
SELECT user,authentication_string,plugin,host FROM mysql.user;Aplikovanie zmien a odhlásenie z MySQL:
FLUSH PRIVILEGES;aexitTeraz, aby ste sa prihlásili do MySQL, musíte použiť
mysql -u root -pa zadať heslo
Inštalujeme PHP
Využijeme externé úložisko 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
Teraz si vyberte. Pre Laravel 7 si môžete zvoliť PHP 7.3 alebo 7.4. Rozdiel bude len v číslach 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 požiadavkami. mysql, samozrejme, na prácu s MySQL.
Ďalej budem všetko robiť na 7.4.
Nastavujeme Nginx
sudo vim /etc/nginx/sites-available/
Namiesto "<Váš domén>" zadajte doménu (napríklad, mysite.ru), ktorú chcete používať v budúcnosti. Ak ju zatiaľ nemáte, zadajte akúkoľvek, neskôr jednoducho zopakujte kroky v tejto kapitole pre svoju doménu, keď si ju vyberiete.
Zapíšte nasledujúce:
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;
}
}Ak ste zvolili verziu 7.3 namiesto php7.4-fpm.sock zmeňte na php7.4-fpm.sock.
Sledujeme port 80 na server_name, keď prichádzame s požiadavkou v koreňovom adresári /var/www/html berieme indexový súbor. Ak po server_name je niečo, hľadáme taký súbor. Ak ho nenájdeme, vraciame 404. Ak to končí na .php, posielame to cez fpm. Ak existuje .ht, zakazujeme (403).
- Vytvárame 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 - Reštartujeme:
sudo systemctl reload nginx
Kontrolujeme funkčnosť:
sudo vim /var/www/html/info.php- Píšeme:
<?php phpinfo(); - Prejdite na
<Váš IP>/info.php
Mali by ste vidieť niečo podobné:

Teraz tento súbor môžete odstrániť: sudo rm /var/www/html/info.php
Inštalujeme 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 unzipPrihlásenie do MySQL:
mysql -u root -pVytvárame databázu s názvom laravel:
CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;Poskytujeme root prístup k laravel:
GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '';FLUSH PRIVILEGES;exitcd /var/www/htmlVytvárame priečinok pre projekt:
sudo mkdir -pPoskytujeme používateľovi laravel práva na projekt:
sudo chown laravel:laravel
Ďalej je potrebné presunúť projekt. Napríklad klonovaním z GitHubu.
cd ./git clone .
Treba mať na pamäti, že ak ste neukladali statické súbory (napríklad z /public) na GitHub, tak ich samozrejme nebudete mať. Ja, napríklad, pre vyriešenie tohto problému som vytvoril samostatnú vetvu deploy, z ktorej som už klonoval: git clone -b --single-branch ..
- Nainštalujeme závislosti:
composer install - Vytvárame .env:
vim .env
Základná verzia vyzerá 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=Ak kopírujete svoj .env, nahraďte APP_ENV na production, APP_DEBUG na false a zadajte správne nastavenia pre MySQL.
- Migrujeme DB:
php artisan migrate - Generujeme kód:
php artisan key:generate
Meníme povolenia:
sudo chown -R $USER:www-data storagesudo chown -R $USER:www-data bootstrap/cachechmod -R 775 storagechmod -R 775 bootstrap/cache
Posledné, čo ostáva, je prekonfigurovať Nginx pre 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;
}
}Ako minule, ak ste si vybrali verziu 7.3 namiesto php7.4-fpm.sock zmeňte na php7.4-fpm.sock.
Nastavenie domény na DigitalOcean
Všetko je vlastne veľmi jednoduché. Kúpite doménu (kdekoľvek), prejdete na DigitalOcean do Vytvoriť->Domains/DNS. Do poľa Pridať doménu zapíšete túto doménu, kliknete na pridať. Potom prejdete do nastavení domény a do poľa HOSTNAME zapíšete @. Vyberiete projekt a kliknete Vytvoriť záznam.
Teraz prejdite na stránku, kde ste kúpili doménu, nájdete tam "DNS servery" (alebo niečo podobné) a zapíšete servery DigitalOcean (a to konkrétnens1.digitalocean.com,ns2.digitalocean.com,ns3.digitalocean.com). Teraz treba chvíľu (alebo dlhšie) počkať, kým sa tieto nastavenia prijmú. Hotovo!
Jedným problémom je, že váš web sa otvorí iba ako HTTP. Aby bol HTTPS, prejdite na ďalšiu časť.
Nastavenie HTTPS
Nainštalujte certbot a zadajte mu názov domény (vo formáte mysite.ru) a názov domény s www (www.mojastranka.sk).
sudo add-apt-repository ppa:certbot/certbotsudo apt install python-certbot-nginxsudo certbot certonly --webroot --webroot-path=/var/www/html//public -d -d www.
Teraz treba prekonfigurovať Nginx (nezabudnite dosadiť svoje 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: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;
}
}Myslím, že už ste pochopili, čo treba zmeniť pre PHP 7.3.
Tu je všetko vlastne jednoduché. Proste presmerujeme všetky požiadavky z HTTP (port 80) na HTTPS (port 443). A tam robíme všetko to isté, čo predtým, ale už so šifrovaním.
Ostáva nastaviť povolenia vo firewalle:
sudo nginx -tsudo ufw app listsudo ufw allow 'Nginx HTTPS'sudo ufw statussudo systemctl reload nginx
Teraz by to malo fungovať tak, ako má.
[Дополнительно] Установка Node.js
Ak by ste potrebovali spúšťať npm príkazy priamo na serveri, potrebujete nainštalovať Node.js.
sudo apt updatesudo apt install -y nodejs npmnodejs -v
Všetko, zastavil som sa na tejto úrovni. V podstate som spokojný s výsledkom. Možno prejdeme z DigitalOcean niekam bližšie k Rusku a lacnejšie. Ale keďže som už prešiel všetkými verifikačnými okruhmi na stránke a všetko tam robil, ukazoval som na ich príklade. Navyše ich štartových 100 dolárov je skvelou základňou pre tréningy.
P.S. Osobitná vďaka autorovi , ktorý slúžil ako základ všetkých vyššie uvedených činností. V niektorých momentoch nefunguje pre Laravel 7, to som opravil.
P.P.S. Ak ste náhodou skvelý inžinier, ktorý premýšľa v príkazových radoch bash, prosím, súdte ma odpúšťajúco. Možno vám príde úroveň tohoto článku nízka, ale bol by som rád, keby som takýto článok našiel, keď som ho potreboval. Ak máte návrhy na zlepšenie, som za každý z nich.
Zdroj: habr.com
