#!/bin/bash set -eo pipefail [[ $TRACE ]] && set -x if [[ -e /usr/share/debconf/confmodule ]]; then . /usr/share/debconf/confmodule fi if [[ -r /etc/default/dokku ]]; then source /etc/default/dokku fi readonly DOKKU_ROOT="${DOKKU_ROOT:-/home/dokku}" readonly DOKKU_LIB_ROOT="${DOKKU_LIB_PATH:-/var/lib/dokku}" call-sshcommand() { if [[ -x /usr/local/bin/sshcommand ]]; then /usr/local/bin/sshcommand "$@" elif [[ -x /usr/bin/sshcommand ]]; then /usr/bin/sshcommand "$@" else echo "Unable to find sshcommand binary" 1>&2 exit 1 fi } setup-docker-live-restore() { # skip if running in docker-based installation if [[ "$DOKKU_INIT_SYSTEM" == "sv" ]]; then return fi # allow disabling via /etc/default/dokku if [[ "$DOKKU_LIVE_RESTORE" == "false" ]]; then return fi live_restore="$(docker info --format '{{ .LiveRestoreEnabled }}' || true)" if [ "$live_restore" = "true" ]; then echo "Docker live-restore is already enabled" return fi echo "Enabling docker live-restore" if [[ ! -f /etc/docker/daemon.json ]]; then mkdir -p /etc/docker echo "{}" >/etc/docker/daemon.json fi config="$(jq '. + {"live-restore": true}' /etc/docker/daemon.json)" echo "$config" >/etc/docker/daemon.json if command -v systemctl &>/dev/null; then if ! systemctl reload docker; then echo "Unable to reload docker, please reload manually" 1>&2 fi else echo "Unable to reload docker, please reload manually" 1>&2 fi } setup-user() { echo "Setting up dokku user" call-sshcommand create dokku /usr/bin/dokku grep -i -E "^docker" /etc/group || groupadd docker usermod -aG docker dokku mkdir -p "$DOKKU_ROOT/.ssh" "$DOKKU_ROOT/.dokkurc" touch "$DOKKU_ROOT/.ssh/authorized_keys" chown -R dokku:dokku "$DOKKU_ROOT/.ssh" "${DOKKU_ROOT}/.dokkurc" } setup-storage() { echo "Setting up storage directories" mkdir -p "${DOKKU_LIB_ROOT}/data" "${DOKKU_LIB_ROOT}/data/storage" chown dokku:dokku "${DOKKU_LIB_ROOT}/data" } setup-plugins() { echo "Deleting invalid plugins" if [ -f "${DOKKU_LIB_ROOT}/core-plugins/available/" ]; then find "${DOKKU_LIB_ROOT}/core-plugins/available/" -type d -empty -delete fi if [ -f "${DOKKU_LIB_ROOT}/core-plugins/enabled/" ]; then find "${DOKKU_LIB_ROOT}/core-plugins/enabled/" -type d -empty -delete fi if [ -f "${DOKKU_LIB_ROOT}/plugins/available/" ]; then find "${DOKKU_LIB_ROOT}/plugins/available/" -type d -empty -delete fi if [ -f "${DOKKU_LIB_ROOT}/plugins/enabled/" ]; then find "${DOKKU_LIB_ROOT}/plugins/enabled/" -type d -empty -delete fi echo "Setting up plugin directories" # should be replaced by `plugn init` mkdir -p "${DOKKU_LIB_ROOT}/core-plugins/available" "${DOKKU_LIB_ROOT}/plugins/available" mkdir -p "${DOKKU_LIB_ROOT}/core-plugins/enabled" "${DOKKU_LIB_ROOT}/plugins/enabled" touch "${DOKKU_LIB_ROOT}/core-plugins/config.toml" "${DOKKU_LIB_ROOT}/plugins/config.toml" echo "Migrating old plugins" find ${DOKKU_LIB_ROOT}/plugins/ -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read -r plugin; do if [ "$plugin" = "available" ] || [ "$plugin" = "enabled" ]; then continue elif [ -f ${DOKKU_LIB_ROOT}/plugins/$plugin/.core ]; then rm -rf ${DOKKU_LIB_ROOT}/plugins/$plugin elif [ ! -d ${DOKKU_LIB_ROOT}/plugins/available/$plugin ]; then mv ${DOKKU_LIB_ROOT}/plugins/$plugin ${DOKKU_LIB_ROOT}/plugins/available fi done db_get "dokku/nginx_enable" echo "Enabling all core plugins" find "${DOKKU_LIB_ROOT}/core-plugins/available" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read -r plugin; do if [ "$plugin" = "nginx-vhosts" ] && [ "$RET" = "false" ]; then echo "Skipping enable of nginx-vhosts plugin" continue elif [ ! -d "${DOKKU_LIB_ROOT}/plugins/available/$plugin" ]; then ln -s "${DOKKU_LIB_ROOT}/core-plugins/available/$plugin" "${DOKKU_LIB_ROOT}/plugins/available/$plugin" PLUGIN_PATH="${DOKKU_LIB_ROOT}/core-plugins" plugn enable "$plugin" PLUGIN_PATH="${DOKKU_LIB_ROOT}/plugins" plugn enable "$plugin" fi done find -L "${DOKKU_LIB_ROOT}/core-plugins" -type l -delete find -L "${DOKKU_LIB_ROOT}/plugins" -type l -delete chown dokku:dokku -R "${DOKKU_LIB_ROOT}/plugins" "${DOKKU_LIB_ROOT}/core-plugins" echo "Install all core plugins" dokku plugin:install --core } setup-sshcommand() { echo "Ensure proper sshcommand path" echo '/usr/bin/dokku' >"${DOKKU_ROOT}/.sshcommand" if [[ -f .ssh/authorized_keys ]]; then sed -i.bak 's#/usr/local/bin/dokku#/usr/bin/dokku#' "${DOKKU_ROOT}/.ssh/authorized_keys" rm "${DOKKU_ROOT}/.ssh/authorized_keys" fi } dpkg-handling() { if [ -f "${DOKKU_ROOT}/VHOST" ]; then echo "VHOST file detected, skipping modification" else db_get "dokku/vhost_enable" if [ "$RET" = "true" ]; then db_get "dokku/hostname" echo "Setting VHOST contents to $RET" echo "$RET" >"${DOKKU_ROOT}/VHOST" chown dokku:dokku "${DOKKU_ROOT}/VHOST" fi fi if [ -z "${DEBCONF_RECONFIGURE}" ]; then db_get "dokku/key_file" if [ -f "$RET" ]; then call-sshcommand acl-add dokku default <"$RET" || true fi fi } case "$1" in abort-upgrade | abort-remove | abort-deconfigure) ;; configure) mandb [ ! -x /usr/bin/docker.io ] || ln -sf /usr/bin/docker.io /usr/local/bin/docker setup-user setup-storage dpkg-handling setup-plugins setup-sshcommand setup-docker-live-restore ;; *) echo "postinst called with unknown argument \`$1'" >&2 exit 1 ;; esac db_stop exit 0