FEATURE: Add validation to admin email prompt in discourse-setup (#514)
[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
3d34d989 386 local email_valid="n"
387 until [ "$email_valid" == "y" ]
388 do
389 read -p "Email address for admin account(s)? [$developer_emails]: " new_value
390 if [ ! -z "$new_value" ]
391 then
392 if [[ ${#new_value} -ge 7 && $new_value == *@* ]]
393 then
394 developer_emails="$new_value"
395 email_valid="y"
396 else
397 echo
398 echo "[Error] Invalid email address"
399 echo
400 fi
401 else
402 email_valid="y"
403 fi
404 done
c2d3ee4a 405 fi
c87c4b0a 406
04a06dd0 407 if [ ! -z "$smtp_address" ]
c2d3ee4a
JA
408 then
409 read -p "SMTP server address? [$smtp_address]: " new_value
275735af 410 if [ ! -z "$new_value" ]
c2d3ee4a 411 then
275735af 412 smtp_address="$new_value"
c2d3ee4a
JA
413 fi
414 fi
c87c4b0a 415
04a06dd0 416 if [ ! -z "$smtp_port" ]
c2d3ee4a 417 then
7c2777f9 418 read -p "SMTP port? [$smtp_port]: " new_value
275735af 419 if [ ! -z "$new_value" ]
7c2777f9 420 then
275735af 421 smtp_port="$new_value"
7c2777f9 422 fi
c2d3ee4a 423 fi
c87c4b0a 424
7c2777f9 425 ##
275735af 426 ## automatically set correct user name based on common mail providers unless it's been set
7c2777f9 427 ##
275735af 428 if [ "$smtp_user_name" == "user@example.com" ]
c2d3ee4a 429 then
275735af
JP
430 if [ "$smtp_address" == "smtp.sparkpostmail.com" ]
431 then
432 smtp_user_name="SMTP_Injection"
433 fi
434 if [ "$smtp_address" == "smtp.sendgrid.net" ]
435 then
436 smtp_user_name="apikey"
437 fi
438 if [ "$smtp_address" == "smtp.mailgun.org" ]
439 then
440 smtp_user_name="postmaster@$hostname"
441 fi
7c2777f9 442 fi
c87c4b0a 443
275735af 444 if [ ! -z "$smtp_user_name" ]
c2d3ee4a
JA
445 then
446 read -p "SMTP user name? [$smtp_user_name]: " new_value
23c730f0 447 if [ ! -z "$new_value" ]
c2d3ee4a 448 then
23c730f0 449 smtp_user_name="$new_value"
c2d3ee4a
JA
450 fi
451 fi
c87c4b0a 452
c2d3ee4a 453 read -p "SMTP password? [$smtp_password]: " new_value
275735af 454 if [ ! -z "$new_value" ]
c2d3ee4a 455 then
275735af 456 smtp_password="$new_value"
c2d3ee4a 457 fi
c87c4b0a 458
c2d3ee4a
JA
459 if [ ! -z $letsencrypt_account_email ]
460 then
026a664e 461 read -p "Optional email address for Let's Encrypt warnings? ($letsencrypt_status) [$letsencrypt_account_email]: " new_value
275735af 462 if [ ! -z "$new_value" ]
c2d3ee4a 463 then
275735af 464 letsencrypt_account_email="$new_value"
f17af951 465 if [ "${new_value,,}" = "off" ]
c2d3ee4a
JA
466 then
467 letsencrypt_status="ENTER to skip"
468 else
469 letsencrypt_status="Enter 'OFF' to disable."
470 fi
471 fi
472 fi
473
51890305 474 echo -e "\nDoes this look right?\n"
c2d3ee4a
JA
475 echo "Hostname : $hostname"
476 echo "Email : $developer_emails"
477 echo "SMTP address : $smtp_address"
7c2777f9 478 echo "SMTP port : $smtp_port"
c2d3ee4a
JA
479 echo "SMTP username : $smtp_user_name"
480 echo "SMTP password : $smtp_password"
c87c4b0a 481
c2d3ee4a
JA
482 if [ "$letsencrypt_status" == "Enter 'OFF' to disable." ]
483 then
484 echo "Let's Encrypt : $letsencrypt_account_email"
485 fi
c87c4b0a 486
07f3b11e 487
c2d3ee4a 488 echo ""
ac1a2d67 489 read -p "ENTER to continue, 'n' to try again, Ctrl+C to exit: " config_ok
c2d3ee4a
JA
490 done
491
f5cf127d 492 sed -i -e "s/^ DISCOURSE_HOSTNAME:.*/ DISCOURSE_HOSTNAME: $hostname/w $changelog" $web_file
c2d3ee4a
JA
493 if [ -s $changelog ]
494 then
495 rm $changelog
496 else
497 echo "DISCOURSE_HOSTNAME change failed."
498 update_ok="n"
499 fi
500
f5cf127d 501 sed -i -e "s/^ DISCOURSE_DEVELOPER_EMAILS:.*/ DISCOURSE_DEVELOPER_EMAILS: \'$developer_emails\'/w $changelog" $web_file
c2d3ee4a
JA
502 if [ -s $changelog ]
503 then
504 rm $changelog
505 else
506 echo "DISCOURSE_DEVELOPER_EMAILS change failed."
507 update_ok="n"
508 fi
509
f5cf127d 510 sed -i -e "s/^ DISCOURSE_SMTP_ADDRESS:.*/ DISCOURSE_SMTP_ADDRESS: $smtp_address/w $changelog" $web_file
c2d3ee4a
JA
511 if [ -s $changelog ]
512 then
513 rm $changelog
514 else
515 echo "DISCOURSE_SMTP_ADDRESS change failed."
516 update_ok="n"
517 fi
518
f5cf127d 519 sed -i -e "s/^ #\?DISCOURSE_SMTP_PORT:.*/ DISCOURSE_SMTP_PORT: $smtp_port/w $changelog" $web_file
7c2777f9
JA
520 if [ -s $changelog ]
521 then
522 rm $changelog
523 else
524 echo "DISCOURSE_SMTP_PORT change failed."
525 update_ok="n"
526 fi
527
f5cf127d 528 sed -i -e "s/^ #\?DISCOURSE_SMTP_USER_NAME:.*/ DISCOURSE_SMTP_USER_NAME: $smtp_user_name/w $changelog" $web_file
c2d3ee4a
JA
529 if [ -s $changelog ]
530 then
531 rm $changelog
532 else
533 echo "DISCOURSE_SMTP_USER_NAME change failed."
534 update_ok="n"
535 fi
536
275735af 537 if [[ "$smtp_password" == *"\""* ]]
c2d3ee4a 538 then
275735af
JP
539 SLASH="BROKEN"
540 echo "========================================"
541 echo "WARNING!!!"
542 echo "Your password contains a quote (\")"
543 echo "Your SMTP Password will not be set. You will need to edit app.yml to enter it."
544 echo "========================================"
c2d3ee4a 545 update_ok="n"
275735af
JP
546 else
547 SLASH="|"
548 if [[ "$smtp_password" == *"$SLASH"* ]]
549 then SLASH="+"
550 if [[ "$smtp_password" == *"$SLASH"* ]]
551 then
552 SLASH="Q"
553 if [[ "$smtp_password" == *"$SLASH"* ]]
554 then
555 SLASH="BROKEN"
556 echo "========================================"
557 echo "WARNING!!!"
558 echo "Your password contains all available delimiters (+, |, and Q). "
559 echo "Your SMTP Password will not be set. You will need to edit app.yml to enter it."
560 echo "========================================"
561 update_ok="n"
562 fi
563 fi
564 fi
c2d3ee4a 565 fi
275735af
JP
566 if [[ "$SLASH" != "BROKEN" ]]
567 then
568 sed -i -e "s${SLASH}^ #\?DISCOURSE_SMTP_PASSWORD:.*${SLASH} DISCOURSE_SMTP_PASSWORD: \"${smtp_password}\"${SLASH}w $changelog" $web_file
c2d3ee4a 569
275735af
JP
570 if [ -s $changelog ]
571 then
572 rm $changelog
573 else
574 echo "DISCOURSE_SMTP_PASSWORD change failed."
575 update_ok="n"
576 fi
577 fi
f17af951 578
026a664e
RSS
579 echo "Enabling Let's Encrypt"
580 sed -i -e "s/^ #\?LETSENCRYPT_ACCOUNT_EMAIL:.*/ LETSENCRYPT_ACCOUNT_EMAIL: $letsencrypt_account_email/w $changelog" $web_file
581 if [ -s $changelog ]
582 then
583 rm $changelog
584 else
585 echo "LETSENCRYPT_ACCOUNT_EMAIL change failed."
586 update_ok="n"
587 fi
588 local src='^ #\?- "templates\/web.ssl.template.yml"'
589 local dst=' \- "templates\/web.ssl.template.yml"'
590 sed -i -e "s/$src/$dst/w $changelog" $web_file
591 if [ -s $changelog ]
592 then
593 echo "web.ssl.template.yml enabled"
594 else
595 update_ok="n"
596 echo "web.ssl.template.yml NOT ENABLED--was it on already?"
597 fi
598 local src='^ #\?- "templates\/web.letsencrypt.ssl.template.yml"'
599 local dst=' - "templates\/web.letsencrypt.ssl.template.yml"'
c2d3ee4a 600
026a664e
RSS
601 sed -i -e "s/$src/$dst/w $changelog" $web_file
602 if [ -s $changelog ]
603 then
604 echo "letsencrypt.ssl.template.yml enabled"
605 else
606 update_ok="n"
607 echo "letsencrypt.ssl.template.yml NOT ENABLED -- was it on already?"
608 fi
c2d3ee4a
JA
609
610 if [ "$update_ok" == "y" ]
611 then
612 echo -e "\nConfiguration file at $config_file updated successfully!\n"
613 else
614 echo -e "\nUnfortunately, there was an error changing $config_file\n"
7f2d6260 615 echo -d "This may happen if you have made unexpected changes."
c2d3ee4a
JA
616 exit 1
617 fi
618}
619
620##
621## is our config file valid? Does it have the required fields set?
622##
4b1b25e3 623validate_config() {
c2d3ee4a
JA
624
625 valid_config="y"
c87c4b0a 626
c2d3ee4a
JA
627 for x in DISCOURSE_SMTP_ADDRESS DISCOURSE_SMTP_USER_NAME DISCOURSE_SMTP_PASSWORD \
628 DISCOURSE_DEVELOPER_EMAILS DISCOURSE_HOSTNAME
629 do
04a06dd0
JP
630 read_config $x
631 local result=$read_config_result
632 read_default $x
633 local default=$read_default_result
c2d3ee4a 634
04a06dd0 635 if [ ! -z "$result" ]
c2d3ee4a 636 then
17f62d87 637 if [[ "$config_line" = *"$default"* ]]
c2d3ee4a 638 then
04a06dd0 639 echo "$x left at incorrect default of $default"
c2d3ee4a
JA
640 valid_config="n"
641 fi
642 config_val=`echo $config_line | awk '{print $2}'`
643 if [ -z $config_val ]
644 then
04a06dd0 645 echo "$x was not configured"
c2d3ee4a
JA
646 valid_config="n"
647 fi
648 else
649 echo "$x not present"
650 valid_config="n"
651 fi
652 done
c87c4b0a 653
c2d3ee4a 654 if [ "$valid_config" != "y" ]; then
f5cf127d
JP
655 echo -e "\nSorry, these $web_file settings aren't valid -- can't continue!"
656 echo "If you have unusual requirements, edit $web_file and then: "
d8613c71 657 echo "./launcher bootstrap $app_name"
c2d3ee4a
JA
658 exit 1
659 fi
660}
661
662
663##
664## template file names
665##
f5cf127d
JP
666
667if [ "$1" == "2container" ]
668then
669 app_name=web_only
670 data_name=data
671 web_template=samples/web_only.yml
672 data_template=samples/data.yml
673 web_file=containers/$app_name.yml
674 data_file=containers/$data_name.yml
675else
676 app_name=app
677 data_name=app
678 web_template=samples/standalone.yml
679 data_template=""
680 web_file=containers/$app_name.yml
681 data_file=containers/$app_name.yml
682fi
683 changelog=/tmp/changelog
c2d3ee4a 684
4b1b25e3
JA
685##
686## Check requirements before creating a copy of a config file we won't edit
687##
ebdd72f3 688check_root
18602189 689check_and_install_docker
642b870f 690check_disk_and_memory
642b870f 691
f5cf127d 692if [ -a "$web_file" ]
c2d3ee4a 693then
f5cf127d 694 echo "The configuration file $web_file already exists!"
f17af951
JP
695 echo
696 echo ". . . reconfiguring . . ."
697 echo
7f2d6260 698 echo
17f62d87
JP
699 DATE=`date +"%Y-%m-%d-%H%M%S"`
700 BACKUP=$app_name.yml.$DATE.bak
701 echo Saving old file as $BACKUP
275735af 702 cp $web_file containers/$BACKUP
7f2d6260
JP
703 echo "Stopping existing container in 5 seconds or Control-C to cancel."
704 sleep 5
705 ./launcher stop app
17f62d87 706 echo
c2d3ee4a 707else
f5cf127d
JP
708 check_ports
709 cp -v $web_template $web_file
710 if [ "$data_name" == "data" ]
711 then
712 echo "--------------------------------------------------"
275735af 713 echo "This two container setup is currently unsupported. Use at your own risk!"
f5cf127d
JP
714 echo "--------------------------------------------------"
715 DISCOURSE_DB_PASSWORD=`date +%s | sha256sum | base64 | head -c 20`
716
717 sed -i -e "s/DISCOURSE_DB_PASSWORD: SOME_SECRET/DISCOURSE_DB_PASSWORD: $DISCOURSE_DB_PASSWORD/w $changelog" $web_file
718 if [ -s $changelog ]
719 then
720 rm $changelog
721 else
722 echo "Problem changing DISCOURSE_DB_PASSWORD" in $web_file
723 fi
724
725 cp -v $data_template $data_file
726 quote=\'
727 sed -i -e "s/password ${quote}SOME_SECRET${quote}/password '$DISCOURSE_DB_PASSWORD'/w $changelog" $data_file
728 if [ -s $changelog ]
729 then
730 rm $changelog
731 else
732 echo "Problem changing DISCOURSE_DB_PASSWORD" in $data_file
733 fi
734 fi
c2d3ee4a
JA
735fi
736
c2d3ee4a 737scale_ram_and_cpu
4b1b25e3
JA
738ask_user_for_config
739validate_config
c2d3ee4a 740
4b1b25e3
JA
741##
742## if we reach this point without exiting, OK to proceed
f17af951 743## rebuild won't fail if there's nothing to rebuild and does the restart
4b1b25e3 744##
7f2d6260 745echo "Updates successful. Rebuilding in 5 seconds."
f17af951 746sleep 5 # Just a chance to ^C in case they were too fast on the draw
f5cf127d
JP
747if [ "$data_name" == "$app_name" ]
748then
749 echo Building $app_name
750 ./launcher rebuild $app_name
751else
752 echo Building $data_name now . . .
753 ./launcher rebuild $data_name
754 echo Building $app_name now . . .
755 ./launcher rebuild $app_name
756fi