This makes the installation a bit more secure by ensuring a user does not accidentally expose a way for unauthorized users to add new ssh keys to the system. Additionally, this removes the extra HOSTNAME file to make the initial install process easier (that file was not modifiable by any dokku commands. Closes #2247
151 lines
4.6 KiB
Bash
Executable File
151 lines
4.6 KiB
Bash
Executable File
#!/bin/bash
|
|
set -eo pipefail
|
|
[[ $TRACE ]] && set -x
|
|
|
|
if [[ -e /usr/share/debconf/confmodule ]]; then
|
|
# shellcheck disable=SC1091
|
|
. /usr/share/debconf/confmodule
|
|
fi
|
|
|
|
if [[ -r /etc/default/dokku ]]; then
|
|
# shellcheck disable=SC1091
|
|
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}" -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"
|
|
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
|
|
setup-plugins
|
|
setup-sshcommand
|
|
dpkg-handling
|
|
;;
|
|
|
|
*)
|
|
echo "postinst called with unknown argument \`$1'" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
db_stop
|
|
exit 0
|