From 2283a823c283520c67388711f59da4091b54c747 Mon Sep 17 00:00:00 2001 From: Selamanse Date: Fri, 18 May 2018 17:43:04 +0200 Subject: [PATCH 001/145] Add doctl test files --- .travis.yml | 38 ++++++++++++++++++++++++++++++++++---- test/pkgchk-config | 8 ++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 test/pkgchk-config diff --git a/.travis.yml b/.travis.yml index d9f1363..6a01f27 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,37 @@ -language: node_js +dist: trusty +sudo: false -before_install: - - git clone https://github.com/YunoHost/package_linter /tmp/package_linter +language: python + +env: + global: + - secure: "hqvINLgdxfGqZju03GgBWzZ1pdJkoIzx78FULktXkYGUXYRDSMh/tONjtKDMKJvK9rFflkZNIrTZ5j2ueipd73iXl2pM0+jXl3Z64rBa+XK6Kq78p/qP4XdpFoMmOVvs6YIumXHmtxCfcT6EtvHrDkkoNF7oKpuISObKEMDONOLyuEcO6ZjexzmkUpioxjDTkvaE5+jcXflqPLp5JR9A7E75Tofct/y7i2lWOfR45FCY7DIpuE82Hkic41ZhHWuMguedw7L+cIow449ynZQpGSGjpsOciu9OtneJB7LZakVZsOYb3e34+i0TdjqiLYwQa46vqLW4TEK5MLXQI5FF2TF3pvJXiIrFr/gAhoP5YMrbSGHkOYZtAcYVUoMX38lQctUU9NzaELkayo9RqFodXboBs2hniqFbxHuhYYC9tPsZNyTTf/+OcZXS9Ic1iE4HR2Ok4xOg6QF8iOTXW6nPt2Ct0f5oWAdGlyjmxYFVGs3l44g9HV84RkeHYP/BS43C3blAd0SIjtab/4TSgFcmSfv+M/5yl3ZsidBc9yTMvgOvZXPIhOFJq+XLTL4QB0tN1Sdy1wofs7wnRFjbGrw4kOTBrcCkBioqMiMZzTtmeVejjMr61cSmLG7lzPoYCvc5vpS3xAca5XiOECb50oCwkxxoXDoqdEGLz3RQQfnJWRk=" + - DROPLET_NAME="ynh26-pkgchk-${TRAVIS_BUILD_ID}" + - dropletsshcmd="./doctl compute ssh ${DROPLET_NAME} --ssh-command" + - DOCTL=./doctl + +install: + - ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N "" # to disable Warning: Identity file...not accessible + - echo "Host *" | tee -a ~/.ssh/config # to disable authenticity of host input y/n + - echo " StrictHostKeyChecking=no" | tee -a ~/.ssh/config # to disable authenticity of host input y/n + - echo " UserKnownHostsFile=/dev/null" | tee -a ~/.ssh/config # to disable authenticity of host input y/n + - curl -L https://github.com/digitalocean/doctl/releases/download/v1.8.0/doctl-1.8.0-linux-amd64.tar.gz | tar xz + - echo "creating droplet with name ${DROPLET_NAME}" + - DROPLET_NAME=${DROPLET_NAME} ${DOCTL} compute ssh-key create ${DROPLET_NAME} --no-header --public-key "$(cat ~/.ssh/id_rsa.pub)" + - sleep 2 + - DROPLET_NAME=${DROPLET_NAME} ${DOCTL} compute droplet create ${DROPLET_NAME} --region fra1 --image debian-8-x64 --size 8gb --ssh-keys $(${DOCTL} compute ssh-key list --no-header | grep ${DROPLET_NAME} | awk -F ' ' '{print $1}') + +after_script: + - ${DOCTL} compute droplet delete ${DROPLET_NAME} -f + - ${DOCTL} compute ssh-key delete $(${DOCTL} compute ssh-key list | grep ${DROPLET_NAME} | awk -F ' ' '{print $1}') -f script: - - /tmp/package_linter/package_linter.py ./ + - sleep 60 #$doctl vm needs a few seconds to boot...60 proved to be safe. + - $dropletsshcmd "apt-get update -y" + - $dropletsshcmd "apt-get install git -y" + - $dropletsshcmd "git clone https://github.com/YunoHost/package_check" + - cat test/pkgchk-config | $dropletsshcmd "cat > package_check/config" + - $dropletsshcmd "git clone https://github.com/${TRAVIS_REPO_SLUG} package" + - $dropletsshcmd "cd package && git checkout ${TRAVIS_COMMIT} && cd .." + - $dropletsshcmd "./package_check/package_check.sh --build-lxc --bash-mode package" + - $dropletsshcmd "cat ./package_check/Complete.log" diff --git a/test/pkgchk-config b/test/pkgchk-config new file mode 100644 index 0000000..9de744d --- /dev/null +++ b/test/pkgchk-config @@ -0,0 +1,8 @@ +iface=eth0 +dns=8.8.8.8 +dnsforce=1 +PLAGE_IP=10.1.4 +DOMAIN=domain.local +YUNO_PWD=admin +LXC_NAME=pchecker_lxc +LXC_BRIDGE=lxc-pchecker From 2f28aaf8a437f1ec8ffb85f9e9f9398f595d8bc6 Mon Sep 17 00:00:00 2001 From: Selamanse Date: Wed, 3 Oct 2018 21:07:27 +0200 Subject: [PATCH 002/145] Fix nodejs installation --- scripts/_common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 007dc54..72b6803 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -33,7 +33,7 @@ waitforservice() { installnode(){ - sudo apt-get install -y npm + curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - # Meteor needs at least this version of node to work. sudo npm install -g n sudo n $NODE_VERSION From f543bfacba2bd82ffccac903a0a24523efa212a5 Mon Sep 17 00:00:00 2001 From: Selamanse Date: Fri, 19 Oct 2018 23:54:47 +0200 Subject: [PATCH 003/145] Improve droplet create --- .travis.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6a01f27..8eec40f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,18 +15,17 @@ install: - echo "Host *" | tee -a ~/.ssh/config # to disable authenticity of host input y/n - echo " StrictHostKeyChecking=no" | tee -a ~/.ssh/config # to disable authenticity of host input y/n - echo " UserKnownHostsFile=/dev/null" | tee -a ~/.ssh/config # to disable authenticity of host input y/n - - curl -L https://github.com/digitalocean/doctl/releases/download/v1.8.0/doctl-1.8.0-linux-amd64.tar.gz | tar xz + - curl -L https://github.com/digitalocean/doctl/releases/download/v1.11.0/doctl-1.11.0-linux-amd64.tar.gz | tar xz - echo "creating droplet with name ${DROPLET_NAME}" - DROPLET_NAME=${DROPLET_NAME} ${DOCTL} compute ssh-key create ${DROPLET_NAME} --no-header --public-key "$(cat ~/.ssh/id_rsa.pub)" - sleep 2 - - DROPLET_NAME=${DROPLET_NAME} ${DOCTL} compute droplet create ${DROPLET_NAME} --region fra1 --image debian-8-x64 --size 8gb --ssh-keys $(${DOCTL} compute ssh-key list --no-header | grep ${DROPLET_NAME} | awk -F ' ' '{print $1}') + - DROPLET_NAME=${DROPLET_NAME} ${DOCTL} compute droplet create ${DROPLET_NAME} --wait --region fra1 --image debian-8-x64 --size 8gb --ssh-keys $(${DOCTL} compute ssh-key list --no-header | grep ${DROPLET_NAME} | awk -F ' ' '{print $1}') after_script: - ${DOCTL} compute droplet delete ${DROPLET_NAME} -f - ${DOCTL} compute ssh-key delete $(${DOCTL} compute ssh-key list | grep ${DROPLET_NAME} | awk -F ' ' '{print $1}') -f script: - - sleep 60 #$doctl vm needs a few seconds to boot...60 proved to be safe. - $dropletsshcmd "apt-get update -y" - $dropletsshcmd "apt-get install git -y" - $dropletsshcmd "git clone https://github.com/YunoHost/package_check" From 2b85c068287a8869aaab38545abab2b5ca66f3eb Mon Sep 17 00:00:00 2001 From: Selamanse Date: Fri, 19 Oct 2018 23:58:25 +0200 Subject: [PATCH 004/145] Improve droplet create --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 8eec40f..40fcdb4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,6 +26,7 @@ after_script: - ${DOCTL} compute ssh-key delete $(${DOCTL} compute ssh-key list | grep ${DROPLET_NAME} | awk -F ' ' '{print $1}') -f script: + - sleep 2 - $dropletsshcmd "apt-get update -y" - $dropletsshcmd "apt-get install git -y" - $dropletsshcmd "git clone https://github.com/YunoHost/package_check" From 866c124723086cc140562e40ea3438c8227fcbc7 Mon Sep 17 00:00:00 2001 From: Selamanse Date: Sat, 20 Oct 2018 00:03:43 +0200 Subject: [PATCH 005/145] Improve droplet create --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 40fcdb4..74dd570 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,7 +26,7 @@ after_script: - ${DOCTL} compute ssh-key delete $(${DOCTL} compute ssh-key list | grep ${DROPLET_NAME} | awk -F ' ' '{print $1}') -f script: - - sleep 2 + - sleep 15 - $dropletsshcmd "apt-get update -y" - $dropletsshcmd "apt-get install git -y" - $dropletsshcmd "git clone https://github.com/YunoHost/package_check" From 64cda30752574f35f748b1b95c5bb8c99877fc7b Mon Sep 17 00:00:00 2001 From: Selamanse Date: Sat, 20 Oct 2018 00:11:22 +0200 Subject: [PATCH 006/145] Modify pkgchk config --- test/pkgchk-config | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/pkgchk-config b/test/pkgchk-config index 9de744d..e86313b 100644 --- a/test/pkgchk-config +++ b/test/pkgchk-config @@ -1,7 +1,3 @@ -iface=eth0 -dns=8.8.8.8 -dnsforce=1 -PLAGE_IP=10.1.4 DOMAIN=domain.local YUNO_PWD=admin LXC_NAME=pchecker_lxc From 8a52fb81a8402f5198f222164f14c9c2d563dda8 Mon Sep 17 00:00:00 2001 From: Selamanse Date: Sat, 20 Oct 2018 00:19:07 +0200 Subject: [PATCH 007/145] Modify pkgchk config --- test/pkgchk-config | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 test/pkgchk-config diff --git a/test/pkgchk-config b/test/pkgchk-config deleted file mode 100644 index e86313b..0000000 --- a/test/pkgchk-config +++ /dev/null @@ -1,4 +0,0 @@ -DOMAIN=domain.local -YUNO_PWD=admin -LXC_NAME=pchecker_lxc -LXC_BRIDGE=lxc-pchecker From 29d29fe2f093e32be04a216b6a8fd1e6ca45d18a Mon Sep 17 00:00:00 2001 From: Selamanse Date: Tue, 23 Oct 2018 14:14:06 +0200 Subject: [PATCH 008/145] Add testconfig again --- test/pkgchk-config | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 test/pkgchk-config diff --git a/test/pkgchk-config b/test/pkgchk-config new file mode 100644 index 0000000..9de744d --- /dev/null +++ b/test/pkgchk-config @@ -0,0 +1,8 @@ +iface=eth0 +dns=8.8.8.8 +dnsforce=1 +PLAGE_IP=10.1.4 +DOMAIN=domain.local +YUNO_PWD=admin +LXC_NAME=pchecker_lxc +LXC_BRIDGE=lxc-pchecker From 156a0263be02873ffd15c38e7d222036db553bc3 Mon Sep 17 00:00:00 2001 From: Selamanse Date: Sat, 2 Feb 2019 22:44:03 +0100 Subject: [PATCH 009/145] Use new helpers and restrict arch --- conf/app.src | 7 +++++++ scripts/install | 23 ++++++++++++++--------- 2 files changed, 21 insertions(+), 9 deletions(-) create mode 100644 conf/app.src diff --git a/conf/app.src b/conf/app.src new file mode 100644 index 0000000..73df31e --- /dev/null +++ b/conf/app.src @@ -0,0 +1,7 @@ +SOURCE_URL=${ROCKETCHAT_DOWNLOAD_URI} +SOURCE_SUM=${ROCKETCHAT_SHASUM} +SOURCE_SUM_PRG=sha256sum +SOURCE_FORMAT=tar.gz +SOURCE_IN_SUBDIR=true +SOURCE_FILENAME=rocket.chat-${ROCKETCHAT_VERSION}.tgz +SOURCE_EXTRACT=true \ No newline at end of file diff --git a/scripts/install b/scripts/install index 11073e0..9296b23 100644 --- a/scripts/install +++ b/scripts/install @@ -30,6 +30,16 @@ app=$YNH_APP_INSTANCE_NAME dbname=$app serviceuser=rocketchat +#================================================= +# CHECK IF THE APP CAN BE INSTALLED +#================================================= + +# 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 + workdir=$(pwd) # find suitable port (default 3000) @@ -102,16 +112,11 @@ sed -i "s@#DBNAME#@$dbname@g" ../conf/rocketchat_ldap.js sudo cp ../conf/nginx.conf "$nginx_conf" -# download and extract rocketchat -echo "Downloading rocket.chat-$ROCKETCHAT_VERSION.gtar from ${ROCKETCHAT_DOWNLOAD_URI}." -sudo curl -s -L -o $final_path/rocket.chat-$ROCKETCHAT_VERSION.gtar "${ROCKETCHAT_DOWNLOAD_URI}" -SHA_DOWNLOAD=$(sha256sum $final_path/rocket.chat-$ROCKETCHAT_VERSION.gtar | grep -o "^[a-f0-9]*") -if [[ ! "$SHA_DOWNLOAD" == "$ROCKETCHAT_SHASUM" ]]; then - ynh_die "The sha256sum does not match the configured one" -fi +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= -sudo tar -xzf $final_path/rocket.chat-$ROCKETCHAT_VERSION.gtar -C $final_path --strip-components=1 bundle -sudo rm $final_path/rocket.chat-$ROCKETCHAT_VERSION.gtar +ynh_setup_source "$final_path" sudo chown -R $serviceuser: $final_path From 0a9d83e261558906ae9c5005caf4ae1469c37896 Mon Sep 17 00:00:00 2001 From: Selamanse Date: Sat, 2 Feb 2019 22:44:16 +0100 Subject: [PATCH 010/145] Upgrade test setup --- .travis.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 74dd570..03a1686 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ language: python env: global: - secure: "hqvINLgdxfGqZju03GgBWzZ1pdJkoIzx78FULktXkYGUXYRDSMh/tONjtKDMKJvK9rFflkZNIrTZ5j2ueipd73iXl2pM0+jXl3Z64rBa+XK6Kq78p/qP4XdpFoMmOVvs6YIumXHmtxCfcT6EtvHrDkkoNF7oKpuISObKEMDONOLyuEcO6ZjexzmkUpioxjDTkvaE5+jcXflqPLp5JR9A7E75Tofct/y7i2lWOfR45FCY7DIpuE82Hkic41ZhHWuMguedw7L+cIow449ynZQpGSGjpsOciu9OtneJB7LZakVZsOYb3e34+i0TdjqiLYwQa46vqLW4TEK5MLXQI5FF2TF3pvJXiIrFr/gAhoP5YMrbSGHkOYZtAcYVUoMX38lQctUU9NzaELkayo9RqFodXboBs2hniqFbxHuhYYC9tPsZNyTTf/+OcZXS9Ic1iE4HR2Ok4xOg6QF8iOTXW6nPt2Ct0f5oWAdGlyjmxYFVGs3l44g9HV84RkeHYP/BS43C3blAd0SIjtab/4TSgFcmSfv+M/5yl3ZsidBc9yTMvgOvZXPIhOFJq+XLTL4QB0tN1Sdy1wofs7wnRFjbGrw4kOTBrcCkBioqMiMZzTtmeVejjMr61cSmLG7lzPoYCvc5vpS3xAca5XiOECb50oCwkxxoXDoqdEGLz3RQQfnJWRk=" + - DOCTL_CLI_URI="https://github.com/digitalocean/doctl/releases/download/v1.13.0/doctl-1.13.0-linux-amd64.tar.gz" - DROPLET_NAME="ynh26-pkgchk-${TRAVIS_BUILD_ID}" - dropletsshcmd="./doctl compute ssh ${DROPLET_NAME} --ssh-command" - DOCTL=./doctl @@ -15,15 +16,11 @@ install: - echo "Host *" | tee -a ~/.ssh/config # to disable authenticity of host input y/n - echo " StrictHostKeyChecking=no" | tee -a ~/.ssh/config # to disable authenticity of host input y/n - echo " UserKnownHostsFile=/dev/null" | tee -a ~/.ssh/config # to disable authenticity of host input y/n - - curl -L https://github.com/digitalocean/doctl/releases/download/v1.11.0/doctl-1.11.0-linux-amd64.tar.gz | tar xz + - curl -L ${DOCTL_CLI_URI} | tar xz - echo "creating droplet with name ${DROPLET_NAME}" - DROPLET_NAME=${DROPLET_NAME} ${DOCTL} compute ssh-key create ${DROPLET_NAME} --no-header --public-key "$(cat ~/.ssh/id_rsa.pub)" - sleep 2 - - DROPLET_NAME=${DROPLET_NAME} ${DOCTL} compute droplet create ${DROPLET_NAME} --wait --region fra1 --image debian-8-x64 --size 8gb --ssh-keys $(${DOCTL} compute ssh-key list --no-header | grep ${DROPLET_NAME} | awk -F ' ' '{print $1}') - -after_script: - - ${DOCTL} compute droplet delete ${DROPLET_NAME} -f - - ${DOCTL} compute ssh-key delete $(${DOCTL} compute ssh-key list | grep ${DROPLET_NAME} | awk -F ' ' '{print $1}') -f + - DROPLET_NAME=${DROPLET_NAME} ${DOCTL} compute droplet create ${DROPLET_NAME} --wait --region fra1 --image debian-9-x64 --size 4gb --ssh-keys $(${DOCTL} compute ssh-key list --no-header | grep ${DROPLET_NAME} | awk -F ' ' '{print $1}') script: - sleep 15 @@ -35,3 +32,7 @@ script: - $dropletsshcmd "cd package && git checkout ${TRAVIS_COMMIT} && cd .." - $dropletsshcmd "./package_check/package_check.sh --build-lxc --bash-mode package" - $dropletsshcmd "cat ./package_check/Complete.log" + +after_script: + - ${DOCTL} compute droplet delete ${DROPLET_NAME} -f + - ${DOCTL} compute ssh-key delete $(${DOCTL} compute ssh-key list | grep ${DROPLET_NAME} | awk -F ' ' '{print $1}') -f From 16a83bfb632def1677fd1c46a2ea48926cddf393 Mon Sep 17 00:00:00 2001 From: Selamanse Date: Sat, 2 Feb 2019 23:17:37 +0100 Subject: [PATCH 011/145] Add selamanses key --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 03a1686..e8c8d9f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ install: - echo "creating droplet with name ${DROPLET_NAME}" - DROPLET_NAME=${DROPLET_NAME} ${DOCTL} compute ssh-key create ${DROPLET_NAME} --no-header --public-key "$(cat ~/.ssh/id_rsa.pub)" - sleep 2 - - DROPLET_NAME=${DROPLET_NAME} ${DOCTL} compute droplet create ${DROPLET_NAME} --wait --region fra1 --image debian-9-x64 --size 4gb --ssh-keys $(${DOCTL} compute ssh-key list --no-header | grep ${DROPLET_NAME} | awk -F ' ' '{print $1}') + - DROPLET_NAME=${DROPLET_NAME} ${DOCTL} compute droplet create ${DROPLET_NAME} --wait --region fra1 --image debian-9-x64 --size 4gb --ssh-keys $(${DOCTL} compute ssh-key list --no-header | grep ${DROPLET_NAME} | awk -F ' ' '{print $1}') $(${DOCTL} compute ssh-key list --no-header | grep selamanse | awk -F ' ' '{print $1}') script: - sleep 15 From d1b4ef41cdffd7f971a597c7d33ddadc3fa04f65 Mon Sep 17 00:00:00 2001 From: Selamanse Date: Sat, 2 Feb 2019 23:40:33 +0100 Subject: [PATCH 012/145] Add fingerprint as key id --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index e8c8d9f..5c4cd77 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ install: - echo "creating droplet with name ${DROPLET_NAME}" - DROPLET_NAME=${DROPLET_NAME} ${DOCTL} compute ssh-key create ${DROPLET_NAME} --no-header --public-key "$(cat ~/.ssh/id_rsa.pub)" - sleep 2 - - DROPLET_NAME=${DROPLET_NAME} ${DOCTL} compute droplet create ${DROPLET_NAME} --wait --region fra1 --image debian-9-x64 --size 4gb --ssh-keys $(${DOCTL} compute ssh-key list --no-header | grep ${DROPLET_NAME} | awk -F ' ' '{print $1}') $(${DOCTL} compute ssh-key list --no-header | grep selamanse | awk -F ' ' '{print $1}') + - DROPLET_NAME=${DROPLET_NAME} ${DOCTL} compute droplet create ${DROPLET_NAME} --wait --region fra1 --image debian-9-x64 --size 4gb --ssh-keys $(${DOCTL} compute ssh-key list --no-header | grep ${DROPLET_NAME} | awk -F ' ' '{print $3}'),$(${DOCTL} compute ssh-key list --no-header | grep selamanse | awk -F ' ' '{print $3}') script: - sleep 15 From 849431e65efd1a4b7bc712ed6f9804940133d5cf Mon Sep 17 00:00:00 2001 From: Selamanse Date: Sun, 3 Feb 2019 00:11:34 +0100 Subject: [PATCH 013/145] Use prebuilt image --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5c4cd77..febe217 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ install: - echo "creating droplet with name ${DROPLET_NAME}" - DROPLET_NAME=${DROPLET_NAME} ${DOCTL} compute ssh-key create ${DROPLET_NAME} --no-header --public-key "$(cat ~/.ssh/id_rsa.pub)" - sleep 2 - - DROPLET_NAME=${DROPLET_NAME} ${DOCTL} compute droplet create ${DROPLET_NAME} --wait --region fra1 --image debian-9-x64 --size 4gb --ssh-keys $(${DOCTL} compute ssh-key list --no-header | grep ${DROPLET_NAME} | awk -F ' ' '{print $3}'),$(${DOCTL} compute ssh-key list --no-header | grep selamanse | awk -F ' ' '{print $3}') + - DROPLET_NAME=${DROPLET_NAME} ${DOCTL} compute droplet create ${DROPLET_NAME} --wait --region fra1 --image 43180295 --size 4gb --ssh-keys $(${DOCTL} compute ssh-key list --no-header | grep ${DROPLET_NAME} | awk -F ' ' '{print $3}'),$(${DOCTL} compute ssh-key list --no-header | grep selamanse | awk -F ' ' '{print $3}') script: - sleep 15 From e8987757f4e4e4df20e9a46011ca0111be23ccea Mon Sep 17 00:00:00 2001 From: Selamanse Date: Sun, 3 Feb 2019 00:12:28 +0100 Subject: [PATCH 014/145] Remove variables in app.src --- conf/app.src | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index 73df31e..5e807eb 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,7 +1,7 @@ -SOURCE_URL=${ROCKETCHAT_DOWNLOAD_URI} -SOURCE_SUM=${ROCKETCHAT_SHASUM} +SOURCE_URL=https://releases.rocket.chat/0.73.2/download +SOURCE_SUM=3dc3eb11f383f7b72b0f23fedb305b6a566fa536a1e5087a4398255deeb864d8 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true -SOURCE_FILENAME=rocket.chat-${ROCKETCHAT_VERSION}.tgz +SOURCE_FILENAME=rocket.chat-0.73.2.tgz SOURCE_EXTRACT=true \ No newline at end of file From ad1a6fa1984fae0107fe10ee809d6d0d144d70fc Mon Sep 17 00:00:00 2001 From: Selamanse Date: Sun, 3 Feb 2019 00:20:36 +0100 Subject: [PATCH 015/145] Add cleanup cmds --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index febe217..0dbf80a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,6 +26,8 @@ script: - sleep 15 - $dropletsshcmd "apt-get update -y" - $dropletsshcmd "apt-get install git -y" + - $dropletsshcmd "rm -rf package_check" + - $dropletsshcmd "rm -rf package" - $dropletsshcmd "git clone https://github.com/YunoHost/package_check" - cat test/pkgchk-config | $dropletsshcmd "cat > package_check/config" - $dropletsshcmd "git clone https://github.com/${TRAVIS_REPO_SLUG} package" From d4e2a2c7734a4561baaeb3391edcaaff92e66cc2 Mon Sep 17 00:00:00 2001 From: Selamanse Date: Sun, 3 Feb 2019 00:35:37 +0100 Subject: [PATCH 016/145] Fix upgrade --- scripts/upgrade | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 38e5ed1..a46fe1b 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -18,13 +18,12 @@ serviceuser=$(ynh_app_setting_get $app serviceuser) path=$(ynh_app_setting_get $app path) port=$(ynh_app_setting_get $app port) -# download and extract rocketchat -echo "Downloading rocket.chat-$ROCKETCHAT_VERSION.gtar from ${ROCKETCHAT_DOWNLOAD_URI}." -sudo curl -s -L -o $final_path/rocket.chat-$ROCKETCHAT_VERSION.gtar "${ROCKETCHAT_DOWNLOAD_URI}" -SHA_DOWNLOAD=$(sha256sum $final_path/rocket.chat-$ROCKETCHAT_VERSION.gtar | grep -o "^[a-f0-9]*") -if [[ ! "$SHA_DOWNLOAD" == "$ROCKETCHAT_SHASUM" ]]; then - ynh_die "The sha256sum does not match the configured one" -fi +#================================================= +# BACKUP THE APPLICATION +#================================================= + +# Backup the current version of the app +ynh_backup_before_upgrade > >(tee "upgrade.log") sudo systemctl stop rocketchat @@ -34,8 +33,7 @@ sudo mkdir -p $final_path # update to latest required node setup installnode -sudo tar -xzf $final_path/rocket.chat-$ROCKETCHAT_VERSION.gtar -C $final_path --strip-components=1 bundle -sudo rm $final_path/rocket.chat-$ROCKETCHAT_VERSION.gtar +ynh_setup_source "$final_path" sudo chown -R $serviceuser: $final_path From df3e75d5f405d057ace74cdf77fd827dbaf0872a Mon Sep 17 00:00:00 2001 From: Selamanse Date: Sun, 3 Feb 2019 00:40:13 +0100 Subject: [PATCH 017/145] Remove apt-key warning --- scripts/_common.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index eddb1d4..dda5052 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -62,7 +62,8 @@ installdeps(){ 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 + sudo apt-get install dirmngr + APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1 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 From 8b95bcb73456d6680c88cb0071bd7f26665b242b Mon Sep 17 00:00:00 2001 From: Selamanse Date: Sun, 3 Feb 2019 00:54:09 +0100 Subject: [PATCH 018/145] Revert travis --- .travis.yml | 41 ++++------------------------------------- test/pkgchk-config | 8 -------- 2 files changed, 4 insertions(+), 45 deletions(-) delete mode 100644 test/pkgchk-config diff --git a/.travis.yml b/.travis.yml index 0dbf80a..d9f1363 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,40 +1,7 @@ -dist: trusty -sudo: false +language: node_js -language: python - -env: - global: - - secure: "hqvINLgdxfGqZju03GgBWzZ1pdJkoIzx78FULktXkYGUXYRDSMh/tONjtKDMKJvK9rFflkZNIrTZ5j2ueipd73iXl2pM0+jXl3Z64rBa+XK6Kq78p/qP4XdpFoMmOVvs6YIumXHmtxCfcT6EtvHrDkkoNF7oKpuISObKEMDONOLyuEcO6ZjexzmkUpioxjDTkvaE5+jcXflqPLp5JR9A7E75Tofct/y7i2lWOfR45FCY7DIpuE82Hkic41ZhHWuMguedw7L+cIow449ynZQpGSGjpsOciu9OtneJB7LZakVZsOYb3e34+i0TdjqiLYwQa46vqLW4TEK5MLXQI5FF2TF3pvJXiIrFr/gAhoP5YMrbSGHkOYZtAcYVUoMX38lQctUU9NzaELkayo9RqFodXboBs2hniqFbxHuhYYC9tPsZNyTTf/+OcZXS9Ic1iE4HR2Ok4xOg6QF8iOTXW6nPt2Ct0f5oWAdGlyjmxYFVGs3l44g9HV84RkeHYP/BS43C3blAd0SIjtab/4TSgFcmSfv+M/5yl3ZsidBc9yTMvgOvZXPIhOFJq+XLTL4QB0tN1Sdy1wofs7wnRFjbGrw4kOTBrcCkBioqMiMZzTtmeVejjMr61cSmLG7lzPoYCvc5vpS3xAca5XiOECb50oCwkxxoXDoqdEGLz3RQQfnJWRk=" - - DOCTL_CLI_URI="https://github.com/digitalocean/doctl/releases/download/v1.13.0/doctl-1.13.0-linux-amd64.tar.gz" - - DROPLET_NAME="ynh26-pkgchk-${TRAVIS_BUILD_ID}" - - dropletsshcmd="./doctl compute ssh ${DROPLET_NAME} --ssh-command" - - DOCTL=./doctl - -install: - - ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N "" # to disable Warning: Identity file...not accessible - - echo "Host *" | tee -a ~/.ssh/config # to disable authenticity of host input y/n - - echo " StrictHostKeyChecking=no" | tee -a ~/.ssh/config # to disable authenticity of host input y/n - - echo " UserKnownHostsFile=/dev/null" | tee -a ~/.ssh/config # to disable authenticity of host input y/n - - curl -L ${DOCTL_CLI_URI} | tar xz - - echo "creating droplet with name ${DROPLET_NAME}" - - DROPLET_NAME=${DROPLET_NAME} ${DOCTL} compute ssh-key create ${DROPLET_NAME} --no-header --public-key "$(cat ~/.ssh/id_rsa.pub)" - - sleep 2 - - DROPLET_NAME=${DROPLET_NAME} ${DOCTL} compute droplet create ${DROPLET_NAME} --wait --region fra1 --image 43180295 --size 4gb --ssh-keys $(${DOCTL} compute ssh-key list --no-header | grep ${DROPLET_NAME} | awk -F ' ' '{print $3}'),$(${DOCTL} compute ssh-key list --no-header | grep selamanse | awk -F ' ' '{print $3}') +before_install: + - git clone https://github.com/YunoHost/package_linter /tmp/package_linter script: - - sleep 15 - - $dropletsshcmd "apt-get update -y" - - $dropletsshcmd "apt-get install git -y" - - $dropletsshcmd "rm -rf package_check" - - $dropletsshcmd "rm -rf package" - - $dropletsshcmd "git clone https://github.com/YunoHost/package_check" - - cat test/pkgchk-config | $dropletsshcmd "cat > package_check/config" - - $dropletsshcmd "git clone https://github.com/${TRAVIS_REPO_SLUG} package" - - $dropletsshcmd "cd package && git checkout ${TRAVIS_COMMIT} && cd .." - - $dropletsshcmd "./package_check/package_check.sh --build-lxc --bash-mode package" - - $dropletsshcmd "cat ./package_check/Complete.log" - -after_script: - - ${DOCTL} compute droplet delete ${DROPLET_NAME} -f - - ${DOCTL} compute ssh-key delete $(${DOCTL} compute ssh-key list | grep ${DROPLET_NAME} | awk -F ' ' '{print $1}') -f + - /tmp/package_linter/package_linter.py ./ diff --git a/test/pkgchk-config b/test/pkgchk-config deleted file mode 100644 index 9de744d..0000000 --- a/test/pkgchk-config +++ /dev/null @@ -1,8 +0,0 @@ -iface=eth0 -dns=8.8.8.8 -dnsforce=1 -PLAGE_IP=10.1.4 -DOMAIN=domain.local -YUNO_PWD=admin -LXC_NAME=pchecker_lxc -LXC_BRIDGE=lxc-pchecker From 28a2bf66a3e116c9a030aa1efb793e917dc7ebbd Mon Sep 17 00:00:00 2001 From: Selamanse Date: Sun, 3 Feb 2019 11:14:23 +0100 Subject: [PATCH 019/145] Revert apt-key setting and restore modifications (#70) --- scripts/_common.sh | 3 +-- scripts/restore | 10 ++++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index dda5052..eddb1d4 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -62,8 +62,7 @@ installdeps(){ sudo yunohost service add mongodb -l /var/log/mongodb/mongodb.log else #Install mongodb for debian x86/x64 - sudo apt-get install dirmngr - APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4 + 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 diff --git a/scripts/restore b/scripts/restore index 683657e..4ac6360 100644 --- a/scripts/restore +++ b/scripts/restore @@ -1,14 +1,16 @@ #!/bin/bash set -eu -#================================================= -# GENERIC START #================================================= # IMPORT GENERIC HELPERS #================================================= - -source ./_common.sh +if [ ! -e _common.sh ]; then + # Fetch helpers file if not in current directory + sudo cp ../settings/scripts/_common.sh ./_common.sh + sudo chmod a+rx _common.sh +fi source /usr/share/yunohost/helpers +source _common.sh #================================================= # GENERIC START From 6bb0d1166c2ea9cafaf29ecaef0832b220f71999 Mon Sep 17 00:00:00 2001 From: Selamanse Date: Sun, 10 Feb 2019 21:21:55 +0100 Subject: [PATCH 020/145] Fix linter issues --- manifest.json | 2 ++ scripts/backup | 2 +- scripts/install | 52 ++++++++++++++++++++++++------------------------- scripts/remove | 18 ++++++++--------- scripts/restore | 20 +++++++++---------- scripts/upgrade | 14 ++++++------- 6 files changed, 55 insertions(+), 53 deletions(-) diff --git a/manifest.json b/manifest.json index 28c25ae..047e4ac 100644 --- a/manifest.json +++ b/manifest.json @@ -41,6 +41,7 @@ }, { "name": "is_public", + "type": "boolean", "ask": { "en": "Is it a public application?" }, @@ -49,6 +50,7 @@ }, { "name": "lang", + "type": "string", "ask": { "en": "Select default language" }, diff --git a/scripts/backup b/scripts/backup index 1980e58..f5a45d0 100644 --- a/scripts/backup +++ b/scripts/backup @@ -36,4 +36,4 @@ ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf" "conf/nginx" # BACKUP THE MONGODB DATABASE #================================================= -sudo mongodump -o "./dump" +mongodump -o "./dump" diff --git a/scripts/install b/scripts/install index 9296b23..29ec72d 100644 --- a/scripts/install +++ b/scripts/install @@ -82,35 +82,35 @@ ynh_app_setting_set $app is_public $is_public installdeps # Create destination -sudo mkdir -p $final_path +mkdir -p $final_path # Create user -id -u $serviceuser || sudo useradd -d "$final_path" -M $serviceuser +id -u $serviceuser || useradd -d "$final_path" -M $serviceuser # Copy and set systemd configuration -sed -i "s@#ROOTURL#@$domain@g" ../conf/rocketchat.service -sed -i "s@#LOCATION#@${path:-/}@g" ../conf/rocketchat.service -sed -i "s@#PORT#@$port@g" ../conf/rocketchat.service -sed -i "s@#USER#@$serviceuser@g" ../conf/rocketchat.service -sed -i "s@#DESTDIR#@$final_path@g" ../conf/rocketchat.service -sed -i "s@#DBNAME#@$dbname@g" ../conf/rocketchat.service +ynh_replace_string "s@#ROOTURL#@$domain@g" ../conf/rocketchat.service +ynh_replace_string "s@#LOCATION#@${path:-/}@g" ../conf/rocketchat.service +ynh_replace_string "s@#PORT#@$port@g" ../conf/rocketchat.service +ynh_replace_string "s@#USER#@$serviceuser@g" ../conf/rocketchat.service +ynh_replace_string "s@#DESTDIR#@$final_path@g" ../conf/rocketchat.service +ynh_replace_string "s@#DBNAME#@$dbname@g" ../conf/rocketchat.service # absolute node path needed NODE_BIN=$(which node) -sed -i "s@#NODE#@$NODE_BIN@g" ../conf/rocketchat.service -sudo cp ../conf/rocketchat.service /etc/systemd/system/$app.service -sudo systemctl daemon-reload +ynh_replace_string "s@#NODE#@$NODE_BIN@g" ../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" -sed -i "s@#APP#@$app@g" ../conf/nginx.conf -sed -i "s@#PATH#@$path@g" ../conf/nginx.conf -sed -i "s@#PORT#@$port@g" ../conf/nginx.conf -sed -i "s@#LOCATION#@${path:-/}@g" ../conf/nginx.conf +ynh_replace_string "s@#APP#@$app@g" ../conf/nginx.conf +ynh_replace_string "s@#PATH#@$path@g" ../conf/nginx.conf +ynh_replace_string "s@#PORT#@$port@g" ../conf/nginx.conf +ynh_replace_string "s@#LOCATION#@${path:-/}@g" ../conf/nginx.conf #set db name into ldap config -sed -i "s@#DBNAME#@$dbname@g" ../conf/rocketchat_ldap.js +ynh_replace_string "s@#DBNAME#@$dbname@g" ../conf/rocketchat_ldap.js -sudo cp ../conf/nginx.conf "$nginx_conf" +cp ../conf/nginx.conf "$nginx_conf" #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE @@ -118,33 +118,33 @@ sudo cp ../conf/nginx.conf "$nginx_conf" ynh_setup_source "$final_path" -sudo chown -R $serviceuser: $final_path +chown -R $serviceuser: $final_path cd $final_path/programs/server/ -sudo -u $serviceuser npm install --production +-u $serviceuser npm install --production cd $workdir -sudo systemctl reload nginx +systemctl reload nginx if [ "$is_public" = "Yes" ]; then ynh_app_setting_set "$app" skipped_uris "/" fi -sudo systemctl start $app.service -sudo systemctl enable $app.service +systemctl start $app.service +systemctl enable $app.service # add rocketchat to services -sudo yunohost service add $app +yunohost service add $app # wait for rocketchat to populate db and start waitforservice -sudo mongo < ../conf/rocketchat_ldap.js +mongo < ../conf/rocketchat_ldap.js -sudo systemctl restart $app.service +systemctl restart $app.service waitforservice -sudo yunohost app ssowatconf +yunohost app ssowatconf diff --git a/scripts/remove b/scripts/remove index 88e1f51..9e77aa1 100644 --- a/scripts/remove +++ b/scripts/remove @@ -14,18 +14,18 @@ app=$YNH_APP_INSTANCE_NAME domain=$(ynh_app_setting_get $app domain) final_path=$(ynh_app_setting_get $app final_path) -sudo systemctl stop $app.service +systemctl stop $app.service # remove Rocketchat from services -sudo yunohost service remove $app +yunohost service remove $app -sudo rm -rf $final_path -sudo rm -f /etc/nginx/conf.d/$domain.d/$app.conf -sudo rm -rf /var/log/$app -sudo rm -f /etc/systemd/system/$app.service +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 database!!! -sudo mongo rocketchat --eval "db.dropDatabase()" +mongo rocketchat --eval "db.dropDatabase()" -sudo systemctl daemon-reload -sudo systemctl reload nginx +systemctl daemon-reload +systemctl reload nginx diff --git a/scripts/restore b/scripts/restore index 4ac6360..adf14de 100644 --- a/scripts/restore +++ b/scripts/restore @@ -6,8 +6,8 @@ set -eu #================================================= if [ ! -e _common.sh ]; then # Fetch helpers file if not in current directory - sudo cp ../settings/scripts/_common.sh ./_common.sh - sudo chmod a+rx _common.sh + cp ../settings/scripts/_common.sh ./_common.sh + chmod a+rx _common.sh fi source /usr/share/yunohost/helpers source _common.sh @@ -45,10 +45,10 @@ fi You should safely delete it before restoring this app." # Create destination -sudo mkdir -p $final_path +mkdir -p $final_path # Create user -id -u $serviceuser || sudo useradd -d "$final_path" -M $serviceuser +id -u $serviceuser || useradd -d "$final_path" -M $serviceuser #================================================= # STANDARD RESTORATION STEPS @@ -60,19 +60,19 @@ ynh_restore # RELOAD THE NGINX CONFIGURATION #================================================= -sudo systemctl reload nginx +systemctl reload nginx #================================================= # RELOAD AND ENABLE THE SYSTEMD CONFIGURATION #================================================= -sudo systemctl daemon-reload -sudo systemctl enable rocketchat +systemctl daemon-reload +systemctl enable rocketchat #================================================= # RESTORE PERMISSIONS IN THE APP MAIN DIR #================================================= -sudo chown -R $serviceuser: $final_path +chown -R $serviceuser: $final_path #================================================= # INSTALL DEPENDENCIES @@ -84,11 +84,11 @@ installdeps # RESTORE THE MONGODB #================================================= -sudo mongorestore ./dump +mongorestore ./dump #================================================= # START APP RELATED SERVICES #================================================= -sudo systemctl start rocketchat +systemctl start rocketchat waitforservice diff --git a/scripts/upgrade b/scripts/upgrade index a46fe1b..5b31d0e 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -25,22 +25,22 @@ port=$(ynh_app_setting_get $app port) # Backup the current version of the app ynh_backup_before_upgrade > >(tee "upgrade.log") -sudo systemctl stop rocketchat +systemctl stop rocketchat -sudo rm -rf $final_path -sudo mkdir -p $final_path +ynh_secure_remove $final_path +mkdir -p $final_path # update to latest required node setup installnode ynh_setup_source "$final_path" -sudo chown -R $serviceuser: $final_path +chown -R $serviceuser: $final_path cd $final_path/programs/server/ -sudo npm install --production +npm install --production -sudo chown -R $serviceuser: $final_path +chown -R $serviceuser: $final_path -sudo systemctl start rocketchat +systemctl start rocketchat waitforservice From c682b679167f188190de0a3e600a4afd080af4ec Mon Sep 17 00:00:00 2001 From: Selamanse Date: Sun, 10 Feb 2019 21:29:13 +0100 Subject: [PATCH 021/145] Fix linter issues --- manifest.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index 047e4ac..0ce0e4f 100644 --- a/manifest.json +++ b/manifest.json @@ -5,7 +5,7 @@ "description": { "en": "the ultimate chat platform" }, - "url": "https://github.com/YunoHost-Apps/rocketchat_ynh", + "url": "https://rocket.chat", "license": "GPL-3.0", "version": "0.73.2", "maintainer": { @@ -45,7 +45,6 @@ "ask": { "en": "Is it a public application?" }, - "choices": ["Yes", "No"], "default": "Yes" }, { From 7787c61f4c24063d849abd961c7fef47244b7ec8 Mon Sep 17 00:00:00 2001 From: Selamanse Date: Sun, 10 Feb 2019 22:16:42 +0100 Subject: [PATCH 022/145] Fix ynh_replace_string arguments --- scripts/install | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/scripts/install b/scripts/install index 29ec72d..23f4aad 100644 --- a/scripts/install +++ b/scripts/install @@ -88,27 +88,27 @@ mkdir -p $final_path id -u $serviceuser || useradd -d "$final_path" -M $serviceuser # Copy and set systemd configuration -ynh_replace_string "s@#ROOTURL#@$domain@g" ../conf/rocketchat.service -ynh_replace_string "s@#LOCATION#@${path:-/}@g" ../conf/rocketchat.service -ynh_replace_string "s@#PORT#@$port@g" ../conf/rocketchat.service -ynh_replace_string "s@#USER#@$serviceuser@g" ../conf/rocketchat.service -ynh_replace_string "s@#DESTDIR#@$final_path@g" ../conf/rocketchat.service -ynh_replace_string "s@#DBNAME#@$dbname@g" ../conf/rocketchat.service +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 "s@#NODE#@$NODE_BIN@g" ../conf/rocketchat.service +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 "s@#APP#@$app@g" ../conf/nginx.conf -ynh_replace_string "s@#PATH#@$path@g" ../conf/nginx.conf -ynh_replace_string "s@#PORT#@$port@g" ../conf/nginx.conf -ynh_replace_string "s@#LOCATION#@${path:-/}@g" ../conf/nginx.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 "s@#DBNAME#@$dbname@g" ../conf/rocketchat_ldap.js +ynh_replace_string "#DBNAME#" "$dbname" ../conf/rocketchat_ldap.js cp ../conf/nginx.conf "$nginx_conf" From b35b12e553f52ccb98143af17908d115b1fdb795 Mon Sep 17 00:00:00 2001 From: Selamanse Date: Sun, 10 Feb 2019 22:26:14 +0100 Subject: [PATCH 023/145] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 14be126..53160c9 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,12 @@ Backup stores: - nginx configuration - systemd service configuration +#### Supported architectures + +* 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/) + ## Links * Report a bug: [Issues](/../../issues) From 6b585c0dc51f77eee5bf42597df9bbcc61dc8c18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 30 Jun 2021 17:01:55 +0200 Subject: [PATCH 024/145] Enh testing (#77) * Make it work again (#71) --- .travis.yml | 7 - README.md | 75 ++++-- check_process | 26 ++ 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 | 212 +++++++++------- scripts/remove | 93 +++++-- scripts/restore | 160 ++++++++---- scripts/upgrade | 176 ++++++++++++-- 18 files changed, 1047 insertions(+), 338 deletions(-) delete mode 100644 .travis.yml 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..d86ec8d 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,54 @@ -# rocketchat_ynh +# RocketChat for YunoHost -Rocketchat for yunohost +[![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) -[![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) +*[Lire ce readme en français.](./README_fr.md)* -## Install with +> *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.* -You can either : +## Overview +Quick description of this app. -* 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` +**Shipped version:** 3.12.0 -**Please note that currently the installation does not work on raspberry pi or arm architecture in general.** +## Screenshots -## Backup information +![](Link to a screenshot of this app.) -Backup stores: +## Demo -- rocketchat app dir -- rocketchat mongodb (via mongodump) -- nginx configuration -- systemd service configuration +* [Official demo](Link to a demo site for this app.) + +## Configuration + +How to configure this app: From an admin panel, a plain file with SSH, or any other way. + +## Documentation + + * Official documentation: Link to the official documentation of this app + * YunoHost documentation: If specific documentation is needed, feel free to contribute. + +## YunoHost specific features + +#### Multi-user support + +Are LDAP and HTTP auth supported? +Can the app be used by multiple users? + +#### Supported architectures + +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/rocketchat%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/rocketchat/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/rocketchat%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/rocketchat/) + +## Limitations + +* Any known limitations. + +## Additional information + +* Other info you would like to add about this app. #### Supported architectures @@ -31,6 +58,20 @@ Backup stores: ## Links - * Report a bug: [Issues](/../../issues) - * Rocketchat website: https://rocket.chat/ + * Report a bug: https://github.com/YunoHost-Apps/rocketchat_ynh/issues + * App website: https://rocket.chat/ + * Upstream app repository: https://github.com/RocketChat/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 +``` diff --git a/check_process b/check_process new file mode 100644 index 0000000..aa8ac7f --- /dev/null +++ b/check_process @@ -0,0 +1,26 @@ +;; Test complet + ; Manifest + domain="domain.tld" + path="/path" + admin="john" + is_public=1 + password="password" + ; 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..8402af0 --- /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://localhost:27017/__APP__?replicaSet=rs01 +Environment=MONGO_OPLOG_URL=mongodb://localhost: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 23f4aad..e08c219 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,159 @@ 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 -#Install dependencies -installdeps +# Install Yarn +#ynh_install_extra_app_dependencies --repo="deb https://dl.yarnpkg.com/debian/ stable main" --package="yarn" --key="https://dl.yarnpkg.com/debian/pubkey.gpg" -# Create destination -mkdir -p $final_path +ynh_install_mongo -# Create user -id -u $serviceuser || useradd -d "$final_path" -M $serviceuser +#================================================= +# CREATE A MONGODB DATABASE +#================================================= +ynh_script_progression --message="Creating a MongoDB database..." -# 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 +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 -# 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 +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Configuring system user..." --weight=3 -#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 --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 +#================================================= + +echo -e "replication:\n replSetName: \"rs01\"" | sudo 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 systemd service..." --weight=2 + +# Start a systemd service +ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="➔ System ➔ startup" +ynh_systemd_action --service_name=mongod --action=restart --log_path=systemd + +#================================================= +# 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 +ynh_script_progression --message="Installation of $app completed" --last -systemctl restart $app.service - -waitforservice - -yunohost app ssowatconf diff --git a/scripts/remove b/scripts/remove index 9e77aa1..b66ebcb 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..c456ca4 100644 --- a/scripts/restore +++ b/scripts/restore @@ -1,94 +1,160 @@ #!/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 + +# 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 source _common.sh -#================================================= -# GENERIC START #================================================= # 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 +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) -# 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 +# RESTORE THE APP MAIN DIR #================================================= -systemctl daemon-reload -systemctl enable rocketchat +ynh_script_progression --message="Restoring the app main directory..." --weight=1 + +ynh_restore_file --origin_path="$final_path" #================================================= -# RESTORE PERMISSIONS IN THE APP MAIN DIR +# RECREATE THE DEDICATED USER #================================================= +ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 -chown -R $serviceuser: $final_path +# Create the dedicated user (if not existing) +ynh_system_user_create --username=$app #================================================= -# INSTALL DEPENDENCIES +# RESTORE USER RIGHTS #================================================= -installdeps +# Restore permissions on app files +chown -R root: $final_path #================================================= -# RESTORE THE MONGODB +# RESTORE THE PHP-FPM CONFIGURATION #================================================= -mongorestore ./dump +ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" #================================================= -# START APP RELATED SERVICES +# RESTORE FAIL2BAN CONFIGURATION +#================================================= +ynh_script_progression --message="Restoring the Fail2Ban configuration..." --weight=1 + +ynh_restore_file "/etc/fail2ban/jail.d/$app.conf" +ynh_restore_file "/etc/fail2ban/filter.d/$app.conf" +ynh_systemd_action --action=restart --service_name=fail2ban + +#================================================= +# SPECIFIC RESTORATION +#================================================= +# REINSTALL DEPENDENCIES +#================================================= +ynh_script_progression --message="Reinstalling dependencies..." --weight=1 + +# Define and install dependencies +ynh_install_app_dependencies $pkg_dependencies + +#================================================= +# RESTORE THE MYSQL DATABASE +#================================================= +ynh_script_progression --message="Restoring the MySQL database..." --weight=1 + +db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) +ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd +ynh_mysql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./db.sql + +#================================================= +# 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" + +#================================================= +# RESTORE VARIOUS FILES #================================================= -systemctl start rocketchat -waitforservice +ynh_restore_file --origin_path="/etc/cron.d/$app" + +ynh_restore_file --origin_path="/etc/$app/" + +#================================================= +# RESTORE THE LOGROTATE CONFIGURATION +#================================================= + +ynh_restore_file --origin_path="/etc/logrotate.d/$app" + +#================================================= +# 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 +#================================================= + +ynh_script_progression --message="Restoration completed for $app" --last diff --git a/scripts/upgrade b/scripts/upgrade index 5b31d0e..2c35b81 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -1,5 +1,4 @@ #!/bin/bash -set -eu #================================================= # GENERIC START @@ -7,40 +6,175 @@ 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..." --time --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) +language=$(ynh_app_setting_get --app=$app --key=language) +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..." --time --weight=1 + +# If db_name doesn't exist, create it +#if [ -z "$db_name" ]; then +# db_name=$(ynh_sanitize_dbid --db_name=$app) +# ynh_app_setting_set --app=$app --key=db_name --value=$db_name +#fi + +# 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 + +if ! ynh_permission_exists --permission="admin"; then + # Create the required permissions + ynh_permission_create --permission="admin" --url="/admin" --allowed=$admin +fi + +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --time --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..." --time --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..." --time --weight=1 -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..." --time --weight=1 -chown -R $serviceuser: $final_path + # Download, check integrity, uncompress and patch the source from app.src + ynh_setup_source --dest_dir="$final_path" +fi -systemctl start rocketchat -waitforservice +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:$app "$final_path" + +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=1 + +# Create a dedicated NGINX config +ynh_add_nginx_config + +#============================================== +# 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 + +#================================================= +# UPGRADE DEPENDENCIES +#================================================= +ynh_script_progression --message="Upgrading dependencies..." --weight=1 + +ynh_install_app_dependencies $pkg_dependencies + +#================================================= +# SETUP SYSTEMD +#================================================= +ynh_script_progression --message="Upgrading systemd configuration..." --weight=1 + +ynh_replace_string --match_string="__ENV_PATH__" --replace_string="$PATH" --target_file="../conf/systemd.service" + +# Create a dedicated systemd config +ynh_add_systemd_config + +#================================================= +# INTEGRATE SERVICE IN YUNOHOST +#================================================= +ynh_script_progression --message="Integrating service in YunoHost..." --time --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..." --time --weight=1 + +ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" +ynh_systemd_action --service_name=mongod --action=restart --log_path=systemd + +#================================================= +# UPGRADE FAIL2BAN +#================================================= +ynh_script_progression --message="Reconfiguring Fail2Ban..." --time --weight=1 + +# Create a dedicated Fail2Ban config +ynh_add_fail2ban_config --logpath="/var/log/nginx/${domain}-error.log" --failregex="Regex to match into the log for a failed login" + +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --time --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Upgrade of $app completed" --time --last From 58b02bc8406e61c30e232414e0cb4488f5cc5b59 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Wed, 30 Jun 2021 15:02:02 +0000 Subject: [PATCH 025/145] Auto-update README --- README.md | 73 ++++++++++++++++------------------------------------ README_fr.md | 44 +++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 51 deletions(-) create mode 100644 README_fr.md diff --git a/README.md b/README.md index d86ec8d..2fdca0b 100644 --- a/README.md +++ b/README.md @@ -1,69 +1,38 @@ + + # RocketChat for YunoHost [![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 RocketChat with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=rocketchat) *[Lire ce readme en français.](./README_fr.md)* -> *This package allows you to install rocketchat quickly and simply on a YunoHost server. +> *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.* ## Overview -Quick description of this app. -**Shipped version:** 3.12.0 +the ultimate chat platform + +**Shipped version:** 3.16.0~ynh1 + +**Demo:** https://cloud.rocket.chat/trial ## Screenshots -![](Link to a screenshot of this app.) +![](./doc/screenshots/screenshot.jpg) -## Demo +## Documentation and resources -* [Official demo](Link to a demo site for this app.) - -## Configuration - -How to configure this app: From an admin panel, a plain file with SSH, or any other way. - -## Documentation - - * Official documentation: Link to the official documentation of this app - * YunoHost documentation: If specific documentation is needed, feel free to contribute. - -## YunoHost specific features - -#### Multi-user support - -Are LDAP and HTTP auth supported? -Can the app be used by multiple users? - -#### Supported architectures - -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/rocketchat%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/rocketchat/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/rocketchat%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/rocketchat/) - -## Limitations - -* Any known limitations. - -## Additional information - -* Other info you would like to add about this app. - -#### Supported architectures - -* 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/) - -## Links - - * Report a bug: https://github.com/YunoHost-Apps/rocketchat_ynh/issues - * App website: https://rocket.chat/ - * Upstream app repository: https://github.com/RocketChat/Rocket.Chat - * YunoHost website: https://yunohost.org/ - ---- +* 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 ## Developer info @@ -75,3 +44,5 @@ sudo yunohost app install https://github.com/YunoHost-Apps/rocketchat_ynh/tree/t 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 From c5e1ea9a547280996f24499595da273b0fa13f77 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 30 Jun 2021 18:34:32 +0200 Subject: [PATCH 026/145] Fix linter --- scripts/install | 2 +- scripts/restore | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/scripts/install b/scripts/install index e08c219..3b0be97 100644 --- a/scripts/install +++ b/scripts/install @@ -145,7 +145,7 @@ echo -e "replication:\n replSetName: \"rs01\"" | sudo tee -a /etc/mongod.conf #================================================= ynh_script_progression --message="Integrating service in YunoHost..." -yunohost service add $app --description "Team collaboration communication platform" --log="/var/log/$app/$app.log" +yunohost service add $app --description="Team collaboration communication platform" --log="/var/log/$app/$app.log" #================================================= # START SYSTEMD SERVICE diff --git a/scripts/restore b/scripts/restore index c456ca4..2e76879 100644 --- a/scripts/restore +++ b/scripts/restore @@ -5,9 +5,8 @@ #================================================= # 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 source _common.sh +source /usr/share/yunohost/helpers #================================================= # MANAGE SCRIPT FAILURE From c13fe54adf70f3fcaa2cd85f28b667a690b9e1ed Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 30 Jun 2021 19:03:49 +0200 Subject: [PATCH 027/145] Fix --- scripts/install | 5 ++-- scripts/remove | 2 +- scripts/restore | 1 - scripts/upgrade | 80 ++++++++++++++++++++++--------------------------- 4 files changed, 39 insertions(+), 49 deletions(-) diff --git a/scripts/install b/scripts/install index 3b0be97..4d4fdd0 100644 --- a/scripts/install +++ b/scripts/install @@ -137,8 +137,9 @@ ynh_add_systemd_config #================================================= # MODIFY A CONFIG FILE #================================================= +ynh_script_progression --message="Configuring a mongod..." --weight=1 -echo -e "replication:\n replSetName: \"rs01\"" | sudo tee -a /etc/mongod.conf +echo -e "replication:\n replSetName: \"rs01\"" | tee -a /etc/mongod.conf #================================================= # INTEGRATE SERVICE IN YUNOHOST @@ -153,8 +154,8 @@ yunohost service add $app --description="Team collaboration communication platfo ynh_script_progression --message="Starting a systemd service..." --weight=2 # Start a systemd service -ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="➔ System ➔ startup" ynh_systemd_action --service_name=mongod --action=restart --log_path=systemd +ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="➔ System ➔ startup" #================================================= # SETUP SSOWAT diff --git a/scripts/remove b/scripts/remove index b66ebcb..d37f8d1 100644 --- a/scripts/remove +++ b/scripts/remove @@ -72,7 +72,7 @@ ynh_secure_remove --file="$final_path" #================================================= # REMOVE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Removing nginx web server configuration..." --weight=1 +ynh_script_progression --message="Removing NGINX web server configuration..." --weight=1 # Remove the dedicated nginx config ynh_remove_nginx_config diff --git a/scripts/restore b/scripts/restore index 2e76879..56d47c1 100644 --- a/scripts/restore +++ b/scripts/restore @@ -31,7 +31,6 @@ 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 -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # CHECK IF THE APP CAN BE RESTORED diff --git a/scripts/upgrade b/scripts/upgrade index 2c35b81..a34008c 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -12,7 +12,7 @@ source /usr/share/yunohost/helpers #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." --time --weight=1 +ynh_script_progression --message="Loading installation settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME @@ -20,7 +20,6 @@ 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) -language=$(ynh_app_setting_get --app=$app --key=language) db_name=$(ynh_app_setting_get --app=$app --key=db_name) #================================================= @@ -32,19 +31,13 @@ upgrade_type=$(ynh_check_app_version_changed) #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= -ynh_script_progression --message="Ensuring downward compatibility..." --time --weight=1 - -# If db_name doesn't exist, create it -#if [ -z "$db_name" ]; then -# db_name=$(ynh_sanitize_dbid --db_name=$app) -# ynh_app_setting_set --app=$app --key=db_name --value=$db_name -#fi +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 [ -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 @@ -56,15 +49,10 @@ if ynh_legacy_permissions_exists; then ynh_app_setting_delete --app=$app --key=is_public fi -if ! ynh_permission_exists --permission="admin"; then - # Create the required permissions - ynh_permission_create --permission="admin" --url="/admin" --allowed=$admin -fi - #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= -ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --time --weight=1 +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 @@ -80,14 +68,14 @@ ynh_abort_if_errors #================================================= # STOP SYSTEMD SERVICE #================================================= -ynh_script_progression --message="Stopping a systemd service..." --time --weight=1 +ynh_script_progression --message="Stopping a systemd service..." --weight=1 ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log" #================================================= # CREATE DEDICATED USER #================================================= -ynh_script_progression --message="Making sure dedicated system user exists..." --time --weight=1 +ynh_script_progression --message="Making sure dedicated system user exists..." --weight=4 # Create a dedicated user (if not existing) ynh_system_user_create --username=$app --home_dir="$final_path" @@ -98,8 +86,9 @@ ynh_system_user_create --username=$app --home_dir="$final_path" if [ "$upgrade_type" == "UPGRADE_APP" ] then - ynh_script_progression --message="Upgrading source files..." --time --weight=1 - + 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 @@ -111,11 +100,20 @@ chown -R $app:$app "$final_path" #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=1 +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 #============================================== @@ -126,50 +124,42 @@ pushd $final_path/programs/server ynh_exec_as $app env $ynh_node_load_PATH npm install 2>/dev/null popd -#================================================= -# UPGRADE DEPENDENCIES -#================================================= -ynh_script_progression --message="Upgrading dependencies..." --weight=1 - -ynh_install_app_dependencies $pkg_dependencies - #================================================= # SETUP SYSTEMD #================================================= -ynh_script_progression --message="Upgrading systemd configuration..." --weight=1 +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..." --time --weight=1 +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..." --time --weight=1 +ynh_script_progression --message="Starting a systemd service..." --weight=10 -ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" ynh_systemd_action --service_name=mongod --action=restart --log_path=systemd - -#================================================= -# UPGRADE FAIL2BAN -#================================================= -ynh_script_progression --message="Reconfiguring Fail2Ban..." --time --weight=1 - -# Create a dedicated Fail2Ban config -ynh_add_fail2ban_config --logpath="/var/log/nginx/${domain}-error.log" --failregex="Regex to match into the log for a failed login" +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..." --time --weight=1 +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name=nginx --action=reload @@ -177,4 +167,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Upgrade of $app completed" --time --last +ynh_script_progression --message="Upgrade of $app completed" --last From c0601d0cc836e99ece7479dcc7758102f6a906a1 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 30 Jun 2021 19:06:52 +0200 Subject: [PATCH 028/145] Fix --- check_process | 5 ++--- scripts/restore | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/check_process b/check_process index aa8ac7f..650c839 100644 --- a/check_process +++ b/check_process @@ -2,9 +2,7 @@ ; Manifest domain="domain.tld" path="/path" - admin="john" is_public=1 - password="password" ; Checks pkg_linter=1 setup_sub_dir=1 @@ -23,4 +21,5 @@ 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 + manifest_arg=domain=DOMAIN&path=PATH&admin=USER&is_public=1&password=pass&port=666& + \ No newline at end of file diff --git a/scripts/restore b/scripts/restore index 56d47c1..0d62dc2 100644 --- a/scripts/restore +++ b/scripts/restore @@ -5,7 +5,7 @@ #================================================= # Keep this path for calling _common.sh inside the execution's context of backup and restore scripts -source _common.sh +source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers #================================================= From 46c6a7cd01584dead52c8aa361f6ef47c66d7e27 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 30 Jun 2021 19:19:23 +0200 Subject: [PATCH 029/145] Update install --- scripts/install | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/scripts/install b/scripts/install index 4d4fdd0..055200b 100644 --- a/scripts/install +++ b/scripts/install @@ -68,10 +68,6 @@ ynh_install_app_dependencies $pkg_dependencies # Install Nodejs ynh_exec_warn_less ynh_install_nodejs --nodejs_version=$nodejs_version - -# Install Yarn -#ynh_install_extra_app_dependencies --repo="deb https://dl.yarnpkg.com/debian/ stable main" --package="yarn" --key="https://dl.yarnpkg.com/debian/pubkey.gpg" - ynh_install_mongo #================================================= @@ -156,6 +152,7 @@ ynh_script_progression --message="Starting a systemd service..." --weight=2 # Start a systemd service ynh_systemd_action --service_name=mongod --action=restart --log_path=systemd ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="➔ System ➔ startup" +sleep 120 #================================================= # SETUP SSOWAT From 505ecb2476d1b2330b8958eac5d69d2f34e5cca6 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 30 Jun 2021 21:16:30 +0200 Subject: [PATCH 030/145] Update install --- scripts/install | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index 055200b..896a9b2 100644 --- a/scripts/install +++ b/scripts/install @@ -150,9 +150,11 @@ yunohost service add $app --description="Team collaboration communication platfo ynh_script_progression --message="Starting a systemd service..." --weight=2 # Start a systemd service -ynh_systemd_action --service_name=mongod --action=restart --log_path=systemd +ynh_systemd_action --service_name=mongod --action=restart --log_path=systemd + +mongo --eval "printjson(rs.initiate())" + ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="➔ System ➔ startup" -sleep 120 #================================================= # SETUP SSOWAT From cf0fa381f48b4992e409253e741d03485f7277f4 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 30 Jun 2021 21:17:21 +0200 Subject: [PATCH 031/145] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 896a9b2..3c246a7 100644 --- a/scripts/install +++ b/scripts/install @@ -153,7 +153,7 @@ ynh_script_progression --message="Starting a systemd service..." --weight=2 ynh_systemd_action --service_name=mongod --action=restart --log_path=systemd mongo --eval "printjson(rs.initiate())" - +#mongo --eval 'rs.initiate();' ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="➔ System ➔ startup" #================================================= From 917f1d63d21bf9eeb486ba5484a7fb213aea7e28 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 30 Jun 2021 21:35:32 +0200 Subject: [PATCH 032/145] Update install --- scripts/install | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index 3c246a7..5a8dcd5 100644 --- a/scripts/install +++ b/scripts/install @@ -150,8 +150,8 @@ yunohost service add $app --description="Team collaboration communication platfo ynh_script_progression --message="Starting a systemd service..." --weight=2 # Start a systemd service -ynh_systemd_action --service_name=mongod --action=restart --log_path=systemd - +#ynh_systemd_action --service_name=mongod --action=restart --log_path=systemd +systemctl enable mongod && systemctl start mongod mongo --eval "printjson(rs.initiate())" #mongo --eval 'rs.initiate();' ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="➔ System ➔ startup" From b5302198ac5c963e8195a58e0e1a01d21f3b6a54 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 30 Jun 2021 21:59:58 +0200 Subject: [PATCH 033/145] Update install --- scripts/install | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 5a8dcd5..dbf26b8 100644 --- a/scripts/install +++ b/scripts/install @@ -135,7 +135,9 @@ ynh_add_systemd_config #================================================= ynh_script_progression --message="Configuring a mongod..." --weight=1 -echo -e "replication:\n replSetName: \"rs01\"" | tee -a /etc/mongod.conf +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 From 7c8b0da5b2c1d80a2f9d71adaa7e1f40ba319d37 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 30 Jun 2021 22:17:30 +0200 Subject: [PATCH 034/145] Update install --- scripts/install | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index dbf26b8..71b9950 100644 --- a/scripts/install +++ b/scripts/install @@ -154,8 +154,9 @@ ynh_script_progression --message="Starting a systemd service..." --weight=2 # Start a systemd service #ynh_systemd_action --service_name=mongod --action=restart --log_path=systemd systemctl enable mongod && systemctl start mongod -mongo --eval "printjson(rs.initiate())" -#mongo --eval 'rs.initiate();' +#mongo --eval "printjson(rs.initiate())" +mongo --eval 'rs.initiate();' +sleep 300 ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="➔ System ➔ startup" #================================================= From a7afa19f5d0b8b644126e978ed9612be5371beeb Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 30 Jun 2021 22:39:11 +0200 Subject: [PATCH 035/145] Update install --- scripts/install | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/scripts/install b/scripts/install index 71b9950..32db68a 100644 --- a/scripts/install +++ b/scripts/install @@ -153,10 +153,8 @@ ynh_script_progression --message="Starting a systemd service..." --weight=2 # Start a systemd service #ynh_systemd_action --service_name=mongod --action=restart --log_path=systemd -systemctl enable mongod && systemctl start mongod -#mongo --eval "printjson(rs.initiate())" -mongo --eval 'rs.initiate();' -sleep 300 +systemctl enable mongod.service --quiet && systemctl restart mongod.service +mongo --eval "printjson(rs.initiate())" ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="➔ System ➔ startup" #================================================= From 38c39254a660a2e00e791a11c3a5c14c6e545f85 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 30 Jun 2021 22:47:11 +0200 Subject: [PATCH 036/145] Update install --- scripts/install | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 8643b2c..fbf5186 100644 --- a/scripts/install +++ b/scripts/install @@ -153,8 +153,9 @@ ynh_script_progression --message="Starting a systemd service..." --weight=2 # Start a systemd service #ynh_systemd_action --service_name=mongod --action=restart --log_path=systemd -systemctl enable mongod.service --quiet && systemctl restart mongod.service +systemctl enable mongod --quiet && systemctl restart mongod mongo --eval "printjson(rs.initiate())" + ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="➔ System ➔ startup" #================================================= From 6fecf64abfa8d3b529f3123876f3e703cfba26b9 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 30 Jun 2021 22:48:39 +0200 Subject: [PATCH 037/145] Update install --- scripts/install | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/install b/scripts/install index fbf5186..3bfec36 100644 --- a/scripts/install +++ b/scripts/install @@ -153,9 +153,9 @@ ynh_script_progression --message="Starting a systemd service..." --weight=2 # Start a systemd service #ynh_systemd_action --service_name=mongod --action=restart --log_path=systemd -systemctl enable mongod --quiet && systemctl restart mongod -mongo --eval "printjson(rs.initiate())" - +systemctl enable mongod && systemctl restart mongod +#mongo --eval "printjson(rs.initiate())" +mongo --eval "rs.initiate()" ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="➔ System ➔ startup" #================================================= From 128893eb92c554f5b8a9a09c348328a67f834306 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 30 Jun 2021 22:53:49 +0200 Subject: [PATCH 038/145] Update systemd.service --- conf/systemd.service | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/systemd.service b/conf/systemd.service index 8402af0..8451839 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -12,8 +12,8 @@ ExecStart=__YNH_NODE__ main.js StandardOutput=syslog StandardError=syslog SyslogIdentifier=__APP__ -Environment=MONGO_URL=mongodb://localhost:27017/__APP__?replicaSet=rs01 -Environment=MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=rs01 +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__ From 232c1ea0ce7bc95b2ba5532d31e68532185784d5 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 30 Jun 2021 22:55:04 +0200 Subject: [PATCH 039/145] Update install --- scripts/install | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/scripts/install b/scripts/install index 3bfec36..aa958b8 100644 --- a/scripts/install +++ b/scripts/install @@ -149,13 +149,19 @@ yunohost service add $app --description="Team collaboration communication platfo #================================================= # START SYSTEMD SERVICE #================================================= -ynh_script_progression --message="Starting a systemd service..." --weight=2 +ynh_script_progression --message="Starting a MongoDB service..." --weight=2 # Start a systemd service #ynh_systemd_action --service_name=mongod --action=restart --log_path=systemd systemctl enable mongod && systemctl restart mongod -#mongo --eval "printjson(rs.initiate())" -mongo --eval "rs.initiate()" +mongo --eval "printjson(rs.initiate())" +#mongo --eval "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" #================================================= From 9e38d2fa3be6308ec5ea847bc0d58b7f8b3fbe53 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 30 Jun 2021 22:59:40 +0200 Subject: [PATCH 040/145] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index aa958b8..a491473 100644 --- a/scripts/install +++ b/scripts/install @@ -154,7 +154,7 @@ ynh_script_progression --message="Starting a MongoDB service..." --weight=2 # Start a systemd service #ynh_systemd_action --service_name=mongod --action=restart --log_path=systemd systemctl enable mongod && systemctl restart mongod -mongo --eval "printjson(rs.initiate())" +#mongo --eval "printjson(rs.initiate())" #mongo --eval "rs.initiate()" #================================================= From 6ff3dbb167161bff3f5345c9b71dd7f6199b989d Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 30 Jun 2021 23:32:18 +0200 Subject: [PATCH 041/145] Update install --- scripts/install | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/install b/scripts/install index a491473..abb0896 100644 --- a/scripts/install +++ b/scripts/install @@ -151,11 +151,11 @@ yunohost service add $app --description="Team collaboration communication platfo #================================================= ynh_script_progression --message="Starting a MongoDB service..." --weight=2 -# Start a systemd service -#ynh_systemd_action --service_name=mongod --action=restart --log_path=systemd -systemctl enable mongod && systemctl restart mongod +# Start a mongod service +ynh_exec_warn_less systemctl enable mongod +ynh_systemd_action --service_name=mongod --action=restart + #mongo --eval "printjson(rs.initiate())" -#mongo --eval "rs.initiate()" #================================================= # START SYSTEMD SERVICE From 1dcba33ae579534889215a7757eb89309fa71b6c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 1 Jul 2021 07:59:58 +0200 Subject: [PATCH 042/145] Fix --- scripts/install | 2 +- scripts/restore | 67 +++++++++++++------------------------------------ 2 files changed, 19 insertions(+), 50 deletions(-) diff --git a/scripts/install b/scripts/install index abb0896..b29b14e 100644 --- a/scripts/install +++ b/scripts/install @@ -152,7 +152,7 @@ yunohost service add $app --description="Team collaboration communication platfo ynh_script_progression --message="Starting a MongoDB service..." --weight=2 # Start a mongod service -ynh_exec_warn_less systemctl enable mongod +ynh_exec_warn_less systemctl enable mongod --quiet ynh_systemd_action --service_name=mongod --action=restart #mongo --eval "printjson(rs.initiate())" diff --git a/scripts/restore b/scripts/restore index aa36794..ff9daa6 100644 --- a/scripts/restore +++ b/scripts/restore @@ -7,7 +7,6 @@ # 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 -source _common.sh #================================================= # MANAGE SCRIPT FAILURE @@ -51,6 +50,14 @@ test ! -d $final_path \ ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" +#================================================= +# RECREATE THE DEDICATED USER +#================================================= +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 THE APP MAIN DIR #================================================= @@ -58,35 +65,9 @@ ynh_script_progression --message="Restoring the app main directory..." --weight= ynh_restore_file --origin_path="$final_path" -#================================================= -# RECREATE THE DEDICATED USER -#================================================= -ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 - -# Create the dedicated user (if not existing) -ynh_system_user_create --username=$app - -#================================================= -# RESTORE USER RIGHTS -#================================================= - -# Restore permissions on app files -chown -R root: $final_path - -#================================================= -# RESTORE THE PHP-FPM CONFIGURATION -#================================================= - -ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" - -#================================================= -# RESTORE FAIL2BAN CONFIGURATION -#================================================= -ynh_script_progression --message="Restoring the Fail2Ban configuration..." --weight=1 - -ynh_restore_file "/etc/fail2ban/jail.d/$app.conf" -ynh_restore_file "/etc/fail2ban/filter.d/$app.conf" -ynh_systemd_action --action=restart --service_name=fail2ban +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:$app "$final_path" #================================================= # SPECIFIC RESTORATION @@ -97,15 +78,17 @@ ynh_script_progression --message="Reinstalling dependencies..." --weight=1 # 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 MYSQL DATABASE +# RESTORE THE MONGODB DATABASE #================================================= -ynh_script_progression --message="Restoring the MySQL database..." --weight=1 +ynh_script_progression --message="Restoring the MongoDB database..." -db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) -ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd -ynh_mysql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./db.sql +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 #================================================= # RESTORE SYSTEMD @@ -129,20 +112,6 @@ 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" -#================================================= -# RESTORE VARIOUS FILES -#================================================= - -ynh_restore_file --origin_path="/etc/cron.d/$app" - -ynh_restore_file --origin_path="/etc/$app/" - -#================================================= -# RESTORE THE LOGROTATE CONFIGURATION -#================================================= - -ynh_restore_file --origin_path="/etc/logrotate.d/$app" - #================================================= # GENERIC FINALIZATION #================================================= From 1aed2b8437815f1e88306a7854ff4a1f62ff72fa Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 10 Jul 2021 20:28:45 +0200 Subject: [PATCH 043/145] 3.16.2 --- conf/app.src | 6 +++--- conf/mongod.conf | 44 -------------------------------------------- manifest.json | 6 +++--- 3 files changed, 6 insertions(+), 50 deletions(-) delete mode 100644 conf/mongod.conf diff --git a/conf/app.src b/conf/app.src index e31c739..0f346dd 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,7 +1,7 @@ -SOURCE_URL=https://releases.rocket.chat/3.16.0/download -SOURCE_SUM=c77aeed2a5eda4a3e9dfde8cfb742f32138638a3a44d0e9e38005992fcadb45b +SOURCE_URL=https://releases.rocket.chat/3.16.2/download +SOURCE_SUM=97c0ddcdb8ceb95bf87282368d4f6193e1fa86e33a8f139593ca93521159c728 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true -SOURCE_FILENAME=rocket.chat-3.16.0.tgz +SOURCE_FILENAME=rocket.chat-3.16.2.tgz SOURCE_EXTRACT=true \ No newline at end of file diff --git a/conf/mongod.conf b/conf/mongod.conf deleted file mode 100644 index 4bedf87..0000000 --- a/conf/mongod.conf +++ /dev/null @@ -1,44 +0,0 @@ -# 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/manifest.json b/manifest.json index d246846..15a0448 100644 --- a/manifest.json +++ b/manifest.json @@ -3,10 +3,10 @@ "id": "rocketchat", "packaging_format": 1, "description": { - "en": "the ultimate chat platform", - "fr": "the ultimate chat platform" + "en": "Team collaboration communication platform", + "fr": "Plateforme de communication collaborative en équipe" }, - "version": "3.16.0~ynh1", + "version": "3.16.2~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From f5ccbb0ed5b67893ae215499153941babc497ca4 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sat, 10 Jul 2021 18:28:53 +0000 Subject: [PATCH 044/145] Auto-update README --- README.md | 4 ++-- README_fr.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 2fdca0b..408ea0b 100644 --- a/README.md +++ b/README.md @@ -15,9 +15,9 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in ## Overview -the ultimate chat platform +Team collaboration communication platform -**Shipped version:** 3.16.0~ynh1 +**Shipped version:** 3.16.2~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index 7dcbd21..e45f0f3 100644 --- a/README_fr.md +++ b/README_fr.md @@ -11,9 +11,9 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour ## Vue d'ensemble -the ultimate chat platform +Plateforme de communication collaborative en équipe -**Version incluse :** 3.16.0~ynh1 +**Version incluse :** 3.16.2~ynh1 **Démo :** https://cloud.rocket.chat/trial From 24e88c0253e954ea8565c4efc5a5635c1b3ea5dc Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 10 Jul 2021 20:39:58 +0200 Subject: [PATCH 045/145] Update install --- scripts/install | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/install b/scripts/install index b29b14e..bad0647 100644 --- a/scripts/install +++ b/scripts/install @@ -80,6 +80,8 @@ 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 +#mongo < ../conf/rocketchat_ldap.js + #================================================= # CREATE DEDICATED USER #================================================= From ceb30f7c0d0d634fdfdbac6fe59dcda83f6a9fd8 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 11 Jul 2021 09:00:04 +0200 Subject: [PATCH 046/145] Update install --- scripts/install | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/install b/scripts/install index bad0647..4f8518e 100644 --- a/scripts/install +++ b/scripts/install @@ -165,6 +165,7 @@ ynh_systemd_action --service_name=mongod --action=restart 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" +sleep 240 #================================================= # SETUP SSOWAT From 3efa804a73e305c310e5d2917b03c4490267971c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 11 Jul 2021 09:16:03 +0200 Subject: [PATCH 047/145] Update install --- scripts/install | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/install b/scripts/install index 4f8518e..bad0647 100644 --- a/scripts/install +++ b/scripts/install @@ -165,7 +165,6 @@ ynh_systemd_action --service_name=mongod --action=restart 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" -sleep 240 #================================================= # SETUP SSOWAT From b803342230314151fc6d6fae6a460e8cd2956861 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 11 Jul 2021 15:54:03 +0200 Subject: [PATCH 048/145] fix --- scripts/backup | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/backup b/scripts/backup index 3ca4521..e0b8bd7 100644 --- a/scripts/backup +++ b/scripts/backup @@ -43,7 +43,7 @@ ynh_backup --src_path="$final_path" # BACKUP THE NGINX CONFIGURATION #================================================= -ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" "conf/nginx" +ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # SPECIFIC BACKUP @@ -51,7 +51,7 @@ ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" "conf/nginx" # BACKUP SYSTEMD #================================================= -ynh_backup --src_path="/etc/systemd/system/$app.service" "conf/service" +ynh_backup --src_path="/etc/systemd/system/$app.service" #================================================= # BACKUP THE MONGODB DATABASE From dae3d7c4312486d168db4ce8e526557cb7cf90c4 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 24 Jul 2021 20:55:12 +0200 Subject: [PATCH 049/145] Update install --- scripts/install | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/install b/scripts/install index bad0647..a2ef2ef 100644 --- a/scripts/install +++ b/scripts/install @@ -141,6 +141,10 @@ 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 +mongo --eval "printjson(rs.initiate())" + +sleep 10 + #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= From 1bb34d09cb7e3be0f90c02fab1bee6de05711fae Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 24 Jul 2021 21:58:19 +0200 Subject: [PATCH 050/145] Update install --- scripts/install | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/scripts/install b/scripts/install index a2ef2ef..da36712 100644 --- a/scripts/install +++ b/scripts/install @@ -123,15 +123,6 @@ pushd $final_path/programs/server 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 #================================================= @@ -141,10 +132,22 @@ 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 +ynh_exec_warn_less systemctl enable mongod --quiet +ynh_systemd_action --service_name=mongod --action=restart + mongo --eval "printjson(rs.initiate())" sleep 10 +#================================================= +# 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 + #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= From f235ba6c12b3cc92efd6c6fc448abd1523b970c9 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 24 Jul 2021 22:11:50 +0200 Subject: [PATCH 051/145] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index da36712..6fb0d5c 100644 --- a/scripts/install +++ b/scripts/install @@ -132,7 +132,7 @@ 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 -ynh_exec_warn_less systemctl enable mongod --quiet +#ynh_exec_warn_less systemctl enable mongod --quiet ynh_systemd_action --service_name=mongod --action=restart mongo --eval "printjson(rs.initiate())" From 60f4aa8068827bb52966b403bade9afdfa4175f1 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 24 Jul 2021 22:15:33 +0200 Subject: [PATCH 052/145] Update systemd.service --- conf/systemd.service | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/systemd.service b/conf/systemd.service index 8451839..8402af0 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -12,8 +12,8 @@ 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=MONGO_URL=mongodb://localhost:27017/__APP__?replicaSet=rs01 +Environment=MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=rs01 Environment=ROOT_URL=https://__DOMAIN____PATH__ Environment=PORT=__PORT__ From 669152ab2c3b22134282289f226e5f4e2d532943 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 24 Jul 2021 22:31:40 +0200 Subject: [PATCH 053/145] Update install --- scripts/install | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/install b/scripts/install index 6fb0d5c..33694e0 100644 --- a/scripts/install +++ b/scripts/install @@ -132,12 +132,12 @@ 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 -#ynh_exec_warn_less systemctl enable mongod --quiet +ynh_exec_warn_less systemctl enable mongod --quiet ynh_systemd_action --service_name=mongod --action=restart -mongo --eval "printjson(rs.initiate())" +#mongo --eval "printjson(rs.initiate())" -sleep 10 +#sleep 10 #================================================= # SETUP SYSTEMD From c6a9928471291b658066065f4a45347cff63057b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 24 Jul 2021 22:38:17 +0200 Subject: [PATCH 054/145] Update install --- scripts/install | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/install b/scripts/install index 33694e0..f3e9310 100644 --- a/scripts/install +++ b/scripts/install @@ -172,6 +172,7 @@ ynh_systemd_action --service_name=mongod --action=restart 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" +sleep 30 #================================================= # SETUP SSOWAT From 531857fd762da5abceac2d3b871dd4e11777fb22 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 24 Jul 2021 22:53:25 +0200 Subject: [PATCH 055/145] Fix --- conf/systemd.service | 4 ++-- scripts/install | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/systemd.service b/conf/systemd.service index 8402af0..0b451d5 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -12,8 +12,8 @@ ExecStart=__YNH_NODE__ main.js StandardOutput=syslog StandardError=syslog SyslogIdentifier=__APP__ -Environment=MONGO_URL=mongodb://localhost:27017/__APP__?replicaSet=rs01 -Environment=MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=rs01 +Environment=MONGO_URL=mongodb://localhost:27017/__APP__?replicaSet=01-rs +Environment=MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=01-rs Environment=ROOT_URL=https://__DOMAIN____PATH__ Environment=PORT=__PORT__ diff --git a/scripts/install b/scripts/install index f3e9310..0a1da6d 100644 --- a/scripts/install +++ b/scripts/install @@ -129,7 +129,7 @@ popd 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 +sed -i "s/^#replication:/replication:\n replSetName: 01-rs/" /etc/mongod.conf #echo -e "replication:\n replSetName: \"rs01\"" | tee -a /etc/mongod.conf ynh_exec_warn_less systemctl enable mongod --quiet From 43df4221695237b6d954f137929ab681211be091 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 24 Jul 2021 23:09:23 +0200 Subject: [PATCH 056/145] Update install --- scripts/install | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index 0a1da6d..21f7acf 100644 --- a/scripts/install +++ b/scripts/install @@ -171,8 +171,8 @@ ynh_systemd_action --service_name=mongod --action=restart #================================================= 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" -sleep 30 +ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="Started The Rocket.Chat server" +sleep 120 #================================================= # SETUP SSOWAT From c6f389eca69ab2797b0d5a645c349083b36164c5 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 24 Jul 2021 23:31:43 +0200 Subject: [PATCH 057/145] Update install --- scripts/install | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/scripts/install b/scripts/install index 21f7acf..af27002 100644 --- a/scripts/install +++ b/scripts/install @@ -123,6 +123,15 @@ pushd $final_path/programs/server 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 #================================================= @@ -135,18 +144,9 @@ sed -i "s/^#replication:/replication:\n replSetName: 01-rs/" /etc/mongod.conf ynh_exec_warn_less systemctl enable mongod --quiet ynh_systemd_action --service_name=mongod --action=restart -#mongo --eval "printjson(rs.initiate())" +mongo --eval "printjson(rs.initiate())" -#sleep 10 - -#================================================= -# 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 +sleep 10 #================================================= # INTEGRATE SERVICE IN YUNOHOST From 6e94ffa6b2fae0ccd6230fbe6296310a2fb9dc96 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 24 Jul 2021 23:43:14 +0200 Subject: [PATCH 058/145] Update systemd.service --- conf/systemd.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/systemd.service b/conf/systemd.service index 0b451d5..0624f4c 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -14,7 +14,7 @@ StandardError=syslog SyslogIdentifier=__APP__ Environment=MONGO_URL=mongodb://localhost:27017/__APP__?replicaSet=01-rs Environment=MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=01-rs -Environment=ROOT_URL=https://__DOMAIN____PATH__ +Environment=ROOT_URL=https://__DOMAIN____PATH__:__PORT__ Environment=PORT=__PORT__ [Install] From e020cc6a9604e167652acfeed1c1a0b92baabc7f Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 13 Aug 2021 22:54:36 +0200 Subject: [PATCH 059/145] Update systemd.service --- conf/systemd.service | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/systemd.service b/conf/systemd.service index 0624f4c..8402af0 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -12,9 +12,9 @@ ExecStart=__YNH_NODE__ main.js StandardOutput=syslog StandardError=syslog SyslogIdentifier=__APP__ -Environment=MONGO_URL=mongodb://localhost:27017/__APP__?replicaSet=01-rs -Environment=MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=01-rs -Environment=ROOT_URL=https://__DOMAIN____PATH__:__PORT__ +Environment=MONGO_URL=mongodb://localhost:27017/__APP__?replicaSet=rs01 +Environment=MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=rs01 +Environment=ROOT_URL=https://__DOMAIN____PATH__ Environment=PORT=__PORT__ [Install] From 5a79dd4cd1137243296bd91f7a22866c22352983 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 13 Aug 2021 22:55:23 +0200 Subject: [PATCH 060/145] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index af27002..572ff8f 100644 --- a/scripts/install +++ b/scripts/install @@ -171,7 +171,7 @@ ynh_systemd_action --service_name=mongod --action=restart #================================================= ynh_script_progression --message="Starting a systemd service..." --weight=2 -ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="Started The Rocket.Chat server" +ynh_systemd_action --service_name=$app --action=start --log_path=systemd #--line_match="Started The Rocket.Chat server" sleep 120 #================================================= From 3e578d125ae7141fa34d709d3ea9cfe68165853c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 20 Sep 2021 23:42:32 +0200 Subject: [PATCH 061/145] Fix --- conf/app.src | 6 +++--- conf/systemd.service | 14 ++++++++------ manifest.json | 3 +-- scripts/restore | 2 -- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/conf/app.src b/conf/app.src index 0f346dd..f0654cb 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,7 +1,7 @@ -SOURCE_URL=https://releases.rocket.chat/3.16.2/download -SOURCE_SUM=97c0ddcdb8ceb95bf87282368d4f6193e1fa86e33a8f139593ca93521159c728 +SOURCE_URL=https://releases.rocket.chat/3.18.1/download +SOURCE_SUM=c895fa9bef7b83b2005ae749ac0897e78f861fc4777b987a75dc62b077d51614 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true -SOURCE_FILENAME=rocket.chat-3.16.2.tgz +SOURCE_FILENAME=rocket.chat-3.18.1.tgz SOURCE_EXTRACT=true \ No newline at end of file diff --git a/conf/systemd.service b/conf/systemd.service index 8402af0..e7e3366 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -1,21 +1,23 @@ [Unit] Description=The Rocket.Chat server -Wants=__MONGODB_SERVICENAME__.service +#Wants=__MONGODB_SERVICENAME__.service After=network.target remote-fs.target nss-lookup.target nginx.service __MONGODB_SERVICENAME__.service [Service] User=__APP__ +Group=__APP__ WorkingDirectory=__FINALPATH__ Environment="PATH=__ENV_PATH__" Environment="NODE_ENV=production" -ExecStart=__YNH_NODE__ main.js +ExecStart=__YNH_NODE__ __FINALPATH__/main.js StandardOutput=syslog StandardError=syslog SyslogIdentifier=__APP__ -Environment=MONGO_URL=mongodb://localhost:27017/__APP__?replicaSet=rs01 -Environment=MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=rs01 -Environment=ROOT_URL=https://__DOMAIN____PATH__ -Environment=PORT=__PORT__ +Environment=MONGO_URL=mongodb://localhost:27017/rocketchat?replicaSet=rs01 MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=rs01 ROOT_URL=http://__DOMAIN____PATH__/ PORT=__PORT__ +#Environment=MONGO_URL=mongodb://localhost:27017/__APP__?replicaSet=rs01 +#Environment=MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=rs01 +#Environment=ROOT_URL=https://__DOMAIN____PATH__ +#Environment=PORT=__PORT__ [Install] WantedBy=multi-user.target diff --git a/manifest.json b/manifest.json index 15a0448..0876c7a 100644 --- a/manifest.json +++ b/manifest.json @@ -32,8 +32,7 @@ "install" : [ { "name": "domain", - "type": "domain", - "example": "domain.org" + "type": "domain" }, { "name": "path", diff --git a/scripts/restore b/scripts/restore index ff9daa6..e195f55 100644 --- a/scripts/restore +++ b/scripts/restore @@ -37,8 +37,6 @@ db_user=$db_name #================================================= ynh_script_progression --message="Validating restoration parameters..." --weight=1 -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 " From 11cbb8dd875a239852ef613a5fde76173a71916e Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 21 Sep 2021 08:19:27 +0200 Subject: [PATCH 062/145] Update systemd.service --- conf/systemd.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/systemd.service b/conf/systemd.service index e7e3366..9b9e899 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -1,6 +1,6 @@ [Unit] Description=The Rocket.Chat server -#Wants=__MONGODB_SERVICENAME__.service +Wants=__MONGODB_SERVICENAME__.service After=network.target remote-fs.target nss-lookup.target nginx.service __MONGODB_SERVICENAME__.service [Service] From d9f3994e141b4d47ceabf21d7f7135ff49ffb942 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 21 Sep 2021 12:26:25 +0200 Subject: [PATCH 063/145] Fix --- manifest.json | 2 +- scripts/install | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index 0876c7a..afc0063 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "3.16.2~ynh1", + "version": "3.18.1~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", diff --git a/scripts/install b/scripts/install index 572ff8f..15e1807 100644 --- a/scripts/install +++ b/scripts/install @@ -138,7 +138,7 @@ ynh_add_systemd_config 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: 01-rs/" /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 ynh_exec_warn_less systemctl enable mongod --quiet From 964c5de926dc2caf16c425836e173d5835a03ae9 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Tue, 21 Sep 2021 10:26:33 +0000 Subject: [PATCH 064/145] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 408ea0b..12b5e18 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Team collaboration communication platform -**Shipped version:** 3.16.2~ynh1 +**Shipped version:** 3.18.1~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index e45f0f3..f32aa02 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme de communication collaborative en équipe -**Version incluse :** 3.16.2~ynh1 +**Version incluse :** 3.18.1~ynh1 **Démo :** https://cloud.rocket.chat/trial From de22cc744ee4f7df7b7f316b6680ea1c59b7ebb0 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 21 Sep 2021 13:13:26 +0200 Subject: [PATCH 065/145] Fix --- scripts/install | 10 ++++------ scripts/upgrade | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/scripts/install b/scripts/install index 15e1807..0e0f49f 100644 --- a/scripts/install +++ b/scripts/install @@ -141,8 +141,8 @@ 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 -ynh_exec_warn_less systemctl enable mongod --quiet -ynh_systemd_action --service_name=mongod --action=restart +ynh_exec_warn_less systemctl enable $mongodb_servicename --quiet +ynh_systemd_action --service_name=$mongodb_servicename --action=restart mongo --eval "printjson(rs.initiate())" @@ -161,10 +161,8 @@ yunohost service add $app --description="Team collaboration communication platfo 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())" +ynh_exec_warn_less systemctl enable $mongodb_servicename --quiet +ynh_systemd_action --service_name=$mongodb_servicename --action=restart #================================================= # START SYSTEMD SERVICE diff --git a/scripts/upgrade b/scripts/upgrade index a34008c..32a46fd 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -153,7 +153,7 @@ yunohost service add $app --description="Team collaboration communication platfo #================================================= 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=$mongodb_servicename --action=restart --log_path=systemd ynh_systemd_action --service_name=$app --action=start --log_path="/var/log/$app/$app.log" #================================================= From 7be085dafa5e32fad647baa18dc419bb3a0d45a7 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 21 Sep 2021 13:14:36 +0200 Subject: [PATCH 066/145] Update systemd.service --- conf/systemd.service | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/conf/systemd.service b/conf/systemd.service index 9b9e899..59299ec 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -13,11 +13,10 @@ ExecStart=__YNH_NODE__ __FINALPATH__/main.js StandardOutput=syslog StandardError=syslog SyslogIdentifier=__APP__ -Environment=MONGO_URL=mongodb://localhost:27017/rocketchat?replicaSet=rs01 MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=rs01 ROOT_URL=http://__DOMAIN____PATH__/ PORT=__PORT__ -#Environment=MONGO_URL=mongodb://localhost:27017/__APP__?replicaSet=rs01 -#Environment=MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=rs01 -#Environment=ROOT_URL=https://__DOMAIN____PATH__ -#Environment=PORT=__PORT__ +Environment=MONGO_URL=mongodb://localhost:27017/__APP__?replicaSet=rs01 +Environment=MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=rs01 +Environment=ROOT_URL=https://__DOMAIN____PATH__ +Environment=PORT=__PORT__ [Install] WantedBy=multi-user.target From ab5b9c55328413f354486a39d26020d32d702567 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 21 Sep 2021 13:18:54 +0200 Subject: [PATCH 067/145] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 0e0f49f..a492b67 100644 --- a/scripts/install +++ b/scripts/install @@ -144,7 +144,7 @@ sed -i "s/^#replication:/replication:\n replSetName: \"rs01\"/" /etc/mongod.con ynh_exec_warn_less systemctl enable $mongodb_servicename --quiet ynh_systemd_action --service_name=$mongodb_servicename --action=restart -mongo --eval "printjson(rs.initiate())" +#mongo --eval "printjson(rs.initiate())" sleep 10 From c492ac59289be97829c9b6722e93209867f17ec4 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 13 Nov 2021 23:08:51 +0100 Subject: [PATCH 068/145] 4.1.2 --- conf/app.src | 8 ++++---- manifest.json | 5 ++--- scripts/upgrade | 39 ++++++++++++++++++--------------------- 3 files changed, 24 insertions(+), 28 deletions(-) diff --git a/conf/app.src b/conf/app.src index f0654cb..81e7539 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,7 +1,7 @@ -SOURCE_URL=https://releases.rocket.chat/3.18.1/download -SOURCE_SUM=c895fa9bef7b83b2005ae749ac0897e78f861fc4777b987a75dc62b077d51614 +SOURCE_URL=https://releases.rocket.chat/4.1.2/download +SOURCE_SUM=a85954b127ed6ad377a8f178b6762262d9ee6ddb8cdd1905a76929e3621cf85b SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true -SOURCE_FILENAME=rocket.chat-3.18.1.tgz -SOURCE_EXTRACT=true \ No newline at end of file +SOURCE_FILENAME=rocket.chat-4.1.2.tgz +SOURCE_EXTRACT=true diff --git a/manifest.json b/manifest.json index afc0063..b51e0b6 100644 --- a/manifest.json +++ b/manifest.json @@ -6,14 +6,13 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "3.18.1~ynh1", + "version": "4.1.2~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", "website": "https://rocket.chat/", "demo": "https://cloud.rocket.chat/trial", "admindoc": "https://docs.rocket.chat/", - "userdoc": "https://yunohost.org/apps", "code": "https://github.com/RocketChat/Rocket.Chat" }, "license": "GPL-3.0", @@ -26,7 +25,7 @@ "nginx" ], "requirements": { - "yunohost": ">> 4.2.4" + "yunohost": ">> 4.3.2" }, "arguments": { "install" : [ diff --git a/scripts/upgrade b/scripts/upgrade index 32a46fd..271d32b 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -28,27 +28,6 @@ db_name=$(ynh_app_setting_get --app=$app --key=db_name) 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 #================================================= @@ -63,6 +42,24 @@ ynh_clean_setup () { # Exit if an error occurs during the execution of the script ynh_abort_if_errors +#================================================= +# 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 + +# Cleaning legacy permissions +if ynh_legacy_permissions_exists; then + ynh_legacy_permissions_delete_all + + ynh_app_setting_delete --app=$app --key=is_public +fi + #================================================= # STANDARD UPGRADE STEPS #================================================= From febceacc975720bae829b0d9325490b4aa98a67d Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sat, 13 Nov 2021 22:09:01 +0000 Subject: [PATCH 069/145] Auto-update README --- README.md | 3 +-- README_fr.md | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 12b5e18..644dba5 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Team collaboration communication platform -**Shipped version:** 3.18.1~ynh1 +**Shipped version:** 4.1.2~ynh1 **Demo:** https://cloud.rocket.chat/trial @@ -28,7 +28,6 @@ Team collaboration communication platform ## Documentation and resources * 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 diff --git a/README_fr.md b/README_fr.md index f32aa02..f45c401 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme de communication collaborative en équipe -**Version incluse :** 3.18.1~ynh1 +**Version incluse :** 4.1.2~ynh1 **Démo :** https://cloud.rocket.chat/trial @@ -24,7 +24,6 @@ Plateforme de communication collaborative en équipe ## 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 From 992a2682c91829d7ba66e397291bf5c1e9d29969 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 13 Nov 2021 23:17:56 +0100 Subject: [PATCH 070/145] Add logrotate --- scripts/backup | 6 ++++++ scripts/install | 10 ++++++++++ scripts/remove | 8 ++++++++ scripts/restore | 7 +++++++ scripts/upgrade | 8 ++++++++ 5 files changed, 39 insertions(+) diff --git a/scripts/backup b/scripts/backup index e0b8bd7..6a99a4c 100644 --- a/scripts/backup +++ b/scripts/backup @@ -45,6 +45,12 @@ ynh_backup --src_path="$final_path" ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" +#================================================= +# BACKUP LOGROTATE +#================================================= + +ynh_backup --src_path="/etc/logrotate.d/$app" + #================================================= # SPECIFIC BACKUP #================================================= diff --git a/scripts/install b/scripts/install index a492b67..40c33fb 100644 --- a/scripts/install +++ b/scripts/install @@ -148,6 +148,16 @@ ynh_systemd_action --service_name=$mongodb_servicename --action=restart sleep 10 +#================================================= +# GENERIC FINALIZATION +#================================================= +# SETUP LOGROTATE +#================================================= +ynh_script_progression --message="Configuring log rotation..." --weight=1 + +# Use logrotate to manage application logfile(s) +ynh_use_logrotate + #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= diff --git a/scripts/remove b/scripts/remove index d37f8d1..33b029f 100644 --- a/scripts/remove +++ b/scripts/remove @@ -43,6 +43,14 @@ ynh_script_progression --message="Stopping and removing the systemd service..." # Remove the dedicated systemd config ynh_remove_systemd_config +#================================================= +# REMOVE LOGROTATE CONFIGURATION +#================================================= +ynh_script_progression --message="Removing logrotate configuration..." --weight=1 + +# Remove the app-specific logrotate config +ynh_remove_logrotate + #================================================= # REMOVE THE MONGODB DATABASE #================================================= diff --git a/scripts/restore b/scripts/restore index e195f55..cc6f762 100644 --- a/scripts/restore +++ b/scripts/restore @@ -96,6 +96,13 @@ ynh_script_progression --message="Restoring the systemd configuration..." --weig ynh_restore_file --origin_path="/etc/systemd/system/$app.service" systemctl enable $app.service --quiet +#================================================= +# RESTORE THE LOGROTATE CONFIGURATION +#================================================= +ynh_script_progression --message="Restoring the logrotate configuration..." --weight=1 + +ynh_restore_file --origin_path="/etc/logrotate.d/$app" + #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 271d32b..07d9236 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -131,6 +131,14 @@ ynh_replace_string --match_string="__ENV_PATH__" --replace_string="$PATH" --targ # Create a dedicated systemd config ynh_add_systemd_config +#================================================= +# SETUP LOGROTATE +#================================================= +ynh_script_progression --message="Upgrading logrotate configuration..." --weight=1 + +# Use logrotate to manage app-specific logfile(s) +ynh_use_logrotate --non-append + #================================================= # MODIFY A CONFIG FILE #================================================= From ce2d66a84ac49c0516c5a66ff3a35898ccf696b8 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 13 Nov 2021 23:54:15 +0100 Subject: [PATCH 071/145] Update install --- scripts/install | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/install b/scripts/install index 40c33fb..a980c92 100644 --- a/scripts/install +++ b/scripts/install @@ -138,16 +138,16 @@ ynh_add_systemd_config 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 +sed -i "s/^#replication:/replication:\n replSetName: rs01/" /etc/mongod.conf #echo -e "replication:\n replSetName: \"rs01\"" | tee -a /etc/mongod.conf ynh_exec_warn_less systemctl enable $mongodb_servicename --quiet ynh_systemd_action --service_name=$mongodb_servicename --action=restart -#mongo --eval "printjson(rs.initiate())" - sleep 10 +mongo --eval "printjson(rs.initiate())" + #================================================= # GENERIC FINALIZATION #================================================= From 5c049575c08b6b539115298606571f046ab13847 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 14 Nov 2021 09:43:51 +0100 Subject: [PATCH 072/145] Add templates --- .github/ISSUE_TEMPLATE.md | 55 ++++++++++++++++++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 16 ++++++++++ 2 files changed, 71 insertions(+) create mode 100755 .github/ISSUE_TEMPLATE.md create mode 100755 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100755 index 0000000..2729a6b --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,55 @@ +--- +name: Bug report +about: When creating a bug report, please use the following template to provide all the relevant information and help debugging efficiently. + +--- + +**How to post a meaningful bug report** +1. *Read this whole template first.* +2. *Determine if you are on the right place:* + - *If you were performing an action on the app from the webadmin or the CLI (install, update, backup, restore, change_url...), you are on the right place!* + - *Otherwise, the issue may be due to the app itself. Refer to its documentation or repository for help.* + - *When in doubt, post here and we will figure it out together.* +3. *Delete the italic comments as you write over them below, and remove this guide.* +--- + +### Describe the bug + +*A clear and concise description of what the bug is.* + +### Context + +- Hardware: *VPS bought online / Old laptop or computer / Raspberry Pi at home / Internet Cube with VPN / Other ARM board / ...* +- YunoHost version: x.x.x +- I have access to my server: *Through SSH | through the webadmin | direct access via keyboard / screen | ...* +- Are you in a special context or did you perform some particular tweaking on your YunoHost instance?: *no / yes* + - If yes, please explain: +- Using, or trying to install package version/branch: +- If upgrading, current package version: *can be found in the admin, or with `yunohost app info $app_id`* + +### Steps to reproduce + +- *If you performed a command from the CLI, the command itself is enough. For example:* + ```sh + sudo yunohost app install the_app + ``` +- *If you used the webadmin, please perform the equivalent command from the CLI first.* +- *If the error occurs in your browser, explain what you did:* + 1. *Go to '...'* + 2. *Click on '...'* + 3. *Scroll down to '...'* + 4. *See error* + +### Expected behavior + +*A clear and concise description of what you expected to happen. You can remove this section if the command above is enough to understand your intent.* + +### Logs + +*When an operation fails, YunoHost provides a simple way to share the logs.* +- *In the webadmin, the error message contains a link to the relevant log page. On that page, you will be able to 'Share with Yunopaste'. If you missed it, the logs of previous operations are also available under Tools > Logs.* +- *In command line, the command to share the logs is displayed at the end of the operation and looks like `yunohost log display [log name] --share`. If you missed it, you can find the log ID of a previous operation using `yunohost log list`.* + +*After sharing the log, please copypaste directly the link provided by YunoHost (to help readability, no need to copypaste the entire content of the log here, just the link is enough...)* + +*If applicable and useful, add screenshots to help explain your problem.* diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100755 index 0000000..ef70e18 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,16 @@ +## Problem + +- *Description of why you made this PR* + +## Solution + +- *And how do you fix that problem* + +## PR Status + +- [ ] Code finished and ready to be reviewed/tested +- [ ] The fix/enhancement were manually tested (if applicable) + +## Automatic tests + +Automatic tests can be triggered on https://ci-apps-dev.yunohost.org/ *after creating the PR*, by commenting "!testme", "!gogogadgetoci" or "By the power of systemd, I invoke The Great App CI to test this Pull Request!". (N.B. : for this to work you need to be a member of the Yunohost-Apps organization) From f58f50341c2ed1b846357e41756e678ef88f55b7 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 14 Nov 2021 09:52:08 +0100 Subject: [PATCH 073/145] Fix --- scripts/_common.sh | 4 ++-- scripts/install | 1 - scripts/upgrade | 14 +++++++------- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 87ac1c2..02a93b8 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -23,8 +23,8 @@ 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" +MONGO_CE_REPO="deb http://repo.mongodb.org/apt/debian buster/mongodb-org/5.0 main" +MONGO_CE_KEY="https://www.mongodb.org/static/pgp/server-5.0.asc" # Execute a mongo command # diff --git a/scripts/install b/scripts/install index a980c92..28d623f 100644 --- a/scripts/install +++ b/scripts/install @@ -139,7 +139,6 @@ 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 ynh_exec_warn_less systemctl enable $mongodb_servicename --quiet ynh_systemd_action --service_name=$mongodb_servicename --action=restart diff --git a/scripts/upgrade b/scripts/upgrade index 07d9236..21ecc44 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -131,6 +131,13 @@ ynh_replace_string --match_string="__ENV_PATH__" --replace_string="$PATH" --targ # 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 + #================================================= # SETUP LOGROTATE #================================================= @@ -139,13 +146,6 @@ ynh_script_progression --message="Upgrading logrotate configuration..." --weight # Use logrotate to manage app-specific logfile(s) ynh_use_logrotate --non-append -#================================================= -# 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 #================================================= From d2570d3aab411bd305c1fe9f38b59b046db865ce Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 14 Nov 2021 10:06:01 +0100 Subject: [PATCH 074/145] Update upgrade --- scripts/upgrade | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 21ecc44..fe265e6 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -136,8 +136,15 @@ ynh_add_systemd_config #================================================= ynh_script_progression --message="Configuring a mongod..." --weight=1 -echo -e "replication:\n replSetName: \"rs01\"" | tee -a /etc/mongod.conf +sed -i "s/^# engine:/ engine: wiredTiger/" /etc/mongod.conf +sed -i "s/^#replication:/replication:\n replSetName: rs01/" /etc/mongod.conf +ynh_exec_warn_less systemctl enable $mongodb_servicename --quiet +ynh_systemd_action --service_name=$mongodb_servicename --action=restart + +sleep 10 + +mongo --eval "printjson(rs.initiate())" #================================================= # SETUP LOGROTATE #================================================= From 6cb09f68b11d342387442ecf173667fd0db6fa25 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 14 Nov 2021 10:10:59 +0100 Subject: [PATCH 075/145] Fix --- conf/mongod.conf | 2 +- scripts/install | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/conf/mongod.conf b/conf/mongod.conf index 4bedf87..1ff3dbd 100644 --- a/conf/mongod.conf +++ b/conf/mongod.conf @@ -33,7 +33,7 @@ processManagement: #operationProfiling: replication: - replSetName: "rs01" + replSetName: rs01 #sharding: diff --git a/scripts/install b/scripts/install index 28d623f..c7efae0 100644 --- a/scripts/install +++ b/scripts/install @@ -145,7 +145,9 @@ ynh_systemd_action --service_name=$mongodb_servicename --action=restart sleep 10 -mongo --eval "printjson(rs.initiate())" +#mongo --eval "printjson(rs.initiate())" + +ynh_mongo_exec --command="printjson(rs.initiate())" --eval #================================================= # GENERIC FINALIZATION From be3ca35593156a4b711227fd2184b875d58d6b25 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 17 Nov 2021 23:37:02 +0100 Subject: [PATCH 076/145] Fix --- scripts/restore | 21 +++++++++++++++++++-- scripts/upgrade | 4 +++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/scripts/restore b/scripts/restore index cc6f762..5bf19d7 100644 --- a/scripts/restore +++ b/scripts/restore @@ -88,6 +88,23 @@ 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 +#================================================= +# 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 + +ynh_exec_warn_less systemctl enable $mongodb_servicename --quiet +ynh_systemd_action --service_name=$mongodb_servicename --action=restart + +sleep 10 + +#mongo --eval "printjson(rs.initiate())" + +ynh_mongo_exec --command="printjson(rs.initiate())" --eval + #================================================= # RESTORE SYSTEMD #================================================= @@ -115,14 +132,14 @@ yunohost service add $app --description="Team collaboration communication platfo #================================================= 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" +ynh_systemd_action --service_name=$app --action="start" --log_path=systemd #================================================= # GENERIC FINALIZATION #================================================= # RELOAD NGINX AND PHP-FPM #================================================= -ynh_script_progression --message="Reloading NGINX web server and PHP-FPM..." --weight=1 +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/upgrade b/scripts/upgrade index fe265e6..3546a73 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -145,6 +145,7 @@ ynh_systemd_action --service_name=$mongodb_servicename --action=restart sleep 10 mongo --eval "printjson(rs.initiate())" + #================================================= # SETUP LOGROTATE #================================================= @@ -159,6 +160,7 @@ ynh_use_logrotate --non-append 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" +sleep 120 #================================================= # START SYSTEMD SERVICE @@ -166,7 +168,7 @@ yunohost service add $app --description="Team collaboration communication platfo ynh_script_progression --message="Starting a systemd service..." --weight=10 ynh_systemd_action --service_name=$mongodb_servicename --action=restart --log_path=systemd -ynh_systemd_action --service_name=$app --action=start --log_path="/var/log/$app/$app.log" +ynh_systemd_action --service_name=$app --action=start --log_path=systemd #================================================= # RELOAD NGINX From 79c1449e3efc4ec26c22619273bb799887383171 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 18 Nov 2021 09:42:02 +0100 Subject: [PATCH 077/145] Fix --- scripts/install | 4 +--- scripts/restore | 7 ++++--- scripts/upgrade | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/scripts/install b/scripts/install index c7efae0..a827f24 100644 --- a/scripts/install +++ b/scripts/install @@ -101,7 +101,7 @@ ynh_setup_source --dest_dir=$final_path chmod 750 "$final_path" chmod -R o-rwx "$final_path" -chown -R $app:$app "$final_path" +chown -R $app:www-data "$final_path" #================================================= # NGINX CONFIGURATION @@ -145,8 +145,6 @@ ynh_systemd_action --service_name=$mongodb_servicename --action=restart sleep 10 -#mongo --eval "printjson(rs.initiate())" - ynh_mongo_exec --command="printjson(rs.initiate())" --eval #================================================= diff --git a/scripts/restore b/scripts/restore index 5bf19d7..0b97426 100644 --- a/scripts/restore +++ b/scripts/restore @@ -65,7 +65,7 @@ ynh_restore_file --origin_path="$final_path" chmod 750 "$final_path" chmod -R o-rwx "$final_path" -chown -R $app:$app "$final_path" +chown -R $app:www-data "$final_path" #================================================= # SPECIFIC RESTORATION @@ -76,6 +76,7 @@ ynh_script_progression --message="Reinstalling dependencies..." --weight=1 # Define and install dependencies ynh_install_app_dependencies $pkg_dependencies + ynh_exec_warn_less ynh_install_nodejs --nodejs_version=$nodejs_version ynh_install_mongo @@ -101,8 +102,6 @@ ynh_systemd_action --service_name=$mongodb_servicename --action=restart sleep 10 -#mongo --eval "printjson(rs.initiate())" - ynh_mongo_exec --command="printjson(rs.initiate())" --eval #================================================= @@ -132,6 +131,8 @@ yunohost service add $app --description="Team collaboration communication platfo #================================================= ynh_script_progression --message="Starting a systemd service..." --weight=1 +# Start a mongod service +ynh_exec_warn_less systemctl enable $mongodb_servicename --quiet ynh_systemd_action --service_name=$app --action="start" --log_path=systemd #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 3546a73..556d805 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -92,7 +92,7 @@ fi chmod 750 "$final_path" chmod -R o-rwx "$final_path" -chown -R $app:$app "$final_path" +chown -R $app:www-data "$final_path" #================================================= # NGINX CONFIGURATION From a2f56ab301d3f831dab34e4dc29de13fcb287f2d Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 18 Nov 2021 10:21:57 +0100 Subject: [PATCH 078/145] Fix --- conf/rocketchat_ldap.js | 2 +- scripts/restore | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/rocketchat_ldap.js b/conf/rocketchat_ldap.js index 62293ff..23de9a0 100644 --- a/conf/rocketchat_ldap.js +++ b/conf/rocketchat_ldap.js @@ -1,4 +1,4 @@ -use __DB_NAME__ +use rocketchat db.rocketchat_settings.update( diff --git a/scripts/restore b/scripts/restore index 0b97426..edf08ba 100644 --- a/scripts/restore +++ b/scripts/restore @@ -83,7 +83,7 @@ ynh_install_mongo #================================================= # RESTORE THE MONGODB DATABASE #================================================= -ynh_script_progression --message="Restoring the MongoDB database..." +ynh_script_progression --message="Restoring the MongoDB database..." --weight=3 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 @@ -92,7 +92,7 @@ ynh_mongo_restore_db --database="$db_name" < ./dump.bson #================================================= # MODIFY A CONFIG FILE #================================================= -ynh_script_progression --message="Configuring a mongod..." --weight=1 +ynh_script_progression --message="Configuring a mongod..." --weight=3 sed -i "s/^# engine:/ engine: wiredTiger/" /etc/mongod.conf sed -i "s/^#replication:/replication:\n replSetName: rs01/" /etc/mongod.conf @@ -129,7 +129,7 @@ yunohost service add $app --description="Team collaboration communication platfo #================================================= # START SYSTEMD SERVICE #================================================= -ynh_script_progression --message="Starting a systemd service..." --weight=1 +ynh_script_progression --message="Starting a systemd service..." --weight=5 # Start a mongod service ynh_exec_warn_less systemctl enable $mongodb_servicename --quiet From 7c4e6648ab99a7107b04c9694dc6563c6a8ee2bb Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 18 Nov 2021 10:55:35 +0100 Subject: [PATCH 079/145] Fix --- scripts/install | 4 ++-- scripts/restore | 12 ++++++++++-- scripts/upgrade | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/scripts/install b/scripts/install index a827f24..55f6106 100644 --- a/scripts/install +++ b/scripts/install @@ -165,7 +165,7 @@ 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 +# START MONGO SYSTEMD SERVICE #================================================= ynh_script_progression --message="Starting a MongoDB service..." --weight=2 @@ -178,7 +178,7 @@ ynh_systemd_action --service_name=$mongodb_servicename --action=restart #================================================= ynh_script_progression --message="Starting a systemd service..." --weight=2 -ynh_systemd_action --service_name=$app --action=start --log_path=systemd #--line_match="Started The Rocket.Chat server" +ynh_systemd_action --service_name=$app --action=start --log_path=systemd sleep 120 #================================================= diff --git a/scripts/restore b/scripts/restore index edf08ba..95372e4 100644 --- a/scripts/restore +++ b/scripts/restore @@ -126,14 +126,22 @@ 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 MONGO SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a MongoDB service..." --weight=2 + +# Start a mongod service +ynh_exec_warn_less systemctl enable $mongodb_servicename --quiet +ynh_systemd_action --service_name=$mongodb_servicename --action=restart + #================================================= # START SYSTEMD SERVICE #================================================= ynh_script_progression --message="Starting a systemd service..." --weight=5 -# Start a mongod service -ynh_exec_warn_less systemctl enable $mongodb_servicename --quiet ynh_systemd_action --service_name=$app --action="start" --log_path=systemd +sleep 120 #================================================= # GENERIC FINALIZATION diff --git a/scripts/upgrade b/scripts/upgrade index 556d805..7f1d628 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -160,7 +160,6 @@ ynh_use_logrotate --non-append 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" -sleep 120 #================================================= # START SYSTEMD SERVICE @@ -169,6 +168,7 @@ ynh_script_progression --message="Starting a systemd service..." --weight=10 ynh_systemd_action --service_name=$mongodb_servicename --action=restart --log_path=systemd ynh_systemd_action --service_name=$app --action=start --log_path=systemd +sleep 120 #================================================= # RELOAD NGINX From df3a5e9b40aff831f2fab6bbafd3601f5a9b7b2b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 18 Nov 2021 13:45:16 +0100 Subject: [PATCH 080/145] Add description --- doc/DESCRIPTION.md | 1 + doc/DESCRIPTION_fr.md | 1 + doc/DISCLAIMER_fr.md | 0 3 files changed, 2 insertions(+) create mode 100644 doc/DESCRIPTION.md create mode 100644 doc/DESCRIPTION_fr.md create mode 100644 doc/DISCLAIMER_fr.md diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md new file mode 100644 index 0000000..9fdc029 --- /dev/null +++ b/doc/DESCRIPTION.md @@ -0,0 +1 @@ +Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. diff --git a/doc/DESCRIPTION_fr.md b/doc/DESCRIPTION_fr.md new file mode 100644 index 0000000..d347e88 --- /dev/null +++ b/doc/DESCRIPTION_fr.md @@ -0,0 +1 @@ +Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. \ No newline at end of file diff --git a/doc/DISCLAIMER_fr.md b/doc/DISCLAIMER_fr.md new file mode 100644 index 0000000..e69de29 From f86d352f946bc5013538f676cb8f38951892be41 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Thu, 18 Nov 2021 12:45:24 +0000 Subject: [PATCH 081/145] Auto-update README --- README.md | 3 ++- README_fr.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 644dba5..07d6655 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,8 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in ## Overview -Team collaboration communication platform +Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. + **Shipped version:** 4.1.2~ynh1 diff --git a/README_fr.md b/README_fr.md index f45c401..fc3fba4 100644 --- a/README_fr.md +++ b/README_fr.md @@ -11,7 +11,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour ## Vue d'ensemble -Plateforme de communication collaborative en équipe +Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. **Version incluse :** 4.1.2~ynh1 From 8c404f0f092ec43eaf873408aefcd4de8184ad5c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 18 Nov 2021 13:48:40 +0100 Subject: [PATCH 082/145] fix --- conf/app.src | 2 +- conf/mongod.conf | 44 -------------------------------------------- 2 files changed, 1 insertion(+), 45 deletions(-) delete mode 100644 conf/mongod.conf diff --git a/conf/app.src b/conf/app.src index 81e7539..02346cc 100644 --- a/conf/app.src +++ b/conf/app.src @@ -3,5 +3,5 @@ SOURCE_SUM=a85954b127ed6ad377a8f178b6762262d9ee6ddb8cdd1905a76929e3621cf85b SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true -SOURCE_FILENAME=rocket.chat-4.1.2.tgz +SOURCE_FILENAME=rocket.chat.tgz SOURCE_EXTRACT=true diff --git a/conf/mongod.conf b/conf/mongod.conf deleted file mode 100644 index 1ff3dbd..0000000 --- a/conf/mongod.conf +++ /dev/null @@ -1,44 +0,0 @@ -# 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: From b581d9544d8c1da127add0220155c81e749b7dd3 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 18 Nov 2021 14:41:26 +0100 Subject: [PATCH 083/145] Fix --- check_process | 2 +- scripts/upgrade | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/check_process b/check_process index 650c839..f36d38f 100644 --- a/check_process +++ b/check_process @@ -14,7 +14,7 @@ #upgrade=1 from_commit=CommitHash backup_restore=1 multi_instance=0 - change_url=1 + change_url=0 ;;; Options Email= Notification=none diff --git a/scripts/upgrade b/scripts/upgrade index 7f1d628..92452bc 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -21,6 +21,7 @@ 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) +port=$(ynh_app_setting_get --app=$app --key=port) #================================================= # CHECK VERSION From 74525d1409b888def045052a3a31880e00833c32 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 18 Nov 2021 14:46:45 +0100 Subject: [PATCH 084/145] Fix --- check_process | 4 +- manifest.json | 2 +- scripts/change_url | 124 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 scripts/change_url diff --git a/check_process b/check_process index f36d38f..8b9b820 100644 --- a/check_process +++ b/check_process @@ -13,8 +13,8 @@ upgrade=1 #upgrade=1 from_commit=CommitHash backup_restore=1 - multi_instance=0 - change_url=0 + multi_instance=1 + change_url=1 ;;; Options Email= Notification=none diff --git a/manifest.json b/manifest.json index b51e0b6..944f3a9 100644 --- a/manifest.json +++ b/manifest.json @@ -20,7 +20,7 @@ "name": "", "email": "" }, - "multi_instance": false, + "multi_instance": true, "services": [ "nginx" ], diff --git a/scripts/change_url b/scripts/change_url new file mode 100644 index 0000000..538ca2b --- /dev/null +++ b/scripts/change_url @@ -0,0 +1,124 @@ +#!/bin/bash + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# RETRIEVE ARGUMENTS +#================================================= + +old_domain=$YNH_APP_OLD_DOMAIN +old_path=$YNH_APP_OLD_PATH + +new_domain=$YNH_APP_NEW_DOMAIN +new_path=$YNH_APP_NEW_PATH + +app=$YNH_APP_INSTANCE_NAME + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 + +# Needed for helper "ynh_add_nginx_config" +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +port=$(ynh_app_setting_get --app=$app --key=port) + +#================================================= +# BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --weight=1 + +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + # Remove the new domain config file, the remove script won't do it as it doesn't know yet its location. + ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" + + # Restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# CHECK WHICH PARTS SHOULD BE CHANGED +#================================================= + +change_domain=0 +if [ "$old_domain" != "$new_domain" ] +then + change_domain=1 +fi + +change_path=0 +if [ "$old_path" != "$new_path" ] +then + change_path=1 +fi + +#================================================= +# STANDARD MODIFICATIONS +#================================================= +# STOP SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Stopping a systemd service..." --weight=1 + +ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log" + +#================================================= +# MODIFY URL IN NGINX CONF +#================================================= +ynh_script_progression --message="Updating NGINX web server configuration..." --weight=1 + +nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf + +# Change the path in the NGINX config file +if [ $change_path -eq 1 ] +then + # Make a backup of the original NGINX config file if modified + ynh_backup_if_checksum_is_different --file="$nginx_conf_path" + # Set global variables for NGINX helper + domain="$old_domain" + path_url="$new_path" + # Create a dedicated NGINX config + ynh_add_nginx_config +fi + +# Change the domain for NGINX +if [ $change_domain -eq 1 ] +then + # Delete file checksum for the old conf file location + ynh_delete_file_checksum --file="$nginx_conf_path" + mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf + # Store file checksum for the new config file location + ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" +fi + +#================================================= +# GENERIC FINALISATION +#================================================= +# 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" + +#================================================= +# 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="Change of URL completed for $app" --last From a1283ee80a34fae2ad1ba07a8cd531a63c724621 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 19 Nov 2021 13:47:53 +0100 Subject: [PATCH 085/145] Set admin (#85) * Add admin --- check_process | 2 ++ conf/systemd.service | 4 ++++ manifest.json | 8 ++++++++ scripts/_common.sh | 2 +- scripts/install | 14 +++++++++----- scripts/remove | 4 ++++ scripts/restore | 2 +- scripts/upgrade | 9 ++++++--- 8 files changed, 35 insertions(+), 10 deletions(-) diff --git a/check_process b/check_process index 8b9b820..cc2fe7c 100644 --- a/check_process +++ b/check_process @@ -2,7 +2,9 @@ ; Manifest domain="domain.tld" path="/path" + admin="john" is_public=1 + password="1Strong-Password" ; Checks pkg_linter=1 setup_sub_dir=1 diff --git a/conf/systemd.service b/conf/systemd.service index 59299ec..1e5b3bb 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -17,6 +17,10 @@ Environment=MONGO_URL=mongodb://localhost:27017/__APP__?replicaSet=rs01 Environment=MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=rs01 Environment=ROOT_URL=https://__DOMAIN____PATH__ Environment=PORT=__PORT__ +Environment=ADMIN_USERNAME=__ADMIN__ +Environment=ADMIN_PASS=__PASSWORD__ +Environment=ADMIN_EMAIL=__EMAIL__ +Environment=OVERWRITE_SETTING_Show_Setup_Wizard=completed [Install] WantedBy=multi-user.target diff --git a/manifest.json b/manifest.json index 944f3a9..3a6d61c 100644 --- a/manifest.json +++ b/manifest.json @@ -39,10 +39,18 @@ "example": "/rocketchat", "default": "/rocketchat" }, + { + "name": "admin", + "type": "user" + }, { "name": "is_public", "type": "boolean", "default": true + }, + { + "name": "password", + "type": "password" } ] } diff --git a/scripts/_common.sh b/scripts/_common.sh index 02a93b8..bbf1cfe 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -357,7 +357,7 @@ 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..." + ynh_script_progression --message="Removing MongoDB service..." --weight=2 # Define Mongo Service Name if [ "$(lsb_release --codename --short)" = "buster" ]; then MONGODB_SERVICENAME=$MONGO_CE_SERVICENAME diff --git a/scripts/install b/scripts/install index 55f6106..dd22856 100644 --- a/scripts/install +++ b/scripts/install @@ -26,6 +26,9 @@ ynh_abort_if_errors domain=$YNH_APP_ARG_DOMAIN path_url=$YNH_APP_ARG_PATH is_public=$YNH_APP_ARG_IS_PUBLIC +password=$YNH_APP_ARG_PASSWORD +admin=$YNH_APP_ARG_ADMIN +email=$(ynh_user_get_info --username=$admin --key=mail) app=$YNH_APP_INSTANCE_NAME @@ -47,6 +50,9 @@ ynh_script_progression --message="Storing installation settings..." --weight=2 ynh_app_setting_set --app=$app --key=domain --value=$domain ynh_app_setting_set --app=$app --key=path --value=$path_url +ynh_app_setting_set --app=$app --key=admin --value=$admin +ynh_app_setting_set --app=$app --key=password --value=$password +ynh_app_setting_set --app=$app --key=email --value=$email #================================================= # STANDARD MODIFICATIONS @@ -80,8 +86,6 @@ 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 -#mongo < ../conf/rocketchat_ldap.js - #================================================= # CREATE DEDICATED USER #================================================= @@ -101,7 +105,7 @@ ynh_setup_source --dest_dir=$final_path chmod 750 "$final_path" chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" +chown -R $app:$app "$final_path" #================================================= # NGINX CONFIGURATION @@ -120,7 +124,7 @@ ynh_script_progression --message="Building $app... (this will take some time and pushd $final_path/programs/server ynh_use_nodejs - ynh_exec_as $app env $ynh_node_load_PATH npm install 2>/dev/null + ynh_exec_as $app env $ynh_node_load_PATH npm install --unsafe-perm 2>/dev/null popd #================================================= @@ -179,7 +183,7 @@ ynh_systemd_action --service_name=$mongodb_servicename --action=restart ynh_script_progression --message="Starting a systemd service..." --weight=2 ynh_systemd_action --service_name=$app --action=start --log_path=systemd -sleep 120 +sleep 100 #================================================= # SETUP SSOWAT diff --git a/scripts/remove b/scripts/remove index 33b029f..3e8bd12 100644 --- a/scripts/remove +++ b/scripts/remove @@ -77,6 +77,10 @@ ynh_script_progression --message="Removing app main directory..." --weight=1 # Remove the app directory securely ynh_secure_remove --file="$final_path" +if [ -d "/tmp/ufs" ]; then + ynh_secure_remove --file="/tmp/ufs" +fi + #================================================= # REMOVE NGINX CONFIGURATION #================================================= diff --git a/scripts/restore b/scripts/restore index 95372e4..f801460 100644 --- a/scripts/restore +++ b/scripts/restore @@ -65,7 +65,7 @@ ynh_restore_file --origin_path="$final_path" chmod 750 "$final_path" chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" +chown -R $app:$app "$final_path" #================================================= # SPECIFIC RESTORATION diff --git a/scripts/upgrade b/scripts/upgrade index 92452bc..2e10976 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -22,6 +22,9 @@ 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) port=$(ynh_app_setting_get --app=$app --key=port) +password=$(ynh_app_setting_get --app=$app --key=password) +admin=$(ynh_app_setting_get --app=$app --key=admin) +email=$(ynh_app_setting_get --app=$app --key=email) #================================================= # CHECK VERSION @@ -93,7 +96,7 @@ fi chmod 750 "$final_path" chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" +chown -R $app:$app "$final_path" #================================================= # NGINX CONFIGURATION @@ -119,7 +122,7 @@ ynh_script_progression --message="Building $app... (this will take some time and pushd $final_path/programs/server ynh_use_nodejs - ynh_exec_as $app env $ynh_node_load_PATH npm install 2>/dev/null + ynh_exec_as $app env $ynh_node_load_PATH npm install --unsafe-perm 2>/dev/null popd #================================================= @@ -169,7 +172,7 @@ ynh_script_progression --message="Starting a systemd service..." --weight=10 ynh_systemd_action --service_name=$mongodb_servicename --action=restart --log_path=systemd ynh_systemd_action --service_name=$app --action=start --log_path=systemd -sleep 120 +sleep 100 #================================================= # RELOAD NGINX From 55840352411b32ed2182be477a0653636a8328c9 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 20 Nov 2021 12:16:42 +0100 Subject: [PATCH 086/145] Delete updater.yml --- .github/workflows/updater.yml | 49 ----------------------------------- 1 file changed, 49 deletions(-) delete mode 100644 .github/workflows/updater.yml diff --git a/.github/workflows/updater.yml b/.github/workflows/updater.yml deleted file mode 100644 index fb72ba0..0000000 --- a/.github/workflows/updater.yml +++ /dev/null @@ -1,49 +0,0 @@ -# This workflow allows GitHub Actions to automagically update your app whenever a new upstream release is detected. -# You need to enable Actions in your repository settings, and fetch this Action from the YunoHost-Apps organization. -# This file should be enough by itself, but feel free to tune it to your needs. -# It calls updater.sh, which is where you should put the app-specific update steps. -name: Check for new upstream releases -on: - # Allow to manually trigger the workflow - workflow_dispatch: - # Run it every day at 6:00 UTC - schedule: - - cron: '0 6 * * *' -jobs: - updater: - runs-on: ubuntu-latest - steps: - - name: Fetch the source code - uses: actions/checkout@v2 - with: - token: ${{ secrets.GITHUB_TOKEN }} - - name: Run the updater script - id: run_updater - run: | - # Setting up Git user - git config --global user.name 'yunohost-bot' - git config --global user.email 'yunohost-bot@users.noreply.github.com' - # Run the updater script - /bin/bash .github/workflows/updater.sh - - name: Commit changes - id: commit - if: ${{ env.PROCEED == 'true' }} - run: | - git commit -am "Upgrade to v$VERSION" - - name: Create Pull Request - id: cpr - if: ${{ env.PROCEED == 'true' }} - uses: peter-evans/create-pull-request@v3 - with: - token: ${{ secrets.GITHUB_TOKEN }} - commit-message: Update to version ${{ env.VERSION }} - committer: 'yunohost-bot ' - author: 'yunohost-bot ' - signoff: false - base: testing - branch: ci-auto-update-v${{ env.VERSION }} - delete-branch: true - title: 'Upgrade to version ${{ env.VERSION }}' - body: | - Upgrade to v${{ env.VERSION }} - draft: false From b54d93053d395bf4f487964a0ddd76117e222b39 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 30 Nov 2021 07:33:42 +0100 Subject: [PATCH 087/145] 4.2.0 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index 02346cc..1108461 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.1.2/download -SOURCE_SUM=a85954b127ed6ad377a8f178b6762262d9ee6ddb8cdd1905a76929e3621cf85b +SOURCE_URL=https://releases.rocket.chat/4.2.0/download +SOURCE_SUM=e051c88a5106dbf3cbb8e693bbba3620d223c5cac2ccf17ee779e51c2f64c283 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 3a6d61c..04d36eb 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.1.2~ynh1", + "version": "4.2.0~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From 421e9bdd262ccb7fdbace2ae8f1d75a98c906e6d Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Tue, 30 Nov 2021 06:33:48 +0000 Subject: [PATCH 088/145] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 07d6655..a674144 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.1.2~ynh1 +**Shipped version:** 4.2.0~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index fc3fba4..0d70f0d 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.1.2~ynh1 +**Version incluse :** 4.2.0~ynh1 **Démo :** https://cloud.rocket.chat/trial From c676d42d23714d26ec389d956ed4a49f6f267dbd Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 6 Dec 2021 21:57:40 +0100 Subject: [PATCH 089/145] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index dd22856..6deff82 100644 --- a/scripts/install +++ b/scripts/install @@ -124,7 +124,7 @@ ynh_script_progression --message="Building $app... (this will take some time and pushd $final_path/programs/server ynh_use_nodejs - ynh_exec_as $app env $ynh_node_load_PATH npm install --unsafe-perm 2>/dev/null + ynh_exec_as $app env $ynh_node_load_PATH $ynh_npm install --unsafe-perm 2>/dev/null popd #================================================= From 1348f3929e8d9043c87c1afabfc54c5809546661 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 7 Dec 2021 14:11:33 +0100 Subject: [PATCH 090/145] Update check_process --- check_process | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check_process b/check_process index cc2fe7c..f767028 100644 --- a/check_process +++ b/check_process @@ -13,7 +13,7 @@ setup_private=1 setup_public=1 upgrade=1 - #upgrade=1 from_commit=CommitHash + upgrade=1 from_commit=f565c082fa1b839326433ad149e32223f7447eec backup_restore=1 multi_instance=1 change_url=1 @@ -21,7 +21,7 @@ Email= Notification=none ;;; Upgrade options - ; commit=CommitHash - name=Name and date of the commit. + ; commit=f565c082fa1b839326433ad149e32223f7447eec + name=Testing (#86) manifest_arg=domain=DOMAIN&path=PATH&admin=USER&is_public=1&password=pass&port=666& \ No newline at end of file From 7fc2361447129a92cc74eeb2acde22facaecc86b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 10 Dec 2021 21:29:37 +0100 Subject: [PATCH 091/145] 4.2.1 (#90) * 4.2.1 --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a674144..e023b1d 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.2.0~ynh1 +**Shipped version:** 4.2.1~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index 0d70f0d..716f0d9 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.2.0~ynh1 +**Version incluse :** 4.2.1~ynh1 **Démo :** https://cloud.rocket.chat/trial diff --git a/conf/app.src b/conf/app.src index 1108461..5053f84 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.2.0/download -SOURCE_SUM=e051c88a5106dbf3cbb8e693bbba3620d223c5cac2ccf17ee779e51c2f64c283 +SOURCE_URL=https://releases.rocket.chat/4.2.1/download +SOURCE_SUM=430047d5b40388e391a58a933815aaa5348a2518be8d12675a08ddb1b9fd389e SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 04d36eb..19ab168 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.2.0~ynh1", + "version": "4.2.1~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From b69f875a3aa061b53c7a5bfd2ab272caed09b766 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 17 Dec 2021 22:50:42 +0100 Subject: [PATCH 092/145] 4.2.2 (#93) * 4.2.2 --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index e023b1d..ffbd7ee 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.2.1~ynh1 +**Shipped version:** 4.2.2~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index 716f0d9..8e0bccc 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.2.1~ynh1 +**Version incluse :** 4.2.2~ynh1 **Démo :** https://cloud.rocket.chat/trial diff --git a/conf/app.src b/conf/app.src index 5053f84..642b95b 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.2.1/download -SOURCE_SUM=430047d5b40388e391a58a933815aaa5348a2518be8d12675a08ddb1b9fd389e +SOURCE_URL=https://releases.rocket.chat/4.2.2/download +SOURCE_SUM=6b96ba7439879c9bad9170dc021132c2fa8d9e2c4f5a5e1865a5e14aa2a74218 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 19ab168..0c7da8a 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.2.1~ynh1", + "version": "4.2.2~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From 74342c2eb3083020d13aefd22b327d9c1d694974 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 29 Dec 2021 16:45:43 +0100 Subject: [PATCH 093/145] 4.3.0 (#96) * 4.3.0 --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- scripts/restore | 3 +-- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ffbd7ee..2335fcf 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.2.2~ynh1 +**Shipped version:** 4.3.0~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index 8e0bccc..da98f03 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.2.2~ynh1 +**Version incluse :** 4.3.0~ynh1 **Démo :** https://cloud.rocket.chat/trial diff --git a/conf/app.src b/conf/app.src index 642b95b..dae8eae 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.2.2/download -SOURCE_SUM=6b96ba7439879c9bad9170dc021132c2fa8d9e2c4f5a5e1865a5e14aa2a74218 +SOURCE_URL=https://releases.rocket.chat/4.3.0/download +SOURCE_SUM=2ef3cbad934c355387aabda74be7adf98c2e3036ad45c3bd227aa426e364c9c9 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 0c7da8a..ab15b06 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.2.2~ynh1", + "version": "4.3.0~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", diff --git a/scripts/restore b/scripts/restore index f801460..67696c2 100644 --- a/scripts/restore +++ b/scripts/restore @@ -37,8 +37,7 @@ db_user=$db_name #================================================= ynh_script_progression --message="Validating restoration parameters..." --weight=1 -test ! -d $final_path \ - || ynh_die --message="There is already a directory: $final_path " +test ! -d $final_path || ynh_die --message="There is already a directory: $final_path " #================================================= # STANDARD RESTORATION STEPS From 1d66424ee7b9080fffd767058da210ca6fe81889 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 8 Jan 2022 07:59:16 +0100 Subject: [PATCH 094/145] 4.3.1 (#99) * fix * Update app.src * Auto-update README Co-authored-by: Yunohost-Bot <> --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2335fcf..f36d5bd 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.3.0~ynh1 +**Shipped version:** 4.3.1~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index da98f03..ef2fa2f 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.3.0~ynh1 +**Version incluse :** 4.3.1~ynh1 **Démo :** https://cloud.rocket.chat/trial diff --git a/conf/app.src b/conf/app.src index dae8eae..e603a87 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.3.0/download -SOURCE_SUM=2ef3cbad934c355387aabda74be7adf98c2e3036ad45c3bd227aa426e364c9c9 +SOURCE_URL=https://releases.rocket.chat/4.3.1/download +SOURCE_SUM=c124fce6f0f519bac92e8fd72ef525f904945ba561c592ec73fa98f010e4e022 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index ab15b06..bab6db5 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.3.0~ynh1", + "version": "4.3.1~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From a598795fc637442bf2b2ad9ecc4f3459e3b49c03 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 8 Jan 2022 09:57:40 +0100 Subject: [PATCH 095/145] =?UTF-8?q?F=C3=A9d=C3=A9ration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/DISCLAIMER.md | 3 +++ doc/DISCLAIMER_fr.md | 3 +++ 2 files changed, 6 insertions(+) diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md index e69de29..88970b3 100644 --- a/doc/DISCLAIMER.md +++ b/doc/DISCLAIMER.md @@ -0,0 +1,3 @@ +### Configure and activate federation for Rocketchat + +https://support.indie.host/help/fr-fr/13/40 \ No newline at end of file diff --git a/doc/DISCLAIMER_fr.md b/doc/DISCLAIMER_fr.md index e69de29..05f5fd6 100644 --- a/doc/DISCLAIMER_fr.md +++ b/doc/DISCLAIMER_fr.md @@ -0,0 +1,3 @@ +### Configurer et activer la fédération pour Rocketchat + +https://support.indie.host/help/fr-fr/13/40 \ No newline at end of file From 895f8b6af9b40ee50cd7a50257ebd52dffc1a9c7 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sat, 8 Jan 2022 08:57:46 +0000 Subject: [PATCH 096/145] Auto-update README --- README.md | 5 +++++ README_fr.md | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/README.md b/README.md index f36d5bd..af16604 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,11 @@ Rocket.Chat is an open-source fully customizable communications platform develop ![](./doc/screenshots/screenshot.jpg) +## Disclaimers / important information + +### Configure and activate federation for Rocketchat + +https://support.indie.host/help/fr-fr/13/40 ## Documentation and resources * Official app website: https://rocket.chat/ diff --git a/README_fr.md b/README_fr.md index ef2fa2f..5523177 100644 --- a/README_fr.md +++ b/README_fr.md @@ -21,6 +21,11 @@ Rocket.Chat est une plate-forme de communication open source entièrement person ![](./doc/screenshots/screenshot.jpg) +## Avertissements / informations importantes + +### Configurer et activer la fédération pour Rocketchat + +https://support.indie.host/help/fr-fr/13/40 ## Documentations et ressources * Site officiel de l'app : https://rocket.chat/ From 986984f9813af8e9537f93bc9c98ef92949edb64 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 14 Jan 2022 10:03:28 +0100 Subject: [PATCH 097/145] Update manifest.json --- manifest.json | 1 + 1 file changed, 1 insertion(+) diff --git a/manifest.json b/manifest.json index bab6db5..a935a34 100644 --- a/manifest.json +++ b/manifest.json @@ -13,6 +13,7 @@ "website": "https://rocket.chat/", "demo": "https://cloud.rocket.chat/trial", "admindoc": "https://docs.rocket.chat/", + "userdoc": "https://docs.rocket.chat/guides/user-guides", "code": "https://github.com/RocketChat/Rocket.Chat" }, "license": "GPL-3.0", From 64cf26ac152afb37ea3335dec3718a6460f99daa Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Fri, 14 Jan 2022 09:03:37 +0000 Subject: [PATCH 098/145] Auto-update README --- README.md | 1 + README_fr.md | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index af16604..1955bde 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ https://support.indie.host/help/fr-fr/13/40 ## Documentation and resources * Official app website: https://rocket.chat/ +* Official user documentation: https://docs.rocket.chat/guides/user-guides * 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 diff --git a/README_fr.md b/README_fr.md index 5523177..72fe139 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,6 +29,7 @@ https://support.indie.host/help/fr-fr/13/40 ## Documentations et ressources * Site officiel de l'app : https://rocket.chat/ +* Documentation officielle utilisateur : https://docs.rocket.chat/guides/user-guides * 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 From ac624215a435248cd2e50f14473560c56cc69418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 21 Jan 2022 21:29:09 +0100 Subject: [PATCH 099/145] 4.3.2 (#101) * 4.3.2 --- README.md | 12 +++++++++++- README_fr.md | 12 +++++++++++- conf/app.src | 4 ++-- doc/DISCLAIMER.md | 11 ++++++++++- doc/DISCLAIMER_fr.md | 11 ++++++++++- manifest.json | 2 +- 6 files changed, 45 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 1955bde..0778eb8 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.3.1~ynh1 +**Shipped version:** 4.3.2~ynh1 **Demo:** https://cloud.rocket.chat/trial @@ -28,9 +28,19 @@ Rocket.Chat is an open-source fully customizable communications platform develop ## Disclaimers / important information +### E-mail Configuration + +To enable E-mail for address verification, go to Rocketchat Administration panel under E-mail -> SMTP and set as follow: + +- Protocole: smtp +- Host: localhost +- Port: 25 +- From -mail: rocketchat@domain.tld + ### Configure and activate federation for Rocketchat https://support.indie.host/help/fr-fr/13/40 + ## Documentation and resources * Official app website: https://rocket.chat/ diff --git a/README_fr.md b/README_fr.md index 72fe139..3aa1614 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.3.1~ynh1 +**Version incluse :** 4.3.2~ynh1 **Démo :** https://cloud.rocket.chat/trial @@ -23,9 +23,19 @@ Rocket.Chat est une plate-forme de communication open source entièrement person ## Avertissements / informations importantes +### Configuration de l'e-mail + +Pour activer l'e-mail pour la vérification des adresses, accédez au panneau d'administration de Rocketchat sous E-mail -> SMTP et définissez comme suit : + +- Protocole: smtp +- Hôte: localhost +- Port: 25 +- De l'e-mail: rocketchat@domain.tld + ### Configurer et activer la fédération pour Rocketchat https://support.indie.host/help/fr-fr/13/40 + ## Documentations et ressources * Site officiel de l'app : https://rocket.chat/ diff --git a/conf/app.src b/conf/app.src index e603a87..f182000 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.3.1/download -SOURCE_SUM=c124fce6f0f519bac92e8fd72ef525f904945ba561c592ec73fa98f010e4e022 +SOURCE_URL=https://releases.rocket.chat/4.3.2/download +SOURCE_SUM=b3861e26b8c36637fb2f77b6ba4e0de1c2fe290c50e05850b024ffac154c8753 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md index 88970b3..176165f 100644 --- a/doc/DISCLAIMER.md +++ b/doc/DISCLAIMER.md @@ -1,3 +1,12 @@ +### E-mail Configuration + +To enable E-mail for address verification, go to Rocketchat Administration panel under E-mail -> SMTP and set as follow: + +- Protocole: smtp +- Host: localhost +- Port: 25 +- From -mail: rocketchat@domain.tld + ### Configure and activate federation for Rocketchat -https://support.indie.host/help/fr-fr/13/40 \ No newline at end of file +https://support.indie.host/help/fr-fr/13/40 diff --git a/doc/DISCLAIMER_fr.md b/doc/DISCLAIMER_fr.md index 05f5fd6..3932c76 100644 --- a/doc/DISCLAIMER_fr.md +++ b/doc/DISCLAIMER_fr.md @@ -1,3 +1,12 @@ +### Configuration de l'e-mail + +Pour activer l'e-mail pour la vérification des adresses, accédez au panneau d'administration de Rocketchat sous E-mail -> SMTP et définissez comme suit : + +- Protocole: smtp +- Hôte: localhost +- Port: 25 +- De l'e-mail: rocketchat@domain.tld + ### Configurer et activer la fédération pour Rocketchat -https://support.indie.host/help/fr-fr/13/40 \ No newline at end of file +https://support.indie.host/help/fr-fr/13/40 diff --git a/manifest.json b/manifest.json index a935a34..cb5d5b1 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.3.1~ynh1", + "version": "4.3.2~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From 7e7d04597ad5e21da512c2e2c4cbac4ba5999f6e Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 30 Jan 2022 00:02:31 +0100 Subject: [PATCH 100/145] Update _common.sh --- scripts/_common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index bbf1cfe..3644475 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -4,7 +4,7 @@ # COMMON VARIABLES #================================================= -nodejs_version=12 +nodejs_version=14 # dependencies used by the app pkg_dependencies="apt-transport-https build-essential gzip curl fontconfig graphicsmagick" From b79cce0b2e5581da0ac1e7abba68c4e68d16326a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 30 Jan 2022 00:09:56 +0100 Subject: [PATCH 101/145] 4.4.0 (#103) * 4.4.0 * Auto-update README Co-authored-by: Yunohost-Bot <> --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 0778eb8..ae74534 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.3.2~ynh1 +**Shipped version:** 4.4.0~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index 3aa1614..d469a92 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.3.2~ynh1 +**Version incluse :** 4.4.0~ynh1 **Démo :** https://cloud.rocket.chat/trial diff --git a/conf/app.src b/conf/app.src index f182000..574d04d 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.3.2/download -SOURCE_SUM=b3861e26b8c36637fb2f77b6ba4e0de1c2fe290c50e05850b024ffac154c8753 +SOURCE_URL=https://releases.rocket.chat/4.4.0/download +SOURCE_SUM=0f775671ffd3c49430ced29e28c079531041b16152c02766bc91b339352ac14c SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index cb5d5b1..06ae1bc 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.3.2~ynh1", + "version": "4.4.0~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From c5a13616bde8d1e18b534e0afe00bc4357ccc4e5 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 30 Jan 2022 10:37:53 +0100 Subject: [PATCH 102/145] Fix linter --- manifest.json | 14 +++++++++----- scripts/change_url | 4 ++-- scripts/install | 9 ++++----- scripts/remove | 2 +- scripts/restore | 6 +++--- scripts/upgrade | 13 ++++++------- 6 files changed, 25 insertions(+), 23 deletions(-) diff --git a/manifest.json b/manifest.json index 06ae1bc..1be650c 100644 --- a/manifest.json +++ b/manifest.json @@ -44,14 +44,18 @@ "name": "admin", "type": "user" }, - { - "name": "is_public", - "type": "boolean", - "default": true - }, { "name": "password", "type": "password" + }, + { + "name": "is_public", + "type": "boolean", + "help": { + "en": "If enabled, RocketChat will be accessible by people who do not have an account. This can be changed later via the webadmin.", + "fr": "Si cette case est cochée, RocketChat sera accessible aux personnes n’ayant pas de compte. Vous pourrez changer ceci plus tard via la webadmin." + }, + "default": true } ] } diff --git a/scripts/change_url b/scripts/change_url index 538ca2b..76b4138 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -70,7 +70,7 @@ fi #================================================= ynh_script_progression --message="Stopping a systemd service..." --weight=1 -ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log" +ynh_systemd_action --service_name=$app --action="stop" --log_path="systemd" #================================================= # MODIFY URL IN NGINX CONF @@ -108,7 +108,7 @@ fi #================================================= 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" +ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" #================================================= # RELOAD NGINX diff --git a/scripts/install b/scripts/install index 6deff82..b416a64 100644 --- a/scripts/install +++ b/scripts/install @@ -132,8 +132,7 @@ popd #================================================= 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" - +env_path="$PATH" ynh_add_systemd_config #================================================= @@ -175,15 +174,15 @@ ynh_script_progression --message="Starting a MongoDB service..." --weight=2 # Start a mongod service ynh_exec_warn_less systemctl enable $mongodb_servicename --quiet -ynh_systemd_action --service_name=$mongodb_servicename --action=restart +ynh_systemd_action --service_name=$mongodb_servicename --action="restart" #================================================= # START SYSTEMD SERVICE #================================================= ynh_script_progression --message="Starting a systemd service..." --weight=2 -ynh_systemd_action --service_name=$app --action=start --log_path=systemd -sleep 100 +ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" +sleep 60 #================================================= # SETUP SSOWAT diff --git a/scripts/remove b/scripts/remove index 3e8bd12..8c4db16 100644 --- a/scripts/remove +++ b/scripts/remove @@ -86,7 +86,7 @@ fi #================================================= ynh_script_progression --message="Removing NGINX web server configuration..." --weight=1 -# Remove the dedicated nginx config +# Remove the dedicated NGINX config ynh_remove_nginx_config #================================================= diff --git a/scripts/restore b/scripts/restore index 67696c2..8162414 100644 --- a/scripts/restore +++ b/scripts/restore @@ -132,15 +132,15 @@ ynh_script_progression --message="Starting a MongoDB service..." --weight=2 # Start a mongod service ynh_exec_warn_less systemctl enable $mongodb_servicename --quiet -ynh_systemd_action --service_name=$mongodb_servicename --action=restart +ynh_systemd_action --service_name=$mongodb_servicename --action="restart" #================================================= # START SYSTEMD SERVICE #================================================= ynh_script_progression --message="Starting a systemd service..." --weight=5 -ynh_systemd_action --service_name=$app --action="start" --log_path=systemd -sleep 120 +ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" +sleep 60 #================================================= # GENERIC FINALIZATION diff --git a/scripts/upgrade b/scripts/upgrade index 2e10976..28e37e6 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -71,7 +71,7 @@ fi #================================================= ynh_script_progression --message="Stopping a systemd service..." --weight=1 -ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log" +ynh_systemd_action --service_name=$app --action="stop" --log_path="systemd" #================================================= # CREATE DEDICATED USER @@ -130,8 +130,7 @@ popd #================================================= ynh_script_progression --message="Upgrading systemd configuration..." --weight=2 -ynh_replace_string --match_string="__ENV_PATH__" --replace_string="$PATH" --target_file="../conf/systemd.service" - +env_path="$PATH" # Create a dedicated systemd config ynh_add_systemd_config @@ -144,7 +143,7 @@ sed -i "s/^# engine:/ engine: wiredTiger/" /etc/mongod.conf sed -i "s/^#replication:/replication:\n replSetName: rs01/" /etc/mongod.conf ynh_exec_warn_less systemctl enable $mongodb_servicename --quiet -ynh_systemd_action --service_name=$mongodb_servicename --action=restart +ynh_systemd_action --service_name=$mongodb_servicename --action="restart" sleep 10 @@ -170,9 +169,9 @@ yunohost service add $app --description="Team collaboration communication platfo #================================================= ynh_script_progression --message="Starting a systemd service..." --weight=10 -ynh_systemd_action --service_name=$mongodb_servicename --action=restart --log_path=systemd -ynh_systemd_action --service_name=$app --action=start --log_path=systemd -sleep 100 +ynh_systemd_action --service_name=$mongodb_servicename --action="restart" --log_path="systemd" +ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" +sleep 60 #================================================= # RELOAD NGINX From 1888085cffafe55a50a896134316debd94ac3404 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 1 Mar 2022 07:34:16 +0100 Subject: [PATCH 103/145] 4.5.0 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index 574d04d..c77ab8b 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.4.0/download -SOURCE_SUM=0f775671ffd3c49430ced29e28c079531041b16152c02766bc91b339352ac14c +SOURCE_URL=https://releases.rocket.chat/4.5.0/download +SOURCE_SUM=d0eaf809a4659766a19dc841fa7f0bcad45bbc001040d091212c769b5367a007 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 1be650c..f943ec6 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.4.0~ynh1", + "version": "4.5.0~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From 048aeb4e8998f4510561385c3c3601f2f479af37 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Tue, 1 Mar 2022 06:34:24 +0000 Subject: [PATCH 104/145] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ae74534..9b862e6 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.4.0~ynh1 +**Shipped version:** 4.5.0~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index d469a92..51d3607 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.4.0~ynh1 +**Version incluse :** 4.5.0~ynh1 **Démo :** https://cloud.rocket.chat/trial From a43ceec686fa15dc65467bdd21e74e8bdda74ed6 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 21 Mar 2022 23:49:48 +0100 Subject: [PATCH 105/145] Update manifest.json --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index f943ec6..3628abd 100644 --- a/manifest.json +++ b/manifest.json @@ -18,7 +18,7 @@ }, "license": "GPL-3.0", "maintainer": { - "name": "", + "name": "eric_G", "email": "" }, "multi_instance": true, From 144c1eb3ed939493939e72e94271caabc7a46c05 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 22 Mar 2022 06:57:10 +0100 Subject: [PATCH 106/145] 4.5.3 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index c77ab8b..6cf1e57 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.5.0/download -SOURCE_SUM=d0eaf809a4659766a19dc841fa7f0bcad45bbc001040d091212c769b5367a007 +SOURCE_URL=https://releases.rocket.chat/4.5.3/download +SOURCE_SUM=62ee447a14e52fdbdd6003a0de81ee438e810f43633b3fb3df56e657cb9b4ec5 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 3628abd..67d3d27 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.5.0~ynh1", + "version": "4.5.3~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From 6b0970d2231f2ba09501392e90b76681e1db3f7e Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 22 Mar 2022 05:57:18 +0000 Subject: [PATCH 107/145] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9b862e6..bd9170e 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.5.0~ynh1 +**Shipped version:** 4.5.3~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index 51d3607..649af98 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.5.0~ynh1 +**Version incluse :** 4.5.3~ynh1 **Démo :** https://cloud.rocket.chat/trial From cc2034f97047ba0a959ee67b49991babb2793c2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 22 Mar 2022 22:21:23 +0100 Subject: [PATCH 108/145] Update remove (#106) --- scripts/remove | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/scripts/remove b/scripts/remove index 8c4db16..1c9299b 100644 --- a/scripts/remove +++ b/scripts/remove @@ -35,6 +35,12 @@ then yunohost service remove $app fi +if ynh_exec_warn_less yunohost service status "$mongodb_servicename" >/dev/null +then + ynh_script_progression --message="Removing $mongodb_servicename service integration..." + yunohost service remove "$mongodb_servicename" +fi + #================================================= # STOP AND REMOVE SERVICE #================================================= @@ -42,6 +48,7 @@ ynh_script_progression --message="Stopping and removing the systemd service..." # Remove the dedicated systemd config ynh_remove_systemd_config +ynh_remove_systemd_config --service=$mongodb_servicename #================================================= # REMOVE LOGROTATE CONFIGURATION From 1496462f3299a6370b5e049d1ed42a0525542b1b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 25 Mar 2022 09:08:20 +0100 Subject: [PATCH 109/145] 4.5.4 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index 6cf1e57..00bd076 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.5.3/download -SOURCE_SUM=62ee447a14e52fdbdd6003a0de81ee438e810f43633b3fb3df56e657cb9b4ec5 +SOURCE_URL=https://releases.rocket.chat/4.5.4/download +SOURCE_SUM=bba7e1c8df36261e7533d464b061c585f15a90b7f2fdc4c12905e50d2288fbff SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 67d3d27..b844907 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.5.3~ynh1", + "version": "4.5.4~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From 6d780eca0157cc0581230eb89e792664d7eeb897 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Fri, 25 Mar 2022 08:08:27 +0000 Subject: [PATCH 110/145] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bd9170e..264cf86 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.5.3~ynh1 +**Shipped version:** 4.5.4~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index 649af98..7d95946 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.5.3~ynh1 +**Version incluse :** 4.5.4~ynh1 **Démo :** https://cloud.rocket.chat/trial From fd4668b71a11b691f47de760cda4e9aecfe69fd8 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Fri, 25 Mar 2022 08:09:35 +0000 Subject: [PATCH 111/145] Auto-update README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9d52fcf..264cf86 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. + **Shipped version:** 4.5.4~ynh1 **Demo:** https://cloud.rocket.chat/trial From a24bdd32409ed2264fadd9b76cfdcaf585b084cc Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 31 Mar 2022 08:22:43 +0200 Subject: [PATCH 112/145] 4.5.5 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index 00bd076..e346bc7 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.5.4/download -SOURCE_SUM=bba7e1c8df36261e7533d464b061c585f15a90b7f2fdc4c12905e50d2288fbff +SOURCE_URL=https://releases.rocket.chat/4.5.5/download +SOURCE_SUM=c0b32b731558a3b400896c38080c75a1a9b68958cd46fa09b9c2292728ec98cd SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index b844907..0f6437e 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.5.4~ynh1", + "version": "4.5.5~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From f391b817474ee8f8a63ac370171cabfee2fce88a Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 31 Mar 2022 06:23:03 +0000 Subject: [PATCH 113/145] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 264cf86..7a76b1d 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.5.4~ynh1 +**Shipped version:** 4.5.5~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index 7d95946..35043b3 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.5.4~ynh1 +**Version incluse :** 4.5.5~ynh1 **Démo :** https://cloud.rocket.chat/trial From e94ad70ffe0b92459a6bf9929bb328a52878fe9d Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 1 Apr 2022 22:22:22 +0200 Subject: [PATCH 114/145] 4.6.0 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index e346bc7..81e1d7c 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.5.5/download -SOURCE_SUM=c0b32b731558a3b400896c38080c75a1a9b68958cd46fa09b9c2292728ec98cd +SOURCE_URL=https://releases.rocket.chat/4.6.0/download +SOURCE_SUM=c88c69445a33c97afc6aee9d5fb02e9224db320d8a9734fd21a9d766f9abe208 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 0f6437e..36dc63a 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.5.5~ynh1", + "version": "4.6.0~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From 4d018dd34113a36ded18b06d86e0795c93abeac3 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Fri, 1 Apr 2022 20:22:31 +0000 Subject: [PATCH 115/145] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7a76b1d..65f5446 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.5.5~ynh1 +**Shipped version:** 4.6.0~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index 35043b3..eeb1879 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.5.5~ynh1 +**Version incluse :** 4.6.0~ynh1 **Démo :** https://cloud.rocket.chat/trial From d86e0b14c8fcfefcdce8b71754ed6b79ede702c5 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 7 Apr 2022 19:20:02 +0200 Subject: [PATCH 116/145] 4.6.1 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index 81e1d7c..c2d62a2 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.6.0/download -SOURCE_SUM=c88c69445a33c97afc6aee9d5fb02e9224db320d8a9734fd21a9d766f9abe208 +SOURCE_URL=https://releases.rocket.chat/4.6.1/download +SOURCE_SUM=b689d6797ac02b6dd48521810406dc7fb072ce23d262c38452e71ca500ed5ac3 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 36dc63a..f8b8410 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.6.0~ynh1", + "version": "4.6.1~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From 5865c91473afd8e242ca6393f14294b4774ae447 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 7 Apr 2022 17:20:17 +0000 Subject: [PATCH 117/145] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 65f5446..867b87b 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.6.0~ynh1 +**Shipped version:** 4.6.1~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index eeb1879..12f77bb 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.6.0~ynh1 +**Version incluse :** 4.6.1~ynh1 **Démo :** https://cloud.rocket.chat/trial From 76690fa1d747ec277a4af65c83a5b3c58588f25a Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 14 Apr 2022 21:29:29 +0200 Subject: [PATCH 118/145] 4.6.2 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index c2d62a2..d0004fa 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.6.1/download -SOURCE_SUM=b689d6797ac02b6dd48521810406dc7fb072ce23d262c38452e71ca500ed5ac3 +SOURCE_URL=https://releases.rocket.chat/4.6.2/download +SOURCE_SUM=f2b5eb4cc6f0a9bf3255c3699a4911c62d09f7af1d924d1209d6237a599593d8 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index f8b8410..efc7812 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.6.1~ynh1", + "version": "4.6.2~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From a3e02e107e549c8fa73042acb800f2cadb61a4af Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 14 Apr 2022 19:29:39 +0000 Subject: [PATCH 119/145] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 867b87b..cbfd802 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.6.1~ynh1 +**Shipped version:** 4.6.2~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index 12f77bb..7914c59 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.6.1~ynh1 +**Version incluse :** 4.6.2~ynh1 **Démo :** https://cloud.rocket.chat/trial From 73c226fafd65a0377b1a9127fb3bc8942ca08ec4 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 20 Apr 2022 07:02:38 +0200 Subject: [PATCH 120/145] 4.6.3 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index d0004fa..75ee45f 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.6.2/download -SOURCE_SUM=f2b5eb4cc6f0a9bf3255c3699a4911c62d09f7af1d924d1209d6237a599593d8 +SOURCE_URL=https://releases.rocket.chat/4.6.3/download +SOURCE_SUM=a85a71811a488c155eaf4a15d1508bd5d81ee01954e0c14c6e814659491c7b38 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index efc7812..7bb2070 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.6.2~ynh1", + "version": "4.6.3~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From 26ec45d7e8ad9002fc3e4a3fec9ba96e775f70c7 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 20 Apr 2022 05:02:45 +0000 Subject: [PATCH 121/145] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cbfd802..a3c2dd1 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.6.2~ynh1 +**Shipped version:** 4.6.3~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index 7914c59..907cab2 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.6.2~ynh1 +**Version incluse :** 4.6.3~ynh1 **Démo :** https://cloud.rocket.chat/trial From 95e05a1185f27901f5f396504f38264c7d26ab08 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 21 Apr 2022 09:11:54 +0200 Subject: [PATCH 122/145] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index b416a64..8701932 100644 --- a/scripts/install +++ b/scripts/install @@ -51,7 +51,7 @@ ynh_script_progression --message="Storing installation settings..." --weight=2 ynh_app_setting_set --app=$app --key=domain --value=$domain ynh_app_setting_set --app=$app --key=path --value=$path_url ynh_app_setting_set --app=$app --key=admin --value=$admin -ynh_app_setting_set --app=$app --key=password --value=$password +ynh_app_setting_set --app=$app --key=password --value="$password" ynh_app_setting_set --app=$app --key=email --value=$email #================================================= From b64075eab9e59690d72a03ca4dd4335f05fa2134 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 21 Apr 2022 09:12:56 +0200 Subject: [PATCH 123/145] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 8701932..36b4392 100644 --- a/scripts/install +++ b/scripts/install @@ -112,7 +112,7 @@ chown -R $app:$app "$final_path" #================================================= ynh_script_progression --message="Configuring NGINX web server..." --weight=2 -# Create a dedicated nginx config +# Create a dedicated NGINX config ynh_add_nginx_config #================================================= From a8ad5e7877eff1025f72403f822b343cf37336d4 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 4 May 2022 18:58:28 +0200 Subject: [PATCH 124/145] 4.7.0 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index 75ee45f..ad7f83b 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.6.3/download -SOURCE_SUM=a85a71811a488c155eaf4a15d1508bd5d81ee01954e0c14c6e814659491c7b38 +SOURCE_URL=https://releases.rocket.chat/4.7.0/download +SOURCE_SUM=fb280c61e78e79c0a666428a59fde74902d25f33b78a82078723cd373712b87b SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 7bb2070..7070398 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.6.3~ynh1", + "version": "4.7.0~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From 0d61c1bb93c07faf66b6bda99929a7ad8d7a6353 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 4 May 2022 16:58:40 +0000 Subject: [PATCH 125/145] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a3c2dd1..1e5ddcd 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.6.3~ynh1 +**Shipped version:** 4.7.0~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index 907cab2..a4b9178 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.6.3~ynh1 +**Version incluse :** 4.7.0~ynh1 **Démo :** https://cloud.rocket.chat/trial From a0047c7ca1bdeb62085115a476b2ea07270b5be7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 14 May 2022 18:14:33 +0200 Subject: [PATCH 126/145] 4.7.1 (#114) * 4.7.1 * Auto-update README * Update app.src Co-authored-by: yunohost-bot --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1e5ddcd..07fa23f 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.7.0~ynh1 +**Shipped version:** 4.7.1~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index a4b9178..fe5c0ea 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.7.0~ynh1 +**Version incluse :** 4.7.1~ynh1 **Démo :** https://cloud.rocket.chat/trial diff --git a/conf/app.src b/conf/app.src index ad7f83b..ca59bed 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.7.0/download -SOURCE_SUM=fb280c61e78e79c0a666428a59fde74902d25f33b78a82078723cd373712b87b +SOURCE_URL=https://releases.rocket.chat/4.7.1/download +SOURCE_SUM=457145954a4e542a5a839223c1724640b8d329f30c3318443f5301afdb7c5b6c SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 7070398..0e8b42a 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.7.0~ynh1", + "version": "4.7.1~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From 81c303f127d4f24c78914df2fd18bffc484270cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 22 May 2022 08:04:13 +0200 Subject: [PATCH 127/145] 4.7.2 (#116) * 4.7.2 * Auto-update README * Update app.src Co-authored-by: yunohost-bot --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 07fa23f..caf21f7 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.7.1~ynh1 +**Shipped version:** 4.7.2~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index fe5c0ea..2f64c66 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.7.1~ynh1 +**Version incluse :** 4.7.2~ynh1 **Démo :** https://cloud.rocket.chat/trial diff --git a/conf/app.src b/conf/app.src index ca59bed..dd3c011 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.7.1/download -SOURCE_SUM=457145954a4e542a5a839223c1724640b8d329f30c3318443f5301afdb7c5b6c +SOURCE_URL=https://releases.rocket.chat/4.7.2/download +SOURCE_SUM=3345b6815a59635a373b0356bac5156f9f897a2227c12efcf56d3976559328f2 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 0e8b42a..25154fa 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.7.1~ynh1", + "version": "4.7.2~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From 6e6fe6f636f1021b340d93326d713bec3ee84215 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 26 May 2022 21:15:27 +0000 Subject: [PATCH 128/145] Auto-update README --- README.md | 21 +++++++++++---------- README_fr.md | 27 ++++++++++++++++----------- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index caf21f7..ca3ab19 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ It shall NOT be edited by hand. # RocketChat for YunoHost -[![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) +[![Integration level](https://dash.yunohost.org/integration/rocketchat.svg)](https://dash.yunohost.org/appci/app/rocketchat) ![Working status](https://ci-apps.yunohost.org/ci/badges/rocketchat.status.svg) ![Maintenance status](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) *[Lire ce readme en français.](./README_fr.md)* @@ -24,7 +24,7 @@ Rocket.Chat is an open-source fully customizable communications platform develop ## Screenshots -![](./doc/screenshots/screenshot.jpg) +![Screenshot of RocketChat](./doc/screenshots/screenshot.jpg) ## Disclaimers / important information @@ -43,22 +43,23 @@ https://support.indie.host/help/fr-fr/13/40 ## Documentation and resources -* Official app website: https://rocket.chat/ -* Official user documentation: https://docs.rocket.chat/guides/user-guides -* 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 +* Official app website: +* Official user documentation: +* Official admin documentation: +* Upstream app code repository: +* YunoHost documentation for this app: +* Report a bug: ## 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. -``` + +``` bash 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 +**More info regarding app packaging:** diff --git a/README_fr.md b/README_fr.md index 2f64c66..4ab5a09 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,10 +1,14 @@ + + # 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) +[![Niveau d'intégration](https://dash.yunohost.org/integration/rocketchat.svg)](https://dash.yunohost.org/appci/app/rocketchat) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/rocketchat.status.svg) ![Statut de maintenance](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.* @@ -19,7 +23,7 @@ Rocket.Chat est une plate-forme de communication open source entièrement person ## Captures d'écran -![](./doc/screenshots/screenshot.jpg) +![Capture d'écran de RocketChat](./doc/screenshots/screenshot.jpg) ## Avertissements / informations importantes @@ -38,22 +42,23 @@ https://support.indie.host/help/fr-fr/13/40 ## Documentations et ressources -* Site officiel de l'app : https://rocket.chat/ -* Documentation officielle utilisateur : https://docs.rocket.chat/guides/user-guides -* 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 +* Site officiel de l'app : +* Documentation officielle utilisateur : +* Documentation officielle de l'admin : +* Dépôt de code officiel de l'app : +* Documentation YunoHost pour cette app : +* Signaler un bug : ## 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. -``` + +``` bash 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 +**Plus d'infos sur le packaging d'applications :** From cff58d71f6fa0d740b626c9a9400264bb6302fd5 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 29 May 2022 22:52:44 +0200 Subject: [PATCH 129/145] Update app.src --- conf/app.src | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/app.src b/conf/app.src index dd3c011..2ca52e9 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ SOURCE_URL=https://releases.rocket.chat/4.7.2/download -SOURCE_SUM=3345b6815a59635a373b0356bac5156f9f897a2227c12efcf56d3976559328f2 +SOURCE_SUM=5d4efecc112932d7214cb0ffbf74531cb778a4d5d17764e6dd42d2de6137e6b2 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true From 4311072d490ddc21d61c56bc726f34447d082163 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 29 May 2022 22:53:15 +0200 Subject: [PATCH 130/145] Update manifest.json --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 25154fa..c6c0c0f 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.7.2~ynh1", + "version": "4.7.2~ynh2", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From cc6403271b2d795cae263367b89fa87fbcdf60d0 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sun, 29 May 2022 20:53:23 +0000 Subject: [PATCH 131/145] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ca3ab19..0abb410 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.7.2~ynh1 +**Shipped version:** 4.7.2~ynh2 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index 4ab5a09..6dcfb90 100644 --- a/README_fr.md +++ b/README_fr.md @@ -17,7 +17,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.7.2~ynh1 +**Version incluse :** 4.7.2~ynh2 **Démo :** https://cloud.rocket.chat/trial From 3d2b968c0bcc10e2f8d665f2314b41aec9fc8a9c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 31 May 2022 08:49:38 +0200 Subject: [PATCH 132/145] 4.7.4 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index 2ca52e9..e4c233a 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.7.2/download -SOURCE_SUM=5d4efecc112932d7214cb0ffbf74531cb778a4d5d17764e6dd42d2de6137e6b2 +SOURCE_URL=https://releases.rocket.chat/4.7.4/download +SOURCE_SUM=bc479348499e86beb4ea6a681ddc5bd6fdb77f0c16bd69bb5aef13779a1b0e73 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index c6c0c0f..364050a 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.7.2~ynh2", + "version": "4.7.4~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From acd9ce9556183eec5b059874d89301f733e217e1 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 31 May 2022 06:49:46 +0000 Subject: [PATCH 133/145] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0abb410..0f8e336 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.7.2~ynh2 +**Shipped version:** 4.7.4~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index 6dcfb90..924c0d7 100644 --- a/README_fr.md +++ b/README_fr.md @@ -17,7 +17,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.7.2~ynh2 +**Version incluse :** 4.7.4~ynh1 **Démo :** https://cloud.rocket.chat/trial From 0c16da3ac55fff32afc528ff0faf45f7ae7f470b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 1 Jun 2022 08:31:57 +0200 Subject: [PATCH 134/145] Matrix (#120) * Update nginx.conf * 4.8.0 * Auto-update README Co-authored-by: yunohost-bot --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- conf/nginx.conf | 16 ++++++++++++---- manifest.json | 2 +- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 0f8e336..1edba31 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.7.4~ynh1 +**Shipped version:** 4.8.0~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index 924c0d7..2775700 100644 --- a/README_fr.md +++ b/README_fr.md @@ -17,7 +17,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.7.4~ynh1 +**Version incluse :** 4.8.0~ynh1 **Démo :** https://cloud.rocket.chat/trial diff --git a/conf/app.src b/conf/app.src index e4c233a..08219df 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.7.4/download -SOURCE_SUM=bc479348499e86beb4ea6a681ddc5bd6fdb77f0c16bd69bb5aef13779a1b0e73 +SOURCE_URL=https://releases.rocket.chat/4.8.0/download +SOURCE_SUM=4deda560c2451dd822931444ec5bac906ed83f242e1f590f66c0e873a1dd7961 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/conf/nginx.conf b/conf/nginx.conf index e5ac8f3..c187424 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -12,8 +12,16 @@ location ^~ __PATH__/ { proxy_http_version 1.1; proxy_set_header Connection "upgrade"; proxy_set_header Upgrade $http_upgrade; - - # Include SSOWAT user panel. - include conf.d/yunohost_panel.conf.inc; - more_clear_input_headers 'Accept-Encoding'; } + +#https://geekgonecrazy.com/2022/05/30/rocketchat-and-the-matrix-protocol/ +location /.well-known/matrix/ { + + proxy_pass http://127.0.0.1:8008; + 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; +} \ No newline at end of file diff --git a/manifest.json b/manifest.json index 364050a..ff7b4b9 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.7.4~ynh1", + "version": "4.8.0~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From ab5deeb858e6dc0a04ced96739491df7ed9e2213 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 10 Jun 2022 10:05:04 +0200 Subject: [PATCH 135/145] 4.8.1 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index 08219df..86ed495 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://releases.rocket.chat/4.8.0/download -SOURCE_SUM=4deda560c2451dd822931444ec5bac906ed83f242e1f590f66c0e873a1dd7961 +SOURCE_URL=https://releases.rocket.chat/4.8.1/download +SOURCE_SUM=8f4d16858e5ac4ef0a92b9ac0a9d30172e3ce80a1f598597cd5b714c36db4a27 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index ff7b4b9..a7916c4 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.8.0~ynh1", + "version": "4.8.1~ynh1", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From 06d9c71c5188eaf52efc9b7fbf3498411faa7e3f Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Fri, 10 Jun 2022 08:05:12 +0000 Subject: [PATCH 136/145] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1edba31..de3ad6c 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. -**Shipped version:** 4.8.0~ynh1 +**Shipped version:** 4.8.1~ynh1 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index 2775700..65bfe3f 100644 --- a/README_fr.md +++ b/README_fr.md @@ -17,7 +17,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. -**Version incluse :** 4.8.0~ynh1 +**Version incluse :** 4.8.1~ynh1 **Démo :** https://cloud.rocket.chat/trial From eb1429e979c8e5f2be53a001c28e100c90968b02 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 11 Jun 2022 10:07:03 +0200 Subject: [PATCH 137/145] remove env_path --- conf/systemd.service | 4 ++-- scripts/install | 2 +- scripts/upgrade | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/conf/systemd.service b/conf/systemd.service index 1e5b3bb..2767e22 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -6,9 +6,9 @@ After=network.target remote-fs.target nss-lookup.target nginx.service __MONGODB_ [Service] User=__APP__ Group=__APP__ -WorkingDirectory=__FINALPATH__ -Environment="PATH=__ENV_PATH__" Environment="NODE_ENV=production" +WorkingDirectory=__FINALPATH__/ +Environment="__YNH_NODE_LOAD_PATH__" ExecStart=__YNH_NODE__ __FINALPATH__/main.js StandardOutput=syslog StandardError=syslog diff --git a/scripts/install b/scripts/install index 36b4392..de4b421 100644 --- a/scripts/install +++ b/scripts/install @@ -132,7 +132,7 @@ popd #================================================= ynh_script_progression --message="Configuring a systemd service..." --weight=1 -env_path="$PATH" +# Create a dedicated systemd config ynh_add_systemd_config #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 28e37e6..5c20a5b 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -130,7 +130,6 @@ popd #================================================= ynh_script_progression --message="Upgrading systemd configuration..." --weight=2 -env_path="$PATH" # Create a dedicated systemd config ynh_add_systemd_config From eb5bebe0e258f384280d34ea7f02b4cd1743625f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 13 Jun 2022 09:13:12 +0200 Subject: [PATCH 138/145] Update check_process --- check_process | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/check_process b/check_process index f767028..bdf0be3 100644 --- a/check_process +++ b/check_process @@ -13,7 +13,8 @@ setup_private=1 setup_public=1 upgrade=1 - upgrade=1 from_commit=f565c082fa1b839326433ad149e32223f7447eec + #4.7.2~ynh2 + upgrade=1 from_commit=9280c034e8843e7e69622f0daa02ee74c916faa1 backup_restore=1 multi_instance=1 change_url=1 @@ -21,7 +22,7 @@ Email= Notification=none ;;; Upgrade options - ; commit=f565c082fa1b839326433ad149e32223f7447eec - name=Testing (#86) + ; commit=9280c034e8843e7e69622f0daa02ee74c916faa1 + name=Testing (#118) manifest_arg=domain=DOMAIN&path=PATH&admin=USER&is_public=1&password=pass&port=666& \ No newline at end of file From 2fc82928c5a8d60fa4d56ad455035bd9de61d9d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 28 Jun 2022 10:03:42 +0200 Subject: [PATCH 139/145] Add features in README --- doc/DESCRIPTION.md | 9 +++++++++ manifest.json | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md index 9fdc029..0370b47 100644 --- a/doc/DESCRIPTION.md +++ b/doc/DESCRIPTION.md @@ -1 +1,10 @@ Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. + +### Features + +- End to End Encryption +- LDAP/Active Directory +- Multifactor Authentication +- Customizable User Permission +- Mobile Apps for [iOS](https://apps.apple.com/app/rocket-chat/id1148741252) and [Android](https://play.google.com/store/apps/details?id=chat.rocket.android) +- Desktop Apps for [macOS](https://apps.apple.com/br/app/rocket-chat/id1086818840), [Linux](https://snapcraft.io/rocketchat-desktop) and [Windows](https://releases.rocket.chat/desktop/latest/download) \ No newline at end of file diff --git a/manifest.json b/manifest.json index a7916c4..6b63f85 100644 --- a/manifest.json +++ b/manifest.json @@ -1,5 +1,5 @@ { - "name": "RocketChat", + "name": "Rocket.Chat", "id": "rocketchat", "packaging_format": 1, "description": { From 13bfba9f6627b304b5cc0583f811a62ae205d6ba Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 28 Jun 2022 08:03:50 +0000 Subject: [PATCH 140/145] Auto-update README --- README.md | 16 ++++++++++++---- README_fr.md | 8 ++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index de3ad6c..8f4fe74 100644 --- a/README.md +++ b/README.md @@ -3,20 +3,28 @@ N.B.: This README was automatically generated by https://github.com/YunoHost/app It shall NOT be edited by hand. --> -# RocketChat for YunoHost +# Rocket.Chat for YunoHost [![Integration level](https://dash.yunohost.org/integration/rocketchat.svg)](https://dash.yunohost.org/appci/app/rocketchat) ![Working status](https://ci-apps.yunohost.org/ci/badges/rocketchat.status.svg) ![Maintenance status](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 Rocket.Chat with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=rocketchat) *[Lire ce readme en français.](./README_fr.md)* -> *This package allows you to install RocketChat quickly and simply on a YunoHost server. +> *This package allows you to install Rocket.Chat 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.* ## Overview Rocket.Chat is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection. +### Features + +- End to End Encryption +- LDAP/Active Directory +- Multifactor Authentication +- Customizable User Permission +- Mobile Apps for [iOS](https://apps.apple.com/app/rocket-chat/id1148741252) and [Android](https://play.google.com/store/apps/details?id=chat.rocket.android) +- Desktop Apps for [macOS](https://apps.apple.com/br/app/rocket-chat/id1086818840), [Linux](https://snapcraft.io/rocketchat-desktop) and [Windows](https://releases.rocket.chat/desktop/latest/download) **Shipped version:** 4.8.1~ynh1 @@ -24,7 +32,7 @@ Rocket.Chat is an open-source fully customizable communications platform develop ## Screenshots -![Screenshot of RocketChat](./doc/screenshots/screenshot.jpg) +![Screenshot of Rocket.Chat](./doc/screenshots/screenshot.jpg) ## Disclaimers / important information diff --git a/README_fr.md b/README_fr.md index 65bfe3f..9121246 100644 --- a/README_fr.md +++ b/README_fr.md @@ -3,14 +3,14 @@ N.B.: This README was automatically generated by https://github.com/YunoHost/app It shall NOT be edited by hand. --> -# RocketChat pour YunoHost +# Rocket.Chat pour YunoHost [![Niveau d'intégration](https://dash.yunohost.org/integration/rocketchat.svg)](https://dash.yunohost.org/appci/app/rocketchat) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/rocketchat.status.svg) ![Statut de maintenance](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) +[![Installer Rocket.Chat 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)* -> *Ce package vous permet d'installer RocketChat rapidement et simplement sur un serveur YunoHost. +> *Ce package vous permet d'installer Rocket.Chat 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 @@ -23,7 +23,7 @@ Rocket.Chat est une plate-forme de communication open source entièrement person ## Captures d'écran -![Capture d'écran de RocketChat](./doc/screenshots/screenshot.jpg) +![Capture d'écran de Rocket.Chat](./doc/screenshots/screenshot.jpg) ## Avertissements / informations importantes From 0fab41c65f7bebb94e19a2cd1e84b31bfb94dd5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 28 Jun 2022 10:08:04 +0200 Subject: [PATCH 141/145] Fix --- doc/DESCRIPTION_fr.md | 11 ++++++++++- doc/DISCLAIMER.md | 12 ++++++------ doc/DISCLAIMER_fr.md | 10 +++++----- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/doc/DESCRIPTION_fr.md b/doc/DESCRIPTION_fr.md index d347e88..de7aca6 100644 --- a/doc/DESCRIPTION_fr.md +++ b/doc/DESCRIPTION_fr.md @@ -1 +1,10 @@ -Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. \ No newline at end of file +Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. + +### Fonctionnalités + +- Chiffrement de bout en bout +- LDAP +- Authentification multifacteur +- Autorisation utilisateur personnalisable +- Applications mobiles pour [iOS](https://apps.apple.com/app/rocket-chat/id1148741252) et [Android](https://play.google.com/store/apps/details?id=chat.rocket.android) +- Applications de bureau pour [macOS](https://apps.apple.com/br/app/rocket-chat/id1086818840), [Linux](https://snapcraft.io/rocketchat-desktop) et [Windows](https://releases.rocket.chat/desktop/latest/download) \ No newline at end of file diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md index 176165f..7de3c7c 100644 --- a/doc/DISCLAIMER.md +++ b/doc/DISCLAIMER.md @@ -1,12 +1,12 @@ ### E-mail Configuration -To enable E-mail for address verification, go to Rocketchat Administration panel under E-mail -> SMTP and set as follow: +To enable E-mail for address verification, go to Rocket.Chat Administration panel under E-mail -> SMTP and set as follow: -- Protocole: smtp -- Host: localhost -- Port: 25 -- From -mail: rocketchat@domain.tld +- Protocole: `smtp` +- Host: `localhost` +- Port: `25` +- From -mail: `rocketchat@domain.tld` -### Configure and activate federation for Rocketchat +### Configure and activate federation for Rocket.Chat https://support.indie.host/help/fr-fr/13/40 diff --git a/doc/DISCLAIMER_fr.md b/doc/DISCLAIMER_fr.md index 3932c76..4a4d219 100644 --- a/doc/DISCLAIMER_fr.md +++ b/doc/DISCLAIMER_fr.md @@ -2,11 +2,11 @@ Pour activer l'e-mail pour la vérification des adresses, accédez au panneau d'administration de Rocketchat sous E-mail -> SMTP et définissez comme suit : -- Protocole: smtp -- Hôte: localhost -- Port: 25 -- De l'e-mail: rocketchat@domain.tld +- Protocole : `smtp` +- Hôte : `localhost` +- Port : `25` +- De l'e-mail : `rocketchat@domain.tld` -### Configurer et activer la fédération pour Rocketchat +### Configurer et activer la fédération pour Rocket.Chat https://support.indie.host/help/fr-fr/13/40 From 3c10d4083c3d1eb3e11b48bf49547f4c1a3f3971 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 28 Jun 2022 08:08:19 +0000 Subject: [PATCH 142/145] Auto-update README --- README.md | 12 ++++++------ README_fr.md | 21 +++++++++++++++------ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 8f4fe74..74c5591 100644 --- a/README.md +++ b/README.md @@ -38,14 +38,14 @@ Rocket.Chat is an open-source fully customizable communications platform develop ### E-mail Configuration -To enable E-mail for address verification, go to Rocketchat Administration panel under E-mail -> SMTP and set as follow: +To enable E-mail for address verification, go to Rocket.Chat Administration panel under E-mail -> SMTP and set as follow: -- Protocole: smtp -- Host: localhost -- Port: 25 -- From -mail: rocketchat@domain.tld +- Protocole: `smtp` +- Host: `localhost` +- Port: `25` +- From -mail: `rocketchat@domain.tld` -### Configure and activate federation for Rocketchat +### Configure and activate federation for Rocket.Chat https://support.indie.host/help/fr-fr/13/40 diff --git a/README_fr.md b/README_fr.md index 9121246..4cdaa86 100644 --- a/README_fr.md +++ b/README_fr.md @@ -15,7 +15,16 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour ## Vue d'ensemble -Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. +Rocket.Chat est une plate-forme de communication open source entièrement personnalisable développée en JavaScript pour les organisations avec des normes élevées de protection des données. + +### Fonctionnalités + +- Chiffrement de bout en bout +- LDAP +- Authentification multifacteur +- Autorisation utilisateur personnalisable +- Applications mobiles pour [iOS](https://apps.apple.com/app/rocket-chat/id1148741252) et [Android](https://play.google.com/store/apps/details?id=chat.rocket.android) +- Applications de bureau pour [macOS](https://apps.apple.com/br/app/rocket-chat/id1086818840), [Linux](https://snapcraft.io/rocketchat-desktop) et [Windows](https://releases.rocket.chat/desktop/latest/download) **Version incluse :** 4.8.1~ynh1 @@ -31,12 +40,12 @@ Rocket.Chat est une plate-forme de communication open source entièrement person Pour activer l'e-mail pour la vérification des adresses, accédez au panneau d'administration de Rocketchat sous E-mail -> SMTP et définissez comme suit : -- Protocole: smtp -- Hôte: localhost -- Port: 25 -- De l'e-mail: rocketchat@domain.tld +- Protocole : `smtp` +- Hôte : `localhost` +- Port : `25` +- De l'e-mail : `rocketchat@domain.tld` -### Configurer et activer la fédération pour Rocketchat +### Configurer et activer la fédération pour Rocket.Chat https://support.indie.host/help/fr-fr/13/40 From 681795b46c17e1fc62a171f6f5f177dc855ab53d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 28 Jun 2022 10:08:56 +0200 Subject: [PATCH 143/145] Update manifest.json --- manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index 6b63f85..a0ce2df 100644 --- a/manifest.json +++ b/manifest.json @@ -52,8 +52,8 @@ "name": "is_public", "type": "boolean", "help": { - "en": "If enabled, RocketChat will be accessible by people who do not have an account. This can be changed later via the webadmin.", - "fr": "Si cette case est cochée, RocketChat sera accessible aux personnes n’ayant pas de compte. Vous pourrez changer ceci plus tard via la webadmin." + "en": "If enabled, Rocket.Chat will be accessible by people who do not have an account. This can be changed later via the webadmin.", + "fr": "Si cette case est cochée, Rocket.Chat sera accessible aux personnes n’ayant pas de compte. Vous pourrez changer ceci plus tard via la webadmin." }, "default": true } From b13a7790dbe868aa5c0f087f41e22433921bbe2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 28 Jun 2022 14:15:23 +0200 Subject: [PATCH 144/145] Update manifest.json --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index a0ce2df..04db668 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Team collaboration communication platform", "fr": "Plateforme de communication collaborative en équipe" }, - "version": "4.8.1~ynh1", + "version": "4.8.1~ynh2", "url": "https://rocket.chat", "upstream": { "license": "GPL-3.0", From f644657307ca36d27afeee87ba832dcd4f2ef23d Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 28 Jun 2022 12:15:32 +0000 Subject: [PATCH 145/145] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 74c5591..5e721f3 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Rocket.Chat is an open-source fully customizable communications platform develop - Mobile Apps for [iOS](https://apps.apple.com/app/rocket-chat/id1148741252) and [Android](https://play.google.com/store/apps/details?id=chat.rocket.android) - Desktop Apps for [macOS](https://apps.apple.com/br/app/rocket-chat/id1086818840), [Linux](https://snapcraft.io/rocketchat-desktop) and [Windows](https://releases.rocket.chat/desktop/latest/download) -**Shipped version:** 4.8.1~ynh1 +**Shipped version:** 4.8.1~ynh2 **Demo:** https://cloud.rocket.chat/trial diff --git a/README_fr.md b/README_fr.md index 4cdaa86..11927fa 100644 --- a/README_fr.md +++ b/README_fr.md @@ -26,7 +26,7 @@ Rocket.Chat est une plate-forme de communication open source entièrement person - Applications mobiles pour [iOS](https://apps.apple.com/app/rocket-chat/id1148741252) et [Android](https://play.google.com/store/apps/details?id=chat.rocket.android) - Applications de bureau pour [macOS](https://apps.apple.com/br/app/rocket-chat/id1086818840), [Linux](https://snapcraft.io/rocketchat-desktop) et [Windows](https://releases.rocket.chat/desktop/latest/download) -**Version incluse :** 4.8.1~ynh1 +**Version incluse :** 4.8.1~ynh2 **Démo :** https://cloud.rocket.chat/trial