
Ich habe mir hier ein Portfolio auf Laravel 7 erstellt. Damit die Hauptseite eine Landingpage ist und alle Informationen darauf über das Admin-Panel geändert werden können. Darum geht es nicht. Nun kam es zum Deployment. Ich habe ein paar gute Tutorials gefunden, wie man es auf einem vollwertigen Server mit allen Komplikationen macht. Mit Deployment kenne ich mich nicht so gut aus, ich bin mehr Frontend als Fullstack. Und während ich noch in der Lage bin, in PHP zu programmieren und zu testen, habe ich mich noch nicht mit der Serververwaltung usw. beschäftigt. Aber ich musste mich damit auseinandersetzen.
Jetzt gehen wir alle Schritte durch, beginnend mit dem Start über SSH und endend mit der funktionierenden Website. Wir werden versuchen, alle Fallstricke zu umgehen.
Möglicherweise finden Sie ähnliche Anleitungen im Internet. Schließlich habe ich sie ja auch irgendwann gefunden. Allerdings nicht an einem Ort, nicht ohne die Hilfe von StackOverflow und wahrscheinlich nicht auf Russisch. Ich habe mich damit herumgequält. Deshalb wollte ich Ihnen das Leben erleichtern.
Wir werden alles mit einem Droplet auf DigitalOcean machen. Das ist natürlich nicht zwingend erforderlich, wählen Sie jeden Hosting-Anbieter. Wenn Sie zu einem funktionierenden Server auf Ubuntu gelangen, kommen Sie zurück. Für diejenigen, die sich dennoch entschieden haben, es auf DigitalOcean zu machen, wird es auch Tipps zur Domainkonfiguration geben. Und außerdem .
Alle spezifischen Schritte für DigitalOcean werden in solchen Fußnoten angegeben.
Lassen Sie uns anfangen.
TL;DR (nur die Hauptbefehle)
Wir erstellen einen Benutzer
ssh root@[IP-Adresse Ihres Droplets]adduser laravelusermod -aG sudo laravelsu laravel
Wir fügen ihm SSH hinzu
mkdir ~/.sshchmod 700 ~/.sshvim ~/.ssh/authorized_keys- Fügen Sie den öffentlichen Schlüssel ein
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/
Basis-Konfiguration:
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;
}
}Nur die HTTP-Konfiguration für 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;
}
}HTTPS-Konfiguration für 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
Ein Droplet bei DigitalOcean erstellen und einen neuen SSH-Schlüssel registrieren
Ich glaube fest daran, dass Sie sich mit der Registrierung bei DigitalOcean selbst zurechtfinden werden. Es ist nicht einfach, mit vielen Verifizierungen und ähnlichem. Wenn es bei der Verifizierung mit Dokumenten ständig zu Netzwerkfehlern kommt, versuchen Sie es über ein VPN, das sollte helfen.
Im oberen Menü klicken wir auf Erstellen->Droplets. Wir wählen aus Ubuntu.
Sobald Sie sich registriert haben, erhalten Sie 100 $ auf Ihr Konto. Aber lassen Sie sich nicht täuschen. Sie haben nur 60 Tage Zeit, um das Geld auszugeben. Das ist sehr wenig. Möglicherweise möchten Sie, wie ich, einen teureren Plan nutzen, um dann, wenn echtes Geld fließt, auf einen günstigeren umzusteigen. Ich sage es gleich, das wird nicht funktionieren. Man kann erhöhen, aber nicht verringern. So ist es. Ich wähle Standard->$5.
Die Region wähle ich am nächsten zu uns Frankfurt. VPC-Netzwerk->default-fra1
Die Authentifizierung erfolgt sofort über SSH. Klicken Sie auf Neuer SSH-Schlüssel. Wenn Sie kein SSH haben, gibt es rechts eine sehr einfache Anleitung. Öffnen Sie das Bash-Terminal, fügen Sie ein
ssh-keygen. Dann gehen wir zur Datei mit dem öffentlichen Schlüssel/Users/<Ваше имя пользователя>/.ssh/id_rsa.pub(oder einfachcat ~/.ssh/id_rsa.pub), kopieren Sie den Inhalt und fügen Sie ihn in das Fenster links ein. Der Name kann beliebig sein.Wir geben dem Droplet einen Hostnamen.
Klicken Sie auf Droplet erstellen
Wir erstellen einen neuen Benutzer
ssh root@[IP-Adresse Ihres Droplets]- Sind Sie sicher, dass Sie mit der Verbindung fortfahren möchten (ja/nein/[Fingerabdruck])?
yes - Geben Sie Ihr SSH-Passwort ein
- Wir erstellen einen Benutzer laravel:
adduser laravel - Geben Sie das Passwort und weitere Informationen ein (ich gebe nur den vollständigen Namen ein)
- Fügen Sie den Benutzer zur Sudo-Gruppe hinzu:
usermod -aG sudo laravel
SSH für den neuen Benutzer
- Wechseln Sie zu dem neuen Benutzer:
su laravel
Alle weiteren Schritte bis zum Ende des Artikels führen wir im Namen des Benutzers laravel durch. Wenn Sie also unterbrochen haben, loggen Sie sich erneut ein und geben Sie ein su laravel
mkdir ~/.sshchmod 700 ~/.sshvim ~/.ssh/authorized_keys
Wir haben die Datei in Vim geöffnet. Wenn Sie damit nicht vertraut sind, können Sie in Nano arbeiten, wie Sie möchten.
Die grundlegendsten Vim-Befehle
Um während des Artikels den Vim-Editor zu verwenden, müssen Sie nur Folgendes wissen.
- In Vim gibt es verschiedene Modi: den normalen Modus, in dem Sie Befehle eingeben und Modi auswählen, und andere.
- Um aus jedem Modus in den normalen Modus zu gelangen, drücken Sie einfach
Esc - Bewegen: Sie können einfach die Pfeiltasten verwenden
- Beenden ohne Speichern
<Normal mode>::q! - Beenden und Speichern
<Normal mode>::wq - In den Textbearbeitungsmodus wechseln
<Normal mode>:i(von engl. Einfügung)
- Fügen Sie unseren öffentlichen Schlüssel ein (den wir oben erstellt haben)
- Schützen Sie vor Änderungen:
chmod 600 ~/.ssh/authorized_keys
Firewall einrichten
- Sehen Sie sich alle verfügbaren Einstellungen an:
sudo ufw app list - Erlauben Sie OpenSSH (sonst werden Sie gesperrt):
sudo ufw allow OpenSSH - Firewall starten:
sudo ufw enable,y - Überprüfen:
sudo ufw status
Status: aktiv
An Aktion Von
-- ------ ----
OpenSSH ERLAUBT Überall
OpenSSH (v6) ERLAUBT Überall (v6)Alles in Ordnung.
Nginx installieren
Bei der Installation werden Sie manchmal gefragt: "Sind Sie sicher?". Antworten Sie y (nur wenn Sie sicher sind).
sudo apt updatesudo apt install nginx
Fügen Sie Nginx zu den Firewalleinstellungen hinzu
sudo ufw app listsudo ufw allow 'Nginx HTTP'sudo ufw status
Status: aktiv
Zu Aktion Von
-- ------ ----
OpenSSH ERLAUBEN Überall
Nginx HTTP ERLAUBEN Überall
OpenSSH (v6) ERLAUBEN Überall (v6)
Nginx HTTP (v6) ERLAUBEN Überall (v6)Gehen Sie zu Ihrer IP. Wenn alles gut geht, sollten Sie Folgendes sehen.

