Deplojante aplikaĵon al Laravel 7 sur Ubuntu & Nginx

Deplojante aplikaĵon al Laravel 7 sur Ubuntu & Nginx

Mi decidis fari mian biletujon uzante Laravel 7. Por ke la ĉefpaĝo estu landpaĝo, kaj ĉiuj informoj pri ĝi povus esti ŝanĝitaj per la administra panelo. Ne la punkto. Ĝi venis al deplojo. Mi trovis kelkajn bonajn lernilojn pri kiel fari tion sur plenrajta servilo kun ĉiuj problemoj. Mi ne estas tre forta en deplojo; mi ĝenerale estas pli antaŭa ol plena stako. Kaj, se mi ankoraŭ povas skribi kaj testi en PHP, tiam antaŭ ol administri la servilon ktp. Mi ankoraŭ ne kreskis. Sed mi devis eltrovi ĝin.

Nun ni trairos ĉiujn paŝojn, komencante per lanĉo per SSH kaj finiĝante kun la laborejo. Ni provos eviti ĉiujn kaptilojn.

Vi eble povas trovi similajn instrukciojn interrete. Post ĉio, mi finfine trovis ĝin. Vere, ne en unu loko, ne sen la helpo de StackOverflow, kaj apenaŭ en la rusa. Mi suferis. Tial mi decidis simpligi vian vivon.

Ni faros ĉion per guto sur DigitalOcean. Ĉi tio kompreneble ne estas necesa; elektu ajnan gastigadon. Kiam vi atingos funkciantan servilon en Ubuntu, revenu. Por tiuj, kiuj ankoraŭ decidas fari ĝin sur DigitalOcean, estos pli da konsiloj pri agordo de domajno. Kaj $100 referenca ligo.

Ĉiuj specifaj paŝoj de DigitalOcean estos donitaj en piednotoj kiel ĉi tiuj.

Ni komencu.

TL;DR (nur bazaj komandoj)

Kreu uzanton

  • ssh root@[IP-адрес вашего дроплета]
  • adduser laravel
  • usermod -aG sudo laravel
  • su laravel

Aldonu SSH al ĝi

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Enigu la publikan ŝlosilon
  • chmod 600 ~/.ssh/authorized_keys

Fajromuro

  • 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/<Ваш домен>

Baza agordo:

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;
        }
}

Nur HTTP-agordo por 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;
    }
}

HTTPS-agordo por 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

Kreu guteton sur DigitalOcean kaj registri novan SSH-ŝlosilon

Mi vere kredas, ke vi mem ekscios kiel registriĝi ĉe DigitalOcean. Ĝi ne estas facila, kun multaj konfirmoj kaj aliaj aferoj. Se vi konstante ricevas retan eraron dum kontrolado de uzado de dokumentoj, provu fari ĉion per VPN, ĝi devus helpi.

En la menuo supre, alklaku krei->Gutetoj. Elektu ubuntu.

Tuj kiam vi registriĝos, vi ricevos $100 al via konto. Sed ne trompiĝu. Vi havas nur 60 tagojn por pasigi ĝin. Kaj ĉi tio estas tre malmulte. Vi eble, kiel mi, volas uzi pli multekostan planon, por ke poste, kiam la vera mono ekfluos, vi povas ŝanĝi al pli malmultekosta. Mi tuj diros al vi, ke ĝi ne funkcios. Vi povas pliigi ĝin, sed vi ne povas malpliigi ĝin. Do ĝi iras. Mi elektas normo->$5.

Mi elektas la plej proksiman regionon al ni Frankfurto. VPC-reto->default-fra1

Ni tuj faros aŭtentikigon per SSH. Klaku Nova SSH-ŝlosilo. Se vi ne havas SSH, estas tre simplaj instrukcioj dekstre. Malfermu bash-terminalon kaj algluu ssh-keygen. Poste ni iru al la dosiero kun la publika ŝlosilo /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (aŭ simple cat ~/.ssh/id_rsa.pub), kopiu la enhavon kaj algluu ĝin en la fenestron maldekstre. Ajna nomo.

Ni elpensas gastigan nomon por la guto.

Puŝi Krei Guteton

Kreu novan uzanton

  • ssh root@[IP-адрес вашего дроплета]
  • Ĉu vi certas, ke vi volas daŭrigi la konekton (jes/ne/[fingrospuro])? yes
  • Enigu vian SSH-pasvorton
  • Kreu uzanton laravel: adduser laravel
  • Enigu vian pasvorton kaj aliajn informojn (mi nur enigas Plenan Nomon)
  • Aldonu la uzanton al la sudo-grupo: usermod -aG sudo laravel

SSH por nova uzanto

  • Ŝanĝu al la nova uzanto: su laravel

Ni plenumas ĉiujn agojn plu, ĝis la fino de la artikolo, nome de la laravel-uzanto. Tial, se vi estas subite interrompita, re-ensalutu kaj eniru su laravel

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys

