summarylogtreecommitdiffstats
path: root/dokku.install
blob: 0aa7163f811819a5c75290314708151a25d1e8eb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/bin/bash

readonly DOKKU_ROOT="${DOKKU_ROOT:-/home/dokku}"
readonly DOKKU_LIB_ROOT="${DOKKU_LIB_PATH:-/var/lib/dokku}"
readonly DOKKU_LOGS_DIR="${DOKKU_LOGS_DIR:-/var/log/dokku}"

setup-user() {
  echo "Setting up dokku user"
  /usr/bin/sshcommand create dokku /usr/bin/dokku
  (grep -i -E "^docker" /etc/group || groupadd docker) &>/dev/null
  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 "Setting up plugin directories"
  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

  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 [ ! -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-dependencies --core
  dokku plugin:install --core
  rm -f /etc/update-motd.d/99-dokku

  sed -i 's/ syslog dokku$/ root dokku/g' /etc/logrotate.d/dokku
}

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
}

post_install() {
  setup-user
  setup-storage
  setup-plugins
  setup-sshcommand

  echo "Update version file"
  rm -f "${DOKKU_ROOT}/VERSION"
  cp "${DOKKU_LIB_ROOT}/VERSION" "${DOKKU_ROOT}/VERSION"

  echo "Update hostname"
  hostname -f > "${DOKKU_ROOT}/HOSTNAME"

  echo "
    Please add your ssh pubkey like:
      $ cat ~/.ssh/id_rsa.pub | sudo sshcommand acl-add dokku default

    To enable nginx autoconfiguration, add to your /etc/nginx/nginx.conf in http section:
      include /etc/nginx/conf.d/*.conf;
    And reload nginx:
      $ sudo systemctl reload nginx
  "
}

post_upgrade() {
  post_install "$1"
}

pre_remove() {
  echo "Destroying deployed applications"
  for app in $(DOKKU_QUIET_OUTPUT=1 dokku apps); do
    dokku --force apps:destroy "${app}"
  done

  dokku cleanup
}

post_remove() {
  rm -f /var/cache/dokku-completion
  rm -f /etc/systemd/system/dokku-redeploy.service
  rm -f /etc/systemd/system/dokku-retire.timer
  rm -f /etc/systemd/system/dokku-retire.service
  rm -f /etc/logrotate.d/dokku

  # Remove nginx configuration
  rm -f /etc/nginx/conf.d/dokku.conf

  # Remove data and logs
  rm -rf "${DOKKU_LIB_ROOT}"
  rm -rf "${DOKKU_LOGS_DIR}"

  # Remove dokku user and group
  userdel -r dokku &>/dev/null
  groupdel dokku &>/dev/null

  echo "
    Please remove to your /etc/nginx/nginx.conf in http section:
      include /etc/nginx/conf.d/*.conf;
    And reload nginx:
      $ sudo systemctl reload nginx
  "
}