#!/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-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 if [[ -f /sbin/modprobe ]]; then modprobe aufs || echo "WARNING: Restart server to finish installing dokku!" fi setup-user setup-storage dpkg-handling setup-plugins setup-sshcommand ;; *) echo "postinst called with unknown argument \`$1'" >&2 exit 1 ;; esac db_stop exit 0