You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
215 lines
6.4 KiB
215 lines
6.4 KiB
3 years ago
|
#!/bin/bash
|
||
|
|
||
|
# Downloads and configures Wordpress onto the current system
|
||
|
# Zen, 2022
|
||
|
|
||
|
# Font decoration for better a e s t h e t i c
|
||
|
RED="\e[0;91m"
|
||
|
GREEN="\e[0;92m"
|
||
|
BLUE="\e[0;94m"
|
||
|
BOLD="\e[1m"
|
||
|
ULINE="\e[4m"
|
||
|
NC="\e[0m"
|
||
|
|
||
|
# ------------------- Step 1 - Installing / Configuring MariaDB -------------------
|
||
|
|
||
3 years ago
|
if [ -f "/etc/debian_version" ]; then
|
||
|
DISTRO="debian"
|
||
|
echo "Debian, Ubuntu, or Raspbian OS detected."
|
||
|
elif [ -f "/etc/arch-release" ]; then
|
||
|
DISTRO="arch"
|
||
|
echo "Arch- or Manjaro-based OS detected."
|
||
|
elif [ $(uname | grep -c "Darwin") -eq 1 ]; then
|
||
|
DISTRO="mac"
|
||
|
echo "MacOS detected."
|
||
|
else
|
||
|
echo "I don't know what OS you're running! Cancelling this operation."
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
echo ""
|
||
3 years ago
|
|
||
|
install_if_needed() {
|
||
|
for package in "$@"
|
||
|
do
|
||
|
if [ -z $(which $package) ]; then
|
||
|
echo "installing" $package
|
||
|
|
||
|
case $DISTRO in
|
||
|
"debian")
|
||
|
sudo apt install -y $package
|
||
|
;;
|
||
|
"arch")
|
||
|
sudo pacman -S $package
|
||
|
;;
|
||
|
"mac")
|
||
|
brew install $package
|
||
|
;;
|
||
|
esac
|
||
|
|
||
|
else
|
||
|
echo $package 'already installed!'
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
}
|
||
|
|
||
|
install_if_needed mariadb-server php php-fpm php-mysql nginx
|
||
|
|
||
|
echo ""
|
||
|
|
||
|
read -p "Do you want to secure the database for production deployment? (y/n): " -n1 boot
|
||
|
echo ""
|
||
|
case $boot in
|
||
|
y | Y)
|
||
|
echo "Securing database..."
|
||
|
sudo mysql_secure_installation
|
||
|
;;
|
||
|
esac
|
||
|
echo ""
|
||
|
|
||
|
MATCH=0
|
||
|
while [[ MATCH -eq 0 ]]; do
|
||
|
read -sp "Enter the password that you would like to use for MariaDB: " pass
|
||
|
echo ""
|
||
|
read -sp "Please confirm your password: " pass2
|
||
|
echo ""
|
||
|
if [[ "$pass" == "$pass2" ]]; then
|
||
|
MATCH=1
|
||
|
sudo mariadb -e "CREATE DATABASE wordpress;"
|
||
|
sudo mariadb -e "GRANT ALL ON wordpress.* TO '${USER}'@'localhost' IDENTIFIED BY '${pass}' WITH GRANT OPTION;"
|
||
|
sudo mariadb -e "FLUSH PRIVILEGES;"
|
||
3 years ago
|
else
|
||
3 years ago
|
echo "Passwords did not match :("
|
||
|
echo ""
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
# ------------------- Step 2 - Downloading / Configuring WordPress -------------------
|
||
|
|
||
|
if [[ -e 'resources/wordpress.tar.gz' ]]; then
|
||
|
echo "Wordpress already downloaded!"
|
||
|
else
|
||
|
echo -e "${ULINE}Downloading Wordpress...${NC}"
|
||
|
curl -o resources/wordpress.tar.gz 'https://wordpress.org/latest.tar.gz'
|
||
|
fi
|
||
|
|
||
|
WP_DIR=""
|
||
|
while [[ -z $WP_DIR ]]; do
|
||
|
echo ""
|
||
|
echo "Where would you like to place the wordpress directory? Enter a path or leave blank for $HOME: "
|
||
|
read -e WP_DIR
|
||
|
|
||
|
if [[ -z $WP_DIR ]]; then
|
||
|
WP_DIR=$HOME
|
||
|
fi
|
||
|
|
||
|
if [[ -d $WP_DIR ]]; then
|
||
|
echo "Saving to $WP_DIR"
|
||
|
else
|
||
|
echo ""
|
||
|
echo "Sorry, $WP_DIR doesn't seem like a valid directory to me..."
|
||
|
WP_DIR=""
|
||
|
echo "$WP_DIR"
|
||
|
fi
|
||
|
done
|
||
|
|
||
3 years ago
|
if [[ -z $(ls -A $WP_DIR/wordpress) ]]; then
|
||
3 years ago
|
tar -xzvf resources/wordpress.tar.gz --directory $WP_DIR
|
||
|
echo "Wordpress has been extracted to $WP_DIR"!
|
||
|
else
|
||
|
echo "Oh! It's already there."
|
||
|
fi
|
||
|
|
||
|
echo ""
|
||
|
echo "Configuring wordpress..."
|
||
|
cp $WP_DIR/wordpress/wp-config-sample.php $WP_DIR/wordpress/wp-config.php
|
||
|
sed -i 's/database_name_here/wordpress/' $WP_DIR/wordpress/wp-config.php
|
||
|
sed -i "s/username_here/${USER}/" $WP_DIR/wordpress/wp-config.php
|
||
|
sed -i "s/password_here/${pass}/" $WP_DIR/wordpress/wp-config.php
|
||
|
|
||
|
# while this phrase exists, replace it with a seed phrase
|
||
|
while grep -q 'put your unique phrase here' $WP_DIR/wordpress/wp-config.php; do
|
||
|
SEED=$(echo $RANDOM | md5sum | awk {'print $1'})
|
||
|
sed -i "0,/put your unique phrase here/s//${SEED}/" $WP_DIR/wordpress/wp-config.php
|
||
|
done
|
||
|
echo "Done!"
|
||
|
|
||
|
# ------------------- Step 3 - NGINX Setup -------------------
|
||
3 years ago
|
|
||
3 years ago
|
echo ""
|
||
3 years ago
|
echo "We might need to query DNS records here..."
|
||
|
install_if_needed dig
|
||
|
echo ""
|
||
|
read -p "Do you have a domain name pointing to this computer? (y/n): " -n1 boot
|
||
|
echo ""
|
||
|
case $boot in
|
||
|
y | Y)
|
||
|
echo "Good to hear! What is it?"
|
||
|
read -p "http://" domain
|
||
|
;;
|
||
|
*)
|
||
|
echo "Okay, let's just configure it to your external IP for now."
|
||
|
domain=$(dig @resolver4.opendns.com myip.opendns.com +short)
|
||
|
echo "Looks like you're running on ${domain}"
|
||
|
;;
|
||
|
esac
|
||
|
echo ""
|
||
|
WP_NGINX_CONF=/etc/nginx/sites-available/wp
|
||
|
sudo cp resources/wordpress.nginx.conf $WP_NGINX_CONF
|
||
|
sudo sed -i "s#SERVER_NAME#${domain}#" $WP_NGINX_CONF
|
||
|
sudo sed -i "s#FILE_ROOT#${WP_DIR}/wordpress#" $WP_NGINX_CONF
|
||
|
sudo ln -s /etc/nginx/sites-available/wp /etc/nginx/sites-enabled/
|
||
|
echo ""
|
||
|
sudo systemctl reload nginx
|
||
|
echo "Excellent! We've configured $WP_NGINX_CONF to serve your WordPress site from $domain"
|
||
|
echo ""
|
||
3 years ago
|
|
||
3 years ago
|
# ------------------- Step 4 - Certbot -------------------
|
||
3 years ago
|
|
||
3 years ago
|
read -p "Would you like to enable SSL via Certbot? (y/n): " -n1 boot
|
||
|
echo ""
|
||
|
case $boot in
|
||
|
y | Y)
|
||
|
echo "Alright, let's get Certbot in here!"
|
||
|
install_if_needed python3 certbot python3-certbot-nginx
|
||
3 years ago
|
echo -e "${BOLD}Take it away, Certbot${NC}"
|
||
3 years ago
|
sudo certbot --nginx
|
||
|
;;
|
||
|
*)
|
||
|
echo "Yea, SSL is lame anyways..."
|
||
|
;;
|
||
|
esac
|
||
|
echo ""
|
||
3 years ago
|
|
||
|
# ------------------- Step 5 - Port Testing -------------------
|
||
|
|
||
|
echo -e "${BOLD}One more thing!${NC} We need to make sure that your ports are open."
|
||
|
nmap -Pn $domain > nmap.txt
|
||
|
OPEN=1
|
||
|
if grep -qE "^80/.*(open|filtered)" nmap.txt; then
|
||
|
echo -e "I can see port ${GREEN}80${NC}!"
|
||
|
else
|
||
|
echo -e "Uh oh, port ${RED}80${NC} isn't showing up..."
|
||
|
OPEN=0
|
||
|
fi
|
||
|
|
||
|
if grep -qE "^443/.*(open|filtered)" nmap.txt; then
|
||
|
echo -e "I can see port ${GREEN}443${NC} as well!"
|
||
|
else
|
||
|
echo -e "Uh oh, port ${RED}443${NC} isn't showing up..."
|
||
|
OPEN=0
|
||
|
fi
|
||
|
rm nmap.txt
|
||
|
echo ""
|
||
|
if [[ $OPEN -eq 0 ]]; then
|
||
|
echo -e "${RED}Port configuration needed.${NC} Something (probably your wireless router) is blocking us from serving this page to the rest of the internet."
|
||
|
echo "Port forwarding is relatively simple, but as it stands it is beyond the scope of this script to be able to automate it."
|
||
|
echo -e "You'll probably need to look up the login information for your specific router and forward the red ports to the local IP of this computer (${BOLD}$(ip route | grep default | grep -oP "(?<=src )[^ ]+")${NC})."
|
||
|
echo -e "You can log into your router at this IP address: ${BOLD}$(route -n | grep ^0.0.0.0 | awk '{print $2}')${NC}"
|
||
|
echo "That's all the help I can give you regarding port forwarding. Good luck!"
|
||
|
echo ""
|
||
|
fi
|
||
|
|
||
|
echo "Okay, well that's everything! As long as your ports are forwarded, you should be ready to continue your WordPress setup by opening $domain in your browser."
|