From abfdfadd8839c18e644a7eaeb6093e9162013a86 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 4 Dec 2020 09:55:05 +0100 Subject: [PATCH 001/120] Small fixes --- check_process | 2 -- scripts/install | 2 +- scripts/restore | 4 ++-- scripts/upgrade | 2 +- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/check_process b/check_process index 8e2f879..7d6d5cf 100644 --- a/check_process +++ b/check_process @@ -16,8 +16,6 @@ multi_instance=1 port_already_use=1 change_url=1 -;;; Levels - Level 5=auto ;;; Options Email= Notification=none \ No newline at end of file diff --git a/scripts/install b/scripts/install index a957b6a..25b9699 100644 --- a/scripts/install +++ b/scripts/install @@ -178,7 +178,7 @@ chown -R $app:$app $final_path #================================================= ynh_script_progression --message="Integrating service in YunoHost..." --weight=2 -yunohost service add $app --description "Collaborative Markdown notes" --log="/var/log/$app/$app.log" +yunohost service add $app --description="Collaborative Markdown notes" --log="/var/log/$app/$app.log" #================================================= # START SYSTEMD SERVICE diff --git a/scripts/restore b/scripts/restore index 49aceb0..6202cb3 100644 --- a/scripts/restore +++ b/scripts/restore @@ -106,14 +106,14 @@ ynh_psql_execute_file_as_root --file="./db.sql" --database=$db_name ynh_script_progression --message="Restoring the systemd configuration..." --weight=5 ynh_restore_file --origin_path="/etc/systemd/system/$app.service" -systemctl enable $app.service +systemctl enable $app.service --quiet #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= ynh_script_progression --message="Integrating service in YunoHost..." --weight=2 -yunohost service add $app --description "collaborative Markdown editor" --log "/var/log/$app/$app.log" +yunohost service add $app --description="collaborative Markdown editor" --log="/var/log/$app/$app.log" #================================================= # START SYSTEMD SERVICE diff --git a/scripts/upgrade b/scripts/upgrade index dcfd276..10ed350 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -177,7 +177,7 @@ chown -R $app:$app $final_path #================================================= ynh_script_progression --message="Integrating service in YunoHost..." --weight=2 -yunohost service add $app --description "Collaborative Markdown notes" --log="/var/log/$app/$app.log" +yunohost service add $app --description="Collaborative Markdown notes" --log="/var/log/$app/$app.log" #================================================= # START SYSTEMD SERVICE From 892bfb7b00d50c7c8d3dfba4412773072d244d77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 22 Dec 2020 09:18:09 +0100 Subject: [PATCH 002/120] 1.7.0 (#4) * Upgrde to v.1.7.0 --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 4 ++-- scripts/_common.sh | 2 +- scripts/change_url | 10 +++++----- scripts/install | 4 ++-- scripts/restore | 2 +- scripts/upgrade | 4 ++-- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 3162f06..5f8a1d2 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in ## Overview hedgedoc is a real-time collaborative word processing web service. It uses Markdown language. -**Shipped version:** 1.6.0 +**Shipped version:** 1.7.0 ## Screenshots diff --git a/README_fr.md b/README_fr.md index 7bea83d..c9b4da2 100644 --- a/README_fr.md +++ b/README_fr.md @@ -11,7 +11,7 @@ Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install ## Vue d'ensemble HedgeDoc est un service web de traitement de texte collaboratif en temps réel. Il utilise le langage Markdown. -**Version incluse :** 1.6.0 +**Version incluse :** 1.7.0 ## Captures d'écran diff --git a/conf/app.src b/conf/app.src index da1e271..f33e2bc 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/hedgedoc/server/archive/1.6.0.tar.gz -SOURCE_SUM=5cb53b9441817f2e17f998057174f89213c96924d55b444bdaac35d0e48fab03 +SOURCE_URL=https://github.com/hedgedoc/hedgedoc/archive/1.7.0.tar.gz +SOURCE_SUM=22c0c13d215669b4addb54d6b021b79f698f69c897cb2f48363495381055b1a8 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 9ad958b..c3f248f 100644 --- a/manifest.json +++ b/manifest.json @@ -6,11 +6,11 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.6.0~ynh6", + "version": "1.7.0~ynh1", "url": "https://github.com/hedgedoc/hedgedoc", "license": "AGPL-3.0-only", "maintainer": { - "name": "" + "name": "eric_G" }, "requirements": { "yunohost": ">= 4.0.0" diff --git a/scripts/_common.sh b/scripts/_common.sh index 327e730..3e0b194 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -7,7 +7,7 @@ # dependencies used by the app pkg_dependencies="postgresql apt-transport-https" -nodejs_version=12 +nodejs_version=14 #================================================= # PERSONAL HELPERS diff --git a/scripts/change_url b/scripts/change_url index 16ede2b..9ce2c69 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -82,19 +82,19 @@ ynh_script_progression --message="Updating NGINX web server configuration..." -- nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf -# Change the path in the nginx config file +# 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 + # 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 + # Set global variables for NGINX helper domain="$old_domain" path_url="$new_path" - # Create a dedicated nginx config + # Create a dedicated NGINX config ynh_add_nginx_config fi -# Change the domain for nginx +# Change the domain for NGINX if [ $change_domain -eq 1 ] then # Delete file checksum for the old conf file location diff --git a/scripts/install b/scripts/install index 390d925..1b18fb5 100644 --- a/scripts/install +++ b/scripts/install @@ -118,7 +118,7 @@ ynh_system_user_create --username=$app --home_dir=$final_path #============================================== # INSTALL HEDGEDOC #============================================== -ynh_script_progression --message="Building HedgeDoc... (this will take some time and resources!)" --weight=10 +ynh_script_progression --message="Building HedgeDoc... (this will take some time and resources!)" --weight=20 pushd "$final_path" || ynh_die ynh_use_nodejs @@ -178,7 +178,7 @@ chown -R $app:$app $final_path #================================================= ynh_script_progression --message="Integrating service in YunoHost..." --weight=2 -yunohost service add $app --description="collaborative Markdown editor" --log="/var/log/$app/$app.log" +yunohost service add $app --description="Collaborative Markdown editor" --log="/var/log/$app/$app.log" #================================================= # START SYSTEMD SERVICE diff --git a/scripts/restore b/scripts/restore index 6202cb3..f90d580 100644 --- a/scripts/restore +++ b/scripts/restore @@ -113,7 +113,7 @@ systemctl enable $app.service --quiet #================================================= ynh_script_progression --message="Integrating service in YunoHost..." --weight=2 -yunohost service add $app --description="collaborative Markdown editor" --log="/var/log/$app/$app.log" +yunohost service add $app --description="Collaborative Markdown editor" --log="/var/log/$app/$app.log" #================================================= # START SYSTEMD SERVICE diff --git a/scripts/upgrade b/scripts/upgrade index a4f6aad..716e32e 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -121,7 +121,7 @@ ynh_system_user_create --username=$app #============================================== if [ "$upgrade_type" == "UPGRADE_APP" ] then - ynh_script_progression --message="Building HedgeDoc... (this will take some time and resources!)" --weight=10 + ynh_script_progression --message="Building HedgeDoc... (this will take some time and resources!)" --weight=20 pushd "$final_path" || ynh_die ynh_use_nodejs @@ -177,7 +177,7 @@ chown -R $app:$app $final_path #================================================= ynh_script_progression --message="Integrating service in YunoHost..." --weight=2 -yunohost service add $app --description="collaborative Markdown editor" --log="/var/log/$app/$app.log" +yunohost service add $app --description="Collaborative Markdown editor" --log="/var/log/$app/$app.log" #================================================= # START SYSTEMD SERVICE From c665e46991bf4c2d9940252e0875729906fdd7e1 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 22 Dec 2020 19:15:14 +0100 Subject: [PATCH 003/120] Set requirements to 3.8.1 --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index c3f248f..352b64f 100644 --- a/manifest.json +++ b/manifest.json @@ -13,7 +13,7 @@ "name": "eric_G" }, "requirements": { - "yunohost": ">= 4.0.0" + "yunohost": ">= 3.8.1" }, "multi_instance": true, "services": [ From e2ed847fda4bd1a14c5d1d8a5b3766a3788288e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 24 Dec 2020 17:05:49 +0100 Subject: [PATCH 004/120] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5f8a1d2..5e762b7 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* ## Overview -hedgedoc is a real-time collaborative word processing web service. It uses Markdown language. +HedgeDoc is a real-time collaborative word processing web service. It uses Markdown language. **Shipped version:** 1.7.0 From 86717722bb5dae82a2b776f771dc0328e2dec296 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 28 Dec 2020 10:33:39 +0100 Subject: [PATCH 005/120] Upgrade to 1.7.1 (#6) --- 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 5e762b7..683f08b 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in ## Overview HedgeDoc is a real-time collaborative word processing web service. It uses Markdown language. -**Shipped version:** 1.7.0 +**Shipped version:** 1.7.1 ## Screenshots diff --git a/README_fr.md b/README_fr.md index c9b4da2..078d42f 100644 --- a/README_fr.md +++ b/README_fr.md @@ -11,7 +11,7 @@ Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install ## Vue d'ensemble HedgeDoc est un service web de traitement de texte collaboratif en temps réel. Il utilise le langage Markdown. -**Version incluse :** 1.7.0 +**Version incluse :** 1.7.1 ## Captures d'écran diff --git a/conf/app.src b/conf/app.src index f33e2bc..e92e97a 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/hedgedoc/hedgedoc/archive/1.7.0.tar.gz -SOURCE_SUM=22c0c13d215669b4addb54d6b021b79f698f69c897cb2f48363495381055b1a8 +SOURCE_URL=https://github.com/hedgedoc/hedgedoc/archive/1.7.1.tar.gz +SOURCE_SUM=6941dc631dca0fbb42de5c0379f5b5eab0cd2e0084ed1edeb431d53f4a38a55a SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 352b64f..4f98517 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.7.0~ynh1", + "version": "1.7.1~ynh1", "url": "https://github.com/hedgedoc/hedgedoc", "license": "AGPL-3.0-only", "maintainer": { From bb23c57b5c7f69ec77c8f79d872f1da290c7263c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Dec 2020 10:46:38 +0100 Subject: [PATCH 006/120] Add limitations --- README.md | 4 ++++ README_fr.md | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/README.md b/README.md index 683f08b..5f7ac87 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,10 @@ You can configure HedgeDoc by editing this file `/var/www/hedgedoc/config.json` * x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/hedgedoc%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/hedgedoc/) * ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/hedgedoc%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/hedgedoc/) +## Limitations + +* HedgeDoc needs more than 3 GB of RAM to build. + ## Links * Report a bug: https://github.com/YunoHost-Apps/hedgedoc_ynh/issues diff --git a/README_fr.md b/README_fr.md index 078d42f..e1e9bc2 100644 --- a/README_fr.md +++ b/README_fr.md @@ -42,6 +42,10 @@ Vous pouvez configurer HedgeDoc en modifiant le fichier `/var/www/hedgedoc/confi * x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/hedgedoc%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/hedgedoc/) * ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/hedgedoc%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/hedgedoc/) +## Limitations + +* HedgeDoc a besoin de plus de 3 Go de RAM pour être installé. + ## Liens * Signaler un bug : https://github.com/YunoHost-Apps/hedgedoc_ynh/issues From 604145f71329eb29b6b3a4986228928434c7bbff Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 2 Jan 2021 14:41:54 +0100 Subject: [PATCH 007/120] Avoid to buid frontend bundle --- conf/app.src | 4 ++-- scripts/install | 1 - scripts/upgrade | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/conf/app.src b/conf/app.src index e92e97a..7eea66d 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/hedgedoc/hedgedoc/archive/1.7.1.tar.gz -SOURCE_SUM=6941dc631dca0fbb42de5c0379f5b5eab0cd2e0084ed1edeb431d53f4a38a55a +SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.7.1/hedgedoc-1.7.1.tar.gz +SOURCE_SUM=17e7092430b36c96059309fdd03f9244f6a13611e28ced153d9dbf97e109d5ba SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/scripts/install b/scripts/install index 1b18fb5..238fe43 100644 --- a/scripts/install +++ b/scripts/install @@ -123,7 +123,6 @@ ynh_script_progression --message="Building HedgeDoc... (this will take some time pushd "$final_path" || ynh_die ynh_use_nodejs bin/setup - ynh_exec_warn_less yarn run build popd || ynh_die #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 716e32e..275b0ee 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -126,7 +126,6 @@ then pushd "$final_path" || ynh_die ynh_use_nodejs bin/setup - ynh_exec_warn_less yarn run build popd || ynh_die fi From 5d106df1e7e28544c5d2ebe6f0aecf83c4d952f2 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 2 Jan 2021 14:55:20 +0100 Subject: [PATCH 008/120] Remove PostegrSQL warning --- scripts/install | 2 +- scripts/restore | 2 +- scripts/upgrade | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/install b/scripts/install index 238fe43..5d7cc84 100644 --- a/scripts/install +++ b/scripts/install @@ -65,7 +65,7 @@ ynh_app_setting_set --app=$app --key=port --value=$port #================================================= ynh_script_progression --message="Installing dependencies..." --weight=20 -ynh_install_app_dependencies $pkg_dependencies +ynh_exec_warn_less ynh_install_app_dependencies $pkg_dependencies # Install Nodejs ynh_exec_warn_less ynh_install_nodejs --nodejs_version=$nodejs_version diff --git a/scripts/restore b/scripts/restore index f90d580..b465605 100644 --- a/scripts/restore +++ b/scripts/restore @@ -83,7 +83,7 @@ chown -R $app:$app $final_path ynh_script_progression --message="Reinstalling dependencies..." --weight=6 # Define and install dependencies -ynh_install_app_dependencies $pkg_dependencies +ynh_exec_warn_less ynh_install_app_dependencies $pkg_dependencies # Install Nodejs ynh_exec_warn_less ynh_install_nodejs --nodejs_version=$nodejs_version diff --git a/scripts/upgrade b/scripts/upgrade index 275b0ee..23093be 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -98,7 +98,7 @@ ynh_add_nginx_config #================================================= ynh_script_progression --message="Upgrading dependencies..." --weight=10 -ynh_install_app_dependencies $pkg_dependencies +ynh_exec_warn_less ynh_install_app_dependencies $pkg_dependencies # Install Nodejs ynh_exec_warn_less ynh_install_nodejs --nodejs_version=$nodejs_version From 2a97edee302d7bbc84348fcf238b6e90cfab5354 Mon Sep 17 00:00:00 2001 From: Eauchat <34686393+eauchat@users.noreply.github.com> Date: Sat, 2 Jan 2021 16:34:28 +0000 Subject: [PATCH 009/120] Update README.md Add you should reload service for changes in config to be registered. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5f7ac87..3a8728b 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ HedgeDoc is a real-time collaborative word processing web service. It uses Markd ## Configuration You can configure HedgeDoc by editing this file `/var/www/hedgedoc/config.json` using the [documentation](https://github.com/hedgedoc/hedgedoc/blob/master/docs/configuration.md) +When you finished editing the configuration, for your changes to take effect, you will have to run: `sudo systemctl restart hedgedoc`. ## Documentation From 467e838fc6e01915b05876b5d913009ec7d871da Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 2 Jan 2021 17:43:30 +0100 Subject: [PATCH 010/120] Add restart systemd tuto --- README.md | 2 +- README_fr.md | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3a8728b..3d487fe 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ HedgeDoc is a real-time collaborative word processing web service. It uses Markd ## Configuration -You can configure HedgeDoc by editing this file `/var/www/hedgedoc/config.json` using the [documentation](https://github.com/hedgedoc/hedgedoc/blob/master/docs/configuration.md) +You can configure HedgeDoc by editing this file `/var/www/hedgedoc/config.json` using the [documentation](https://github.com/hedgedoc/hedgedoc/blob/master/docs/configuration.md) When you finished editing the configuration, for your changes to take effect, you will have to run: `sudo systemctl restart hedgedoc`. ## Documentation diff --git a/README_fr.md b/README_fr.md index e1e9bc2..69ea9d4 100644 --- a/README_fr.md +++ b/README_fr.md @@ -23,7 +23,8 @@ HedgeDoc est un service web de traitement de texte collaboratif en temps réel. ## Configuration -Vous pouvez configurer HedgeDoc en modifiant le fichier `/var/www/hedgedoc/config.json` et en vous aidant de la [documentation](https://github.com/hedgedoc/hedgedoc/blob/master/docs/configuration.md) +Vous pouvez configurer HedgeDoc en modifiant le fichier `/var/www/hedgedoc/config.json` et en vous aidant de la [documentation](https://github.com/hedgedoc/hedgedoc/blob/master/docs/configuration.md) +Lorsque vous avez terminé de modifier la configuration, pour que vos modifications prennent effet, vous devrez exécuter : `sudo systemctl restart hedgedoc`. ## Documentation From 7e4d6e78c6b2d29dd27faa7c108cdcb61137bba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 3 Jan 2021 09:24:48 +0100 Subject: [PATCH 011/120] Change version --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 4f98517..894ac27 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.7.1~ynh1", + "version": "1.7.1~ynh2", "url": "https://github.com/hedgedoc/hedgedoc", "license": "AGPL-3.0-only", "maintainer": { From 9b0f736c06e82363eb0062aa6c636cdd3a883692 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 9 Jan 2021 22:35:27 +0100 Subject: [PATCH 012/120] Finding an available port --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 5d7cc84..13d8664 100644 --- a/scripts/install +++ b/scripts/install @@ -54,7 +54,7 @@ ynh_app_setting_set --app=$app --key=is_public --value=$is_public #================================================= # FIND AND OPEN A PORT #================================================= -ynh_script_progression --message="Configuring firewall..." --weight=2 +ynh_script_progression --message="Finding an available port..." --weight=2 # Find an available port port=$(ynh_find_port --port=3000) From d276204e5998d0e99f41279e51b72c22b6a9dec2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 15 Jan 2021 23:24:37 +0100 Subject: [PATCH 013/120] Upgrade to version 1.7.2 (#12) --- 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 3d487fe..8124624 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in ## Overview HedgeDoc is a real-time collaborative word processing web service. It uses Markdown language. -**Shipped version:** 1.7.1 +**Shipped version:** 1.7.2 ## Screenshots diff --git a/README_fr.md b/README_fr.md index 69ea9d4..1b9cc07 100644 --- a/README_fr.md +++ b/README_fr.md @@ -11,7 +11,7 @@ Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install ## Vue d'ensemble HedgeDoc est un service web de traitement de texte collaboratif en temps réel. Il utilise le langage Markdown. -**Version incluse :** 1.7.1 +**Version incluse :** 1.7.2 ## Captures d'écran diff --git a/conf/app.src b/conf/app.src index 7eea66d..80312fa 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.7.1/hedgedoc-1.7.1.tar.gz -SOURCE_SUM=17e7092430b36c96059309fdd03f9244f6a13611e28ced153d9dbf97e109d5ba +SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.7.2/hedgedoc-1.7.2.tar.gz +SOURCE_SUM=8bb66ba9c839a4d81f72267b91a201f97a48f16aa95434586d6dd6be40502d6d SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 894ac27..b9b6840 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.7.1~ynh2", + "version": "1.7.2~ynh1", "url": "https://github.com/hedgedoc/hedgedoc", "license": "AGPL-3.0-only", "maintainer": { From b15b9277f9f27bc49fde30591ce235b1fa82c3c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 12 Mar 2021 22:47:43 +0100 Subject: [PATCH 014/120] Patch (#17) * Cleaning up --- README.md | 4 ++-- README_fr.md | 4 +++- check_process | 8 ++++++- conf/.sequelizerc.example | 2 +- conf/config.json.example | 7 ++---- manifest.json | 2 +- pull_request_template.md | 4 +--- scripts/change_url | 19 ++++++++--------- scripts/install | 45 ++++++++++++++++----------------------- scripts/remove | 3 +-- scripts/restore | 6 +++--- scripts/upgrade | 27 +++++++++++------------ 12 files changed, 60 insertions(+), 71 deletions(-) diff --git a/README.md b/README.md index 8124624..c110cf1 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* ## Overview -HedgeDoc is a real-time collaborative word processing web service. It uses Markdown language. +HedgeDoc ([formerly known as CodiMD](https://hedgedoc.org/history/)) is an open-source collaborative markdown editor. With HedgeDoc you can easily collaborate on notes, graphs and even presentations in real-time. All you need to do is to share your note-link to your co-workers, and they’re ready to go. **Shipped version:** 1.7.2 @@ -29,7 +29,7 @@ When you finished editing the configuration, for your changes to take effect, yo ## Documentation * Official documentation: https://github.com/hedgedoc/hedgedoc/tree/master/docs - * YunoHost documentation: https://yunohost.org/#/app_hedgedoc + * YunoHost documentation: https://yunohost.org/en/app_hedgedoc ## YunoHost specific features diff --git a/README_fr.md b/README_fr.md index 1b9cc07..93e8145 100644 --- a/README_fr.md +++ b/README_fr.md @@ -11,6 +11,8 @@ Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install ## Vue d'ensemble HedgeDoc est un service web de traitement de texte collaboratif en temps réel. Il utilise le langage Markdown. +HedgeDoc ([anciennement connu sous le nom de CodiMD](https://hedgedoc.org/history/)) est un éditeur Markdown collaboratif open-source. Avec HedgeDoc, vous pouvez facilement collaborer sur des notes, des graphiques et même des présentations en temps réel. Tout ce que vous avez à faire est de partager votre lien de note avec vos collègues. + **Version incluse :** 1.7.2 ## Captures d'écran @@ -29,7 +31,7 @@ Lorsque vous avez terminé de modifier la configuration, pour que vos modificati ## Documentation * Documentation officielle : https://github.com/hedgedoc/hedgedoc/tree/master/docs - * Documentation YunoHost : https://yunohost.org/#/app_hedgedoc_fr + * Documentation YunoHost : https://yunohost.org/fr/app_hedgedoc ## Caractéristiques spécifiques YunoHost diff --git a/check_process b/check_process index 7d6d5cf..c96585b 100644 --- a/check_process +++ b/check_process @@ -12,10 +12,16 @@ setup_private=1 setup_public=1 upgrade=1 + upgrade=1 from_commit=2a6ed9db5f7f0644eab251b2495c190811735832 backup_restore=1 multi_instance=1 port_already_use=1 change_url=1 ;;; Options Email= -Notification=none \ No newline at end of file +Notification=none +;;; Upgrade options + ; commit=2a6ed9db5f7f0644eab251b2495c190811735832 + name=Testing (#13) + manifest_arg=domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666& + diff --git a/conf/.sequelizerc.example b/conf/.sequelizerc.example index 45ef120..ddb5cba 100644 --- a/conf/.sequelizerc.example +++ b/conf/.sequelizerc.example @@ -4,5 +4,5 @@ module.exports = { 'config': path.resolve('config.json'), 'migrations-path': path.resolve('lib', 'migrations'), 'models-path': path.resolve('lib', 'models'), - 'url': 'postgres://__DB_USER__:__DB_PASS__@localhost:5432/__DB_NAME__' + 'url': 'postgres://__DB_NAME__:__DB_PWD__@localhost:5432/__DB_NAME__' } diff --git a/conf/config.json.example b/conf/config.json.example index 9986ac3..5f6ec2b 100644 --- a/conf/config.json.example +++ b/conf/config.json.example @@ -30,8 +30,8 @@ "addGoogleAnalytics": false }, "db": { - "username": "__DB_USER__", - "password": "__DB_PASS__", + "username": "__DB_NAME__", + "password": "__DB_PWD__", "database": "__DB_NAME__", "host": "localhost", "port": "5432", @@ -49,6 +49,3 @@ } } } - - - diff --git a/manifest.json b/manifest.json index b9b6840..1231b15 100644 --- a/manifest.json +++ b/manifest.json @@ -13,7 +13,7 @@ "name": "eric_G" }, "requirements": { - "yunohost": ">= 3.8.1" + "yunohost": ">= 4.1.7" }, "multi_instance": true, "services": [ diff --git a/pull_request_template.md b/pull_request_template.md index 6774215..6c28fc5 100644 --- a/pull_request_template.md +++ b/pull_request_template.md @@ -13,6 +13,4 @@ ## Package_check results --- -*If you have access to [App Continuous Integration for packagers](https://yunohost.org/#/packaging_apps_ci) you can provide a link to the package_check results like below, replacing '-NUM-' in this link by the PR number and USERNAME by your username on the ci-apps-dev. Or you provide a screenshot or a pastebin of the results* - -[![Build Status](https://ci-apps-dev.yunohost.org/jenkins/job/hedgedoc_ynh%20PR-NUM-%20(USERNAME)/badge/icon)](https://ci-apps-dev.yunohost.org/jenkins/job/hedgedoc_ynh%20PR-NUM-%20(USERNAME)/) +* An automatic package_check will be launch at https://ci-apps-dev.yunohost.org/, when you add a specific comment to your Pull Request: "!testme", "!gogogadgetoci" or "By the power of systemd, I invoke The Great App CI to test this Pull Request!"* diff --git a/scripts/change_url b/scripts/change_url index 9ce2c69..ad20b77 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -31,7 +31,7 @@ final_path=$(ynh_app_setting_get --app=$app --key=final_path) port=$(ynh_app_setting_get --app=$app --key=port) db_name=$(ynh_app_setting_get --app=$app --key=db_name) db_user=$db_name -db_pwd=$(ynh_app_setting_get --app=$app --key=db_pwd) +db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP @@ -73,7 +73,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="/var/log/$app/$app.log" #================================================= # MODIFY URL IN NGINX CONF @@ -117,13 +117,12 @@ path_url=$new_path cp ../conf/config.json.example "$final_path/config.json" -ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__PATH__" --replace_string="${path_url:1}" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DB_PASS__" --replace_string="$db_pwd" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__PATH__" --replace_string="${path_url:1}" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/config.json" ynh_store_file_checksum --file="$final_path/config.json" @@ -135,7 +134,7 @@ ynh_store_file_checksum --file="$final_path/config.json" ynh_script_progression --message="Starting a systemd service..." --weight=1 # Start a systemd service -ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" --line_match="HTTP Server listening" +ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="HTTP Server listening" #================================================= # RELOAD NGINX diff --git a/scripts/install b/scripts/install index 13d8664..adf1fc6 100644 --- a/scripts/install +++ b/scripts/install @@ -45,9 +45,8 @@ ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url #================================================= 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=is_public --value=$is_public +ynh_app_setting_set --app=$app --key=domain --value=$domain +ynh_app_setting_set --app=$app --key=path --value=$path_url #================================================= # STANDARD MODIFICATIONS @@ -79,14 +78,10 @@ ynh_install_extra_app_dependencies --repo="deb https://dl.yarnpkg.com/debian/ st ynh_script_progression --message="Creating a PostgreSQL database..." --weight=2 db_name=$(ynh_sanitize_dbid --db_name=$app) -db_user=$db_name -db_pwd=$(ynh_string_random --length=30) - +db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) ynh_app_setting_set --app=$app --key=db_name --value=$db_name -ynh_app_setting_set --app=$app --key=db_pwd --value=$db_pwd - ynh_psql_test_if_first_run -ynh_psql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd +ynh_psql_setup_db --db_user=$db_name --db_name=$db_name #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE @@ -130,8 +125,8 @@ popd || ynh_die #================================================= 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_replace_string --match_string="__YNH_NPM__" --replace_string="$ynh_npm" --target_file="../conf/systemd.service" +ynh_replace_string --match_string="__ENV_PATH__" --replace_string="$PATH" --target_file="../conf/systemd.service" +ynh_replace_string --match_string="__YNH_NPM__" --replace_string="$ynh_npm" --target_file="../conf/systemd.service" ynh_add_systemd_config @@ -143,22 +138,20 @@ ynh_script_progression --message="Modifying a config file..." --weight=1 cp ../conf/config.json.example "$final_path/config.json" # Main config File -ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__PATH__" --replace_string="${path_url:1}" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DB_PASS__" --replace_string="$db_pwd" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__PATH__" --replace_string="${path_url:1}" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/config.json" ynh_store_file_checksum --file="$final_path/config.json" cp ../conf/.sequelizerc.example "$final_path/.sequelizerc" -# DB Config File -ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/.sequelizerc" +# # DB Config File ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/.sequelizerc" -ynh_replace_string --match_string="__DB_PASS__" --replace_string="$db_pwd" --target_file="$final_path/.sequelizerc" +ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/.sequelizerc" ynh_store_file_checksum --file="$final_path/.sequelizerc" @@ -170,7 +163,7 @@ ynh_store_file_checksum --file="$final_path/.sequelizerc" ynh_script_progression --message="Securing files and directories..." --weight=1 # Set permissions to app files -chown -R $app:$app $final_path +chown -R $app: $final_path #================================================= # INTEGRATE SERVICE IN YUNOHOST @@ -185,19 +178,17 @@ yunohost service add $app --description="Collaborative Markdown editor" --log="/ 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="HTTP Server listening" +ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="HTTP Server listening" #================================================= # SETUP SSOWAT #================================================= -ynh_script_progression --message="Configuring SSOwat..." --weight=1 +ynh_script_progression --message="Configuring permissions..." --weight=1 # Make app public if necessary or protect it if [ $is_public -eq 1 ] then - # Everyone can access the app. - # The "main" permission is automatically created before the install script. - ynh_permission_update --permission "main" --add "visitors" + ynh_permission_update --permission="main" --add="visitors" fi #================================================= diff --git a/scripts/remove b/scripts/remove index 4649abb..60d5336 100644 --- a/scripts/remove +++ b/scripts/remove @@ -17,10 +17,9 @@ ynh_script_progression --message="Loading installation settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME domain=$(ynh_app_setting_get --app=$app --key=domain) -port=$(ynh_app_setting_get --app=$app --key=port) +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 -final_path=$(ynh_app_setting_get --app=$app --key=final_path) #================================================= # STANDARD REMOVE diff --git a/scripts/restore b/scripts/restore index b465605..081632a 100644 --- a/scripts/restore +++ b/scripts/restore @@ -31,7 +31,7 @@ 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 -db_pwd=$(ynh_app_setting_get --app=$app --key=db_pwd) +db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) #================================================= # CHECK IF THE APP CAN BE RESTORED @@ -73,7 +73,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Restoring user rights..." --weight=2 # Restore permissions on app files -chown -R $app:$app $final_path +chown -R $app: $final_path #================================================= # SPECIFIC RESTORATION @@ -120,7 +120,7 @@ yunohost service add $app --description="Collaborative Markdown editor" --log="/ #================================================= ynh_script_progression --message="Starting a systemd service..." --weight=1 -ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" --line_match="HTTP Server listening" +ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="HTTP Server listening" #================================================= # GENERIC FINALIZATION diff --git a/scripts/upgrade b/scripts/upgrade index 23093be..e5dd990 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -18,13 +18,11 @@ app=$YNH_APP_INSTANCE_NAME domain=$(ynh_app_setting_get --app=$app --key=domain) path_url=$(ynh_app_setting_get --app=$app --key=path) -is_public=$(ynh_app_setting_get --app=$app --key=is_public) final_path=$(ynh_app_setting_get --app=$app --key=final_path) port=$(ynh_app_setting_get --app=$app --key=port) - db_name=$(ynh_app_setting_get --app=$app --key=db_name) db_user=$db_name -db_pwd=$(ynh_app_setting_get --app=$app --key=db_pwd) +db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) #================================================= # CHECK VERSION @@ -138,14 +136,13 @@ ynh_backup_if_checksum_is_different --file="$final_path/config.json" cp ../conf/config.json.example "$final_path/config.json" -# Main config File -ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__PATH__" --replace_string="${path_url:1}" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DB_PASS__" --replace_string="$db_pwd" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/config.json" +# # Main config File +ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__PATH__" --replace_string="${path_url:1}" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/config.json" # Recalculate and store the checksum of the file for the next upgrade. ynh_store_file_checksum --file="$final_path/config.json" @@ -155,8 +152,8 @@ ynh_store_file_checksum --file="$final_path/config.json" #================================================= ynh_script_progression --message="Configuring a systemd service..." --weight=2 -ynh_replace_string --match_string="__ENV_PATH__" --replace_string="$PATH" --target_file="../conf/systemd.service" -ynh_replace_string --match_string="__YNH_NPM__" --replace_string="$ynh_npm" --target_file="../conf/systemd.service" +ynh_replace_string --match_string="__ENV_PATH__" --replace_string="$PATH" --target_file="../conf/systemd.service" +ynh_replace_string --match_string="__YNH_NPM__" --replace_string="$ynh_npm" --target_file="../conf/systemd.service" # Create a dedicated systemd config ynh_add_systemd_config @@ -169,7 +166,7 @@ ynh_add_systemd_config ynh_script_progression --message="Securing files and directories..." --weight=1 # Set permissions on app files -chown -R $app:$app $final_path +chown -R $app: $final_path #================================================= # INTEGRATE SERVICE IN YUNOHOST @@ -183,7 +180,7 @@ yunohost service add $app --description="Collaborative Markdown editor" --log="/ #================================================= ynh_script_progression --message="Starting a systemd service..." --weight=1 -ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" --line_match="HTTP Server listening" +ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="HTTP Server listening" #================================================= # RELOAD NGINX From 842ced1c638a18439ae13ee9f6cdd2ecf97eca0c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 15 Mar 2021 09:08:48 +0100 Subject: [PATCH 015/120] Update manifest.json --- manifest.json | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/manifest.json b/manifest.json index 1231b15..5cf64d8 100644 --- a/manifest.json +++ b/manifest.json @@ -24,29 +24,17 @@ { "name": "domain", "type": "domain", - "ask": { - "en": "Choose a domain name for HedgeDoc", - "fr": "Choisissez un nom de domaine pour HedgeDoc" - }, "example": "domain.org" }, { "name": "path", "type": "path", - "ask": { - "en": "Choose a path for HedgeDoc", - "fr": "Choisissez un chemin pour HedgeDoc" - }, "example": "/hedgedoc", "default": "/hedgedoc" }, { "name": "is_public", "type": "boolean", - "ask": { - "en": "Is it a public site?", - "fr": "Est-ce un site public ?" - }, "help": { "en": "If enabled, HedgeDoc 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, HedgeDoc sera accessible aux personnes n’ayant pas de compte. Vous pourrez changer ceci plus tard via la webadmin." From 96c8e7c516cdeda8ff95591e22cb992291c72e1b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 15 Mar 2021 10:22:19 +0100 Subject: [PATCH 016/120] Cleaning up --- manifest.json | 2 +- scripts/install | 10 ++++++---- scripts/upgrade | 14 +++++++++++++- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/manifest.json b/manifest.json index 5cf64d8..6a521f0 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.7.2~ynh1", + "version": "1.7.2~ynh2", "url": "https://github.com/hedgedoc/hedgedoc", "license": "AGPL-3.0-only", "maintainer": { diff --git a/scripts/install b/scripts/install index adf1fc6..b855aaa 100644 --- a/scripts/install +++ b/scripts/install @@ -147,13 +147,15 @@ ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_fil ynh_store_file_checksum --file="$final_path/config.json" -cp ../conf/.sequelizerc.example "$final_path/.sequelizerc" +# cp ../conf/.sequelizerc.example "$final_path/.sequelizerc" # # DB Config File -ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/.sequelizerc" -ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/.sequelizerc" +# ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/.sequelizerc" +# ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/.sequelizerc" -ynh_store_file_checksum --file="$final_path/.sequelizerc" +# ynh_store_file_checksum --file="$final_path/.sequelizerc" + +ynh_add_config --template="../conf/.sequelizerc.example" --destination="$final_path/.sequelizerc" #================================================= # GENERIC FINALIZATION diff --git a/scripts/upgrade b/scripts/upgrade index e5dd990..21d73d2 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -31,6 +31,18 @@ ynh_script_progression --message="Checking version..." --weight=2 upgrade_type=$(ynh_check_app_version_changed) +#================================================= +# ENSURE DOWNWARD COMPATIBILITY +#================================================= +ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 + +# 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 #================================================= @@ -52,7 +64,7 @@ ynh_abort_if_errors #================================================= ynh_script_progression --message="Stopping a systemd service..." --weight=1 -ynh_systemd_action --service_name=$app --action="stop" --log_path="systemd" +ynh_systemd_action --service_name=$app --action=stop --log_path="systemd" #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE From 60dd01d161a3e427e853e2b9eb69d4ef65235eb3 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 21 Mar 2021 10:45:51 +0100 Subject: [PATCH 017/120] Secure config file --- scripts/install | 45 +++++++++++++++++++++------------------------ scripts/restore | 19 ++++++++++--------- scripts/upgrade | 39 ++++++++++----------------------------- 3 files changed, 41 insertions(+), 62 deletions(-) diff --git a/scripts/install b/scripts/install index b855aaa..daa62a7 100644 --- a/scripts/install +++ b/scripts/install @@ -72,6 +72,14 @@ 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" +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Configuring system user..." --weight=2 + +# Create a system user +ynh_system_user_create --username=$app --home_dir=$final_path + #================================================= # CREATE A POSTGRESQL DATABASE #================================================= @@ -100,14 +108,6 @@ ynh_script_progression --message="Configuring NGINX web server..." --weight=2 # Create a dedicated NGINX config ynh_add_nginx_config -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Configuring system user..." --weight=2 - -# Create a system user -ynh_system_user_create --username=$app --home_dir=$final_path - #================================================= # SPECIFIC SETUP #============================================== @@ -135,25 +135,21 @@ ynh_add_systemd_config #================================================= ynh_script_progression --message="Modifying a config file..." --weight=1 -cp ../conf/config.json.example "$final_path/config.json" +path=${path_url:1} -# Main config File -ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__PATH__" --replace_string="${path_url:1}" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/config.json" +# cp ../conf/config.json.example "$final_path/config.json" -ynh_store_file_checksum --file="$final_path/config.json" +# # Main config File +# ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/config.json" +# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/config.json" +# ynh_replace_string --match_string="__PATH__" --replace_string="${path_url:1}" --target_file="$final_path/config.json" +# ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/config.json" +# ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/config.json" +# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/config.json" -# cp ../conf/.sequelizerc.example "$final_path/.sequelizerc" +# ynh_store_file_checksum --file="$final_path/config.json" -# # DB Config File -# ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/.sequelizerc" -# ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/.sequelizerc" - -# ynh_store_file_checksum --file="$final_path/.sequelizerc" +ynh_add_config --template="../conf/config.json.example" --destination="$final_path/config.json" ynh_add_config --template="../conf/.sequelizerc.example" --destination="$final_path/.sequelizerc" @@ -165,7 +161,8 @@ ynh_add_config --template="../conf/.sequelizerc.example" --destination="$final_p ynh_script_progression --message="Securing files and directories..." --weight=1 # Set permissions to app files -chown -R $app: $final_path +chown -R $app:$app $final_path +chmod 600 $final_path/.sequelizerc #================================================= # INTEGRATE SERVICE IN YUNOHOST diff --git a/scripts/restore b/scripts/restore index 081632a..96f392b 100644 --- a/scripts/restore +++ b/scripts/restore @@ -52,6 +52,14 @@ ynh_script_progression --message="Restoring the NGINX configuration..." --weight 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 #================================================= @@ -59,21 +67,14 @@ ynh_script_progression --message="Restoring HedgeDoc 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 #================================================= ynh_script_progression --message="Restoring user rights..." --weight=2 # Restore permissions on app files -chown -R $app: $final_path +chown -R $app:$app $final_path +chmod 600 $final_path/.sequelizerc #================================================= # SPECIFIC RESTORATION diff --git a/scripts/upgrade b/scripts/upgrade index 21d73d2..81aa8e8 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -66,6 +66,14 @@ ynh_script_progression --message="Stopping a systemd service..." --weight=1 ynh_systemd_action --service_name=$app --action=stop --log_path="systemd" +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 + +# Create a dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir=$final_path + #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= @@ -116,14 +124,6 @@ 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" -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 - -# Create a dedicated user (if not existing) -ynh_system_user_create --username=$app - #================================================= # SPECIFIC UPGRADE #============================================== @@ -139,26 +139,6 @@ then popd || ynh_die fi -#================================================= -# MODIFY A CONFIG FILE -#================================================= -ynh_script_progression --message="Modifying a config file..." --weight=2 - -ynh_backup_if_checksum_is_different --file="$final_path/config.json" - -cp ../conf/config.json.example "$final_path/config.json" - -# # Main config File -ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__PATH__" --replace_string="${path_url:1}" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/config.json" - -# Recalculate and store the checksum of the file for the next upgrade. -ynh_store_file_checksum --file="$final_path/config.json" - #================================================= # SETUP SYSTEMD #================================================= @@ -178,7 +158,8 @@ ynh_add_systemd_config ynh_script_progression --message="Securing files and directories..." --weight=1 # Set permissions on app files -chown -R $app: $final_path +chown -R $app:$app $final_path +chmod 600 $final_path/.sequelizerc #================================================= # INTEGRATE SERVICE IN YUNOHOST From a8cabf0c0addf8f9c4569b27ae04512db5c93df0 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 21 Mar 2021 17:13:09 +0100 Subject: [PATCH 018/120] Remove yarn --- scripts/install | 17 +---------------- scripts/restore | 3 --- scripts/upgrade | 3 --- 3 files changed, 1 insertion(+), 22 deletions(-) diff --git a/scripts/install b/scripts/install index daa62a7..b81f39b 100644 --- a/scripts/install +++ b/scripts/install @@ -46,7 +46,7 @@ ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url 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=path --value=$path_url #================================================= # STANDARD MODIFICATIONS @@ -69,9 +69,6 @@ ynh_exec_warn_less 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" - #================================================= # CREATE DEDICATED USER #================================================= @@ -137,18 +134,6 @@ ynh_script_progression --message="Modifying a config file..." --weight=1 path=${path_url:1} -# cp ../conf/config.json.example "$final_path/config.json" - -# # Main config File -# ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/config.json" -# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/config.json" -# ynh_replace_string --match_string="__PATH__" --replace_string="${path_url:1}" --target_file="$final_path/config.json" -# ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/config.json" -# ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/config.json" -# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/config.json" - -# ynh_store_file_checksum --file="$final_path/config.json" - ynh_add_config --template="../conf/config.json.example" --destination="$final_path/config.json" ynh_add_config --template="../conf/.sequelizerc.example" --destination="$final_path/.sequelizerc" diff --git a/scripts/restore b/scripts/restore index 96f392b..fcd7cab 100644 --- a/scripts/restore +++ b/scripts/restore @@ -89,9 +89,6 @@ ynh_exec_warn_less 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" - #================================================= # RESTORE THE POSTGRESQL DATABASE #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 81aa8e8..23b8961 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -121,9 +121,6 @@ ynh_exec_warn_less 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" - #================================================= # SPECIFIC UPGRADE #============================================== From a4cb942a89f2987183505e78af0e25f9115ee0e2 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 21 Mar 2021 17:25:02 +0100 Subject: [PATCH 019/120] Update change_url --- scripts/change_url | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index ad20b77..5192e9d 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -113,18 +113,20 @@ fi ynh_backup_if_checksum_is_different --file="$final_path/config.json" domain=$new_domain -path_url=$new_path +path_url=${new_path:1} -cp ../conf/config.json.example "$final_path/config.json" +# cp ../conf/config.json.example "$final_path/config.json" -ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__PATH__" --replace_string="${path_url:1}" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/config.json" +# ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/config.json" +# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/config.json" +# ynh_replace_string --match_string="__PATH__" --replace_string="${path_url:1}" --target_file="$final_path/config.json" +# ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/config.json" +# ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/config.json" +# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/config.json" -ynh_store_file_checksum --file="$final_path/config.json" +# ynh_store_file_checksum --file="$final_path/config.json" + +ynh_add_config --template="../conf/config.json.example" --destination="$final_path/config.json" #================================================= # GENERIC FINALISATION From 0bb471a4b5b142c9c05c72d05a479a0f9fcbc6b3 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 21 Mar 2021 17:26:00 +0100 Subject: [PATCH 020/120] Update change_url --- scripts/change_url | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/change_url b/scripts/change_url index 5192e9d..e7553c6 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -110,7 +110,7 @@ fi # CONFIGURE HEDGEDOC #================================================= -ynh_backup_if_checksum_is_different --file="$final_path/config.json" +#ynh_backup_if_checksum_is_different --file="$final_path/config.json" domain=$new_domain path_url=${new_path:1} From dccd8ec47fef84eba035f95e29861c66b177c3bd Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 21 Mar 2021 17:31:15 +0100 Subject: [PATCH 021/120] Revert "Remove yarn" This reverts commit a8cabf0c0addf8f9c4569b27ae04512db5c93df0. --- scripts/install | 17 ++++++++++++++++- scripts/restore | 3 +++ scripts/upgrade | 3 +++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index b81f39b..daa62a7 100644 --- a/scripts/install +++ b/scripts/install @@ -46,7 +46,7 @@ ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url 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=path --value=$path_url #================================================= # STANDARD MODIFICATIONS @@ -69,6 +69,9 @@ ynh_exec_warn_less 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" + #================================================= # CREATE DEDICATED USER #================================================= @@ -134,6 +137,18 @@ ynh_script_progression --message="Modifying a config file..." --weight=1 path=${path_url:1} +# cp ../conf/config.json.example "$final_path/config.json" + +# # Main config File +# ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/config.json" +# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/config.json" +# ynh_replace_string --match_string="__PATH__" --replace_string="${path_url:1}" --target_file="$final_path/config.json" +# ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/config.json" +# ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/config.json" +# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/config.json" + +# ynh_store_file_checksum --file="$final_path/config.json" + ynh_add_config --template="../conf/config.json.example" --destination="$final_path/config.json" ynh_add_config --template="../conf/.sequelizerc.example" --destination="$final_path/.sequelizerc" diff --git a/scripts/restore b/scripts/restore index fcd7cab..96f392b 100644 --- a/scripts/restore +++ b/scripts/restore @@ -89,6 +89,9 @@ ynh_exec_warn_less 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" + #================================================= # RESTORE THE POSTGRESQL DATABASE #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 23b8961..81aa8e8 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -121,6 +121,9 @@ ynh_exec_warn_less 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" + #================================================= # SPECIFIC UPGRADE #============================================== From 94cdd7ab300f9b036fac966f20f14f1174d100db Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 21 Mar 2021 19:15:45 +0100 Subject: [PATCH 022/120] Update change_url --- scripts/change_url | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index e7553c6..ad20b77 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -110,23 +110,21 @@ fi # CONFIGURE HEDGEDOC #================================================= -#ynh_backup_if_checksum_is_different --file="$final_path/config.json" +ynh_backup_if_checksum_is_different --file="$final_path/config.json" domain=$new_domain -path_url=${new_path:1} +path_url=$new_path -# cp ../conf/config.json.example "$final_path/config.json" +cp ../conf/config.json.example "$final_path/config.json" -# ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/config.json" -# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/config.json" -# ynh_replace_string --match_string="__PATH__" --replace_string="${path_url:1}" --target_file="$final_path/config.json" -# ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/config.json" -# ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/config.json" -# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__PATH__" --replace_string="${path_url:1}" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/config.json" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/config.json" -# ynh_store_file_checksum --file="$final_path/config.json" - -ynh_add_config --template="../conf/config.json.example" --destination="$final_path/config.json" +ynh_store_file_checksum --file="$final_path/config.json" #================================================= # GENERIC FINALISATION From 1a62d43d40762555f3585562716443d7a320c54d Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 22 Mar 2021 22:31:12 +0100 Subject: [PATCH 023/120] Update systemd.service --- conf/systemd.service | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/conf/systemd.service b/conf/systemd.service index 7ad3203..c79fe70 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -15,5 +15,12 @@ Restart=always PrivateTmp=true PrivateDevices=true +PrivateDevices=true +ProtectControlGroups=true +ProtectHome=true +ProtectKernelTunables=true +ProtectSystem=full +RestrictSUIDSGID=true + [Install] WantedBy=multi-user.target From ac84ae8904a9cdba8cf24096f7267e347b4f22ca Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 22 Mar 2021 22:42:42 +0100 Subject: [PATCH 024/120] Update systemd.service --- conf/systemd.service | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/systemd.service b/conf/systemd.service index c79fe70..839ebca 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -15,7 +15,6 @@ Restart=always PrivateTmp=true PrivateDevices=true -PrivateDevices=true ProtectControlGroups=true ProtectHome=true ProtectKernelTunables=true From 67de8ae05e6351391d7ede8f606b1504004e3f6b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 23 Mar 2021 19:42:07 +0100 Subject: [PATCH 025/120] Cleaning up --- check_process | 1 - scripts/install | 12 ------------ scripts/upgrade | 2 +- 3 files changed, 1 insertion(+), 14 deletions(-) diff --git a/check_process b/check_process index c96585b..15aa133 100644 --- a/check_process +++ b/check_process @@ -15,7 +15,6 @@ upgrade=1 from_commit=2a6ed9db5f7f0644eab251b2495c190811735832 backup_restore=1 multi_instance=1 - port_already_use=1 change_url=1 ;;; Options Email= diff --git a/scripts/install b/scripts/install index daa62a7..d66cd65 100644 --- a/scripts/install +++ b/scripts/install @@ -137,18 +137,6 @@ ynh_script_progression --message="Modifying a config file..." --weight=1 path=${path_url:1} -# cp ../conf/config.json.example "$final_path/config.json" - -# # Main config File -# ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/config.json" -# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/config.json" -# ynh_replace_string --match_string="__PATH__" --replace_string="${path_url:1}" --target_file="$final_path/config.json" -# ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/config.json" -# ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/config.json" -# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/config.json" - -# ynh_store_file_checksum --file="$final_path/config.json" - ynh_add_config --template="../conf/config.json.example" --destination="$final_path/config.json" ynh_add_config --template="../conf/.sequelizerc.example" --destination="$final_path/.sequelizerc" diff --git a/scripts/upgrade b/scripts/upgrade index 81aa8e8..d71bd9c 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -64,7 +64,7 @@ ynh_abort_if_errors #================================================= ynh_script_progression --message="Stopping a systemd service..." --weight=1 -ynh_systemd_action --service_name=$app --action=stop --log_path="systemd" +ynh_systemd_action --service_name=$app --action=stop --log_path=systemd #================================================= # CREATE DEDICATED USER From 1d7e631ac8a0fcd868ebc7070220673f971e95a1 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 24 Mar 2021 12:54:05 +0100 Subject: [PATCH 026/120] Fix --- scripts/install | 5 +++-- scripts/restore | 1 + scripts/upgrade | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index d66cd65..88c4d5e 100644 --- a/scripts/install +++ b/scripts/install @@ -46,7 +46,7 @@ ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url 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=path --value=$path_url #================================================= # STANDARD MODIFICATIONS @@ -125,7 +125,7 @@ popd || ynh_die #================================================= 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_replace_string --match_string="__ENV_PATH__" --replace_string="$PATH" --target_file="../conf/systemd.service" ynh_replace_string --match_string="__YNH_NPM__" --replace_string="$ynh_npm" --target_file="../conf/systemd.service" ynh_add_systemd_config @@ -150,6 +150,7 @@ ynh_script_progression --message="Securing files and directories..." --weight=1 # Set permissions to app files chown -R $app:$app $final_path +chmod o-rwx $final_path chmod 600 $final_path/.sequelizerc #================================================= diff --git a/scripts/restore b/scripts/restore index 96f392b..2dd10da 100644 --- a/scripts/restore +++ b/scripts/restore @@ -74,6 +74,7 @@ ynh_script_progression --message="Restoring user rights..." --weight=2 # Restore permissions on app files chown -R $app:$app $final_path +chmod o-rwx $final_path chmod 600 $final_path/.sequelizerc #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index d71bd9c..ab50ba4 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -159,6 +159,7 @@ ynh_script_progression --message="Securing files and directories..." --weight=1 # Set permissions on app files chown -R $app:$app $final_path +chmod o-rwx $final_path chmod 600 $final_path/.sequelizerc #================================================= From cb3538638a87a3a2dabcffac38c4828fe8c44893 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 4 Apr 2021 07:09:32 +0200 Subject: [PATCH 027/120] fix badges --- README.md | 4 ++-- README_fr.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c110cf1..5ce4129 100644 --- a/README.md +++ b/README.md @@ -40,8 +40,8 @@ When you finished editing the configuration, for your changes to take effect, yo #### Supported architectures -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/hedgedoc%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/hedgedoc/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/hedgedoc%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/hedgedoc/) +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/hedgedoc.svg)](https://ci-apps.yunohost.org/ci/apps/hedgedoc/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/hedgedoc.svg)](https://ci-apps-arm.yunohost.org/ci/apps/hedgedoc/) ## Limitations diff --git a/README_fr.md b/README_fr.md index 7ffeef7..af8ece2 100644 --- a/README_fr.md +++ b/README_fr.md @@ -40,8 +40,8 @@ Lorsque vous avez terminé de modifier la configuration, pour que vos modificati #### Architectures supportées -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/hedgedoc%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/hedgedoc/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/hedgedoc%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/hedgedoc/) +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/hedgedoc.svg)](https://ci-apps.yunohost.org/ci/apps/hedgedoc/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/hedgedoc.svg)](https://ci-apps-arm.yunohost.org/ci/apps/hedgedoc/) ## Limitations From 5efd282944f886bda5836fcc70fb8f964c9f7071 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 27 Apr 2021 06:54:07 +0200 Subject: [PATCH 028/120] Upgrade to version 1.8.0 (#21) * Upgrade to version 1.8.0 --- README.md | 4 ++-- README_fr.md | 4 ++-- conf/.sequelizerc.example | 8 -------- conf/app.src | 4 ++-- manifest.json | 2 +- scripts/install | 4 +--- scripts/restore | 2 +- scripts/upgrade | 4 +--- 8 files changed, 10 insertions(+), 22 deletions(-) delete mode 100644 conf/.sequelizerc.example diff --git a/README.md b/README.md index 5ce4129..3cb78f9 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,12 @@ *[Lire ce readme en français.](./README_fr.md)* > *This package allows you to install HedgeDoc 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.* +If you don't have YunoHost, please consult [the guide](https://yunohost.org/install) to learn how to install it.* ## Overview HedgeDoc ([formerly known as CodiMD](https://hedgedoc.org/history/)) is an open-source collaborative markdown editor. With HedgeDoc you can easily collaborate on notes, graphs and even presentations in real-time. All you need to do is to share your note-link to your co-workers, and they’re ready to go. -**Shipped version:** 1.7.2 +**Shipped version:** 1.8.0 ## Screenshots diff --git a/README_fr.md b/README_fr.md index af8ece2..174252c 100644 --- a/README_fr.md +++ b/README_fr.md @@ -6,12 +6,12 @@ *[Read this readme in english.](./README.md)* > *Ce package vous permet d'installer HedgeDoc rapidement et simplement sur un serveur YunoHost. -Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install) pour apprendre comment l'installer.* +Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/install) pour apprendre comment l'installer.* ## Vue d'ensemble HedgeDoc ([anciennement connu sous le nom de CodiMD](https://hedgedoc.org/history/)) est un éditeur Markdown collaboratif open-source. Avec HedgeDoc, vous pouvez facilement collaborer sur des notes, des graphiques et même des présentations en temps réel. Tout ce que vous avez à faire est de partager votre lien de note avec vos collègues. -**Version incluse :** 1.7.2 +**Version incluse :** 1.8.0 ## Captures d'écran diff --git a/conf/.sequelizerc.example b/conf/.sequelizerc.example deleted file mode 100644 index ddb5cba..0000000 --- a/conf/.sequelizerc.example +++ /dev/null @@ -1,8 +0,0 @@ -var path = require('path'); - -module.exports = { - 'config': path.resolve('config.json'), - 'migrations-path': path.resolve('lib', 'migrations'), - 'models-path': path.resolve('lib', 'models'), - 'url': 'postgres://__DB_NAME__:__DB_PWD__@localhost:5432/__DB_NAME__' -} diff --git a/conf/app.src b/conf/app.src index 80312fa..273e25c 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.7.2/hedgedoc-1.7.2.tar.gz -SOURCE_SUM=8bb66ba9c839a4d81f72267b91a201f97a48f16aa95434586d6dd6be40502d6d +SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.8.0-rc1/hedgedoc-1.8.0-rc1.tar.gz +SOURCE_SUM=d9ea1d4d81312b82e53a33ab472eca5641d2f24b23c92590c0aef45b63c64dba SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 6a521f0..cf9329a 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.7.2~ynh2", + "version": "1.8.0~ynh1", "url": "https://github.com/hedgedoc/hedgedoc", "license": "AGPL-3.0-only", "maintainer": { diff --git a/scripts/install b/scripts/install index 88c4d5e..f9eb446 100644 --- a/scripts/install +++ b/scripts/install @@ -139,8 +139,6 @@ path=${path_url:1} ynh_add_config --template="../conf/config.json.example" --destination="$final_path/config.json" -ynh_add_config --template="../conf/.sequelizerc.example" --destination="$final_path/.sequelizerc" - #================================================= # GENERIC FINALIZATION #================================================= @@ -151,7 +149,7 @@ ynh_script_progression --message="Securing files and directories..." --weight=1 # Set permissions to app files chown -R $app:$app $final_path chmod o-rwx $final_path -chmod 600 $final_path/.sequelizerc +chmod 600 $final_path/config.json #================================================= # INTEGRATE SERVICE IN YUNOHOST diff --git a/scripts/restore b/scripts/restore index 2dd10da..47778fb 100644 --- a/scripts/restore +++ b/scripts/restore @@ -75,7 +75,7 @@ ynh_script_progression --message="Restoring user rights..." --weight=2 # Restore permissions on app files chown -R $app:$app $final_path chmod o-rwx $final_path -chmod 600 $final_path/.sequelizerc +chmod 600 $final_path/config.json #================================================= # SPECIFIC RESTORATION diff --git a/scripts/upgrade b/scripts/upgrade index ab50ba4..807341c 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -87,7 +87,6 @@ then # Backup the config file in the temp dir cp -a "$final_path/config.json" "$tmpdir/config.json" - cp -a "$final_path/.sequelizerc" "$tmpdir/.sequelizerc" # Remove the app directory securely ynh_secure_remove --file=$final_path @@ -97,7 +96,6 @@ then #Copy the admin saved settings from tmp directory to final path cp -a "$tmpdir/config.json" "$final_path/config.json" - cp -a "$tmpdir/.sequelizerc" "$final_path/.sequelizerc" # Remove the tmp directory securely ynh_secure_remove --file="$tmpdir" @@ -160,7 +158,7 @@ ynh_script_progression --message="Securing files and directories..." --weight=1 # Set permissions on app files chown -R $app:$app $final_path chmod o-rwx $final_path -chmod 600 $final_path/.sequelizerc +chmod 600 $final_path/config.json #================================================= # INTEGRATE SERVICE IN YUNOHOST From 14de28860c8128001d54d1557709980da6d2224d Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 3 May 2021 23:42:36 +0200 Subject: [PATCH 029/120] Upgrade to 1.8.0 --- conf/app.src | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/app.src b/conf/app.src index 273e25c..dffdaa9 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.8.0-rc1/hedgedoc-1.8.0-rc1.tar.gz -SOURCE_SUM=d9ea1d4d81312b82e53a33ab472eca5641d2f24b23c92590c0aef45b63c64dba +SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.8.0/hedgedoc-1.8.0.tar.gz +SOURCE_SUM=ebc4565d45fd77adf77f9255bf176572b6d9762d7601b2eb9ab551c2b521de80 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true From 056b1a4585b267679238c604c96cf0fba274a18e Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 4 May 2021 08:03:03 +0200 Subject: [PATCH 030/120] Upgrade to 1.8.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 273e25c..dffdaa9 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.8.0-rc1/hedgedoc-1.8.0-rc1.tar.gz -SOURCE_SUM=d9ea1d4d81312b82e53a33ab472eca5641d2f24b23c92590c0aef45b63c64dba +SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.8.0/hedgedoc-1.8.0.tar.gz +SOURCE_SUM=ebc4565d45fd77adf77f9255bf176572b6d9762d7601b2eb9ab551c2b521de80 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index cf9329a..0a1cbb9 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.8.0~ynh1", + "version": "1.8.0~ynh2", "url": "https://github.com/hedgedoc/hedgedoc", "license": "AGPL-3.0-only", "maintainer": { From 2ff6857df701edc63ba0cfcf23ccbc5b4d63442a Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 6 May 2021 22:51:06 +0200 Subject: [PATCH 031/120] Upgrade to version 1.8.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 3cb78f9..16dabae 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/inst ## Overview HedgeDoc ([formerly known as CodiMD](https://hedgedoc.org/history/)) is an open-source collaborative markdown editor. With HedgeDoc you can easily collaborate on notes, graphs and even presentations in real-time. All you need to do is to share your note-link to your co-workers, and they’re ready to go. -**Shipped version:** 1.8.0 +**Shipped version:** 1.8.1 ## Screenshots diff --git a/README_fr.md b/README_fr.md index 174252c..609635d 100644 --- a/README_fr.md +++ b/README_fr.md @@ -11,7 +11,7 @@ Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/install) ## Vue d'ensemble HedgeDoc ([anciennement connu sous le nom de CodiMD](https://hedgedoc.org/history/)) est un éditeur Markdown collaboratif open-source. Avec HedgeDoc, vous pouvez facilement collaborer sur des notes, des graphiques et même des présentations en temps réel. Tout ce que vous avez à faire est de partager votre lien de note avec vos collègues. -**Version incluse :** 1.8.0 +**Version incluse :** 1.8.1 ## Captures d'écran diff --git a/conf/app.src b/conf/app.src index dffdaa9..92b2e8c 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.8.0/hedgedoc-1.8.0.tar.gz -SOURCE_SUM=ebc4565d45fd77adf77f9255bf176572b6d9762d7601b2eb9ab551c2b521de80 +SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.8.1/hedgedoc-1.8.1.tar.gz +SOURCE_SUM=74f632457df71d00d3c85f4a727972f01f7e894c5def19d93e4c7be8f39a2bd0 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 0a1cbb9..f0a848e 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.8.0~ynh2", + "version": "1.8.1~ynh1", "url": "https://github.com/hedgedoc/hedgedoc", "license": "AGPL-3.0-only", "maintainer": { From 1bb34ee85dab65fea7b367c9bb960fb9e8d58c1e Mon Sep 17 00:00:00 2001 From: YunoHost Bot Date: Tue, 11 May 2021 07:26:37 +0200 Subject: [PATCH 032/120] [autopatch] Update issue and PR templates (#25) Co-authored-by: Yunohost-Bot <> --- issue_template.md | 46 ---------------------------------------- pull_request_template.md | 16 -------------- 2 files changed, 62 deletions(-) delete mode 100644 issue_template.md delete mode 100644 pull_request_template.md diff --git a/issue_template.md b/issue_template.md deleted file mode 100644 index 481e34f..0000000 --- a/issue_template.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -name: Bug report -about: Create a report to help us debug, it would be nice to fill the template as much as you can to help us, help you and help us all. - ---- - -**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 HedgeDoc itself. Refer to its documentation or repository for help.* - - *If you have a doubt, post here, 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.* - -**Versions** -- 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 hedgedoc`* - -**To Reproduce** -*Steps to reproduce the behavior.* -- *If you performed a command from the CLI, the command itself is enough. For example:* - ```sh - sudo yunohost app install hedgedoc - ``` -- *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** -*After a failed command, YunoHost makes the log available to you, but also to others, thanks to `yunohost log display [log name] --share`. The actual command, with the correct log name, is displayed at the end of the failed attempt in the CLI. Execute it and copy here the share link it outputs.* -*If applicable and useful, add screenshots to help explain your problem.* diff --git a/pull_request_template.md b/pull_request_template.md deleted file mode 100644 index 6c28fc5..0000000 --- a/pull_request_template.md +++ /dev/null @@ -1,16 +0,0 @@ -## Problem -- *Description of why you made this PR* - -## Solution -- *And how do you fix that problem* - -## PR Status -- [ ] Code finished. -- [ ] Tested with Package_check. -- [ ] Fix or enhancement tested. -- [ ] Upgrade from last version tested. -- [ ] Can be reviewed and tested. - -## Package_check results ---- -* An automatic package_check will be launch at https://ci-apps-dev.yunohost.org/, when you add a specific comment to your Pull Request: "!testme", "!gogogadgetoci" or "By the power of systemd, I invoke The Great App CI to test this Pull Request!"* From 422d909c65010417c8f3d707b92d4f182c8932b4 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 11 May 2021 10:27:47 +0200 Subject: [PATCH 033/120] Add templates --- .github/ISSUE_TEMPLATE.md | 55 ++++++++++++++++++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 16 ++++++++++ 2 files changed, 71 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 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 100644 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 ca0e608a5542cea8c7c5bb259ee0225ee5d8ded0 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 12 May 2021 07:54:29 +0200 Subject: [PATCH 034/120] Upgrade to 1.8.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 16dabae..96dd895 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/inst ## Overview HedgeDoc ([formerly known as CodiMD](https://hedgedoc.org/history/)) is an open-source collaborative markdown editor. With HedgeDoc you can easily collaborate on notes, graphs and even presentations in real-time. All you need to do is to share your note-link to your co-workers, and they’re ready to go. -**Shipped version:** 1.8.1 +**Shipped version:** 1.8.2 ## Screenshots diff --git a/README_fr.md b/README_fr.md index 609635d..f457c58 100644 --- a/README_fr.md +++ b/README_fr.md @@ -11,7 +11,7 @@ Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/install) ## Vue d'ensemble HedgeDoc ([anciennement connu sous le nom de CodiMD](https://hedgedoc.org/history/)) est un éditeur Markdown collaboratif open-source. Avec HedgeDoc, vous pouvez facilement collaborer sur des notes, des graphiques et même des présentations en temps réel. Tout ce que vous avez à faire est de partager votre lien de note avec vos collègues. -**Version incluse :** 1.8.1 +**Version incluse :** 1.8.2 ## Captures d'écran diff --git a/conf/app.src b/conf/app.src index 92b2e8c..d2932ef 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.8.1/hedgedoc-1.8.1.tar.gz -SOURCE_SUM=74f632457df71d00d3c85f4a727972f01f7e894c5def19d93e4c7be8f39a2bd0 +SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.8.2/hedgedoc-1.8.2.tar.gz +SOURCE_SUM=e325d433aba6f5e9de91162dd97a605e29ebc5e740750cd47054abfdc1f8fd42 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index f0a848e..6f7c41b 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.8.1~ynh1", + "version": "1.8.2~ynh1", "url": "https://github.com/hedgedoc/hedgedoc", "license": "AGPL-3.0-only", "maintainer": { From a2e40798c75917a6baeaaf10dc1507a07966fb0c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 25 May 2021 22:43:51 +0200 Subject: [PATCH 035/120] Update check_process --- check_process | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/check_process b/check_process index 15aa133..85e5f61 100644 --- a/check_process +++ b/check_process @@ -1,9 +1,9 @@ ;; Test complet ; Manifest - domain="domain.tld" (DOMAIN) - path="/path" (PATH) - admin="john" (USER) - is_public=1 (PUBLIC|public=1|private=0) + domain="domain.tld" + path="/path" + admin="john" + is_public=1 ; Checks pkg_linter=1 setup_sub_dir=1 From e9e58005ff79fa5828e96631033d78dda5ca3f92 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 25 May 2021 22:47:09 +0200 Subject: [PATCH 036/120] Add templates --- doc/DISCLAIMER.md | 4 ++++ doc/DISCLAIMER_fr.md | 4 ++++ doc/screenshots/screenshot.png | Bin 0 -> 249062 bytes manifest.json | 12 ++++++++++-- 4 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 doc/DISCLAIMER.md create mode 100644 doc/DISCLAIMER_fr.md create mode 100644 doc/screenshots/screenshot.png diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md new file mode 100644 index 0000000..2314b9b --- /dev/null +++ b/doc/DISCLAIMER.md @@ -0,0 +1,4 @@ +## Configuration + +You can configure HedgeDoc by editing this file `/var/www/hedgedoc/config.json` using the [documentation](https://github.com/hedgedoc/hedgedoc/blob/master/docs/configuration.md) +When you finished editing the configuration, for your changes to take effect, you will have to run: `sudo systemctl restart hedgedoc`. diff --git a/doc/DISCLAIMER_fr.md b/doc/DISCLAIMER_fr.md new file mode 100644 index 0000000..aefa446 --- /dev/null +++ b/doc/DISCLAIMER_fr.md @@ -0,0 +1,4 @@ +## Configuration + +Vous pouvez configurer HedgeDoc en modifiant le fichier `/var/www/hedgedoc/config.json` et en vous aidant de la [documentation](https://github.com/hedgedoc/hedgedoc/blob/master/docs/configuration.md) +Lorsque vous avez terminé de modifier la configuration, pour que vos modifications prennent effet, vous devrez exécuter : `sudo systemctl restart hedgedoc`. diff --git a/doc/screenshots/screenshot.png b/doc/screenshots/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..25104ad76b0fa64348de595a174368c0e4428f83 GIT binary patch literal 249062 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 z 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�!;DNoQv#2oZq8 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

