This post is similar to Make and Unmake Sites, Automated with the difference that this is for a single-domain server created in Spinning up a single-domain web and email server.
Making a site in this version is a lot faster, as we already have the wildcard certificate for the domain we do not need to wait for CertBot to get a new one from Let’s Encrypt.
Let’s go over the sections of the script in detail first.
| 1 2 3 4 5 | #!/bin/bash RED='\033[0;31m' GREEN='\033[0;32m' CYAN='\033[0;36m' NC='\033[0m' # No Color | 
The above sets up our colors for the bash shell.
| 7 8 9 10 11 12 13 14 | domain=`cat /root/domain` echo -e "${CYAN}Enter the subdomain for the new site on $domain: ${NC}" read subdomain fqdn="$subdomain.$domain" folder="/var/www/$fqdn" echo -e "${CYAN}Creating root folder $folder{NC}" mkdir "$folder" echo -e "${GREEN}Done.${NC}" | 
We ask the user for the subdomain, and append that to the domain.
| 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | echo -e "${CYAN}Creating index file at $folder/index.html${NC}" cat > "$folder/index.html" <<EOF <!doctype html> <html lang="en-us">     <head>         <meta charset="utf-8">         <meta http-equiv="X-UA-Compatible" content="IE=edge">         <meta name="viewport" content="width=device-width, initial-scale=1">         <title>$fqdn</title>         <link href="https://fonts.googleapis.com/css?family=Raleway:100,600" rel="stylesheet" type="text/css">         <style>             html, body {background-color: #fff; color: #636b6f; font-family: 'Raleway', sans-serif; font-weight: 100; height: 100vh; margin: 0;}             .full-height {height: 100vh;}             .flex-center {align-items: center; display: flex; justify-content: center;}             .position-ref {position: relative;}             .top-right {position: absolute; right: 10px; top: 18px;}             .content {text-align: center;}             .title {font-size: 84px;}             .links > a {color: #636b6f;padding: 0 25px;font-size: 12px;font-weight: 600;letter-spacing: .1rem;text-decoration: none;text-transform: uppercase;}             .m-b-md {margin-bottom: 30px;}         </style>     </head>     <body>         <div class="flex-center position-ref full-height">             <div class="content">                 <div class="title m-b-md">$fqdn</div>             </div>         </div>     </body> </html> EOF chown www-data:www-data "$folder" echo -e "${GREEN}Done.${NC}" | 
Create the index.html file and set the ownership of the new folder to the www-data group.
| 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | echo -e "${CYAN}Writing config files${NC}" cat > "/etc/apache2/sites-available/$fqdn.conf" <<EOF <VirtualHost *:80>     DocumentRoot "$folder"     ServerName $fqdn     <Directory "$folder">         AllowOverride All         allow from all         Options +Indexes     </Directory>     RewriteEngine on     RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] </VirtualHost> EOF cat > "/etc/apache2/sites-available/$fqdn-le-ssl.conf" <<EOF <IfModule mod_ssl.c>     <VirtualHost *:443>         DocumentRoot "$folder"         ServerName $fqdn         <Directory "$folder">             AllowOverride All             allow from all             Options +Indexes         </Directory>         SSLCertificateFile /etc/letsencrypt/live/$domain/fullchain.pem         SSLCertificateKeyFile /etc/letsencrypt/live/$domain/privkey.pem         Include /etc/letsencrypt/options-ssl-apache.conf         Header always set Strict-Transport-Security "max-age=31536000"     </VirtualHost> </IfModule> EOF echo -e "${GREEN}Done.${NC}" | 
Make the two config files for Apache.  One for the http connection, and the other for https.  The http forwards to the https, and we use HSTS.
| 84 85 86 87 88 | echo -e "${CYAN}Calling Apache2 to enable $fqdn${NC}" a2ensite "$fqdn.conf" a2ensite "$fqdn-le-ssl.conf" service apache2 reload echo -e "${GREEN}Done.${NC}" | 
Finally we reload Apache to bring the new subdomain online.
Here is the full make-site.sh file
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | #!/bin/bash RED='\033[0;31m' GREEN='\033[0;32m' CYAN='\033[0;36m' NC='\033[0m' # No Color domain=`cat /root/domain` echo -e "${CYAN}Enter the subdomain for the new site on $domain: ${NC}" read subdomain fqdn="$subdomain.$domain" folder="/var/www/$fqdn" echo -e "${CYAN}Creating root folder $folder{NC}" mkdir "$folder" echo -e "${GREEN}Done.${NC}" echo -e "${CYAN}Creating index file at $folder/index.html${NC}" cat > "$folder/index.html" <<EOF <!doctype html> <html lang="en-us">     <head>         <meta charset="utf-8">         <meta http-equiv="X-UA-Compatible" content="IE=edge">         <meta name="viewport" content="width=device-width, initial-scale=1">         <title>$fqdn</title>         <link href="https://fonts.googleapis.com/css?family=Raleway:100,600" rel="stylesheet" type="text/css">         <style>             html, body {background-color: #fff; color: #636b6f; font-family: 'Raleway', sans-serif; font-weight: 100; height: 100vh; margin: 0;}             .full-height {height: 100vh;}             .flex-center {align-items: center; display: flex; justify-content: center;}             .position-ref {position: relative;}             .top-right {position: absolute; right: 10px; top: 18px;}             .content {text-align: center;}             .title {font-size: 84px;}             .links > a {color: #636b6f;padding: 0 25px;font-size: 12px;font-weight: 600;letter-spacing: .1rem;text-decoration: none;text-transform: uppercase;}             .m-b-md {margin-bottom: 30px;}         </style>     </head>     <body>         <div class="flex-center position-ref full-height">             <div class="content">                 <div class="title m-b-md">$fqdn</div>             </div>         </div>     </body> </html> EOF chown www-data:www-data "$folder" echo -e "${GREEN}Done.${NC}" echo -e "${CYAN}Writing config file $file${NC}" cat > "/etc/apache2/sites-available/$fqdn.conf" <<EOF <VirtualHost *:80>     DocumentRoot "$folder"     ServerName $fqdn     <Directory "$folder">         AllowOverride All         allow from all         Options +Indexes     </Directory>     RewriteEngine on     RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] </VirtualHost> EOF cat > "/etc/apache2/sites-available/$fqdn-le-ssl.conf" <<EOF <IfModule mod_ssl.c>     <VirtualHost *:443>         DocumentRoot "$folder"         ServerName $fqdn         <Directory "$folder">             AllowOverride All             allow from all             Options +Indexes         </Directory>         SSLCertificateFile /etc/letsencrypt/live/$domain/fullchain.pem         SSLCertificateKeyFile /etc/letsencrypt/live/$domain/privkey.pem         Include /etc/letsencrypt/options-ssl-apache.conf         Header always set Strict-Transport-Security "max-age=31536000"     </VirtualHost> </IfModule> EOF echo -e "${GREEN}Done.${NC}" echo -e "${CYAN}Calling Apache2 to enable $fqdn${NC}" a2ensite "$fqdn.conf" a2ensite "$fqdn-le-ssl.conf" service apache2 reload echo -e "${GREEN}Done.${NC}" | 
Removing the subdomain is super easy. We just delete the files and site root, after asking Apache to disable the subdomain.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #!/bin/bash RED='\033[0;31m' GREEN='\033[0;32m' CYAN='\033[0;36m' NC='\033[0m' # No Color domain=`cat /root/domain` echo -e "${CYAN}Enter the subdomain for the site on $domain to DELETE: ${NC}" read subdomain fqdn="$subdomain.$domain" folder="/var/www/$fqdn" echo -e "${CYAN}Calling Apache2 to disable $fqdn${NC}" a2dissite "$fqdn.conf" unlink "/etc/apache2/sites-available/$fqdn.conf" a2dissite "$fqdn-le-ssl.conf" unlink "/etc/apache2/sites-available/$fqdn-le-ssl.conf" echo -e "${GREEN}Done.${NC}" echo -e "${CYAN}Restarting Apache2.${NC}" service apache2 reload echo -e "${GREEN}Done.${NC}" echo -e "${CYAN}Deleting root folder $folder${NC}" rm -rf "$folder" echo -e "${GREEN}Done.${NC}" | 
The repository for this post can be found on GitLab here .
The repository for this post can be found on Lupe Code’s GitLab mirror here .
