
Ich habe beschlossen, mein Portfolio mit Laravel 7 zu erstellen. Die Startseite soll als Landing Page fungieren, während die gesamten Informationen darüber über ein Admin-Panel geändert werden können. Aber das ist nicht der Punkt. Es kam zum Deployment. Ich habe ein paar gute Tutorials gefunden, wie man das auf einem vollwertigen Server mit all den erforderlichen Einstellungen macht. Mit Deployments kenne ich mich nicht so gut aus; ich bin eher ein Frontend-Entwickler als ein Full-Stack-Entwickler. Während ich noch schreiben und testen kann, bin ich beim Servermanagement noch nicht so weit. Aber ich musste mich damit auseinandersetzen.
Jetzt gehen wir alle Schritte durch, angefangen mit dem Start über SSH bis hin zu einer funktionierenden Website. Wir werden versuchen, alle Fallstricke zu umgehen.
Möglicherweise finden Sie ähnliche Anleitungen im Internet. Schließlich habe ich sie auch gefunden. Allerdings nicht an einem Ort, sondern mit Hilfe von StackOverflow und wahrscheinlich nicht auf Russisch. Ich habe mich damit gequält. Daher habe ich beschlossen, Ihr Leben einfacher zu machen.
Wir werden alles mit einem Droplet auf DigitalOcean machen. Das ist natürlich nicht zwingend erforderlich, wählen Sie jeden Hosting-Anbieter. Wenn Sie einen funktionierenden Server auf Ubuntu erreichen, kommen Sie zurück. Für diejenigen, die sich dennoch für DigitalOcean entschieden haben, gibt es zusätzliche Tipps zur Domain-Einrichtung. Außerdem .
Alle spezifischen Schritte für DigitalOcean werden in ähnlichen Fußnoten gegeben.
Lassen Sie uns beginnen.
TL;DR (nur die Hauptbefehle)
Erstellen Sie einen Benutzer
ssh root@[IP-Adresse Ihres Droplets]adduser laravelusermod -aG sudo laravelsu laravel
Fügen Sie SSH hinzu
mkdir ~/.sshchmod 700 ~/.sshvim ~/.ssh/authorized_keys- Fügen Sie den public key 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 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 '<Ihr MySQL Passwort>';FLUSH PRIVILEGES;exitcd /var/www/htmlsudo mkdir -p <Projektname>sudo chown laravel:laravel <Projektname>cd ./<Projektname>git clone <Projektlink> ./git clone -b <Branch-Name> --single-branch <Projektlink> .composer installvim .env
APP_NAME=Laravel
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=http://<Ihr Domain>
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=<Ihr MySQL Passwort>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/<Projektname>/public -d <Ihr Domain> -d www.<Ihr Domain>sudo nginx -tsudo ufw allow 'Nginx HTTPS'sudo ufw statussudo systemctl reload nginx
Erstellen Sie einen Droplet bei DigitalOcean und registrieren Sie einen neuen SSH-Schlüssel.
Ich bin überzeugt, dass Sie sich selbst bei der Registrierung auf DigitalOcean zurechtfinden werden. Sie ist nicht einfach und erfordert viele Verifikationen und dergleichen. Wenn bei der Dokumentenverifizierung ständig ein Netzwerkfehler auftritt, versuchen Sie es über ein VPN, das sollte helfen.
Im oberen Menü klicken wir auf Erstellen->Droplets. Wir wählen Ubuntu.
Sobald Sie sich registriert haben, erhalten Sie 100 $ auf Ihrem Konto. Aber lassen Sie sich nicht täuschen. Sie haben nur 60 Tage Zeit, um sie auszugeben. Das ist sehr wenig. Möglicherweise möchten Sie, wie ich, einen teureren Plan wählen, um später, wenn das echte Geld kommt, auf einen günstigeren Plan umzusteigen. Damit wird es jedoch schwierig. Erhöhungen sind möglich, aber Reduzierungen nicht. So ist das nun mal. Ich wähle Standard->$5.
Die Region wähle ich, die uns am nächsten ist Frankfurt. VPC-Netzwerk->default-fra1
Die Authentifizierung erfolgt sofort über SSH. Klicken Sie auf Neuer SSH-Schlüssel. Wenn Sie SSH nicht haben, gibt es rechts eine sehr einfache Anleitung. Öffnen Sie das Bash-Terminal und fügen Sie ein
ssh-keygen. Dann gehen Sie in die Datei mit dem öffentlichen Schlüssel/Users/<Ваше имя пользователя>/.ssh/id_rsa.pub(oder einfachcat ~/.ssh/id_rsa.pub), kopieren Sie den Inhalt und fügen ihn in das linke Fenster ein. Der Name kann beliebig sein.Lassen Sie sich einen Hostnamen für den Droplet einfallen.
Klicken Sie auf Droplet erstellen
Einen neuen Benutzer erstellen
ssh root@[IP-Adresse Ihres Droplets]- Sind Sie sicher, dass Sie mit dem Verbinden fortfahren möchten (ja/nein/[Fingerabdruck])?
yes - Geben Sie Ihr SSH-Passwort ein
- Erstellen Sie einen Benutzer laravel:
adduser laravel - Geben Sie das Passwort und andere 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 nachfolgenden Aktionen bis zum Ende des Artikels führen wir im Namen des Benutzers laravel durch. Falls Sie also unterbrochen wurden, melden Sie sich erneut an 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 auch in Nano arbeiten, ganz wie Sie möchten..
Die grundlegendsten Vim-Befehle
Um den Vim-Editor während des Artikels nutzen zu können, müssen Sie Folgendes wissen.
- In Vim gibt es verschiedene Modi: den normalen Modus (Normal mode), in dem Sie Befehle eingeben und Moduswechsel vornehmen, und die anderen.
- Um aus jedem Modus in den normalen Modus zu wechseln, drücken Sie einfach
Esc - Bewegung: Sie können einfach die Pfeiltasten verwenden.
- Ohne zu speichern beenden
<Normal mode>::q! - Beenden und speichern
<Normal mode>::wq - In den Eingabemodus wechseln
<Normal mode>:i(von engl. 'Insert') Einspeisung)
- 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
- Alle verfügbaren Einstellungen anzeigen:
sudo ufw app list - OpenSSH erlauben (sonst werden wir gesperrt):
sudo ufw allow OpenSSH - Firewall starten:
sudo ufw enable,y - Überprüfen wir:
sudo ufw status
Status: aktiv
Von Aktion Aus
-- ------ ----
OpenSSH ERLAUBEN Überall
OpenSSH (v6) ERLAUBEN Überall (v6)Alles in Ordnung.
Nginx installieren
Bei der Installation werden Sie manchmal gefragt: "Sind Sie sicher?" Antworten Sie y (nur, wenn Sie sich sicher sind).
sudo apt updatesudo apt install nginx
Fügen Sie Nginx zu den Firewall-Einstellungen 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-Adresse. Wenn alles gut geht, sollten Sie Folgendes sehen.

