Ich habe beschlossen, mein Portfolio mit Laravel 7 zu erstellen. Damit die Hauptseite eine Zielseite wird und alle darauf enthaltenen Informationen über das Admin-Panel geändert werden können. Nicht der Punkt. Es kam zum Einsatz. Ich habe ein paar gute Tutorials gefunden, wie man das auf einem vollwertigen Server mit allen Problemen macht. Ich bin nicht sehr stark im Einsatz; ich bin im Allgemeinen eher vorne als im Full-Stack. Und wenn ich noch in PHP schreiben und testen kann, dann vor der Verwaltung des Servers usw. Ich bin noch nicht erwachsen. Aber ich musste es herausfinden.
Jetzt gehen wir alle Schritte durch, beginnend mit dem Start über SSH und endend mit der Arbeitsseite. Wir werden versuchen, alle Fallstricke zu vermeiden.
Möglicherweise finden Sie ähnliche Anweisungen online. Schließlich habe ich es endlich gefunden. Stimmt, nicht an einem Ort, nicht ohne die Hilfe von StackOverflow und kaum auf Russisch. Ich litt. Deshalb habe ich beschlossen, Ihr Leben zu vereinfachen.
Wir werden alles mit einem Droplet auf DigitalOcean erledigen. Dies ist natürlich nicht notwendig; wählen Sie ein beliebiges Hosting. Wenn Sie einen funktionierenden Server unter Ubuntu erreichen, kehren Sie zurück. Für diejenigen, die sich dennoch dafür entscheiden, dies auf DigitalOcean zu tun, gibt es weitere Tipps zum Einrichten einer Domain. Und auch
Alle DigitalOcean-spezifischen Schritte werden in Fußnoten wie diesen aufgeführt.
Fangen wir an.
TL;DR (nur grundlegende Befehle)
Erstellen Sie einen Benutzer
ssh root@[IP-адрес вашего дроплета]
adduser laravel
usermod -aG sudo laravel
su laravel
Fügen Sie SSH hinzu
mkdir ~/.ssh
chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys
- Geben Sie den öffentlichen Schlüssel 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 '<Ваш пароль для 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/<Ваш домен>
Grundeinstellung:
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-Setup 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 <Ваш домен или 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-Einstellung 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: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
Erstellen Sie ein Droplet auf DigitalOcean und registrieren Sie einen neuen SSH-Schlüssel
Ich bin fest davon überzeugt, dass Sie selbst herausfinden werden, wie Sie sich bei DigitalOcean registrieren können. Es ist nicht einfach, mit vielen Überprüfungen und anderen Dingen. Wenn bei der Überprüfung mithilfe von Dokumenten ständig ein Netzwerkfehler auftritt, versuchen Sie, alles über ein VPN zu erledigen. Das sollte helfen.
Klicken Sie im Menü oben auf Erstellen->Tröpfchen. Wählen Ubuntu.
Sobald Sie sich registrieren, erhalten Sie 100 $ auf Ihr Konto. Aber lassen Sie sich nicht täuschen. Sie haben nur 60 Tage Zeit, es zu verbringen. Und das ist sehr wenig. Möglicherweise möchten Sie, wie ich, einen teureren Tarif nutzen, um später, wenn das echte Geld zu fließen beginnt, auf einen günstigeren Tarif umsteigen zu können. Ich sage Ihnen gleich, dass es nicht funktionieren wird. Sie können es erhöhen, aber nicht verringern. So geht es. ich wähle Normen->$5.
Ich wähle die Region, die uns am nächsten liegt XNUMX Frankfurt. VPC-Netzwerk->Standard-fra1
Wir führen umgehend eine Authentifizierung per SSH durch. Klicken Neuer SSH-Schlüssel. Wenn Sie kein SSH haben, finden Sie rechts eine sehr einfache Anleitung. Öffnen Sie ein Bash-Terminal und fügen Sie es 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. Jeder Name.Wir überlegen uns einen Hostnamen für das Droplet.
Klicken Droplet erstellen
Erstellen Sie einen neuen Benutzer
ssh root@[IP-адрес вашего дроплета]
- Sind Sie sicher, dass Sie die Verbindung fortsetzen möchten (Ja/Nein/[Fingerabdruck])?
yes
- Geben Sie Ihr SSH-Passwort ein
- Erstellen Sie einen Benutzer Laravel:
adduser laravel
- Geben Sie Ihr 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 neuen Benutzer
- Wechseln Sie zum neuen Benutzer:
su laravel
Wir führen alle weiteren Aktionen bis zum Ende des Artikels im Namen des Laravel-Benutzers durch. Wenn Sie also plötzlich unterbrochen werden, melden Sie sich erneut an und treten Sie ein su laravel
mkdir ~/.ssh
chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys
Wir haben die Datei in Vim geöffnet. Wenn Sie damit überhaupt nicht vertraut sind, können Sie in Nano arbeiten, das ist Ihr Recht.
Die grundlegendsten Vim-Befehle
Um den Vim-Editor im gesamten Artikel verwenden zu können, müssen Sie lediglich Folgendes wissen.
- Vim verfügt über verschiedene Modi: Normalmodus, in dem Sie Befehle eingeben und Modi auswählen und andere.
- Um einen beliebigen Modus zu verlassen und zum Normalmodus zurückzukehren, drücken Sie einfach
Esc
- Bewegen Sie sich: Sie können einfach Pfeile verwenden
- Beenden ohne Speichern
<Normal mode>
::q!
- Beenden und speichern
<Normal mode>
::wq
- Wechseln Sie in den Texteingabemodus
<Normal mode>
:i
(aus dem Englischen. einfügen)
- Wir geben unseren öffentlichen Schlüssel ein (was wir oben getan haben)
- Wir schützen vor Veränderungen:
chmod 600 ~/.ssh/authorized_keys
Installieren einer Firewall
- Schauen wir uns alle verfügbaren Einstellungen an:
sudo ufw app list
- OpenSSH zulassen (sonst werden wir gesperrt):
sudo ufw allow OpenSSH
- Starten wir die Firewall:
sudo ufw enable
,y
- Wir prüfen:
sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Alles ist in Ordnung.
Nginx installieren
Während der Installation werden Sie manchmal gefragt: „Sind Sie sicher?“ Antwort y
(Naja, nur wenn Sie sicher sind).
sudo apt update
sudo apt install nginx
Nginx zu den Firewall-Einstellungen hinzufügen
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)
Gehen Sie zu Ihrer IP. Wenn alles gut geht, sollten Sie Folgendes sehen.
MySQL installieren
sudo apt install mysql-server
- Starten eines automatischen Schutzskripts
sudo mysql_secure_installation
Beantworten Sie die gestellten Fragen. Wenn Sie nicht wissen, was Sie antworten sollen, finden Sie hier einige vorgeschlagene Optionen:
-
Plugin zur Passwortvalidierung -
N
-
Anonyme Benutzer entfernen? —
Y
-
Root-Anmeldung aus der Ferne verbieten? —
N
-
Testdatenbank entfernen und darauf zugreifen? —
N
-
Berechtigungstabellen jetzt neu laden? —
Y
-
Gehen wir zu MySQL:
sudo mysql
-
Schauen wir uns die Zugriffsmethoden an:
SELECT user,authentication_string,plugin,host FROM mysql.user;
-
Legen Sie ein Passwort für root fest:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';
-
Schauen wir uns noch einmal die Zugriffsmethoden an:
SELECT user,authentication_string,plugin,host FROM mysql.user;
-
Übernehmen Sie die Änderungen und beenden Sie MySQL:
FLUSH PRIVILEGES;
иexit
-
Um sich nun bei MySQL anzumelden, müssen Sie Folgendes verwenden
mysql -u root -p
und geben Sie das Passwort ein
PHP installieren
Verwenden wir ein Repository eines Drittanbieters von
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 lasst uns wählen. Für Laravel 7 können Sie PHP 7.3 oder 7.4 wählen. Der einzige Unterschied besteht in den Nummern 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) funktioniert mit PHP-Anfragen. MySQL natürlich für die Arbeit mit MySQL.
Ab jetzt werde ich alles auf 7.4 machen.
Nginx einrichten
sudo vim /etc/nginx/sites-available/<Ваш домен>
Geben Sie anstelle von „<Ihre Domain>“ die Domain ein (z. B. mysite.ru
), die Sie in Zukunft verwenden möchten. Wenn Sie noch keine haben, schreiben Sie welche und wiederholen Sie dann einfach die Schritte in diesem Kapitel für Ihre Domain, wenn Sie sie auswählen.
Gebe folgendes ein:
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;
}
}
Wenn Sie stattdessen Version 7.3 gewählt haben php7.4-fpm.sock
schreiben php7.4-fpm.sock
.
Hören Sie auf Port 80 server_name
wenn wir bei der Root-Anfrage ankommen /var/www/html
Nehmen Sie die Indexdatei. Wenn danach server_name
Da ist etwas, wir suchen eine solche Datei. Wenn wir es nicht finden, werfen wir 404 weg. Wenn es mit endet .php
, durchlaufen fpm
. Wenn es gibt .ht
, verbieten (403).
- Einen Link erstellen von
sites-available
вsites-enabled
:sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
- Entfernen des Links zu
default
:sudo unlink /etc/nginx/sites-enabled/default
- Auf Fehler prüfen:
sudo nginx -t
- Neustart:
sudo systemctl reload nginx
Überprüfung der Arbeit:
sudo vim /var/www/html/info.php
- Wir schreiben:
<?php phpinfo();
- Zum
<Ваш IP>/info.php
Sie sollten etwa Folgendes sehen:
Jetzt kann diese Datei gelöscht werden: sudo rm /var/www/html/info.php
Installieren Sie 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
-
Gehen wir zu MySQL:
mysql -u root -p
-
Erstellen Sie eine Datenbank mit dem Namen Laravel:
CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
-
Wir bieten Root-Zugriff auf Laravel:
GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>';
-
FLUSH PRIVILEGES;
-
exit
-
cd /var/www/html
-
Erstellen Sie einen Ordner für das Projekt:
sudo mkdir -p <Имя проекта>
-
Wir stellen dem Benutzer zur Verfügung Laravel Rechte am Projekt:
sudo chown laravel:laravel <Имя проекта>
Als nächstes müssen Sie das Projekt übertragen. Zum Beispiel Klonen von Github.
cd ./<Имя проекта>
git clone <ссылка на проект> .
Es ist zu bedenken, dass, wenn Sie keine statischen Dateien gespeichert haben (z. B. von /public
) auf Github, dann haben Sie sie natürlich nicht. Ich habe zum Beispiel einen separaten Thread erstellt, um dieses Problem zu lösen deploy
, von dem ich bereits geklont habe: git clone -b <имя ветки> --single-branch <ссылка на проект> .
.
- Abhängigkeiten installieren:
composer install
- Erstellen Sie .env:
vim .env
Die Grundversion davon 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=<Ваш пароль от MySQL>
Wenn Sie Ihre .env kopieren, ersetzen Sie APP_ENV durch Produktion, APP_DEBUG durch false und geben Sie die richtigen Einstellungen für MySQL ein.
- Migration der Datenbank:
php artisan migrate
- Generieren des Codes:
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
Als letztes müssen wir Nginx für Laravel neu 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 <Ваш домен или 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;
}
}
Wie beim letzten Mal, wenn Sie stattdessen Version 7.3 gewählt haben php7.4-fpm.sock
schreiben php7.4-fpm.sock
.
Einrichten einer Domain auf DigitalOcean
Eigentlich ist alles ganz einfach. Sie kaufen eine Domain (irgendwo) und wechseln zu DigitalOcean unter Erstellen->Domänen/DNS. оле Fügen Sie eine Domäne hinzu Sie geben diese Domain ein und klicken auf Hinzufügen. Gehen Sie dann zu den Domäneneinstellungen und zum Feld HOSTNAME eingeben @. Wählen Sie ein Projekt aus und klicken Sie Datensatz erstellen.
Gehen Sie nun auf die Seite, auf der Sie die Domain gekauft haben, suchen Sie dort nach „DNS-Servern“ (oder etwas Ähnlichem) und geben Sie die DigitalOcean-Server ein (nämlichns1.digitalocean.com
,ns2.digitalocean.com
,ns3.digitalocean.com
). Jetzt müssen Sie etwas (oder länger) warten, bis diese Einstellungen übernommen werden. Bereit!
Das einzige Problem besteht darin, dass Ihre Website nur als HTTP geöffnet wird. Um HTTPS zu verwenden, fahren Sie mit dem nächsten Teil fort.
HTTPS einrichten
Installieren Sie certbot und übergeben Sie ihm den Domänennamen (Format mysite.ru
) und Domainname 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/<Имя проекта>/public -d <Ваш домен> -d www.<Ваш домен>
Jetzt müssen Sie Nginx neu konfigurieren (vergessen Sie nicht, Ihre Werte zu ersetzen):
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;
}
}
Ich denke, Sie verstehen bereits, was für PHP 7.3 geändert werden muss.
Hier ist eigentlich alles einfach. Wir leiten einfach alle Anfragen von HTTP (Port 80) zu HTTPS (Port 443) um. Und dort machen wir alles wie zuvor, aber mit Verschlüsselung.
Jetzt müssen nur noch die Berechtigungen in der Firewall eingestellt werden:
sudo nginx -t
sudo ufw app list
sudo ufw allow 'Nginx HTTPS'
sudo ufw status
sudo systemctl reload nginx
Jetzt sollte alles so funktionieren, wie es soll.
[Erweitert] Node.js installieren
Wenn Sie plötzlich 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 war's, ich habe an diesem Punkt aufgehört. Grundsätzlich bin ich mit dem Ergebnis zufrieden. Vielleicht wechsle ich von DigitalOcean irgendwo näher an Russland und billiger. Da ich aber bereits alle Verifizierungsrunden auf der Seite durchlaufen hatte und alles dort gemacht habe, habe ich es ihnen anhand eines Beispiels gezeigt. Darüber hinaus ist der Startpreis von 100 US-Dollar ein hervorragendes Sprungbrett für das Training.
PS Besonderer Dank geht an den Autor
PPS Wenn Sie ein Top-Ingenieur sind, der in Bash-Befehlen denkt, urteilen Sie bitte nicht zu hart. Vielleicht finden Sie, dass dieser Artikel von niedrigem Niveau ist, aber ich hätte gerne einen gefunden, als ich ihn brauchte. Wenn es Verbesserungsvorschläge gibt, bin ich dafür.
Source: habr.com