Установка Pterodactyl на Debian 10, часть 2

Этап 2

На предыдущем этапе мы сделали первоначальную настройку панели. Теперь настроим веб-сервер.
Вам следует удалить конфигурацию Apache или NGINX по умолчанию, поскольку она по умолчанию раскрывает секреты приложений злоумышленникам.
При использовании конфигурации SSL вы ДОЛЖНЫ создать сертификаты SSL, иначе ваш веб-сервер не запустится.
Для начала мы установим certbot, простой скрипт, который автоматически обновит сертификаты и позволит создавать их более аккуратно. Приведенная ниже команда предназначена для дистрибутивов Ubuntu, но вы всегда можете проверить официальный сайт Certbot для получения инструкций по установке. Я также включил команду ниже для установки плагина Certbot NGINX / Apache, чтобы вам не пришлось останавливать свой веб-сервер.
sudo apt update
sudo apt install -y certbot
# Запустите это, если вы используете Nginx
sudo apt install -y python3-certbot-nginx
# Запустите это, если вы используете Apache
sudo apt install -y python3-certbot-apache
После установки certbot нам нужно сгенерировать сертификат. Есть несколько способов сделать это, но самый простой — использовать только что установленный плагин certbot для конкретного веб-сервера.
Затем в приведенной ниже команде вы должны заменить example.com доменом, для которого вы хотите сгенерировать сертификат. Если у вас есть несколько доменов, для которых вы хотите получить сертификаты, просто добавьте в команду дополнительные флаги -d anotherdomain.com. Вы также можете изучить возможность создания подстановочного сертификата, но это не рассматривается в этом руководстве.
Поскольку мы используем плагин Certbot NGINX / Apache, вам не нужно перезапускать веб-сервер, чтобы применить сертификат (при условии, что вы уже настроили веб-серверы для использования SSL).
# Nginx
certbot certonly --nginx -d example.com
# Apache
certbot certonly --apache -d example.com
# Автономный - используйте, если ни один из них не работает. Обязательно сначала остановите свой веб-сервер при использовании этого метода.
certbot certonly --standalone -d example.com
Вы также, вероятно, захотите настроить автоматическое продление, добавив приведенную ниже команду в задание cron, которое выполняется ежедневно.
certbot renew
Если при попытке доступа к панели вы получаете сообщение о небезопасном соединении или связанную с ним ошибку, вероятно, срок действия сертификата SSL истек. Это можно легко исправить, обновив сертификат SSL, хотя использование команды certbot Renew не поможет. Так как это приведет к ошибке, например: Ошибка: при попытке обновить сертификат (домен) из /etc/letsencrypt/renew/domain.conf возникла непредвиденная ошибка. Это произойдет, особенно если вы используете NGINX вместо Apache. Решение — остановить NGINX, затем обновить сертификат и, наконец, перезапустить NGINX.
Остановите NGINX:
systemctl stop nginx
Продлите сертификат:
certbot renew
После завершения процесса вы можете перезапустить службу NGINX:
systemctl start nginx
Вы должны вставить содержимое файла ниже, заменив на ваше доменное имя, используемое в файле pterodactyl.conf, и поместить его в /etc/nginx/sites-available/, или — если в CentOS, /etc/nginx/conf.d/

NGINX без SSL

server {
listen 80;
server_name <domain>;

root /var/www/pterodactyl/public;
index index.html index.htm index.php;
charset utf-8;

location / {
try_files $uri $uri/ /index.php?$query_string;
}

location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }

access_log off;
error_log /var/log/nginx/pterodactyl.app-error.log error;

# allow larger file uploads and longer script runtimes
client_max_body_size 100m;
client_body_timeout 120s;

sendfile off;

location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.0-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PHP_VALUE "upload_max_filesize = 100M \n post_max_size=100M";
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTP_PROXY "";
fastcgi_intercept_errors off;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
}

location ~ /\.ht {
deny all;
}
}

NGINX с SSL

server_tokens off;

