You've already forked dokuwiki-ubuntu
188 lines
4.7 KiB
Bash
Executable File
188 lines
4.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# Author : Allan Christensen
|
|
# First Created : 05012022 (DD-MM-YYYY)
|
|
# Description : Installs DokuWiki on Ubuntu 24.04
|
|
# License : MIT License (see LICENSE file for details)
|
|
|
|
#
|
|
# Are we root
|
|
#
|
|
if [[ $(id -u) -ne 0 ]]; then echo "" && echo "Must be root or use sudo" && echo "" ; exit 1 ; fi
|
|
|
|
#
|
|
# Get php-fpm version
|
|
#
|
|
phpfpm=$(systemctl list-unit-files --type=service | awk '/php[0-9]+\.[0-9]+-fpm\.service/ {sub(".service","",$1); print $1; exit}')
|
|
if [[ -z "$phpfpm" ]]; then printf "\nUnable to detect php-fpm version. Is PHP-FPM installed?\n\n" ; exit 1 ; fi
|
|
|
|
#
|
|
# Check if required services are running or not
|
|
#
|
|
for svc in nginx "$phpfpm"; do systemctl is-active --quiet "$svc" || { printf "\n%s is not running, cannot continue...\n\n" "${svc^}" ; exit 1 ; }; done
|
|
|
|
#
|
|
# Define variables and functions
|
|
#
|
|
hostname="$1"
|
|
|
|
#
|
|
# Function usage
|
|
#
|
|
usage () {
|
|
printf -- "\ndokuwikiinstall\n\n"
|
|
printf -- "Installs DokuWiki on Ubuntu\n\n"
|
|
printf -- "Usage:\n"
|
|
printf -- "sudo ./dokuwikiinstall <domain>\n"
|
|
printf -- "Examples:\n"
|
|
printf -- "sudo ./dokuwikiinstall wiki.something.xyz\n\n"
|
|
}
|
|
|
|
#
|
|
# Parse and validate input
|
|
#
|
|
if [[ $# -ne 1 ]]; then
|
|
usage
|
|
printf "ERROR: Exactly one argument (the domain ony).\n\n"
|
|
exit 1
|
|
fi
|
|
|
|
# Convert to lowercase (domains are case-insensitive)
|
|
hostname=$(echo "$hostname" | tr '[:upper:]' '[:lower:]')
|
|
|
|
# Ensure domain is not empty
|
|
if [[ -z "$hostname" ]]; then
|
|
printf "ERROR: Domain cannot be empty.\n\n"
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
# Disallow spaces, slashes, or underscores
|
|
if [[ "$hostname" =~ [[:space:]/_] ]]; then
|
|
printf "ERROR: Domain cannot contain spaces, slashes, or underscores.\n\n"
|
|
exit 1
|
|
fi
|
|
|
|
# Validate domain format (RFC 1123)
|
|
if [[ ! "$hostname" =~ ^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$ ]]; then
|
|
printf "ERROR: Invalid domain format.\n"
|
|
printf "Example of valid input: wiki.example.com\n\n"
|
|
exit 1
|
|
fi
|
|
|
|
# Prevent accidental overwrite of existing Nginx config
|
|
if [[ -f "/etc/nginx/conf.d/${hostname}.conf" ]]; then
|
|
printf "\nERROR: A configuration file already exists for %s.\n" "$hostname"
|
|
printf "Refusing to overwrite existing site.\n\n"
|
|
exit 1
|
|
fi
|
|
|
|
# Check for existing references in other Nginx configs
|
|
hostcheck=$(grep -r --exclude="README.md" "$hostname" /etc/nginx/ 2>/dev/null || true)
|
|
if [[ -n "$hostcheck" ]]; then
|
|
printf "\nFound existing configuration mentioning %s — aborting to avoid collision.\n\n" "$hostname"
|
|
exit 1
|
|
fi
|
|
|
|
#
|
|
# Let's go
|
|
#
|
|
clear
|
|
|
|
#
|
|
# Ensure curl is available
|
|
#
|
|
for tool in curl unzip wget; do dpkg -s "$tool" &>/dev/null || apt install -y "$tool" ; done
|
|
|
|
#
|
|
# Clone nginx-snippets; if nginx-snippets exists then just pull latest changes
|
|
#
|
|
nginxsnippets="/etc/nginx/nginx-snippets"
|
|
repo="https://git.x-files.dk/webserver/nginx-snippets.git"
|
|
if [[ -d "$nginxsnippets/.git" ]]; then git -C "$nginxsnippets" pull --quiet; else git clone --quiet "$repo" "$nginxsnippets"; fi
|
|
|
|
#
|
|
# Download the latest DokuWiki
|
|
#
|
|
wikidir="/var/www/html/$hostname" ; mkdir -p "$wikidir"
|
|
curl -sL https://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz | tar -xzf - -C "$wikidir" --strip-components=1 || { echo "Download or extraction failed"; exit 1; }
|
|
chown -R www-data: "$wikidir"
|
|
|
|
#
|
|
# Create a DokuWiki nginx configuration file
|
|
#
|
|
cp "$nginxsnippets/hostfiles/dokuwiki.80.conf" /etc/nginx/conf.d/"$hostname".conf
|
|
sed -i -- "s/DOMAIN/$hostname/g" /etc/nginx/conf.d/"$hostname".conf
|
|
sed -i "s/PHPVERSION/$phpfpm/" /etc/nginx/conf.d/"$hostname".conf
|
|
|
|
#
|
|
# Restarting Nginx and Phpfpm for changes to take effect
|
|
#
|
|
printf "\nRestarting services...\n"
|
|
systemctl restart "$phpfpm"
|
|
systemctl restart nginx
|
|
|
|
#
|
|
# Create postinstall script
|
|
#
|
|
cat > /tmp/dokuwiki-postinstall <<EOF
|
|
#!/usr/bin/env bash
|
|
|
|
#
|
|
# DokuWiki Postinstall Script
|
|
#
|
|
|
|
#
|
|
# Are we root?
|
|
#
|
|
if [[ $(id -u) -ne 0 ]]; then echo "" && echo "Must be root or use sudo" && echo "" ; exit ; fi
|
|
|
|
#
|
|
# Hardening of DokuWiki
|
|
#
|
|
sed -i 's/^[[:space:]]*#\s*location /location /g' /etc/nginx/conf.d/"$hostname".conf
|
|
|
|
#
|
|
# Restart Nginx for changes to take effect
|
|
#
|
|
systemctl restart nginx
|
|
|
|
#
|
|
# Cleaning up
|
|
#
|
|
rm -f /tmp/dokuwiki-postinstall
|
|
EOF
|
|
|
|
chmod 755 /tmp/dokuwiki-postinstall
|
|
|
|
#
|
|
# DokuWiki postinstall notice
|
|
#
|
|
wikinotice=$(cat <<EOF
|
|
-----------------------------------------------------------------------------------
|
|
IMPORTANT: Go to http://$hostname/install.php in order to complete the installation:
|
|
|
|
Don't worry about the warning on the right side of the page this will be
|
|
fixed as there still is a post install step to do.
|
|
|
|
Once done run the following command as root or using sudo.
|
|
|
|
sudo /tmp/dokuwiki-postinstall
|
|
-----------------------------------------------------------------------------------
|
|
EOF
|
|
)
|
|
|
|
#
|
|
# Print notice
|
|
#
|
|
printf '\n%s\n' "$wikinotice"
|
|
|
|
#
|
|
# All done
|
|
#
|
|
printf "\nAll Done...\n"
|
|
|
|
#
|
|
# End of script
|
|
#
|