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