MySQL installieren
sudo apt install mysql-server- Einen automatischen Schutz-Skript ausführen
sudo mysql_secure_installation
Beantworten Sie die gestellten Fragen. Wenn Sie nicht wissen, was Sie antworten sollen, hier sind empfohlene Optionen:
Passwort-Plugin validieren —
NAnonymen Benutzern entfernen? —
YRoot-Login aus der Ferne verbieten? —
NTestdatenbank und Zugang dazu entfernen? —
NRechte-Tabellen jetzt neu laden? —
YIn MySQL einloggen:
sudo mysqlZugriffsmethoden ansehen:
SELECT user,authentication_string,plugin,host FROM mysql.user;Passwort für root setzen:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';Zugriffsmethoden erneut ansehen:
SELECT user,authentication_string,plugin,host FROM mysql.user;Änderungen anwenden und aus MySQL aussteigen:
FLUSH PRIVILEGES;undexitJetzt müssen Sie für den Zugriff auf MySQL verwenden
mysql -u root -pund das Passwort eingeben
PHP installieren
Wir nutzen ein Drittanbieter-Repository von
sudo apt updatesudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-httpssudo apt-add-repository ppa:ondrej/phpsudo apt update
Jetzt wählen wir aus. Für Laravel 7 können Sie PHP 7.3 oder 7.4 wählen. Der Unterschied liegt nur in den Zahlen 3 und 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) arbeitet mit PHP-Anfragen. mysql natürlich für die Arbeit mit MySQL.
Danach werde ich alles auf 7.4 machen.
Nginx konfigurieren
sudo vim /etc/nginx/sites-available/
Anstelle von "" tragen Sie die Domain ein (zum Beispiel, mysite.de), die Sie in Zukunft verwenden möchten. Wenn Sie derzeit keine haben, geben Sie irgendetwas ein, und wiederholen Sie dann einfach die Schritte in diesem Kapitel für Ihre Domain, wenn Sie sie wählen.
Tragen Sie Folgendes ein:
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;
}
}Wenn Sie die Version 7.3 anstelle von php7.4-fpm.sock eingetragen haben, tragen Sie ein php7.4-fpm.sock.
Hören Sie auf Port 80 auf server_name, wenn eine Anfrage im Stammverzeichnis kommt /var/www/html nehmen wir die index-Datei. Wenn danach server_name etwas vorhanden ist, suchen wir nach dieser Datei. Wenn wir sie nicht finden, geben wir 404 zurück. Wenn es mit .phpendet, leiten wir durch fpm. Wenn es eine gibt .ht, verbieten wir (403).
- Wir erstellen einen Link von
sites-availableinsites-enabled:sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/ - Wir entfernen den Link von
default:sudo unlink /etc/nginx/sites-enabled/default - Überprüfen auf Fehler:
sudo nginx -t - Neuladen:
sudo systemctl reload nginx
Überprüfen der Funktion:
sudo vim /var/www/html/info.php- Wir schreiben:
<?php phpinfo(); - Gehen Sie zu
/info.php
Sie sollten etwas Ähnliches sehen:

