#!/bin/bash
################################################################################
# Author: crombiecrunch
# Credit: appleboy ( appleboy.tw AT gmail.com)
# Web: www.my4x4.club
#
# Program:
# Install Pterodactyl-Panel on Ubuntu
#
################################################################################
clear
# get sever os name: ubuntu or centos
server_name=`lsb_release -ds | awk -F ' ' '{printf $1}' | tr A-Z a-z`
version_name=`lsb_release -cs`
usage() {
echo 'Usage: '$0' [-i|--install] [nginx] [apache]'
exit 1;
}
output() {
printf "\E[0;33;40m"
echo $1
printf "\E[0m"
}
displayErr() {
echo
echo $1;
echo
exit 1;
}
# get user input
server_setup() {
clear
output "Hope you enjoy this install script created by http://www.my4x4.club. Please enter the information below. "
read -p "Enter admin email (e.g. admin@example.com) : " EMAIL
read -p "Enter servername (e.g. portal.example.com) : " SERVNAME
read -p "Enter time zone (e.g. America/New_York) : " TIME
read -p "Portal password : " PORTALPASS
}
initial() {
output "Updating all packages"
# update package and upgrade Ubuntu
sudo apt-get -y update
sudo apt-get -y upgrade
sudo apt-get -y autoremove
output "Switching to Aptitude"
sudo apt-get -y install aptitude
sudo aptitude update -y
whoami=`whoami`
}
install_nginx() {
output "Installing Nginx server."
sudo aptitude -y install nginx
sudo service nginx start
sudo service cron start
}
install_apache() {
output "Installing Apache server."
sudo aptitude -y install apache2
sudo service apache2 start
sudo service cron start
}
install_mariadb() {
output "Installing Mariadb Server."
# create random password
rootpasswd=$(openssl rand -base64 12)
export DEBIAN_FRONTEND="noninteractive"
sudo aptitude -y install mariadb-server
# adding user to group, creating dir structure, setting permissions
sudo mkdir -p /var/www/pterodactyl/html
sudo chown -R $whoami:$whoami /var/www/pterodactyl/html
sudo chmod -R 775 /var/www/pterodactyl/html
}
install_dependencies() {
output "Installing PHP and Dependencies."
sudo aptitude -y install php7.0 php7.0-cli php7.0-gd php7.0-mysql php7.0-common php7.0-mbstring php7.0-tokenizer php7.0-bcmath php7.0-xml php7.0-fpm php7.0-curl
}
install_dependencies_apache() {
output "Installing PHP and Dependencies."
sudo aptitude -y install php7.0 php7.0-cli php7.0-gd php7.0-mysql php7.0-common php7.0-mbstring php7.0-tokenizer php7.0-bcmath php7.0-xml php7.0-fpm php7.0-curl libapache2-mod-php
}
install_timezone() {
output "Update default timezone."
output "Thanks for using this installation script. Donations welcome PayPal:support@my4x4.club"
# check if link file
sudo [ -L /etc/localtime ] && sudo unlink /etc/localtime
# update time zone
sudo ln -sf /usr/share/zoneinfo/$TIME /etc/localtime
sudo aptitude -y install ntpdate
sudo ntpdate time.stdtime.gov.tw
# write time to clock.
sudo hwclock -w
}
server() {
output "Installing Server Packages."
# installing more server files
sudo aptitude -y install curl
sudo aptitude -y install tar
sudo aptitude -y install unzip
sudo aptitude -y install git
sudo aptitude -y install python-pip
pip install --upgrade pip
sudo aptitude -y install supervisor
sudo aptitude -y install make
sudo aptitude -y install g++
sudo aptitude -y install python-minimal
sudo aptitude -y install gcc
sudo aptitude -y install libssl-dev
}
pterodactyl() {
output "Install Pterodactyl-Panel."
# Installing the Panel
cd /var/www/pterodactyl/html
curl -Lo v0.5.7.tar.gz https://github.com/Pterodactyl/Panel/archive/v0.5.7.tar.gz
tar --strip-components=1 -xzvf v0.5.7.tar.gz
sudo chmod -R 777 storage/* bootstrap/cache
curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
composer setup
# create mysql structure
# create database
password=`cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1`
Q1="CREATE DATABASE IF NOT EXISTS pterodactyl;"
Q2="GRANT ALL ON *.* TO 'panel'@'localhost' IDENTIFIED BY '$password';"
Q3="FLUSH PRIVILEGES;"
SQL="${Q1}${Q2}${Q3}"
sudo mysql -u root -p="" -e "$SQL"
output "Database 'pterodactyl' and user 'panel' created with password $password"
}
pterodactyl_1() {
clear
output "Environment Setup"
php artisan pterodactyl:env --dbhost=localhost --dbport=3306 --dbname=pterodactyl --dbuser=panel --dbpass=$password --url=http://$SERVNAME --timezone=$TIME
output "Mail Setup"
# php artisan pterodactyl:mail
output "Database Setup"
php artisan migrate --force
output "Seeding the database"
php artisan db:seed --force
output "Create First User"
php artisan pterodactyl:user --email="$EMAIL" --password=$PORTALPASS --admin=1
sudo service cron restart
sudo service supervisor start
output "Creating config files"
sudo bash -c 'cat > /etc/supervisor/conf.d/pterodactyl-worker.conf' <<-'EOF'
[program:pterodactyl-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/pterodactyl/html/artisan queue:work database --queue=high,standard,low --sleep=3 --tries=3
autostart=true
autorestart=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/pterodactyl/html/storage/logs/queue-worker.log
EOF
output "Updating Supervisor"
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start pterodactyl-worker:*
sudo systemctl enable supervisor.service
}
pterodactyl_niginx() {
output "Creating webserver initial config file"
echo '
server {
listen 80;
listen [::]:80;
server_name '"${SERVNAME}"';
root "/var/www/pterodactyl/html/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:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
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;
}
location ~ /.well-known {
allow all;
}
}
' | sudo -E tee /etc/nginx/sites-available/pterodactyl.conf >/dev/null 2>&1
sudo ln -s /etc/nginx/sites-available/pterodactyl.conf /etc/nginx/sites-enabled/pterodactyl.conf
output "Install LetsEncrypt and setting SSL"
sudo service nginx restart
sudo aptitude -y install letsencrypt
sudo letsencrypt certonly -a webroot --webroot-path=/var/www/pterodactyl/html/public --email "$EMAIL" --agree-tos -d "$SERVNAME"
sudo rm /etc/nginx/sites-available/pterodactyl.conf
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
echo '
server {
listen 80;
listen [::]:80;
server_name '"${SERVNAME}"';
# enforce https
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name '"${SERVNAME}"';
root /var/www/pterodactyl/html/public;
index index.php;
access_log /var/log/nginx/pterodactyl.app-accress.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;
# strengthen ssl security
ssl_certificate /etc/letsencrypt/live/'"${SERVNAME}"'/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/'"${SERVNAME}"'/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_dhparam /etc/ssl/certs/dhparam.pem;
# Add headers to serve security related headers
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'";
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
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;
}
}
' | sudo -E tee /etc/nginx/sites-available/pterodactyl.conf >/dev/null 2>&1
sudo service nginx restart
}
pterodactyl_apache() {
output "Creating webserver initial config file"
echo '
ServerName '"${SERVNAME}"'
DocumentRoot "/var/www/pterodactyl/html/public"
AllowEncodedSlashes On
AllowOverride all
' | sudo -E tee /etc/apache2/sites-available/pterodactyl.conf >/dev/null 2>&1
sudo ln -s /etc/apache2/sites-available/pterodactyl.conf /etc/apache2/sites-enabled/pterodactyl.conf
sudo a2enmod rewrite
sudo service apache2 restart
output "Install LetsEncrypt and setting SSL"
sudo aptitude -y install letsencrypt
sudo letsencrypt certonly -a webroot --webroot-path=/var/www/pterodactyl/html/public --email $EMAIL --agree-tos -d $SERVNAME
echo '
ServerName '"${SERVNAME}"'
DocumentRoot "/var/www/pterodactyl/html/public"
AllowEncodedSlashes On
AllowOverride all
NameVirtualHost *:443
=
DocumentRoot "/var/www/pterodactyl/html/public"
ServerName '"${SERVNAME}"'
AllowOverride all
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/'"${SERVNAME}"'/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/'"${SERVNAME}"'/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/'"${SERVNAME}"'/fullchain.pem
' | sudo -E tee /etc/apache2/sites-available/pterodactyl_ssl.conf >/dev/null 2>&1
sudo ln -s /etc/apache2/sites-available/pterodactyl_ssl.conf /etc/apache2/sites-enabled/pterodactyl_ssl.conf
sudo a2enmod ssl
sudo service apache2 restart
}
pterodactyl_daemon() {
output "Installing the daemon now! Almost done!!"
sudo aptitude -y install linux-image-extra-$(uname -r) linux-image-extra-virtual
sudo aptitude update -y
sudo aptitude upgrade -y
curl -sSL https://get.docker.com/ | sh
sudo usermod -aG docker $whoami
sudo systemctl enable docker
output "Installing Nodejs"
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
sudo aptitude -y install nodejs
output "Making sure we didnt miss any dependencies "
sudo aptitude -y install tar unzip make gcc g++ python-minimal
output "Ok really installing the daemon files now"
sudo mkdir -p /srv/daemon /srv/daemon-data
sudo chown -R $whoami:$whoami /srv/daemon
cd /srv/daemon
curl -Lo v0.3.7.tar.gz https://github.com/Pterodactyl/Daemon/archive/v0.3.7.tar.gz
tar --strip-components=1 -xzvf v0.3.7.tar.gz
npm install --only=production
output "This step requires you to create your first node through your panel, only continue after you get your core code"
output "Paste the code in the file and then hit CTRL + o then CTRL + x."
read -p "Press enter to continue" nothing
sudo nano /srv/daemon/config/core.json
sudo bash -c 'cat > /etc/systemd/system/wings.service' <<-EOF
[Unit]
Description=Pterodactyl Wings Daemon
After=docker.service
[Service]
User=root
#Group=some_group
WorkingDirectory=/srv/daemon
LimitNOFILE=4096
PIDFile=/var/run/wings/daemon.pid
ExecStart=/usr/bin/node /srv/daemon/src/index.js
Restart=on-failure
StartLimitInterval=600
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable wings
sudo systemctl start wings
sudo service wings start
sudo usermod -aG www-data $whoami
sudo chown -R www-data:www-data /var/www/pterodactyl/html
sudo chown -R www-data:www-data /srv/daemon
sudo chmod -R 775 /var/www/pterodactyl/html
sudo chmod -R 775 /srv/daemon
echo '
[client]
user=root
password='"${rootpasswd}"'
[mysql]
user=root
password='"${rootpasswd}"'
' | sudo -E tee ~/.my.cnf >/dev/null 2>&1
sudo chmod 0600 ~/.my.cnf
output "Setting mysql root password"
sudo mysqladmin -u root password $rootpasswd
(crontab -l ; echo "* * * * * php /var/www/pterodactyl/html/artisan schedule:run >> /dev/null 2>&1")| crontab -
output "Please reboot your server to apply new permissions"
}
# Process command line...
while [ $# -gt 0 ]; do
case $1 in
--help | -h)
usage $0
;;
--install | -i)
shift
action=$1
shift
;;
*)
usage $0
;;
esac
done
test -z $action && usage $0
case $action in
"nginx")
server_setup
initial
install_nginx
install_mariadb
install_dependencies
install_timezone
server
pterodactyl
pterodactyl_1
pterodactyl_niginx
pterodactyl_daemon
;;
"apache")
server_setup
initial
install_apache
install_mariadb
install_dependencies_apache
install_timezone
server
pterodactyl
pterodactyl_1
pterodactyl_apache
pterodactyl_daemon
;;
*)
usage $0
;;
esac
exit 1;