x{l64r_#TS(*Ye#{NCmvrS1ch zdn`oCTodLaLZ;tCM0O3s(w^pNac6O$>PVBtqV>{u*iC+DaUoTEred!T!F5FE%N7BSklXDw=I8BQw+Kt9fU!3ca50+NPU+;eBN#rFbw>VcYfEL1v(i z27Iohw4{Q0=&grhrr%#Y_VTo}urLb>ZKLt(A|{BDu5FPlhdM$!IuuRd(3!PTKejm5 zzvrZe5SMrDN>-mshjBbdo@zd1;bqx|;97!4J_zNTa95!dFx1p1R$Nq+)E1LSfmacGv3Y7sjwEUm8Y#I+{1mcLbA6qSu3eEB&cd!Ob_+$`oHo{PW zaX>>=S=qUHHF9%rZ|~I9IY6EQl{&vD@1Qs1-Ng)%#v?P((HR9E6_+5tprH9417bgo z;ulWP94#ImTJZyS%c^e;7)uRVd4>SagP!eboJ5s{h2+S`AC=Irud?~Y@3x;U6HfhN zK4^Q&^9H4m!ub5AVuUvF3~9#Pr-E25KuMMu)!$LRwJcXaepfl=;D8w993 z)LDUt+@l|}vZ!F@Mo3H0fHbUulA#$6ewSTpV3r^Xy>yX8hW+G7Lp&4yWHsOX!EiKiBVKqPm3e zmjwqS+ja45etibh70ro>T84hdJ7T&DwBKP1erjuNrHoeYpbm8j4jO&6GC7TX+fM77 z#cuUApmovs{N0#qFVu^oIdU|*U<_OiErP;qLY>R4t*xzV*`@96n>WbxXN5^gk3O}G z%*+7ugQ`x9g=J&BY!P-Uz50v{3K=$KP*8`pEv-;Cj`MTuJ2?vuMqXaRzX73k8%|nA zPDwzPwRf3(%feWrey>?cSNU2InFOVeX4lkIhC4+15fF`N8Oh0Y9zF~OCrDYkFgH(k z_w}O$X^YpbrZ84~xWfK@{pWp>8ZPgG5#nhl|9kIEcIzESzC5CjkKwic0a>me15T*# zy-*X3jW7B6XTUN$Ta~yD?J_W^zdlmZS1|jnxU~7F^Bs*R`ND6WwCN>(Qj`7tgM*&# z?t6dn@=u`e2yVCMkSn=8$OO8P65O)2o5e>*^Wvjj@98{#%xl&b0gThHT$nZ7g@$rcQmnR#i3u*DK9qm%?)^2+=E1?i@2wVs zzO56o1_H^YqrKgHD; zkexyQke|Pj8Kn!3(@v=l^CaJsJv^waD;~S)ZX4!x))B# z34}d?>x;_`ODhIzxN9AahckKu}yyup_t?z0JJf( zf3L3AJ1_1+67jlCTzqy-V@m9 zs0M|HguFNy1?Fp8XD2Gk$vZJ0qJ|UbExS3Db_U9DMEOT$<3~|msb`6Xx|+?=`{h!% zqW`FM%67&Dkmn4wKn)glAxs#hUE0E*i?QCtu1QFIsHqvZyN5M4^ z-QpgGVxJYgz}Tlx7G=6IWq1ix=4?FC@whV3xJoeOh>MJT$C;IW z{peeb&Z9@eKx0JY@2WYJo}0L(AS_AL0rr}{rp@w?ICV=A4qviJ{-KL|MxIK>#b*9v zqUjoek>*ni07l(ek|xdiWYaSQ>{-w@`uYm-=)-m=D-AwAYUO9&X7frDXiltfTgUhG z^i;uQt^;76p+iq%H;l%#CZga#;S2;>vXyA?0|DA89E*umY%mq(3^+EZ9)V`H0GXit z=|@Bv22UUCsSVN8E)9(X_M!jk2j0TzY0=c5wn#)J1v*934L*RiB{GM8w1Z2VS-g^a z7j7=WqP#B;5H=+|19!ck1Rxc}N>sY(&P^bqS)8YYpvEx$cjBb9R?fnx z0dpcbrotS#?4@Qg+Jns56PBtR#-GQrj=u#Nbs4EPj&lZ}R))UT7~cQUnZ+eL@k#!M z>h2u89dzF6m-z4bmH!W&GZqWCvAk^wF9gW{R}d2YYcfKd^IMa-MEc-^Xui`OcJng< en8Rh!b&ZVT<38`iBKiRVz7!v-$rekSy!?N4Nm0iD literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json index 6f7c41b..0b6f5a2 100644 --- a/manifest.json +++ b/manifest.json @@ -7,13 +7,21 @@ "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, "version": "1.8.2~ynh1", - "url": "https://github.com/hedgedoc/hedgedoc", + "url": "https://hedgedoc.org", + "upstream": { + "license": "free", + "website": "https://hedgedoc.org", + "demo": "https://demo.hedgedoc.org/", + "admindoc": "https://docs.hedgedoc.org/", + "userdoc": "https://yunohost.org/en/app_hedgedoc", + "code": "https://github.com/hedgedoc/hedgedoc" + }, "license": "AGPL-3.0-only", "maintainer": { "name": "eric_G" }, "requirements": { - "yunohost": ">= 4.1.7" + "yunohost": ">= 4.2.4" }, "multi_instance": true, "services": [ From a36b5debf9e0cf934d4a72dd1d2a01442505afca Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Fri, 4 Jun 2021 08:14:53 +0000 Subject: [PATCH 037/120] Auto-update README --- README.md | 59 ++++++++++++++++++++-------------------------------- README_fr.md | 57 ++++++++++++++++++-------------------------------- 2 files changed, 43 insertions(+), 73 deletions(-) diff --git a/README.md b/README.md index 96dd895..b325390 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ + + # HedgeDoc for YunoHost [![Integration level](https://dash.yunohost.org/integration/hedgedoc.svg)](https://dash.yunohost.org/appci/app/hedgedoc) ![](https://ci-apps.yunohost.org/ci/badges/hedgedoc.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/hedgedoc.maintain.svg) @@ -5,56 +10,36 @@ *[Lire ce readme en français.](./README_fr.md)* -> *This package allows you to install HedgeDoc 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.* +> *This package allows you to install HedgeDoc 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 -HedgeDoc ([formerly known as CodiMD](https://hedgedoc.org/history/)) is an open-source collaborative markdown editor. With HedgeDoc you can easily collaborate on notes, graphs and even presentations in real-time. All you need to do is to share your note-link to your co-workers, and they’re ready to go. -**Shipped version:** 1.8.2 +Collaborative editor to work on notes written in Markdown + +**Shipped version:** 1.8.2~ynh1 + +**Demo:** https://demo.hedgedoc.org/ ## Screenshots -![](https://demo.hedgedoc.org/screenshot.png) +![](./doc/screenshots/screenshot.png) -## Demo - -* [Official demo](https://demo.hedgedoc.org/) +## Disclaimers / important information ## Configuration You can configure HedgeDoc by editing this file `/var/www/hedgedoc/config.json` using the [documentation](https://github.com/hedgedoc/hedgedoc/blob/master/docs/configuration.md) When you finished editing the configuration, for your changes to take effect, you will have to run: `sudo systemctl restart hedgedoc`. -## Documentation +## Documentation and resources - * Official documentation: https://github.com/hedgedoc/hedgedoc/tree/master/docs - * YunoHost documentation: https://yunohost.org/en/app_hedgedoc - -## YunoHost specific features - -#### Multi-user support - -* Is LDAP supported? **Yes** -* Can the app be used by multiple users? **Yes** - -#### Supported architectures - -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/hedgedoc.svg)](https://ci-apps.yunohost.org/ci/apps/hedgedoc/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/hedgedoc.svg)](https://ci-apps-arm.yunohost.org/ci/apps/hedgedoc/) - -## Limitations - -* HedgeDoc needs more than 3 GB of RAM to build. - -## Links - - * Report a bug: https://github.com/YunoHost-Apps/hedgedoc_ynh/issues - * App website: https://hedgedoc.org - * Upstream app repository: https://github.com/hedgedoc/hedgedoc - * YunoHost website: https://yunohost.org/ - ---- +* Official app website: https://hedgedoc.org +* Official user documentation: https://yunohost.org/en/app_hedgedoc +* Official admin documentation: https://docs.hedgedoc.org/ +* Upstream app code repository: https://github.com/hedgedoc/hedgedoc +* YunoHost documentation for this app: https://yunohost.org/app_hedgedoc +* Report a bug: https://github.com/YunoHost-Apps/hedgedoc_ynh/issues ## Developer info @@ -66,3 +51,5 @@ sudo yunohost app install https://github.com/YunoHost-Apps/hedgedoc_ynh/tree/tes or sudo yunohost app upgrade hedgedoc -u https://github.com/YunoHost-Apps/hedgedoc_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 index f457c58..289e89a 100644 --- a/README_fr.md +++ b/README_fr.md @@ -3,58 +3,39 @@ [![Niveau d'intégration](https://dash.yunohost.org/integration/hedgedoc.svg)](https://dash.yunohost.org/appci/app/hedgedoc) ![](https://ci-apps.yunohost.org/ci/badges/hedgedoc.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/hedgedoc.maintain.svg) [![Installer HedgeDoc avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=hedgedoc) -*[Read this readme in english.](./README.md)* +*[Read this readme in english.](./README.md)* +*[Lire ce readme en français.](./README_fr.md)* -> *Ce package vous permet d'installer HedgeDoc rapidement et simplement sur un serveur YunoHost. -Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/install) pour apprendre comment l'installer.* +> *Ce package vous permet d'installer HedgeDoc 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 -HedgeDoc ([anciennement connu sous le nom de CodiMD](https://hedgedoc.org/history/)) est un éditeur Markdown collaboratif open-source. Avec HedgeDoc, vous pouvez facilement collaborer sur des notes, des graphiques et même des présentations en temps réel. Tout ce que vous avez à faire est de partager votre lien de note avec vos collègues. -**Version incluse :** 1.8.2 +Éditeur collaboratif pour travailler sur des notes en Markdown + +**Version incluse :** 1.8.2~ynh1 + +**Démo :** https://demo.hedgedoc.org/ ## Captures d'écran -![](https://demo.hedgedoc.org/screenshot.png) +![](./doc/screenshots/screenshot.png) -## Démo - -* [Démo officielle](https://demo.hedgedoc.org/) +## Avertissements / informations importantes ## Configuration Vous pouvez configurer HedgeDoc en modifiant le fichier `/var/www/hedgedoc/config.json` et en vous aidant de la [documentation](https://github.com/hedgedoc/hedgedoc/blob/master/docs/configuration.md) Lorsque vous avez terminé de modifier la configuration, pour que vos modifications prennent effet, vous devrez exécuter : `sudo systemctl restart hedgedoc`. -## Documentation +## Documentations et ressources - * Documentation officielle : https://github.com/hedgedoc/hedgedoc/tree/master/docs - * Documentation YunoHost : https://yunohost.org/fr/app_hedgedoc - -## Caractéristiques spécifiques YunoHost - -#### Support multi-utilisateur - -* L'authentification LDAP est-elle prise en charge ? **Oui** -* L'application peut-elle être utilisée par plusieurs utilisateurs ? **Oui** - -#### Architectures supportées - -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/hedgedoc.svg)](https://ci-apps.yunohost.org/ci/apps/hedgedoc/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/hedgedoc.svg)](https://ci-apps-arm.yunohost.org/ci/apps/hedgedoc/) - -## Limitations - -* HedgeDoc a besoin de plus de 3 Go de RAM pour être installé. - -## Liens - - * Signaler un bug : https://github.com/YunoHost-Apps/hedgedoc_ynh/issues - * Site de l'application : https://hedgedoc.org - * Dépôt de l'application principale : https://github.com/hedgedoc/hedgedoc - * Site web YunoHost : https://yunohost.org/ - ---- +* Site officiel de l'app : https://hedgedoc.org +* Documentation officielle utilisateur : https://yunohost.org/en/app_hedgedoc +* Documentation officielle de l'admin : https://docs.hedgedoc.org/ +* Dépôt de code officiel de l'app : https://github.com/hedgedoc/hedgedoc +* Documentation YunoHost pour cette app : https://yunohost.org/app_hedgedoc +* Signaler un bug : https://github.com/YunoHost-Apps/hedgedoc_ynh/issues ## Informations pour les développeurs @@ -66,3 +47,5 @@ sudo yunohost app install https://github.com/YunoHost-Apps/hedgedoc_ynh/tree/tes ou sudo yunohost app upgrade hedgedoc -u https://github.com/YunoHost-Apps/hedgedoc_ynh/tree/testing --debug ``` + +**Plus d'infos sur le packaging d'applications :** https://yunohost.org/packaging_apps \ No newline at end of file From b1f94bc76b74f41ac4fffa2482d86b8082e100b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 4 Jun 2021 23:21:17 +0200 Subject: [PATCH 038/120] Set new requirements (#28) * Fix * Simplify config * Auto-update README Co-authored-by: Yunohost-Bot <> --- scripts/change_url | 13 ++----------- scripts/install | 2 -- scripts/upgrade | 18 +----------------- 3 files changed, 3 insertions(+), 30 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index ad20b77..d903e72 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -113,18 +113,9 @@ fi ynh_backup_if_checksum_is_different --file="$final_path/config.json" domain=$new_domain -path_url=$new_path +path=${new_path:1} -cp ../conf/config.json.example "$final_path/config.json" - -ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__PATH__" --replace_string="${path_url:1}" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/config.json" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/config.json" - -ynh_store_file_checksum --file="$final_path/config.json" +ynh_add_config --template="../conf/config.json.example" --destination="$final_path/config.json" #================================================= # GENERIC FINALISATION diff --git a/scripts/install b/scripts/install index f9eb446..7c328f7 100644 --- a/scripts/install +++ b/scripts/install @@ -86,7 +86,6 @@ ynh_system_user_create --username=$app --home_dir=$final_path ynh_script_progression --message="Creating a PostgreSQL database..." --weight=2 db_name=$(ynh_sanitize_dbid --db_name=$app) -db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) ynh_app_setting_set --app=$app --key=db_name --value=$db_name ynh_psql_test_if_first_run ynh_psql_setup_db --db_user=$db_name --db_name=$db_name @@ -126,7 +125,6 @@ popd || ynh_die 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_replace_string --match_string="__YNH_NPM__" --replace_string="$ynh_npm" --target_file="../conf/systemd.service" ynh_add_systemd_config diff --git a/scripts/upgrade b/scripts/upgrade index 807341c..a70d5f3 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -82,23 +82,8 @@ if [ "$upgrade_type" == "UPGRADE_APP" ] then ynh_script_progression --message="Upgrading source files..." --weight=10 - # Create a temporary directory - tmpdir="$(mktemp -d)" - - # Backup the config file in the temp dir - cp -a "$final_path/config.json" "$tmpdir/config.json" - - # 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 - - #Copy the admin saved settings from tmp directory to final path - cp -a "$tmpdir/config.json" "$final_path/config.json" - - # Remove the tmp directory securely - ynh_secure_remove --file="$tmpdir" + ynh_setup_source --dest_dir=$final_path --keep="$final_path/config.json" fi #================================================= @@ -143,7 +128,6 @@ fi ynh_script_progression --message="Configuring a systemd service..." --weight=2 ynh_replace_string --match_string="__ENV_PATH__" --replace_string="$PATH" --target_file="../conf/systemd.service" -ynh_replace_string --match_string="__YNH_NPM__" --replace_string="$ynh_npm" --target_file="../conf/systemd.service" # Create a dedicated systemd config ynh_add_systemd_config From 01b5861537710441d89b0f69375ec660ab9c3b2f Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 19 Jun 2021 16:48:58 +0200 Subject: [PATCH 039/120] Update manifest.json --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 0b6f5a2..6e5e730 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.8.2~ynh1", + "version": "1.8.2~ynh2", "url": "https://hedgedoc.org", "upstream": { "license": "free", From 2fed60aff7fff14f7177524c867fb0556c031a8f Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sat, 19 Jun 2021 14:49:05 +0000 Subject: [PATCH 040/120] 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 b325390..bece005 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 Collaborative editor to work on notes written in Markdown -**Shipped version:** 1.8.2~ynh1 +**Shipped version:** 1.8.2~ynh2 **Demo:** https://demo.hedgedoc.org/ diff --git a/README_fr.md b/README_fr.md index 289e89a..8d24147 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 Éditeur collaboratif pour travailler sur des notes en Markdown -**Version incluse :** 1.8.2~ynh1 +**Version incluse :** 1.8.2~ynh2 **Démo :** https://demo.hedgedoc.org/ From 8742caead1c10c8cf92c00bfae89065a6e0b0c7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 30 Aug 2021 22:49:00 +0200 Subject: [PATCH 041/120] 1.9.0 (#31) * 1.9.0 --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- scripts/restore | 2 -- 5 files changed, 5 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index bece005..f736b45 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 Collaborative editor to work on notes written in Markdown -**Shipped version:** 1.8.2~ynh2 +**Shipped version:** 1.9.0~ynh1 **Demo:** https://demo.hedgedoc.org/ diff --git a/README_fr.md b/README_fr.md index 8d24147..df47b7f 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 Éditeur collaboratif pour travailler sur des notes en Markdown -**Version incluse :** 1.8.2~ynh2 +**Version incluse :** 1.9.0~ynh1 **Démo :** https://demo.hedgedoc.org/ diff --git a/conf/app.src b/conf/app.src index d2932ef..ea4e7a7 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.8.2/hedgedoc-1.8.2.tar.gz -SOURCE_SUM=e325d433aba6f5e9de91162dd97a605e29ebc5e740750cd47054abfdc1f8fd42 +SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.9.0-rc1/hedgedoc-1.9.0-rc1.tar.gz +SOURCE_SUM=0b50b49241d6cd965fd65c6179c0075f6aab0cd22a3626f1b649d2422d8bf650 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 6e5e730..a3aea88 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.8.2~ynh2", + "version": "1.9.0~ynh1", "url": "https://hedgedoc.org", "upstream": { "license": "free", diff --git a/scripts/restore b/scripts/restore index 47778fb..9d7210e 100644 --- a/scripts/restore +++ b/scripts/restore @@ -38,8 +38,6 @@ db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) #================================================= ynh_script_progression --message="Validating restoration parameters..." --weight=2 -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 20df91fc9a351c797d6420cbdf8759c7ad677711 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 7 Sep 2021 14:50:15 +0200 Subject: [PATCH 042/120] Update manifest.json --- manifest.json | 1 - 1 file changed, 1 deletion(-) diff --git a/manifest.json b/manifest.json index a3aea88..aa55deb 100644 --- a/manifest.json +++ b/manifest.json @@ -13,7 +13,6 @@ "website": "https://hedgedoc.org", "demo": "https://demo.hedgedoc.org/", "admindoc": "https://docs.hedgedoc.org/", - "userdoc": "https://yunohost.org/en/app_hedgedoc", "code": "https://github.com/hedgedoc/hedgedoc" }, "license": "AGPL-3.0-only", From 0e8aa811debfaa5dcbb86de7c03b4f6dc3244334 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Tue, 7 Sep 2021 12:50:21 +0000 Subject: [PATCH 043/120] Auto-update README --- README.md | 1 - README_fr.md | 1 - 2 files changed, 2 deletions(-) diff --git a/README.md b/README.md index f736b45..b0a94b2 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,6 @@ When you finished editing the configuration, for your changes to take effect, yo ## Documentation and resources * Official app website: https://hedgedoc.org -* Official user documentation: https://yunohost.org/en/app_hedgedoc * Official admin documentation: https://docs.hedgedoc.org/ * Upstream app code repository: https://github.com/hedgedoc/hedgedoc * YunoHost documentation for this app: https://yunohost.org/app_hedgedoc diff --git a/README_fr.md b/README_fr.md index df47b7f..500f2a8 100644 --- a/README_fr.md +++ b/README_fr.md @@ -31,7 +31,6 @@ Lorsque vous avez terminé de modifier la configuration, pour que vos modificati ## Documentations et ressources * Site officiel de l'app : https://hedgedoc.org -* Documentation officielle utilisateur : https://yunohost.org/en/app_hedgedoc * Documentation officielle de l'admin : https://docs.hedgedoc.org/ * Dépôt de code officiel de l'app : https://github.com/hedgedoc/hedgedoc * Documentation YunoHost pour cette app : https://yunohost.org/app_hedgedoc From 001af16bcbd195dda6b730a2a021887e060aac20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 7 Sep 2021 23:02:53 +0200 Subject: [PATCH 044/120] Systemd hardening (#33) * Update systemd.service --- conf/systemd.service | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/conf/systemd.service b/conf/systemd.service index 839ebca..90d6159 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -12,14 +12,36 @@ Environment="PATH=__ENV_PATH__" Environment="NODE_ENV=production" ExecStart=__YNH_NPM__ start --production Restart=always -PrivateTmp=true -PrivateDevices=true -ProtectControlGroups=true -ProtectHome=true -ProtectKernelTunables=true +# Sandboxing options to harden security +# Depending on specificities of your service/app, you may need to tweak these +# .. but this should be a good baseline +# Details for these options: https://www.freedesktop.org/software/systemd/man/systemd.exec.html +NoNewPrivileges=yes +PrivateTmp=yes +PrivateDevices=yes +RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 +RestrictNamespaces=yes +RestrictRealtime=yes +DevicePolicy=closed ProtectSystem=full -RestrictSUIDSGID=true +ProtectControlGroups=yes +ProtectKernelModules=yes +ProtectKernelTunables=yes +LockPersonality=yes +SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap + +# Denying access to capabilities that should not be relevant for webapps +# Doc: https://man7.org/linux/man-pages/man7/capabilities.7.html +CapabilityBoundingSet=~CAP_RAWIO CAP_MKNOD +CapabilityBoundingSet=~CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE +CapabilityBoundingSet=~CAP_SYS_BOOT CAP_SYS_TIME CAP_SYS_MODULE CAP_SYS_PACCT +CapabilityBoundingSet=~CAP_LEASE CAP_LINUX_IMMUTABLE CAP_IPC_LOCK +CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_WAKE_ALARM +CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG +CapabilityBoundingSet=~CAP_MAC_ADMIN CAP_MAC_OVERRIDE +CapabilityBoundingSet=~CAP_NET_ADMIN CAP_NET_BROADCAST CAP_NET_RAW +CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SYSLOG [Install] WantedBy=multi-user.target From 6d12a55691f9e59c6e31f23fb8137377e6b07bc5 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 13 Sep 2021 23:09:54 +0200 Subject: [PATCH 045/120] Update app.src --- conf/app.src | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/app.src b/conf/app.src index ea4e7a7..cb9c92b 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.9.0-rc1/hedgedoc-1.9.0-rc1.tar.gz -SOURCE_SUM=0b50b49241d6cd965fd65c6179c0075f6aab0cd22a3626f1b649d2422d8bf650 +SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.9.0/hedgedoc-1.9.0.tar.gz +SOURCE_SUM=976d908ea81025e72277d2815fd51ccf462c09d10451c16893b187d95f21e837 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true From ae3f210bbb07419bd8a8c080b7c95e6ec764592d Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 21 Sep 2021 23:39:19 +0200 Subject: [PATCH 046/120] Update manifest.json --- manifest.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index aa55deb..63e264f 100644 --- a/manifest.json +++ b/manifest.json @@ -30,8 +30,7 @@ "install" : [ { "name": "domain", - "type": "domain", - "example": "domain.org" + "type": "domain" }, { "name": "path", From 11859f0bd06f47da6adcb687f77ae22e067cc936 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 3 Dec 2021 00:04:27 +0100 Subject: [PATCH 047/120] 1.9.1 (#34) * Upgrade to 1.9.1 --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 5 ++--- conf/nginx.conf | 5 ----- manifest.json | 4 ++-- scripts/_common.sh | 2 +- scripts/install | 4 ++-- scripts/restore | 3 +-- scripts/upgrade | 5 ++--- 9 files changed, 12 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index b0a94b2..23b27c2 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 Collaborative editor to work on notes written in Markdown -**Shipped version:** 1.9.0~ynh1 +**Shipped version:** 1.9.1~ynh1 **Demo:** https://demo.hedgedoc.org/ diff --git a/README_fr.md b/README_fr.md index 500f2a8..d0604d2 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 Éditeur collaboratif pour travailler sur des notes en Markdown -**Version incluse :** 1.9.0~ynh1 +**Version incluse :** 1.9.1~ynh1 **Démo :** https://demo.hedgedoc.org/ diff --git a/conf/app.src b/conf/app.src index cb9c92b..6e3402c 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,6 +1,5 @@ -SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.9.0/hedgedoc-1.9.0.tar.gz -SOURCE_SUM=976d908ea81025e72277d2815fd51ccf462c09d10451c16893b187d95f21e837 +SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.9.1/hedgedoc-1.9.1.tar.gz +SOURCE_SUM=19a92d2ad4354e0975be980d375cb1a53a575e54cab89cb54ea2f042b6126ed6 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true -SOURCE_FILENAME= diff --git a/conf/nginx.conf b/conf/nginx.conf index a0fc0ae..ab4eec6 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,10 +1,5 @@ location ^~ __PATH__/ { - # Force usage of 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; diff --git a/manifest.json b/manifest.json index 63e264f..6082872 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.9.0~ynh1", + "version": "1.9.1~ynh1", "url": "https://hedgedoc.org", "upstream": { "license": "free", @@ -20,7 +20,7 @@ "name": "eric_G" }, "requirements": { - "yunohost": ">= 4.2.4" + "yunohost": ">= 4.3.0" }, "multi_instance": true, "services": [ diff --git a/scripts/_common.sh b/scripts/_common.sh index 3e0b194..dc486ee 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -7,7 +7,7 @@ # dependencies used by the app pkg_dependencies="postgresql apt-transport-https" -nodejs_version=14 +nodejs_version=16 #================================================= # PERSONAL HELPERS diff --git a/scripts/install b/scripts/install index 7c328f7..ada5c47 100644 --- a/scripts/install +++ b/scripts/install @@ -114,10 +114,10 @@ ynh_add_nginx_config #============================================== ynh_script_progression --message="Building HedgeDoc... (this will take some time and resources!)" --weight=20 -pushd "$final_path" || ynh_die +pushd "$final_path" ynh_use_nodejs bin/setup -popd || ynh_die +popd #================================================= # SETUP SYSTEMD diff --git a/scripts/restore b/scripts/restore index 9d7210e..86f21a9 100644 --- a/scripts/restore +++ b/scripts/restore @@ -38,8 +38,7 @@ db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) #================================================= ynh_script_progression --message="Validating restoration parameters..." --weight=2 -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 diff --git a/scripts/upgrade b/scripts/upgrade index a70d5f3..96f7520 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -27,7 +27,6 @@ db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) #================================================= # CHECK VERSION #================================================= -ynh_script_progression --message="Checking version..." --weight=2 upgrade_type=$(ynh_check_app_version_changed) @@ -116,10 +115,10 @@ if [ "$upgrade_type" == "UPGRADE_APP" ] then ynh_script_progression --message="Building HedgeDoc... (this will take some time and resources!)" --weight=20 - pushd "$final_path" || ynh_die + pushd "$final_path" ynh_use_nodejs bin/setup - popd || ynh_die + popd fi #================================================= From b7b0e1d317f998e515b741ed268dad9c0a225873 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 3 Dec 2021 23:28:02 +0100 Subject: [PATCH 048/120] 1.9.2 (#36) --- conf/app.src | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/app.src b/conf/app.src index 6e3402c..3c550ca 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.9.1/hedgedoc-1.9.1.tar.gz -SOURCE_SUM=19a92d2ad4354e0975be980d375cb1a53a575e54cab89cb54ea2f042b6126ed6 +SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.9.2/hedgedoc-1.9.2.tar.gz +SOURCE_SUM=052088a634731e0f9c28e40f9869281f24bf3fbb25173a341ba2c94496109f51 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true From 99a8ef6ee8d11baf3ec08df574a404061e21ee93 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 29 Jan 2022 08:20:10 +0100 Subject: [PATCH 049/120] Remove replace_string --- scripts/install | 2 +- scripts/upgrade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index ada5c47..f46b65b 100644 --- a/scripts/install +++ b/scripts/install @@ -124,7 +124,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 diff --git a/scripts/upgrade b/scripts/upgrade index 96f7520..678957c 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -126,7 +126,7 @@ fi #================================================= ynh_script_progression --message="Configuring a systemd service..." --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 From 5a06d5edfc63e697d5ec5a1c5078139a0d8bbbf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 1 Feb 2022 14:11:16 +0100 Subject: [PATCH 050/120] Fix (#39) --- conf/config.json.example | 4 ++-- scripts/backup | 2 +- scripts/change_url | 9 ++++++--- scripts/install | 11 +++++++---- scripts/remove | 4 ++-- scripts/restore | 8 +------- scripts/upgrade | 3 +-- 7 files changed, 20 insertions(+), 21 deletions(-) diff --git a/conf/config.json.example b/conf/config.json.example index 5f6ec2b..03c46e8 100644 --- a/conf/config.json.example +++ b/conf/config.json.example @@ -3,7 +3,7 @@ "protocolUseSSL": true, "domain": "__DOMAIN__", "port": "__PORT__", - "urlPath": "__PATH__", + "urlPath": "__URL_PATH__", "loglevel": "info", "useCDN": false, "allowGravatar": false, @@ -30,7 +30,7 @@ "addGoogleAnalytics": false }, "db": { - "username": "__DB_NAME__", + "username": "__DB_USER__", "password": "__DB_PWD__", "database": "__DB_NAME__", "host": "localhost", diff --git a/scripts/backup b/scripts/backup index 3115b5b..8d4d217 100644 --- a/scripts/backup +++ b/scripts/backup @@ -66,4 +66,4 @@ ynh_psql_dump_db --database="$db_name" > db.sql # END OF SCRIPT #================================================= -ynh_print_info --message="Backup script completed for HedgeDoc. (YunoHost will then actually copy those files to the archive)." +ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." diff --git a/scripts/change_url b/scripts/change_url index d903e72..a9c8a53 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -73,7 +73,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 @@ -113,10 +113,13 @@ fi ynh_backup_if_checksum_is_different --file="$final_path/config.json" domain=$new_domain -path=${new_path:1} +url_path=${new_path#/} ynh_add_config --template="../conf/config.json.example" --destination="$final_path/config.json" +chmod 400 "$final_path/config.json" +chown $app:$app "$final_path/config.json" + #================================================= # GENERIC FINALISATION #================================================= @@ -138,4 +141,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Change of URL completed for HedgeDoc" --last +ynh_script_progression --message="Change of URL completed for $app" --last diff --git a/scripts/install b/scripts/install index f46b65b..35fb5ac 100644 --- a/scripts/install +++ b/scripts/install @@ -86,9 +86,10 @@ ynh_system_user_create --username=$app --home_dir=$final_path ynh_script_progression --message="Creating a PostgreSQL database..." --weight=2 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_psql_test_if_first_run -ynh_psql_setup_db --db_user=$db_name --db_name=$db_name +ynh_psql_setup_db --db_user=$db_user --db_name=$db_name #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE @@ -133,10 +134,12 @@ ynh_add_systemd_config #================================================= ynh_script_progression --message="Modifying a config file..." --weight=1 -path=${path_url:1} - +url_path=${path_url#/} ynh_add_config --template="../conf/config.json.example" --destination="$final_path/config.json" +chmod 400 "$final_path/config.json" +chown $app:$app "$final_path/config.json" + #================================================= # GENERIC FINALIZATION #================================================= @@ -186,4 +189,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Installation of HedgeDoc completed" --last +ynh_script_progression --message="Installation of $app completed" --last diff --git a/scripts/remove b/scripts/remove index 60d5336..2e2045a 100644 --- a/scripts/remove +++ b/scripts/remove @@ -63,7 +63,7 @@ ynh_remove_nodejs #================================================= # REMOVE APP MAIN DIR #================================================= -ynh_script_progression --message="Removing HedgeDoc main directory..." --weight=6 +ynh_script_progression --message="Removing $app main directory..." --weight=6 # Remove the app directory securely ynh_secure_remove --file="$final_path" @@ -90,4 +90,4 @@ ynh_system_user_delete --username=$app # END OF SCRIPT #================================================= -ynh_script_progression --message="Removal of HedgeDoc completed" --last +ynh_script_progression --message="Removal of $app completed" --last diff --git a/scripts/restore b/scripts/restore index 86f21a9..c167e57 100644 --- a/scripts/restore +++ b/scripts/restore @@ -64,12 +64,6 @@ ynh_script_progression --message="Restoring HedgeDoc main directory..." --weight ynh_restore_file --origin_path="$final_path" -#================================================= -# RESTORE USER RIGHTS -#================================================= -ynh_script_progression --message="Restoring user rights..." --weight=2 - -# Restore permissions on app files chown -R $app:$app $final_path chmod o-rwx $final_path chmod 600 $final_path/config.json @@ -134,4 +128,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Restoration completed for HedgeDoc" --last +ynh_script_progression --message="Restoration completed for $app" --last diff --git a/scripts/upgrade b/scripts/upgrade index 678957c..dbe33a1 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -127,7 +127,6 @@ fi ynh_script_progression --message="Configuring a systemd service..." --weight=2 env_path="$PATH" - # Create a dedicated systemd config ynh_add_systemd_config @@ -168,4 +167,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Upgrade of HedgeDoc completed" --last +ynh_script_progression --message="Upgrade of $app completed" --last From 9a44091f23c1c89fe310f178fe5e81208ac67614 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 1 Feb 2022 15:50:30 +0100 Subject: [PATCH 051/120] Update manifest.json --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 6082872..7a33763 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.9.1~ynh1", + "version": "1.9.2~ynh1", "url": "https://hedgedoc.org", "upstream": { "license": "free", From d1454a1bf1dfde8e5aba8952e0f5748defbf4a05 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Tue, 1 Feb 2022 14:50:36 +0000 Subject: [PATCH 052/120] 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 23b27c2..2922e73 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 Collaborative editor to work on notes written in Markdown -**Shipped version:** 1.9.1~ynh1 +**Shipped version:** 1.9.2~ynh1 **Demo:** https://demo.hedgedoc.org/ diff --git a/README_fr.md b/README_fr.md index d0604d2..d11a698 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 Éditeur collaboratif pour travailler sur des notes en Markdown -**Version incluse :** 1.9.1~ynh1 +**Version incluse :** 1.9.2~ynh1 **Démo :** https://demo.hedgedoc.org/ From 8a9676ffe9c76462d3899d298c1d5bf77ea28648 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 23 Mar 2022 18:44:11 +0100 Subject: [PATCH 053/120] Update config.json.example --- conf/config.json.example | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/config.json.example b/conf/config.json.example index 03c46e8..96087d7 100644 --- a/conf/config.json.example +++ b/conf/config.json.example @@ -27,6 +27,7 @@ "upgradeInsecureRequests": "auto", "addDefaults": true, "addDisqus": true, + "allowFraming": false, "addGoogleAnalytics": false }, "db": { From 62d8c47598f1b7f3e4a192e997232092971d7a9f Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 23 Mar 2022 18:48:06 +0100 Subject: [PATCH 054/120] Update config.json.example --- conf/config.json.example | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/conf/config.json.example b/conf/config.json.example index 96087d7..5b9bfe1 100644 --- a/conf/config.json.example +++ b/conf/config.json.example @@ -30,6 +30,13 @@ "allowFraming": false, "addGoogleAnalytics": false }, + "minio": { + "accessKey": "", + "secretKey": "", + "endPoint": "localhost", + "port": 9000, + "secure": false + }, "db": { "username": "__DB_USER__", "password": "__DB_PWD__", From 9e297a70918738d35ae2bb4816269f03bcf136f9 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 10 Apr 2022 22:49:35 +0200 Subject: [PATCH 055/120] 1.9.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 3c550ca..244e254 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.9.2/hedgedoc-1.9.2.tar.gz -SOURCE_SUM=052088a634731e0f9c28e40f9869281f24bf3fbb25173a341ba2c94496109f51 +SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.9.3/hedgedoc-1.9.3.tar.gz +SOURCE_SUM=0115278fc5ae048e3629cc0beba98046cb19460ba66108b3eba45ea5e22e8548 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 7a33763..ebb930c 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.9.2~ynh1", + "version": "1.9.3~ynh1", "url": "https://hedgedoc.org", "upstream": { "license": "free", From 1877d46a979190e8960ecfee9b371a6839afe397 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sun, 10 Apr 2022 20:49:40 +0000 Subject: [PATCH 056/120] 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 2922e73..22b475e 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 Collaborative editor to work on notes written in Markdown -**Shipped version:** 1.9.2~ynh1 +**Shipped version:** 1.9.3~ynh1 **Demo:** https://demo.hedgedoc.org/ diff --git a/README_fr.md b/README_fr.md index d11a698..8b8c5a4 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 Éditeur collaboratif pour travailler sur des notes en Markdown -**Version incluse :** 1.9.2~ynh1 +**Version incluse :** 1.9.3~ynh1 **Démo :** https://demo.hedgedoc.org/ From 66ff515aa7137218a5e8f226b027f96814f1a37b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 12 Jul 2022 06:14:57 +0200 Subject: [PATCH 057/120] 1.9.4 (#42) * 1.9.4 * Auto-update README Co-authored-by: yunohost-bot --- README.md | 34 +++++++++++++++++++++++----------- README_fr.md | 40 ++++++++++++++++++++++++++++------------ conf/app.src | 4 ++-- conf/systemd.service | 2 +- doc/DESCRIPTION.md | 12 ++++++++++++ manifest.json | 2 +- scripts/install | 21 ++++++--------------- scripts/restore | 9 +++++---- scripts/upgrade | 22 +++++++--------------- 9 files changed, 85 insertions(+), 61 deletions(-) create mode 100644 doc/DESCRIPTION.md diff --git a/README.md b/README.md index 22b475e..710e3cc 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ It shall NOT be edited by hand. # HedgeDoc for YunoHost -[![Integration level](https://dash.yunohost.org/integration/hedgedoc.svg)](https://dash.yunohost.org/appci/app/hedgedoc) ![](https://ci-apps.yunohost.org/ci/badges/hedgedoc.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/hedgedoc.maintain.svg) +[![Integration level](https://dash.yunohost.org/integration/hedgedoc.svg)](https://dash.yunohost.org/appci/app/hedgedoc) ![Working status](https://ci-apps.yunohost.org/ci/badges/hedgedoc.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/hedgedoc.maintain.svg) [![Install HedgeDoc with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=hedgedoc) *[Lire ce readme en français.](./README_fr.md)* @@ -15,15 +15,26 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in ## Overview -Collaborative editor to work on notes written in Markdown +HedgeDoc (formerly known as CodiMD) is an open-source, web-based, self-hosted, collaborative markdown editor. -**Shipped version:** 1.9.3~ynh1 +You can use it to easily collaborate on notes, graphs and even presentations in real-time. All you need to do is to share your note-link to your co-workers and they’re ready to go. + +### Features + +- Real-time collaboration +- Graphs & diagrams +- Revisions +- Presentation mode +- Easy to use permission system +- Low system requirements + +**Shipped version:** 1.9.4~ynh1 **Demo:** https://demo.hedgedoc.org/ ## Screenshots -![](./doc/screenshots/screenshot.png) +![Screenshot of HedgeDoc](./doc/screenshots/screenshot.png) ## Disclaimers / important information @@ -34,21 +45,22 @@ When you finished editing the configuration, for your changes to take effect, yo ## Documentation and resources -* Official app website: https://hedgedoc.org -* Official admin documentation: https://docs.hedgedoc.org/ -* Upstream app code repository: https://github.com/hedgedoc/hedgedoc -* YunoHost documentation for this app: https://yunohost.org/app_hedgedoc -* Report a bug: https://github.com/YunoHost-Apps/hedgedoc_ynh/issues +* Official app website: +* 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/hedgedoc_ynh/tree/testing). To try the testing branch, please proceed like that. -``` + +``` bash sudo yunohost app install https://github.com/YunoHost-Apps/hedgedoc_ynh/tree/testing --debug or sudo yunohost app upgrade hedgedoc -u https://github.com/YunoHost-Apps/hedgedoc_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 8b8c5a4..1f9c333 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,25 +1,40 @@ + + # HedgeDoc pour YunoHost -[![Niveau d'intégration](https://dash.yunohost.org/integration/hedgedoc.svg)](https://dash.yunohost.org/appci/app/hedgedoc) ![](https://ci-apps.yunohost.org/ci/badges/hedgedoc.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/hedgedoc.maintain.svg) +[![Niveau d'intégration](https://dash.yunohost.org/integration/hedgedoc.svg)](https://dash.yunohost.org/appci/app/hedgedoc) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/hedgedoc.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/hedgedoc.maintain.svg) [![Installer HedgeDoc avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=hedgedoc) *[Read this readme in english.](./README.md)* -*[Lire ce readme en français.](./README_fr.md)* > *Ce package vous permet d'installer HedgeDoc 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 -Éditeur collaboratif pour travailler sur des notes en Markdown +HedgeDoc (formerly known as CodiMD) is an open-source, web-based, self-hosted, collaborative markdown editor. -**Version incluse :** 1.9.3~ynh1 +You can use it to easily collaborate on notes, graphs and even presentations in real-time. All you need to do is to share your note-link to your co-workers and they’re ready to go. + +### Features + +- Real-time collaboration +- Graphs & diagrams +- Revisions +- Presentation mode +- Easy to use permission system +- Low system requirements + +**Version incluse :** 1.9.4~ynh1 **Démo :** https://demo.hedgedoc.org/ ## Captures d'écran -![](./doc/screenshots/screenshot.png) +![Capture d'écran de HedgeDoc](./doc/screenshots/screenshot.png) ## Avertissements / informations importantes @@ -30,21 +45,22 @@ Lorsque vous avez terminé de modifier la configuration, pour que vos modificati ## Documentations et ressources -* Site officiel de l'app : https://hedgedoc.org -* Documentation officielle de l'admin : https://docs.hedgedoc.org/ -* Dépôt de code officiel de l'app : https://github.com/hedgedoc/hedgedoc -* Documentation YunoHost pour cette app : https://yunohost.org/app_hedgedoc -* Signaler un bug : https://github.com/YunoHost-Apps/hedgedoc_ynh/issues +* Site officiel de l'app : +* 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/hedgedoc_ynh/tree/testing). Pour essayer la branche testing, procédez comme suit. -``` + +``` bash sudo yunohost app install https://github.com/YunoHost-Apps/hedgedoc_ynh/tree/testing --debug ou sudo yunohost app upgrade hedgedoc -u https://github.com/YunoHost-Apps/hedgedoc_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 :** diff --git a/conf/app.src b/conf/app.src index 244e254..f7b0555 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.9.3/hedgedoc-1.9.3.tar.gz -SOURCE_SUM=0115278fc5ae048e3629cc0beba98046cb19460ba66108b3eba45ea5e22e8548 +SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.9.4/hedgedoc-1.9.4.tar.gz +SOURCE_SUM=f8ed595cb3b47eb71f22518e0a1e93ed120c44dcf1eb30136c16f530c4aaf0a7 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/conf/systemd.service b/conf/systemd.service index 90d6159..caea1b3 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -8,7 +8,7 @@ Type=simple User=__APP__ Group=__APP__ WorkingDirectory=__FINALPATH__ -Environment="PATH=__ENV_PATH__" +Environment="__YNH_NODE_LOAD_PATH__" Environment="NODE_ENV=production" ExecStart=__YNH_NPM__ start --production Restart=always diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md new file mode 100644 index 0000000..98d04c5 --- /dev/null +++ b/doc/DESCRIPTION.md @@ -0,0 +1,12 @@ +HedgeDoc (formerly known as CodiMD) is an open-source, web-based, self-hosted, collaborative markdown editor. + +You can use it to easily collaborate on notes, graphs and even presentations in real-time. All you need to do is to share your note-link to your co-workers and they’re ready to go. + +### Features + +- Real-time collaboration +- Graphs & diagrams +- Revisions +- Presentation mode +- Easy to use permission system +- Low system requirements \ No newline at end of file diff --git a/manifest.json b/manifest.json index ebb930c..1a349c6 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.9.3~ynh1", + "version": "1.9.4~ynh1", "url": "https://hedgedoc.org", "upstream": { "license": "free", diff --git a/scripts/install b/scripts/install index 35fb5ac..6b71a53 100644 --- a/scripts/install +++ b/scripts/install @@ -100,6 +100,10 @@ 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 +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + #================================================= # NGINX CONFIGURATION #================================================= @@ -125,8 +129,7 @@ popd #================================================= ynh_script_progression --message="Configuring a systemd service..." --weight=1 -env_path="$PATH" - +# Create a dedicated systemd config ynh_add_systemd_config #================================================= @@ -137,21 +140,9 @@ ynh_script_progression --message="Modifying a config file..." --weight=1 url_path=${path_url#/} ynh_add_config --template="../conf/config.json.example" --destination="$final_path/config.json" -chmod 400 "$final_path/config.json" +chmod 600 "$final_path/config.json" chown $app:$app "$final_path/config.json" -#================================================= -# GENERIC FINALIZATION -#================================================= -# SECURE FILES AND DIRECTORIES -#================================================= -ynh_script_progression --message="Securing files and directories..." --weight=1 - -# Set permissions to app files -chown -R $app:$app $final_path -chmod o-rwx $final_path -chmod 600 $final_path/config.json - #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= diff --git a/scripts/restore b/scripts/restore index c167e57..bb4d2a2 100644 --- a/scripts/restore +++ b/scripts/restore @@ -38,7 +38,8 @@ db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) #================================================= ynh_script_progression --message="Validating restoration parameters..." --weight=2 -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 @@ -64,9 +65,9 @@ ynh_script_progression --message="Restoring HedgeDoc main directory..." --weight ynh_restore_file --origin_path="$final_path" -chown -R $app:$app $final_path -chmod o-rwx $final_path -chmod 600 $final_path/config.json +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" #================================================= # SPECIFIC RESTORATION diff --git a/scripts/upgrade b/scripts/upgrade index dbe33a1..1d392a3 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -85,6 +85,10 @@ then ynh_setup_source --dest_dir=$final_path --keep="$final_path/config.json" fi +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + #================================================= # NGINX CONFIGURATION #================================================= @@ -108,9 +112,10 @@ ynh_install_extra_app_dependencies --repo="deb https://dl.yarnpkg.com/debian/ st #================================================= # SPECIFIC UPGRADE -#============================================== +#================================================= # INSTALL HEDGEDOC -#============================================== +#================================================= + if [ "$upgrade_type" == "UPGRADE_APP" ] then ynh_script_progression --message="Building HedgeDoc... (this will take some time and resources!)" --weight=20 @@ -126,22 +131,9 @@ fi #================================================= ynh_script_progression --message="Configuring a systemd service..." --weight=2 -env_path="$PATH" # Create a dedicated systemd config ynh_add_systemd_config -#================================================= -# GENERIC FINALIZATION -#================================================= -# SECURE FILES AND DIRECTORIES -#================================================= -ynh_script_progression --message="Securing files and directories..." --weight=1 - -# Set permissions on app files -chown -R $app:$app $final_path -chmod o-rwx $final_path -chmod 600 $final_path/config.json - #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= From e725eba889d4f4517a9e6e3ea99a1c417437ea53 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Fri, 12 Aug 2022 11:07:21 +0000 Subject: [PATCH 058/120] Auto-update README --- README.md | 1 + README_fr.md | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 710e3cc..07c607b 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in **Shipped version:** 1.9.4~ynh1 + **Demo:** https://demo.hedgedoc.org/ ## Screenshots diff --git a/README_fr.md b/README_fr.md index 1f9c333..6e13f3c 100644 --- a/README_fr.md +++ b/README_fr.md @@ -28,7 +28,8 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Version incluse :** 1.9.4~ynh1 +**Version incluse :** 1.9.4~ynh1 + **Démo :** https://demo.hedgedoc.org/ From 4ceed1c9688c7d4f28158122ee3c253b8ece284b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 14 Aug 2022 15:47:04 +0200 Subject: [PATCH 059/120] Update manifest.json --- manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index 1a349c6..6367426 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "version": "1.9.4~ynh1", "url": "https://hedgedoc.org", "upstream": { - "license": "free", + "license": "AGPL-3.0-only", "website": "https://hedgedoc.org", "demo": "https://demo.hedgedoc.org/", "admindoc": "https://docs.hedgedoc.org/", @@ -20,7 +20,7 @@ "name": "eric_G" }, "requirements": { - "yunohost": ">= 4.3.0" + "yunohost": ">= 11.0.9" }, "multi_instance": true, "services": [ From 0ddbc65e8da1fd4bedaf2b1031cc267fd6d4e34e Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 14 Aug 2022 15:48:24 +0200 Subject: [PATCH 060/120] 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 dc486ee..7f17471 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -5,7 +5,7 @@ #================================================= # dependencies used by the app -pkg_dependencies="postgresql apt-transport-https" +pkg_dependencies="postgresql" nodejs_version=16 From d0000642fd3fafbb71926798d55ca356e6e82b6f Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 15 Aug 2022 18:50:10 +0200 Subject: [PATCH 061/120] set relative path for --keep opt --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 1d392a3..4041836 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -82,7 +82,7 @@ then ynh_script_progression --message="Upgrading source files..." --weight=10 # Download, check integrity, uncompress and patch the source from app.src - ynh_setup_source --dest_dir=$final_path --keep="$final_path/config.json" + ynh_setup_source --dest_dir=$final_path --keep="config.json" fi chmod 750 "$final_path" From c811a1ab0c79c1b95dab0b317f1ef2bb634a24b8 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 9 Oct 2022 10:55:31 +0200 Subject: [PATCH 062/120] Update manifest.json --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 6367426..7886d3d 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.9.4~ynh1", + "version": "1.9.4~ynh2", "url": "https://hedgedoc.org", "upstream": { "license": "AGPL-3.0-only", From 96e4e465d43d641c31a332f1b759eabeaa98e225 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sun, 9 Oct 2022 08:55:37 +0000 Subject: [PATCH 063/120] 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 07c607b..821b0c7 100644 --- a/README.md +++ b/README.md @@ -28,8 +28,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Shipped version:** 1.9.4~ynh1 - +**Shipped version:** 1.9.4~ynh2 **Demo:** https://demo.hedgedoc.org/ diff --git a/README_fr.md b/README_fr.md index 6e13f3c..bfe43ca 100644 --- a/README_fr.md +++ b/README_fr.md @@ -28,8 +28,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Version incluse :** 1.9.4~ynh1 - +**Version incluse :** 1.9.4~ynh2 **Démo :** https://demo.hedgedoc.org/ From 3e58d8e8f363e251ec3706da3b958e6fe27aa30f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 31 Oct 2022 21:01:37 +0100 Subject: [PATCH 064/120] 1.9.5 --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 7886d3d..ba40cf0 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.9.4~ynh2", + "version": "1.9.5~ynh1", "url": "https://hedgedoc.org", "upstream": { "license": "AGPL-3.0-only", From 142c09bf56fd50c1a3bc41fdcfb74e081ef40824 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 31 Oct 2022 20:01:46 +0000 Subject: [PATCH 065/120] 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 821b0c7..67d618e 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Shipped version:** 1.9.4~ynh2 +**Shipped version:** 1.9.5~ynh1 **Demo:** https://demo.hedgedoc.org/ diff --git a/README_fr.md b/README_fr.md index bfe43ca..416fabb 100644 --- a/README_fr.md +++ b/README_fr.md @@ -28,7 +28,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Version incluse :** 1.9.4~ynh2 +**Version incluse :** 1.9.5~ynh1 **Démo :** https://demo.hedgedoc.org/ From b51d359193c7d8c5ca4b50d7aa476c80df28c435 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 6 Nov 2022 23:17:03 +0100 Subject: [PATCH 066/120] 1.9.6 --- 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 f7b0555..268b8cf 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.9.4/hedgedoc-1.9.4.tar.gz -SOURCE_SUM=f8ed595cb3b47eb71f22518e0a1e93ed120c44dcf1eb30136c16f530c4aaf0a7 +SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.9.6/hedgedoc-1.9.6.tar.gz +SOURCE_SUM=dfd0fca006f9075f072df058476ea542adb32b63964afb2985211e1114ab333e SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index ba40cf0..8d12a2c 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.9.5~ynh1", + "version": "1.9.6~ynh1", "url": "https://hedgedoc.org", "upstream": { "license": "AGPL-3.0-only", From b4a6842d0a1d9fd940d44184d3e60612c48dd334 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sun, 6 Nov 2022 22:17:08 +0000 Subject: [PATCH 067/120] 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 67d618e..55b5376 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Shipped version:** 1.9.5~ynh1 +**Shipped version:** 1.9.6~ynh1 **Demo:** https://demo.hedgedoc.org/ diff --git a/README_fr.md b/README_fr.md index 416fabb..4e4b558 100644 --- a/README_fr.md +++ b/README_fr.md @@ -28,7 +28,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Version incluse :** 1.9.5~ynh1 +**Version incluse :** 1.9.6~ynh1 **Démo :** https://demo.hedgedoc.org/ From 5c93b3f9798f7ac1fdad412f5c2b90e4696d102c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 7 Nov 2022 21:30:12 +0100 Subject: [PATCH 068/120] Add more security as default (#47) * Add more security as default * Auto-update README * Update config.json.example * Update change_url Co-authored-by: yunohost-bot --- conf/config.json.example | 3 ++- config_panel.toml.example | 24 ++++++++++++++++++++++++ scripts/change_url | 3 +++ scripts/install | 5 +++++ scripts/upgrade | 13 +++++++++++++ 5 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 config_panel.toml.example diff --git a/conf/config.json.example b/conf/config.json.example index 5b9bfe1..7b30ba4 100644 --- a/conf/config.json.example +++ b/conf/config.json.example @@ -8,10 +8,11 @@ "useCDN": false, "allowGravatar": false, "allowFreeURL": false, + "allowAnonymous": __ALLOW_ANONYMOUS__, "allowAnonymousEdits": true, "defaultPermission": "locked", "email": true, - "allowEmailRegister": true, + "allowEmailRegister": __ALLOW_EMAIL_REGISTRATION__, "imageUploadType": "filesystem", "tooBusyLag": 1000, "hsts": { diff --git a/config_panel.toml.example b/config_panel.toml.example new file mode 100644 index 0000000..e784143 --- /dev/null +++ b/config_panel.toml.example @@ -0,0 +1,24 @@ +version = "1.0" + +[main] +name = "HedgeDoc configuration" + + [main.config] + name = "Configuration Options" + + [main.config.allow_anonymous] + ask = "Allow anonymous usage" + type = "boolean" + yes = "true" + no = "false" + help = "Set to allow anonymous usage (default is true)." + bind = "allow_anonymous:__FINALPATH__/config.json" + + [main.config.allow_email_registration] + ask = "Allow email registration" + type = "boolean" + yes = "true" + no = "false" + help = "Set to allow registration of new accounts using an email address. If set to false, you can still create accounts using the command line." + bind = "allow_email_registration:__FINALPATH__/config.json" + diff --git a/scripts/change_url b/scripts/change_url index a9c8a53..5fd09f8 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -33,6 +33,9 @@ db_name=$(ynh_app_setting_get --app=$app --key=db_name) db_user=$db_name db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) +allow_anonymous=$(ynh_app_setting_get --app=$app --key=allow_anonymous) +allow_email_registration=$(ynh_app_setting_get --app=$app --key=allow_email_registration) + #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= diff --git a/scripts/install b/scripts/install index 6b71a53..a023b35 100644 --- a/scripts/install +++ b/scripts/install @@ -29,6 +29,9 @@ is_public=$YNH_APP_ARG_IS_PUBLIC app=$YNH_APP_INSTANCE_NAME +allow_anonymous=false +allow_email_registration=false + #================================================= # CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS #================================================= @@ -47,6 +50,8 @@ 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=allow_anonymous --value=$allow_anonymous +ynh_app_setting_set --app=$app --key=allow_email_registration --value=$allow_email_registration #================================================= # STANDARD MODIFICATIONS diff --git a/scripts/upgrade b/scripts/upgrade index 4041836..d0f97ad 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -24,6 +24,9 @@ db_name=$(ynh_app_setting_get --app=$app --key=db_name) db_user=$db_name db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) +allow_anonymous=$(ynh_app_setting_get --app=$app --key=allow_anonymous) +allow_email_registration=$(ynh_app_setting_get --app=$app --key=allow_email_registration) + #================================================= # CHECK VERSION #================================================= @@ -35,6 +38,16 @@ upgrade_type=$(ynh_check_app_version_changed) #================================================= ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 +if [ -z "$allow_anonymous" ]; then + allow_anonymous="false" + ynh_app_setting_set --app=$app --key=allow_anonymous --value=$allow_anonymous +fi + +if [ -z "$allow_email_registration" ]; then + allow_email_registration="false" + ynh_app_setting_set --app=$app --key=allow_email_registration --value=$allow_email_registration +fi + # Cleaning legacy permissions if ynh_legacy_permissions_exists; then ynh_legacy_permissions_delete_all From 5a5f09789dbdcdc552890e662f1b2c097fe05c9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 7 Nov 2022 21:32:33 +0100 Subject: [PATCH 069/120] Update manifest.json --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 8d12a2c..a38fa58 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.9.6~ynh1", + "version": "1.9.6~ynh2", "url": "https://hedgedoc.org", "upstream": { "license": "AGPL-3.0-only", From 483acb42e37d5fc18e95ffae288465ead880237a Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 7 Nov 2022 20:32:38 +0000 Subject: [PATCH 070/120] 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 55b5376..f9cfdf8 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Shipped version:** 1.9.6~ynh1 +**Shipped version:** 1.9.6~ynh2 **Demo:** https://demo.hedgedoc.org/ diff --git a/README_fr.md b/README_fr.md index 4e4b558..106324b 100644 --- a/README_fr.md +++ b/README_fr.md @@ -28,7 +28,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Version incluse :** 1.9.6~ynh1 +**Version incluse :** 1.9.6~ynh2 **Démo :** https://demo.hedgedoc.org/ From 73a7825149226e35bf59562b4d824f9a535f1640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 7 Nov 2022 21:54:53 +0100 Subject: [PATCH 071/120] Update install --- scripts/install | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/install b/scripts/install index a023b35..ed5aea4 100644 --- a/scripts/install +++ b/scripts/install @@ -126,6 +126,7 @@ ynh_script_progression --message="Building HedgeDoc... (this will take some time pushd "$final_path" ynh_use_nodejs + ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn cache clean bin/setup popd From d9e47b4647032018031f18cdaf551aa7c51ff591 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 21 Jan 2023 12:08:34 +0100 Subject: [PATCH 072/120] Fix --- config_panel.toml.example => config_panel.toml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename config_panel.toml.example => config_panel.toml (100%) diff --git a/config_panel.toml.example b/config_panel.toml similarity index 100% rename from config_panel.toml.example rename to config_panel.toml From de36e0d8974ba1dd6aa70c33a1c998be7ff521dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 21 Jan 2023 12:24:42 +0100 Subject: [PATCH 073/120] Add allow free url to config panel --- conf/config.json.example | 2 +- config_panel.toml | 10 ++++++++++ scripts/install | 2 ++ scripts/upgrade | 6 ++++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/conf/config.json.example b/conf/config.json.example index 7b30ba4..45e0930 100644 --- a/conf/config.json.example +++ b/conf/config.json.example @@ -7,7 +7,7 @@ "loglevel": "info", "useCDN": false, "allowGravatar": false, - "allowFreeURL": false, + "allowFreeURL": __ALLOW_FREE_URL__, "allowAnonymous": __ALLOW_ANONYMOUS__, "allowAnonymousEdits": true, "defaultPermission": "locked", diff --git a/config_panel.toml b/config_panel.toml index e784143..7814eff 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -22,3 +22,13 @@ name = "HedgeDoc configuration" help = "Set to allow registration of new accounts using an email address. If set to false, you can still create accounts using the command line." bind = "allow_email_registration:__FINALPATH__/config.json" + [main.config.allow_free_url] + ask = "Allow email registration" + type = "boolean" + yes = "true" + no = "false" + help = "Set to allow new note creation by accessing a nonexistent note URL. This is the behavior familiar from Etherpad." + bind = "allow_free_url:__FINALPATH__/config.json" + + + diff --git a/scripts/install b/scripts/install index ed5aea4..d5d0569 100644 --- a/scripts/install +++ b/scripts/install @@ -31,6 +31,7 @@ app=$YNH_APP_INSTANCE_NAME allow_anonymous=false allow_email_registration=false +allow_free_url=false #================================================= # CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS @@ -52,6 +53,7 @@ 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=allow_anonymous --value=$allow_anonymous ynh_app_setting_set --app=$app --key=allow_email_registration --value=$allow_email_registration +ynh_app_setting_set --app=$app --key=allow_free_url --value=$allow_free_url #================================================= # STANDARD MODIFICATIONS diff --git a/scripts/upgrade b/scripts/upgrade index d0f97ad..541592c 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -26,6 +26,7 @@ db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) allow_anonymous=$(ynh_app_setting_get --app=$app --key=allow_anonymous) allow_email_registration=$(ynh_app_setting_get --app=$app --key=allow_email_registration) +allow_free_url=$(ynh_app_setting_get --app=$app --key=allow_free_url) #================================================= # CHECK VERSION @@ -48,6 +49,11 @@ if [ -z "$allow_email_registration" ]; then ynh_app_setting_set --app=$app --key=allow_email_registration --value=$allow_email_registration fi +if [ -z "$allow_free_url" ]; then + allow_free_url="false" + ynh_app_setting_set --app=$app --key=allow_free_url --value=$allow_free_url +fi + # Cleaning legacy permissions if ynh_legacy_permissions_exists; then ynh_legacy_permissions_delete_all From 9158a3f076e1990f6b7580bb9f6ac6a2e0bf0c56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 21 Jan 2023 12:30:12 +0100 Subject: [PATCH 074/120] Add FreeURL authentication --- config_panel.toml | 10 +++++++++- scripts/install | 2 ++ scripts/upgrade | 6 ++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/config_panel.toml b/config_panel.toml index 7814eff..9fdb6dd 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -23,12 +23,20 @@ name = "HedgeDoc configuration" bind = "allow_email_registration:__FINALPATH__/config.json" [main.config.allow_free_url] - ask = "Allow email registration" + ask = "Allow new note creation" type = "boolean" yes = "true" no = "false" help = "Set to allow new note creation by accessing a nonexistent note URL. This is the behavior familiar from Etherpad." bind = "allow_free_url:__FINALPATH__/config.json" + [main.config.require_free_url_authentication] + ask = "Require FreeURL authentication" + type = "boolean" + yes = "true" + no = "false" + help = "Set to require authentication for FreeURL mode style note creation." + bind = "require_free_url_authentication:__FINALPATH__/config.json" + diff --git a/scripts/install b/scripts/install index d5d0569..5cdc25d 100644 --- a/scripts/install +++ b/scripts/install @@ -32,6 +32,7 @@ app=$YNH_APP_INSTANCE_NAME allow_anonymous=false allow_email_registration=false allow_free_url=false +require_free_url_authentication=false #================================================= # CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS @@ -54,6 +55,7 @@ ynh_app_setting_set --app=$app --key=path --value=$path_url ynh_app_setting_set --app=$app --key=allow_anonymous --value=$allow_anonymous ynh_app_setting_set --app=$app --key=allow_email_registration --value=$allow_email_registration ynh_app_setting_set --app=$app --key=allow_free_url --value=$allow_free_url +ynh_app_setting_set --app=$app --key=require_free_url_authentication --value=$require_free_url_authentication #================================================= # STANDARD MODIFICATIONS diff --git a/scripts/upgrade b/scripts/upgrade index 541592c..577b81f 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -27,6 +27,7 @@ db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) allow_anonymous=$(ynh_app_setting_get --app=$app --key=allow_anonymous) allow_email_registration=$(ynh_app_setting_get --app=$app --key=allow_email_registration) allow_free_url=$(ynh_app_setting_get --app=$app --key=allow_free_url) +require_free_url_authentication=$(ynh_app_setting_get --app=$app --key=require_free_url_authentication) #================================================= # CHECK VERSION @@ -54,6 +55,11 @@ if [ -z "$allow_free_url" ]; then ynh_app_setting_set --app=$app --key=allow_free_url --value=$allow_free_url fi +if [ -z "$require_free_url_authentication" ]; then + require_free_url_authentication="false" + ynh_app_setting_set --app=$app --key=require_free_url_authentication --value=$require_free_url_authentication +fi + # Cleaning legacy permissions if ynh_legacy_permissions_exists; then ynh_legacy_permissions_delete_all From f503e6443c7a0d5bd9409a8f23a4628d99d72385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 21 Jan 2023 12:31:14 +0100 Subject: [PATCH 075/120] Update config.json.example --- conf/config.json.example | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/config.json.example b/conf/config.json.example index 45e0930..ec92e56 100644 --- a/conf/config.json.example +++ b/conf/config.json.example @@ -8,6 +8,7 @@ "useCDN": false, "allowGravatar": false, "allowFreeURL": __ALLOW_FREE_URL__, + "requireFreeURLAuthentication": __REQUIRE_FREE_URL_AUTHENTICATION__, "allowAnonymous": __ALLOW_ANONYMOUS__, "allowAnonymousEdits": true, "defaultPermission": "locked", From b37c69ed16b1751c9388c500dd4f0b8875445021 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 21 Jan 2023 12:35:07 +0100 Subject: [PATCH 076/120] Fix --- conf/config.json.example | 2 +- config_panel.toml | 9 +++++++++ scripts/install | 2 ++ scripts/upgrade | 6 ++++++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/conf/config.json.example b/conf/config.json.example index ec92e56..19aadbd 100644 --- a/conf/config.json.example +++ b/conf/config.json.example @@ -10,7 +10,7 @@ "allowFreeURL": __ALLOW_FREE_URL__, "requireFreeURLAuthentication": __REQUIRE_FREE_URL_AUTHENTICATION__, "allowAnonymous": __ALLOW_ANONYMOUS__, - "allowAnonymousEdits": true, + "allowAnonymousEdits": __ALLOW_ANONYMOUS_EDITS__, "defaultPermission": "locked", "email": true, "allowEmailRegister": __ALLOW_EMAIL_REGISTRATION__, diff --git a/config_panel.toml b/config_panel.toml index 9fdb6dd..b56edb0 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -14,6 +14,15 @@ name = "HedgeDoc configuration" help = "Set to allow anonymous usage (default is true)." bind = "allow_anonymous:__FINALPATH__/config.json" + [main.config.allow_anonymous_edits] + ask = "Allow anonymous edits" + type = "boolean" + yes = "true" + no = "false" + help = "Allow users to select freely permission, allowing guests to edit existing notes." + bind = "allow_anonymous_edits:__FINALPATH__/config.json" + + [main.config.allow_email_registration] ask = "Allow email registration" type = "boolean" diff --git a/scripts/install b/scripts/install index 5cdc25d..6d257e0 100644 --- a/scripts/install +++ b/scripts/install @@ -30,6 +30,7 @@ is_public=$YNH_APP_ARG_IS_PUBLIC app=$YNH_APP_INSTANCE_NAME allow_anonymous=false +allow_anonymous_edits=false allow_email_registration=false allow_free_url=false require_free_url_authentication=false @@ -56,6 +57,7 @@ ynh_app_setting_set --app=$app --key=allow_anonymous --value=$allow_anonymous ynh_app_setting_set --app=$app --key=allow_email_registration --value=$allow_email_registration ynh_app_setting_set --app=$app --key=allow_free_url --value=$allow_free_url ynh_app_setting_set --app=$app --key=require_free_url_authentication --value=$require_free_url_authentication +ynh_app_setting_set --app=$app --key=allow_anonymous_edits --value=$allow_anonymous_edits #================================================= # STANDARD MODIFICATIONS diff --git a/scripts/upgrade b/scripts/upgrade index 577b81f..3afcbd2 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -25,6 +25,7 @@ db_user=$db_name db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) allow_anonymous=$(ynh_app_setting_get --app=$app --key=allow_anonymous) +allow_anonymous_edits=$(ynh_app_setting_get --app=$app --key=allow_anonymous_edits) allow_email_registration=$(ynh_app_setting_get --app=$app --key=allow_email_registration) allow_free_url=$(ynh_app_setting_get --app=$app --key=allow_free_url) require_free_url_authentication=$(ynh_app_setting_get --app=$app --key=require_free_url_authentication) @@ -45,6 +46,11 @@ if [ -z "$allow_anonymous" ]; then ynh_app_setting_set --app=$app --key=allow_anonymous --value=$allow_anonymous fi +if [ -z "$allow_anonymous_edits" ]; then + allow_anonymous_edits="false" + ynh_app_setting_set --app=$app --key=allow_anonymous_edits --value=$allow_anonymous_edits +fi + if [ -z "$allow_email_registration" ]; then allow_email_registration="false" ynh_app_setting_set --app=$app --key=allow_email_registration --value=$allow_email_registration From 50558c9fbb772d65f885af4c3b787a69a03a27e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 29 Jan 2023 17:31:31 +0100 Subject: [PATCH 077/120] remove yarn cache --- scripts/upgrade | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/upgrade b/scripts/upgrade index 3afcbd2..9c81389 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -152,6 +152,7 @@ then ynh_script_progression --message="Building HedgeDoc... (this will take some time and resources!)" --weight=20 pushd "$final_path" + ynh_secure_remove /usr/local/share/.cache/yarn ynh_use_nodejs bin/setup popd From 4b12953af81f40a62aeb0144118e7a03ceb5fb8f Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sun, 29 Jan 2023 16:31:35 +0000 Subject: [PATCH 078/120] Auto-update README --- README.md | 2 +- README_fr.md | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index f9cfdf8..c2562ac 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ It shall NOT be edited by hand. # HedgeDoc for YunoHost -[![Integration level](https://dash.yunohost.org/integration/hedgedoc.svg)](https://dash.yunohost.org/appci/app/hedgedoc) ![Working status](https://ci-apps.yunohost.org/ci/badges/hedgedoc.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/hedgedoc.maintain.svg) +[![Integration level](https://dash.yunohost.org/integration/hedgedoc.svg)](https://dash.yunohost.org/appci/app/hedgedoc) ![Working status](https://ci-apps.yunohost.org/ci/badges/hedgedoc.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/hedgedoc.maintain.svg) [![Install HedgeDoc with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=hedgedoc) *[Lire ce readme en français.](./README_fr.md)* diff --git a/README_fr.md b/README_fr.md index 106324b..03aec99 100644 --- a/README_fr.md +++ b/README_fr.md @@ -5,15 +5,15 @@ It shall NOT be edited by hand. # HedgeDoc pour YunoHost -[![Niveau d'intégration](https://dash.yunohost.org/integration/hedgedoc.svg)](https://dash.yunohost.org/appci/app/hedgedoc) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/hedgedoc.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/hedgedoc.maintain.svg) +[![Niveau d’intégration](https://dash.yunohost.org/integration/hedgedoc.svg)](https://dash.yunohost.org/appci/app/hedgedoc) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/hedgedoc.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/hedgedoc.maintain.svg) [![Installer HedgeDoc avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=hedgedoc) *[Read this readme in english.](./README.md)* -> *Ce package vous permet d'installer HedgeDoc 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.* +> *Ce package vous permet d’installer HedgeDoc 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 +## Vue d’ensemble HedgeDoc (formerly known as CodiMD) is an open-source, web-based, self-hosted, collaborative markdown editor. @@ -32,9 +32,9 @@ You can use it to easily collaborate on notes, graphs and even presentations in **Démo :** https://demo.hedgedoc.org/ -## Captures d'écran +## Captures d’écran -![Capture d'écran de HedgeDoc](./doc/screenshots/screenshot.png) +![Capture d’écran de HedgeDoc](./doc/screenshots/screenshot.png) ## Avertissements / informations importantes @@ -45,9 +45,9 @@ Lorsque vous avez terminé de modifier la configuration, pour que vos modificati ## Documentations et ressources -* Site officiel de l'app : -* Documentation officielle de l'admin : -* Dépôt de code officiel de l'app : +* Site officiel de l’app : +* Documentation officielle de l’admin : +* Dépôt de code officiel de l’app : * Documentation YunoHost pour cette app : * Signaler un bug : @@ -63,4 +63,4 @@ ou sudo yunohost app upgrade hedgedoc -u https://github.com/YunoHost-Apps/hedgedoc_ynh/tree/testing --debug ``` -**Plus d'infos sur le packaging d'applications :** +**Plus d’infos sur le packaging d’applications :** \ No newline at end of file From 162755f039e26f92274f881305abd1bdc6d9980c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 20 Feb 2023 06:52:10 +0100 Subject: [PATCH 079/120] 1.9.7 --- conf/app.src | 4 ++-- conf/nginx.conf | 3 ++- manifest.json | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/conf/app.src b/conf/app.src index 268b8cf..03fcd47 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.9.6/hedgedoc-1.9.6.tar.gz -SOURCE_SUM=dfd0fca006f9075f072df058476ea542adb32b63964afb2985211e1114ab333e +SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.9.7/hedgedoc-1.9.7.tar.gz +SOURCE_SUM=c9bd99c65cf45fa1d7808855b46abbfa13b24400254d8da5e81dae2965494bb3 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/conf/nginx.conf b/conf/nginx.conf index ab4eec6..c333c47 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,4 +1,5 @@ -location ^~ __PATH__/ { +#sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; +location __PATH__/ { proxy_pass http://127.0.0.1:__PORT__/; proxy_redirect off; diff --git a/manifest.json b/manifest.json index a38fa58..34af6e6 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.9.6~ynh2", + "version": "1.9.7~ynh1", "url": "https://hedgedoc.org", "upstream": { "license": "AGPL-3.0-only", From 2ac0efc23e47edefbf4388bd7a7d00aaf73b528c Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 20 Feb 2023 05:52:16 +0000 Subject: [PATCH 080/120] Auto-update README --- README.md | 3 ++- README_fr.md | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c2562ac..9480479 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ It shall NOT be edited by hand. # HedgeDoc for YunoHost [![Integration level](https://dash.yunohost.org/integration/hedgedoc.svg)](https://dash.yunohost.org/appci/app/hedgedoc) ![Working status](https://ci-apps.yunohost.org/ci/badges/hedgedoc.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/hedgedoc.maintain.svg) + [![Install HedgeDoc with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=hedgedoc) *[Lire ce readme en français.](./README_fr.md)* @@ -28,7 +29,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Shipped version:** 1.9.6~ynh2 +**Shipped version:** 1.9.7~ynh1 **Demo:** https://demo.hedgedoc.org/ diff --git a/README_fr.md b/README_fr.md index 03aec99..3e2d0fb 100644 --- a/README_fr.md +++ b/README_fr.md @@ -6,6 +6,7 @@ It shall NOT be edited by hand. # HedgeDoc pour YunoHost [![Niveau d’intégration](https://dash.yunohost.org/integration/hedgedoc.svg)](https://dash.yunohost.org/appci/app/hedgedoc) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/hedgedoc.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/hedgedoc.maintain.svg) + [![Installer HedgeDoc avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=hedgedoc) *[Read this readme in english.](./README.md)* @@ -28,7 +29,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Version incluse :** 1.9.6~ynh2 +**Version incluse :** 1.9.7~ynh1 **Démo :** https://demo.hedgedoc.org/ From 346ae3f765352fa5723fcf6552e252672f0bf1a8 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 20 Feb 2023 08:10:36 +0100 Subject: [PATCH 081/120] Update change_url --- scripts/change_url | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/change_url b/scripts/change_url index 5fd09f8..945e228 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -34,7 +34,10 @@ db_user=$db_name db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) allow_anonymous=$(ynh_app_setting_get --app=$app --key=allow_anonymous) +allow_anonymous_edits=$(ynh_app_setting_get --app=$app --key=allow_anonymous_edits) allow_email_registration=$(ynh_app_setting_get --app=$app --key=allow_email_registration) +allow_free_url=$(ynh_app_setting_get --app=$app --key=allow_free_url) +require_free_url_authentication=$(ynh_app_setting_get --app=$app --key=require_free_url_authentication) #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP From 23b515f4ae4fe3da6eb608a6d4d6163777ceb501 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 27 Feb 2023 15:37:16 +0100 Subject: [PATCH 082/120] Update systemd.service --- conf/systemd.service | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/systemd.service b/conf/systemd.service index caea1b3..b833286 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -8,6 +8,7 @@ Type=simple User=__APP__ Group=__APP__ WorkingDirectory=__FINALPATH__ +Environment="PUPPETEER_SKIP_DOWNLOAD" Environment="__YNH_NODE_LOAD_PATH__" Environment="NODE_ENV=production" ExecStart=__YNH_NPM__ start --production From b3eb7ab21ba578dd49b3e8f4ef0ffac825c3d4d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 27 Feb 2023 19:00:04 +0100 Subject: [PATCH 083/120] Update systemd.service --- conf/systemd.service | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/systemd.service b/conf/systemd.service index b833286..caea1b3 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -8,7 +8,6 @@ Type=simple User=__APP__ Group=__APP__ WorkingDirectory=__FINALPATH__ -Environment="PUPPETEER_SKIP_DOWNLOAD" Environment="__YNH_NODE_LOAD_PATH__" Environment="NODE_ENV=production" ExecStart=__YNH_NPM__ start --production From 490aa8ba5c579978e2b5bde745d86308ea4d2002 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 27 Feb 2023 19:15:05 +0100 Subject: [PATCH 084/120] Update install --- scripts/install | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index 6d257e0..3b46884 100644 --- a/scripts/install +++ b/scripts/install @@ -132,8 +132,10 @@ ynh_script_progression --message="Building HedgeDoc... (this will take some time pushd "$final_path" ynh_use_nodejs - ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn cache clean - bin/setup + #ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn cache clean + ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn install --frozen-lockfile + ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn build + #bin/setup popd #================================================= From cc4d70a11a79c64a068ac7523e88bcf9c0335ab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 27 Feb 2023 19:26:02 +0100 Subject: [PATCH 085/120] FIx --- scripts/install | 1 - scripts/upgrade | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index 3b46884..cc2cda1 100644 --- a/scripts/install +++ b/scripts/install @@ -135,7 +135,6 @@ pushd "$final_path" #ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn cache clean ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn install --frozen-lockfile ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn build - #bin/setup popd #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 9c81389..874501f 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -154,7 +154,8 @@ then pushd "$final_path" ynh_secure_remove /usr/local/share/.cache/yarn ynh_use_nodejs - bin/setup + ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn install --frozen-lockfile + ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn build popd fi From b0a49dbe104ef4cf0de4038a460c78d25e426b90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 27 Feb 2023 23:05:10 +0100 Subject: [PATCH 086/120] Update manifest.json --- manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index 34af6e6..be5e979 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Collaborative editor to work on notes written in Markdown", "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" }, - "version": "1.9.7~ynh1", + "version": "1.9.7~ynh2", "url": "https://hedgedoc.org", "upstream": { "license": "AGPL-3.0-only", @@ -20,7 +20,7 @@ "name": "eric_G" }, "requirements": { - "yunohost": ">= 11.0.9" + "yunohost": ">= 11.1.11" }, "multi_instance": true, "services": [ From 2d4e45bec137ace6a6943a74816b06cd5d4587f5 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 27 Feb 2023 22:05:14 +0000 Subject: [PATCH 087/120] 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 9480479..6435b6b 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Shipped version:** 1.9.7~ynh1 +**Shipped version:** 1.9.7~ynh2 **Demo:** https://demo.hedgedoc.org/ diff --git a/README_fr.md b/README_fr.md index 3e2d0fb..60b380d 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Version incluse :** 1.9.7~ynh1 +**Version incluse :** 1.9.7~ynh2 **Démo :** https://demo.hedgedoc.org/ From 9e451464ee3c9c6c710c5a7b60b4b679ca9b523c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 5 Mar 2023 17:13:04 +0100 Subject: [PATCH 088/120] Update manifest.json --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index be5e979..78530e0 100644 --- a/manifest.json +++ b/manifest.json @@ -20,7 +20,7 @@ "name": "eric_G" }, "requirements": { - "yunohost": ">= 11.1.11" + "yunohost": ">= 11.1.13" }, "multi_instance": true, "services": [ From 75cff99531133b866133b748d179a873ded4ca89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 3 Apr 2023 11:43:36 +0200 Subject: [PATCH 089/120] Version 2 (#58) * v2 * fix * Auto-update README * Update manifest.toml * fix * Update install * Update upgrade * Update change_url * Update install * fix * Auto-update README * Fix * Auto-update README * Fix * fix * Update manifest.toml * fix * fix * Auto-update README * Update tests.toml --------- Co-authored-by: yunohost-bot --- README.md | 9 +-- README_fr.md | 9 +-- check_process | 26 -------- conf/app.src | 5 -- conf/systemd.service | 2 +- config_panel.toml | 10 +-- config_panel.toml.example | 24 -------- doc/ADMIN.md | 4 ++ doc/ADMIN_fr.md | 4 ++ doc/DISCLAIMER.md | 4 -- doc/DISCLAIMER_fr.md | 4 -- manifest.json | 52 ---------------- manifest.toml | 69 +++++++++++++++++++++ scripts/_common.sh | 3 - scripts/backup | 23 +------ scripts/change_url | 102 ++---------------------------- scripts/install | 126 +++++--------------------------------- scripts/remove | 41 ------------- scripts/restore | 55 +---------------- scripts/upgrade | 101 ++++-------------------------- tests.toml | 9 +++ 21 files changed, 131 insertions(+), 551 deletions(-) delete mode 100644 check_process delete mode 100644 conf/app.src delete mode 100644 config_panel.toml.example create mode 100644 doc/ADMIN.md create mode 100644 doc/ADMIN_fr.md delete mode 100644 doc/DISCLAIMER.md delete mode 100644 doc/DISCLAIMER_fr.md delete mode 100644 manifest.json create mode 100644 manifest.toml create mode 100644 tests.toml diff --git a/README.md b/README.md index 6435b6b..692fe0e 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Shipped version:** 1.9.7~ynh2 +**Shipped version:** 1.9.7~ynh3 **Demo:** https://demo.hedgedoc.org/ @@ -37,13 +37,6 @@ You can use it to easily collaborate on notes, graphs and even presentations in ![Screenshot of HedgeDoc](./doc/screenshots/screenshot.png) -## Disclaimers / important information - -## Configuration - -You can configure HedgeDoc by editing this file `/var/www/hedgedoc/config.json` using the [documentation](https://github.com/hedgedoc/hedgedoc/blob/master/docs/configuration.md) -When you finished editing the configuration, for your changes to take effect, you will have to run: `sudo systemctl restart hedgedoc`. - ## Documentation and resources * Official app website: diff --git a/README_fr.md b/README_fr.md index 60b380d..569a67c 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Version incluse :** 1.9.7~ynh2 +**Version incluse :** 1.9.7~ynh3 **Démo :** https://demo.hedgedoc.org/ @@ -37,13 +37,6 @@ You can use it to easily collaborate on notes, graphs and even presentations in ![Capture d’écran de HedgeDoc](./doc/screenshots/screenshot.png) -## Avertissements / informations importantes - -## Configuration - -Vous pouvez configurer HedgeDoc en modifiant le fichier `/var/www/hedgedoc/config.json` et en vous aidant de la [documentation](https://github.com/hedgedoc/hedgedoc/blob/master/docs/configuration.md) -Lorsque vous avez terminé de modifier la configuration, pour que vos modifications prennent effet, vous devrez exécuter : `sudo systemctl restart hedgedoc`. - ## Documentations et ressources * Site officiel de l’app : diff --git a/check_process b/check_process deleted file mode 100644 index 85e5f61..0000000 --- a/check_process +++ /dev/null @@ -1,26 +0,0 @@ -;; Test complet - ; Manifest - domain="domain.tld" - path="/path" - admin="john" - is_public=1 - ; Checks - pkg_linter=1 - setup_sub_dir=1 - setup_root=1 - setup_nourl=0 - setup_private=1 - setup_public=1 - upgrade=1 - upgrade=1 from_commit=2a6ed9db5f7f0644eab251b2495c190811735832 - backup_restore=1 - multi_instance=1 - change_url=1 -;;; Options -Email= -Notification=none -;;; Upgrade options - ; commit=2a6ed9db5f7f0644eab251b2495c190811735832 - name=Testing (#13) - manifest_arg=domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666& - diff --git a/conf/app.src b/conf/app.src deleted file mode 100644 index 03fcd47..0000000 --- a/conf/app.src +++ /dev/null @@ -1,5 +0,0 @@ -SOURCE_URL=https://github.com/hedgedoc/hedgedoc/releases/download/1.9.7/hedgedoc-1.9.7.tar.gz -SOURCE_SUM=c9bd99c65cf45fa1d7808855b46abbfa13b24400254d8da5e81dae2965494bb3 -SOURCE_SUM_PRG=sha256sum -SOURCE_FORMAT=tar.gz -SOURCE_IN_SUBDIR=true diff --git a/conf/systemd.service b/conf/systemd.service index caea1b3..017e1d6 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -7,7 +7,7 @@ After=network.target postgresql.service Type=simple User=__APP__ Group=__APP__ -WorkingDirectory=__FINALPATH__ +WorkingDirectory=__INSTALL_DIR__ Environment="__YNH_NODE_LOAD_PATH__" Environment="NODE_ENV=production" ExecStart=__YNH_NPM__ start --production diff --git a/config_panel.toml b/config_panel.toml index b56edb0..df31d1a 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -12,7 +12,7 @@ name = "HedgeDoc configuration" yes = "true" no = "false" help = "Set to allow anonymous usage (default is true)." - bind = "allow_anonymous:__FINALPATH__/config.json" + bind = "allow_anonymous:__INSTALL_DIR__/config.json" [main.config.allow_anonymous_edits] ask = "Allow anonymous edits" @@ -20,7 +20,7 @@ name = "HedgeDoc configuration" yes = "true" no = "false" help = "Allow users to select freely permission, allowing guests to edit existing notes." - bind = "allow_anonymous_edits:__FINALPATH__/config.json" + bind = "allow_anonymous_edits:__INSTALL_DIR__/config.json" [main.config.allow_email_registration] @@ -29,7 +29,7 @@ name = "HedgeDoc configuration" yes = "true" no = "false" help = "Set to allow registration of new accounts using an email address. If set to false, you can still create accounts using the command line." - bind = "allow_email_registration:__FINALPATH__/config.json" + bind = "allow_email_registration:__INSTALL_DIR__/config.json" [main.config.allow_free_url] ask = "Allow new note creation" @@ -37,7 +37,7 @@ name = "HedgeDoc configuration" yes = "true" no = "false" help = "Set to allow new note creation by accessing a nonexistent note URL. This is the behavior familiar from Etherpad." - bind = "allow_free_url:__FINALPATH__/config.json" + bind = "allow_free_url:__INSTALL_DIR__/config.json" [main.config.require_free_url_authentication] ask = "Require FreeURL authentication" @@ -45,7 +45,7 @@ name = "HedgeDoc configuration" yes = "true" no = "false" help = "Set to require authentication for FreeURL mode style note creation." - bind = "require_free_url_authentication:__FINALPATH__/config.json" + bind = "require_free_url_authentication:__INSTALL_DIR__/config.json" diff --git a/config_panel.toml.example b/config_panel.toml.example deleted file mode 100644 index e784143..0000000 --- a/config_panel.toml.example +++ /dev/null @@ -1,24 +0,0 @@ -version = "1.0" - -[main] -name = "HedgeDoc configuration" - - [main.config] - name = "Configuration Options" - - [main.config.allow_anonymous] - ask = "Allow anonymous usage" - type = "boolean" - yes = "true" - no = "false" - help = "Set to allow anonymous usage (default is true)." - bind = "allow_anonymous:__FINALPATH__/config.json" - - [main.config.allow_email_registration] - ask = "Allow email registration" - type = "boolean" - yes = "true" - no = "false" - help = "Set to allow registration of new accounts using an email address. If set to false, you can still create accounts using the command line." - bind = "allow_email_registration:__FINALPATH__/config.json" - diff --git a/doc/ADMIN.md b/doc/ADMIN.md new file mode 100644 index 0000000..7ae98e7 --- /dev/null +++ b/doc/ADMIN.md @@ -0,0 +1,4 @@ +## Configuration + +You can configure HedgeDoc by editing this file `__INSTALL_DIR__/config.json` using the [documentation](https://github.com/hedgedoc/hedgedoc/blob/master/docs/configuration.md) +When you finished editing the configuration, for your changes to take effect, you will have to run: `sudo systemctl restart hedgedoc`. diff --git a/doc/ADMIN_fr.md b/doc/ADMIN_fr.md new file mode 100644 index 0000000..331dbd2 --- /dev/null +++ b/doc/ADMIN_fr.md @@ -0,0 +1,4 @@ +## Configuration + +Vous pouvez configurer HedgeDoc en modifiant le fichier `__INSTALL_DIR__/config.json` et en vous aidant de la [documentation](https://github.com/hedgedoc/hedgedoc/blob/master/docs/configuration.md) +Lorsque vous avez terminé de modifier la configuration, pour que vos modifications prennent effet, vous devrez exécuter : `sudo systemctl restart hedgedoc`. diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md deleted file mode 100644 index 2314b9b..0000000 --- a/doc/DISCLAIMER.md +++ /dev/null @@ -1,4 +0,0 @@ -## Configuration - -You can configure HedgeDoc by editing this file `/var/www/hedgedoc/config.json` using the [documentation](https://github.com/hedgedoc/hedgedoc/blob/master/docs/configuration.md) -When you finished editing the configuration, for your changes to take effect, you will have to run: `sudo systemctl restart hedgedoc`. diff --git a/doc/DISCLAIMER_fr.md b/doc/DISCLAIMER_fr.md deleted file mode 100644 index aefa446..0000000 --- a/doc/DISCLAIMER_fr.md +++ /dev/null @@ -1,4 +0,0 @@ -## Configuration - -Vous pouvez configurer HedgeDoc en modifiant le fichier `/var/www/hedgedoc/config.json` et en vous aidant de la [documentation](https://github.com/hedgedoc/hedgedoc/blob/master/docs/configuration.md) -Lorsque vous avez terminé de modifier la configuration, pour que vos modifications prennent effet, vous devrez exécuter : `sudo systemctl restart hedgedoc`. diff --git a/manifest.json b/manifest.json deleted file mode 100644 index 78530e0..0000000 --- a/manifest.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "HedgeDoc", - "id": "hedgedoc", - "packaging_format": 1, - "description": { - "en": "Collaborative editor to work on notes written in Markdown", - "fr": "Éditeur collaboratif pour travailler sur des notes en Markdown" - }, - "version": "1.9.7~ynh2", - "url": "https://hedgedoc.org", - "upstream": { - "license": "AGPL-3.0-only", - "website": "https://hedgedoc.org", - "demo": "https://demo.hedgedoc.org/", - "admindoc": "https://docs.hedgedoc.org/", - "code": "https://github.com/hedgedoc/hedgedoc" - }, - "license": "AGPL-3.0-only", - "maintainer": { - "name": "eric_G" - }, - "requirements": { - "yunohost": ">= 11.1.13" - }, - "multi_instance": true, - "services": [ - "nginx" - ], - "arguments": { - "install" : [ - { - "name": "domain", - "type": "domain" - }, - { - "name": "path", - "type": "path", - "example": "/hedgedoc", - "default": "/hedgedoc" - }, - { - "name": "is_public", - "type": "boolean", - "help": { - "en": "If enabled, HedgeDoc 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, HedgeDoc sera accessible aux personnes n’ayant pas de compte. Vous pourrez changer ceci plus tard via la webadmin." - }, - "default": true - } - ] - } -} diff --git a/manifest.toml b/manifest.toml new file mode 100644 index 0000000..c8d75f4 --- /dev/null +++ b/manifest.toml @@ -0,0 +1,69 @@ +packaging_format = 2 + +id = "hedgedoc" +name = "HedgeDoc" +description.en = "Collaborative editor to work on notes written in Markdown" +description.fr = "Éditeur collaboratif pour travailler sur des notes en Markdown" + +version = "1.9.7~ynh3" + +maintainers = ["eric_G"] + +[upstream] +license = "AGPL-3.0-only" +website = "https://hedgedoc.org" +demo = "https://demo.hedgedoc.org/" +admindoc = "https://docs.hedgedoc.org/" +code = "https://github.com/hedgedoc/hedgedoc" + +[integration] +yunohost = ">= 11.1.16" +architectures = "all" +multi_instance = true +ldap = true +sso = true +disk = "50M" +ram.build = "2500M" +ram.runtime = "50M" + +[install] + [install.domain] + type = "domain" + + [install.path] + type = "path" + default = "/hedgedoc" + + [install.init_main_permission] + help.en = "If enabled, HedgeDoc will be accessible by people who do not have an account. This can be changed later via the webadmin." + help.fr = "Si cette case est cochée, HedgeDoc sera accessible aux personnes n’ayant pas de compte. Vous pourrez changer ceci plus tard via la webadmin." + type = "group" + default = "visitors" + +[resources] + + [resources.sources] + + [resources.sources.main] + url = "https://github.com/hedgedoc/hedgedoc/releases/download/1.9.7/hedgedoc-1.9.7.tar.gz" + sha256 = "c9bd99c65cf45fa1d7808855b46abbfa13b24400254d8da5e81dae2965494bb3" + autoupdate.strategy = "latest_github_tag" + + [resources.ports] + + [resources.system_user] + + [resources.install_dir] + + [resources.permissions] + main.url = "/" + + [resources.apt] + packages = "postgresql" + + extras.yarn.repo = "deb https://dl.yarnpkg.com/debian/ stable main" + extras.yarn.key = "https://dl.yarnpkg.com/debian/pubkey.gpg" + extras.yarn.packages = "yarn" + + [resources.database] + type = "postgresql" diff --git a/scripts/_common.sh b/scripts/_common.sh index 7f17471..b818f0f 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -4,9 +4,6 @@ # COMMON VARIABLES #================================================= -# dependencies used by the app -pkg_dependencies="postgresql" - nodejs_version=16 #================================================= diff --git a/scripts/backup b/scripts/backup index 8d4d217..5472aff 100644 --- a/scripts/backup +++ b/scripts/backup @@ -9,27 +9,6 @@ source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -#================================================= -# MANAGE SCRIPT FAILURE -#================================================= - -ynh_clean_setup () { - ynh_clean_check_starting -} -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - -#================================================= -# LOAD SETTINGS -#================================================= -ynh_print_info --message="Loading installation settings..." - -app=$YNH_APP_INSTANCE_NAME - -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) - #================================================= # DECLARE DATA AND CONF FILES TO BACKUP #================================================= @@ -39,7 +18,7 @@ ynh_print_info --message="Declaring files to be backed up..." # BACKUP THE APP MAIN DIR #================================================= -ynh_backup --src_path="$final_path" +ynh_backup --src_path="$install_dir" #================================================= # BACKUP THE NGINX CONFIGURATION diff --git a/scripts/change_url b/scripts/change_url index 945e228..85e7e6c 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -9,69 +9,6 @@ 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) -db_name=$(ynh_app_setting_get --app=$app --key=db_name) -db_user=$db_name -db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) - -allow_anonymous=$(ynh_app_setting_get --app=$app --key=allow_anonymous) -allow_anonymous_edits=$(ynh_app_setting_get --app=$app --key=allow_anonymous_edits) -allow_email_registration=$(ynh_app_setting_get --app=$app --key=allow_email_registration) -allow_free_url=$(ynh_app_setting_get --app=$app --key=allow_free_url) -require_free_url_authentication=$(ynh_app_setting_get --app=$app --key=require_free_url_authentication) - -#================================================= -# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP -#================================================= -ynh_script_progression --message="Backing up HedgeDoc 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 #================================================= @@ -86,29 +23,7 @@ ynh_systemd_action --service_name=$app --action=stop --log_path=systemd #================================================= 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 +ynh_change_url_nginx_config #================================================= # SPECIFIC MODIFICATIONS @@ -116,15 +31,15 @@ fi # CONFIGURE HEDGEDOC #================================================= -ynh_backup_if_checksum_is_different --file="$final_path/config.json" +ynh_backup_if_checksum_is_different --file="$install_dir/config.json" domain=$new_domain url_path=${new_path#/} -ynh_add_config --template="../conf/config.json.example" --destination="$final_path/config.json" +ynh_add_config --template="../conf/config.json.example" --destination="$install_dir/config.json" -chmod 400 "$final_path/config.json" -chown $app:$app "$final_path/config.json" +chmod 400 "$install_dir/config.json" +chown $app:$app "$install_dir/config.json" #================================================= # GENERIC FINALISATION @@ -136,13 +51,6 @@ ynh_script_progression --message="Starting a systemd service..." --weight=1 # Start a systemd service ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="HTTP Server listening" -#================================================= -# RELOAD NGINX -#================================================= -ynh_script_progression --message="Reloading NGINX web server..." --weight=1 - -ynh_systemd_action --service_name=nginx --action=reload - #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/install b/scripts/install index cc2cda1..795873a 100644 --- a/scripts/install +++ b/scripts/install @@ -9,120 +9,58 @@ source _common.sh source /usr/share/yunohost/helpers -#================================================= -# MANAGE SCRIPT FAILURE -#================================================= - -ynh_clean_setup () { - ynh_clean_check_starting -} -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - #================================================= # RETRIEVE ARGUMENTS FROM THE MANIFEST #================================================= -domain=$YNH_APP_ARG_DOMAIN -path_url=$YNH_APP_ARG_PATH -is_public=$YNH_APP_ARG_IS_PUBLIC - -app=$YNH_APP_INSTANCE_NAME - allow_anonymous=false allow_anonymous_edits=false allow_email_registration=false allow_free_url=false require_free_url_authentication=false -#================================================= -# CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS -#================================================= -ynh_script_progression --message="Validating installation parameters..." --weight=1 - -final_path=/var/www/$app -test ! -e "$final_path" || ynh_die --message="This path already contains a folder" - -# Register (book) web path -ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url - #================================================= # STORE SETTINGS FROM MANIFEST #================================================= -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=allow_anonymous --value=$allow_anonymous ynh_app_setting_set --app=$app --key=allow_email_registration --value=$allow_email_registration ynh_app_setting_set --app=$app --key=allow_free_url --value=$allow_free_url ynh_app_setting_set --app=$app --key=require_free_url_authentication --value=$require_free_url_authentication ynh_app_setting_set --app=$app --key=allow_anonymous_edits --value=$allow_anonymous_edits -#================================================= -# STANDARD MODIFICATIONS -#================================================= -# FIND AND OPEN A PORT -#================================================= -ynh_script_progression --message="Finding an available port..." --weight=2 - -# Find an available port -port=$(ynh_find_port --port=3000) -ynh_app_setting_set --app=$app --key=port --value=$port - #================================================= # INSTALL DEPENDENCIES #================================================= ynh_script_progression --message="Installing dependencies..." --weight=20 -ynh_exec_warn_less 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" - -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Configuring system user..." --weight=2 - -# Create a system user -ynh_system_user_create --username=$app --home_dir=$final_path - -#================================================= -# CREATE A POSTGRESQL DATABASE -#================================================= -ynh_script_progression --message="Creating a PostgreSQL database..." --weight=2 - -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_psql_test_if_first_run -ynh_psql_setup_db --db_user=$db_user --db_name=$db_name - #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= ynh_script_progression --message="Setting up source files..." --weight=2 -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 +ynh_setup_source --dest_dir=$install_dir -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" +chmod -R o-rwx "$install_dir" +chown -R $app:www-data "$install_dir" #================================================= -# NGINX CONFIGURATION +# SYSTEM CONFIGURATION #================================================= -ynh_script_progression --message="Configuring NGINX web server..." --weight=2 +ynh_script_progression --message="Adding system configurations related to $app ..." --weight=1 # Create a dedicated NGINX config ynh_add_nginx_config +# Create a dedicated systemd config +ynh_add_systemd_config + +yunohost service add $app --description="Collaborative Markdown editor" --log="/var/log/$app/$app.log" + #================================================= # SPECIFIC SETUP #============================================== @@ -130,38 +68,22 @@ ynh_add_nginx_config #============================================== ynh_script_progression --message="Building HedgeDoc... (this will take some time and resources!)" --weight=20 -pushd "$final_path" +pushd "$install_dir" ynh_use_nodejs - #ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn cache clean ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn install --frozen-lockfile ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn build popd -#================================================= -# SETUP SYSTEMD -#================================================= -ynh_script_progression --message="Configuring a systemd service..." --weight=1 - -# Create a dedicated systemd config -ynh_add_systemd_config - #================================================= # MODIFY A CONFIG FILE #================================================= ynh_script_progression --message="Modifying a config file..." --weight=1 -url_path=${path_url#/} -ynh_add_config --template="../conf/config.json.example" --destination="$final_path/config.json" +url_path=${path#/} +ynh_add_config --template="../conf/config.json.example" --destination="$install_dir/config.json" -chmod 600 "$final_path/config.json" -chown $app:$app "$final_path/config.json" - -#================================================= -# INTEGRATE SERVICE IN YUNOHOST -#================================================= -ynh_script_progression --message="Integrating service in YunoHost..." --weight=2 - -yunohost service add $app --description="Collaborative Markdown editor" --log="/var/log/$app/$app.log" +chmod 600 "$install_dir/config.json" +chown $app:$app "$install_dir/config.json" #================================================= # START SYSTEMD SERVICE @@ -171,24 +93,6 @@ 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="HTTP Server listening" -#================================================= -# 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_permission_update --permission="main" --add="visitors" -fi - -#================================================= -# RELOAD NGINX -#================================================= -ynh_script_progression --message="Reloading NGINX web server..." --weight=2 - -ynh_systemd_action --service_name=nginx --action=reload - #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/remove b/scripts/remove index 2e2045a..dbd13c5 100644 --- a/scripts/remove +++ b/scripts/remove @@ -9,18 +9,6 @@ source _common.sh source /usr/share/yunohost/helpers -#================================================= -# LOAD SETTINGS -#================================================= -ynh_script_progression --message="Loading installation settings..." --weight=1 - -app=$YNH_APP_INSTANCE_NAME - -domain=$(ynh_app_setting_get --app=$app --key=domain) -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 - #================================================= # STANDARD REMOVE #================================================= @@ -42,32 +30,13 @@ ynh_script_progression --message="Stopping and removing the systemd service..." # Remove the dedicated systemd config ynh_remove_systemd_config -#================================================= -# REMOVE THE POSTGRESQL DATABASE -#================================================= -ynh_script_progression --message="Removing the PostgreSQL database..." --weight=2 - -# Remove a database if it exists, along with the associated user -ynh_psql_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 -#================================================= -# REMOVE APP MAIN DIR -#================================================= -ynh_script_progression --message="Removing $app main directory..." --weight=6 - -# Remove the app directory securely -ynh_secure_remove --file="$final_path" - #================================================= # REMOVE NGINX CONFIGURATION #================================================= @@ -76,16 +45,6 @@ ynh_script_progression --message="Removing NGINX web server configuration..." -- # 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 #================================================= diff --git a/scripts/restore b/scripts/restore index bb4d2a2..eee9898 100644 --- a/scripts/restore +++ b/scripts/restore @@ -9,38 +9,6 @@ source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -#================================================= -# MANAGE SCRIPT FAILURE -#================================================= - -ynh_clean_setup () { - ynh_clean_check_starting -} -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - -#================================================= -# LOAD SETTINGS -#================================================= -ynh_script_progression --message="Loading settings..." --weight=1 - -app=$YNH_APP_INSTANCE_NAME - -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 -db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) - -#================================================= -# CHECK IF THE APP CAN BE RESTORED -#================================================= -ynh_script_progression --message="Validating restoration parameters..." --weight=2 - -test ! -d $final_path \ - || ynh_die --message="There is already a directory: $final_path " - #================================================= # STANDARD RESTORATION STEPS #================================================= @@ -50,24 +18,15 @@ ynh_script_progression --message="Restoring the NGINX configuration..." --weight 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 #================================================= ynh_script_progression --message="Restoring HedgeDoc main directory..." --weight=10 -ynh_restore_file --origin_path="$final_path" +ynh_restore_file --origin_path="$install_dir" -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" +chmod -R o-rwx "$install_dir" +chown -R $app:www-data "$install_dir" #================================================= # SPECIFIC RESTORATION @@ -76,22 +35,14 @@ chown -R $app:www-data "$final_path" #================================================= ynh_script_progression --message="Reinstalling dependencies..." --weight=6 -# Define and install dependencies -ynh_exec_warn_less 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" - #================================================= # RESTORE THE POSTGRESQL DATABASE #================================================= ynh_script_progression --message="Restoring the PostgreSQL database..." --weight=6 -ynh_psql_test_if_first_run -ynh_psql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd ynh_psql_execute_file_as_root --file="./db.sql" --database=$db_name #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 874501f..fc592db 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -9,27 +9,6 @@ source _common.sh source /usr/share/yunohost/helpers -#================================================= -# LOAD SETTINGS -#================================================= -ynh_script_progression --message="Loading installation settings..." --weight=2 - -app=$YNH_APP_INSTANCE_NAME - -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) -port=$(ynh_app_setting_get --app=$app --key=port) -db_name=$(ynh_app_setting_get --app=$app --key=db_name) -db_user=$db_name -db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) - -allow_anonymous=$(ynh_app_setting_get --app=$app --key=allow_anonymous) -allow_anonymous_edits=$(ynh_app_setting_get --app=$app --key=allow_anonymous_edits) -allow_email_registration=$(ynh_app_setting_get --app=$app --key=allow_email_registration) -allow_free_url=$(ynh_app_setting_get --app=$app --key=allow_free_url) -require_free_url_authentication=$(ynh_app_setting_get --app=$app --key=require_free_url_authentication) - #================================================= # CHECK VERSION #================================================= @@ -41,52 +20,31 @@ upgrade_type=$(ynh_check_app_version_changed) #================================================= ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 -if [ -z "$allow_anonymous" ]; then +if [ -z "${allow_anonymous:-}" ]; then allow_anonymous="false" ynh_app_setting_set --app=$app --key=allow_anonymous --value=$allow_anonymous fi -if [ -z "$allow_anonymous_edits" ]; then +if [ -z "${allow_anonymous_edits:-}" ]; then allow_anonymous_edits="false" ynh_app_setting_set --app=$app --key=allow_anonymous_edits --value=$allow_anonymous_edits fi -if [ -z "$allow_email_registration" ]; then +if [ -z "${allow_email_registration:-}" ]; then allow_email_registration="false" ynh_app_setting_set --app=$app --key=allow_email_registration --value=$allow_email_registration fi -if [ -z "$allow_free_url" ]; then +if [ -z "${allow_free_url:-}" ]; then allow_free_url="false" ynh_app_setting_set --app=$app --key=allow_free_url --value=$allow_free_url fi -if [ -z "$require_free_url_authentication" ]; then +if [ -z "${require_free_url_authentication:-}" ]; then require_free_url_authentication="false" ynh_app_setting_set --app=$app --key=require_free_url_authentication --value=$require_free_url_authentication 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 - -#================================================= -# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP -#================================================= -ynh_script_progression --message="Backing up HedgeDoc before upgrading (may take a while)..." --weight=10 - -# Backup the current version of the app -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 - #================================================= # STANDARD UPGRADE STEPS #================================================= @@ -96,14 +54,6 @@ ynh_script_progression --message="Stopping a systemd service..." --weight=1 ynh_systemd_action --service_name=$app --action=stop --log_path=systemd -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 - -# Create a dedicated user (if not existing) -ynh_system_user_create --username=$app --home_dir=$final_path - #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= @@ -113,12 +63,11 @@ then ynh_script_progression --message="Upgrading source files..." --weight=10 # Download, check integrity, uncompress and patch the source from app.src - ynh_setup_source --dest_dir=$final_path --keep="config.json" + ynh_setup_source --dest_dir=$install_dir --keep="config.json" fi -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" +chmod -R o-rwx "$install_dir" +chown -R $app:www-data "$install_dir" #================================================= # NGINX CONFIGURATION @@ -128,30 +77,21 @@ ynh_script_progression --message="Upgrading NGINX web server configuration..." - # Create a dedicated nginx config ynh_add_nginx_config -#================================================= -# UPGRADE DEPENDENCIES -#================================================= -ynh_script_progression --message="Upgrading dependencies..." --weight=10 - -ynh_exec_warn_less 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" +# Create a dedicated systemd config +ynh_add_systemd_config -#================================================= -# SPECIFIC UPGRADE -#================================================= +#============================================== # INSTALL HEDGEDOC -#================================================= +#============================================== if [ "$upgrade_type" == "UPGRADE_APP" ] then ynh_script_progression --message="Building HedgeDoc... (this will take some time and resources!)" --weight=20 - pushd "$final_path" +pushd "$install_dir" ynh_secure_remove /usr/local/share/.cache/yarn ynh_use_nodejs ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn install --frozen-lockfile @@ -159,14 +99,6 @@ then popd fi -#================================================= -# SETUP SYSTEMD -#================================================= -ynh_script_progression --message="Configuring a systemd service..." --weight=2 - -# Create a dedicated systemd config -ynh_add_systemd_config - #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= @@ -181,13 +113,6 @@ ynh_script_progression --message="Starting a systemd service..." --weight=1 ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="HTTP Server listening" -#================================================= -# RELOAD NGINX -#================================================= -ynh_script_progression --message="Reloading NGINX web server..." --weight=1 - -ynh_systemd_action --service_name=nginx --action=reload - #================================================= # END OF SCRIPT #================================================= diff --git a/tests.toml b/tests.toml new file mode 100644 index 0000000..f0b0313 --- /dev/null +++ b/tests.toml @@ -0,0 +1,9 @@ +test_format = 1.0 + +[default] + + # ------------------------------- + # Commits to test upgrade from + # ------------------------------- + + test_upgrade_from.f601a56a.name = "Upgrade from 1.9.7~ynh2" From 188549c52379ddac868d2ecaa6ac451f215df00e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 18 May 2023 12:26:09 +0200 Subject: [PATCH 090/120] cleaning --- manifest.toml | 2 +- scripts/install | 4 +--- scripts/remove | 22 +++------------------- scripts/restore | 29 +++++------------------------ scripts/upgrade | 20 ++++++-------------- 5 files changed, 16 insertions(+), 61 deletions(-) diff --git a/manifest.toml b/manifest.toml index c8d75f4..9f7159f 100644 --- a/manifest.toml +++ b/manifest.toml @@ -17,7 +17,7 @@ admindoc = "https://docs.hedgedoc.org/" code = "https://github.com/hedgedoc/hedgedoc" [integration] -yunohost = ">= 11.1.16" +yunohost = ">= 11.1.19" architectures = "all" multi_instance = true ldap = true diff --git a/scripts/install b/scripts/install index 795873a..a48110b 100644 --- a/scripts/install +++ b/scripts/install @@ -51,12 +51,10 @@ chown -R $app:www-data "$install_dir" #================================================= # SYSTEM CONFIGURATION #================================================= -ynh_script_progression --message="Adding system configurations related to $app ..." --weight=1 +ynh_script_progression --message="Adding system configurations related to $app..." --weight=1 -# Create a dedicated NGINX config ynh_add_nginx_config -# Create a dedicated systemd config ynh_add_systemd_config yunohost service add $app --description="Collaborative Markdown editor" --log="/var/log/$app/$app.log" diff --git a/scripts/remove b/scripts/remove index dbd13c5..159acb6 100644 --- a/scripts/remove +++ b/scripts/remove @@ -10,10 +10,11 @@ source _common.sh source /usr/share/yunohost/helpers #================================================= -# STANDARD REMOVE +# REMOVE SYSTEM CONFIGURATIONS #================================================= -# REMOVE SERVICE INTEGRATION IN YUNOHOST +# REMOVE SYSTEMD SERVICE #================================================= +ynh_script_progression --message="Removing system configurations related to $app..." --weight=1 # 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 @@ -22,27 +23,10 @@ then yunohost service remove $app fi -#================================================= -# STOP AND REMOVE SERVICE -#================================================= -ynh_script_progression --message="Stopping and removing the systemd service..." --weight=1 - -# Remove the dedicated systemd config ynh_remove_systemd_config -#================================================= -# REMOVE DEPENDENCIES -#================================================= -ynh_script_progression --message="Removing dependencies..." --weight=1 - ynh_remove_nodejs -#================================================= -# REMOVE NGINX CONFIGURATION -#================================================= -ynh_script_progression --message="Removing NGINX web server configuration..." --weight=5 - -# Remove the dedicated NGINX config ynh_remove_nginx_config #================================================= diff --git a/scripts/restore b/scripts/restore index eee9898..f41173e 100644 --- a/scripts/restore +++ b/scripts/restore @@ -9,15 +9,6 @@ source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -#================================================= -# STANDARD RESTORATION STEPS -#================================================= -# RESTORE THE NGINX CONFIGURATION -#================================================= -ynh_script_progression --message="Restoring the NGINX configuration..." --weight=1 - -ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" - #================================================= # RESTORE THE APP MAIN DIR #================================================= @@ -48,32 +39,22 @@ ynh_psql_execute_file_as_root --file="./db.sql" --database=$db_name #================================================= # RESTORE SYSTEMD #================================================= -ynh_script_progression --message="Restoring the systemd configuration..." --weight=5 +ynh_script_progression --message="Restoring system configurations related to $app..." --weight=1 + +ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" 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=2 - yunohost service add $app --description="Collaborative Markdown editor" --log="/var/log/$app/$app.log" #================================================= -# START SYSTEMD SERVICE +# RELOAD NGINX AND PHP-FPM OR THE APP SERVICE #================================================= -ynh_script_progression --message="Starting a systemd service..." --weight=1 +ynh_script_progression --message="Reloading NGINX web server and $app's service..." --weight=1 ynh_systemd_action --service_name=$app --action=start --log_path=systemd --line_match="HTTP Server listening" -#================================================= -# GENERIC FINALIZATION -#================================================= -# RELOAD NGINX -#================================================= -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 fc592db..b67cf3e 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -70,28 +70,27 @@ chmod -R o-rwx "$install_dir" chown -R $app:www-data "$install_dir" #================================================= -# NGINX CONFIGURATION +# REAPPLY SYSTEM CONFIGURATIONS #================================================= -ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=2 +ynh_script_progression --message="Upgrading system configurations related to $app..." --weight=1 -# Create a dedicated nginx config ynh_add_nginx_config -# Install Nodejs ynh_exec_warn_less ynh_install_nodejs --nodejs_version=$nodejs_version -# Create a dedicated systemd config ynh_add_systemd_config +yunohost service add $app --description="Collaborative Markdown editor" --log="/var/log/$app/$app.log" + #============================================== # INSTALL HEDGEDOC #============================================== if [ "$upgrade_type" == "UPGRADE_APP" ] then - ynh_script_progression --message="Building HedgeDoc... (this will take some time and resources!)" --weight=20 + ynh_script_progression --message="Building $app... (this will take some time and resources!)" --weight=20 -pushd "$install_dir" + pushd "$install_dir" ynh_secure_remove /usr/local/share/.cache/yarn ynh_use_nodejs ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn install --frozen-lockfile @@ -99,13 +98,6 @@ pushd "$install_dir" popd fi -#================================================= -# INTEGRATE SERVICE IN YUNOHOST -#================================================= -ynh_script_progression --message="Integrating service in YunoHost..." --weight=2 - -yunohost service add $app --description="Collaborative Markdown editor" --log="/var/log/$app/$app.log" - #================================================= # START SYSTEMD SERVICE #================================================= From d37ff44aef07b0f9aa203619e29a3f84b16ee5a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 4 Jun 2023 21:57:47 +0200 Subject: [PATCH 091/120] 1.9.8 --- manifest.toml | 6 +++--- scripts/_common.sh | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/manifest.toml b/manifest.toml index 9f7159f..14fddb0 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "HedgeDoc" description.en = "Collaborative editor to work on notes written in Markdown" description.fr = "Éditeur collaboratif pour travailler sur des notes en Markdown" -version = "1.9.7~ynh3" +version = "1.9.8~ynh1" maintainers = ["eric_G"] @@ -45,8 +45,8 @@ ram.runtime = "50M" [resources.sources] [resources.sources.main] - url = "https://github.com/hedgedoc/hedgedoc/releases/download/1.9.7/hedgedoc-1.9.7.tar.gz" - sha256 = "c9bd99c65cf45fa1d7808855b46abbfa13b24400254d8da5e81dae2965494bb3" + url = "https://github.com/hedgedoc/hedgedoc/releases/download/1.9.8/hedgedoc-1.9.8.tar.gz" + sha256 = "dca402c47804b7b2ac0a2bcf715b8e570a9e617c87c150f5ff2a2b35b764c349" autoupdate.strategy = "latest_github_tag" [resources.ports] diff --git a/scripts/_common.sh b/scripts/_common.sh index b818f0f..9195d57 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -4,7 +4,7 @@ # COMMON VARIABLES #================================================= -nodejs_version=16 +nodejs_version=18 #================================================= # PERSONAL HELPERS From 53ae2c0c801e985f1bcc7cdf401b134586852315 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sun, 4 Jun 2023 19:57:52 +0000 Subject: [PATCH 092/120] 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 692fe0e..15628a4 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Shipped version:** 1.9.7~ynh3 +**Shipped version:** 1.9.8~ynh1 **Demo:** https://demo.hedgedoc.org/ diff --git a/README_fr.md b/README_fr.md index 569a67c..1ed5ab4 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Version incluse :** 1.9.7~ynh3 +**Version incluse :** 1.9.8~ynh1 **Démo :** https://demo.hedgedoc.org/ From 59a5760c9cc952357b4ae039532a7232a90685bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 7 Jun 2023 11:35:17 +0200 Subject: [PATCH 093/120] Update config_panel.toml --- config_panel.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/config_panel.toml b/config_panel.toml index df31d1a..3c374e5 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -2,6 +2,7 @@ version = "1.0" [main] name = "HedgeDoc configuration" +services = ["__APP__"] [main.config] name = "Configuration Options" From e19fa6783bd88b84449895649b41d9add1c467e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 1 Jul 2023 14:21:21 +0200 Subject: [PATCH 094/120] Build (#63) * Update install * cleaning * Update manifest.toml --- manifest.toml | 4 ++-- scripts/install | 3 +-- scripts/upgrade | 3 +-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/manifest.toml b/manifest.toml index 14fddb0..2c2096a 100644 --- a/manifest.toml +++ b/manifest.toml @@ -17,13 +17,13 @@ admindoc = "https://docs.hedgedoc.org/" code = "https://github.com/hedgedoc/hedgedoc" [integration] -yunohost = ">= 11.1.19" +yunohost = ">= 11.1.21" architectures = "all" multi_instance = true ldap = true sso = true disk = "50M" -ram.build = "2500M" +ram.build = "900M" ram.runtime = "50M" [install] diff --git a/scripts/install b/scripts/install index a48110b..8f60b36 100644 --- a/scripts/install +++ b/scripts/install @@ -68,8 +68,7 @@ ynh_script_progression --message="Building HedgeDoc... (this will take some time pushd "$install_dir" ynh_use_nodejs - ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn install --frozen-lockfile - ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn build + ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn workspaces focus --production popd #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index b67cf3e..986d06a 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -93,8 +93,7 @@ then pushd "$install_dir" ynh_secure_remove /usr/local/share/.cache/yarn ynh_use_nodejs - ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn install --frozen-lockfile - ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn build + ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn workspaces focus --production popd fi From da2f70f2101d5c33cf72c99e15f30f64802b049f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 1 Jul 2023 14:22:27 +0200 Subject: [PATCH 095/120] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 2c2096a..750997c 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "HedgeDoc" description.en = "Collaborative editor to work on notes written in Markdown" description.fr = "Éditeur collaboratif pour travailler sur des notes en Markdown" -version = "1.9.8~ynh1" +version = "1.9.8~ynh2" maintainers = ["eric_G"] From 704bb27cea8f3a982c2cb4e8223ea04d8350ef0c Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sat, 1 Jul 2023 12:22:31 +0000 Subject: [PATCH 096/120] 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 15628a4..49163e3 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Shipped version:** 1.9.8~ynh1 +**Shipped version:** 1.9.8~ynh2 **Demo:** https://demo.hedgedoc.org/ diff --git a/README_fr.md b/README_fr.md index 1ed5ab4..f45dc84 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Version incluse :** 1.9.8~ynh1 +**Version incluse :** 1.9.8~ynh2 **Démo :** https://demo.hedgedoc.org/ From 92fd7449a574101c700dd835a37ea5fad7cdd117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 1 Jul 2023 22:54:07 +0200 Subject: [PATCH 097/120] cleaning --- scripts/install | 2 +- scripts/upgrade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index 8f60b36..9fe7c03 100644 --- a/scripts/install +++ b/scripts/install @@ -64,7 +64,7 @@ yunohost service add $app --description="Collaborative Markdown editor" --log="/ #============================================== # INSTALL HEDGEDOC #============================================== -ynh_script_progression --message="Building HedgeDoc... (this will take some time and resources!)" --weight=20 +ynh_script_progression --message="Building HedgeDoc... (this will take some time and resources!)" --weight=10 pushd "$install_dir" ynh_use_nodejs diff --git a/scripts/upgrade b/scripts/upgrade index 986d06a..0a3c74e 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -88,7 +88,7 @@ yunohost service add $app --description="Collaborative Markdown editor" --log="/ if [ "$upgrade_type" == "UPGRADE_APP" ] then - ynh_script_progression --message="Building $app... (this will take some time and resources!)" --weight=20 + ynh_script_progression --message="Building $app... (this will take some time and resources!)" --weight=10 pushd "$install_dir" ynh_secure_remove /usr/local/share/.cache/yarn From d005400c727ee9a211c618f9b06da5db0911e5f8 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 14 Jul 2023 13:46:30 +0200 Subject: [PATCH 098/120] Update manifest.toml --- manifest.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.toml b/manifest.toml index 750997c..e2d13e3 100644 --- a/manifest.toml +++ b/manifest.toml @@ -35,8 +35,8 @@ ram.runtime = "50M" default = "/hedgedoc" [install.init_main_permission] - help.en = "If enabled, HedgeDoc will be accessible by people who do not have an account. This can be changed later via the webadmin." - help.fr = "Si cette case est cochée, HedgeDoc sera accessible aux personnes n’ayant pas de compte. Vous pourrez changer ceci plus tard via la webadmin." + help.en = "Set to visitors, HedgeDoc will be accessible by people who do not have an account. This can be changed later via the webadmin." + help.fr = "Défini sur visiteurs, HedgeDoc sera accessible aux personnes n’ayant pas de compte. Vous pourrez changer ceci plus tard via la webadmin." type = "group" default = "visitors" From a1ce5f00d96d247abeaa99de21a5727b1dd3ed78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 13 Aug 2023 14:27:21 +0200 Subject: [PATCH 099/120] Update manifest.toml --- manifest.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index e2d13e3..9b6bac3 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "HedgeDoc" description.en = "Collaborative editor to work on notes written in Markdown" description.fr = "Éditeur collaboratif pour travailler sur des notes en Markdown" -version = "1.9.8~ynh2" +version = "1.9.9~ynh1" maintainers = ["eric_G"] @@ -45,8 +45,8 @@ ram.runtime = "50M" [resources.sources] [resources.sources.main] - url = "https://github.com/hedgedoc/hedgedoc/releases/download/1.9.8/hedgedoc-1.9.8.tar.gz" - sha256 = "dca402c47804b7b2ac0a2bcf715b8e570a9e617c87c150f5ff2a2b35b764c349" + url = "https://github.com/hedgedoc/hedgedoc/releases/download/1.9.98/hedgedoc-1.9.9.tar.gz" + sha256 = "1769d30e60458040475a6d74f53952101962c40c390765e19e6ff6f3fe70c008" autoupdate.strategy = "latest_github_tag" [resources.ports] From 64090a6cac874143f60e6197d210484e60774120 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sun, 13 Aug 2023 12:27:26 +0000 Subject: [PATCH 100/120] 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 49163e3..5d5a749 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Shipped version:** 1.9.8~ynh2 +**Shipped version:** 1.9.9~ynh1 **Demo:** https://demo.hedgedoc.org/ diff --git a/README_fr.md b/README_fr.md index f45dc84..f486dd8 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements -**Version incluse :** 1.9.8~ynh2 +**Version incluse :** 1.9.9~ynh1 **Démo :** https://demo.hedgedoc.org/ From 5b9003be1ee91491e0e97589f3de1bff787e3799 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 13 Aug 2023 14:28:01 +0200 Subject: [PATCH 101/120] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 9b6bac3..57f85f2 100644 --- a/manifest.toml +++ b/manifest.toml @@ -17,7 +17,7 @@ admindoc = "https://docs.hedgedoc.org/" code = "https://github.com/hedgedoc/hedgedoc" [integration] -yunohost = ">= 11.1.21" +yunohost = ">= 11.2" architectures = "all" multi_instance = true ldap = true From c4835156d95cf98b1213462f25f928281a89b278 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 13 Aug 2023 14:29:09 +0200 Subject: [PATCH 102/120] Create DESCRIPTION_fr.md --- doc/DESCRIPTION_fr.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 doc/DESCRIPTION_fr.md diff --git a/doc/DESCRIPTION_fr.md b/doc/DESCRIPTION_fr.md new file mode 100644 index 0000000..974588d --- /dev/null +++ b/doc/DESCRIPTION_fr.md @@ -0,0 +1,11 @@ +HedgeDoc (anciennement connu sous le nom de CodiMD) est un éditeur open source, basé sur le Web, auto-hébergé et collaboratif. +Vous pouvez l'utiliser pour collaborer facilement sur des notes, des graphiques et même des présentations en temps réel. Tout ce que vous avez à faire est de partager votre lien de note avec vos collègues et ils sont prêts à partir. + +### Caractéristiques + +- Collaboration en temps réel +- Graphiques et diagrammes +- Révisions +- Mode présentation +- Système d'autorisation facile à utiliser +- Faible configuration système requise From d42784a6e08b457efe957f57ff32e9b5f07fa47e Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sun, 13 Aug 2023 12:29:14 +0000 Subject: [PATCH 103/120] Auto-update README --- README_fr.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README_fr.md b/README_fr.md index f486dd8..ab2d284 100644 --- a/README_fr.md +++ b/README_fr.md @@ -16,18 +16,18 @@ Si vous n’avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) po ## Vue d’ensemble -HedgeDoc (formerly known as CodiMD) is an open-source, web-based, self-hosted, collaborative markdown editor. +HedgeDoc (anciennement connu sous le nom de CodiMD) est un éditeur open source, basé sur le Web, auto-hébergé et collaboratif. +Vous pouvez l'utiliser pour collaborer facilement sur des notes, des graphiques et même des présentations en temps réel. Tout ce que vous avez à faire est de partager votre lien de note avec vos collègues et ils sont prêts à partir. -You can use it to easily collaborate on notes, graphs and even presentations in real-time. All you need to do is to share your note-link to your co-workers and they’re ready to go. +### Caractéristiques -### Features +- Collaboration en temps réel +- Graphiques et diagrammes +- Révisions +- Mode présentation +- Système d'autorisation facile à utiliser +- Faible configuration système requise -- Real-time collaboration -- Graphs & diagrams -- Revisions -- Presentation mode -- Easy to use permission system -- Low system requirements **Version incluse :** 1.9.9~ynh1 From 2438378beb26bbbd4e3e0057745415682626a16c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 13 Aug 2023 14:29:57 +0200 Subject: [PATCH 104/120] Update DESCRIPTION.md --- doc/DESCRIPTION.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md index 98d04c5..f90c88a 100644 --- a/doc/DESCRIPTION.md +++ b/doc/DESCRIPTION.md @@ -1,5 +1,4 @@ HedgeDoc (formerly known as CodiMD) is an open-source, web-based, self-hosted, collaborative markdown editor. - You can use it to easily collaborate on notes, graphs and even presentations in real-time. All you need to do is to share your note-link to your co-workers and they’re ready to go. ### Features @@ -9,4 +8,4 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Revisions - Presentation mode - Easy to use permission system -- Low system requirements \ No newline at end of file +- Low system requirements From 5ca36929e9b5b9a7673ebbe1fac607f52474a27a Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sun, 13 Aug 2023 12:30:07 +0000 Subject: [PATCH 105/120] Auto-update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5d5a749..26883f4 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,6 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in ## Overview HedgeDoc (formerly known as CodiMD) is an open-source, web-based, self-hosted, collaborative markdown editor. - You can use it to easily collaborate on notes, graphs and even presentations in real-time. All you need to do is to share your note-link to your co-workers and they’re ready to go. ### Features @@ -29,6 +28,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Easy to use permission system - Low system requirements + **Shipped version:** 1.9.9~ynh1 **Demo:** https://demo.hedgedoc.org/ From d8cd1adc7438d9d2e91c79640193f2998944e77d Mon Sep 17 00:00:00 2001 From: lapineige Date: Sun, 13 Aug 2023 20:38:48 +0200 Subject: [PATCH 106/120] fix config_panel (#68) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Upgrade to v1.9.9 * Auto-update README * Update manifest.toml * Auto-update README * Update manifest.toml * fix config_panel --------- Co-authored-by: yunohost-bot Co-authored-by: Éric Gaspar <46165813+ericgaspar@users.noreply.github.com> --- README.md | 2 -- config_panel.toml | 10 +++++----- manifest.toml | 2 +- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 26883f4..4a893db 100644 --- a/README.md +++ b/README.md @@ -29,8 +29,6 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Low system requirements -**Shipped version:** 1.9.9~ynh1 - **Demo:** https://demo.hedgedoc.org/ ## Screenshots diff --git a/config_panel.toml b/config_panel.toml index 3c374e5..535c889 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -13,7 +13,7 @@ services = ["__APP__"] yes = "true" no = "false" help = "Set to allow anonymous usage (default is true)." - bind = "allow_anonymous:__INSTALL_DIR__/config.json" + bind = "allowAnonymous:__INSTALL_DIR__/config.json" [main.config.allow_anonymous_edits] ask = "Allow anonymous edits" @@ -21,7 +21,7 @@ services = ["__APP__"] yes = "true" no = "false" help = "Allow users to select freely permission, allowing guests to edit existing notes." - bind = "allow_anonymous_edits:__INSTALL_DIR__/config.json" + bind = "allowAnonymousEdits:__INSTALL_DIR__/config.json" [main.config.allow_email_registration] @@ -30,7 +30,7 @@ services = ["__APP__"] yes = "true" no = "false" help = "Set to allow registration of new accounts using an email address. If set to false, you can still create accounts using the command line." - bind = "allow_email_registration:__INSTALL_DIR__/config.json" + bind = "allowEmailRegister:__INSTALL_DIR__/config.json" [main.config.allow_free_url] ask = "Allow new note creation" @@ -38,7 +38,7 @@ services = ["__APP__"] yes = "true" no = "false" help = "Set to allow new note creation by accessing a nonexistent note URL. This is the behavior familiar from Etherpad." - bind = "allow_free_url:__INSTALL_DIR__/config.json" + bind = "allowFreeURL:__INSTALL_DIR__/config.json" [main.config.require_free_url_authentication] ask = "Require FreeURL authentication" @@ -46,7 +46,7 @@ services = ["__APP__"] yes = "true" no = "false" help = "Set to require authentication for FreeURL mode style note creation." - bind = "require_free_url_authentication:__INSTALL_DIR__/config.json" + bind = "requireFreeURLAuthentication:__INSTALL_DIR__/config.json" diff --git a/manifest.toml b/manifest.toml index 57f85f2..bc6630c 100644 --- a/manifest.toml +++ b/manifest.toml @@ -45,7 +45,7 @@ ram.runtime = "50M" [resources.sources] [resources.sources.main] - url = "https://github.com/hedgedoc/hedgedoc/releases/download/1.9.98/hedgedoc-1.9.9.tar.gz" + url = "https://github.com/hedgedoc/hedgedoc/releases/download/1.9.9/hedgedoc-1.9.9.tar.gz" sha256 = "1769d30e60458040475a6d74f53952101962c40c390765e19e6ff6f3fe70c008" autoupdate.strategy = "latest_github_tag" From 2032e66da879d1995b6244e9926d649b7244b4e4 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sun, 13 Aug 2023 18:38:51 +0000 Subject: [PATCH 107/120] Auto-update README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4a893db..26883f4 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,8 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Low system requirements +**Shipped version:** 1.9.9~ynh1 + **Demo:** https://demo.hedgedoc.org/ ## Screenshots From 610e7bbd8d32e9b027062b9cee3e940bd9e127b8 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sun, 8 Oct 2023 20:22:09 +0000 Subject: [PATCH 108/120] Auto-update README --- README.md | 1 - README_fr.md | 1 - 2 files changed, 2 deletions(-) diff --git a/README.md b/README.md index 26883f4..3f93b78 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,6 @@ You can use it to easily collaborate on notes, graphs and even presentations in * Official app website: * Official admin documentation: * Upstream app code repository: -* YunoHost documentation for this app: * Report a bug: ## Developer info diff --git a/README_fr.md b/README_fr.md index ab2d284..e3eb506 100644 --- a/README_fr.md +++ b/README_fr.md @@ -42,7 +42,6 @@ Vous pouvez l'utiliser pour collaborer facilement sur des notes, des graphiques * Site officiel de l’app : * 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 From 7770e966eb54a18710fc0296d3ea19edeb50000f Mon Sep 17 00:00:00 2001 From: orhtej2 <2871798+orhtej2@users.noreply.github.com> Date: Tue, 17 Oct 2023 14:42:40 +0200 Subject: [PATCH 109/120] Cleanup yarn cache properly. (#70) --- scripts/install | 1 + scripts/upgrade | 1 + 2 files changed, 2 insertions(+) diff --git a/scripts/install b/scripts/install index 9fe7c03..24b7bee 100644 --- a/scripts/install +++ b/scripts/install @@ -69,6 +69,7 @@ ynh_script_progression --message="Building HedgeDoc... (this will take some time pushd "$install_dir" ynh_use_nodejs ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn workspaces focus --production + ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn cache clean popd #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 0a3c74e..ae86ab0 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -94,6 +94,7 @@ then ynh_secure_remove /usr/local/share/.cache/yarn ynh_use_nodejs ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn workspaces focus --production + ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn cache clean popd fi From ca16122df85096879ffc9106bd3090413c1d263c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 17 Oct 2023 17:29:14 +0200 Subject: [PATCH 110/120] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index bc6630c..5a073f3 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "HedgeDoc" description.en = "Collaborative editor to work on notes written in Markdown" description.fr = "Éditeur collaboratif pour travailler sur des notes en Markdown" -version = "1.9.9~ynh1" +version = "1.9.9~ynh2" maintainers = ["eric_G"] From ee81654c0cf7fd632b75b2667e26a1cdda9c2f1f Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 17 Oct 2023 15:29:18 +0000 Subject: [PATCH 111/120] 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 3f93b78..5a9482b 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Low system requirements -**Shipped version:** 1.9.9~ynh1 +**Shipped version:** 1.9.9~ynh2 **Demo:** https://demo.hedgedoc.org/ diff --git a/README_fr.md b/README_fr.md index e3eb506..0504ef4 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ Vous pouvez l'utiliser pour collaborer facilement sur des notes, des graphiques - Faible configuration système requise -**Version incluse :** 1.9.9~ynh1 +**Version incluse :** 1.9.9~ynh2 **Démo :** https://demo.hedgedoc.org/ From eb2f062d8b781db93bd81f976b8bb31c5511ff55 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 14 Nov 2023 21:04:29 +0000 Subject: [PATCH 112/120] Auto-update README --- README.md | 1 + README_fr.md | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index 5a9482b..9cf5b0f 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in * Official app website: * Official admin documentation: * Upstream app code repository: +* YunoHost Store: * Report a bug: ## Developer info diff --git a/README_fr.md b/README_fr.md index 0504ef4..88c8c1b 100644 --- a/README_fr.md +++ b/README_fr.md @@ -42,6 +42,7 @@ Vous pouvez l'utiliser pour collaborer facilement sur des notes, des graphiques * Site officiel de l’app : * Documentation officielle de l’admin : * Dépôt de code officiel de l’app : +* YunoHost Store: * Signaler un bug : ## Informations pour les développeurs From eb72179fe578e4a62d1d8513801f4f264365b764 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 15 Nov 2023 18:54:52 +0100 Subject: [PATCH 113/120] fix --- scripts/install | 2 +- scripts/upgrade | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 24b7bee..8a6c666 100644 --- a/scripts/install +++ b/scripts/install @@ -78,7 +78,7 @@ popd ynh_script_progression --message="Modifying a config file..." --weight=1 url_path=${path#/} -ynh_add_config --template="../conf/config.json.example" --destination="$install_dir/config.json" +ynh_add_config --template="config.json.example" --destination="$install_dir/config.json" chmod 600 "$install_dir/config.json" chown $app:$app "$install_dir/config.json" diff --git a/scripts/upgrade b/scripts/upgrade index ae86ab0..96ace07 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -98,6 +98,17 @@ then popd fi +#================================================= +# MODIFY A CONFIG FILE +#================================================= +ynh_script_progression --message="Modifying a config file..." --weight=1 + +url_path=${path#/} +ynh_add_config --template="config.json.example" --destination="$install_dir/config.json" + +chmod 600 "$install_dir/config.json" +chown $app:$app "$install_dir/config.json" + #================================================= # START SYSTEMD SERVICE #================================================= From 2f2c79b893497b942ba5b4408e3db62e4fc73bd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 15 Nov 2023 18:56:53 +0100 Subject: [PATCH 114/120] Update manifest.toml --- manifest.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/manifest.toml b/manifest.toml index 5a073f3..cb064c6 100644 --- a/manifest.toml +++ b/manifest.toml @@ -20,8 +20,11 @@ code = "https://github.com/hedgedoc/hedgedoc" yunohost = ">= 11.2" architectures = "all" multi_instance = true + ldap = true + sso = true + disk = "50M" ram.build = "900M" ram.runtime = "50M" From 31b6d33ced4b8ca218f29d4cdf16a36d13fd1224 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 14 Feb 2024 11:02:30 +0100 Subject: [PATCH 115/120] remove maintenance --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index cb064c6..472b956 100644 --- a/manifest.toml +++ b/manifest.toml @@ -7,7 +7,7 @@ description.fr = "Éditeur collaboratif pour travailler sur des notes en Markdow version = "1.9.9~ynh2" -maintainers = ["eric_G"] +maintainers = [] [upstream] license = "AGPL-3.0-only" From 2278656b3c3e0964040c9c8c6bef29aed40d6d8b Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 28 May 2024 12:30:50 +0000 Subject: [PATCH 116/120] Auto-update READMEs --- ALL_README.md | 4 +++- README.md | 2 +- README_es.md | 60 +++++++++++++++++++++++++++++++++++++++++++++++ README_eu.md | 60 +++++++++++++++++++++++++++++++++++++++++++++++ README_zh_Hans.md | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 184 insertions(+), 2 deletions(-) create mode 100644 README_es.md create mode 100644 README_eu.md create mode 100644 README_zh_Hans.md diff --git a/ALL_README.md b/ALL_README.md index 3d6c579..152f2e7 100644 --- a/ALL_README.md +++ b/ALL_README.md @@ -1,6 +1,8 @@ # All available README files by language - [Read the README in English](README.md) +- [Lea el README en español](README_es.md) +- [Irakurri README euskaraz](README_eu.md) - [Lire le README en français](README_fr.md) - [Le o README en galego](README_gl.md) -- [Leggi il “README” in italiano](README_it.md) +- [阅读中文(简体)的 README](README_zh_Hans.md) diff --git a/README.md b/README.md index 892104b..50c21b7 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ It shall NOT be edited by hand. [![Install HedgeDoc with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=hedgedoc) -*[Read this README is other languages.](./ALL_README.md)* +*[Read this README in other languages.](./ALL_README.md)* > *This package allows you to install HedgeDoc 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.* diff --git a/README_es.md b/README_es.md new file mode 100644 index 0000000..e0f10df --- /dev/null +++ b/README_es.md @@ -0,0 +1,60 @@ + + +# HedgeDoc para Yunohost + +[![Nivel de integración](https://dash.yunohost.org/integration/hedgedoc.svg)](https://dash.yunohost.org/appci/app/hedgedoc) ![Estado funcional](https://ci-apps.yunohost.org/ci/badges/hedgedoc.status.svg) ![Estado En Mantención](https://ci-apps.yunohost.org/ci/badges/hedgedoc.maintain.svg) + +[![Instalar HedgeDoc con Yunhost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=hedgedoc) + +*[Leer este README en otros idiomas.](./ALL_README.md)* + +> *Este paquete le permite instalarHedgeDoc rapidamente y simplement en un servidor YunoHost.* +> *Si no tiene YunoHost, visita [the guide](https://yunohost.org/install) para aprender como instalarla.* + +## Descripción general + +HedgeDoc (formerly known as CodiMD) is an open-source, web-based, self-hosted, collaborative markdown editor. +You can use it to easily collaborate on notes, graphs and even presentations in real-time. All you need to do is to share your note-link to your co-workers and they’re ready to go. + +### Features + +- Real-time collaboration +- Graphs & diagrams +- Revisions +- Presentation mode +- Easy to use permission system +- Low system requirements + + +**Versión actual:** 1.9.9~ynh2 + +**Demo:** + +## Capturas + +![Captura de HedgeDoc](./doc/screenshots/screenshot.png) + +## Documentaciones y recursos + +- Sitio web oficial: +- Documentación administrador oficial: +- Repositorio del código fuente oficial de la aplicación : +- Catálogo YunoHost: +- Reportar un error: + +## Información para desarrolladores + +Por favor enviar sus correcciones a la [`branch testing`](https://github.com/YunoHost-Apps/hedgedoc_ynh/tree/testing + +Para probar la rama `testing`, sigue asÍ: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/hedgedoc_ynh/tree/testing --debug +o +sudo yunohost app upgrade hedgedoc -u https://github.com/YunoHost-Apps/hedgedoc_ynh/tree/testing --debug +``` + +**Mas informaciones sobre el empaquetado de aplicaciones:** diff --git a/README_eu.md b/README_eu.md new file mode 100644 index 0000000..c916f9c --- /dev/null +++ b/README_eu.md @@ -0,0 +1,60 @@ + + +# HedgeDoc YunoHost-erako + +[![Integrazio maila](https://dash.yunohost.org/integration/hedgedoc.svg)](https://dash.yunohost.org/appci/app/hedgedoc) ![Funtzionamendu egoera](https://ci-apps.yunohost.org/ci/badges/hedgedoc.status.svg) ![Mantentze egoera](https://ci-apps.yunohost.org/ci/badges/hedgedoc.maintain.svg) + +[![Instalatu HedgeDoc YunoHost-ekin](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=hedgedoc) + +*[Irakurri README hau beste hizkuntzatan.](./ALL_README.md)* + +> *Pakete honek HedgeDoc YunoHost zerbitzari batean azkar eta zailtasunik gabe instalatzea ahalbidetzen dizu.* +> *YunoHost ez baduzu, kontsultatu [gida](https://yunohost.org/install) nola instalatu ikasteko.* + +## Aurreikuspena + +HedgeDoc (formerly known as CodiMD) is an open-source, web-based, self-hosted, collaborative markdown editor. +You can use it to easily collaborate on notes, graphs and even presentations in real-time. All you need to do is to share your note-link to your co-workers and they’re ready to go. + +### Features + +- Real-time collaboration +- Graphs & diagrams +- Revisions +- Presentation mode +- Easy to use permission system +- Low system requirements + + +**Paketatutako bertsioa:** 1.9.9~ynh2 + +**Demoa:** + +## Pantaila-argazkiak + +![HedgeDoc(r)en pantaila-argazkia](./doc/screenshots/screenshot.png) + +## Dokumentazioa eta baliabideak + +- Aplikazioaren webgune ofiziala: +- Administratzaileen dokumentazio ofiziala: +- Jatorrizko aplikazioaren kode-gordailua: +- YunoHost Denda: +- Eman errore baten berri: + +## Garatzaileentzako informazioa + +Bidali `pull request`a [`testing` abarrera](https://github.com/YunoHost-Apps/hedgedoc_ynh/tree/testing). + +`testing` abarra probatzeko, ondorengoa egin: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/hedgedoc_ynh/tree/testing --debug +edo +sudo yunohost app upgrade hedgedoc -u https://github.com/YunoHost-Apps/hedgedoc_ynh/tree/testing --debug +``` + +**Informazio gehiago aplikazioaren paketatzeari buruz:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md new file mode 100644 index 0000000..0d539bd --- /dev/null +++ b/README_zh_Hans.md @@ -0,0 +1,60 @@ + + +# YunoHost 上的 HedgeDoc + +[![集成程度](https://dash.yunohost.org/integration/hedgedoc.svg)](https://dash.yunohost.org/appci/app/hedgedoc) ![工作状态](https://ci-apps.yunohost.org/ci/badges/hedgedoc.status.svg) ![维护状态](https://ci-apps.yunohost.org/ci/badges/hedgedoc.maintain.svg) + +[![使用 YunoHost 安装 HedgeDoc](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=hedgedoc) + +*[阅读此 README 的其它语言版本。](./ALL_README.md)* + +> *通过此软件包,您可以在 YunoHost 服务器上快速、简单地安装 HedgeDoc。* +> *如果您还没有 YunoHost,请参阅[指南](https://yunohost.org/install)了解如何安装它。* + +## 概况 + +HedgeDoc (formerly known as CodiMD) is an open-source, web-based, self-hosted, collaborative markdown editor. +You can use it to easily collaborate on notes, graphs and even presentations in real-time. All you need to do is to share your note-link to your co-workers and they’re ready to go. + +### Features + +- Real-time collaboration +- Graphs & diagrams +- Revisions +- Presentation mode +- Easy to use permission system +- Low system requirements + + +**分发版本:** 1.9.9~ynh2 + +**演示:** + +## 截图 + +![HedgeDoc 的截图](./doc/screenshots/screenshot.png) + +## 文档与资源 + +- 官方应用网站: +- 官方管理文档: +- 上游应用代码库: +- YunoHost 商店: +- 报告 bug: + +## 开发者信息 + +请向 [`testing` 分支](https://github.com/YunoHost-Apps/hedgedoc_ynh/tree/testing) 发送拉取请求。 + +如要尝试 `testing` 分支,请这样操作: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/hedgedoc_ynh/tree/testing --debug +或 +sudo yunohost app upgrade hedgedoc -u https://github.com/YunoHost-Apps/hedgedoc_ynh/tree/testing --debug +``` + +**有关应用打包的更多信息:** From 98694a73c9c286399623e3c73c3dfd019639baa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 28 May 2024 14:32:08 +0200 Subject: [PATCH 117/120] cleaning --- scripts/backup | 8 +------- scripts/install | 2 +- scripts/upgrade | 34 ++++++++++------------------------ 3 files changed, 12 insertions(+), 32 deletions(-) diff --git a/scripts/backup b/scripts/backup index 5472aff..c711f03 100644 --- a/scripts/backup +++ b/scripts/backup @@ -21,17 +21,11 @@ ynh_print_info --message="Declaring files to be backed up..." ynh_backup --src_path="$install_dir" #================================================= -# BACKUP THE NGINX CONFIGURATION +# SYSTEM CONFIGURATION #================================================= ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" -#================================================= -# SPECIFIC BACKUP -#================================================= -# BACKUP SYSTEMD -#================================================= - ynh_backup --src_path="/etc/systemd/system/$app.service" #================================================= diff --git a/scripts/install b/scripts/install index 8a6c666..934f387 100644 --- a/scripts/install +++ b/scripts/install @@ -64,7 +64,7 @@ yunohost service add $app --description="Collaborative Markdown editor" --log="/ #============================================== # INSTALL HEDGEDOC #============================================== -ynh_script_progression --message="Building HedgeDoc... (this will take some time and resources!)" --weight=10 +ynh_script_progression --message="Building $app... (this will take some time and resources!)" --weight=10 pushd "$install_dir" ynh_use_nodejs diff --git a/scripts/upgrade b/scripts/upgrade index 96ace07..275c1d4 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -9,12 +9,6 @@ source _common.sh source /usr/share/yunohost/helpers -#================================================= -# CHECK VERSION -#================================================= - -upgrade_type=$(ynh_check_app_version_changed) - #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= @@ -57,14 +51,10 @@ ynh_systemd_action --service_name=$app --action=stop --log_path=systemd #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= +ynh_script_progression --message="Upgrading source files..." --weight=10 -if [ "$upgrade_type" == "UPGRADE_APP" ] -then - ynh_script_progression --message="Upgrading source files..." --weight=10 - - # Download, check integrity, uncompress and patch the source from app.src - ynh_setup_source --dest_dir=$install_dir --keep="config.json" -fi +# Download, check integrity, uncompress and patch the source from app.src +ynh_setup_source --dest_dir=$install_dir --keep="config.json" chmod -R o-rwx "$install_dir" chown -R $app:www-data "$install_dir" @@ -85,18 +75,14 @@ yunohost service add $app --description="Collaborative Markdown editor" --log="/ #============================================== # INSTALL HEDGEDOC #============================================== +ynh_script_progression --message="Building $app... (this will take some time and resources!)" --weight=10 -if [ "$upgrade_type" == "UPGRADE_APP" ] -then - ynh_script_progression --message="Building $app... (this will take some time and resources!)" --weight=10 - - pushd "$install_dir" - ynh_secure_remove /usr/local/share/.cache/yarn - ynh_use_nodejs - ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn workspaces focus --production - ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn cache clean - popd -fi +pushd "$install_dir" + ynh_secure_remove /usr/local/share/.cache/yarn + ynh_use_nodejs + ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn workspaces focus --production + ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH yarn cache clean +popd #================================================= # MODIFY A CONFIG FILE From 072106d15391ef48d3a5fe3f21dd5b189387ebc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 28 May 2024 14:32:58 +0200 Subject: [PATCH 118/120] 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 9195d57..44277c5 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -4,7 +4,7 @@ # COMMON VARIABLES #================================================= -nodejs_version=18 +nodejs_version=20 #================================================= # PERSONAL HELPERS From 6c64a71833a652552a6a8dba633a4c8c35be5132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 28 May 2024 15:22:01 +0200 Subject: [PATCH 119/120] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 472b956..f1a94c0 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "HedgeDoc" description.en = "Collaborative editor to work on notes written in Markdown" description.fr = "Éditeur collaboratif pour travailler sur des notes en Markdown" -version = "1.9.9~ynh2" +version = "1.9.9~ynh3" maintainers = [] From 1785daac624e362ad3a57375a619186b1e2e46a3 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 28 May 2024 13:22:08 +0000 Subject: [PATCH 120/120] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_zh_Hans.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 50c21b7..7b28129 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Low system requirements -**Shipped version:** 1.9.9~ynh2 +**Shipped version:** 1.9.9~ynh3 **Demo:** diff --git a/README_es.md b/README_es.md index e0f10df..5a3d137 100644 --- a/README_es.md +++ b/README_es.md @@ -29,7 +29,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Low system requirements -**Versión actual:** 1.9.9~ynh2 +**Versión actual:** 1.9.9~ynh3 **Demo:** diff --git a/README_eu.md b/README_eu.md index c916f9c..589c529 100644 --- a/README_eu.md +++ b/README_eu.md @@ -29,7 +29,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Low system requirements -**Paketatutako bertsioa:** 1.9.9~ynh2 +**Paketatutako bertsioa:** 1.9.9~ynh3 **Demoa:** diff --git a/README_fr.md b/README_fr.md index d657dcd..4dea3b7 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ Vous pouvez l'utiliser pour collaborer facilement sur des notes, des graphiques - Faible configuration système requise -**Version incluse :** 1.9.9~ynh2 +**Version incluse :** 1.9.9~ynh3 **Démo :** diff --git a/README_gl.md b/README_gl.md index a5cd92a..0f27824 100644 --- a/README_gl.md +++ b/README_gl.md @@ -29,7 +29,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Low system requirements -**Versión proporcionada:** 1.9.9~ynh2 +**Versión proporcionada:** 1.9.9~ynh3 **Demo:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 0d539bd..8b2602e 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -29,7 +29,7 @@ You can use it to easily collaborate on notes, graphs and even presentations in - Low system requirements -**分发版本:** 1.9.9~ynh2 +**分发版本:** 1.9.9~ynh3 **演示:**