Jetzt kann diese Datei gelöscht werden: sudo rm /var/www/html/info.php
Laravel installieren
7.3:
sudo apt install php7.3-mbstring php7.3-xml composer unzip7.4:
sudo apt install php7.4-mbstring php7.4-xml composer unzipIn MySQL einloggen:
mysql -u root -pEine Datenbank mit dem Namen erstellen laravel:
CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;Root-Zugriff auf gewähren laravel:
GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '';FLUSH PRIVILEGES;exitcd /var/www/htmlEin Verzeichnis für das Projekt erstellen:
sudo mkdir -pDem Benutzer laravel Rechte auf das Projekt gewähren:
sudo chown laravel:laravel
Als nächstes muss das Projekt übertragen werden. Zum Beispiel durch Klonen von Github.
cd ./git clone .
Es ist zu beachten, dass, wenn Sie keine statischen Dateien gespeichert haben (z. B. von /public) auf Github, Sie diese natürlich nicht haben werden. Ich habe zum Beispiel dafür einen separaten Branch erstellt, deployvon dem ich dann geklont habe: git clone -b --single-branch ..
- Abhängigkeiten installieren:
composer install - Erstellen Sie .env:
vim .env
Die Basisversion sieht so aus:
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=Wenn Sie Ihre .env kopieren, ersetzen Sie APP_ENV durch production, APP_DEBUG durch false und geben Sie die richtigen MySQL-Einstellungen ein.
- Datenbank migrieren:
php artisan migrate - Code generieren:
php artisan key:generate
Berechtigungen ändern:
sudo chown -R $USER:www-data storagesudo chown -R $USER:www-data bootstrap/cachechmod -R 775 storagechmod -R 775 bootstrap/cache
Das letzte, was bleibt, ist, Nginx auf Laravel umzustellen:
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;
}
}Wie beim letzten Mal, wenn Sie die Version 7.3 anstelle von php7.4-fpm.sock eingetragen haben, tragen Sie ein php7.4-fpm.sock.
Domain-Setup bei DigitalOcean
Es ist eigentlich ganz einfach. Sie kaufen eine Domain (überall), gehen zu DigitalOcean in Erstellen->Domains/DNS. Im Feld Eine Domain hinzufügen geben Sie diese Domain ein, klicken Sie auf hinzufügen. Dann gehen Sie zu den Domain-Einstellungen und geben im Feld HOSTNAME ein: @. Wählen Sie das Projekt aus und klicken Sie auf Datensatz erstellen.
Jetzt gehen Sie zur Website, wo Sie die Domain gekauft haben, suchen dort nach den "DNS-Servern" (oder etwas Ähnlichem) und geben die DigitalOcean-Server ein (nämlichns1.digitalocean.com,ns2.digitalocean.com,ns3.digitalocean.com). Jetzt müssen Sie ein wenig (oder viel) warten, bis diese Einstellungen übernommen wurden. Fertig!
Das einzige Problem – Ihre Website wird nur über HTTP erreichbar sein. Um HTTPS zu aktivieren, kommen wir zum nächsten Schritt.
HTTPS einrichten
Installieren Sie certbot und übergeben Sie ihm den Domainnamen (im Format mysite.de) und den Domainnamen mit www (www.mysite.ru).
sudo add-apt-repository ppa:certbot/certbotsudo apt install python-certbot-nginxsudo certbot certonly --webroot --webroot-path=/var/www/html//public -d -d www.
Jetzt müssen Sie Nginx erneut konfigurieren (vergessen Sie nicht, Ihre Werte einzufügen):
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;
}
}Ich denke, Sie haben bereits verstanden, was für PHP 7.3 geändert werden muss.
Hier ist es eigentlich ganz einfach. Wir leiten einfach alle Anfragen von HTTP (Port 80) auf HTTPS (Port 443) um. Und dort machen wir alles genau wie vorher, aber mit Verschlüsselung.
Es bleibt, die Berechtigungen in der Firewall festzulegen:
sudo nginx -tsudo ufw app listsudo ufw allow 'Nginx HTTPS'sudo ufw statussudo systemctl reload nginx
Jetzt sollte alles wie gewünscht funktionieren.
[Дополнительно] Установка Node.js
Falls Sie npm-Befehle direkt auf dem Server ausführen müssen, müssen Sie Node.js installieren.
sudo apt updatesudo apt install -y nodejs npmnodejs -v
Ich habe an diesem Punkt abgeschlossen. Im Grunde genommen bin ich mit dem Ergebnis zufrieden. Vielleicht wechsle ich von DigitalOcean zu etwas näher an Russland und günstiger. Aber da ich bereits alle Verifizierungsrunden auf der Website durchlaufen habe und alles dort gemacht habe, habe ich sie als Beispiel verwendet. Zudem sind die 100 Dollar, die sie als Startguthaben anbieten, eine hervorragende Plattform für Training.
P.S. Ein besonderer Dank geht an den Autor , das die Grundlage für alle oben genannten Schritte bildete. In einigen Punkten funktioniert es nicht für Laravel 7, das habe ich korrigiert.
P.P.S. Wenn Sie zufällig ein erstklassiger Ingenieur sind, der in Bash denkt, bitte urteilen Sie nicht zu streng. Möglicherweise erscheint Ihnen das Niveau dieses Artikels zu niedrig, aber ich wäre froh, so etwas gefunden zu haben, als ich es brauchte. Wenn Sie Verbesserungsvorschläge haben, wäre ich Ihnen sehr dankbar.
Quelle: habr.com
