2016-10-24 16:18:02 +02:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
2016-10-25 12:00:54 -07:00
|
|
|
set -eu -o pipefail
|
2016-10-24 16:18:02 +02:00
|
|
|
|
2016-11-01 15:13:20 +01:00
|
|
|
if [[ ${EUID} -ne 0 ]]; then
|
|
|
|
|
echo "This script should be run as root." > /dev/stderr
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
2016-10-24 14:52:30 -07:00
|
|
|
# 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"
|
2016-10-25 11:27:58 +02:00
|
|
|
readonly INSTALLER_SOURCE_DIR="/home/yellowtent/installer"
|
2016-10-25 14:01:35 +02:00
|
|
|
readonly LOG_FILE="/var/log/cloudron-setup.log"
|
2016-10-24 14:52:30 -07:00
|
|
|
|
2016-10-24 16:18:02 +02:00
|
|
|
domain=""
|
2016-10-26 10:53:25 -07:00
|
|
|
provider=""
|
2016-11-13 11:20:50 +01:00
|
|
|
encryptionKey=""
|
2016-10-24 14:52:30 -07:00
|
|
|
restoreUrl=""
|
2016-10-24 17:30:47 +02:00
|
|
|
tlsProvider="letsencrypt-prod"
|
2016-10-24 14:52:30 -07:00
|
|
|
versionsUrl="https://s3.amazonaws.com/prod-cloudron-releases/versions.json"
|
2016-10-25 13:12:26 +02:00
|
|
|
version="latest"
|
2016-10-24 16:18:02 +02:00
|
|
|
|
2016-11-13 11:20:50 +01:00
|
|
|
args=$(getopt -o "" -l "domain:,help,provider:,encryption-key:,restore-url:,tls-provider:,version:,versions-url:" -n "$0" -- "$@")
|
2016-10-24 16:18:02 +02:00
|
|
|
eval set -- "${args}"
|
|
|
|
|
|
|
|
|
|
while true; do
|
|
|
|
|
case "$1" in
|
|
|
|
|
--domain) domain="$2"; shift 2;;
|
2016-10-25 13:34:12 -07:00
|
|
|
--help) echo "See https://cloudron.io/references/selfhosting.html on how to install Cloudron"; exit 0;;
|
2016-10-24 16:18:02 +02:00
|
|
|
--provider) provider="$2"; shift 2;;
|
2016-11-13 11:20:50 +01:00
|
|
|
--encryption-key) encryptionKey="$2"; shift 2;;
|
2016-10-24 14:52:30 -07:00
|
|
|
--restore-url) restoreUrl="$2"; shift 2;;
|
2016-10-24 17:30:47 +02:00
|
|
|
--tls-provider) tlsProvider="$2"; shift 2;;
|
2016-10-24 14:52:30 -07:00
|
|
|
--version) version="$2"; shift 2;;
|
|
|
|
|
--versions-url) versionsUrl="$2"; shift 2;;
|
2016-10-24 16:18:02 +02:00
|
|
|
--) break;;
|
|
|
|
|
*) echo "Unknown option $1"; exit 1;;
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
if [[ -z "${domain}" ]]; then
|
|
|
|
|
echo "--domain is required"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
2016-10-26 10:53:25 -07:00
|
|
|
if [[ -z "${provider}" ]]; then
|
2016-11-13 11:35:56 +01:00
|
|
|
echo "--provider is required (generic, scaleway, ec2, digitalocean)"
|
2016-10-26 10:53:25 -07:00
|
|
|
exit 1
|
2016-11-13 11:45:55 +01:00
|
|
|
elif [[ \
|
|
|
|
|
"${provider}" != "generic" && \
|
|
|
|
|
"${provider}" != "scaleway" && \
|
|
|
|
|
"${provider}" != "ec2" && \
|
|
|
|
|
"${provider}" != "digitalocean" \
|
|
|
|
|
]]; then
|
|
|
|
|
echo "--provider must be one of: generic, scaleway, ec2, digitalocean"
|
|
|
|
|
exit 1
|
2016-10-26 10:53:25 -07:00
|
|
|
fi
|
|
|
|
|
|
2016-11-13 11:34:02 +01:00
|
|
|
if [[ -z "${encryptionKey}" ]]; then
|
2016-11-13 11:49:09 +01:00
|
|
|
echo "--encryption-key for backup encryption is required"
|
2016-11-13 11:34:02 +01:00
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
2016-10-25 15:28:26 +02:00
|
|
|
echo ""
|
2016-10-25 14:07:28 +02:00
|
|
|
echo "##############################################"
|
2016-10-25 12:57:24 -07:00
|
|
|
echo " Cloudron Setup (${version}) "
|
2016-10-25 14:07:28 +02:00
|
|
|
echo "##############################################"
|
|
|
|
|
echo ""
|
|
|
|
|
echo " Follow setup logs in a second terminal with:"
|
|
|
|
|
echo " $ tail -f ${LOG_FILE}"
|
|
|
|
|
echo ""
|
|
|
|
|
|
2016-11-17 15:03:35 +01:00
|
|
|
echo "=> Installing setup dependencies ..."
|
|
|
|
|
if ! apt-get install curl -y &>> "${LOG_FILE}"; then
|
|
|
|
|
echo "Could not install curl"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
2016-10-25 14:07:28 +02:00
|
|
|
echo "=> Downloading initialization script"
|
2016-10-25 12:47:51 -07:00
|
|
|
if ! curl -s "${INIT_BASESYSTEM_SCRIPT_URL}" > /tmp/initializeBaseUbuntuImage.sh; then
|
|
|
|
|
echo "Could not download initialization script"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
2016-10-24 14:52:30 -07:00
|
|
|
|
2016-11-17 15:03:35 +01:00
|
|
|
echo "=> Installing base dependencies ... (this takes some time)"
|
2016-10-25 12:00:54 -07:00
|
|
|
if ! /bin/bash /tmp/initializeBaseUbuntuImage.sh "${INSTALLER_REVISION}" "${provider}" &>> "${LOG_FILE}"; then
|
|
|
|
|
echo "Init script failed. See ${LOG_FILE} for details"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
2016-10-24 14:52:30 -07:00
|
|
|
rm /tmp/initializeBaseUbuntuImage.sh
|
2016-10-24 16:18:02 +02:00
|
|
|
|
2016-10-25 13:05:24 -07:00
|
|
|
echo "=> Checking version"
|
|
|
|
|
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
|
|
|
|
|
|
2016-11-01 14:24:09 +01:00
|
|
|
echo "=> Run base init service"
|
2016-11-02 14:52:13 +01:00
|
|
|
systemctl start cloudron-system-setup
|
2016-11-01 14:24:09 +01:00
|
|
|
|
2016-11-20 18:17:53 +01:00
|
|
|
if [[ -z "${restoreUrl}" ]]; then
|
|
|
|
|
data=$(cat <<EOF
|
2016-10-24 16:18:02 +02:00
|
|
|
{
|
2016-10-25 13:41:51 +02:00
|
|
|
"boxVersionsUrl": "${versionsUrl}",
|
|
|
|
|
"fqdn": "${domain}",
|
2016-11-20 20:44:00 +01:00
|
|
|
"provider": "${provider}",
|
2016-10-25 13:41:51 +02:00
|
|
|
"tlsConfig": {
|
|
|
|
|
"provider": "${tlsProvider}"
|
|
|
|
|
},
|
2016-11-13 11:20:50 +01:00
|
|
|
"backupConfig" : {
|
2016-11-13 13:37:36 +01:00
|
|
|
"provider": "filesystem",
|
|
|
|
|
"backupFolder": "/var/backups",
|
2016-11-13 11:20:50 +01:00
|
|
|
"key": "${encryptionKey}"
|
|
|
|
|
},
|
2016-10-25 13:41:51 +02:00
|
|
|
"version": "${version}"
|
2016-10-24 16:18:02 +02:00
|
|
|
}
|
2016-11-20 18:17:53 +01:00
|
|
|
EOF)
|
|
|
|
|
else
|
|
|
|
|
data=$(cat <<EOF
|
|
|
|
|
{
|
|
|
|
|
"boxVersionsUrl": "${versionsUrl}",
|
|
|
|
|
"fqdn": "${domain}",
|
|
|
|
|
"provider": "${provider}",
|
|
|
|
|
"restore": {
|
|
|
|
|
"url": "${restoreUrl}",
|
|
|
|
|
"key": "${encryptionKey}"
|
|
|
|
|
},
|
|
|
|
|
"tlsConfig": {
|
|
|
|
|
"provider": "${tlsProvider}"
|
|
|
|
|
}
|
|
|
|
|
"version": "${version}"
|
|
|
|
|
}
|
|
|
|
|
EOF)
|
|
|
|
|
fi
|
2016-10-24 16:18:02 +02:00
|
|
|
|
2016-10-25 13:05:24 -07:00
|
|
|
echo "=> Run installer.sh for version ${version} with ${sourceTarballUrl} ... (this takes some time)"
|
2016-10-31 17:24:51 +01:00
|
|
|
if ! ${INSTALLER_SOURCE_DIR}/scripts/installer.sh --sourcetarballurl "${sourceTarballUrl}" --data "${data}" &>> "${LOG_FILE}"; then
|
2016-10-25 12:47:51 -07:00
|
|
|
echo "Failed to install cloudron. See ${LOG_FILE} for details"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
2016-10-25 11:27:58 +02:00
|
|
|
|
2016-10-25 14:07:28 +02:00
|
|
|
echo -n "=> Waiting for cloudron to be ready"
|
2016-10-24 14:52:30 -07:00
|
|
|
while true; do
|
|
|
|
|
echo -n "."
|
2016-10-25 14:01:40 -07:00
|
|
|
if journalctl -u box -a | grep "platformReady: configured, resuming tasks" >/dev/null; then
|
2016-10-24 14:52:30 -07:00
|
|
|
break
|
|
|
|
|
fi
|
|
|
|
|
sleep 10
|
|
|
|
|
done
|
|
|
|
|
|
2016-10-25 14:07:28 +02:00
|
|
|
echo ""
|
2016-10-24 14:52:30 -07:00
|
|
|
echo "Visit https://my.${domain} to finish setup"
|
2016-10-25 14:07:28 +02:00
|
|
|
echo ""
|