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