#!/bin/bash set -e # Terminate if script has error #################################################################### # Variables used #################################################################### sitedir="" fqn="" sdub="" myip="" cftoken="" cfmail="" webmail="" servername="" vhostserver="" myip="$(curl ipecho.net/plain; echo)" #################################################################### # Query for location #################################################################### printf " #################################################################### # Enter location on disk for site (Default: /var/www/\$fqn): ####################################################################\n dir: " read -rp "" sitedir #################################################################### # Query for FQN #################################################################### printf " #################################################################### # Enter FQN for website: ####################################################################\n fqn: " read -rp "" fqn #################################################################### # Query for subdomain #################################################################### printf " #################################################################### # Enter subdomain for FQN: ####################################################################\n sub: " read -rp "" sub #################################################################### # Query for webmaster mail address #################################################################### printf " #################################################################### # Enter webmaster mail address for site: (Default: webmaster@\$fqn) ####################################################################\n webmaster: " read -rp "" webmail #################################################################### # Query non-root user credentials #################################################################### printf " #################################################################### # Enter CLOUDFLARE-TOKEN: ####################################################################\n cftoken: " read -rp "" cftoken #################################################################### # Query non-root user credentials #################################################################### printf " #################################################################### # Enter CLOUDFLARE-mail: ####################################################################\n cfmail: " read -rp "" cfmail #################################################################### # setting defaults #################################################################### # sitedir if [ -n "$sitedir" ]; then if [ ${sitedir:+1} ] then echo "yes" fi else sitedir="/var/www/$fqn" fi # webmaster mail if [ -n "$webmail" ]; then if [ ${webmail:+1} ] then echo "yes" fi else webmail=webmaster@$fqn fi # servername if [ -n "$sub" ]; then servername="server_name $sub.$fqn www.$sub.$fqn;" vhostserver="ServerName $sub.$fqn ServerAlias www.$sub.$fqn" else servername="server_name $fqn www.$fqn;" vhostserver="ServerName $fqn ServerAlias www.$fqn" fi #################################################################### # Enable basic firewall rules #################################################################### ufw allow OpenSSH ufw enable #################################################################### # Install required software #################################################################### apt update apt -y upgrade # EXA wget -c http://old-releases.ubuntu.com/ubuntu/pool/universe/r/rust-exa/exa_0.9.0-4_amd64.deb apt-get install ./exa_0.9.0-4_amd64.deb # basics apt -y install tree gnupg2 git net-tools original-awk fzf silversearcher-ag unzip pkg-config \ openssl apache2 php-fpm php-xml libtool # fastcgi for apache2 wget https://mirrors.edge.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb dpkg -i libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb #################################################################### # setup of apache2 #################################################################### # set apache listening on loopback for ipv4 only mv /etc/apache2/ports.conf /etc/apache2/ports.conf.default echo "Listen 0.0.0.0:8080" | tee /etc/apache2/ports.conf # make working dir for server mkdir -v $sitedir # disable factory defaults a2dissite 000-default # configure apache for use of mod_fastcgi a2enmod actions a2enmod proxy_fcgi setenvif systemctl restart apache2 a2enconf php7.4-fpm systemctl reload apache2 # backup default fastcgi.conf mv /etc/apache2/mods-enabled/fastcgi.conf /etc/apache2/mods-enabled/fastcgi.conf.default # setting new defaults for fastcgi cat << EOF > /etc/apache2/mods-enabled/fastcgi.conf AddHandler fastcgi-script .fcgi FastCgiIpcDir /var/lib/apache2/fastcgi AddType application/x-httpd-fastphp .php Action application/x-httpd-fastphp /php-fcgi Alias /php-fcgi /usr/lib/cgi-bin/php-fcgi FastCgiExternalServer /usr/lib/cgi-bin/php-fcgi -socket /run/php/php7.4-fpm.sock -pass-header Authorization Require all granted EOF systemctl restart apache2 # create a php-info page - to be removed before production echo "" | tee /var/www/$fqn/info.php # adjust ufw ufw allow 8080 ufw allow "Apache Full" # mod_rpaf to get visitors real IP through cloudflare and reverse proxy apt -y install build-essential apache2-dev libtool-bin wget https://github.com/gnif/mod_rpaf/archive/stable.zip unzip stable.zip && cd mod_rpaf-stable make && make install && libtool --finish /usr/lib/apache2/modules touch /etc/apache2/mods-available/rpaf.load echo 'LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so' >> /etc/apache2/mods-available/rpaf.load a2enmod rpaf systemctl restart apache2 # Set defaults for virtual host cat << EOF > /etc/apache2/sites-available/$fqn.conf $vhostserver ServerAdmin $webmail DocumentRoot $sitedir RPAF_Enable On RPAF_SetHostName On RPAF_ProxyIPs $myip RPAF_Header CF-CONNECTING-IP # Log format config LogFormat "%{CF-CONNECTING-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" forwarded CustomLog "/var/log/apache2/$fqn.access.log" forwarded ErrorLog /var/log/apache2/$fqn.error.log AllowOverride All EOF a2ensite $fqn.conf systemctl restart apache2 # get SSL certificates by certbot apt-get -y install python3-certbot-dns-cloudflare # setup CF credentials mkdir /root/.secrets/ && touch /root/.secrets/cloudflare.ini echo "dns_cloudflare_email=$cfmail" >> /root/.secrets/cloudflare.ini echo "dns_cloudflare_api_key=$cftoken" >> /root/.secrets/cloudflare.ini chmod 0700 /root/.secrets/ chmod 0400 /root/.secrets/cloudflare.ini # go certbot certonly --agree-tos --no-eff-email --email \ $webmail --dns-cloudflare --dns-cloudflare-credentials \ /root/.secrets/cloudflare.ini -d $fqn,*.$fqn --preferred-challenges dns-01 #################################################################### # nginx setup #################################################################### apt -y install nginx # remove default rm /etc/nginx/sites-enabled/default # setup new defaults cat << EOF > /etc/nginx/sites-available/apache server { listen 80; $servername location / { return 301 https://\$host\$request_uri; } } server { listen 443 ssl http2; $servername location / { proxy_pass http://$myip:8080; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto \$scheme; proxy_read_timeout 600; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; client_max_body_size 100M; } location ~ /\.ht { deny all; } ssl_certificate /etc/letsencrypt/live/$fqn/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/$fqn/privkey.pem; ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; ssl_prefer_server_ciphers on; ssl_dhparam /usr/lib/python3/dist-packages/certbot/ssl-dhparams.pem; access_log /var/log/nginx/$fqn.access.log; error_log /var/log/nginx/$fqn.error.log; } EOF # activate new settings ln -s /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache systemctl restart nginx #################################################################### # nginx setup #################################################################### # place files for new site in their dir tar -xvf /home/ts/site.tar.gz -C $sitedir