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