This redesigns how update works. installer.sh now rebuild the package, stops the old code and starts the new code. Importantly, it does not download the new package, this is left to the caller. cloudron-setup downloads the code and calls installer.sh of the downloaded code. Same goes for updater.sh. This means that installer.sh itself is now easily updatable. Part of #152
199 lines
5.8 KiB
Bash
Executable File
199 lines
5.8 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -eu -o pipefail
|
|
|
|
if [[ ${EUID} -ne 0 ]]; then
|
|
echo "This script should be run as root." > /dev/stderr
|
|
exit 1
|
|
fi
|
|
|
|
# change this to a hash when we make a upgrade release
|
|
readonly INIT_BASESYSTEM_SCRIPT_URL="https://git.cloudron.io/cloudron/box/raw/master/baseimage/initializeBaseUbuntuImage.sh"
|
|
readonly LOG_FILE="/var/log/cloudron-setup.log"
|
|
|
|
initBaseImage="true"
|
|
# provisioning data
|
|
domain=""
|
|
provider=""
|
|
encryptionKey=""
|
|
restoreUrl=""
|
|
dnsProvider="manual"
|
|
tlsProvider="le-prod"
|
|
versionsUrl="https://s3.amazonaws.com/prod-cloudron-releases/versions.json"
|
|
version="latest"
|
|
apiServer="https://api.cloudron.io"
|
|
dataJson=""
|
|
|
|
args=$(getopt -o "" -l "domain:,help,skip-baseimage-init,data:,provider:,encryption-key:,restore-url:,tls-provider:,version:,versions-url:,api-server:,dns-provider:" -n "$0" -- "$@")
|
|
eval set -- "${args}"
|
|
|
|
while true; do
|
|
case "$1" in
|
|
--domain) domain="$2"; shift 2;;
|
|
--help) echo "See https://cloudron.io/references/selfhosting.html on how to install Cloudron"; exit 0;;
|
|
--provider) provider="$2"; shift 2;;
|
|
--encryption-key) encryptionKey="$2"; shift 2;;
|
|
--restore-url) restoreUrl="$2"; shift 2;;
|
|
--tls-provider) tlsProvider="$2"; shift 2;;
|
|
--dns-provider) dnsProvider="$2"; shift 2;;
|
|
--version) version="$2"; shift 2;;
|
|
--versions-url) versionsUrl="$2"; shift 2;;
|
|
--api-server) apiServer="$2"; shift 2;;
|
|
--skip-baseimage-init) initBaseImage="false"; shift;;
|
|
--data) dataJson="$2"; shift 2;;
|
|
--) break;;
|
|
*) echo "Unknown option $1"; exit 1;;
|
|
esac
|
|
done
|
|
|
|
if [[ -z "${domain}" ]]; then
|
|
echo "--domain is required"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z "${provider}" ]]; then
|
|
echo "--provider is required (generic, scaleway, ec2, digitalocean)"
|
|
exit 1
|
|
elif [[ \
|
|
"${provider}" != "generic" && \
|
|
"${provider}" != "scaleway" && \
|
|
"${provider}" != "ec2" && \
|
|
"${provider}" != "digitalocean" \
|
|
]]; then
|
|
echo "--provider must be one of: generic, scaleway, ec2, digitalocean"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z "${dnsProvider}" ]]; then
|
|
echo "--dns-provider is required (noop, manual)"
|
|
exit 1
|
|
elif [[ "${dnsProvider}" != "noop" && "${dnsProvider}" != "manual" ]]; then
|
|
echo "--dns-provider must be one of : manual, noop"
|
|
exit 1
|
|
fi
|
|
|
|
echo ""
|
|
echo "##############################################"
|
|
echo " Cloudron Setup (${version}) "
|
|
echo "##############################################"
|
|
echo ""
|
|
echo "The server will reboot at the end to complete the setup."
|
|
echo ""
|
|
echo " Follow setup logs in a second terminal with:"
|
|
echo " $ tail -f ${LOG_FILE}"
|
|
echo ""
|
|
echo " Join us at https://chat.cloudron.io for any questions."
|
|
echo ""
|
|
|
|
echo "=> Update package repositories ..."
|
|
if ! apt-get update &>> "${LOG_FILE}"; then
|
|
echo "Could not update package repositories"
|
|
exit 1
|
|
fi
|
|
|
|
echo "=> Installing setup dependencies ..."
|
|
if ! apt-get install curl dnsutils -y &>> "${LOG_FILE}"; then
|
|
echo "Could not install setup dependencies (curl and dnsutils)"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "${initBaseImage}" == "true" ]]; then
|
|
echo "=> Downloading initialization script"
|
|
if ! curl -s "${INIT_BASESYSTEM_SCRIPT_URL}" > /tmp/initializeBaseUbuntuImage.sh; then
|
|
echo "Could not download initialization script"
|
|
exit 1
|
|
fi
|
|
|
|
echo "=> Installing base dependencies ... (this takes some time)"
|
|
if ! /bin/bash /tmp/initializeBaseUbuntuImage.sh "${provider}" &>> "${LOG_FILE}"; then
|
|
echo "Init script failed. See ${LOG_FILE} for details"
|
|
exit 1
|
|
fi
|
|
rm /tmp/initializeBaseUbuntuImage.sh
|
|
fi
|
|
|
|
echo "=> Checking version"
|
|
if ! npm install -g cloudron-version@0.1.1 &>> "${LOG_FILE}"; then
|
|
echo "Failed to install cloudron-version npm package"
|
|
exit 1
|
|
fi
|
|
NPM_BIN=$(npm bin -g 2>/dev/null)
|
|
if ! version=$(${NPM_BIN}/cloudron-version --out version --versions-url "${versionsUrl}" --version "${version}"); then
|
|
echo "No such version ${version}"
|
|
exit 1
|
|
fi
|
|
if ! sourceTarballUrl=$(${NPM_BIN}/cloudron-version --out tarballUrl --versions-url "${versionsUrl}" --version "${version}"); then
|
|
echo "No source code for version ${version}"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -n "${dataJson}" ]]; then
|
|
data="${dataJson}"
|
|
elif [[ -z "${restoreUrl}" ]]; then
|
|
data=$(cat <<EOF
|
|
{
|
|
"boxVersionsUrl": "${versionsUrl}",
|
|
"fqdn": "${domain}",
|
|
"provider": "${provider}",
|
|
"apiServerOrigin": "${apiServer}",
|
|
"tlsConfig": {
|
|
"provider": "${tlsProvider}"
|
|
},
|
|
"dnsConfig": {
|
|
"provider": "${dnsProvider}"
|
|
},
|
|
"backupConfig" : {
|
|
"provider": "filesystem",
|
|
"backupFolder": "/var/backups",
|
|
"key": "${encryptionKey}"
|
|
},
|
|
"version": "${version}"
|
|
}
|
|
EOF
|
|
)
|
|
else
|
|
data=$(cat <<EOF
|
|
{
|
|
"boxVersionsUrl": "${versionsUrl}",
|
|
"fqdn": "${domain}",
|
|
"provider": "${provider}",
|
|
"apiServerOrigin": "${apiServer}",
|
|
"restore": {
|
|
"url": "${restoreUrl}",
|
|
"key": "${encryptionKey}"
|
|
},
|
|
"version": "${version}"
|
|
}
|
|
EOF
|
|
)
|
|
fi
|
|
|
|
echo "=> Downloading and running installer for version ${version} ... (this takes some time)"
|
|
box_src_tmp_dir=$(mktemp -dt box-src-XXXXXX)
|
|
|
|
if ! $curl -sL "${sourceTarballUrl}" | tar -zxf - -C "${box_src_tmp_dir}"; then
|
|
echo "Could not download source tarball. See ${LOG_FILE} for details"
|
|
exit 1
|
|
fi
|
|
if ! /bin/bash "${box_src_tmp_dir}/scripts/installer.sh" --data "${data}" &>> "${LOG_FILE}" &>> "${LOG_FILE}"; then
|
|
echo "Failed to install cloudron. See ${LOG_FILE} for details"
|
|
exit 1
|
|
fi
|
|
|
|
echo -n "=> Waiting for cloudron to be ready ... (this takes some time)"
|
|
while true; do
|
|
echo -n "."
|
|
if journalctl -u box -a | grep "platformReady: " >/dev/null; then
|
|
break
|
|
fi
|
|
sleep 10
|
|
done
|
|
|
|
echo ""
|
|
echo "Rebooting this server now to let bootloader changes take effect."
|
|
echo ""
|
|
echo "Visit https://my.${domain} to finish setup"
|
|
echo ""
|
|
|
|
systemctl reboot
|