Nasadenie aplikácie na Laravel 7 na Ubuntu & Nginx

Deploy aplikácie na Laravel 7 na Ubuntu & Nginx

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ž referral link na 100$.

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 laravel
  • usermod -aG sudo laravel
  • su laravel

Pridávame mu SSH

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Vkladáme verejný kľúč
  • 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 '';
  • 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/

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/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 '';

  • 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=

  • 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

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 jednoducho cat ~/ .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 ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.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 update
  • sudo apt install nginx

Pridávame Nginx do nastavení firewallu

  • sudo ufw app list
  • sudo 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.

Deploy aplikácie na Laravel 7 na Ubuntu & Nginx

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 — N

  • Odstrániť anonymných používateľov? — Y

  • Zakázať diaľkové prihlásenie ako root? — N

  • Odstrániť testovaciu databázu a prístup k nej? — N

  • Obnoviť privilegované tabuľky teraz? — Y

  • Prihlásenie do MySQL: sudo mysql

  • Zobrazenie 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; a exit

  • Teraz, aby ste sa prihlásili do MySQL, musíte použiť mysql -u root -p a zadať heslo

Inštalujeme PHP

Využijeme externé úložisko od Ondřej Surý

  • 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

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-available v sites-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é:

Deploy aplikácie na Laravel 7 na Ubuntu & Nginx

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 unzip

  • 7.4: sudo apt install php7.4-mbstring php7.4-xml composer unzip

  • Prihlásenie do MySQL: mysql -u root -p

  • Vytvá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;

  • exit

  • cd /var/www/html

  • Vytvárame priečinok pre projekt: sudo mkdir -p

  • Poskytujeme 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 storage
  • sudo chown -R $USER:www-data bootstrap/cache
  • chmod -R 775 storage
  • chmod -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étne ns1.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/certbot
  • sudo apt install python-certbot-nginx
  • sudo 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 -t
  • sudo ufw app list
  • sudo ufw allow 'Nginx HTTPS'
  • sudo ufw status
  • sudo 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 update
  • sudo apt install -y nodejs npm
  • nodejs -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 tohto gistu, 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

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster