DD education workspace
DD is the education workspace generated within the framework of Xnet's
Democratic Digitalisation Plan. It has been created and powered by Xnet,
families and promoting centres, IsardVDI, 3iPunt, MaadiX, eXO.cat,
Evilham and funded by the Directorate for Democratic Innovation, the
Barcelona City Council's Digital Innovation Commissioner, Social Economy
Commissioner, in collaboration with the Barcelona Education Consortium,
aFFaC and AirVPN.
DD can be used freely as long as this footer is included and the AGPLv3
license (https://www.gnu.org/licenses/agpl-3.0.en.html) is respected.
Trobareu meś informació en català a la documentació:
[https://dd.digitalitzacio-democratica.xnet-x.net/docs/index.ca/](https://dd.digitalitzacio-democratica.xnet-x.net/docs/index.ca/).
Más información en castellano en la documentación:
[https://dd.digitalitzacio-democratica.xnet-x.net/docs/index.es/](https://dd.digitalitzacio-democratica.xnet-x.net/docs/index.es/).
More info in English in the documentation:
[https://dd.digitalitzacio-democratica.xnet-x.net/docs/](https://dd.digitalitzacio-democratica.xnet-x.net/docs/).
We thank the help of Miriam Carles, Cristian Ruiz, Anna Francàs,
Christopher Millard.
2022-07-10 12:15:47 +02:00
|
|
|
#!/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
|
2022-08-31 16:33:06 +02:00
|
|
|
|
DD education workspace
DD is the education workspace generated within the framework of Xnet's
Democratic Digitalisation Plan. It has been created and powered by Xnet,
families and promoting centres, IsardVDI, 3iPunt, MaadiX, eXO.cat,
Evilham and funded by the Directorate for Democratic Innovation, the
Barcelona City Council's Digital Innovation Commissioner, Social Economy
Commissioner, in collaboration with the Barcelona Education Consortium,
aFFaC and AirVPN.
DD can be used freely as long as this footer is included and the AGPLv3
license (https://www.gnu.org/licenses/agpl-3.0.en.html) is respected.
Trobareu meś informació en català a la documentació:
[https://dd.digitalitzacio-democratica.xnet-x.net/docs/index.ca/](https://dd.digitalitzacio-democratica.xnet-x.net/docs/index.ca/).
Más información en castellano en la documentación:
[https://dd.digitalitzacio-democratica.xnet-x.net/docs/index.es/](https://dd.digitalitzacio-democratica.xnet-x.net/docs/index.es/).
More info in English in the documentation:
[https://dd.digitalitzacio-democratica.xnet-x.net/docs/](https://dd.digitalitzacio-democratica.xnet-x.net/docs/).
We thank the help of Miriam Carles, Cristian Ruiz, Anna Francàs,
Christopher Millard.
2022-07-10 12:15:47 +02:00
|
|
|
# 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
|