init 6.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #!/bin/bash
  2. set -e
  3. cd /app
  4. # Default to the environment variable values set in .env.example
  5. source /app/.env.example
  6. # Cleanup any leftover pid file
  7. if [ -f /app/tmp/pids/server.pid ]; then
  8. rm /app/tmp/pids/server.pid
  9. fi
  10. # is a mysql or postgresql database linked?
  11. # requires that the mysql or postgresql containers have exposed
  12. # port 3306 and 5432 respectively.
  13. if [ -n "${MYSQL_PORT_3306_TCP_ADDR}" ]; then
  14. HUGINN_DATABASE_ADAPTER=${HUGINN_DATABASE_ADAPTER:-mysql2}
  15. HUGINN_DATABASE_HOST=${HUGINN_DATABASE_HOST:-${MYSQL_PORT_3306_TCP_ADDR}}
  16. HUGINN_DATABASE_PORT=${HUGINN_DATABASE_PORT:-${MYSQL_PORT_3306_TCP_PORT}}
  17. elif [ -n "${POSTGRES_PORT_5432_TCP_ADDR}" ]; then
  18. HUGINN_DATABASE_ADAPTER=${HUGINN_DATABASE_ADAPTER:-postgresql}
  19. HUGINN_DATABASE_HOST=${HUGINN_DATABASE_HOST:-${POSTGRES_PORT_5432_TCP_ADDR}}
  20. HUGINN_DATABASE_PORT=${HUGINN_DATABASE_PORT:-${POSTGRES_PORT_5432_TCP_PORT}}
  21. fi
  22. grep = /app/.env.example | sed -e 's/^#\([^ ]\)/\1/' | grep -v -e '^#' | cut -d= -f1 | \
  23. while read var ; do
  24. eval "echo \"$var=\\\"\${HUGINN_$var:-\$$var}\\\"\""
  25. done | grep -v -e ^= > /app/.env
  26. chmod ugo+r /app/.env
  27. source /app/.env
  28. sudo -u huginn -H bundle install --deployment --without test
  29. DATABASE_HOST=${HUGINN_DATABASE_HOST:-${DATABASE_HOST:-localhost}}
  30. DATABASE_ENCODING=${HUGINN_DATABASE_ENCODING:-${DATABASE_ENCODING}}
  31. USE_GRAPHVIZ_DOT=${HUGINN_USE_GRAPHVIZ_DOT:-${USE_GRAPHVIZ_DOT}}
  32. # use default port number if it is still not set
  33. case "${DATABASE_ADAPTER}" in
  34. mysql2) DATABASE_PORT=${DATABASE_PORT:-3306} ;;
  35. postgresql) DATABASE_PORT=${DATABASE_PORT:-5432} ;;
  36. *) echo "Unsupported database adapter. Available adapters are mysql2, and postgresql." && exit 1 ;;
  37. esac
  38. # initialize supervisord config
  39. cat > /etc/supervisor/conf.d/supervisord.conf <<EOF
  40. [supervisord]
  41. nodaemon = true
  42. user = root
  43. stdout_logfile = AUTO
  44. [unix_http_server]
  45. file=/var/run/supervisor.sock ; (the path to the socket file)
  46. [eventlistener:stdout]
  47. command = supervisor_stdout
  48. buffer_size = 100
  49. events = PROCESS_LOG
  50. result_handler = supervisor_stdout:event_handler
  51. EOF
  52. # prepare the supervisord bootstrap service script
  53. cat <<BOOTSTRAP > /tmp/bootstrap.sh
  54. #!/bin/bash -e
  55. source /app/.env
  56. echo DATABASE_HOST=\${DATABASE_HOST}
  57. # start mysql server if \${DATABASE_HOST} is the .env.example default
  58. if [ "\${DATABASE_HOST}" = "your-domain-here.com" -o "\${DATABASE_HOST}" = "" ]; then
  59. if [ "\${DATABASE_ADAPTER}" = "postgresql" ]; then
  60. echo "DATABASE_ADAPTER 'postgresql' is not supported internally. Please provide DATABASE_HOST."
  61. exit 1
  62. fi
  63. # configure supervisord to start mysql (manual)
  64. cat > /etc/supervisor/conf.d/mysqld.conf <<EOF
  65. [program:mysqld]
  66. priority=20
  67. directory=/tmp
  68. command=/usr/bin/mysqld_safe
  69. user=root
  70. autostart=false
  71. autorestart=true
  72. stdout_events_enabled=true
  73. stderr_events_enabled=true
  74. EOF
  75. supervisorctl reread
  76. supervisorctl add mysqld
  77. # fix permissions and ownership of /var/lib/mysql
  78. chown -R mysql:mysql /var/lib/mysql
  79. chmod 700 /var/lib/mysql
  80. # initialize MySQL data directory
  81. if [ ! -d /var/lib/mysql/mysql ]; then
  82. mysql_install_db --user=mysql
  83. fi
  84. echo "Starting mysql server..."
  85. supervisorctl start mysqld >/dev/null
  86. # wait for mysql server to start (max 120 seconds)
  87. timeout=120
  88. while ! mysqladmin -u\${DATABASE_USERNAME:-root} \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD} status >/dev/null 2>&1
  89. do
  90. (( timeout = timeout - 1 ))
  91. if [ \$timeout -eq 0 ]; then
  92. echo "Failed to start mysql server"
  93. exit 1
  94. fi
  95. echo -n .
  96. sleep 1
  97. done
  98. if ! echo "USE \${DATABASE_NAME}" | mysql -u\${DATABASE_USERNAME:-root} \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD} >/dev/null 2>&1; then
  99. DB_INIT="yes"
  100. echo "CREATE DATABASE IF NOT EXISTS \\\`\${DATABASE_NAME}\\\` DEFAULT CHARACTER SET \\\`utf8\\\` COLLATE \\\`utf8_unicode_ci\\\`;" | mysql -uroot \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD}
  101. echo "GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON \\\`${DATABASE_NAME}\\\`.* TO 'root'@'localhost';" | mysql -u\${DATABASE_USERNAME:-root} \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD}
  102. fi
  103. fi
  104. supervisorctl start foreman >/dev/null
  105. BOOTSTRAP
  106. chmod 755 /tmp/bootstrap.sh
  107. cat > /etc/supervisor/conf.d/bootstrap.conf <<EOF
  108. [program:bootstrap]
  109. command=/tmp/bootstrap.sh
  110. priority=10
  111. directory=/app
  112. process_name=%(program_name)s
  113. autostart=true
  114. autorestart=false
  115. stdout_events_enabled=true
  116. stderr_events_enabled=true
  117. stopsignal=TERM
  118. exitcodes=0
  119. startsecs=0
  120. stopwaitsecs=1
  121. EOF
  122. cat <<FOREMAN > /tmp/foreman.sh
  123. #!/bin/bash -e
  124. source /app/.env
  125. # The database may need to start up for a bit first
  126. if [ -n "\${INTENTIONALLY_SLEEP}" ]; then
  127. echo "Intentionally sleeping \${INTENTIONALLY_SLEEP}"
  128. sleep \${INTENTIONALLY_SLEEP}
  129. fi
  130. if [ -n "\${DATABASE_INITIAL_CONNECT_MAX_RETRIES}" ]; then
  131. max=\${DATABASE_INITIAL_CONNECT_MAX_RETRIES}
  132. count=0
  133. while ! rake database_test:ping > /dev/null 2>&1 && [[ \$count -le \$max ]] ; do
  134. count=\$[\$count+1]
  135. echo "Retry \$count of \$max attempting to connect to \$DATABASE_HOST. Sleeping \${DATABASE_INITIAL_CONNECT_SLEEP:5}"
  136. sleep \${DATABASE_INITIAL_CONNECT_SLEEP:5}
  137. done
  138. fi
  139. # We may need to try and create a database
  140. if [ -n "\${CREATE_DB}" ]; then
  141. sudo -u huginn -EH bundle exec rake db:create
  142. fi
  143. # Assuming we have a created database, run the migrations and seed it idempotently.
  144. if [ -z "\${DO_NOT_MIGRATE}" ]; then
  145. sudo -u huginn -EH bundle exec rake db:migrate
  146. fi
  147. if [ -z "\${DO_NOT_SEED}" ]; then
  148. sudo -u huginn -EH bash -xc 'bundle exec rake db:seed &'
  149. fi
  150. # Fixup the Procfile and prepare the PORT
  151. if [ -n "\${DO_NOT_RUN_JOBS}" ]; then
  152. perl -pi -e 's/^jobs:/#jobs:/' /app/Procfile
  153. fi
  154. perl -pi -e 's/rails server -b0.0.0.0\$/rails server -b 0.0.0.0 -p \\\$PORT/' /app/Procfile
  155. export PORT="\${PORT:-3000}"
  156. # Start huginn
  157. exec sudo -u huginn -EH bash -xc 'exec bundle exec foreman start'
  158. FOREMAN
  159. chmod 755 /tmp/foreman.sh
  160. cat > /etc/supervisor/conf.d/foreman.conf <<EOF
  161. [program:foreman]
  162. command=/tmp/foreman.sh
  163. priority=10
  164. directory=/app
  165. process_name=%(program_name)s
  166. autostart=false
  167. autorestart=false
  168. stdout_events_enabled=true
  169. stderr_events_enabled=true
  170. stopsignal=TERM
  171. startsecs=0
  172. stopwaitsecs=1
  173. EOF
  174. # start supervisord
  175. exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf