Files
cloudron-box/scripts/cloudron-setup
Girish Ramakrishnan fae0ba5678 Decouple installer from the base image script
This means that the base image does not have the installer anymore
and needs to be copied over.

Part of #152
2016-12-28 08:58:10 -08:00

196 lines
5.7 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 INSTALLER_REVISION=master
readonly INIT_BASESYSTEM_SCRIPT_URL="https://git.cloudron.io/cloudron/box/raw/${INSTALLER_REVISION}/baseimage/initializeBaseUbuntuImage.sh"
readonly INSTALLER_URL="https://git.cloudron.io/cloudron/box/raw/${INSTALLER_REVISION}/scripts/installer.sh"
readonly LOG_FILE="/var/log/cloudron-setup.log"
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"
args=$(getopt -o "" -l "domain:,help,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;;
--) 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
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
echo "=> Downloading and running installer for version ${INSTALLER_REVISION}"
if ! curl -s "${INSTALLER_URL}" > /etc/installer.sh; then
echo "Could not download initialization script"
exit 1
fi
if ! /bin/bash /etc/installer.sh "${provider}" &>> "${LOG_FILE}"; then
echo "Installer failed. See ${LOG_FILE} for details"
exit 1
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 [[ -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 "=> Run installer.sh for version ${version} with ${sourceTarballUrl} ... (this takes some time)"
if ! ${INSTALLER_SOURCE_DIR}/scripts/installer.sh --sourcetarballurl "${sourceTarballUrl}" --data "${data}" &>> "${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