Remove additional exit command (#485)
[discourse_docker.git] / discourse-setup
CommitLineData
f17af951 1#!/usr/bin/env bash
275735af
JP
2DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
3cd $DIR
c2d3ee4a 4
ebdd72f3
JA
5##
6## Make sure only root can run our script
7##
8check_root() {
9 if [[ $EUID -ne 0 ]]; then
10 echo "This script must be run as root. Please sudo or log in as root first." 1>&2
11 exit 1
12 fi
13}
14
07f3b11e 15##
7f2d6260 16## Check whether a connection to HOSTNAME ($1) on PORT ($2) is possible
07f3b11e 17##
7f2d6260
JP
18connect_to_port () {
19 HOST="$1"
20 PORT="$2"
b6379984
RH
21 VERIFY=$(date +%s | sha256sum | base64 | head -c 20)
22 if ! [ -x "$(command -v nc)" ]; then
23 echo "In order to check the connection to $HOST:$PORT we need to open a socket using netcat."
24 echo However netcat is not installed on your system. You can continue without this check
25 echo or abort the setup, install netcat and try again.
26 while true; do
27 read -p "Would you like to continue without this check? [yn] " yn
28 case $yn in
29 [Yy]*) return 2 ;;
30 [Nn]*) exit ;;
31 *) echo "Please answer y or n." ;;
32 esac
33 done
07f3b11e 34 else
b6379984
RH
35 echo -e "HTTP/1.1 200 OK\n\n $VERIFY" | nc -w 4 -l -p $PORT >/dev/null 2>&1 &
36 if curl --proto =http -s $HOST:$PORT --connect-timeout 3 | grep $VERIFY >/dev/null 2>&1; then
37 return 0
38 else
39 curl --proto =http -s localhost:$PORT >/dev/null 2>&1
40 return 1
41 fi
07f3b11e 42 fi
7f2d6260 43}
07f3b11e 44
b6379984 45check_IP_match() {
7f2d6260
JP
46 HOST="$1"
47 echo
48 echo Checking your domain name . . .
b6379984
RH
49 connect_to_port $HOST 443; ec=$?
50 case $ec in
51 0)
7f2d6260 52 echo "Connection to $HOST succeeded."
b6379984
RH
53 ;;
54 1)
3a4be87a 55 echo "WARNING: Port 443 of computer does not appear to be accessible using hostname: $HOST."
b6379984 56 if connect_to_port $HOST 80; then
3a4be87a
JP
57 echo
58 echo SUCCESS: A connection to port 80 succeeds!
b6379984
RH
59 echo This suggests that your DNS settings are correct,
60 echo but something is keeping traffic to port 443 from getting to your server.
61 echo Check your networking configuration to see that connections to port 443 are allowed.
62 else
3a4be87a 63 echo "WARNING: Connection to http://$HOST (port 80) also fails."
b6379984 64 echo
3a4be87a
JP
65 echo "This suggests that $HOST resolves to some IP address that does not reach this "
66 echo machine where you are installing discourse.
b6379984
RH
67 fi
68 echo
3a4be87a
JP
69 echo "The first thing to do is confirm that $HOST resolves to the IP address of this server."
70 echo You usually do this at the same place you purchased the domain.
71 echo
72 echo If you are sure that the IP address resolves correctly, it could be a firewall issue.
73 echo A web search for \"open ports YOUR CLOUD SERVICE\" might help.
74 echo
75 echo This tool is designed only for the most standard installations. If you cannot resolve
76 echo the issue above, you will need to edit containers/app.yml yourself and then type
77 echo
78 echo ./launcher rebuild app
b6379984 79 echo
d3e3857d 80 exit 1
b6379984
RH
81 ;;
82 2)
83 echo "Continuing without port check."
84 ;;
85 esac
07f3b11e
JP
86}
87
c87c4b0a 88##
18602189
JP
89## Do we have docker?
90##
91check_and_install_docker () {
7cf781fc 92 docker_path=`which docker.io || which docker`
18602189
JP
93 if [ -z $docker_path ]; then
94 read -p "Docker not installed. Enter to install from https://get.docker.com/ or Ctrl+C to exit"
c87c4b0a 95 curl https://get.docker.com/ | sh
18602189 96 fi
7cf781fc 97 docker_path=`which docker.io || which docker`
18602189
JP
98 if [ -z $docker_path ]; then
99 echo Docker install failed. Quitting.
100 exit
101 fi
102}
103
69dcbef5
SG
104##
105## What are we running on
106##
107check_OS() {
108 echo `uname -s`
109}
110
e5ec8aa1
SG
111##
112## OS X available memory
113##
114check_osx_memory() {
275735af 115 echo `free -m | awk '/Mem:/ {print $2}'`
e5ec8aa1
SG
116}
117
118##
119## Linux available memory
120##
121check_linux_memory() {
20e812e3
TS
122 ## some VMs report just under 1GB of RAM, so
123 ## make an exception and allow those with more
124 ## than 989MB
125 mem=`free -m --si | awk ' /Mem:/ {print $2}'`
126 if [ "$mem" -ge 990 -a "$mem" -lt 1000 ]; then
127 echo 1
128 else
129 echo `free -g --si | awk ' /Mem:/ {print $2} '`
130 fi
e5ec8aa1 131}
c87c4b0a 132
c2d3ee4a
JA
133##
134## Do we have enough memory and disk space for Discourse?
135##
136check_disk_and_memory() {
c87c4b0a 137
69dcbef5
SG
138 os_type=$(check_OS)
139 avail_mem=0
17f62d87 140 if [ "$os_type" == "Darwin" ]; then
e5ec8aa1 141 avail_mem=$(check_osx_memory)
69dcbef5 142 else
e5ec8aa1 143 avail_mem=$(check_linux_memory)
69dcbef5
SG
144 fi
145
c6374a12 146 if [ "$avail_mem" -lt 1 ]; then
51890305
JA
147 echo "WARNING: Discourse requires 1GB RAM to run. This system does not appear"
148 echo "to have sufficient memory."
c2d3ee4a 149 echo
51890305
JA
150 echo "Your site may not work properly, or future upgrades of Discourse may not"
151 echo "complete successfully."
c87c4b0a 152 exit 1
cdd99376 153 fi
c87c4b0a 154
f7bb85e6 155 if [ "$avail_mem" -le 2 ]; then
c6374a12 156 total_swap=`free -g --si | awk ' /Swap:/ {print $2} '`
7f2d6260 157
c6374a12 158 if [ "$total_swap" -lt 2 ]; then
bd7e6e26
JP
159 echo "WARNING: Discourse requires at least 2GB of swap when running with 2GB of RAM"
160 echo "or less. This system does not appear to have sufficient swap space."
c2d3ee4a 161 echo
8f70d450 162 echo "Without sufficient swap space, your site may not work properly, and future"
51890305 163 echo "upgrades of Discourse may not complete successfully."
c2d3ee4a 164 echo
7f2d6260
JP
165 echo "Ctrl+C to exit or wait 5 seconds to have a 2GB swapfile created."
166 sleep 5
c87c4b0a 167
8f70d450
JA
168 ##
169 ## derived from https://meta.discourse.org/t/13880
c87c4b0a 170 ##
8f70d450 171 install -o root -g root -m 0600 /dev/null /swapfile
72a7bdf0 172 fallocate -l 2G /swapfile
8f70d450
JA
173 mkswap /swapfile
174 swapon /swapfile
7c2777f9 175 echo "/swapfile swap swap auto 0 0" | tee -a /etc/fstab
7802f679 176 sysctl -w vm.swappiness=10
874fa4d3 177 echo 'vm.swappiness = 10' > /etc/sysctl.d/30-discourse-swap.conf
8f70d450 178
c6374a12
JP
179 total_swap=`free -g --si | awk ' /Swap:/ {print $2} '`
180 if [ "$total_swap" -lt 2 ]; then
8e7862c4 181 echo "Failed to create swap: are you root? Are you running on real hardware, or a fully virtualized server?"
8f70d450
JA
182 exit 1
183 fi
c87c4b0a 184
c2d3ee4a
JA
185 fi
186 fi
187
c6374a12 188
c2d3ee4a
JA
189 free_disk="$(df /var | tail -n 1 | awk '{print $4}')"
190 if [ "$free_disk" -lt 5000 ]; then
51890305
JA
191 echo "WARNING: Discourse requires at least 5GB free disk space. This system"
192 echo "does not appear to have sufficient disk space."
c2d3ee4a 193 echo
51890305
JA
194 echo "Insufficient disk space may result in problems running your site, and"
195 echo "may not even allow Discourse installation to complete successfully."
c2d3ee4a
JA
196 echo
197 echo "Please free up some space, or expand your disk, before continuing."
198 echo
51890305
JA
199 echo "Run \`apt-get autoremove && apt-get autoclean\` to clean up unused"
200 echo "packages and \`./launcher cleanup\` to remove stale Docker containers."
c2d3ee4a
JA
201 exit 1
202 fi
203
c2d3ee4a
JA
204}
205
206
207##
208## If we have lots of RAM or lots of CPUs, bump up the defaults to scale better
209##
210scale_ram_and_cpu() {
211
642b870f 212 local changelog=/tmp/changelog.$PPID
c2d3ee4a 213 # grab info about total system ram and physical (NOT LOGICAL!) CPU cores
e5ec8aa1
SG
214 avail_gb=0
215 avail_cores=0
216 os_type=$(check_OS)
17f62d87 217 if [ "$os_type" == "Darwin" ]; then
e5ec8aa1
SG
218 avail_gb=$(check_osx_memory)
219 avail_cores=`sysctl hw.ncpu | awk '/hw.ncpu:/ {print $2}'`
220 else
96568673
TH
221 avail_gb=$(check_linux_memory)
222 avail_cores=$((`awk '/cpu cores/ {print $4;exit}' /proc/cpuinfo`*`sort /proc/cpuinfo | uniq | grep -c "physical id"`))
e5ec8aa1 223 fi
c2d3ee4a
JA
224 echo "Found ${avail_gb}GB of memory and $avail_cores physical CPU cores"
225
226 # db_shared_buffers: 128MB for 1GB, 256MB for 2GB, or 256MB * GB, max 4096MB
227 if [ "$avail_gb" -eq "1" ]
228 then
229 db_shared_buffers=128
230 else
231 if [ "$avail_gb" -eq "2" ]
232 then
233 db_shared_buffers=256
234 else
235 db_shared_buffers=$(( 256 * $avail_gb ))
236 fi
237 fi
238 db_shared_buffers=$(( db_shared_buffers < 4096 ? db_shared_buffers : 4096 ))
239
f5cf127d 240 sed -i -e "s/^ #\?db_shared_buffers:.*/ db_shared_buffers: \"${db_shared_buffers}MB\"/w $changelog" $data_file
c2d3ee4a
JA
241 if [ -s $changelog ]
242 then
243 echo "setting db_shared_buffers = ${db_shared_buffers}MB"
244 rm $changelog
245 fi
246
c2d3ee4a
JA
247 # UNICORN_WORKERS: 2 * GB for 2GB or less, or 2 * CPU, max 8
248 if [ "$avail_gb" -le "2" ]
249 then
250 unicorn_workers=$(( 2 * $avail_gb ))
251 else
252 unicorn_workers=$(( 2 * $avail_cores ))
253 fi
254 unicorn_workers=$(( unicorn_workers < 8 ? unicorn_workers : 8 ))
255
f5cf127d 256 sed -i -e "s/^ #\?UNICORN_WORKERS:.*/ UNICORN_WORKERS: ${unicorn_workers}/w $changelog" $web_file
c2d3ee4a
JA
257 if [ -s $changelog ]
258 then
259 echo "setting UNICORN_WORKERS = ${unicorn_workers}"
260 rm $changelog
261 fi
262
f5cf127d 263 echo $data_file memory parameters updated.
c2d3ee4a
JA
264}
265
266
c87c4b0a 267##
c2d3ee4a
JA
268## standard http / https ports must not be occupied
269##
270check_ports() {
271 check_port "80"
272 check_port "443"
273 echo "Ports 80 and 443 are free for use"
274}
275
276
277##
278## check a port to see if it is already in use
279##
280check_port() {
c87c4b0a 281
c2d3ee4a
JA
282 local valid=$(netstat -tln | awk '{print $4}' | grep ":${1}\$")
283
284 if [ -n "$valid" ]; then
285 echo "Port ${1} appears to already be in use."
286 echo
f5cf127d
JP
287 echo "This will show you what command is using port ${1}"
288 lsof -i tcp:${1} -s tcp:listen
289 echo
51890305
JA
290 echo "If you are trying to run Discourse simultaneously with another web"
291 echo "server like Apache or nginx, you will need to bind to a different port"
c87c4b0a 292 echo
51890305 293 echo "See https://meta.discourse.org/t/17247"
f17af951
JP
294 echo
295 echo "If you are reconfiguring an already-configured Discourse, use "
296 echo
297 echo "./launcher stop app"
298 echo
299 echo "to stop Discourse before you reconfigure it and try again."
c2d3ee4a
JA
300 exit 1
301 fi
302}
303
f17af951
JP
304##
305## read a variable from the config file
306##
307read_config() {
f5cf127d 308 config_line=`egrep "^ #?$1:" $web_file`
04a06dd0 309 read_config_result=`echo $config_line | awk -F":" '{print $2}'`
f17af951
JP
310 read_config_result=`echo $read_config_result | sed "s/^\([\"']\)\(.*\)\1\$/\2/g"`
311}
312
04a06dd0
JP
313read_default() {
314 config_line=`egrep "^ #?$1:" samples/standalone.yml`
315 read_default_result=`echo $config_line | awk -F":" '{print $2}'`
316 read_default_result=`echo $read_config_result | sed "s/^\([\"']\)\(.*\)\1\$/\2/g"`
317}
f17af951 318
c2d3ee4a
JA
319##
320## prompt user for typical Discourse config file values
321##
4b1b25e3 322ask_user_for_config() {
c87c4b0a 323
f17af951
JP
324 # NOTE: Defaults now come from standalone.yml
325
642b870f 326 local changelog=/tmp/changelog.$PPID
f17af951
JP
327 read_config "DISCOURSE_SMTP_ADDRESS"
328 local smtp_address=$read_config_result
329 # NOTE: if there are spaces between emails, this breaks, but a human should be paying attention
330 read_config "DISCOURSE_DEVELOPER_EMAILS"
331 local developer_emails=$read_config_result
332 read_config "DISCOURSE_SMTP_PASSWORD"
333 local smtp_password=$read_config_result
334 read_config "DISCOURSE_SMTP_PORT"
335 local smtp_port=$read_config_result
336 read_config "DISCOURSE_SMTP_USER_NAME"
337 local smtp_user_name=$read_config_result
338 if [ "$smtp_password" = "pa$$word" ]
339 then
340 smtp_password = ""
341 fi
342 read_config "LETSENCRYPT_ACCOUNT_EMAIL"
343 local letsencrypt_account_email=$read_config_result
17f62d87
JP
344 if [ -z $letsencrypt_account_email ]
345 then
346 letsencrypt_account_email="me@example.com"
347 fi
348 if [ "$letsencrypt_account_email" = "me@example.com" ]
f17af951
JP
349 then
350 local letsencrypt_status="ENTER to skip"
351 else
352 local letsencrypt_status="Enter 'OFF' to disable."
353 fi
354
355 read_config "DISCOURSE_HOSTNAME"
356 hostname=$read_config_result
c2d3ee4a
JA
357
358 local new_value=""
359 local config_ok="n"
360 local update_ok="y"
c87c4b0a 361
c2d3ee4a
JA
362 echo ""
363
364 while [[ "$config_ok" == "n" ]]
365 do
04a06dd0 366 if [ ! -z "$hostname" ]
c2d3ee4a
JA
367 then
368 read -p "Hostname for your Discourse? [$hostname]: " new_value
275735af
JP
369 if [ ! -z "$new_value" ]
370 then
371 hostname="$new_value"
372 fi
373 if [[ $hostname =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
c2d3ee4a 374 then
275735af
JP
375 echo
376 echo "Discourse requires a DNS hostname. IP addresses are unsupported and will not work."
377 echo
378 hostname="discourse.example.com"
c2d3ee4a
JA
379 fi
380 fi
c87c4b0a 381
d3e3857d
RSS
382 check_IP_match $hostname
383
04a06dd0 384 if [ ! -z "$developer_emails" ]
c2d3ee4a 385 then
f17af951 386 read -p "Email address for admin account(s)? [$developer_emails]: " new_value
275735af 387 if [ ! -z "$new_value" ]
c2d3ee4a 388 then
275735af 389 developer_emails="$new_value"
c2d3ee4a
JA
390 fi
391 fi
c87c4b0a 392
04a06dd0 393 if [ ! -z "$smtp_address" ]
c2d3ee4a
JA
394 then
395 read -p "SMTP server address? [$smtp_address]: " new_value
275735af 396 if [ ! -z "$new_value" ]
c2d3ee4a 397 then
275735af 398 smtp_address="$new_value"
c2d3ee4a
JA
399 fi
400 fi
c87c4b0a 401
04a06dd0 402 if [ ! -z "$smtp_port" ]
c2d3ee4a 403 then
7c2777f9 404 read -p "SMTP port? [$smtp_port]: " new_value
275735af 405 if [ ! -z "$new_value" ]
7c2777f9 406 then
275735af 407 smtp_port="$new_value"
7c2777f9 408 fi
c2d3ee4a 409 fi
c87c4b0a 410
7c2777f9 411 ##
275735af 412 ## automatically set correct user name based on common mail providers unless it's been set
7c2777f9 413 ##
275735af 414 if [ "$smtp_user_name" == "user@example.com" ]
c2d3ee4a 415 then
275735af
JP
416 if [ "$smtp_address" == "smtp.sparkpostmail.com" ]
417 then
418 smtp_user_name="SMTP_Injection"
419 fi
420 if [ "$smtp_address" == "smtp.sendgrid.net" ]
421 then
422 smtp_user_name="apikey"
423 fi
424 if [ "$smtp_address" == "smtp.mailgun.org" ]
425 then
426 smtp_user_name="postmaster@$hostname"
427 fi
7c2777f9 428 fi
c87c4b0a 429
275735af 430 if [ ! -z "$smtp_user_name" ]
c2d3ee4a
JA
431 then
432 read -p "SMTP user name? [$smtp_user_name]: " new_value
23c730f0 433 if [ ! -z "$new_value" ]
c2d3ee4a 434 then
23c730f0 435 smtp_user_name="$new_value"
c2d3ee4a
JA
436 fi
437 fi
c87c4b0a 438
c2d3ee4a 439 read -p "SMTP password? [$smtp_password]: " new_value
275735af 440 if [ ! -z "$new_value" ]
c2d3ee4a 441 then
275735af 442 smtp_password="$new_value"
c2d3ee4a 443 fi
c87c4b0a 444
c2d3ee4a
JA
445 if [ ! -z $letsencrypt_account_email ]
446 then
026a664e 447 read -p "Optional email address for Let's Encrypt warnings? ($letsencrypt_status) [$letsencrypt_account_email]: " new_value
275735af 448 if [ ! -z "$new_value" ]
c2d3ee4a 449 then
275735af 450 letsencrypt_account_email="$new_value"
f17af951 451 if [ "${new_value,,}" = "off" ]
c2d3ee4a
JA
452 then
453 letsencrypt_status="ENTER to skip"
454 else
455 letsencrypt_status="Enter 'OFF' to disable."
456 fi
457 fi
458 fi
459
51890305 460 echo -e "\nDoes this look right?\n"
c2d3ee4a
JA
461 echo "Hostname : $hostname"
462 echo "Email : $developer_emails"
463 echo "SMTP address : $smtp_address"
7c2777f9 464 echo "SMTP port : $smtp_port"
c2d3ee4a
JA
465 echo "SMTP username : $smtp_user_name"
466 echo "SMTP password : $smtp_password"
c87c4b0a 467
c2d3ee4a
JA
468 if [ "$letsencrypt_status" == "Enter 'OFF' to disable." ]
469 then
470 echo "Let's Encrypt : $letsencrypt_account_email"
471 fi
c87c4b0a 472
07f3b11e 473
c2d3ee4a 474 echo ""
ac1a2d67 475 read -p "ENTER to continue, 'n' to try again, Ctrl+C to exit: " config_ok
c2d3ee4a
JA
476 done
477
f5cf127d 478 sed -i -e "s/^ DISCOURSE_HOSTNAME:.*/ DISCOURSE_HOSTNAME: $hostname/w $changelog" $web_file
c2d3ee4a
JA
479 if [ -s $changelog ]
480 then
481 rm $changelog
482 else
483 echo "DISCOURSE_HOSTNAME change failed."
484 update_ok="n"
485 fi
486
f5cf127d 487 sed -i -e "s/^ DISCOURSE_DEVELOPER_EMAILS:.*/ DISCOURSE_DEVELOPER_EMAILS: \'$developer_emails\'/w $changelog" $web_file
c2d3ee4a
JA
488 if [ -s $changelog ]
489 then
490 rm $changelog
491 else
492 echo "DISCOURSE_DEVELOPER_EMAILS change failed."
493 update_ok="n"
494 fi
495
f5cf127d 496 sed -i -e "s/^ DISCOURSE_SMTP_ADDRESS:.*/ DISCOURSE_SMTP_ADDRESS: $smtp_address/w $changelog" $web_file
c2d3ee4a
JA
497 if [ -s $changelog ]
498 then
499 rm $changelog
500 else
501 echo "DISCOURSE_SMTP_ADDRESS change failed."
502 update_ok="n"
503 fi
504
f5cf127d 505 sed -i -e "s/^ #\?DISCOURSE_SMTP_PORT:.*/ DISCOURSE_SMTP_PORT: $smtp_port/w $changelog" $web_file
7c2777f9
JA
506 if [ -s $changelog ]
507 then
508 rm $changelog
509 else
510 echo "DISCOURSE_SMTP_PORT change failed."
511 update_ok="n"
512 fi
513
f5cf127d 514 sed -i -e "s/^ #\?DISCOURSE_SMTP_USER_NAME:.*/ DISCOURSE_SMTP_USER_NAME: $smtp_user_name/w $changelog" $web_file
c2d3ee4a
JA
515 if [ -s $changelog ]
516 then
517 rm $changelog
518 else
519 echo "DISCOURSE_SMTP_USER_NAME change failed."
520 update_ok="n"
521 fi
522
275735af 523 if [[ "$smtp_password" == *"\""* ]]
c2d3ee4a 524 then
275735af
JP
525 SLASH="BROKEN"
526 echo "========================================"
527 echo "WARNING!!!"
528 echo "Your password contains a quote (\")"
529 echo "Your SMTP Password will not be set. You will need to edit app.yml to enter it."
530 echo "========================================"
c2d3ee4a 531 update_ok="n"
275735af
JP
532 else
533 SLASH="|"
534 if [[ "$smtp_password" == *"$SLASH"* ]]
535 then SLASH="+"
536 if [[ "$smtp_password" == *"$SLASH"* ]]
537 then
538 SLASH="Q"
539 if [[ "$smtp_password" == *"$SLASH"* ]]
540 then
541 SLASH="BROKEN"
542 echo "========================================"
543 echo "WARNING!!!"
544 echo "Your password contains all available delimiters (+, |, and Q). "
545 echo "Your SMTP Password will not be set. You will need to edit app.yml to enter it."
546 echo "========================================"
547 update_ok="n"
548 fi
549 fi
550 fi
c2d3ee4a 551 fi
275735af
JP
552 if [[ "$SLASH" != "BROKEN" ]]
553 then
554 sed -i -e "s${SLASH}^ #\?DISCOURSE_SMTP_PASSWORD:.*${SLASH} DISCOURSE_SMTP_PASSWORD: \"${smtp_password}\"${SLASH}w $changelog" $web_file
c2d3ee4a 555
275735af
JP
556 if [ -s $changelog ]
557 then
558 rm $changelog
559 else
560 echo "DISCOURSE_SMTP_PASSWORD change failed."
561 update_ok="n"
562 fi
563 fi
f17af951 564
026a664e
RSS
565 echo "Enabling Let's Encrypt"
566 sed -i -e "s/^ #\?LETSENCRYPT_ACCOUNT_EMAIL:.*/ LETSENCRYPT_ACCOUNT_EMAIL: $letsencrypt_account_email/w $changelog" $web_file
567 if [ -s $changelog ]
568 then
569 rm $changelog
570 else
571 echo "LETSENCRYPT_ACCOUNT_EMAIL change failed."
572 update_ok="n"
573 fi
574 local src='^ #\?- "templates\/web.ssl.template.yml"'
575 local dst=' \- "templates\/web.ssl.template.yml"'
576 sed -i -e "s/$src/$dst/w $changelog" $web_file
577 if [ -s $changelog ]
578 then
579 echo "web.ssl.template.yml enabled"
580 else
581 update_ok="n"
582 echo "web.ssl.template.yml NOT ENABLED--was it on already?"
583 fi
584 local src='^ #\?- "templates\/web.letsencrypt.ssl.template.yml"'
585 local dst=' - "templates\/web.letsencrypt.ssl.template.yml"'
c2d3ee4a 586
026a664e
RSS
587 sed -i -e "s/$src/$dst/w $changelog" $web_file
588 if [ -s $changelog ]
589 then
590 echo "letsencrypt.ssl.template.yml enabled"
591 else
592 update_ok="n"
593 echo "letsencrypt.ssl.template.yml NOT ENABLED -- was it on already?"
594 fi
c2d3ee4a
JA
595
596 if [ "$update_ok" == "y" ]
597 then
598 echo -e "\nConfiguration file at $config_file updated successfully!\n"
599 else
600 echo -e "\nUnfortunately, there was an error changing $config_file\n"
7f2d6260 601 echo -d "This may happen if you have made unexpected changes."
c2d3ee4a
JA
602 exit 1
603 fi
604}
605
606##
607## is our config file valid? Does it have the required fields set?
608##
4b1b25e3 609validate_config() {
c2d3ee4a
JA
610
611 valid_config="y"
c87c4b0a 612
c2d3ee4a
JA
613 for x in DISCOURSE_SMTP_ADDRESS DISCOURSE_SMTP_USER_NAME DISCOURSE_SMTP_PASSWORD \
614 DISCOURSE_DEVELOPER_EMAILS DISCOURSE_HOSTNAME
615 do
04a06dd0
JP
616 read_config $x
617 local result=$read_config_result
618 read_default $x
619 local default=$read_default_result
c2d3ee4a 620
04a06dd0 621 if [ ! -z "$result" ]
c2d3ee4a 622 then
17f62d87 623 if [[ "$config_line" = *"$default"* ]]
c2d3ee4a 624 then
04a06dd0 625 echo "$x left at incorrect default of $default"
c2d3ee4a
JA
626 valid_config="n"
627 fi
628 config_val=`echo $config_line | awk '{print $2}'`
629 if [ -z $config_val ]
630 then
04a06dd0 631 echo "$x was not configured"
c2d3ee4a
JA
632 valid_config="n"
633 fi
634 else
635 echo "$x not present"
636 valid_config="n"
637 fi
638 done
c87c4b0a 639
c2d3ee4a 640 if [ "$valid_config" != "y" ]; then
f5cf127d
JP
641 echo -e "\nSorry, these $web_file settings aren't valid -- can't continue!"
642 echo "If you have unusual requirements, edit $web_file and then: "
d8613c71 643 echo "./launcher bootstrap $app_name"
c2d3ee4a
JA
644 exit 1
645 fi
646}
647
648
649##
650## template file names
651##
f5cf127d
JP
652
653if [ "$1" == "2container" ]
654then
655 app_name=web_only
656 data_name=data
657 web_template=samples/web_only.yml
658 data_template=samples/data.yml
659 web_file=containers/$app_name.yml
660 data_file=containers/$data_name.yml
661else
662 app_name=app
663 data_name=app
664 web_template=samples/standalone.yml
665 data_template=""
666 web_file=containers/$app_name.yml
667 data_file=containers/$app_name.yml
668fi
669 changelog=/tmp/changelog
c2d3ee4a 670
4b1b25e3
JA
671##
672## Check requirements before creating a copy of a config file we won't edit
673##
ebdd72f3 674check_root
18602189 675check_and_install_docker
642b870f 676check_disk_and_memory
642b870f 677
f5cf127d 678if [ -a "$web_file" ]
c2d3ee4a 679then
f5cf127d 680 echo "The configuration file $web_file already exists!"
f17af951
JP
681 echo
682 echo ". . . reconfiguring . . ."
683 echo
7f2d6260 684 echo
17f62d87
JP
685 DATE=`date +"%Y-%m-%d-%H%M%S"`
686 BACKUP=$app_name.yml.$DATE.bak
687 echo Saving old file as $BACKUP
275735af 688 cp $web_file containers/$BACKUP
7f2d6260
JP
689 echo "Stopping existing container in 5 seconds or Control-C to cancel."
690 sleep 5
691 ./launcher stop app
17f62d87 692 echo
c2d3ee4a 693else
f5cf127d
JP
694 check_ports
695 cp -v $web_template $web_file
696 if [ "$data_name" == "data" ]
697 then
698 echo "--------------------------------------------------"
275735af 699 echo "This two container setup is currently unsupported. Use at your own risk!"
f5cf127d
JP
700 echo "--------------------------------------------------"
701 DISCOURSE_DB_PASSWORD=`date +%s | sha256sum | base64 | head -c 20`
702
703 sed -i -e "s/DISCOURSE_DB_PASSWORD: SOME_SECRET/DISCOURSE_DB_PASSWORD: $DISCOURSE_DB_PASSWORD/w $changelog" $web_file
704 if [ -s $changelog ]
705 then
706 rm $changelog
707 else
708 echo "Problem changing DISCOURSE_DB_PASSWORD" in $web_file
709 fi
710
711 cp -v $data_template $data_file
712 quote=\'
713 sed -i -e "s/password ${quote}SOME_SECRET${quote}/password '$DISCOURSE_DB_PASSWORD'/w $changelog" $data_file
714 if [ -s $changelog ]
715 then
716 rm $changelog
717 else
718 echo "Problem changing DISCOURSE_DB_PASSWORD" in $data_file
719 fi
720 fi
c2d3ee4a
JA
721fi
722
c2d3ee4a 723scale_ram_and_cpu
4b1b25e3
JA
724ask_user_for_config
725validate_config
c2d3ee4a 726
4b1b25e3
JA
727##
728## if we reach this point without exiting, OK to proceed
f17af951 729## rebuild won't fail if there's nothing to rebuild and does the restart
4b1b25e3 730##
7f2d6260 731echo "Updates successful. Rebuilding in 5 seconds."
f17af951 732sleep 5 # Just a chance to ^C in case they were too fast on the draw
f5cf127d
JP
733if [ "$data_name" == "$app_name" ]
734then
735 echo Building $app_name
736 ./launcher rebuild $app_name
737else
738 echo Building $data_name now . . .
739 ./launcher rebuild $data_name
740 echo Building $app_name now . . .
741 ./launcher rebuild $app_name
742fi