Ni malfermis la dosieron en Vim. Se vi tute ne konas ĝin, vi povas labori en Nano, via rajto.

La plej bazaj Vim-komandoj

Por uzi la Vim-redaktilon tra la tuta artikolo, vi nur bezonas scii la jenon.

  • Vim havas malsamajn reĝimojn: Normala reĝimo, en kiu vi enigas komandojn kaj elektas reĝimojn kaj aliajn.
  • Por eliri iun ajn reĝimon kaj reveni al normala reĝimo, simple premu Esc
  • Movu ĉirkaŭen: vi povas simple uzi sagojn
  • Eliru sen konservi <Normal mode>: :q!
  • Eliru kaj konservu <Normal mode>: :wq
  • Ŝaltu al teksta eniga reĝimo <Normal mode>: i (el la angla. enigi)
  • Ni enigas nian publikan ŝlosilon (kion ni faris supre)
  • Ni protektas kontraŭ ŝanĝoj: chmod 600 ~/.ssh/authorized_keys

Instalante fajroŝirmilon

  • Ni rigardu ĉiujn disponeblajn agordojn: sudo ufw app list
  • Permesu OpenSSH (alie ĝi ŝlosos nin): sudo ufw allow OpenSSH
  • Ni lanĉu la fajroŝirmilon: sudo ufw enable, y
  • Ni kontrolas: sudo ufw status

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Ĉio estas en ordo.

Instalante Nginx

Dum instalado oni foje demandos vin "Ĉu vi certas?" Respondu y (nu, nur se vi estas certa).

  • sudo apt update
  • sudo apt install nginx

Aldonante Nginx al la fajroŝirmilaj agordoj

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

Iru al via IP. Se ĉio iras bone, vi devus vidi la jenon.

Deplojante aplikaĵon al Laravel 7 sur Ubuntu & Nginx

Instalante MySQL

  • sudo apt install mysql-server
  • Lanĉante aŭtomatan protektan skripton sudo mysql_secure_installation

Respondu la demanditajn demandojn. Se vi ne scias kion respondi, jen kelkaj proponitaj opcioj:

  • Valigi pasvortan kromaĵon - N

  • Ĉu forigi anonimajn uzantojn? — Y

  • Malpermesi radikan ensalutadon malproksime? — N

  • Ĉu forigi testan datumbazon kaj aliron al ĝi? — N

  • Ĉu reŝargi privilegiajn tabelojn nun? — Y

  • Ni iru al MySQL: sudo mysql

  • Ni rigardu la alirmetodojn: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Agordu pasvorton por radiko: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';

  • Ni rigardu la alirmetodojn denove: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Apliku la ŝanĝojn kaj eliru MySQL: FLUSH PRIVILEGES; и exit

  • Nun, por ensaluti en MySQL, vi devas uzi mysql -u root -p kaj enigu la pasvorton

Instalante PHP

Ni uzu triapartan deponejon de Ondrej 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

Nun ni elektu. Por Laravel 7, vi povas elekti PHP 7.3 aŭ 7.4. La sola diferenco estos en la numeroj 3 kaj 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) funkcias kun PHP-petoj. mysql, kompreneble, por labori kun MySQL.

De nun mi faros ĉion je 7.4.

Agordo de Nginx

  • sudo vim /etc/nginx/sites-available/<Ваш домен>

Anstataŭ "<Via domajno>" enigu la domajnon (ekzemple, mysite.ru) kiun vi volas uzi estonte. Se vi ankoraŭ ne havas unu, skribu iun, tiam simple ripetu la paŝojn en ĉi tiu ĉapitro por via domajno kiam vi elektas ĝin.

Enigu la jenon:

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 vi elektis version 7.3 anstataŭe php7.4-fpm.sock enskribi php7.4-fpm.sock.

Aŭskultu la havenon 80 server_namekiam ni alvenas al la radika peto /var/www/html prenu la indeksan dosieron. Se post server_name Estas io, ni serĉas tian dosieron. Se ni ne trovas ĝin, ni forĵetas 404. Se ĝi finiĝas per .php, trakuru fpm... Se ekzistas .ht, malpermesi (403).

  • Farante ligilon de sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • Forigante la ligon al default: sudo unlink /etc/nginx/sites-enabled/default
  • Kontrolante erarojn: sudo nginx -t
  • Rekomencu: sudo systemctl reload nginx

Kontrolante la laboron:

  • sudo vim /var/www/html/info.php
  • Ni skribas: <?php phpinfo();
  • Ni iru al <Ваш IP>/info.php

Vi devus vidi ion tian:

Deplojante aplikaĵon al Laravel 7 sur Ubuntu & Nginx

Nun ĉi tiu dosiero povas esti forigita: sudo rm /var/www/html/info.php

