#!/bin/bash set -xeuo pipefail IFS=$'\n\t' DIR="$(realpath ${0%/*})" RUNTIME_IS_PODMAN="false" if [[ -x "$(command -v podman)" ]]; then CONTAINER_RUNTIME="$(command -v podman 2> /dev/null)" RUNTIME_IS_PODMAN="true" elif [[ -x "$(command -v docker)" ]]; then CONTAINER_RUNTIME="$(command -v docker 2> /dev/null)" else echo "Container runtime (docker/podman) not found!" exit 1 fi # replace containers if $CONTAINER_RUNTIME inspect --type container synapse 1> /dev/null; then $CONTAINER_RUNTIME rm -f synapse sleep 0.5 fi if $CONTAINER_RUNTIME inspect --type container elementweb 1> /dev/null; then $CONTAINER_RUNTIME rm -f elementweb sleep 0.5 fi if $CONTAINER_RUNTIME inspect --type container nextcloud 1> /dev/null; then $CONTAINER_RUNTIME rm -f nextcloud fi $CONTAINER_RUNTIME run -d \ --name=nextcloud \ -p 8080:8080 \ -p 8081:80 \ -p 8082:8082 \ -p 8008:8008 \ -p 2280:22 \ -e PHP_MEMORY_LIMIT=512M \ -e APACHE_RUN_USER=www-data \ -e APACHE_RUN_GROUP=root \ -v "$DIR:/var/www/html/custom_apps/upschooling" \ --add-host "synapse:127.0.0.1" \ docker.io/nextcloud:stable export APACHE_RUN_USER=33 # uid of www-data, as selected above export APACHE_RUN_GROUP=0 # gid of root, as selected above echo -e "Nextcloud has started. \e[1;38;5;2mOK\033[0m" $CONTAINER_RUNTIME exec nextcloud bash -c 'apt-get update && apt-get upgrade -y && apt-get install --no-install-recommends -y debianutils bash vim git openssh-server make curl tar npm' # sets www-data password to extrasecret $CONTAINER_RUNTIME exec nextcloud usermod \ --password '$6$bpNXAZwf$Xt.BzPV.mNTx5qVJQLK9Lut4VqMcrotgDHdcSZ0SwMxz2k9KVMSpAU7QmCv5vqj87ykIErYGpj9.Hb0A/XpX81' \ --shell '/bin/bash' \ www-data $CONTAINER_RUNTIME exec nextcloud /etc/init.d/ssh start $CONTAINER_RUNTIME exec nextcloud chown -R "$APACHE_RUN_USER" /var/www/html/custom_apps if [[ $(id -u) -ne 0 && $RUNTIME_IS_PODMAN == "true" ]]; then $CONTAINER_RUNTIME unshare -- chown -R "$APACHE_RUN_USER" "$DIR" $CONTAINER_RUNTIME unshare -- chgrp -R "$APACHE_RUN_GROUP" "$DIR" $CONTAINER_RUNTIME unshare -- chmod -R ug+rwX "$DIR" fi $CONTAINER_RUNTIME exec --user "${APACHE_RUN_USER}:${APACHE_RUN_GROUP}" nextcloud bash -c 'cd /var/www/html/custom_apps/upschooling && npm install && make' $CONTAINER_RUNTIME exec --user "${APACHE_RUN_USER}:${APACHE_RUN_GROUP}" nextcloud ./occ maintenance:install --verbose --database sqlite --admin-user admin --admin-pass admin $CONTAINER_RUNTIME exec --user "${APACHE_RUN_USER}:${APACHE_RUN_GROUP}" nextcloud ./occ config:system:set --value=true --type=boolean debug $CONTAINER_RUNTIME exec --user "${APACHE_RUN_USER}:${APACHE_RUN_GROUP}" nextcloud ./occ log:manage --level=debug $CONTAINER_RUNTIME exec --user "${APACHE_RUN_USER}:${APACHE_RUN_GROUP}" nextcloud ./occ app:disable firstrunwizard $CONTAINER_RUNTIME exec --user "${APACHE_RUN_USER}:${APACHE_RUN_GROUP}" nextcloud ./occ app:enable --force upschooling echo -e "Nextcloud and app was configured. \e[1;38;5;2mOK\033[0m" SYNAPSE_DATA_VOLUME_EXISTS="false" if [[ $RUNTIME_IS_PODMAN == "true" ]]; then if $CONTAINER_RUNTIME volume exists synapse-data; then echo "Found existing synapse-data volume (via volume exists)" SYNAPSE_DATA_VOLUME_EXISTS="true" fi else if $CONTAINER_RUNTIME volume inspect synapse-data 1> /dev/null; then echo "Found existing synapse-data volume (via volume inspect)" SYNAPSE_DATA_VOLUME_EXISTS="true" fi fi if [[ $SYNAPSE_DATA_VOLUME_EXISTS == "false" ]]; then $CONTAINER_RUNTIME run --rm \ --name=synapse \ --hostname synapse \ "--mount=type=volume,src=synapse-data,dst=/data" \ -e SYNAPSE_SERVER_NAME=synapse \ -e SYNAPSE_REPORT_STATS=no \ docker.io/matrixdotorg/synapse \ generate echo "Generated fresh synapse-data volume" fi LOCAL_SYNAPSE_DATA_PATH="$($CONTAINER_RUNTIME volume inspect --format "{{.Mountpoint}}" synapse-data)" SED_ARGS=(-i 's|registration_shared_secret: .*|registration_shared_secret: "oyYh_iEJ7Aim.iB+ye.Xk;Gl3iHFab5*8K,zv~IulT85P=c-38"|' "$LOCAL_SYNAPSE_DATA_PATH/homeserver.yaml") if [[ $(id -u) -eq 0 || $RUNTIME_IS_PODMAN != "true" ]]; then sed "${SED_ARGS[@]}" else podman unshare -- sed "${SED_ARGS[@]}" fi $CONTAINER_RUNTIME run -d \ --log-driver "k8s-file" \ --name=synapse \ "--mount=type=volume,src=synapse-data,dst=/data" \ "--network=container:$($CONTAINER_RUNTIME inspect --format "{{.Id}}" nextcloud)" \ --hostname synapse \ docker.io/matrixdotorg/synapse # wait for synapse to start MAX_TRIES=15 for ((i = 0 ; i < $MAX_TRIES ; i++)); do if $CONTAINER_RUNTIME logs synapse 2>&1 | grep -q "Synapse now listening on TCP port 8008"; then echo -e "Synapse has started. \e[1;38;5;2mOK\033[0m" break fi sleep 1 done if [[ $i -ge $MAX_TRIES ]]; then echo "Synapse did not start in time! Use '$CONTAINER_RUNTIME logs synapse' to investigate" exit 1 fi set +e REGISTER_USER_OUTPUT="$($CONTAINER_RUNTIME exec synapse register_new_matrix_user -u upschooling -p secret -a -c /data/homeserver.yaml http://localhost:8008)" REGISTER_USER_SUCCESS=$? set -e if [[ "$REGISTER_USER_SUCCESS" != "0" ]]; then if echo $REGISTER_USER_OUTPUT | grep -q "User ID already taken."; then echo -e "User @upschooling:synapse already exists. \e[1;38;5;2mOK\033[0m" else echo "Could not create user @upschooling:synapse" echo $REGISTER_USER_OUTPUT exit 1 fi else echo -e "Matrix user @upschooling:synapse created. \e[1;38;5;2mOK\033[0m" fi $CONTAINER_RUNTIME run -d \ --log-driver "k8s-file" \ --name=elementweb \ "--network=container:$($CONTAINER_RUNTIME inspect --format "{{.Id}}" nextcloud)" \ -v "$DIR/extra/element-web-nginx.conf:/etc/nginx/conf.d/default.conf" \ -v "$DIR/extra/element-config.json:/app/config.json" \ --hostname elementweb \ docker.io/vectorim/element-web set +x echo -e "Element Web has started. \e[1;38;5;2mOK\033[0m" echo echo "To view Nextcloud logs, use '$CONTAINER_RUNTIME exec --user "'"'"${APACHE_RUN_USER}:${APACHE_RUN_GROUP}"'"'" -it nextcloud ./occ log:watch'" echo "To view Nginx logs of the reverse proxy, use '$CONTAINER_RUNTIME logs -f elementweb'" echo "Run 'xdg-open "'"'"http://localhost:8080/apps/upschooling/"'"'"' to open the Nextcloud app in your default browser"