UNPKG

@boostbank/pterodactyl-installer

Version:
123 lines (104 loc) 5.89 kB
const { sh } = require("../../tools/process-runner"); const Command = require("../../models/Command"); const CommandParser = require("../../tools/CommandParser"); const WebServerHelp = require("./help/WebServerHelp"); const generator = require('random-password'); const fs = require('fs'); const parseFlags = require("./../../tools/flags-parser"); const commands = new CommandParser([new WebServerHelp()]); const usage = ` pti webserver - Sets up Pterodactyl WebServer `; class WebServer extends Command { constructor() { super("webserver", usage); } async runCommand(args) { if (commands.hasCommand(args)) { commands.findAndRun(args); } else { try { const flags = parseFlags(args); console.title("Setting up Web Server..."); const domain = flags.hasFlag("domain") ? flags.getFlag("domain") : "none"; if(domain === "none"){ console.printError("Must have domain passed to this command. Ex: sudo pti webserver -domain=sub.test.com"); process.exit(1); }else{ console.title(`Using domain: ${domain}`) await sh("apt install -y certbot"); await sh("apt install -y python3-certbot-nginx") await sh(`certbot certonly --force-interactive --nginx -d ${domain}`) // do crontab for renew. await sh(`(crontab -u root -l ; echo "0 0 1 * * certbot renew >> /dev/null 2>&1") | crontab -u root -`) await sh("crontab -u root -l"); const site = ` 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; } }` fs.writeFileSync("/etc/nginx/sites-available/pterodactyl.conf", site); fs.unlinkSync("/etc/nginx/sites-available/default"); fs.writeFileSync("/etc/nginx/sites-available/default", ""); await sh("ln -s /etc/nginx/sites-available/pterodactyl.conf /etc/nginx/sites-enabled/pterodactyl.conf"); await sh("systemctl restart nginx"); } } catch (e) { console.printError(e); } } } } module.exports = WebServer;