From 1c5b51b6fd3bf4c1ceb396eb9880b50fab3608df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 10 Jul 2021 19:40:17 +0200 Subject: [PATCH] Testing (#78) * Repackage --- .travis.yml | 7 - README.md | 58 +++-- README_fr.md | 44 ++++ check_process | 25 ++ conf/app.src | 6 +- conf/mongod.conf | 44 ++++ conf/nginx.conf | 27 +-- conf/rocketchat.service | 18 -- conf/rocketchat_ldap.js | 2 +- conf/systemd.service | 21 ++ doc/DISCLAIMER.md | 0 doc/screenshots/screenshot.jpg | Bin 0 -> 172109 bytes manifest.json | 42 ++-- scripts/_common.sh | 432 +++++++++++++++++++++++++++------ scripts/backup | 44 +++- scripts/install | 225 ++++++++++------- scripts/remove | 93 +++++-- scripts/restore | 132 ++++++---- scripts/upgrade | 166 +++++++++++-- 19 files changed, 1037 insertions(+), 349 deletions(-) delete mode 100644 .travis.yml create mode 100644 README_fr.md create mode 100644 check_process create mode 100644 conf/mongod.conf delete mode 100644 conf/rocketchat.service create mode 100644 conf/systemd.service create mode 100644 doc/DISCLAIMER.md create mode 100644 doc/screenshots/screenshot.jpg diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index d9f1363..0000000 --- a/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: node_js - -before_install: - - git clone https://github.com/YunoHost/package_linter /tmp/package_linter - -script: - - /tmp/package_linter/package_linter.py ./ diff --git a/README.md b/README.md index 53160c9..2fdca0b 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,48 @@ -# rocketchat_ynh + -Rocketchat for yunohost +# RocketChat for YunoHost -[![Integration level](https://dash.yunohost.org/integration/rocketchat.svg)](https://dash.yunohost.org/appci/app/rocketchat) -[![Install Rocketchat with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=rocketchat) +[![Integration level](https://dash.yunohost.org/integration/rocketchat.svg)](https://dash.yunohost.org/appci/app/rocketchat) ![](https://ci-apps.yunohost.org/ci/badges/rocketchat.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/rocketchat.maintain.svg) +[![Install RocketChat with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=rocketchat) -## Install with +*[Lire ce readme en français.](./README_fr.md)* -You can either : +> *This package allows you to install RocketChat quickly and simply on a YunoHost server. +If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* -* Install from the Yunohost Admin web interface, by providing this URL: [https://github.com/YunoHost-Apps/rocketchat_ynh](https://github.com/YunoHost-Apps/rocketchat_ynh) -* Install from the command-line: `yunohost app install https://github.com/YunoHost-Apps/rocketchat_ynh` +## Overview -**Please note that currently the installation does not work on raspberry pi or arm architecture in general.** +the ultimate chat platform -## Backup information +**Shipped version:** 3.16.0~ynh1 -Backup stores: +**Demo:** https://cloud.rocket.chat/trial -- rocketchat app dir -- rocketchat mongodb (via mongodump) -- nginx configuration -- systemd service configuration +## Screenshots -#### Supported architectures +![](./doc/screenshots/screenshot.jpg) -* x86-64b - [![](https://ci-apps.yunohost.org/ci/logs/rocketchat%20%28Community%29.svg)](https://ci-apps.yunohost.org/ci/apps/rocketchat/) -* ARMv8-A - [![](https://ci-apps-arm.yunohost.org/ci/logs/rocketchat%20%28Community%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/rocketchat/) -* Jessie x86-64b - [![](https://ci-stretch.nohost.me/ci/logs/rocketchat%20%28Community%29.svg)](https://ci-stretch.nohost.me/ci/apps/rocketchat/) +## Documentation and resources -## Links +* Official app website: https://rocket.chat/ +* Official user documentation: https://yunohost.org/apps +* Official admin documentation: https://docs.rocket.chat/ +* Upstream app code repository: https://github.com/RocketChat/Rocket.Chat +* YunoHost documentation for this app: https://yunohost.org/app_rocketchat +* Report a bug: https://github.com/YunoHost-Apps/rocketchat_ynh/issues - * Report a bug: [Issues](/../../issues) - * Rocketchat website: https://rocket.chat/ - * YunoHost website: https://yunohost.org/ +## Developer info + +Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/rocketchat_ynh/tree/testing). + +To try the testing branch, please proceed like that. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/rocketchat_ynh/tree/testing --debug +or +sudo yunohost app upgrade rocketchat -u https://github.com/YunoHost-Apps/rocketchat_ynh/tree/testing --debug +``` + +**More info regarding app packaging:** https://yunohost.org/packaging_apps \ No newline at end of file diff --git a/README_fr.md b/README_fr.md new file mode 100644 index 0000000..7dcbd21 --- /dev/null +++ b/README_fr.md @@ -0,0 +1,44 @@ +# RocketChat pour YunoHost + +[![Niveau d'intégration](https://dash.yunohost.org/integration/rocketchat.svg)](https://dash.yunohost.org/appci/app/rocketchat) ![](https://ci-apps.yunohost.org/ci/badges/rocketchat.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/rocketchat.maintain.svg) +[![Installer RocketChat avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=rocketchat) + +*[Read this readme in english.](./README.md)* +*[Lire ce readme en français.](./README_fr.md)* + +> *Ce package vous permet d'installer RocketChat rapidement et simplement sur un serveur YunoHost. +Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour savoir comment l'installer et en profiter.* + +## Vue d'ensemble + +the ultimate chat platform + +**Version incluse :** 3.16.0~ynh1 + +**Démo :** https://cloud.rocket.chat/trial + +## Captures d'écran + +![](./doc/screenshots/screenshot.jpg) + +## Documentations et ressources + +* Site officiel de l'app : https://rocket.chat/ +* Documentation officielle utilisateur : https://yunohost.org/apps +* Documentation officielle de l'admin : https://docs.rocket.chat/ +* Dépôt de code officiel de l'app : https://github.com/RocketChat/Rocket.Chat +* Documentation YunoHost pour cette app : https://yunohost.org/app_rocketchat +* Signaler un bug : https://github.com/YunoHost-Apps/rocketchat_ynh/issues + +## Informations pour les développeurs + +Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/rocketchat_ynh/tree/testing). + +Pour essayer la branche testing, procédez comme suit. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/rocketchat_ynh/tree/testing --debug +ou +sudo yunohost app upgrade rocketchat -u https://github.com/YunoHost-Apps/rocketchat_ynh/tree/testing --debug +``` + +**Plus d'infos sur le packaging d'applications :** https://yunohost.org/packaging_apps \ No newline at end of file diff --git a/check_process b/check_process new file mode 100644 index 0000000..650c839 --- /dev/null +++ b/check_process @@ -0,0 +1,25 @@ +;; Test complet + ; Manifest + domain="domain.tld" + path="/path" + is_public=1 + ; Checks + pkg_linter=1 + setup_sub_dir=1 + setup_root=1 + setup_nourl=0 + setup_private=1 + setup_public=1 + upgrade=1 + #upgrade=1 from_commit=CommitHash + backup_restore=1 + multi_instance=0 + change_url=1 +;;; Options +Email= +Notification=none +;;; Upgrade options + ; commit=CommitHash + name=Name and date of the commit. + manifest_arg=domain=DOMAIN&path=PATH&admin=USER&is_public=1&password=pass&port=666& + \ No newline at end of file diff --git a/conf/app.src b/conf/app.src index 5e807eb..e31c739 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,7 +1,7 @@ -SOURCE_URL=https://releases.rocket.chat/0.73.2/download -SOURCE_SUM=3dc3eb11f383f7b72b0f23fedb305b6a566fa536a1e5087a4398255deeb864d8 +SOURCE_URL=https://releases.rocket.chat/3.16.0/download +SOURCE_SUM=c77aeed2a5eda4a3e9dfde8cfb742f32138638a3a44d0e9e38005992fcadb45b SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true -SOURCE_FILENAME=rocket.chat-0.73.2.tgz +SOURCE_FILENAME=rocket.chat-3.16.0.tgz SOURCE_EXTRACT=true \ No newline at end of file diff --git a/conf/mongod.conf b/conf/mongod.conf new file mode 100644 index 0000000..4bedf87 --- /dev/null +++ b/conf/mongod.conf @@ -0,0 +1,44 @@ +# mongod.conf + +# for documentation of all options, see: +# http://docs.mongodb.org/manual/reference/configuration-options/ + +# Where and how to store data. +storage: + dbPath: /var/lib/mongodb + journal: + enabled: true +engine: wiredTiger +# mmapv1: +# wiredTiger: + +# where to write logging data. +systemLog: + destination: file + logAppend: true + path: /var/log/mongodb/mongod.log + +# network interfaces +net: + port: 27017 + bindIp: 127.0.0.1 + + +# how the process runs +processManagement: + timeZoneInfo: /usr/share/zoneinfo + +#security: + +#operationProfiling: + +replication: + replSetName: "rs01" + +#sharding: + +## Enterprise-Only Options: + +#auditLog: + +#snmp: diff --git a/conf/nginx.conf b/conf/nginx.conf index e29a459..e5ac8f3 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,20 +1,19 @@ -location ^~ #LOCATION# { +#sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; +location ^~ __PATH__/ { - # Force HTTPS - if ($scheme = http) { - rewrite ^ https://$server_name$request_uri? permanent; - } + proxy_pass http://127.0.0.1:__PORT__; + proxy_redirect off; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $server_name; - proxy_pass http://localhost:#PORT##PATH#; proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; - proxy_set_header Host $http_host; + proxy_set_header Upgrade $http_upgrade; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forward-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forward-Proto http; - proxy_set_header X-Nginx-Proxy true; - - proxy_redirect off; + # Include SSOWAT user panel. + include conf.d/yunohost_panel.conf.inc; + more_clear_input_headers 'Accept-Encoding'; } diff --git a/conf/rocketchat.service b/conf/rocketchat.service deleted file mode 100644 index 7afc22b..0000000 --- a/conf/rocketchat.service +++ /dev/null @@ -1,18 +0,0 @@ -[Unit] -Description=rocketchat -After=network.target - -[Service] -Type=simple -WorkingDirectory=#DESTDIR# -User=#USER# -ExecStart=#NODE# main.js -Restart=always -SyslogIdentifier=rocketchat -Environment="BIND_IP=127.0.0.1" -Environment="ROOT_URL=https://#ROOTURL##LOCATION#" -Environment="PORT=#PORT#" -Environment="MONGO_URL=mongodb://localhost:27017/#DBNAME#" - -[Install] -WantedBy=multi-user.target diff --git a/conf/rocketchat_ldap.js b/conf/rocketchat_ldap.js index ccb0f77..62293ff 100644 --- a/conf/rocketchat_ldap.js +++ b/conf/rocketchat_ldap.js @@ -1,4 +1,4 @@ -use #DBNAME# +use __DB_NAME__ db.rocketchat_settings.update( diff --git a/conf/systemd.service b/conf/systemd.service new file mode 100644 index 0000000..8451839 --- /dev/null +++ b/conf/systemd.service @@ -0,0 +1,21 @@ +[Unit] +Description=The Rocket.Chat server +Wants=__MONGODB_SERVICENAME__.service +After=network.target remote-fs.target nss-lookup.target nginx.service __MONGODB_SERVICENAME__.service + +[Service] +User=__APP__ +WorkingDirectory=__FINALPATH__ +Environment="PATH=__ENV_PATH__" +Environment="NODE_ENV=production" +ExecStart=__YNH_NODE__ main.js +StandardOutput=syslog +StandardError=syslog +SyslogIdentifier=__APP__ +Environment=MONGO_URL=mongodb://127.0.0.1:27017/__APP__?replicaSet=rs01 +Environment=MONGO_OPLOG_URL=mongodb://127.0.0.1:27017/local?replicaSet=rs01 +Environment=ROOT_URL=https://__DOMAIN____PATH__ +Environment=PORT=__PORT__ + +[Install] +WantedBy=multi-user.target diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md new file mode 100644 index 0000000..e69de29 diff --git a/doc/screenshots/screenshot.jpg b/doc/screenshots/screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..555257d1af47fa75a41718a6bd59376aa7929827 GIT binary patch literal 172109 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%0A_bV`1Z!Q~netQ-a4h4eVE2aA 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 2.5.6" + "yunohost": ">> 4.2.4" }, "arguments": { "install" : [ { "name": "domain", "type": "domain", - "ask": { - "en": "Choose a domain for Rocketchat" - }, "example": "domain.org" }, { "name": "path", "type": "path", - "ask": { - "en": "Choose a path for RocketChat" - }, "example": "/rocketchat", "default": "/rocketchat" }, { "name": "is_public", "type": "boolean", - "ask": { - "en": "Is it a public application?" - }, - "default": "Yes" - }, - { - "name": "lang", - "type": "string", - "ask": { - "en": "Select default language" - }, - "choices": ["English"], - "default": "English" + "default": true } ] } diff --git a/scripts/_common.sh b/scripts/_common.sh index eddb1d4..157327b 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -1,82 +1,372 @@ -# common.sh +#!/bin/bash -ROCKETCHAT_VERSION=0.73.2 -ROCKETCHAT_SHASUM=3dc3eb11f383f7b72b0f23fedb305b6a566fa536a1e5087a4398255deeb864d8 -ROCKETCHAT_DOWNLOAD_URI=https://releases.rocket.chat/${ROCKETCHAT_VERSION}/download -NODE_VERSION=8.11.4 -DEBIAN_ISSUE=$(grep 9 /etc/debian_version >/dev/null && echo stretch || echo jessie) +#================================================= +# COMMON VARIABLES +#================================================= -checkcmd() { - curl -m 1 -s localhost:$port$path/api/v1/info | \ - python -c "import sys, json; print json.load(sys.stdin)['success']" 2>/dev/null | \ - grep "True" >/dev/null 2>&1 +nodejs_version=12 + +# dependencies used by the app +pkg_dependencies="apt-transport-https build-essential gzip curl fontconfig graphicsmagick" + +#================================================= +# PERSONAL HELPERS +#================================================= + +#================================================= +# EXPERIMENTAL HELPERS +#================================================= + +MONGO_DEBIAN_SERVICENAME="mongodb" +MONGO_CE_SERVICENAME="mongod" +MONGO_DEBIAN_DEPENDENCIES="mongodb mongodb-server mongo-tools" +MONGO_CE_DEPENDENCIES="mongodb-org mongodb-org-server mongodb-org-tools" +MONGO_DEBIAN_CONFIG="/etc/mongodb.conf" +MONGO_CE_CONFIG="/etc/mongod.conf" +MONGO_CE_REPO="deb http://repo.mongodb.org/apt/debian buster/mongodb-org/4.4 main" +MONGO_CE_KEY="https://www.mongodb.org/static/pgp/server-4.4.asc" + +# Execute a mongo command +# +# example: ynh_mongo_exec --command='db.getMongo().getDBNames().indexOf("wekan")' +# example: ynh_mongo_exec --command="db.getMongo().getDBNames().indexOf(\"wekan\")" +# +# usage: ynh_mongo_exec [--user=user] [--password=password] [--authenticationdatabase=authenticationdatabase] [--database=database] [--host=host] [--port=port] --command="command" [--eval] +# | arg: -u, --user= - The user name to connect as +# | arg: -p, --password= - The user password +# | arg: -d, --authenticationdatabase= - The authenticationdatabase to connect to +# | arg: -d, --database= - The database to connect to +# | arg: -h, --host= - The host to connect to +# | arg: -P, --port= - The port to connect to +# | arg: -c, --command= - The command to evaluate +# | arg: -e, --eval - Evaluate instead of execute the command. +# +# +ynh_mongo_exec() { + # Declare an array to define the options of this helper. + local legacy_args=upadhPce + local -A args_array=( [u]=user= [p]=password= [a]=authenticationdatabase= [d]=database= [h]=host= [P]=port= [c]=command= [e]=eval ) + local user + local password + local authenticationdatabase + local database + local host + local port + local command + local eval + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + user="${user:-}" + password="${password:-}" + authenticationdatabase="${authenticationdatabase:-}" + database="${database:-}" + host="${host:-}" + port="${port:-}" + eval=${eval:-0} + + # If user is provided + if [ -n "$user" ] + then + user="--username=$user" + + # If password is provided + if [ -n "$password" ] + then + password="--password=$password" + fi + + # If authenticationdatabase is provided + if [ -n "$authenticationdatabase" ] + then + authenticationdatabase="--authenticationDatabase=$authenticationdatabase" + else + authenticationdatabase="--authenticationDatabase=admin" + fi + else + password="" + authenticationdatabase="" + fi + + # If host is provided + if [ -n "$host" ] + then + host="--host=$host" + fi + + # If port is provided + if [ -n "$port" ] + then + port="--port=$port" + fi + + # If eval is not provided + if [ $eval -eq 0 ] + then + # If database is provided + if [ -n "$database" ] + then + database="use $database" + else + database="" + fi + + mongo --quiet $user $password $authenticationdatabase $host $port < ./dump.bson +# +# usage: ynh_mongo_dump_db --database=database +# | arg: -d, --database= - The database name to dump +# | ret: the mongodump output +# +# +ynh_mongo_dump_db() { + # Declare an array to define the options of this helper. + local legacy_args=d + local -A args_array=( [d]=database= ) + local database + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + + mongodump --quiet --db="$database" --archive } -installdeps(){ +# Create a user +# +# [internal] +# +# usage: ynh_mongo_create_user --db_user=user --db_pwd=pwd --db_name=name +# | arg: -u, --db_user= - The user name to create +# | arg: -p, --db_pwd= - The password to identify user by +# | arg: -n, --db_name= - Name of the database to grant privilegies +# +# +ynh_mongo_create_user() { + # Declare an array to define the options of this helper. + local legacy_args=unp + local -A args_array=( [u]=db_user= [n]=db_name= [p]=db_pwd= ) + local db_user + local db_name + local db_pwd + # Manage arguments with getopts + ynh_handle_getopts_args "$@" - if [ $(dpkg --print-architecture) == "armhf" ]; then - #Install mongodb for debian armhf - sudo apt-get update - sudo apt-get install -y mongodb-server - - # start mongodb service - sudo systemctl enable mongodb.service - sudo systemctl start mongodb.service - - # add mongodb to services - sudo yunohost service add mongodb -l /var/log/mongodb/mongodb.log - else - #Install mongodb for debian x86/x64 - sudo apt-get install dirmngr && sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4 - echo "deb http://repo.mongodb.org/apt/debian ${DEBIAN_ISSUE}/mongodb-org/4.0 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list - sudo apt-get update - sudo apt-get install -y mongodb-org - - # start mongodb service - sudo systemctl enable mongod.service - sudo systemctl start mongod.service - - # add mongodb to services - sudo yunohost service add mongod -l /var/log/mongodb/mongod.log - fi - - #Install other dependencies - sudo apt-get install -y build-essential gzip curl graphicsmagick - - installnode + # Create the user and set the user as admin of the db + ynh_mongo_exec --database="$db_name" --command='db.createUser( { user: "'${db_user}'", pwd: "'${db_pwd}'", roles: [ { role: "readWrite", db: "'${db_name}'" } ] } );' + + # Add clustermonitoring rights + ynh_mongo_exec --database="$db_name" --command='db.grantRolesToUser("'${db_user}'",[{ role: "clusterMonitor", db: "admin" }]);' +} + +# Check if a mongo database exists +# +# usage: ynh_mongo_database_exists --database=database +# | arg: -d, --database= - The database for which to check existence +# | exit: Return 1 if the database doesn't exist, 0 otherwise +# +# +ynh_mongo_database_exists() { + # Declare an array to define the options of this helper. + local legacy_args=d + local -A args_array=([d]=database=) + local database + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + + if [ $(ynh_mongo_exec --command='db.getMongo().getDBNames().indexOf("'${database}'")' --eval) -lt 0 ] + then + return 1 + else + return 0 + fi +} + +# Restore a database +# +# example: ynh_mongo_restore_db --database=wekan < ./dump.bson +# +# usage: ynh_mongo_restore_db --database=database +# | arg: -d, --database= - The database name to restore +# +# +ynh_mongo_restore_db() { + # Declare an array to define the options of this helper. + local legacy_args=d + local -A args_array=( [d]=database= ) + local database + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + + mongorestore --quiet --db="$database" --archive +} + +# Drop a user +# +# [internal] +# +# usage: ynh_mongo_drop_user --db_user=user --db_name=name +# | arg: -u, --db_user= - The user to drop +# | arg: -n, --db_name= - Name of the database +# +# +ynh_mongo_drop_user() { + # Declare an array to define the options of this helper. + local legacy_args=un + local -A args_array=( [u]=db_user= [n]=db_name= ) + local db_user + local db_name + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + + ynh_mongo_exec --database="$db_name" --command='db.dropUser("'$db_user'", {w: "majority", wtimeout: 5000})' +} + +# Create a database, an user and its password. Then store the password in the app's config +# +# usage: ynh_mongo_setup_db --db_user=user --db_name=name [--db_pwd=pwd] +# | arg: -u, --db_user= - Owner of the database +# | arg: -n, --db_name= - Name of the database +# | arg: -p, --db_pwd= - Password of the database. If not provided, a password will be generated +# +# After executing this helper, the password of the created database will be available in $db_pwd +# It will also be stored as "mongopwd" into the app settings. +# +# +ynh_mongo_setup_db() { + # Declare an array to define the options of this helper. + local legacy_args=unp + local -A args_array=( [u]=db_user= [n]=db_name= [p]=db_pwd= ) + local db_user + local db_name + db_pwd="" + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + + local new_db_pwd=$(ynh_string_random) # Generate a random password + # If $db_pwd is not provided, use new_db_pwd instead for db_pwd + db_pwd="${db_pwd:-$new_db_pwd}" + + # Create the user and grant access to the database + ynh_mongo_create_user --db_user="$db_user" --db_pwd="$db_pwd" --db_name="$db_name" + + # Store the password in the app's config + ynh_app_setting_set --app=$app --key=db_pwd --value=$db_pwd +} + +# Remove a database if it exists, and the associated user +# +# usage: ynh_mongo_remove_db --db_user=user --db_name=name +# | arg: -u, --db_user= - Owner of the database +# | arg: -n, --db_name= - Name of the database +# +# +ynh_mongo_remove_db() { + # Declare an array to define the options of this helper. + local legacy_args=un + local -A args_array=( [u]=db_user= [n]=db_name= ) + local db_user + local db_name + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + + if ynh_mongo_database_exists --database=$db_name; then # Check if the database exists + ynh_mongo_drop_db --database=$db_name # Remove the database + else + ynh_print_warn --message="Database $db_name not found" + fi + + # Remove mongo user if it exists + ynh_mongo_drop_user --db_user=$db_user --db_name=$db_name +} + +# Install MongoDB and integrate MongoDB service in YunoHost +# +# usage: ynh_install_mongo +# +# +ynh_install_mongo() { + ynh_print_info --message="Installing MongoDB..." + + # Define Mongo Service Name + if $(dpkg --compare-versions $(cat /etc/debian_version) gt "10.0") + then + ynh_print_info --message="Installing MongoDB Community Edition..." + ynh_install_extra_app_dependencies --repo="$MONGO_CE_REPO" --package="$MONGO_CE_DEPENDENCIES" --key="$MONGO_CE_KEY" + MONGODB_SERVICENAME=$MONGO_CE_SERVICENAME + else + ynh_print_info --message="Installing MongoDB Debian..." + ynh_install_app_dependencies $MONGO_DEBIAN_DEPENDENCIES + MONGODB_SERVICENAME=$MONGO_DEBIAN_SERVICENAME + fi + mongodb_servicename=$MONGODB_SERVICENAME + + # Make sure MongoDB is started and enabled + systemctl is-enabled $MONGODB_SERVICENAME -q || systemctl enable $MONGODB_SERVICENAME --quiet + systemctl is-active $MONGODB_SERVICENAME -q || ynh_systemd_action --service_name=$MONGODB_SERVICENAME --action=restart --line_match="aiting for connections" --log_path="/var/log/mongodb/$MONGODB_SERVICENAME.log" + + # Integrate MongoDB service in YunoHost + yunohost service add $MONGODB_SERVICENAME --description="MongoDB daemon" --log="/var/log/mongodb/$MONGODB_SERVICENAME.log" +} + +# Remove MongoDB +# Only remove the MongoDB service integration in YunoHost for now +# if MongoDB package as been removed +# +# usage: ynh_remove_mongo +# +# +ynh_remove_mongo() { + # Only remove the mongodb service if it is not installed. + if ! ynh_package_is_installed --package="mongodb*" + then + ynh_print_info --message="Removing MongoDB service..." + # Define Mongo Service Name + if [ "$(lsb_release --codename --short)" = "buster" ]; then + MONGODB_SERVICENAME=$MONGO_CE_SERVICENAME + else + MONGODB_SERVICENAME=$MONGO_DEBIAN_SERVICENAME + fi + # Remove the mongodb service + yunohost service remove $MONGODB_SERVICENAME + # ynh_secure_remove --file=$MONGO_ROOT_PWD_FILE + fi } diff --git a/scripts/backup b/scripts/backup index f5a45d0..3ca4521 100644 --- a/scripts/backup +++ b/scripts/backup @@ -1,11 +1,24 @@ #!/bin/bash -set -eu +#================================================= +# GENERIC START #================================================= # IMPORT GENERIC HELPERS #================================================= +# Keep this path for calling _common.sh inside the execution's context of backup and restore scripts +source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers + +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +ynh_clean_setup () { + ### Remove this function if there's nothing to clean before calling the remove script. + true +} +# Exit if an error occurs during the execution of the script ynh_abort_if_errors #================================================= @@ -14,8 +27,9 @@ ynh_abort_if_errors app=$YNH_APP_INSTANCE_NAME -final_path=$(ynh_app_setting_get $app final_path) -domain=$(ynh_app_setting_get $app domain) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +domain=$(ynh_app_setting_get --app=$app --key=domain) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) #================================================= # STANDARD BACKUP STEPS @@ -23,17 +37,31 @@ domain=$(ynh_app_setting_get $app domain) # BACKUP THE APP MAIN DIR #================================================= -ynh_backup "$final_path" +ynh_backup --src_path="$final_path" #================================================= -# BACKUP THE CONFIGURATION +# BACKUP THE NGINX CONFIGURATION #================================================= -ynh_backup "/etc/systemd/system/$app.service" "conf/service" -ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf" "conf/nginx" +ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" "conf/nginx" + +#================================================= +# SPECIFIC BACKUP +#================================================= +# BACKUP SYSTEMD +#================================================= + +ynh_backup --src_path="/etc/systemd/system/$app.service" "conf/service" #================================================= # BACKUP THE MONGODB DATABASE #================================================= +ynh_print_info --message="Backing up the MongoDB database..." -mongodump -o "./dump" +ynh_mongo_dump_db --database="$db_name" > ./dump.bson + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." diff --git a/scripts/install b/scripts/install index 28e2b9e..b29b14e 100644 --- a/scripts/install +++ b/scripts/install @@ -1,5 +1,4 @@ #!/bin/bash -set -eu #================================================= # GENERIC START @@ -7,13 +6,16 @@ set -eu # IMPORT GENERIC HELPERS #================================================= +source _common.sh source /usr/share/yunohost/helpers -source ./_common.sh #================================================= # MANAGE SCRIPT FAILURE #================================================= +ynh_clean_setup () { + true +} # Exit if an error occurs during the execution of the script ynh_abort_if_errors @@ -22,129 +24,166 @@ ynh_abort_if_errors #================================================= domain=$YNH_APP_ARG_DOMAIN -path=$YNH_APP_ARG_PATH +path_url=$YNH_APP_ARG_PATH is_public=$YNH_APP_ARG_IS_PUBLIC -language=$YNH_APP_ARG_LANG app=$YNH_APP_INSTANCE_NAME -dbname=$app -serviceuser=rocketchat #================================================= -# CHECK IF THE APP CAN BE INSTALLED +# CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS #================================================= +ynh_script_progression --message="Validating installation parameters..." --weight=1 -# Check for supported architecture -arch="$(uname -m)" -if [[ "$arch" != "x86_64" ]]; then - script_die "This app requires an x86_64 machine, but this one is '${arch}'." -fi +final_path=/var/www/$app +test ! -e "$final_path" || ynh_die --message="This path already contains a folder" -workdir=$(pwd) +# Register (book) web path +ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url -# find suitable port (default 3000) -port=$(ynh_find_port 3000) +#================================================= +# STORE SETTINGS FROM MANIFEST +#================================================= +ynh_script_progression --message="Storing installation settings..." --weight=2 -# if path do not begin with / add a / at the begining -if [ "${path:0:1}" != "/" ]; then - path="/$path" -fi -# if path do not end with / add a / at the end -if [ "${path:${#path}-1}" != "/" ] && [ ${#path} -gt 1 ]; then - path="$path/" -fi +ynh_app_setting_set --app=$app --key=domain --value=$domain +ynh_app_setting_set --app=$app --key=path --value=$path_url +#================================================= +# STANDARD MODIFICATIONS +#================================================= +# FIND AND OPEN A PORT +#================================================= +ynh_script_progression --message="Finding an available port..." --weight=2 -# Check domain/path availability -ynh_webpath_available $domain $path -if [[ ! $? -eq 0 ]]; then - ynh_die "domain not available" -fi +# Find an available port +port=$(ynh_find_port --port=3000) +ynh_app_setting_set --app=$app --key=port --value=$port -# Register/book a web path for an app -ynh_webpath_register $app $domain $path +#================================================= +# INSTALL DEPENDENCIES +#================================================= +ynh_script_progression --message="Installing dependencies..." --weight=20 -final_path="/var/lib/$app" -[[ -d $final_path ]] && ynh_die \ -"The destination directory '$final_path' already exists.\ - You should safely delete it before installing this app." +ynh_install_app_dependencies $pkg_dependencies -# Save specific settings -ynh_app_setting_set $app node_version $NODE_VERSION -ynh_app_setting_set $app rocketchat_version $ROCKETCHAT_VERSION -ynh_app_setting_set $app serviceuser $serviceuser -ynh_app_setting_set $app port $port -ynh_app_setting_set $app final_path $final_path -ynh_app_setting_set $app path $path -ynh_app_setting_set $app is_public $is_public +# Install Nodejs +ynh_exec_warn_less ynh_install_nodejs --nodejs_version=$nodejs_version +ynh_install_mongo -#Install dependencies -installdeps +#================================================= +# CREATE A MONGODB DATABASE +#================================================= +ynh_script_progression --message="Creating a MongoDB database..." -# Create destination -mkdir -p $final_path +db_name=$(ynh_sanitize_dbid --db_name=$app) +db_user=$db_name +ynh_app_setting_set --app=$app --key=db_name --value=$db_name +ynh_mongo_setup_db --db_user=$db_user --db_name=$db_name -# Create user -id -u $serviceuser || useradd -d "$final_path" -M $serviceuser +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Configuring system user..." --weight=3 -# Copy and set systemd configuration -ynh_replace_string "#ROOTURL#" "$domain" ../conf/rocketchat.service -ynh_replace_string "#LOCATION#" "${path:-/}" ../conf/rocketchat.service -ynh_replace_string "#PORT#" "$port" ../conf/rocketchat.service -ynh_replace_string "#USER#" "$serviceuser" ../conf/rocketchat.service -ynh_replace_string "#DESTDIR#" "$final_path" ../conf/rocketchat.service -ynh_replace_string "#DBNAME#" "$dbname" ../conf/rocketchat.service -# absolute node path needed -NODE_BIN=$(which node) -ynh_replace_string "#NODE#" "$NODE_BIN" ../conf/rocketchat.service -cp ../conf/rocketchat.service /etc/systemd/system/$app.service -systemctl daemon-reload - -# Copy and set nginx configuration -nginx_conf="/etc/nginx/conf.d/${domain}.d/${app}.conf" -ynh_replace_string "#APP#" "$app" ../conf/nginx.conf -ynh_replace_string "#PATH#" "$path" ../conf/nginx.conf -ynh_replace_string "#PORT#" "$port" ../conf/nginx.conf -ynh_replace_string "#LOCATION#" "${path:-/}" ../conf/nginx.conf - -#set db name into ldap config -ynh_replace_string "#DBNAME#" "$dbname" ../conf/rocketchat_ldap.js - -cp ../conf/nginx.conf "$nginx_conf" +# Create a system user +ynh_system_user_create --username=$app --home_dir=$final_path #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= +ynh_script_progression --message="Setting up source files..." --weight=2 -ynh_setup_source "$final_path" +ynh_app_setting_set --app=$app --key=final_path --value=$final_path +# Download, check integrity, uncompress and patch the source from app.src +ynh_setup_source --dest_dir=$final_path -chown -R $serviceuser: $final_path +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:$app "$final_path" -cd $final_path/programs/server/ +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Configuring NGINX web server..." --weight=2 -sudo -u $serviceuser npm install --production +# Create a dedicated nginx config +ynh_add_nginx_config -cd $workdir +#================================================= +# SPECIFIC SETUP +#============================================== +# INSTALL ROCKETCHAT +#============================================== +ynh_script_progression --message="Building $app... (this will take some time and resources!)" --weight=20 -systemctl reload nginx -if [ "$is_public" = "Yes" ]; +pushd $final_path/programs/server + ynh_use_nodejs + ynh_exec_as $app env $ynh_node_load_PATH npm install 2>/dev/null +popd + +#================================================= +# SETUP SYSTEMD +#================================================= +ynh_script_progression --message="Configuring a systemd service..." --weight=1 + +ynh_replace_string --match_string="__ENV_PATH__" --replace_string="$PATH" --target_file="../conf/systemd.service" + +ynh_add_systemd_config + +#================================================= +# MODIFY A CONFIG FILE +#================================================= +ynh_script_progression --message="Configuring a mongod..." --weight=1 + +sed -i "s/^# engine:/ engine: wiredTiger/" /etc/mongod.conf +sed -i "s/^#replication:/replication:\n replSetName: rs01/" /etc/mongod.conf +#echo -e "replication:\n replSetName: \"rs01\"" | tee -a /etc/mongod.conf + +#================================================= +# INTEGRATE SERVICE IN YUNOHOST +#================================================= +ynh_script_progression --message="Integrating service in YunoHost..." + +yunohost service add $app --description="Team collaboration communication platform" --log="/var/log/$app/$app.log" + +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a MongoDB service..." --weight=2 + +# Start a mongod service +ynh_exec_warn_less systemctl enable mongod --quiet +ynh_systemd_action --service_name=mongod --action=restart + +#mongo --eval "printjson(rs.initiate())" + +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a systemd service..." --weight=2 + +ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="➔ System ➔ startup" + +#================================================= +# SETUP SSOWAT +#================================================= +ynh_script_progression --message="Configuring permissions..." --weight=1 + +# Make app public if necessary or protect it +if [ $is_public -eq 1 ] then - ynh_app_setting_set "$app" skipped_uris "/" + ynh_permission_update --permission="main" --add="visitors" fi -systemctl start $app.service -systemctl enable $app.service +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --weight=2 -# add rocketchat to services -yunohost service add $app +ynh_systemd_action --service_name=nginx --action=reload -# wait for rocketchat to populate db and start -waitforservice +#================================================= +# END OF SCRIPT +#================================================= -mongo < ../conf/rocketchat_ldap.js - -systemctl restart $app.service - -waitforservice - -yunohost app ssowatconf +ynh_script_progression --message="Installation of $app completed" --last diff --git a/scripts/remove b/scripts/remove index 9e77aa1..d37f8d1 100644 --- a/scripts/remove +++ b/scripts/remove @@ -1,5 +1,4 @@ #!/bin/bash -set -u #================================================= # GENERIC START @@ -7,25 +6,89 @@ set -u # IMPORT GENERIC HELPERS #================================================= +source _common.sh source /usr/share/yunohost/helpers -source ./_common.sh + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME -domain=$(ynh_app_setting_get $app domain) -final_path=$(ynh_app_setting_get $app final_path) -systemctl stop $app.service +domain=$(ynh_app_setting_get --app=$app --key=domain) +port=$(ynh_app_setting_get --app=$app --key=port) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$db_name +final_path=$(ynh_app_setting_get --app=$app --key=final_path) -# remove Rocketchat from services -yunohost service remove $app +#================================================= +# STANDARD REMOVE +#================================================= +# REMOVE SERVICE INTEGRATION IN YUNOHOST +#================================================= -ynh_secure_remove $final_path -ynh_secure_remove /etc/nginx/conf.d/$domain.d/$app.conf -ynh_secure_remove /var/log/$app -ynh_secure_remove /etc/systemd/system/$app.service +# Remove the service from the list of services known by Yunohost (added from `yunohost service add`) +if ynh_exec_warn_less yunohost service status $app >/dev/null +then + ynh_script_progression --message="Removing $app service..." --weight=1 + yunohost service remove $app +fi -# remove database!!! -mongo rocketchat --eval "db.dropDatabase()" +#================================================= +# STOP AND REMOVE SERVICE +#================================================= +ynh_script_progression --message="Stopping and removing the systemd service..." --weight=1 -systemctl daemon-reload -systemctl reload nginx +# Remove the dedicated systemd config +ynh_remove_systemd_config + +#================================================= +# REMOVE THE MONGODB DATABASE +#================================================= +ynh_script_progression --message="Removing the MongoDB database..." + +# Remove a database if it exists, along with the associated user +ynh_mongo_remove_db --db_user=$db_user --db_name=$db_name + +#================================================= +# REMOVE DEPENDENCIES +#================================================= +ynh_script_progression --message="Removing dependencies..." --weight=1 + +# Remove metapackage and its dependencies +ynh_remove_app_dependencies +ynh_remove_nodejs +ynh_remove_mongo + +#================================================= +# REMOVE APP MAIN DIR +#================================================= +ynh_script_progression --message="Removing app main directory..." --weight=1 + +# Remove the app directory securely +ynh_secure_remove --file="$final_path" + +#================================================= +# REMOVE NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Removing NGINX web server configuration..." --weight=1 + +# Remove the dedicated nginx config +ynh_remove_nginx_config + +#================================================= +# GENERIC FINALIZATION +#================================================= +# REMOVE DEDICATED USER +#================================================= +ynh_script_progression --message="Removing the dedicated system user..." --weight=1 + +# Delete a system user +ynh_system_user_delete --username=$app + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Removal of $app completed" --last diff --git a/scripts/restore b/scripts/restore index adf14de..ff9daa6 100644 --- a/scripts/restore +++ b/scripts/restore @@ -1,94 +1,128 @@ #!/bin/bash -set -eu #================================================= # IMPORT GENERIC HELPERS #================================================= -if [ ! -e _common.sh ]; then - # Fetch helpers file if not in current directory - cp ../settings/scripts/_common.sh ./_common.sh - chmod a+rx _common.sh -fi -source /usr/share/yunohost/helpers -source _common.sh -#================================================= -# GENERIC START +# Keep this path for calling _common.sh inside the execution's context of backup and restore scripts +source ../settings/scripts/_common.sh +source /usr/share/yunohost/helpers + #================================================= # MANAGE SCRIPT FAILURE #================================================= -# Exit on command errors and treat access to unset variables as an error +ynh_clean_setup () { + #### Remove this function if there's nothing to clean before calling the remove script. + true +} +# Exit if an error occurs during the execution of the script ynh_abort_if_errors #================================================= # LOAD SETTINGS #================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME -domain=$(ynh_app_setting_get $app domain) -path=$(ynh_app_setting_get $app path) -final_path=$(ynh_app_setting_get $app final_path) -serviceuser=$(ynh_app_setting_get $app serviceuser) -port=$(ynh_app_setting_get $app port) +domain=$(ynh_app_setting_get --app=$app --key=domain) +path_url=$(ynh_app_setting_get --app=$app --key=path) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$db_name -# Check domain/path availability -ynh_webpath_available $domain $path -if [[ ! $? -eq 0 ]]; then - ynh_die "domain not available" -fi +#================================================= +# CHECK IF THE APP CAN BE RESTORED +#================================================= +ynh_script_progression --message="Validating restoration parameters..." --weight=1 -# Check destination directory -[[ -d $final_path ]] && ynh_die \ -"The destination directory '$final_path' already exists.\ - You should safely delete it before restoring this app." - -# Create destination -mkdir -p $final_path - -# Create user -id -u $serviceuser || useradd -d "$final_path" -M $serviceuser +ynh_webpath_available --domain=$domain --path_url=$path_url \ + || ynh_die --message="Path not available: ${domain}${path_url}" +test ! -d $final_path \ + || ynh_die --message="There is already a directory: $final_path " #================================================= # STANDARD RESTORATION STEPS #================================================= - -ynh_restore - -#================================================= -# RELOAD THE NGINX CONFIGURATION +# RESTORE THE NGINX CONFIGURATION #================================================= -systemctl reload nginx +ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= -# RELOAD AND ENABLE THE SYSTEMD CONFIGURATION +# RECREATE THE DEDICATED USER #================================================= -systemctl daemon-reload -systemctl enable rocketchat +ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 + +# Create the dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir=$final_path #================================================= -# RESTORE PERMISSIONS IN THE APP MAIN DIR +# RESTORE THE APP MAIN DIR #================================================= +ynh_script_progression --message="Restoring the app main directory..." --weight=1 -chown -R $serviceuser: $final_path +ynh_restore_file --origin_path="$final_path" + +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:$app "$final_path" #================================================= -# INSTALL DEPENDENCIES +# SPECIFIC RESTORATION #================================================= +# REINSTALL DEPENDENCIES +#================================================= +ynh_script_progression --message="Reinstalling dependencies..." --weight=1 -installdeps +# Define and install dependencies +ynh_install_app_dependencies $pkg_dependencies +ynh_exec_warn_less ynh_install_nodejs --nodejs_version=$nodejs_version +ynh_install_mongo #================================================= -# RESTORE THE MONGODB +# RESTORE THE MONGODB DATABASE #================================================= +ynh_script_progression --message="Restoring the MongoDB database..." -mongorestore ./dump +db_pwd=$(ynh_app_setting_get --app=$app --key=db_pwd) +ynh_mongo_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd +ynh_mongo_restore_db --database="$db_name" < ./dump.bson #================================================= -# START APP RELATED SERVICES +# RESTORE SYSTEMD +#================================================= +ynh_script_progression --message="Restoring the systemd configuration..." --weight=1 + +ynh_restore_file --origin_path="/etc/systemd/system/$app.service" +systemctl enable $app.service --quiet + +#================================================= +# INTEGRATE SERVICE IN YUNOHOST +#================================================= +ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 + +yunohost service add $app --description="Team collaboration communication platform" --log="/var/log/$app/$app.log" + +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a systemd service..." --weight=1 + +ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" + +#================================================= +# GENERIC FINALIZATION +#================================================= +# RELOAD NGINX AND PHP-FPM +#================================================= +ynh_script_progression --message="Reloading NGINX web server and PHP-FPM..." --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT #================================================= -systemctl start rocketchat -waitforservice +ynh_script_progression --message="Restoration completed for $app" --last diff --git a/scripts/upgrade b/scripts/upgrade index 5b31d0e..a34008c 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -1,5 +1,4 @@ #!/bin/bash -set -eu #================================================= # GENERIC START @@ -7,40 +6,165 @@ set -eu # IMPORT GENERIC HELPERS #================================================= -source ./_common.sh +source _common.sh source /usr/share/yunohost/helpers -ynh_abort_if_errors +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME -final_path=$(ynh_app_setting_get $app final_path) -serviceuser=$(ynh_app_setting_get $app serviceuser) -path=$(ynh_app_setting_get $app path) -port=$(ynh_app_setting_get $app port) + +domain=$(ynh_app_setting_get --app=$app --key=domain) +path_url=$(ynh_app_setting_get --app=$app --key=path) +admin=$(ynh_app_setting_get --app=$app --key=admin) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) #================================================= -# BACKUP THE APPLICATION +# CHECK VERSION #================================================= +upgrade_type=$(ynh_check_app_version_changed) + +#================================================= +# ENSURE DOWNWARD COMPATIBILITY +#================================================= +ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 + +# If final_path doesn't exist, create it +if [ -z "$final_path" ]; then + final_path=/var/www/$app + ynh_app_setting_set --app=$app --key=final_path --value=$final_path +fi + +### If nobody installed your app before 4.1, +### then you may safely remove these lines + +# Cleaning legacy permissions +if ynh_legacy_permissions_exists; then + ynh_legacy_permissions_delete_all + + ynh_app_setting_delete --app=$app --key=is_public +fi + +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --weight=1 + # Backup the current version of the app -ynh_backup_before_upgrade > >(tee "upgrade.log") +ynh_backup_before_upgrade +ynh_clean_setup () { + # Restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors -systemctl stop rocketchat +#================================================= +# STANDARD UPGRADE STEPS +#================================================= +# STOP SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Stopping a systemd service..." --weight=1 -ynh_secure_remove $final_path -mkdir -p $final_path +ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log" -# update to latest required node setup -installnode +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Making sure dedicated system user exists..." --weight=4 -ynh_setup_source "$final_path" +# Create a dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir="$final_path" -chown -R $serviceuser: $final_path +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= -cd $final_path/programs/server/ -npm install --production +if [ "$upgrade_type" == "UPGRADE_APP" ] +then + ynh_script_progression --message="Upgrading source files..." --weight=1 + # Remove the app directory securely + ynh_secure_remove --file="$final_path" + # Download, check integrity, uncompress and patch the source from app.src + ynh_setup_source --dest_dir="$final_path" +fi -chown -R $serviceuser: $final_path +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:$app "$final_path" -systemctl start rocketchat -waitforservice +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=2 + +# Create a dedicated NGINX config +ynh_add_nginx_config + +#================================================= +# UPGRADE DEPENDENCIES +#================================================= +ynh_script_progression --message="Upgrading dependencies..." --weight=7 + +ynh_install_app_dependencies $pkg_dependencies +ynh_exec_warn_less ynh_install_nodejs --nodejs_version=$nodejs_version +ynh_install_mongo + +#============================================== +# INSTALL ROCKETCHAT +#============================================== +ynh_script_progression --message="Building $app... (this will take some time and resources!)" --weight=20 + +pushd $final_path/programs/server + ynh_use_nodejs + ynh_exec_as $app env $ynh_node_load_PATH npm install 2>/dev/null +popd + +#================================================= +# SETUP SYSTEMD +#================================================= +ynh_script_progression --message="Upgrading systemd configuration..." --weight=2 + +ynh_replace_string --match_string="__ENV_PATH__" --replace_string="$PATH" --target_file="../conf/systemd.service" + +# Create a dedicated systemd config +ynh_add_systemd_config + +#================================================= +# MODIFY A CONFIG FILE +#================================================= +ynh_script_progression --message="Configuring a mongod..." --weight=1 + +echo -e "replication:\n replSetName: \"rs01\"" | tee -a /etc/mongod.conf + +#================================================= +# INTEGRATE SERVICE IN YUNOHOST +#================================================= +ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 + +yunohost service add $app --description="Team collaboration communication platform" --log="/var/log/$app/$app.log" + +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a systemd service..." --weight=10 + +ynh_systemd_action --service_name=mongod --action=restart --log_path=systemd +ynh_systemd_action --service_name=$app --action=start --log_path="/var/log/$app/$app.log" + +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Upgrade of $app completed" --last