more refinements
[discourse_docker.git] / launcher
CommitLineData
ace450bd 1#!/bin/bash
7e738616
S
2
3command=$1
4config=$2
55d17203
RW
5opt=$3
6
87756d6d
EH
7# Docker doesn't like uppercase characters, spaces or special characters, catch it now before we build everything out and then find out
8re='[A-Z/ !@#$%^&*()+~`=]'
9if [[ $config =~ $re ]];
10 then
8877f99e 11 echo
87756d6d
EH
12 echo "ERROR: Config name must not contain upper case characters, spaces or special characters. Correct config name and rerun $0."
13 echo
14 exit 1
15fi
16
7936ebaa 17cd "$(dirname "$0")"
55d17203 18
478e03e2
S
19docker_min_version='1.6.0'
20docker_rec_version='1.6.0'
60668406 21
8dea575c 22config_file=containers/"$config".yml
5201a40c 23cidbootstrap=cids/"$config"_bootstrap.cid
5efded6a 24local_discourse=local_discourse
fecfcdcf 25image=discourse/discourse:1.0.17
4807b1b8 26docker_path=`which docker.io || which docker`
f8c887b6
JP
27template_path=samples/standalone_template.yml
28changelog=/tmp/changelog # used to test whether sed did anything
8877f99e 29
e0fd1f5b
TB
30if [ "${SUPERVISED}" = "true" ]; then
31 restart_policy="--restart=no"
32 attach_on_start="-a"
33 attach_on_run="-a stdout -a stderr"
34else
35 attach_on_run="-d"
36fi
37
f2a3edee
AY
38if [ -n "$DOCKER_HOST" ]; then
39 docker_ip=`sed -e 's/^tcp:\/\/\(.*\):.*$/\1/' <<< "$DOCKER_HOST"`
40elif [ -x "$(which ip 2>/dev/null)" ]; then
813fef38 41 docker_ip=`ip addr show docker0 | \
03bb0735
LG
42 grep 'inet ' | \
43 awk '{ split($2,a,"/"); print a[1] }';`
44else
813fef38 45 docker_ip=`ifconfig | \
03bb0735
LG
46 grep -B1 "inet addr" | \
47 awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' | \
48 grep docker0 | \
49 awk -F: '{ print $3 }';`
50fi
80c11be3
SS
51
52
5f803fb4 53usage () {
55d17203 54 echo "Usage: launcher COMMAND CONFIG [--skip-prereqs]"
7e738616 55 echo "Commands:"
1acce9e4
SS
56 echo " start: Start/initialize a container"
57 echo " stop: Stop a running container"
58 echo " restart: Restart a container"
59 echo " destroy: Stop and remove a container"
2fc6ff36 60 echo " enter: Use nsenter to enter a container"
5f803fb4 61 echo " ssh: Start a bash shell in a running container"
1acce9e4 62 echo " logs: Docker logs for container"
408a9c19 63 echo " bootstrap: Bootstrap a container for the config based on a template"
680dd4ea 64 echo " rebuild: Rebuild a container (destroy old, bootstrap, start new)"
f8c887b6 65 echo " memconfig: Configure defaults based on available RAM"
a8b66f98 66 echo " cleanup: Remove all containers that have stopped for > 24 hours"
55d17203
RW
67 echo
68 echo "Options:"
d3c57e14 69 echo " --skip-prereqs Don't check prerequisites or resource requirements"
e02c1511 70 echo " --docker-args Extra arguments to pass when running docker"
7e738616
S
71 exit 1
72}
73
60668406
DP
74compare_version() {
75 declare -a ver_a
76 declare -a ver_b
77 IFS=. read -a ver_a <<< "$1"
78 IFS=. read -a ver_b <<< "$2"
79
80 while [[ -n $ver_a ]]; do
81 if (( ver_a > ver_b )); then
82 return 0
83 elif (( ver_b > ver_a )); then
84 return 1
85 else
86 unset ver_a[0]
87 ver_a=("${ver_a[@]}")
88 unset ver_b[0]
89 ver_b=("${ver_b[@]}")
90 fi
91 done
92 return 1 # They are equal
93}
94
a3e18d95
S
95prereqs() {
96
e741295a 97 # 1. docker daemon running?
30835a52
S
98 # we send stderr to /dev/null cause we don't care about warnings,
99 # it usually complains about swap which does not matter
100 test=`$docker_path info 2> /dev/null`
e741295a
MB
101
102 if [[ $? -ne 0 ]] ; then
103 echo "Cannot connect to the docker daemon - verify it is running and you have access"
104 exit 1
105 fi
106
185e78c6
S
107 # 2. running aufs or btrfs
108 test=`$docker_path info 2> /dev/null | grep 'Driver: '`
48f22d14
S
109 if [[ "$test" =~ [aufs|btrfs|zfs|overlay] ]] ; then : ; else
110 echo "Your Docker installation is not using a supported filesystem if we were to proceed you may have a broken install."
111 echo "aufs is the recommended filesystem you should be using (zfs/btrfs and overlay may work as well)"
112 echo "You can tell what filesystem you are using by running \"docker info\" and looking at the driver"
7d87f85f 113 echo ""
48f22d14
S
114 echo "If you wish to continue anyway using your existing unsupported filesystem"
115 echo "read the source code of launcher and figure out how to bypass this."
116 exit 1
a3e18d95
S
117 fi
118
60668406
DP
119 # 3. running recommended docker version
120 test=($($docker_path --version)) # Get docker version string
121 test=${test[2]//,/} # Get version alone and strip comma if exists
a3e18d95 122
60668406 123 # At least minimum version
cf00fce0 124 if compare_version "${docker_min_version}" "${test}"; then
60668406 125 echo "ERROR: Docker version ${test} not supported, please upgrade to at least ${docker_min_version}, or recommended ${docker_rec_version}"
a3e18d95
S
126 exit 1
127 fi
128
60668406
DP
129 # Recommend best version
130 if compare_version "${docker_rec_version}" "${test}"; then
131 echo "WARNING: Docker version ${test} deprecated, recommend upgrade to ${docker_rec_version} or newer."
132 fi
133
405948ee
S
134 # 4. discourse docker image is downloaded
135 test=`$docker_path images | awk '{print $1 ":" $2 }' | grep "$image"`
136
137 if [ -z "$test" ]; then
138 echo
139 echo "WARNING: We are about to start downloading the Discourse base image"
140 echo "This process may take anywhere between a few minutes to an hour, depending on your network speed"
141 echo
142 echo "Please be patient"
143 echo
144
145 fi
405948ee
S
146
147 # 5. able to attach stderr / out / tty
e02c1511 148 test=`$docker_path run $user_args -i --rm -a stdout -a stderr $image echo working`
a3e18d95
S
149 if [[ "$test" =~ "working" ]] ; then : ; else
150 echo "Your Docker installation is not working correctly"
151 echo
152 echo "See: https://meta.discourse.org/t/docker-error-on-bootstrap/13657/18?u=sam"
153 exit 1
154 fi
4770834b 155
6e784be6
MP
156}
157
158check_resources() {
159 # Memory
a752d8ea 160 resources="ok"
b3f0d057 161 avail_mem="$(LANG=C free -m | grep '^Mem:' | awk '{print $2}')"
a752d8ea
MP
162 if [ "$avail_mem" -lt 900 ]; then
163 resources="insufficient"
164 echo "WARNING: You do not appear to have sufficient memory to run Discourse."
165 echo
166 echo "Your system may not work properly, or future upgrades of Discourse may"
167 echo "not complete successfully."
b3f0d057
MP
168 echo
169 echo "See https://github.com/discourse/discourse/blob/master/docs/INSTALL-cloud.md#create-new-cloud-server"
a752d8ea 170 elif [ "$avail_mem" -lt 1800 ]; then
b3f0d057
MP
171 total_swap="$(LANG=C free -m | grep ^Swap: | awk '{print $2}')"
172 if [ "$total_swap" -lt 1000 ]; then
efd8ae0f 173 resources="insufficient"
a752d8ea
MP
174 echo "WARNING: You must have at least 1GB of swap when running with less"
175 echo "than 2GB of RAM."
176 echo
177 echo "Your system may not work properly, or future upgrades of Discourse may"
178 echo "not complete successfully."
b3f0d057
MP
179 echo
180 echo "See https://github.com/discourse/discourse/blob/master/docs/INSTALL-cloud.md#set-up-swap-if-needed"
b3f0d057
MP
181 fi
182 fi
4770834b 183
6e784be6 184 # Disk space
4770834b
MP
185 free_disk="$(df /var | tail -n 1 | awk '{print $4}')"
186 if [ "$free_disk" -lt 5000 ]; then
a752d8ea
MP
187 resources="insufficient"
188 echo "WARNING: You must have at least 5GB of *free* disk space to run Discourse."
189 echo
190 echo "Insufficient disk space may result in problems running your site, and may"
191 echo "not even allow Discourse installation to complete successfully."
4770834b
MP
192 echo
193 echo "Please free up some space, or expand your disk, before continuing."
194 exit 1
195 fi
a752d8ea
MP
196
197 if [ -t 0 ] && [ "$resources" != "ok" ]; then
198 echo
199 read -p "Press ENTER to continue, or Ctrl-C to exit and give your system more resources"
200 fi
a3e18d95
S
201}
202
c574dbda
GXT
203check_ports() {
204 local valid=$(netstat -tln | awk '{print $4}' | grep ":${1}\$")
205
206 if [ -n "$valid" ]; then
207 echo "Launcher has detected that port ${1} is in use."
208 echo ""
209 echo "If you are trying to run Discourse simultaneously with another web server like Apache or nginx, you will need to bind to a different port."
210 echo "See https://meta.discourse.org/t/17247 for help."
1410a21f 211 echo "To continue anyway, re-run Launcher with --skip-prereqs"
c574dbda
GXT
212 exit 1
213 fi
214}
215
55d17203
RW
216if [ "$opt" != "--skip-prereqs" ] ; then
217 prereqs
218fi
a3e18d95 219
e02c1511
S
220if [ "$opt" == "--docker-args" ] ; then
221 user_args=$4
222else
223 user_args=""
224fi
225
88126eba 226get_ssh_pub_key() {
c76db1ea
MK
227 local ${ssh_key_locations}
228 ssh_key_locations=(
841334d9
MK
229 ~/.ssh/id_ed25519.pub
230 ~/.ssh/id_ecdsa.pub
c76db1ea
MK
231 ~/.ssh/id_rsa.pub
232 ~/.ssh/id_dsa.pub
841334d9 233 ~core/.ssh/authorized_keys
c76db1ea
MK
234 )
235
236 local $keyfile
237 for keyfile in "${ssh_key_locations[@]}"; do
238 if [[ -e ${keyfile} ]] ; then
239 ssh_pub_key="$(cat ${keyfile})"
841334d9 240 return 0
c76db1ea
MK
241 fi
242 done
243
e3709631 244 return 0
88126eba
S
245}
246
247
52388b87
SS
248install_docker() {
249
5933f559
DP
250 echo "Docker is not installed, you will need to install Docker in order to run Discourse"
251 echo "Please visit https://docs.docker.com/installation/ for instructions on how to do this for your system"
52388b87 252 echo
5933f559 253 echo "If you are running Ubuntu Trusty or later, you can try the following:"
52388b87
SS
254 echo
255
b749fe0c 256 echo "sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D"
5933f559 257 echo "sudo sh -c \"echo deb https://apt.dockerproject.org/repo ubuntu-$(lsb_release -sc) main > /etc/apt/sources.list.d/docker.list\""
52388b87 258 echo "sudo apt-get update"
b749fe0c 259 echo "sudo apt-get install docker-engine"
52388b87
SS
260
261 exit 1
262}
263
60f9f04c
S
264host_run() {
265 read -r -d '' env_ruby << 'RUBY'
266 require 'yaml'
267
268 input = STDIN.readlines.join
269 yaml = YAML.load(input)
270
271 if host_run = yaml['host_run']
272 params = yaml['params'] || {}
273 host_run.each do |run|
274 params.each do |k,v|
275 run = run.gsub("$#{k}", v)
276 end
277 STDOUT.write "#{run}--SEP--"
278 end
279 end
280RUBY
281
e02c1511 282 host_run=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e "$env_ruby"`
60f9f04c
S
283
284 while [ "$host_run" ] ; do
285 iter=${host_run%%--SEP--*}
286 echo
287 echo "Host run: $iter"
288 $iter || exit 1
289 echo
290 host_run="${host_run#*--SEP--}"
291 done
292}
293
294
d90671f3 295set_volumes() {
e02c1511 296 volumes=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
d90671f3
SS
297 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['volumes'].map{|v| '-v ' << v['volume']['host'] << ':' << v['volume']['guest'] << ' '}.join"`
298}
299
41daa523 300set_links() {
e02c1511 301 links=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
41daa523 302 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['links'].map{|l| '--link ' << l['link']['name'] << ':' << l['link']['alias'] << ' '}.join"`
303}
304
7f77c274
SS
305set_template_info() {
306
e02c1511 307 templates=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
7f77c274
SS
308 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['templates']"`
309
310
311 arrTemplates=(${templates// / })
312 config_data=$(cat $config_file)
313
314 input="hack: true"
315
7f77c274
SS
316 for template in "${arrTemplates[@]}"
317 do
318 [ ! -z $template ] && {
319 input="$input _FILE_SEPERATOR_ $(cat $template)"
320 }
321 done
322
323 # we always want our config file last so it takes priority
324 input="$input _FILE_SEPERATOR_ $config_data"
325
326 read -r -d '' env_ruby << 'RUBY'
327 require 'yaml'
328
329 input=STDIN.readlines.join
3cb3d9c4
S
330 # default to UTF-8 for the dbs sake
331 env = {'LANG' => 'en_US.UTF-8'}
7f77c274
SS
332 input.split('_FILE_SEPERATOR_').each do |yml|
333 yml.strip!
334 begin
335 env.merge!(YAML.load(yml)['env'] || {})
f3824347 336 rescue Psych::SyntaxError => e
337 puts e
338 puts "*ERROR."
7f77c274
SS
339 rescue => e
340 puts yml
341 p e
342 end
343 end
4b563ee8 344 puts env.map{|k,v| "-e\n#{k}=#{v}" }.join("\n")
7f77c274
SS
345RUBY
346
e02c1511 347 raw=`exec echo "$input" | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e "$env_ruby"`
4b563ee8
SS
348
349 env=()
f3824347 350 ok=1
4b563ee8 351 while read i; do
f3824347 352 if [ "$i" == "*ERROR." ]; then
353 ok=0
354 elif [ -n "$i" ]; then
16f2d250
S
355 env[${#env[@]}]=$i
356 fi
4b563ee8
SS
357 done <<< "$raw"
358
f3824347 359 if [ "$ok" -ne 1 ]; then
360 echo "${env[@]}"
d6d1fb6e 361 echo "YAML syntax error. Please check your /var/discourse/containers/*.yml config files."
f3824347 362 exit 1
363 fi
7f77c274
SS
364}
365
52388b87
SS
366[ -z $docker_path ] && {
367 install_docker
368}
369
de869404 370[ "$command" == "cleanup" ] && {
c692f743
L
371 echo
372 echo "The following command will"
373 echo "- Delete all docker images for old containers"
374 echo "- Delete all stopped and orphan containers"
375 echo
376 read -p "Are you sure (Y/n): " -n 1 -r && echo
377 if [[ $REPLY =~ ^[Yy]$ || ! $REPLY ]]
378 then
30835a52 379 space=$(df /var/lib/docker | awk '{ print $4 }' | grep -v Available)
29a35d1b 380 echo "Starting Cleanup (bytes free $space)"
30835a52 381
29a35d1b 382 STATE_DIR=./.gc-state scripts/docker-gc
30835a52 383
29a35d1b
S
384 space=$(df /var/lib/docker | awk '{ print $4 }' | grep -v Available)
385 echo "Finished Cleanup (bytes free $space)"
30835a52 386
c692f743 387 else
30835a52 388 exit 1
c692f743 389 fi
a8b66f98
L
390 exit 0
391}
5f803fb4 392
c1005add 393[ $# -lt 2 ] && {
5f803fb4
SS
394 usage
395}
396
f8c887b6 397if [[ ! -e $config_file && $command -ne "memconfig" ]]
7e738616
S
398 then
399 echo "Config file was not found, ensure $config_file exists"
71680b16
S
400 echo ""
401 echo "Available configs ( `cd containers && ls -dm *.yml | tr -s '\n' ' ' | awk '{ gsub(/\.yml/, ""); print }'`)"
7e738616
S
402 exit 1
403fi
404
e2ed1fb6
S
405docker_version=($($docker_path --version))
406docker_version=${test[2]//,/}
69545efd 407restart_policy=${restart_policy:---restart=always}
e2ed1fb6 408
30835a52 409set_existing_container(){
295e8f19 410 existing=`$docker_path ps -a | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
337a89aa
S
411}
412
30835a52 413run_stop(){
337a89aa 414
30835a52 415 set_existing_container
60f9f04c 416
30835a52 417 if [ ! -z $existing ]
337a89aa 418 then
30835a52
S
419 (
420 set -x
421 $docker_path stop -t 10 $config
422 )
337a89aa 423 else
30835a52
S
424 echo "$config was not started !"
425 exit 1
426 fi
427}
337a89aa 428
8877f99e
S
429set_run_image() {
430 run_image=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
431 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['run_image']"`
432
433 if [ -z "$run_image" ]; then
434 run_image="$local_discourse/$config"
435 fi
436}
437
438set_boot_command() {
439 boot_command=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
440 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['boot_command']"`
441
442 if [ -z "$boot_command" ]; then
443
444 no_boot_command=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
445 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['no_boot_command']"`
446
447 if [ -z "$no_boot_command" ]; then
448 boot_command="/sbin/boot"
449 fi
450 fi
451}
452
f8c887b6
JP
453run_memconfig(){
454 if [ "$opt" != "--skip-prereqs" ] ; then
455 check_resources
456 fi
457 if [ -f $config_file ]
458 then
459 cp $config_file $config_file.bak
460 echo "Saving $config_file as $config_file.bak"
461 else
462 echo "Creating $config_file from $template_path"
463 if [ ! -f $template_path ]
464 then
465 echo "$template_path is missing. Exiting."
466 exit 1
467 fi
468 cp $template_path $config_file
469 fi
470
471 # get free mem
472 avail_mem="$(LANG=C free -m | grep '^Mem:' | awk '{print $2}')"
473 avail_gb=`expr $(($avail_mem / 950))`
474 avail_cores=`grep -c processor /proc/cpuinfo`
475 echo "Found $avail_mem (${avail_gb}GB), of memory and $avail_cores cores."
476
477 # set db_shared_buffers: "128MB" (1GB) or 256MB * GB
478 if [ "$avail_gb" -eq "1" ]
479 then
480 db_shared_buffers="128"
481 else
482 db_shared_buffers=`expr $avail_gb \* 256`
483 fi
484 echo -e "Setting db_shared_buffers to ${db_shared_buffers}GB\c"
485 sed -i -e "s/^ db_shared_buffers:.*/ db_shared_buffers: \"${db_shared_buffers}GB\"/w $changelog" $config_file
486 if [ -s $changelog ]
487 then
488 echo " successfully."
489 rm $changelog
490 else
491 echo -e ". . . oops!\n---> db_shared_buffers not found in $config_file. Retaining defaults."
492 fi
493
f8c887b6
JP
494 # set UNICORN_WORKERS: 2*GB or 2*cores (the same on DO)
495 if [ "$avail_gb" -le "2" ]
496 then
497 unicorn_workers=`expr $avail_gb \* 2`
498 else
499 unicorn_workers=`expr $avail_cores \* 2`
500 fi
501
502 echo -e "Setting UNICORN_WORKERS to $unicorn_workers\c"
503 sed -i -e "s/^ UNICORN_WORKERS:.*/ UNICORN_WORKERS: ${unicorn_workers}/w $changelog" $config_file
504 if [ -s $changelog ]
505 then
506 echo " successfully."
507 rm $changelog
508 else
509 echo -e ". . . oops!\n---> UNICORN_WORKERS not found in $config_file. Retaining defaults.\n"
510 fi
511}
512
30835a52 513run_start(){
337a89aa 514
295e8f19
S
515 existing=`$docker_path ps | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
516 echo $existing
30835a52
S
517 if [ ! -z $existing ]
518 then
519 echo "Nothing to do, your container has already started!"
520 exit 1
521 fi
522
295e8f19 523 existing=`$docker_path ps -a | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
30835a52
S
524 if [ ! -z $existing ]
525 then
526 echo "starting up existing container"
527 (
528 set -x
529 $docker_path start $config
530 )
531 exit 0
532 fi
533
534 host_run
535 ports=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
c574dbda
GXT
536 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['expose'].map{|p| \"-p #{p}\"}.join(' ')"`
537
538 IFS='-p ' read -a array <<< "$ports"
539 for element in "${array[@]}"
540 do
541 IFS=':' read -a args <<< "$element"
542 if [ "${#args[@]}" == "2" ]; then
543 check_ports "${args[0]}"
544 elif [ "${#args[@]}" == "3" ]; then
545 check_ports "${args[1]}"
546 fi
547 done
30835a52 548
8b617e6e
PG
549 docker_args=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
550 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['docker_args']"`
551
30835a52
S
552 set_template_info
553 set_volumes
554 set_links
8877f99e
S
555 set_run_image
556 set_boot_command
30835a52 557
c6dd6f9d
FB
558 # get hostname and settings from container configuration
559 for envar in "${env[@]}"
560 do
561 if [[ $envar == DOCKER_USE_HOSTNAME* ]] || [[ $envar == DISCOURSE_HOSTNAME* ]]
562 then
563 # use as environment variable
564 eval $envar
565 fi
566 done
567
30835a52 568 (
c834fdd1 569 hostname=`hostname -s`
c6dd6f9d
FB
570 # overwrite hostname
571 if [ "$DOCKER_USE_HOSTNAME" = "true" ]
572 then
573 hostname=$DISCOURSE_HOSTNAME
574 else
575 hostname=$hostname-$config
576 fi
577
a0606001
S
578 # we got to normalize so we only have allowed strings, this is more comprehensive but lets see how bash does first
579 # hostname=`$docker_path run $user_args --rm $image ruby -e 'print ARGV[0].gsub(/[^a-zA-Z-]/, "-")' $hostname`
580 # docker added more hostname rules
581 hostname=${hostname/_/-}
582
30835a52 583 set -x
c6dd6f9d 584 $docker_path run $user_args $links $attach_on_run $restart_policy "${env[@]}" -h "$hostname" \
8877f99e 585 -e DOCKER_HOST_IP=$docker_ip --name $config -t $ports $volumes $docker_args $run_image $boot_command
30835a52
S
586
587 )
588 exit 0
337a89aa
S
589
590}
591
ec8f8b83
JP
592mail_config_check(){
593 mail_config_verbose=0 # 1 prints mail config to stdout
594 mail_config="ok"
6ac9d871 595 for x in DISCOURSE_SMTP_ADDRESS DISCOURSE_SMTP_USER_NAME DISCOURSE_SMTP_PASSWORD
ec8f8b83
JP
596 do
597 mail_var=`grep "^ $x:" $config_file`
598 result=$?
599 if (( result == 0 ))
600 then
601 if [ "$mail_config_verbose" -eq 1 ]; then
602 echo "$mail_var"
603 fi
604 else
605 echo "Warning: $x not configured."
606 mail_config="dubious"
607 fi
608 done
609 if [ -t 0 ] && [ "$mail_config" != "ok" ]; then
610 echo
611 read -p "Press ENTER to continue, or Ctrl-C to exit and fix your mail config."
612 fi
613}
614
680dd4ea 615run_bootstrap(){
60f9f04c 616
d3c57e14 617 if [ "$opt" != "--skip-prereqs" ] ; then
ec8f8b83 618 check_resources
d3c57e14 619 fi
6e784be6 620
ec8f8b83
JP
621 mail_config_check
622
60f9f04c
S
623 host_run
624
680dd4ea 625 get_ssh_pub_key
88126eba 626
680dd4ea
S
627 # Is the image available?
628 # If not, pull it here so the user is aware what's happening.
4807b1b8 629 $docker_path history $image >/dev/null 2>&1 || $docker_path pull $image
88126eba 630
680dd4ea 631 set_template_info
93149421 632
e02c1511 633 base_image=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
680dd4ea 634 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['base_image']"`
93149421 635
e02c1511 636 update_pups=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
680dd4ea 637 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['update_pups']"`
b9c7b50e 638
680dd4ea
S
639 if [[ ! X"" = X"$base_image" ]]; then
640 image=$base_image
641 fi
b9c7b50e 642
680dd4ea 643 set_volumes
41daa523 644 set_links
b9c7b50e 645
680dd4ea 646 rm -f $cidbootstrap
d90671f3 647
680dd4ea
S
648 run_command="cd /pups &&"
649 if [[ ! "false" = $update_pups ]]; then
650 run_command="$run_command git pull &&"
651 fi
652 run_command="$run_command /pups/bin/pups --stdin"
2162f1d4 653
680dd4ea 654 echo $run_command
b9c7b50e 655
680dd4ea 656 env=("${env[@]}" "-e" "SSH_PUB_KEY=$ssh_pub_key")
c4498636 657
e02c1511 658 (exec echo "$input" | $docker_path run $user_args $links "${env[@]}" -e DOCKER_HOST_IP=$docker_ip --cidfile $cidbootstrap -i -a stdin -a stdout -a stderr $volumes $image \
680dd4ea 659 /bin/bash -c "$run_command") \
4807b1b8 660 || ($docker_path rm `cat $cidbootstrap` && rm $cidbootstrap)
88126eba 661
4b733d87 662 [ ! -e $cidbootstrap ] && echo "** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one" && exit 1
9fb5f2d3 663
680dd4ea 664 sleep 5
2162f1d4 665
4807b1b8
MB
666 $docker_path commit `cat $cidbootstrap` $local_discourse/$config || echo 'FAILED TO COMMIT'
667 $docker_path rm `cat $cidbootstrap` && rm $cidbootstrap
680dd4ea 668}
9fb5f2d3 669
8877f99e
S
670
671
680dd4ea
S
672case "$command" in
673 bootstrap)
680dd4ea 674 run_bootstrap
2dd2e330 675 echo "Successfully bootstrapped, to startup use ./launcher start $config"
4b3aebe1 676 exit 0
5f803fb4 677 ;;
1acce9e4 678
2fc6ff36 679 enter)
0c456e8c 680 exec $docker_path exec -it $config /bin/bash --login
2fc6ff36
S
681 ;;
682
5f803fb4 683 ssh)
295e8f19 684 existing=`$docker_path ps | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
30835a52
S
685
686 if [[ ! -z $existing ]]; then
687 address="`$docker_path port $config 22`"
688 split=(${address//:/ })
689 exec ssh -o StrictHostKeyChecking=no root@${split[0]} -p ${split[1]}
690 else
691 echo "$config is not running!"
692 exit 1
693 fi
5f803fb4 694 ;;
7e738616 695
5f803fb4 696 stop)
337a89aa
S
697 run_stop
698 exit 0
5f803fb4 699 ;;
7e738616 700
5f803fb4 701 logs)
7e738616 702
30835a52
S
703 $docker_path logs $config
704 exit 0
5f803fb4 705 ;;
7e738616 706
337a89aa
S
707 restart)
708 run_stop
709 run_start
710 exit 0
711 ;;
80c11be3 712
337a89aa
S
713 start)
714 run_start
715 exit 0
5f803fb4 716 ;;
7e738616 717
f8c887b6
JP
718 memconfig)
719 run_memconfig
720 exit 0
721 ;;
722
680dd4ea 723 rebuild)
4b6456ef 724 if [ "$(git symbolic-ref --short HEAD)" == "master" ]; then
098533cb
S
725 echo "Ensuring discourse docker is up to date"
726
727 git remote update
728
729 LOCAL=$(git rev-parse @)
730 REMOTE=$(git rev-parse @{u})
731 BASE=$(git merge-base @ @{u})
732
733 if [ $LOCAL = $REMOTE ]; then
734 echo "Discourse Docker is up-to-date"
735
736 elif [ $LOCAL = $BASE ]; then
737 echo "Updating Discourse Docker"
738 git pull || (echo 'failed to update' && exit 1)
739 exec /bin/bash $0 $@
740
741 elif [ $REMOTE = $BASE ]; then
742 echo "Your version of Discourse Docker is ahead of origin"
743
744 else
905ec302 745 echo "Discourse Docker has diverged source, this is only expected in Dev mode"
098533cb
S
746 fi
747
4b6456ef 748 fi
30835a52
S
749
750 set_existing_container
751
752 if [ ! -z $existing ]
680dd4ea
S
753 then
754 echo "Stopping old container"
30835a52
S
755 (
756 set -x
757 $docker_path stop -t 10 $config
758 )
680dd4ea
S
759 fi
760
761 run_bootstrap
762
30835a52 763 if [ ! -z $existing ]
680dd4ea 764 then
30835a52
S
765 echo "Removing old container"
766 (
767 set -x
768 $docker_path rm $config
769 )
680dd4ea
S
770 fi
771
772 run_start
773 exit 0
774 ;;
775
7e738616 776
5f803fb4 777 destroy)
30835a52
S
778 (set -x; $docker_path stop -t 10 $config && $docker_path rm $config) || (echo "$config was not found" && exit 0)
779 exit 0
5f803fb4
SS
780 ;;
781esac
7e738616 782
5f803fb4 783usage