Skip to content

Instantly share code, notes, and snippets.

@ginmaster
Created May 30, 2022 06:14
Show Gist options
  • Save ginmaster/d5e35d0f3769cda4d675db521d68a76e to your computer and use it in GitHub Desktop.
Save ginmaster/d5e35d0f3769cda4d675db521d68a76e to your computer and use it in GitHub Desktop.

Revisions

  1. ginmaster created this gist May 30, 2022.
    318 changes: 318 additions & 0 deletions setup.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,318 @@
    #!/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
    <IfModule mod_fastcgi.c>
    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
    <Directory /usr/lib/cgi-bin>
    Require all granted
    </Directory>
    </IfModule>
    EOF
    systemctl restart apache2

    # create a php-info page - to be removed before production
    echo "<?php phpinfo(); ?>" | 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
    <VirtualHost *:8080>
    $vhostserver
    ServerAdmin $webmail
    DocumentRoot $sitedir
    <IfModule rpaf_module>
    RPAF_Enable On
    RPAF_SetHostName On
    RPAF_ProxyIPs $myip
    RPAF_Header CF-CONNECTING-IP
    </IfModule>
    # 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
    <Directory $sitedir>
    AllowOverride All
    </Directory>
    </VirtualHost>
    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