server {
listen 80;
server_name <domain>;
return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl http2;
server_name <domain>;

root /var/www/pterodactyl/public;
index index.php;

access_log /var/log/nginx/pterodactyl.app-access.log;
error_log /var/log/nginx/pterodactyl.app-error.log error;

# allow larger file uploads and longer script runtimes
client_max_body_size 100m;
client_body_timeout 120s;

sendfile off;

# SSL Configuration
ssl_certificate /etc/letsencrypt/live/<domain>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<domain>/privkey.pem;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
ssl_prefer_server_ciphers on;

# See https://hstspreload.org/ before uncommenting the line below.
# add_header Strict-Transport-Security "max-age=15768000; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header Content-Security-Policy "frame-ancestors 'self'";
add_header X-Frame-Options DENY;
add_header Referrer-Policy same-origin;

location / {
try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.0-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PHP_VALUE "upload_max_filesize = 100M \n post_max_size=100M";
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTP_PROXY "";
fastcgi_intercept_errors off;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
include /etc/nginx/fastcgi_params;
}

location ~ /\.ht {
deny all;
}
}

Apache2 без SSL

<VirtualHost *:80>
ServerName <domain>
DocumentRoot "/var/www/pterodactyl/public"
AllowEncodedSlashes On
php_value upload_max_filesize 100M
php_value post_max_size 100M
<Directory "/var/www/pterodactyl/public">
AllowOverride all
</Directory>
</VirtualHost>

Apache2 с SSL

<VirtualHost *:80>
ServerName <domain>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
</VirtualHost>
<VirtualHost *:443>
ServerName <domain>
DocumentRoot "/var/www/pterodactyl/public"
AllowEncodedSlashes On
php_value upload_max_filesize 100M
php_value post_max_size 100M
<Directory "/var/www/pterodactyl/public">
Require all granted
AllowOverride all
</Directory>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/<domain>/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/<domain>/privkey.pem
</VirtualHost>
После того, как вы создали файл выше, просто выполните приведенные ниже команды. Если вы используете CentOS, вам не нужно выполнять приведенные ниже команды! Вам нужно только запустить systemctl restart httpd.
# Вам не нужно запускать какие-либо из этих команд в CentOS
sudo ln -s /etc/apache2/sites-available/pterodactyl.conf /etc/apache2/sites-enabled/pterodactyl.conf
sudo a2enmod rewrite
systemctl restart apache2

Установка Pterodactyl на Debian 10, часть 1

Этап 1

