#!/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 # validate arguments in the absence of data if [[ -z "${dataJson}" ]]; then 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 if [[ -z "${restoreUrl}" ]]; then data=$(cat < 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 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}"; 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 "" if [[ "${initBaseImage}" == "true" ]]; then systemctl reboot fi