Browse Source

Initial rocketchat app

Bob Mottram 6 years ago
parent
commit
5e9efd52bf
3 changed files with 468 additions and 1 deletions
  1. 463
    0
      src/freedombone-app-rocketchat
  2. 4
    1
      src/freedombone-template
  3. 1
    0
      src/freedombone-utils-mongodb

+ 463
- 0
src/freedombone-app-rocketchat View File

@@ -0,0 +1,463 @@
1
+#!/bin/bash
2
+#
3
+#  _____               _           _
4
+# |   __|___ ___ ___ _| |___ _____| |_ ___ ___ ___
5
+# |   __|  _| -_| -_| . | . |     | . | . |   | -_|
6
+# |__|  |_| |___|___|___|___|_|_|_|___|___|_|_|___|
7
+#
8
+#                              Freedom in the Cloud
9
+#
10
+# License
11
+# =======
12
+#
13
+# Copyright (C) 2018 Bob Mottram <bob@freedombone.net>
14
+#
15
+# This program is free software: you can redistribute it and/or modify
16
+# it under the terms of the GNU Affero General Public License as published by
17
+# the Free Software Foundation, either version 3 of the License, or
18
+# (at your option) any later version.
19
+#
20
+# This program is distributed in the hope that it will be useful,
21
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
22
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23
+# GNU Affero General Public License for more details.
24
+#
25
+# You should have received a copy of the GNU Affero General Public License
26
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
27
+
28
+VARIANTS='full full-vim'
29
+
30
+IN_DEFAULT_INSTALL=0
31
+SHOW_ON_ABOUT=1
32
+
33
+ROCKETCHAT_DOMAIN_NAME=
34
+ROCKETCHAT_CODE=
35
+ROCKETCHAT_ONION_PORT=9018
36
+ROCKETCHAT_REPO="https://github.com/RocketChat/Rocket.Chat"
37
+ROCKETCHAT_COMMIT='08149ebebbe265bce8f06289ad9a2f6bb4b1464b'
38
+ROCKETCHAT_PORT_INTERNAL=3004
39
+
40
+rocketchat_variables=(ONION_ONLY
41
+                      ROCKETCHAT_DOMAIN_NAME
42
+                      ROCKETCHAT_CODE
43
+                      DDNS_PROVIDER
44
+                      MY_USERNAME)
45
+
46
+function logging_on_rocketchat {
47
+    echo -n ''
48
+}
49
+
50
+function logging_off_rocketchat {
51
+    echo -n ''
52
+}
53
+
54
+function remove_user_rocketchat {
55
+    remove_username="$1"
56
+
57
+    "${PROJECT_NAME}-pass" -u "$remove_username" --rmapp rocketchat
58
+}
59
+
60
+function add_user_rocketchat {
61
+    new_username="$1"
62
+    new_user_password="$2"
63
+
64
+    "${PROJECT_NAME}-pass" -u "$new_username" -a rocketchat -p "$new_user_password"
65
+    echo '0'
66
+}
67
+
68
+function install_interactive_rocketchat {
69
+    if [ ! "$ONION_ONLY" ]; then
70
+        ONION_ONLY='no'
71
+    fi
72
+
73
+    if [[ "$ONION_ONLY" != "no" ]]; then
74
+        ROCKETCHAT_DOMAIN_NAME='rocketchat.local'
75
+        write_config_param "ROCKETCHAT_DOMAIN_NAME" "$ROCKETCHAT_DOMAIN_NAME"
76
+    else
77
+        interactive_site_details "rocketchat" "ROCKETCHAT_DOMAIN_NAME" "ROCKETCHAT_CODE"
78
+    fi
79
+    APP_INSTALLED=1
80
+}
81
+
82
+function change_password_rocketchat {
83
+    curr_username="$1"
84
+    new_user_password="$2"
85
+
86
+    read_config_param 'ROCKETCHAT_DOMAIN_NAME'
87
+
88
+    "${PROJECT_NAME}-pass" -u "$curr_username" -a rocketchat -p "$new_user_password"
89
+}
90
+
91
+function rocketchat_create_database {
92
+    if [ -f $IMAGE_PASSWORD_FILE ]; then
93
+        ROCKETCHAT_ADMIN_PASSWORD="$(printf "%d" "$(cat "")")"
94
+    else
95
+        if [ ! $ROCKETCHAT_ADMIN_PASSWORD ]; then
96
+            ROCKETCHAT_ADMIN_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
97
+        fi
98
+    fi
99
+    if [ ! $ROCKETCHAT_ADMIN_PASSWORD ]; then
100
+        return
101
+    fi
102
+
103
+    create_database_mongodb rocketchat "$ROCKETCHAT_ADMIN_PASSWORD" $MY_USERNAME
104
+}
105
+
106
+function reconfigure_rocketchat {
107
+    # This is used if you need to switch identity. Dump old keys and generate new ones
108
+    echo -n ''
109
+}
110
+
111
+function configure_interactive_rocketchat {
112
+    W=(1 $"Option 1"
113
+       2 $"Option 2")
114
+
115
+    while true
116
+    do
117
+        # shellcheck disable=SC2068
118
+        selection=$(dialog --backtitle $"Freedombone Administrator Control Panel" --title $"rocketchat" --menu $"Choose an operation, or ESC for main menu:" 14 70 3 "${W[@]}" 3>&2 2>&1 1>&3)
119
+
120
+        if [ ! "$selection" ]; then
121
+            break
122
+        fi
123
+        case $selection in
124
+            1) # call some function for option 1
125
+            ;;
126
+            2) # call some function for option 2
127
+            ;;
128
+        esac
129
+    done
130
+}
131
+
132
+function upgrade_rocketchat {
133
+    CURR_ROCKETCHAT_COMMIT=$(get_completion_param "rocketchat commit")
134
+    if [[ "$CURR_ROCKETCHAT_COMMIT" == "$ROCKETCHAT_COMMIT" ]]; then
135
+        return
136
+    fi
137
+
138
+    if grep -q "rocketchat domain" "$COMPLETION_FILE"; then
139
+        ROCKETCHAT_DOMAIN_NAME=$(get_completion_param "rocketchat domain")
140
+    fi
141
+
142
+    # update to the next commit
143
+    set_repo_commit "/etc/rocketchat" "rocketchat commit" "$ROCKETCHAT_COMMIT" "$ROCKETCHAT_REPO"
144
+    chown -R rocketchat:rocketchat "/etc/rocketchat"
145
+
146
+    systemctl restart rocketchat
147
+}
148
+
149
+function backup_local_rocketchat {
150
+    ROCKETCHAT_DOMAIN_NAME='rocketchat'
151
+    if grep -q "rocketchat domain" "$COMPLETION_FILE"; then
152
+        ROCKETCHAT_DOMAIN_NAME=$(get_completion_param "rocketchat domain")
153
+    fi
154
+
155
+    source_directory=/etc/rocketchat
156
+
157
+    suspend_site "${ROCKETCHAT_DOMAIN_NAME}"
158
+
159
+    systemctl stop rocketchat
160
+
161
+    dest_directory=rocketchat
162
+    backup_directory_to_usb "$source_directory" $dest_directory
163
+
164
+    USE_MONGODB=1
165
+    backup_database_to_usb rocketchat
166
+
167
+    restart_site
168
+    systemctl start rocketchat
169
+}
170
+
171
+function restore_local_rocketchat {
172
+    if ! grep -q "rocketchat domain" "$COMPLETION_FILE"; then
173
+        return
174
+    fi
175
+    ROCKETCHAT_DOMAIN_NAME=$(get_completion_param "rocketchat domain")
176
+    if [ ! "$ROCKETCHAT_DOMAIN_NAME" ]; then
177
+        return
178
+    fi
179
+    suspend_site "${ROCKETCHAT_DOMAIN_NAME}"
180
+    systemctl stop rocketchat
181
+
182
+    temp_restore_dir=/root/temprocketchat
183
+    rocketchat_dir=/etc/rocketchat
184
+
185
+    rocketchat_create_database
186
+
187
+    USE_MONGODB=1
188
+    restore_database rocketchat
189
+    if [ -d $temp_restore_dir ]; then
190
+        rm -rf $temp_restore_dir
191
+    fi
192
+
193
+    restore_directory_from_usb $temp_restore_dir rocketchat
194
+    if [ -d $temp_restore_dir ]; then
195
+        if [ -d "$temp_restore_dir$rocketchat_dir" ]; then
196
+            cp -rp "$temp_restore_dir$rocketchat_dir"/* "$rocketchat_dir"/
197
+        else
198
+            if [ ! -d "$rocketchat_dir" ]; then
199
+                mkdir "$rocketchat_dir"
200
+            fi
201
+            cp -rp "$temp_restore_dir"/* "$rocketchat_dir"/
202
+        fi
203
+        chown -R rocketchat:rocketchat "$rocketchat_dir"
204
+        rm -rf $temp_restore_dir
205
+    fi
206
+    systemctl start rocketchat
207
+
208
+    restart_site
209
+}
210
+
211
+function backup_remote_rocketchat {
212
+    ROCKETCHAT_DOMAIN_NAME='rocketchat'
213
+    if grep -q "rocketchat domain" "$COMPLETION_FILE"; then
214
+        ROCKETCHAT_DOMAIN_NAME=$(get_completion_param "rocketchat domain")
215
+    fi
216
+
217
+    source_directory=/etc/rocketchat
218
+
219
+    suspend_site "${ROCKETCHAT_DOMAIN_NAME}"
220
+    systemctl stop rocketchat
221
+
222
+    dest_directory=rocketchat
223
+    backup_directory_to_friend "$source_directory" $dest_directory
224
+    USE_MONGODB=1
225
+    backup_database_to_friend rocketchat
226
+
227
+
228
+    systemctl start rocketchat
229
+
230
+    restart_site
231
+}
232
+
233
+function restore_remote_rocketchat {
234
+    if ! grep -q "rocketchat domain" "$COMPLETION_FILE"; then
235
+        return
236
+    fi
237
+    ROCKETCHAT_DOMAIN_NAME=$(get_completion_param "rocketchat domain")
238
+    if [ ! "$ROCKETCHAT_DOMAIN_NAME" ]; then
239
+        return
240
+    fi
241
+    suspend_site "${ROCKETCHAT_DOMAIN_NAME}"
242
+    systemctl stop rocketchat
243
+
244
+    temp_restore_dir=/root/temprocketchat
245
+    rocketchat_dir=/etc/rocketchat
246
+
247
+    rocketchat_create_database
248
+
249
+    USE_MONGODB=1
250
+    restore_database_from_friend rocketchat
251
+    if [ -d "$temp_restore_dir" ]; then
252
+        rm -rf $temp_restore_dir
253
+    fi
254
+
255
+    restore_directory_from_friend $temp_restore_dir rocketchat
256
+    if [ -d $temp_restore_dir ]; then
257
+        if [ -d "$temp_restore_dir$rocketchat_dir" ]; then
258
+            cp -rp "$temp_restore_dir$rocketchat_dir"/* "$rocketchat_dir"/
259
+        else
260
+            if [ ! -d "$rocketchat_dir" ]; then
261
+                mkdir "$rocketchat_dir"
262
+            fi
263
+            cp -rp $temp_restore_dir/* "$rocketchat_dir"/
264
+        fi
265
+        chown -R rocketchat:rocketchat "$rocketchat_dir"
266
+        rm -rf $temp_restore_dir
267
+    fi
268
+    systemctl start rocketchat
269
+
270
+    restart_site
271
+}
272
+
273
+function remove_rocketchat {
274
+    nginx_dissite "$ROCKETCHAT_DOMAIN_NAME"
275
+    remove_certs "$ROCKETCHAT_DOMAIN_NAME"
276
+
277
+    if [ -f /etc/systemd/system/rocketchat.service ]; then
278
+        systemctl stop rocketchat
279
+        systemctl disable rocketchat
280
+        rm /etc/systemd/system/rocketchat.service
281
+    fi
282
+    userdel -r rocketchat
283
+    remove_nodejs rocketchat
284
+
285
+
286
+    if [ -d "/var/www/$ROCKETCHAT_DOMAIN_NAME" ]; then
287
+        rm -rf "/var/www/$ROCKETCHAT_DOMAIN_NAME"
288
+    fi
289
+    if [ -f "/etc/nginx/sites-available/$ROCKETCHAT_DOMAIN_NAME" ]; then
290
+        rm "/etc/nginx/sites-available/$ROCKETCHAT_DOMAIN_NAME"
291
+    fi
292
+    drop_database_mongodb rocketchat
293
+    remove_onion_service rocketchat "${ROCKETCHAT_ONION_PORT}"
294
+    if grep -q "rocketchat" /etc/crontab; then
295
+        sed -i "/rocketchat/d" /etc/crontab
296
+    fi
297
+    remove_app rocketchat
298
+    remove_completion_param install_rocketchat
299
+    sed -i '/rocketchat/d' "$COMPLETION_FILE"
300
+
301
+    remove_ddns_domain "$ROCKETCHAT_DOMAIN_NAME"
302
+}
303
+
304
+function install_rocketchat {
305
+    apt-get install -yq curl graphicsmagick
306
+
307
+    install_mongodb
308
+
309
+    install_nodejs rocketchat
310
+    if [ ! "$ROCKETCHAT_DOMAIN_NAME" ]; then
311
+        echo $'No domain name was given'
312
+        exit 3568356
313
+    fi
314
+
315
+    if [ -d "/var/www/$ROCKETCHAT_DOMAIN_NAME/htdocs" ]; then
316
+        rm -rf "/var/www/$ROCKETCHAT_DOMAIN_NAME/htdocs"
317
+    fi
318
+    if [ -d /repos/rocketchat ]; then
319
+        mkdir "/var/www/$ROCKETCHAT_DOMAIN_NAME/htdocs"
320
+        cp -r -p /repos/rocketchat/. "/etc/rocketchat"
321
+        cd "/etc/rocketchat" || exit 36487365
322
+        git pull
323
+    else
324
+        git_clone "$ROCKETCHAT_REPO" "/etc/rocketchat"
325
+    fi
326
+
327
+    if [ ! -d "/etc/rocketchat" ]; then
328
+        echo $'Unable to clone rocketchat repo'
329
+        exit 87525
330
+    fi
331
+
332
+    cd "/etc/rocketchat" || exit 3463754637
333
+    git checkout "$ROCKETCHAT_COMMIT" -b "$ROCKETCHAT_COMMIT"
334
+    set_completion_param "rocketchat commit" "$ROCKETCHAT_COMMIT"
335
+
336
+    chmod g+w "/var/www/$ROCKETCHAT_DOMAIN_NAME/htdocs"
337
+    chown -R www-data:www-data "/var/www/$ROCKETCHAT_DOMAIN_NAME/htdocs"
338
+
339
+    rocketchat_create_database
340
+
341
+    add_ddns_domain "$ROCKETCHAT_DOMAIN_NAME"
342
+
343
+    ROCKETCHAT_ONION_HOSTNAME=$(add_onion_service rocketchat 80 "${ROCKETCHAT_ONION_PORT}")
344
+
345
+    rocketchat_nginx_site=/etc/nginx/sites-available/$ROCKETCHAT_DOMAIN_NAME
346
+    if [[ "$ONION_ONLY" == "no" ]]; then
347
+        nginx_http_redirect "$ROCKETCHAT_DOMAIN_NAME" "index index.html"
348
+        { echo 'server {';
349
+          echo '  listen 443 ssl;';
350
+          echo '  #listen [::]:443 ssl;';
351
+          echo "  server_name $ROCKETCHAT_DOMAIN_NAME;";
352
+          echo ''; } >> "$rocketchat_nginx_site"
353
+        nginx_compress "$ROCKETCHAT_DOMAIN_NAME"
354
+        echo '' >> "$rocketchat_nginx_site"
355
+        echo '  # Security' >> "$rocketchat_nginx_site"
356
+        nginx_ssl "$ROCKETCHAT_DOMAIN_NAME"
357
+
358
+        nginx_security_options "$ROCKETCHAT_DOMAIN_NAME"
359
+
360
+        { echo '  add_header Strict-Transport-Security max-age=15768000;';
361
+          echo '';
362
+          echo '  # Logs';
363
+          echo '  access_log /dev/null;';
364
+          echo '  error_log /dev/null;';
365
+          echo '';
366
+          echo '  # Root';
367
+          echo "  root /var/www/$ROCKETCHAT_DOMAIN_NAME/htdocs;";
368
+          echo '';
369
+          echo '  index index.html;';
370
+          echo '  # Location';
371
+          echo '  location / {'; } >> "$rocketchat_nginx_site"
372
+        nginx_limits "$ROCKETCHAT_DOMAIN_NAME" '15m'
373
+        { echo "    proxy_pass http://localhost:$ROCKETCHAT_PORT_INTERNAL;";
374
+          echo '    proxy_http_version 1.1;';
375
+          echo "    proxy_set_header Upgrade \$http_upgrade;";
376
+          echo "    proxy_set_header Connection \"upgrade\";";
377
+          echo "    proxy_set_header Host \$http_host;";
378
+          echo '';
379
+          echo "    proxy_set_header X-Real-IP \$remote_addr;";
380
+          echo "    proxy_set_header X-Forward-For \$proxy_add_x_forwarded_for;";
381
+          echo '    proxy_set_header X-Forward-Proto http;';
382
+          echo '    proxy_set_header X-Nginx-Proxy true;';
383
+          echo '';
384
+          echo '    proxy_redirect off;';
385
+          echo '  }';
386
+          echo '}'; } >> "$rocketchat_nginx_site"
387
+    else
388
+        echo -n '' > "$rocketchat_nginx_site"
389
+    fi
390
+    { echo 'server {';
391
+      echo "    listen 127.0.0.1:$ROCKETCHAT_ONION_PORT default_server;";
392
+      echo "    server_name $ROCKETCHAT_ONION_HOSTNAME;";
393
+      echo ''; } >> "$rocketchat_nginx_site"
394
+    nginx_compress "$ROCKETCHAT_DOMAIN_NAME"
395
+    echo '' >> "$rocketchat_nginx_site"
396
+    nginx_security_options "$ROCKETCHAT_DOMAIN_NAME"
397
+    { echo '';
398
+      echo '  # Logs';
399
+      echo '  access_log /dev/null;';
400
+      echo '  error_log /dev/null;';
401
+      echo '';
402
+      echo '  # Root';
403
+      echo "  root /var/www/$ROCKETCHAT_DOMAIN_NAME/htdocs;";
404
+      echo '';
405
+      echo '  index index.html;';
406
+      echo '  # Location';
407
+      echo '  location / {'; } >> "$rocketchat_nginx_site"
408
+    nginx_limits "$ROCKETCHAT_DOMAIN_NAME" '15m'
409
+    { echo "    proxy_pass http://localhost:$ROCKETCHAT_PORT_INTERNAL;";
410
+      echo '    proxy_http_version 1.1;';
411
+      echo "    proxy_set_header Upgrade \$http_upgrade;";
412
+      echo "    proxy_set_header Connection \"upgrade\";";
413
+      echo "    proxy_set_header Host \$http_host;";
414
+      echo '';
415
+      echo "    proxy_set_header X-Real-IP \$remote_addr;";
416
+      echo "    proxy_set_header X-Forward-For \$proxy_add_x_forwarded_for;";
417
+      echo '    proxy_set_header X-Forward-Proto http;';
418
+      echo '    proxy_set_header X-Nginx-Proxy true;';
419
+      echo '';
420
+      echo '    proxy_redirect off;';
421
+      echo '  }';
422
+      echo '}'; } >> "$rocketchat_nginx_site"
423
+
424
+    adduser --system --home="/etc/rocketchat" --group rocketchat
425
+
426
+    { echo '[Unit]';
427
+      echo 'Description=rocketchat';
428
+      echo 'After=syslog.target';
429
+      echo 'After=network.target';
430
+      echo '';
431
+      echo '[Service]';
432
+      echo 'Type=simple';
433
+      echo 'User=rocketchat';
434
+      echo 'Group=rocketchat';
435
+      echo 'WorkingDirectory=/etc/rocketchat';
436
+      echo 'ExecStart=/usr/local/bin/node main.js';
437
+      echo 'Environment=USER=rocketchat';
438
+      echo 'Restart=always';
439
+      echo 'StandardError=syslog';
440
+      echo 'Environment=NODE_ENV=production';
441
+      echo "Environment=PORT=${ROCKETCHAT_PORT_INTERNAL}";
442
+      echo "Environment=ROOT_URL=http://localhost:${ROCKETCHAT_PORT_INTERNAL}";
443
+      echo "Environment=MONGO_URL=mongodb://mongo:${MONGODB_PORT}/rocketchat";
444
+      echo '';
445
+      echo '[Install]';
446
+      echo 'WantedBy=multi-user.target'; } >> "/etc/systemd/system/rocketchat.service"
447
+    systemctl enable rocketchat
448
+    chown -R rocketchat:rocketchat "/etc/rocketchat"
449
+    systemctl start rocketchat
450
+
451
+    create_site_certificate "$ROCKETCHAT_DOMAIN_NAME" 'yes'
452
+
453
+    nginx_ensite "$ROCKETCHAT_DOMAIN_NAME"
454
+
455
+    systemctl restart nginx
456
+
457
+    "${PROJECT_NAME}-pass" -u "$MY_USERNAME" -a rocketchat -p "$ROCKETCHAT_ADMIN_PASSWORD"
458
+    set_completion_param "rocketchat domain" "$ROCKETCHAT_DOMAIN_NAME"
459
+
460
+    APP_INSTALLED=1
461
+}
462
+
463
+# NOTE: deliberately there is no "exit 0"

+ 4
- 1
src/freedombone-template View File

@@ -398,6 +398,9 @@ else
398 398
     echo "    set_repo_commit \"${app_dir}\" \"${app_name} commit\" \"\$${app_name_upper}_COMMIT\" \"\$${app_name_upper}_REPO\""
399 399
     echo "    chown -R ${app_name}:${app_name} \"${app_dir}\""
400 400
 fi
401
+if [ $app_daemon ]; then
402
+    echo "    systemctl restart ${app_name}"
403
+fi
401 404
 echo '}'
402 405
 echo ''
403 406
 echo "function backup_local_${app_name} {"
@@ -901,7 +904,7 @@ if [ $app_webui ]; then
901 904
             echo "    { echo \"    try_files \\\$uri \\\$uri/ index.php?\\\$args;\";"
902 905
         fi
903 906
     else
904
-        echo "      echo \"    proxy_pass http://localhost:\$${app_name_upper}_PORT_INTERNAL;\";"
907
+        echo "      { echo \"    proxy_pass http://localhost:\$${app_name_upper}_PORT_INTERNAL;\";"
905 908
     fi
906 909
     echo "      echo '  }';"
907 910
     echo "      echo '}'; } >> \"\$${app_name}_nginx_site\""

+ 1
- 0
src/freedombone-utils-mongodb View File

@@ -29,6 +29,7 @@
29 29
 # Set this when calling backup and restore commands
30 30
 USE_MONGODB=
31 31
 MONGODB_APPS_FILE=$HOME/.mongodbapps
32
+MONGODB_PORT=27017
32 33
 
33 34
 function store_original_mongodb_password {
34 35
     if [ ! -f /root/.mongodboriginal ]; then