1. Установите PHP 8.
2. Установите Composer:
Composer — это менеджер зависимостей для PHP, который позволяет нам поставлять все, что вам понадобится для работы с панелью. Перед продолжением этого процесса вам понадобится установленный Composer.
curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
3. Операции с файлами:
Первый шаг в этом процессе — создать папку, в которой будет располагаться панель, а затем переместиться в эту вновь созданную папку. Ниже приведен пример того, как выполнить эту операцию.
mkdir -p /var/www/pterodactyl
cd /var/www/pterodactyl
После того, как вы создали новый каталог для Panel и переместились в него, вам нужно будет загрузить файлы Panel. Это так же просто, как использовать curl для загрузки предварительно упакованного контента. После загрузки вам нужно будет распаковать архив и затем установить правильные разрешения для директорий storage/ и bootstrap/cache/. Эти каталоги позволяют нам хранить файлы, а также поддерживать быстрый кеш, чтобы сократить время загрузки.
curl -Lo panel.tar.gz https://github.com/pterodactyl/panel/releases/latest/download/panel.tar.gz
tar -xzvf panel.tar.gz
chmod -R 755 storage/* bootstrap/cache/
Теперь, когда все файлы загружены, нам нужно настроить некоторые основные аспекты панели.

4. Конфигурация базы

Прежде чем продолжить, вам потребуется настройка базы данных и пользователь с соответствующими разрешениями, созданными для этой базы данных.
Первым шагом в этом процессе является вход в командную строку MySQL, где мы будем выполнять некоторые инструкции для настройки. Для этого просто выполните приведенную ниже команду и укажите пароль учетной записи Root MySQL, который вы установили при установке MySQL. Если вы не помните, что делали это, скорее всего, вы можете просто нажать Enter, поскольку пароль не установлен.
mysql -u root -p
В целях безопасности и из-за изменений в MySQL 5.7 вам необходимо создать нового пользователя для панели. Для этого мы сначала хотим указать MySQL использовать базу данных mysql, в которой хранится такая информация.
Затем мы создадим пользователя с именем pterodactyl и разрешим вход в систему с localhost, что предотвратит любые внешние подключения к базе данных. Вы также можете использовать % в качестве подстановочного знака или ввести числовой IP-адрес. Мы также установим пароль учетной записи somePassword. Смените somePassword на свой пароль.
USE mysql;
CREATE USER 'pterodactyl'@'127.0.0.1' IDENTIFIED BY 'somePassword';
Далее нам нужно создать базу данных для панели. В этом уроке мы будем называть базу данных panel, но вы можете заменить, ее каким-то именем, которое вы хотите.
CREATE DATABASE panel;
Наконец, нам нужно сообщить MySQL, что наш пользователь-птеродактиль должен иметь доступ к базе данных панели. Для этого просто запустите команду ниже. Если вы планируете также использовать этот экземпляр MySQL в качестве хоста базы данных на Panel, вы захотите включить опцию WITH GRANT OPTION (что мы и делаем здесь). Если вы не будете использовать этого пользователя как часть настройки хоста, вы можете удалить его.
GRANT ALL PRIVILEGES ON panel.* TO 'pterodactyl'@'127.0.0.1' WITH GRANT OPTION;
FLUSH PRIVILEGES;
Если ваша база данных находится на другом хосте, чем тот, на котором установлена ваша панель или демон, убедитесь, что вы используете IP-адрес машины, на которой работает Panel. Если вы используете 127.0.0.1 и попытаетесь подключиться извне, вы получите сообщение об ошибке в соединении.
USE mysql;
# username - логин пользователя; password - ваш пароль
CREATE USER 'pterodactyluser'@'127.0.0.1' IDENTIFIED BY 'somepassword';
Приведенная ниже команда даст вашему вновь созданному пользователю возможность создавать дополнительных пользователей, а также создавать и уничтожать базы данных. Как указано выше, убедитесь, что 127.0.0.1 совпадает с IP-адресом, который вы использовали в предыдущей команде.
GRANT ALL PRIVILEGES ON *.* TO 'pterodactyluser'@'127.0.0.1' WITH GRANT OPTION;
FLUSH PRIVILEGES;
Скорее всего, вам потребуется разрешить внешний доступ к этому экземпляру MySQL, чтобы серверы могли подключаться к нему. Для этого откройте my.cnf, расположение которого зависит от вашей ОС и способа установки MySQL. Вы можете ввести команду в терминал find / etc -iname my.cnf, чтобы найти его.
Откройте my.cnf, добавьте текст внизу в конец файла и сохраните его:
[mysqld]
bind-address=0.0.0.0
Перезапустите MySQL / MariaDB, чтобы применить эти изменения. Это переопределит конфигурацию MySQL по умолчанию, которая по умолчанию будет принимать запросы только от localhost. Обновление позволит подключаться ко всем интерфейсам и, следовательно, к внешним подключениям. Обязательно разрешите порт MySQL (по умолчанию 3306) в вашем брандмауэре.
Если ваша база данных и Wings находятся на одном компьютере и не требуют внешнего доступа, вы также можете использовать IP-адрес интерфейса docker0, а не 127.0.0.1. Этот IP-адрес можно найти, запустив ip addr | grep docker0, и он, скорее всего, выглядит как 172.x.x.x.

5. Конфигурация панели

Сначала мы скопируем наш файл настроек среды по умолчанию, установим основные зависимости, а затем сгенерируем новый ключ шифрования приложения.
cp .env.example .env
composer install --no-dev --optimize-autoloader
# Выполняйте приведенную ниже команду только в том случае, если вы устанавливаете
# эту панель впервые и у вас нет данных панели Pterodactyl в базе данных.
php artisan key:generate --force
Создайте резервную копию ключа шифрования (APP_KEY в файле .env). Он используется в качестве ключа шифрования для всех данных, которые необходимо надежно хранить (например, ключей API). Храните его в безопасном месте, а не только на сервере. Если вы потеряете его, все зашифрованные данные невозможно будет восстановить, даже если у вас есть резервные копии базы данных.
Базовая среда Pterodactyl легко настраивается с помощью нескольких различных команд интерфейса командной строки, встроенных в приложение. Этот шаг будет охватывать настройку таких вещей, как сеансы, кеширование, учетные данные базы данных и отправка электронной почты.
php artisan p:environment:setup
php artisan p:environment:database
# Чтобы использовать внутреннюю отправку почты PHP (не рекомендуется),
# выберите «mail». Чтобы использовать собственный SMTP-сервер, выберите «smtp».
php artisan p:environment:mail
Теперь нам нужно настроить все базовые данные для Panel в базе данных, которую вы создали ранее. Выполнение приведенной ниже команды может занять некоторое время в зависимости от вашего компьютера. Пожалуйста, НЕ выходите из процесса, пока он не будет завершен! Эта команда настроит таблицы базы данных, а затем добавит все гнезда и яйца, питающие птеродактиля.
php artisan migrate --seed --force
Затем вам нужно будет создать пользователя с правами администратора, чтобы вы могли войти в панель. Для этого выполните команду ниже. В настоящее время пароли должны соответствовать следующим требованиям: 8 символов, смешанный регистр, хотя бы одна цифра.
php artisan p:user:make
Последний шаг в процессе установки — установить правильные разрешения для файлов панели, чтобы веб-сервер мог их правильно использовать.
# При использовании NGINX или Apache (не в CentOS):
chown -R www-dаta:www-data /var/www/pterodactyl/*
# При использовании NGINX в CentOS:
chown -R nginx:nginx /var/www/pterodactyl/*
# Если вы используете Apache на CentOS
chown -R apache:apache /var/www/pterodactyl/*
Pterodactyl использует очереди, чтобы ускорить приложение и обрабатывать отправку электронных писем и другие действия в фоновом режиме. Вам нужно будет настроить обработчика очереди для обработки этих действий.
Первое, что нам нужно сделать, это создать новое задание cron, которое запускается каждую минуту для обработки определенных задач Pterodactyl, таких как очистка сеанса и отправка запланированных задач демонам. Вы захотите открыть свой crontab с помощью sudo crontab -e, а затем вставьте строку ниже.
* * * * * php /var/www/pterodactyl/artisan schedule:run >> /dev/null 2>&1
Затем вам нужно создать нового рабочего systemd, чтобы наш процесс очереди работал в фоновом режиме. Эта очередь отвечает за отправку электронных писем и выполнение многих других фоновых задач для Pterodactyl.
Создайте файл pteroq.service в /etc/systemd/system со следующим содержимым.
# Pterodactyl Queue Worker File
# ----------------------------------

[Unit]
Description=Pterodactyl Queue Worker
After=redis-server.service

[Service]
# В некоторых системах пользователь и группа могут отличаться.
# Некоторые системы используют apache или nginx в качестве пользователя и группы.
User=www-data
Group=www-data
Restart=always
ExecStart=/usr/bin/php /var/www/pterodactyl/artisan queue:work --queue=high,standard,low --sleep=3 --tries=3

[Install]
WantedBy=multi-user.target
Если вы используете CentOS, вам нужно будет заменить redis-server.service на redis.service в строке After=, чтобы обеспечить запуск redis до того, как заработает обработчик очереди.
Если вы ни для чего не используете redis, вам следует удалить строку After =, иначе вы столкнетесь с ошибками при запуске службы.
Если вы используете Redis для своей системы, вам нужно обязательно включить его запуск при загрузке. Вы можете сделать это, выполнив следующую команду:
sudo systemctl enable --now redis-server
Наконец, включите службу и установите ее для загрузки при запуске машины.
sudo systemctl enable --now pteroq.service