digitaldemocratic/dd-install.sh

272 lines
7.5 KiB
Bash
Executable File

#!/usr/bin/env -S bash -eu
#
# Copyright 2022 -- Evilham <contact@evilham.com>
#
# This file is part of DD
#
# DD is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# DD is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License
# along with DD. If not, see <https://www.gnu.org/licenses/>.
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# General settings, dir, repo, branch. You usually do not want these changed.
DDSRC_DIR="${DDSRC_DIR:-/opt/src/DD}"
DDREPO_URL="${DDREPO_URL:-https://gitlab.com/DD-workspace/DD}"
DDBRANCH="${DDBRANCH:-main}"
DDLOG="${DDLOG:-dd-install.log}"
help() {
cat <<EOF
Usage: $0 --install
Use the environment extensively to configure DD.
Any VARIABLE that is found in:
${DDREPO_URL:?}/-/raw/${DDBRANCH:?}/dd.conf.sample
Can be specified in this script's environment as DD_VARIABLE.
For example, use DD_DOMAIN to pre-configure the DOMAIN.
Furthermore, you can set DDIMG_LOGO_PNG and DDIMG_BACKGROUND_PNG to the path
of PNG files that will be used for the logo and background respectively.
This script will take care of installing all pre-requisites, pulling and
updating sources, applying workarounds for known bugs, etc.
EOF
}
case "${1:-}" in
-h|--help)
help
exit
;;
""|--install)
;;
*)
help
exit 1
;;
esac
check_config_interactive() {
if [ -z "${DD_DOMAIN:-}" ]; then
INTERACTIVE_INSTALL="YES"
cat <<-EOF
Interactive install detected!
Please follow the instructions carefully:
EOF
read -rep "Under which DOMAIN will you install DD? " DD_DOMAIN
export DD_DOMAIN
cat <<-EOF
You will need to setup DNS entries for:
- [ ] moodle.${DD_DOMAIN}
- [ ] nextcloud.${DD_DOMAIN}
- [ ] wp.${DD_DOMAIN}
- [ ] oof.${DD_DOMAIN}
- [ ] sso.${DD_DOMAIN}
- [ ] pad.${DD_DOMAIN}
- [ ] admin.${DD_DOMAIN}
- [ ] api.${DD_DOMAIN}
EOF
fi
# TODO: perform some kind of DNS check to help with installation?
if [ -z "${DD_TITLE_SHORT:-}" ]; then
if [ -n "${INTERACTIVE_INSTALL:-}" ]; then
read -rep "What is the short title of the DD instance? [DD] " DD_TITLE_SHORT
fi
if [ -z "${DD_TITLE_SHORT:-}" ]; then
DD_TITLE_SHORT="DD"
fi
export DD_TITLE_SHORT
fi
if [ -z "${DD_TITLE:-}" ]; then
if [ -n "${INTERACTIVE_INSTALL:-}" ]; then
read -rep "What is the full title of the DD instance? [${DD_TITLE_SHORT}] " DD_TITLE
fi
if [ -z "${DD_TITLE:-}" ]; then
DD_TITLE="${DD_TITLE_SHORT}"
fi
export DD_TITLE
fi
if [ -n "${INTERACTIVE_INSTALL:-}" ]; then
read -rep "Do you want to use Let's Encrypt certificates? [Y/n] " USE_LETSENCRYPT
case ${USE_LETSENCRYPT:-} in
n*|N*)
;;
*)
# Reuse user-provided info
export DD_LETSENCRYPT_DNS="${DD_DOMAIN}"
read -rep "Which email will you use for Let's Encrypt notifications? " \
DD_LETSENCRYPT_EMAIL
export DD_LETSENCRYPT_EMAIL
read -rep "Generate a certificate for ${DD_DOMAIN}? (neds the DNS entry) [y/N] " \
LE_ROOT_CERT
case ${LE_ROOT_CERT:-} in
y*|Y*)
DD_LETSENCRYPT_DOMAIN_ROOT=true
;;
*)
DD_LETSENCRYPT_DOMAIN_ROOT=false
;;
esac
export DD_LETSENCRYPT_DOMAIN_ROOT
;;
esac
read -rep "Path to the logo's PNG file (optional): " \
DDIMG_LOGO_PNG
read -rep "Path to the background's PNG file (optional): " \
DDIMG_BACKGROUND_PNG
cat <<-EOF
About to install with following information:
DOMAIN=${DD_DOMAIN}
TITLE_SHORT=${DD_TITLE_SHORT}
TITLE=${DD_TITLE}
LETSENCRYPT_DNS=${DD_LETSENCRYPT_DNS}
LETSENCRYPT_EMAIL=${DD_LETSENCRYPT_EMAIL:-}
LETSENCRYPT_DOMAIN_ROOT=${DD_LETSENCRYPT_DOMAIN_ROOT:-}
Custom logo in PNG (if requested): ${DDIMG_LOGO_PNG:-}
Custom background in PNG (if requested): ${DDIMG_BACKGROUND_PNG:-}
EOF
read -rep "Is this correct? proceed with the install? [Y/n] " DO_INSTALL
case ${DO_INSTALL:-} in
n*|N*)
exit
;;
*)
;;
esac
fi
}
# Ensure we have all necessary info
check_config_interactive
# Read all environment variables (DD_ prefix removed)
DD_ENV="$(env | grep -E '^DD_' | cut -c 4-)"
DD_VARS="$(echo "${DD_ENV}" | cut -d = -f 1)"
# Ensure DDIMG_* paths are full
# TODO: ensure the images are .png files
if [ -n "${DDIMG_LOGO_PNG:-}" ]; then
DDIMG_LOGO_PNG="$(realpath "${DDIMG_LOGO_PNG}")"
fi
if [ -n "${DDIMG_BACKGROUND_PNG:-}" ]; then
DDIMG_BACKGROUND_PNG="$(realpath "${DDIMG_BACKGROUND_PNG}")"
fi
#
# START MANUAL INSTALL
#
# Ensure apt cache is up to date
apt-get update
# Ensure git is available
GIT="$(command -v git || true)"
if [ -z "${GIT:-}" ]; then
apt-get install -y git
GIT="$(command -v git)"
fi
# Create source dir and clone repo as necessary
if [ ! -d "${DDSRC_DIR:?}" ]; then
mkdir -p "${DDSRC_DIR:?}"
"${GIT:?}" clone "${DDREPO_URL:?}" "${DDSRC_DIR:?}"
# Change to the requested branch
"${GIT:?}" -C "${DDSRC_DIR:?}" checkout "${DDBRANCH:?}"
fi
# Change to the source dir
cd "${DDSRC_DIR:?}"
# Copy the custom directory
if [ ! -d "custom" ]; then
cp -r custom.sample custom
fi
# Copy conf file
cp dd.conf.sample dd.conf
# Patch the configuration with the environment variables
# If installing manually, you'd edit `dd.conf` instead
for dd_var in ${DD_VARS:?}; do
dd_val="$(echo "${DD_ENV}" | grep -E "^${dd_var:?}=" | cut -d = -f 2- | head -n 1)"
./dd-ctl setconf "${dd_var:?}" "${dd_val:-}"
done
# Replace logos if requested
# If installing manually you'd replace:
# - custom/img/logo.png
# - custom/img/background.png
if [ -f "${DDIMG_LOGO_PNG:-}" ]; then
cp "${DDIMG_LOGO_PNG:?}" "custom/img/logo.png"
fi
if [ -f "${DDIMG_BACKGROUND_PNG:-}" ]; then
cp "${DDIMG_BACKGROUND_PNG:?}" "custom/img/background.png"
fi
# Update all repositories
./dd-ctl repo-update "${DDBRANCH:?}" 2>&1 | tee -a "${DDLOG}"
# Install all prerequisites
./dd-ctl prerequisites 2>&1 | tee -a "${DDLOG}"
# Fix insecure passwords
./dd-ctl securize 2>&1 | tee -a "${DDLOG}"
# Perform installation as per further instructions
./dd-ctl all 2>&1 | tee -a "${DDLOG}"
# Wait a tad to work around dd-sso issues
echo "Waiting a few seconds for things to settle..."
sleep 30
# Address timing dd-sso issue by restarting the containers
./dd-ctl down
./dd-ctl up
## Ensure SAML is set up (it errors always)
./dd-ctl saml || true
# Address Moodle custom settings, plugins and registration
NEXTCLOUD_ADMIN_USER="$(grep -E '^NEXTCLOUD_ADMIN_USER=' dd.conf | cut -d = -f 2-)"
NEXTCLOUD_ADMIN_PASSWORD="$(grep -E '^NEXTCLOUD_ADMIN_PASSWORD=' dd.conf | cut -d = -f 2-)"
docker exec -i -u nobody dd-apps-moodle sh -s <<EOF
php admin/cli/maintenance.php --enable
php admin/cli/upgrade.php --non-interactive
php theme/cbe/postinstall.php \
--wwwroot="moodle.${DD_DOMAIN}" \
--ncadmin="${NEXTCLOUD_ADMIN_USER}" \
--ncpass="${NEXTCLOUD_ADMIN_PASSWORD}" \
--sitename="${DD_TITLE}" \
--contactname="${DD_LETSENCRYPT_EMAIL}" \
--contactemail="${DD_LETSENCRYPT_EMAIL}"
php admin/cli/maintenance.php --disable
EOF
# And fix moodle SAML with the admin
docker exec dd-sso-admin python3 /admin/saml_scripts/moodle_saml.py
# Proceed further with manual steps
cat <<EOF | tee -a "${DDLOG}"
Proceed now with further manual steps as per:
https://dd.digitalitzacio-democratica.xnet-x.net/docs/post-install.ca/
If necessary, check the install logs at: ${DDLOG}
EOF