MySQL installieren
sudo apt install mysql-server- Automatisches Skript zum Schutz starten
sudo mysql_secure_installation
Beantworten Sie die Fragen. Wenn Sie nicht wissen, was Sie antworten sollen, hier sind empfohlene Optionen:
Passwort-Validierungs-Plugin —
NAnonyme Benutzer entfernen? —
YRoot-Login aus der Ferne verbieten? —
NTestdatenbank und Zugriff darauf entfernen? —
NBerechtigungstabellen jetzt neu laden? —
YMit MySQL anmelden:
sudo mysqlZugriffsarten ansehen:
SELECT user, authentication_string, plugin, host FROM mysql.user;Passwort für root festlegen:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';Zugriffsarten erneut ansehen:
SELECT user, authentication_string, plugin, host FROM mysql.user;Änderungen übernehmen und aus MySQL aussteigen:
FLUSH PRIVILEGES;undexitUm sich jetzt bei MySQL anzumelden, müssen Sie verwenden
mysql -u root -pund das Passwort eingeben
PHP installieren
Wir verwenden das externe 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 auswählen. Der Unterschied liegt lediglich in den Ziffern 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) verarbeitet PHP-Anfragen. mysql, natürlich, für die Arbeit mit MySQL.
Weiterhin werde ich alles mit 7.4 machen.
Nginx konfigurieren
sudo vim /etc/nginx/sites-available/
Anstelle von "" geben Sie die Domain ein (zum Beispiel, meineseite.de), die Sie in Zukunft verwenden möchten. Falls Sie noch keine haben, schreiben Sie einfach eine beliebige, und wiederholen Sie die Schritte in diesem Kapitel für Ihre Domain, wenn Sie diese auswählen.
Wir schreiben Folgendes hinein:
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 Version 7.3 anstelle von php7.4-fpm.sock bitte eintragen php7.4-fpm.sock.
Hören Sie auf Port 80 an server_name, wenn eine Anfrage im Wurzelverzeichnis kommt /var/www/html , verwenden wir die index-Datei. Wenn danach server_name etwas vorhanden ist, suchen wir eine solche Datei. Finden wir keine, zeigen wir 404 an. Wenn die Anfrage endet mit .php, leiten wir durch fpm. Wenn es eine .ht, verweigern wir (403).
- Wir erstellen einen Link aus
sites-availableinsites-enabled:sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/ - Wir löschen den Link zu
default:sudo unlink /etc/nginx/sites-enabled/default - Wir überprüfen auf Fehler:
sudo nginx -t - Wir starten neu:
sudo systemctl reload nginx
Wir testen die Funktionsweise:
sudo vim /var/www/html/info.php- Wir schreiben:
<?php phpinfo(); - Gehe zu
/info.php
Sie sollten etwas Ähnliches sehen:

Jetzt kann diese Datei gelöscht werden: sudo rm /var/www/html/info.php
Wir installieren 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 unzipMit MySQL anmelden:
mysql -u root -pWir erstellen eine DB mit dem Namen laravel:
CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;Wir gewähren Root-Zugriff auf laravel:
GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ihr MySQL Passwort>';FLUSH PRIVILEGES;exitcd /var/www/htmlWir erstellen einen Ordner für das Projekt:
sudo mkdir -p <Projektname>Wir geben dem Benutzer laravel Rechte auf das Projekt:
sudo chown laravel:laravel <Projektname>
Nun muss das Projekt verschoben werden. Zum Beispiel durch Klonen von Github.
cd ./<Projektname>git clone <Projektlink> .
Es sollte beachtet werden, dass, wenn Sie die statischen Dateien nicht gespeichert haben (zum Beispiel aus /public) auf Github, haben Sie sie natürlich nicht. Ich habe beispielsweise dafür einen separaten Branch erstellt. deploy, von dem ich bereits geklont habe: git clone -b <Branch-Name> --single-branch <Projektlink> ..
- 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://<Ihr Domain>
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=<Ihr MySQL Passwort>Wenn Sie Ihre .env kopieren, ersetzen Sie APP_ENV durch production, APP_DEBUG durch false und tragen Sie die richtigen Einstellungen für MySQL 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 für Laravel neu zu konfigurieren:
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 Version 7.3 anstelle von php7.4-fpm.sock bitte eintragen php7.4-fpm.sock.
Domain-Konfiguration auf DigitalOcean
Es ist eigentlich ganz einfach. Sie kaufen eine Domain (wo auch immer), gehen zu DigitalOcean in Erstellen->Domains/DNS. Im Feld Fügen Sie eine Domain hinzu tragen Sie diese Domain ein, klicken Sie auf hinzufügen. Dann gehen Sie zu den Domaineinstellungen und im Feld HOSTNAME geben Sie @ein. Wählen Sie das Projekt aus und klicken Sie auf Eintrag erstellen.
Nun wechseln Sie zur Website, auf der Sie die Domain gekauft haben, finden dort "DNS-Server" (oder etwas Ähnliches) und geben die Server von DigitalOcean ein (nämlichns1.digitalocean.com,ns2.digitalocean.com,ns3.digitalocean.com). Jetzt müssen wir etwas (oder viel) warten, bis diese Einstellungen übernommen werden. Fertig!
Das einzige Problem ist, dass Ihre Website nur über HTTP verfügbar sein wird. Um HTTPS zu aktivieren, gehen wir zum nächsten Schritt.
HTTPS einrichten
Installieren Sie certbot und geben Sie ihm den Domainnamen (im Format meineseite.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/<Projektname>/public -d <Ihr Domain> -d www.<Ihr Domain>
Jetzt müssen wir Nginx neu 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 Sie für PHP 7.3 ändern müssen.
Hier ist es ganz einfach. Wir leiten einfach alle Anfragen von HTTP (Port 80) auf HTTPS (Port 443) um. Und dort machen wir alles genau so wie zuvor, aber mit Verschlüsselung.
Jetzt müssen die Berechtigungen in der Firewall festgelegt werden:
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
Das ist alles, ich habe an diesem Punkt gestoppt. Im Grunde bin ich mit dem Ergebnis zufrieden. Vielleicht wechsele ich von DigitalOcean zu einem günstigeren Anbieter näher an Russland. Aber da ich bereits alle Verifikationsschritte auf der Website durchlaufen habe und alles dort gemacht habe, habe ich dies an ihrem Beispiel gezeigt. Außerdem sind die Startkosten von 100 Dollar ein hervorragender Ausgangspunkt für Übungszwecke.
P.S. Ein besonderes Dankeschön an den Autor , der die Grundlage für alle oben genannten Schritte bildete. In einigen Aspekten funktioniert er nicht mit Laravel 7, aber ich habe das angepasst.
P.P.S. Wenn Sie zufällig ein großartiger Ingenieur sind, der in Bash-Befehlen denkt, bitte urteilen Sie nicht zu streng. Möglicherweise scheint 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, bin ich ganz dafür.
Quelle: habr.com