Instalu 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

  • Ni iru al MySQL: mysql -u root -p

  • Kreu datumbazon kun la nomo laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • Ni provizas radikan aliron al laravel: GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Kreu dosierujon por la projekto: sudo mkdir -p <Имя проекта>

  • Ni provizas la uzanton laravel rajtoj al la projekto: sudo chown laravel:laravel <Имя проекта>

Poste vi devas translokigi la projekton. Ekzemple, klonado de Github.

  • cd ./<Имя проекта>
  • git clone <ссылка на проект> .

Indas konsideri, ke se vi ne konservis statikajn dosierojn (ekzemple de /public) sur Github, tiam nature vi ne havos ilin. Ekzemple, mi kreis apartan fadenon por solvi ĉi tion deploy, el kiu mi jam klonis: git clone -b <имя ветки> --single-branch <ссылка на проект> ..

  • Instalado de dependecoj: composer install
  • Krei .env: vim .env

La baza versio de ĝi aspektas jene:

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 vi kopias vian .env, anstataŭigu APP_ENV per produktado, APP_DEBUG per false kaj enigu la ĝustajn agordojn por MySQL.

  • Migrado la datumbazo: php artisan migrate
  • Generante la kodon: php artisan key:generate

Ŝanĝante permesojn:

  • sudo chown -R $USER:www-data storage
  • sudo chown -R $USER:www-data bootstrap/cache
  • chmod -R 775 storage
  • chmod -R 775 bootstrap/cache

La lasta afero restas reagordi Nginx por 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;
    }
}

Kiel la lastan fojon, se vi elektis version 7.3 anstataŭe php7.4-fpm.sock enskribi php7.4-fpm.sock.

Agordante domajnon sur DigitalOcean

Ĉio estas fakte tre simpla. Vi aĉetas domajnon (ie), ŝanĝu al DigitalOcean ĉe krei->Domajnoj/DNS... En kampo Aldonu domajnon vi enigu ĉi tiun domajnon kaj alklaku aldoni. Poste iru al la domajnaj agordoj kaj al la kampo HOSTNOMO eniru @. Elektu projekton kaj alklaku Krei rekordon.
Nun iru al la retejo, kie vi aĉetis la domajnon, trovu "DNS-Servilojn" tie (aŭ ion similan) kaj enigu la DigitalOcean-servilojn (nome ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Nun vi devas atendi iomete (aŭ multe) ĝis ĉi tiuj agordoj estos akceptitaj. Preta!
La sola problemo estas, ke via retejo malfermos nur kiel HTTP. Por havi HTTPS, transiru al la sekva parto.

Agordi HTTPS

Instalu certbot kaj donu al ĝi la domajnan nomon (formato mysite.ru) kaj domajna nomo kun 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.<Ваш домен>

Nun vi devas reagordi Nginx (ne forgesu anstataŭigi viajn valorojn):

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;
    }
}

Mi pensas, ke vi jam komprenas, kio necesas ŝanĝi por PHP 7.3.

Ĉi tie, fakte, ĉio estas simpla. Ni simple alidirektas ĉiujn petojn de HTTP (haveno 80) al HTTPS (haveno 443). Kaj tie ni faras ĉion same kiel antaŭe, sed kun ĉifrado.

Restas nur agordi la permesojn en la fajroŝirmilo:

  • sudo nginx -t
  • sudo ufw app list
  • sudo ufw allow 'Nginx HTTPS'
  • sudo ufw status
  • sudo systemctl reload nginx

Nun ĉio devus funkcii kiel ĝi devus.

[Altnivela] Instalado de Node.js

Se vi subite bezonas ruli npm-komandojn rekte sur la servilo, vi devas instali Node.js.

  • sudo apt update
  • sudo apt install -y nodejs npm
  • nodejs -v

Jen ĝi, mi haltis en ĉi tiu etapo. Principe mi estas kontenta pri la rezulto. Eble mi ŝanĝos de DigitalOcean ie pli proksime al Rusio kaj pli malmultekosta. Sed ĉar mi jam trapasis ĉiujn kontrolajn rondojn en la retejo kaj faris ĉion tie, mi montris ilin per ekzemplo. Krome, ilia komenca $100 estas bonega saltotabulo por trejnado.

PS Specialan dankon al la aŭtoro ĉi tiu esenco, kiu servis kiel bazo por ĉiuj ĉi-supraj agoj. En iuj kazoj ĝi ne funkcias por Laravel 7, mi riparis ĝin.

PPS Se vi hazarde estas pinta inĝeniero kiu pensas en bash-komandoj, bonvolu ne juĝi severe. Vi eble trovos ĉi tiun artikolon kiel malalta nivelo, sed mi ĝojus trovi tian kiam mi bezonis ĝin. Se estas sugestoj por plibonigo, mi tute favoras.

fonto: www.habr.com

Aldoni komenton