Deployment einer Anwendung auf Laravel 7 unter Ubuntu & Nginx

Deployment einer Anwendung auf Laravel 7 unter Ubuntu & Nginx

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 eine Empfehlungslink für 100 $.

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

Fügen Sie SSH hinzu

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Fügen Sie den public key ein
  • 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/

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/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 '<Ihr MySQL Passwort>';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • sudo mkdir -p <Projektname>

  • sudo chown laravel:laravel <Projektname>

  • cd ./<Projektname>

  • git clone <Projektlink> . / git clone -b <Branch-Name> --single-branch <Projektlink> .

  • composer install

  • vim .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 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/<Projektname>/public -d <Ihr Domain> -d www.<Ihr Domain>

  • sudo nginx -t

  • sudo ufw allow 'Nginx HTTPS'

  • sudo ufw status

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

Fügen Sie Nginx zu den Firewall-Einstellungen hinzu

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

Deployment einer Anwendung auf Laravel 7 unter Ubuntu & Nginx

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

  • Anonyme Benutzer entfernen? — Y

  • Root-Login aus der Ferne verbieten? — N

  • Testdatenbank und Zugriff darauf entfernen? — N

  • Berechtigungstabellen jetzt neu laden? — Y

  • Mit MySQL anmelden: sudo mysql

  • Zugriffsarten 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; und exit

  • Um sich jetzt bei MySQL anzumelden, müssen Sie verwenden mysql -u root -p und das Passwort eingeben

PHP installieren

Wir verwenden das externe Repository von 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

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-available in sites-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:

Deployment einer Anwendung auf Laravel 7 unter Ubuntu & Nginx

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 unzip

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

  • Mit MySQL anmelden: mysql -u root -p

  • Wir 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;

  • exit

  • cd /var/www/html

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

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster