From 93ce78e40b8c8a61b1518b30fc7d2d614974a262 Mon Sep 17 00:00:00 2001 From: Jules Bertholet Date: Tue, 25 May 2021 09:18:47 -0400 Subject: [PATCH 01/13] Update to 1627ed9d3dddb2a6d0fb85b598d7736f19a06b47 --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 6 +++--- manifest.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index ad8fd93..6f3fe1a 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ This is the webservice powering the https://gpodder.net website. It can be used to sync podcast subscriptions with [supported clients](https://gpoddernet.readthedocs.io/en/latest/user/clients.html). -**Shipped version:** 2021-05-19 +**Shipped version:** 2021-05-24 ## Screenshots diff --git a/README_fr.md b/README_fr.md index 7801cf0..341e5d6 100644 --- a/README_fr.md +++ b/README_fr.md @@ -12,7 +12,7 @@ Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install Ceci est le service derrière https://gpodder.net. Il peut servir pour synchronizer vos flux balado entre [clients compatibles](https://gpoddernet.readthedocs.io/en/latest/user/clients.html). -**Version incluse :** 2021-05-19 +**Version incluse :** 2021-05-24 ## Captures d'écran diff --git a/conf/app.src b/conf/app.src index 3a1470a..1e6aef6 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,7 +1,7 @@ -SOURCE_URL=https://github.com/gpodder/mygpo/tarball/b6a68527370e0c62bfa08d022611a3ad8a7331a -SOURCE_SUM=71277581a3c7fa8d1cad32347b90b8cd9d82b9bb27573adb533ea59ec75f1ddc +SOURCE_URL=https://github.com/gpodder/mygpo/tarball/1627ed9d3dddb2a6d0fb85b598d7736f19a06b47 +SOURCE_SUM=a7e064e05781fa5c38c526e91662e7b23915905a873065ab5c82dd16640152b0 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true -SOURCE_FILENAME=b6a68527370e0c62bfa08d022611a3ad8a7331a +SOURCE_FILENAME=1627ed9d3dddb2a6d0fb85b598d7736f19a06b47 SOURCE_EXTRACT=true diff --git a/manifest.json b/manifest.json index 75e3dad..76bb278 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Manage podcast subscriptions, and sync them between apps and devices", "fr": "Gérez vos sousciptions balado, et sychronisez-lez entre vos applis et appareils" }, - "version": "2.11.20210519~ynh1", + "version": "2.11.20210524~ynh1", "url": "https://github.com/gpodder/mygpo", "license": "AGPL-3.0-only", "maintainer": { From 045876aaf3cd2e6994b23d657d12df11d64ef34b Mon Sep 17 00:00:00 2001 From: Jules Bertholet Date: Fri, 18 Jun 2021 07:42:57 -0400 Subject: [PATCH 02/13] Update to 2021-06-16 --- README.md | 2 +- README_fr.md | 8 ++++---- conf/app.src | 6 +++--- manifest.json | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6f3fe1a..34cbec7 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ This is the webservice powering the https://gpodder.net website. It can be used to sync podcast subscriptions with [supported clients](https://gpoddernet.readthedocs.io/en/latest/user/clients.html). -**Shipped version:** 2021-05-24 +**Shipped version:** 2021-06-16 ## Screenshots diff --git a/README_fr.md b/README_fr.md index 341e5d6..2dce1e5 100644 --- a/README_fr.md +++ b/README_fr.md @@ -3,7 +3,7 @@ [![Niveau d'intégration](https://dash.yunohost.org/integration/mygpo.svg)](https://dash.yunohost.org/appci/app/mygpo) ![](https://ci-apps.yunohost.org/ci/badges/mygpo.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/mygpo.maintain.svg) [![Installer mygpo avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=mygpo) -*[Read this readme in english.](./README.md)* +*[Read this readme in english.](./README.md)* > *Ce package vous permet d'installer mygpo 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.* @@ -12,7 +12,7 @@ Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install Ceci est le service derrière https://gpodder.net. Il peut servir pour synchronizer vos flux balado entre [clients compatibles](https://gpoddernet.readthedocs.io/en/latest/user/clients.html). -**Version incluse :** 2021-05-24 +**Version incluse :** 2021-06-16 ## Captures d'écran @@ -24,11 +24,11 @@ Ceci est le service derrière https://gpodder.net. Il peut servir pour synchroni ## Configuration -Modifiez les fichiers sous `/opt/yunohost/APPDIR/envs/prod` pour configurer les variables d'environment. Il y a une interface admin `a `votre-domaine.tld/admin` (seulement accessible par l'adminsitrateur). +Modifiez les fichiers sous `/opt/yunohost/APPDIR/envs/prod` pour configurer les variables d'environment. Il y a une interface admin a `votre-domaine.tld/admin` (seulement accessible par l'administrateur). ## Documentation - * Documentation officielle : https://gpoddernet.readthedocs.io/ +* Documentation officielle : https://gpoddernet.readthedocs.io/ #### Support multi-utilisateur diff --git a/conf/app.src b/conf/app.src index 1e6aef6..ba45dcb 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,7 +1,7 @@ -SOURCE_URL=https://github.com/gpodder/mygpo/tarball/1627ed9d3dddb2a6d0fb85b598d7736f19a06b47 -SOURCE_SUM=a7e064e05781fa5c38c526e91662e7b23915905a873065ab5c82dd16640152b0 +SOURCE_URL=https://github.com/gpodder/mygpo/tarball/9056b144c10af95459b577cff8cba60495eb978d +SOURCE_SUM=05ffe2f33b1a6ba2b7f60745d85fd5983d94c9ad194d5f349cbcb0462c3968a6 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true -SOURCE_FILENAME=1627ed9d3dddb2a6d0fb85b598d7736f19a06b47 +SOURCE_FILENAME=9056b144c10af95459b577cff8cba60495eb978d SOURCE_EXTRACT=true diff --git a/manifest.json b/manifest.json index 76bb278..b57b488 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Manage podcast subscriptions, and sync them between apps and devices", "fr": "Gérez vos sousciptions balado, et sychronisez-lez entre vos applis et appareils" }, - "version": "2.11.20210524~ynh1", + "version": "2.11.20210616~ynh1", "url": "https://github.com/gpodder/mygpo", "license": "AGPL-3.0-only", "maintainer": { From 2fdde73a99372fc4c535d6e08d9a0346f4be024e Mon Sep 17 00:00:00 2001 From: Jules Bertholet Date: Thu, 16 Sep 2021 20:39:00 -0400 Subject: [PATCH 03/13] Update to 2021-09-13 --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 6 +++--- manifest.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 34cbec7..c1c0151 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ This is the webservice powering the https://gpodder.net website. It can be used to sync podcast subscriptions with [supported clients](https://gpoddernet.readthedocs.io/en/latest/user/clients.html). -**Shipped version:** 2021-06-16 +**Shipped version:** 2021-09-13 ## Screenshots diff --git a/README_fr.md b/README_fr.md index 2dce1e5..dc4b54b 100644 --- a/README_fr.md +++ b/README_fr.md @@ -12,7 +12,7 @@ Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install Ceci est le service derrière https://gpodder.net. Il peut servir pour synchronizer vos flux balado entre [clients compatibles](https://gpoddernet.readthedocs.io/en/latest/user/clients.html). -**Version incluse :** 2021-06-16 +**Version incluse :** 2021-09-13 ## Captures d'écran diff --git a/conf/app.src b/conf/app.src index ba45dcb..28528b3 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,7 +1,7 @@ -SOURCE_URL=https://github.com/gpodder/mygpo/tarball/9056b144c10af95459b577cff8cba60495eb978d -SOURCE_SUM=05ffe2f33b1a6ba2b7f60745d85fd5983d94c9ad194d5f349cbcb0462c3968a6 +SOURCE_URL=https://github.com/gpodder/mygpo/tarball/dc7dd8992a6b84cbc0d2d9a2d34d68d5fdd9e016 +SOURCE_SUM=5913aa6f0eb3eeea0830218a6cb6f90a4c2b4267062cd66dc7b184f55a386b01 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true -SOURCE_FILENAME=9056b144c10af95459b577cff8cba60495eb978d +SOURCE_FILENAME=dc7dd8992a6b84cbc0d2d9a2d34d68d5fdd9e016 SOURCE_EXTRACT=true diff --git a/manifest.json b/manifest.json index b57b488..c40508c 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Manage podcast subscriptions, and sync them between apps and devices", "fr": "Gérez vos sousciptions balado, et sychronisez-lez entre vos applis et appareils" }, - "version": "2.11.20210616~ynh1", + "version": "2.11.20210913~ynh1", "url": "https://github.com/gpodder/mygpo", "license": "AGPL-3.0-only", "maintainer": { From c2c70ec509bd4938c9032a645d400ddc034e85cd Mon Sep 17 00:00:00 2001 From: Jules Bertholet Date: Sun, 17 Oct 2021 23:44:50 -0400 Subject: [PATCH 04/13] Update to version 2021-10-11 --- .vscode/settings.json | 8 ++++++++ README.md | 2 +- README_fr.md | 2 +- conf/app.src | 6 +++--- manifest.json | 2 +- sources/patches/app-00-gunicorn.conf.py.patch | 13 +++++++++---- sources/patches/app-01-settings.py.patch | 4 ++-- 7 files changed, 25 insertions(+), 12 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..91e90e1 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "markdownlint.config": { + "MD028": false, + "MD025": { + "front_matter_title": "" + } + } +} \ No newline at end of file diff --git a/README.md b/README.md index c1c0151..b31b82e 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ This is the webservice powering the https://gpodder.net website. It can be used to sync podcast subscriptions with [supported clients](https://gpoddernet.readthedocs.io/en/latest/user/clients.html). -**Shipped version:** 2021-09-13 +**Shipped version:** 2021-10-11 ## Screenshots diff --git a/README_fr.md b/README_fr.md index dc4b54b..c86aba6 100644 --- a/README_fr.md +++ b/README_fr.md @@ -12,7 +12,7 @@ Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install Ceci est le service derrière https://gpodder.net. Il peut servir pour synchronizer vos flux balado entre [clients compatibles](https://gpoddernet.readthedocs.io/en/latest/user/clients.html). -**Version incluse :** 2021-09-13 +**Version incluse :** 2021-10-11 ## Captures d'écran diff --git a/conf/app.src b/conf/app.src index 28528b3..3dade32 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,7 +1,7 @@ -SOURCE_URL=https://github.com/gpodder/mygpo/tarball/dc7dd8992a6b84cbc0d2d9a2d34d68d5fdd9e016 -SOURCE_SUM=5913aa6f0eb3eeea0830218a6cb6f90a4c2b4267062cd66dc7b184f55a386b01 +SOURCE_URL=https://github.com/gpodder/mygpo/tarball/bc050144d7071f30dd42b11f442e0a8034346acc +SOURCE_SUM=9fb970ac49f5b06c83ed52596c962d875d0be8ab1f27f89ffc402139d931e48e SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true -SOURCE_FILENAME=dc7dd8992a6b84cbc0d2d9a2d34d68d5fdd9e016 +SOURCE_FILENAME=bc050144d7071f30dd42b11f442e0a8034346acc SOURCE_EXTRACT=true diff --git a/manifest.json b/manifest.json index c40508c..03a38f4 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Manage podcast subscriptions, and sync them between apps and devices", "fr": "Gérez vos sousciptions balado, et sychronisez-lez entre vos applis et appareils" }, - "version": "2.11.20210913~ynh1", + "version": "2.11.20211011~ynh1", "url": "https://github.com/gpodder/mygpo", "license": "AGPL-3.0-only", "maintainer": { diff --git a/sources/patches/app-00-gunicorn.conf.py.patch b/sources/patches/app-00-gunicorn.conf.py.patch index 6f53e8b..126ee3b 100644 --- a/sources/patches/app-00-gunicorn.conf.py.patch +++ b/sources/patches/app-00-gunicorn.conf.py.patch @@ -1,13 +1,15 @@ diff --git a/conf/gunicorn.conf.py b/conf/gunicorn.conf.py -index c72ebeeb..cf0d5a3a 100644 +index 726cd5f4..c13809cc 100644 --- a/conf/gunicorn.conf.py +++ b/conf/gunicorn.conf.py -@@ -1,15 +1,11 @@ +@@ -1,16 +1,16 @@ import multiprocessing import os -bind = "unix:/tmp/mygpo.sock" - workers = multiprocessing.cpu_count() ++#bind = "unix:/tmp/mygpo.sock" + #workers = multiprocessing.cpu_count() + workers = 3 # The maximum number of requests a worker will process before restarting. # max_requests = 1000 @@ -15,6 +17,9 @@ index c72ebeeb..cf0d5a3a 100644 -errorlog = "/var/log/gunicorn/error.log" -accesslog = "/var/log/gunicorn/access.log" -loglevel = "info" ++#errorlog = "/var/log/gunicorn/error.log" ++#accesslog = "/var/log/gunicorn/access.log" ++#loglevel = "info" + access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s %(T)s "%(f)s" "%(a)s"' timeout = 120 - graceful_timeout = 60 diff --git a/sources/patches/app-01-settings.py.patch b/sources/patches/app-01-settings.py.patch index 4b14e81..7069138 100644 --- a/sources/patches/app-01-settings.py.patch +++ b/sources/patches/app-01-settings.py.patch @@ -1,5 +1,5 @@ diff --git a/mygpo/settings.py b/mygpo/settings.py -index 33bd283f..2666ade6 100644 +index b3927315..f295c326 100644 --- a/mygpo/settings.py +++ b/mygpo/settings.py @@ -2,6 +2,7 @@ import re @@ -26,4 +26,4 @@ index 33bd283f..2666ade6 100644 SESSION_ENGINE = "django.contrib.sessions.backends.cached_db" # TODO: use (default) JSON serializer for security - \ No newline at end of file + From cefa3e34e44f648ff71c42317364ce608ddb6861 Mon Sep 17 00:00:00 2001 From: Jules Bertholet Date: Mon, 18 Oct 2021 00:33:09 -0400 Subject: [PATCH 05/13] use `makemigrations --merge` on migrate --- scripts/_common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 055ffdd..d4883be 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -59,7 +59,7 @@ function upgrade_db { } function perform_db_migrations { - sudo -u $app $final_path/venv/bin/envdir $env_path $final_path/venv/bin/python $final_path/manage.py makemigrations + sudo -u $app $final_path/venv/bin/envdir $env_path $final_path/venv/bin/python $final_path/manage.py makemigrations --merge sudo -u $app $final_path/venv/bin/envdir $env_path $final_path/venv/bin/python $final_path/manage.py migrate } From 6f5cbf6186b05556f2bf95c6809ff975c96a8e1f Mon Sep 17 00:00:00 2001 From: Jules Bertholet Date: Thu, 21 Oct 2021 11:04:46 -0400 Subject: [PATCH 06/13] Update 20 version 2021-10-20 --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 6 +++--- manifest.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b31b82e..624a819 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ This is the webservice powering the https://gpodder.net website. It can be used to sync podcast subscriptions with [supported clients](https://gpoddernet.readthedocs.io/en/latest/user/clients.html). -**Shipped version:** 2021-10-11 +**Shipped version:** 2021-10-20 ## Screenshots diff --git a/README_fr.md b/README_fr.md index c86aba6..b700884 100644 --- a/README_fr.md +++ b/README_fr.md @@ -12,7 +12,7 @@ Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install Ceci est le service derrière https://gpodder.net. Il peut servir pour synchronizer vos flux balado entre [clients compatibles](https://gpoddernet.readthedocs.io/en/latest/user/clients.html). -**Version incluse :** 2021-10-11 +**Version incluse :** 2021-10-20 ## Captures d'écran diff --git a/conf/app.src b/conf/app.src index 3dade32..147bbad 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,7 +1,7 @@ -SOURCE_URL=https://github.com/gpodder/mygpo/tarball/bc050144d7071f30dd42b11f442e0a8034346acc -SOURCE_SUM=9fb970ac49f5b06c83ed52596c962d875d0be8ab1f27f89ffc402139d931e48e +SOURCE_URL=https://github.com/gpodder/mygpo/tarball/57579ae579a5499542d6fbd271f1e0ada7850f13 +SOURCE_SUM=66b0c72318296c8238cb6f7ed2564806b22605c56c368a7b45528ba3fabe48d3 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true -SOURCE_FILENAME=bc050144d7071f30dd42b11f442e0a8034346acc +SOURCE_FILENAME=57579ae579a5499542d6fbd271f1e0ada7850f13 SOURCE_EXTRACT=true diff --git a/manifest.json b/manifest.json index 03a38f4..efb2f06 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Manage podcast subscriptions, and sync them between apps and devices", "fr": "Gérez vos sousciptions balado, et sychronisez-lez entre vos applis et appareils" }, - "version": "2.11.20211011~ynh1", + "version": "2.11.20211020~ynh1", "url": "https://github.com/gpodder/mygpo", "license": "AGPL-3.0-only", "maintainer": { From 1da78539844d62db111f8db632d82d7b6380660e Mon Sep 17 00:00:00 2001 From: yalh76 Date: Tue, 25 Jan 2022 02:20:46 +0100 Subject: [PATCH 07/13] Apply example_ynh --- .gitignore | 2 -- .vscode/settings.json | 8 ------ check_process | 17 +++++------- conf/systemd.service | 4 +-- doc/.gitkeep | 0 doc/DESCRIPTION.md | 5 ++++ doc/DISCLAIMER.md | 3 +++ doc/screenshots/.gitkeep | 0 doc/screenshots/screenshot1.png | Bin 0 -> 134042 bytes hooks/post_user_delete | 2 +- manifest.json | 17 +++++++----- scripts/_common.sh | 26 +++++++++--------- scripts/backup | 16 +++++++++--- scripts/change_url | 16 ++++++++++-- scripts/install | 27 ++++++++++++------- scripts/remove | 32 +++++++++++++++-------- scripts/restore | 40 ++++++++++++++++------------ scripts/upgrade | 45 ++++++++++++++++++-------------- 18 files changed, 155 insertions(+), 105 deletions(-) delete mode 100644 .gitignore delete mode 100644 .vscode/settings.json create mode 100644 doc/.gitkeep create mode 100644 doc/DESCRIPTION.md create mode 100644 doc/DISCLAIMER.md create mode 100644 doc/screenshots/.gitkeep create mode 100644 doc/screenshots/screenshot1.png diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 783a4ae..0000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*~ -*.sw[op] diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 91e90e1..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "markdownlint.config": { - "MD028": false, - "MD025": { - "front_matter_title": "" - } - } -} \ No newline at end of file diff --git a/check_process b/check_process index 5a331db..512c5da 100644 --- a/check_process +++ b/check_process @@ -1,13 +1,8 @@ -# See here for more information -# https://github.com/YunoHost/package_check#syntax-check_process-file - -# Move this file from check_process.default to check_process when you have filled it. - ;; Test complet ; Manifest - domain="domain.tld" (DOMAIN) - admin="john" (USER) - is_public=1 (PUBLIC|public=1|private=0) + domain="domain.tld" + admin="john" + is_public=1 ; Checks pkg_linter=1 setup_sub_dir=0 @@ -16,7 +11,10 @@ setup_private=1 setup_public=1 upgrade=1 + # 2.11.1~ynh3 upgrade=1 from_commit=a50d46ae3a01d8a5b08ca9f9e62bfc9269fdedfa + # 2.11.20210519~ynh1 + upgrade=1 from_commit=59b41b65dc33c3da471175002f37576ff460dc46 backup_restore=1 multi_instance=0 port_already_use=0 @@ -26,6 +24,5 @@ Email= Notification=none ;;; Upgrade options ; commit=CommitHash - name= Tweak starting of systemd services (April 1) + name=Tweak starting of systemd services (April 1) manifest_arg=domain=DOMAIN&admin=USER&is_public=1& - diff --git a/conf/systemd.service b/conf/systemd.service index c3dfa7a..e193b5d 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -8,7 +8,7 @@ Requires=__APP__.socket Type=notify User=__APP__ Group=__APP__ -WorkingDirectory=__FINALPATH__ +WorkingDirectory=__FINALPATH__/ ExecStart=__FINALPATH__/venv/bin/envdir __FINALPATH__/envs/prod __FINALPATH__/venv/bin/gunicorn -c __FINALPATH__/conf/gunicorn.conf.py mygpo.wsgi:application --bind unix:/run/__APP__.sock ExecReload=/bin/kill -s HUP $MAINPID @@ -18,4 +18,4 @@ TimeoutStopSec=5 PrivateTmp=true [Install] -WantedBy=multi-user.target \ No newline at end of file +WantedBy=multi-user.target diff --git a/doc/.gitkeep b/doc/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md new file mode 100644 index 0000000..ea1b39a --- /dev/null +++ b/doc/DESCRIPTION.md @@ -0,0 +1,5 @@ +This is the webservice powering the https://gpodder.net website. It can be used to sync podcast subscriptions with [supported clients](https://gpoddernet.readthedocs.io/en/latest/user/clients.html). + +## Configuration + +Edit files under `/opt/yunohost/APPDIR/envs/prod` to set environment variables. There is an admin interface at `yourdomain.tld/admin` that the admin user can log in to. diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md new file mode 100644 index 0000000..8face07 --- /dev/null +++ b/doc/DISCLAIMER.md @@ -0,0 +1,3 @@ +## Limitations + +* The feed-parsing service is not included, https://feeds.gpodder.net is used diff --git a/doc/screenshots/.gitkeep b/doc/screenshots/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/doc/screenshots/screenshot1.png b/doc/screenshots/screenshot1.png new file mode 100644 index 0000000000000000000000000000000000000000..d2ef7200ebd7a89533082ae5d0a996f14708a969 GIT binary patch literal 134042 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�%9R<=xu$%hLxkQ7|Wn{4S_vF4u=w84>A5 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 z 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

mZOC8gw&AQqO&NE&s@k^Px&JNUsg1 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

Yv(ATG+99nV|IErP_)# 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 4.1.3" + "yunohost": ">= 4.3.0" }, "multi_instance": false, "services": [ @@ -23,16 +30,14 @@ "redis-server" ], "arguments": { - "install" : [ + "install": [ { "name": "domain", - "type": "domain", - "example": "example.com" + "type": "domain" }, { "name": "admin", - "type": "user", - "example": "johndoe" + "type": "user" }, { "name": "is_public", diff --git a/scripts/_common.sh b/scripts/_common.sh index 1e7e702..3072e83 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -11,14 +11,14 @@ pkg_dependencies="acl python3 python3-dev python3-pip python3-venv postgresql po #================================================= function set_permissions { - mkdir -p $data_path + mkdir -p $datadir env_path=$final_path/envs/prod mkdir -p $env_path - chown -R $app:$app $data_path - chmod o-rwx $data_path - setfacl -n -R -m u:www-data:rx -m d:u:www-data:rx $data_path + chown -R $app:$app $datadir + chmod o-rwx $datadir + setfacl -n -R -m u:www-data:rx -m d:u:www-data:rx $datadir chown -R root:$app $final_path chmod -R g=u,g-w,o-rwx $final_path @@ -32,11 +32,11 @@ function set_up_virtualenv { pushd $final_path || ynh_die chown -R $app:$app $final_path - sudo -u $app python3 -m venv $final_path/venv - sudo -u $app $final_path/venv/bin/pip --cache-dir $final_path/.cache/pip install -U wheel pip --cache-dir $final_path/.cache/pip setuptools - sudo -u $app $final_path/venv/bin/pip --cache-dir $final_path/.cache/pip install -U --requirement $final_path/requirements.txt - sudo -u $app $final_path/venv/bin/pip --cache-dir $final_path/.cache/pip install -U --requirement $final_path/requirements-setup.txt - sudo -u $app $final_path/venv/bin/pip --cache-dir $final_path/.cache/pip install -U --requirement $final_path/requirements-ynh.txt + ynh_exec_warn_less ynh_exec_as $app python3 -m venv $final_path/venv + ynh_exec_warn_less ynh_exec_as $app $final_path/venv/bin/pip --cache-dir $final_path/.cache/pip install -U wheel pip --cache-dir $final_path/.cache/pip setuptools + ynh_exec_warn_less ynh_exec_as $app $final_path/venv/bin/pip --cache-dir $final_path/.cache/pip install -U --requirement $final_path/requirements.txt + ynh_exec_warn_less ynh_exec_as $app $final_path/venv/bin/pip --cache-dir $final_path/.cache/pip install -U --requirement $final_path/requirements-setup.txt + ynh_exec_warn_less ynh_exec_as $app $final_path/venv/bin/pip --cache-dir $final_path/.cache/pip install -U --requirement $final_path/requirements-ynh.txt set_permissions popd || ynh_dies } @@ -45,7 +45,7 @@ function initialize_db { pushd $final_path || ynh_die chown -R $app:$app $final_path perform_db_migrations - sudo -u $app $final_path/venv/bin/envdir $env_path $final_path/venv/bin/python $final_path/manage.py createsuperuser --username "$admin" --email "$admin_email" --noinput -v 0 + ynh_exec_warn_less ynh_exec_as $app $final_path/venv/bin/envdir $env_path $final_path/venv/bin/python $final_path/manage.py createsuperuser --username "$admin" --email "$admin_email" --noinput -v 0 set_permissions popd || ynh_die } @@ -59,15 +59,15 @@ function upgrade_db { } function perform_db_migrations { - sudo -u $app $final_path/venv/bin/envdir $env_path $final_path/venv/bin/python $final_path/manage.py makemigrations --merge - sudo -u $app $final_path/venv/bin/envdir $env_path $final_path/venv/bin/python $final_path/manage.py migrate + ynh_exec_warn_less ynh_exec_as $app $final_path/venv/bin/envdir $env_path $final_path/venv/bin/python $final_path/manage.py makemigrations --merge + ynh_exec_warn_less ynh_exec_as $app $final_path/venv/bin/envdir $env_path $final_path/venv/bin/python $final_path/manage.py migrate } function get_app_settings { 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) - data_path=$(ynh_app_setting_get --app=$app --key=data_path) + datadir=$(ynh_app_setting_get --app=$app --key=datadir) admin=$(ynh_app_setting_get --app=$app --key=admin) secret_key=$(ynh_app_setting_get --app=$app --key=secret_key) admin_email=$(ynh_user_get_info --username=$admin --key="mail") diff --git a/scripts/backup b/scripts/backup index a01aa8b..bfc4d1b 100755 --- a/scripts/backup +++ b/scripts/backup @@ -5,6 +5,7 @@ #================================================= # IMPORT GENERIC HELPERS #================================================= + # Keep this path for calling _common.sh inside the execution's context of backup and restore scripts source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers @@ -12,6 +13,7 @@ source /usr/share/yunohost/helpers #================================================= # MANAGE SCRIPT FAILURE #================================================= + ynh_clean_setup () { true } @@ -35,11 +37,19 @@ ynh_print_info --message="Declaring files to be backed up..." #================================================= # BACKUP THE APP MAIN DIR #================================================= + ynh_backup --src_path="$final_path" +#================================================= +# BACKUP THE DATA DIR +#================================================= + +ynh_backup --src_path="$datadir" --is_big + #================================================= # BACKUP THE NGINX CONFIGURATION #================================================= + ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= @@ -47,15 +57,12 @@ ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # BACKUP SYSTEMD #================================================= + ynh_backup --src_path="/etc/systemd/system/$app.service" ynh_backup --src_path="/etc/systemd/system/$app-celery.service" ynh_backup --src_path="/etc/systemd/system/$app-beat.service" ynh_backup --src_path="/etc/systemd/system/$app.socket" -#================================================= -# BACKUP VARIOUS FILES -#================================================= -ynh_backup --is_big --src_path="/home/yunohost.app/$app" #================================================= # BACKUP THE POSTGRESQL DATABASE @@ -67,4 +74,5 @@ ynh_psql_dump_db --database="$db_name" > db.sql #================================================= # END OF SCRIPT #================================================= + ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." diff --git a/scripts/change_url b/scripts/change_url index 4e84165..6e78f4b 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -5,15 +5,19 @@ #================================================= # IMPORT GENERIC HELPERS #================================================= + source _common.sh source /usr/share/yunohost/helpers #================================================= # RETRIEVE ARGUMENTS #================================================= + old_domain=$YNH_APP_OLD_DOMAIN +old_path=$YNH_APP_OLD_PATH new_domain=$YNH_APP_NEW_DOMAIN +new_path="/" app=$YNH_APP_INSTANCE_NAME @@ -25,9 +29,9 @@ ynh_script_progression --message="Loading installation settings..." --weight=1 get_app_settings #================================================= -# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +# BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP #================================================= -ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --weight=1 +ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." # Backup the current version of the app ynh_backup_before_upgrade @@ -44,12 +48,19 @@ 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 #================================================= @@ -110,4 +121,5 @@ ynh_systemd_action --service_name=nginx --action=reload #================================================= # END OF SCRIPT #================================================= + ynh_script_progression --message="Change of URL completed for $app" --last diff --git a/scripts/install b/scripts/install index fef2b4d..4b548ad 100755 --- a/scripts/install +++ b/scripts/install @@ -5,12 +5,14 @@ #================================================= # IMPORT GENERIC HELPERS #================================================= + source _common.sh source /usr/share/yunohost/helpers #================================================= # MANAGE SCRIPT FAILURE #================================================= + ynh_clean_setup () { true } @@ -39,9 +41,6 @@ ynh_script_progression --message="Validating installation parameters..." --weigh final_path=/opt/yunohost/$app test ! -e "$final_path" || ynh_die --message="This path already contains a folder" -data_path=/home/yunohost.app/$app -test ! -e "$data_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 @@ -69,8 +68,8 @@ ynh_install_app_dependencies $pkg_dependencies #================================================= ynh_script_progression --message="Configuring system user..." --weight=1 -# Create a q user -ynh_system_user_create --username=$app +# Create a system user +ynh_system_user_create --username=$app --home_dir=$final_path #================================================= # CREATE A POSTGRESQL DATABASE @@ -90,12 +89,9 @@ ynh_psql_execute_as_root --sql="ALTER ROLE $db_user SET statement_timeout = 5000 ynh_script_progression --message="Setting up source files..." --weight=1 ynh_app_setting_set --app=$app --key=final_path --value=$final_path -ynh_app_setting_set --app=$app --key=data_path --value=$data_path # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$final_path" -set_permissions - #================================================= # NGINX CONFIGURATION #================================================= @@ -106,6 +102,16 @@ ynh_add_nginx_config #================================================= # SPECIFIC SETUP +#================================================= +# CREATE DATA DIRECTORY +#================================================= +ynh_script_progression --message="Creating a data directory..." + +datadir=/home/yunohost.app/$app +ynh_app_setting_set --app=$app --key=datadir --value=$datadir + +set_permissions + #================================================= # ENVDIR CONFIGURATION #================================================= @@ -119,7 +125,7 @@ echo False > $env_path/DEBUG echo $domain > $env_path/DEFAULT_BASE_URL echo "$app@$domain" > $env_path/DEFAULT_FROM_EMAIL echo "django.core.mail.backends.console.EmailBackend" > $env_path/EMAIL_BACKEND -echo "$data_path" > $env_path/MEDIA_ROOT +echo "$datadir" > $env_path/MEDIA_ROOT echo $secret_key > $env_path/SECRET_KEY echo "$app@$domain" > $env_path/SERVER_EMAIL echo $staff_token > $env_path/STAFF_TOKEN @@ -134,6 +140,8 @@ set_up_virtualenv #================================================= # INITIALIZE DATABASE #================================================= +ynh_script_progression --message="Initializing database..." + initialize_db #================================================= @@ -202,4 +210,5 @@ ynh_systemd_action --service_name=nginx --action=reload #================================================= # END OF SCRIPT #================================================= + ynh_script_progression --message="Installation of $app completed" --last diff --git a/scripts/remove b/scripts/remove index 49d1143..fe4f4f6 100755 --- a/scripts/remove +++ b/scripts/remove @@ -5,6 +5,7 @@ #================================================= # IMPORT GENERIC HELPERS #================================================= + source _common.sh source /usr/share/yunohost/helpers @@ -53,14 +54,6 @@ ynh_script_progression --message="Removing the PostgreSQL database..." --weight= # 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 - #================================================= # REMOVE APP MAIN DIR #================================================= @@ -69,6 +62,17 @@ ynh_script_progression --message="Removing app main directory..." --weight=1 # Remove the app directory securely ynh_secure_remove --file="$final_path" +#================================================= +# REMOVE DATA DIR +#================================================= + +# Remove the data directory if --purge option is used +if [ "${YNH_APP_PURGE:-0}" -eq 1 ] +then + ynh_script_progression --message="Removing app data directory..." + ynh_secure_remove --file="$datadir" +fi + #================================================= # REMOVE NGINX CONFIGURATION #================================================= @@ -77,18 +81,24 @@ ynh_script_progression --message="Removing NGINX web server configuration..." -- # Remove the dedicated NGINX config ynh_remove_nginx_config +#================================================= +# REMOVE DEPENDENCIES +#================================================= +ynh_script_progression --message="Removing dependencies..." --weight=1 + +# Remove metapackage and its dependencies +ynh_remove_app_dependencies + #================================================= # SPECIFIC REMOVE #================================================= # REMOVE VARIOUS FILES #================================================= +ynh_script_progression --message="Removing various files..." # Remove the log files ynh_secure_remove --file="/var/log/$app" -# Remove data dir -ynh_secure_remove --file="$data_path" - #================================================= # GENERIC FINALIZATION #================================================= diff --git a/scripts/restore b/scripts/restore index 617b42a..0e9c98b 100755 --- a/scripts/restore +++ b/scripts/restore @@ -5,6 +5,7 @@ #================================================= # IMPORT GENERIC HELPERS #================================================= + # Keep this path for calling _common.sh inside the execution's context of backup and restore scripts source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers @@ -12,6 +13,7 @@ source /usr/share/yunohost/helpers #================================================= # MANAGE SCRIPT FAILURE #================================================= + ynh_clean_setup () { true } @@ -32,19 +34,16 @@ get_app_settings #================================================= ynh_script_progression --message="Validating restoration parameters..." --weight=1 -ynh_webpath_available --domain=$domain --path_url=$path_url \ - || ynh_die --message="Path not available: ${domain}${path_url}" test ! -d $final_path \ || ynh_die --message="There is already a directory: $final_path " -test ! -d $data_path \ - || ynh_die --message="There is already a directory: $data_path " - #================================================= # STANDARD RESTORATION STEPS #================================================= # RESTORE THE NGINX CONFIGURATION #================================================= +ynh_script_progression --message="Restoring the NGINX web server configuration..." + ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= @@ -53,7 +52,7 @@ ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 # Create the dedicated user (if not existing) -ynh_system_user_create --username=$app +ynh_system_user_create --username=$app --home_dir=$final_path #================================================= # RESTORE THE APP MAIN DIR @@ -63,12 +62,20 @@ ynh_script_progression --message="Restoring the app main directory..." --weight= ynh_restore_file --origin_path="$final_path" #================================================= -# RESTORE DATA DIR +# RESTORE THE DATA DIRECTORY #================================================= -ynh_script_progression --message="Restoring the app data directory..." +ynh_script_progression --message="Restoring the data directory..." -ynh_restore_file --origin_path="$data_path" --not_mandatory +ynh_restore_file --origin_path="$datadir" --not_mandatory +mkdir -p $datadir + +chmod 750 "$datadir" +chmod -R o-rwx "$datadir" +chown -R $app:www-data "$datadir" + +#================================================= +# SPECIFIC RESTORATION #================================================= # REINSTALL DEPENDENCIES #================================================= @@ -77,14 +84,6 @@ ynh_script_progression --message="Reinstalling dependencies..." --weight=1 # Define and install dependencies ynh_install_app_dependencies $pkg_dependencies -#================================================= -# RESTORE USER RIGHTS -#================================================= -# Restore permissions on app files -set_permissions - -#================================================= -# SPECIFIC RESTORATION #================================================= # RESTORE THE POSTGRESQL DATABASE #================================================= @@ -95,6 +94,12 @@ db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) ynh_psql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd ynh_psql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./db.sql +#================================================= +# RESTORE USER RIGHTS +#================================================= +# Restore permissions on app files +set_permissions + #================================================= # RESTORE SYSTEMD #================================================= @@ -139,4 +144,5 @@ ynh_systemd_action --service_name=nginx --action=reload #================================================= # END OF SCRIPT #================================================= + ynh_script_progression --message="Restoration completed for $app" --last diff --git a/scripts/upgrade b/scripts/upgrade index 11d1838..d039df0 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -5,6 +5,7 @@ #================================================= # IMPORT GENERIC HELPERS #================================================= + source _common.sh source /usr/share/yunohost/helpers @@ -20,21 +21,10 @@ get_app_settings #================================================= # CHECK VERSION #================================================= +ynh_script_progression --message="Checking version..." + upgrade_type=$(ynh_check_app_version_changed) -#================================================= -# ENSURE DOWNWARD COMPATIBILITY -#================================================= -ynh_script_progression --message="Ensuring downward compatibility..." --time --weight=1 - -if [ -z "$data_path" ]; then - data_path=$(ynh_app_setting_get --app=$app --key=datadir) - ynh_app_setting_set --app=$app --key=data_path --value=$data_path - ynh_app_setting_delete --app=$app --key=datadir - ynh_app_setting_delete --app=$app --key=db_pwd - ynh_app_setting_delete --app=$app --key=admin_email -fi - #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= @@ -67,15 +57,30 @@ systemctl disable $app-beat --quiet systemctl disable $app-celery --quiet #================================================= -# UPGRADE DEPENDENCIES +# ENSURE DOWNWARD COMPATIBILITY #================================================= -ynh_script_progression --message="Upgrading dependencies..." --weight=1 +ynh_script_progression --message="Ensuring downward compatibility..." --time --weight=1 -ynh_install_app_dependencies $pkg_dependencies +if [ -z "$datadir" ]; then + datadir=$(ynh_app_setting_get --app=$app --key=datadir) + ynh_app_setting_set --app=$app --key=datadir --value=$datadir + ynh_app_setting_delete --app=$app --key=datadir + ynh_app_setting_delete --app=$app --key=db_pwd + ynh_app_setting_delete --app=$app --key=admin_email +fi + +#================================================= +# 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 #================================================= + if [ "$upgrade_type" == "UPGRADE_APP" ] then ynh_script_progression --message="Upgrading source files..." --weight=1 @@ -95,12 +100,11 @@ ynh_script_progression --message="Upgrading NGINX web server configuration..." - ynh_add_nginx_config #================================================= -# CREATE DEDICATED USER +# UPGRADE DEPENDENCIES #================================================= -ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 +ynh_script_progression --message="Upgrading dependencies..." --weight=1 -# Create a dedicated user (if not existing) -ynh_system_user_create --username=$app +ynh_install_app_dependencies $pkg_dependencies #================================================= # SPECIFIC UPGRADE @@ -161,4 +165,5 @@ ynh_systemd_action --service_name=nginx --action=reload #================================================= # END OF SCRIPT #================================================= + ynh_script_progression --message="Upgrade of $app completed" --last From 2869f94e43c426578df0bb05ca9d6c233a6a6686 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Tue, 25 Jan 2022 01:20:52 +0000 Subject: [PATCH 08/13] Auto-update README --- README.md | 51 ++++++++++++++++++++++---------------------------- README_fr.md | 53 +++++++++++++++++++++------------------------------- 2 files changed, 43 insertions(+), 61 deletions(-) diff --git a/README.md b/README.md index 624a819..1c65b30 100644 --- a/README.md +++ b/README.md @@ -1,57 +1,48 @@ -# `mygpo` (gPodder.net) for YunoHost + + +# mygpo (gPodder.net) for YunoHost [![Integration level](https://dash.yunohost.org/integration/mygpo.svg)](https://dash.yunohost.org/appci/app/mygpo) ![](https://ci-apps.yunohost.org/ci/badges/mygpo.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/mygpo.maintain.svg) -[![Install mygpo with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=mygpo) +[![Install mygpo (gPodder.net) with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=mygpo) *[Lire ce readme en français.](./README_fr.md)* -> *This package allows you to install mygpo 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 mygpo (gPodder.net) 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 This is the webservice powering the https://gpodder.net website. It can be used to sync podcast subscriptions with [supported clients](https://gpoddernet.readthedocs.io/en/latest/user/clients.html). -**Shipped version:** 2021-10-20 - -## Screenshots - -![](https://github.com/YunoHost-Apps/mygpo_ynh/raw/master/screenshot.png) - -## Demo - -* [Official demo](https://gpodder.net) - ## Configuration Edit files under `/opt/yunohost/APPDIR/envs/prod` to set environment variables. There is an admin interface at `yourdomain.tld/admin` that the admin user can log in to. -## Documentation -* Official documentation: https://gpoddernet.readthedocs.io/ +**Shipped version:** 2.11.20211020~ynh1 -#### Multi-user support +**Demo:** https://gpodder.net -* Are LDAP and HTTP auth supported? **LDAP only** -* Can the app be used by multiple users? **Yes** +## Screenshots -#### Supported architectures +![](./doc/screenshots/screenshot1.png) -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/mygpo%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/mygpo/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/mygpo%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/mygpo/) +## Disclaimers / important information ## Limitations * The feed-parsing service is not included, https://feeds.gpodder.net is used -## Links +## Documentation and resources +* Official app website: https://gpodder.net +* Official admin documentation: https://gpoddernet.readthedocs.io/ +* Upstream app code repository: https://github.com/gpodder/mygpo +* YunoHost documentation for this app: https://yunohost.org/app_mygpo * Report a bug: https://github.com/YunoHost-Apps/mygpo_ynh/issues -* App website: https://gpodder.net -* Upstream app repository: https://github.com/gpodder/mygpo -* YunoHost website: https://yunohost.org/ - ---- ## Developer info @@ -61,5 +52,7 @@ To try the testing branch, please proceed like that. ``` sudo yunohost app install https://github.com/YunoHost-Apps/mygpo_ynh/tree/testing --debug or -sudo yunohost app upgrade mygpo -u https://github.com/YunoHost-Apps/mygpo_ynh/tree/testing --debuggit +sudo yunohost app upgrade mygpo -u https://github.com/YunoHost-Apps/mygpo_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 b700884..6b3e2de 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,57 +1,44 @@ -# `mygpo` (gPodder.net) pour YunoHost +# mygpo (gPodder.net) pour YunoHost [![Niveau d'intégration](https://dash.yunohost.org/integration/mygpo.svg)](https://dash.yunohost.org/appci/app/mygpo) ![](https://ci-apps.yunohost.org/ci/badges/mygpo.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/mygpo.maintain.svg) -[![Installer mygpo avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=mygpo) +[![Installer mygpo (gPodder.net) avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=mygpo) *[Read this readme in english.](./README.md)* +*[Lire ce readme en français.](./README_fr.md)* -> *Ce package vous permet d'installer mygpo 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 mygpo (gPodder.net) 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 -Ceci est le service derrière https://gpodder.net. Il peut servir pour synchronizer vos flux balado entre [clients compatibles](https://gpoddernet.readthedocs.io/en/latest/user/clients.html). - -**Version incluse :** 2021-10-20 - -## Captures d'écran - -![](https://github.com/YunoHost-Apps/mygpo_ynh/raw/master/screenshot.png) - -## Démo - -* [Démo officielle](https://gpodder.net) +This is the webservice powering the https://gpodder.net website. It can be used to sync podcast subscriptions with [supported clients](https://gpoddernet.readthedocs.io/en/latest/user/clients.html). ## Configuration -Modifiez les fichiers sous `/opt/yunohost/APPDIR/envs/prod` pour configurer les variables d'environment. Il y a une interface admin a `votre-domaine.tld/admin` (seulement accessible par l'administrateur). +Edit files under `/opt/yunohost/APPDIR/envs/prod` to set environment variables. There is an admin interface at `yourdomain.tld/admin` that the admin user can log in to. -## Documentation -* Documentation officielle : https://gpoddernet.readthedocs.io/ +**Version incluse :** 2.11.20211020~ynh1 -#### Support multi-utilisateur +**Démo :** https://gpodder.net -* L'authentification LDAP et HTTP est-elle prise en charge ? **Seulement LDAP** -* L'application peut-elle être utilisée par plusieurs utilisateurs ? **Oui** +## Captures d'écran -#### Architectures supportées +![](./doc/screenshots/screenshot1.png) -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/mygpo%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/mygpo/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/mygpo%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/mygpo/) +## Avertissements / informations importantes ## Limitations -* Le service d'analyse de flux n'est pas inclu, https://feeds.gpodder.net est utilisé +* The feed-parsing service is not included, https://feeds.gpodder.net is used -## Liens +## Documentations et ressources - * Signaler un bug : https://github.com/YunoHost-Apps/mygpo_ynh/issues - * Site de l'application : https://gpodder.net - * Dépôt de l'application principale : https://github.com/gpodder/mygpo - * Site web YunoHost : https://yunohost.org/ - ---- +* Site officiel de l'app : https://gpodder.net +* Documentation officielle de l'admin : https://gpoddernet.readthedocs.io/ +* Dépôt de code officiel de l'app : https://github.com/gpodder/mygpo +* Documentation YunoHost pour cette app : https://yunohost.org/app_mygpo +* Signaler un bug : https://github.com/YunoHost-Apps/mygpo_ynh/issues ## Informations pour les développeurs @@ -63,3 +50,5 @@ sudo yunohost app install https://github.com/YunoHost-Apps/mygpo_ynh/tree/testin ou sudo yunohost app upgrade mygpo -u https://github.com/YunoHost-Apps/mygpo_ynh/tree/testing --debug ``` + +**Plus d'infos sur le packaging d'applications :** https://yunohost.org/packaging_apps \ No newline at end of file From 28ac94c05af1a9297b60a80dcf10cb26f9b1c630 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Thu, 27 Jan 2022 20:21:17 +0100 Subject: [PATCH 09/13] Fix upgrade --- scripts/_common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 3072e83..f3763d4 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -59,7 +59,7 @@ function upgrade_db { } function perform_db_migrations { - ynh_exec_warn_less ynh_exec_as $app $final_path/venv/bin/envdir $env_path $final_path/venv/bin/python $final_path/manage.py makemigrations --merge + echo "y" | ynh_exec_warn_less ynh_exec_as $app $final_path/venv/bin/envdir $env_path $final_path/venv/bin/python $final_path/manage.py makemigrations --merge ynh_exec_warn_less ynh_exec_as $app $final_path/venv/bin/envdir $env_path $final_path/venv/bin/python $final_path/manage.py migrate } From d9b20e5c1f88eb7a982e32e227eebfc5ed85e433 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Sun, 30 Jan 2022 14:38:30 +0100 Subject: [PATCH 10/13] fix datadir --- scripts/upgrade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index d039df0..8cbf6e5 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -62,9 +62,9 @@ systemctl disable $app-celery --quiet ynh_script_progression --message="Ensuring downward compatibility..." --time --weight=1 if [ -z "$datadir" ]; then - datadir=$(ynh_app_setting_get --app=$app --key=datadir) + datadir=$(ynh_app_setting_get --app=$app --key=data_path) ynh_app_setting_set --app=$app --key=datadir --value=$datadir - ynh_app_setting_delete --app=$app --key=datadir + ynh_app_setting_delete --app=$app --key=data_path ynh_app_setting_delete --app=$app --key=db_pwd ynh_app_setting_delete --app=$app --key=admin_email fi From e6f4e812a872d5264e6bfb8da7873149da7168bf Mon Sep 17 00:00:00 2001 From: yalh76 Date: Mon, 20 Jun 2022 23:52:21 +0200 Subject: [PATCH 11/13] Apply last example_ynh --- check_process | 2 +- conf/systemd-beat.service | 1 - conf/systemd-celery.service | 1 - conf/systemd.service | 1 - manifest.json | 8 ++++---- scripts/change_url | 1 + scripts/install | 9 +++++---- scripts/restore | 16 ++++++++-------- scripts/upgrade | 15 ++++++++------- 9 files changed, 27 insertions(+), 27 deletions(-) diff --git a/check_process b/check_process index 512c5da..ef49e54 100644 --- a/check_process +++ b/check_process @@ -1,8 +1,8 @@ ;; Test complet ; Manifest domain="domain.tld" - admin="john" is_public=1 + admin="john" ; Checks pkg_linter=1 setup_sub_dir=0 diff --git a/conf/systemd-beat.service b/conf/systemd-beat.service index c2709bd..56e7757 100644 --- a/conf/systemd-beat.service +++ b/conf/systemd-beat.service @@ -2,7 +2,6 @@ Description=GPodder-beat After=network.target postgresql.service redis.service __APP__.scoket - [Service] User=__APP__ Group=__APP__ diff --git a/conf/systemd-celery.service b/conf/systemd-celery.service index 5c39756..6235004 100644 --- a/conf/systemd-celery.service +++ b/conf/systemd-celery.service @@ -2,7 +2,6 @@ Description=GPodder-celery After=network.target postgresql.service redis.service __APP__.socket - [Service] User=__APP__ Group=__APP__ diff --git a/conf/systemd.service b/conf/systemd.service index e193b5d..1ac6082 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -3,7 +3,6 @@ Description=GPodder After=network.target postgresql.service nginx.service redis.service __APP__-celery.service __APP__-beat.service Requires=__APP__.socket - [Service] Type=notify User=__APP__ diff --git a/manifest.json b/manifest.json index 971088f..4976e8c 100644 --- a/manifest.json +++ b/manifest.json @@ -35,10 +35,6 @@ "name": "domain", "type": "domain" }, - { - "name": "admin", - "type": "user" - }, { "name": "is_public", "type": "boolean", @@ -47,6 +43,10 @@ "fr": "Si public, n'importe-qui pourra créer un compte et accéder a certaines statistiques d'utilization. Si privé, certaines parties de l'API seront inaccessibles" }, "default": true + }, + { + "name": "admin", + "type": "user" } ] } diff --git a/scripts/change_url b/scripts/change_url index 6e78f4b..5a44357 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -36,6 +36,7 @@ ynh_script_progression --message="Backing up the app before changing its URL (ma # Backup the current version of the app ynh_backup_before_upgrade ynh_clean_setup () { + ynh_clean_check_starting # 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" diff --git a/scripts/install b/scripts/install index 4b548ad..6dadb55 100755 --- a/scripts/install +++ b/scripts/install @@ -14,7 +14,7 @@ source /usr/share/yunohost/helpers #================================================= ynh_clean_setup () { - true + ynh_clean_check_starting } # Exit if an error occurs during the execution of the script ynh_abort_if_errors @@ -25,14 +25,15 @@ ynh_abort_if_errors domain=$YNH_APP_ARG_DOMAIN path_url="/" -admin=$YNH_APP_ARG_ADMIN is_public=$YNH_APP_ARG_IS_PUBLIC +admin=$YNH_APP_ARG_ADMIN + +app=$YNH_APP_INSTANCE_NAME + admin_email=$(ynh_user_get_info --username=$admin --key="mail") secret_key=$(ynh_string_random --length=64) staff_token=$(ynh_string_random --length=64) -app=$YNH_APP_INSTANCE_NAME - #================================================= # CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS #================================================= diff --git a/scripts/restore b/scripts/restore index 0e9c98b..fb49491 100755 --- a/scripts/restore +++ b/scripts/restore @@ -15,7 +15,7 @@ source /usr/share/yunohost/helpers #================================================= ynh_clean_setup () { - true + ynh_clean_check_starting } # Exit if an error occurs during the execution of the script ynh_abort_if_errors @@ -39,13 +39,6 @@ test ! -d $final_path \ #================================================= # STANDARD RESTORATION STEPS -#================================================= -# RESTORE THE NGINX CONFIGURATION -#================================================= -ynh_script_progression --message="Restoring the NGINX web server configuration..." - -ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" - #================================================= # RECREATE THE DEDICATED USER #================================================= @@ -84,6 +77,13 @@ ynh_script_progression --message="Reinstalling dependencies..." --weight=1 # Define and install dependencies ynh_install_app_dependencies $pkg_dependencies +#================================================= +# RESTORE THE NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Restoring the NGINX web server configuration..." + +ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" + #================================================= # RESTORE THE POSTGRESQL DATABASE #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 8cbf6e5..0c48fdc 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -33,6 +33,7 @@ ynh_script_progression --message="Backing up the app before upgrading (may take # Backup the current version of the app ynh_backup_before_upgrade ynh_clean_setup () { + ynh_clean_check_starting # Restore it if the upgrade fails ynh_restore_upgradebackup } @@ -91,6 +92,13 @@ fi set_permissions +#================================================= +# UPGRADE DEPENDENCIES +#================================================= +ynh_script_progression --message="Upgrading dependencies..." --weight=1 + +ynh_install_app_dependencies $pkg_dependencies + #================================================= # NGINX CONFIGURATION #================================================= @@ -99,13 +107,6 @@ 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=1 - -ynh_install_app_dependencies $pkg_dependencies - #================================================= # SPECIFIC UPGRADE #================================================= From 0c22bad1505dfb7fdd55ef614bf262ebdf653588 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Tue, 21 Jun 2022 00:05:59 +0200 Subject: [PATCH 12/13] upgrade to 2.11.20220622~ynh1 --- check_process | 2 ++ conf/app.src | 6 +++--- manifest.json | 2 +- scripts/_common.sh | 1 + 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/check_process b/check_process index ef49e54..d898e6a 100644 --- a/check_process +++ b/check_process @@ -15,6 +15,8 @@ upgrade=1 from_commit=a50d46ae3a01d8a5b08ca9f9e62bfc9269fdedfa # 2.11.20210519~ynh1 upgrade=1 from_commit=59b41b65dc33c3da471175002f37576ff460dc46 + # 2.11.20211020~ynh1 + upgrade=1 from_commit=8284155ea371f4b8a9f0c333d486c5a2342acfae backup_restore=1 multi_instance=0 port_already_use=0 diff --git a/conf/app.src b/conf/app.src index 147bbad..bd87588 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,7 +1,7 @@ -SOURCE_URL=https://github.com/gpodder/mygpo/tarball/57579ae579a5499542d6fbd271f1e0ada7850f13 -SOURCE_SUM=66b0c72318296c8238cb6f7ed2564806b22605c56c368a7b45528ba3fabe48d3 +SOURCE_URL=https://github.com/gpodder/mygpo/archive/60caf1adfb6c0dbeb21828a0d1ae0dfebc279abd.tar.gz +SOURCE_SUM=15076ba34b6a85f61923e78dd84ce93384daca92331f34d20333be4c3d915b08 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true -SOURCE_FILENAME=57579ae579a5499542d6fbd271f1e0ada7850f13 +SOURCE_FILENAME= SOURCE_EXTRACT=true diff --git a/manifest.json b/manifest.json index 4976e8c..85baa4b 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Manage podcast subscriptions, and sync them between apps and devices", "fr": "Gérez vos sousciptions balado, et sychronisez-lez entre vos applis et appareils" }, - "version": "2.11.20211020~ynh1", + "version": "2.11.20220622~ynh1", "url": "https://github.com/gpodder/mygpo", "upstream": { "license": "AGPL-3.0-only", diff --git a/scripts/_common.sh b/scripts/_common.sh index f3763d4..c115d80 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -3,6 +3,7 @@ #================================================= # COMMON VARIABLES #================================================= + # dependencies used by the app pkg_dependencies="acl python3 python3-dev python3-pip python3-venv postgresql postgresql-contrib libpq-dev redis-server libldap2-dev libsasl2-dev" From 98c44c74a7fa55af26401513feb6dd60f5cbaafa Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 20 Jun 2022 22:23:11 +0000 Subject: [PATCH 13/13] Auto-update README --- README.md | 21 +++++++++++---------- README_fr.md | 27 ++++++++++++++++----------- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 1c65b30..5b6d5d4 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ It shall NOT be edited by hand. # mygpo (gPodder.net) for YunoHost -[![Integration level](https://dash.yunohost.org/integration/mygpo.svg)](https://dash.yunohost.org/appci/app/mygpo) ![](https://ci-apps.yunohost.org/ci/badges/mygpo.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/mygpo.maintain.svg) +[![Integration level](https://dash.yunohost.org/integration/mygpo.svg)](https://dash.yunohost.org/appci/app/mygpo) ![Working status](https://ci-apps.yunohost.org/ci/badges/mygpo.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/mygpo.maintain.svg) [![Install mygpo (gPodder.net) with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=mygpo) *[Lire ce readme en français.](./README_fr.md)* @@ -22,13 +22,13 @@ This is the webservice powering the https://gpodder.net website. It can be used Edit files under `/opt/yunohost/APPDIR/envs/prod` to set environment variables. There is an admin interface at `yourdomain.tld/admin` that the admin user can log in to. -**Shipped version:** 2.11.20211020~ynh1 +**Shipped version:** 2.11.20220622~ynh1 **Demo:** https://gpodder.net ## Screenshots -![](./doc/screenshots/screenshot1.png) +![Screenshot of mygpo (gPodder.net)](./doc/screenshots/screenshot1.png) ## Disclaimers / important information @@ -38,21 +38,22 @@ Edit files under `/opt/yunohost/APPDIR/envs/prod` to set environment variables. ## Documentation and resources -* Official app website: https://gpodder.net -* Official admin documentation: https://gpoddernet.readthedocs.io/ -* Upstream app code repository: https://github.com/gpodder/mygpo -* YunoHost documentation for this app: https://yunohost.org/app_mygpo -* Report a bug: https://github.com/YunoHost-Apps/mygpo_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/mygpo_ynh/tree/testing). To try the testing branch, please proceed like that. -``` + +``` bash sudo yunohost app install https://github.com/YunoHost-Apps/mygpo_ynh/tree/testing --debug or sudo yunohost app upgrade mygpo -u https://github.com/YunoHost-Apps/mygpo_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 6b3e2de..e3df16f 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,10 +1,14 @@ + + # mygpo (gPodder.net) pour YunoHost -[![Niveau d'intégration](https://dash.yunohost.org/integration/mygpo.svg)](https://dash.yunohost.org/appci/app/mygpo) ![](https://ci-apps.yunohost.org/ci/badges/mygpo.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/mygpo.maintain.svg) +[![Niveau d'intégration](https://dash.yunohost.org/integration/mygpo.svg)](https://dash.yunohost.org/appci/app/mygpo) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/mygpo.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/mygpo.maintain.svg) [![Installer mygpo (gPodder.net) avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=mygpo) *[Read this readme in english.](./README.md)* -*[Lire ce readme en français.](./README_fr.md)* > *Ce package vous permet d'installer mygpo (gPodder.net) 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.* @@ -18,13 +22,13 @@ This is the webservice powering the https://gpodder.net website. It can be used Edit files under `/opt/yunohost/APPDIR/envs/prod` to set environment variables. There is an admin interface at `yourdomain.tld/admin` that the admin user can log in to. -**Version incluse :** 2.11.20211020~ynh1 +**Version incluse :** 2.11.20220622~ynh1 **Démo :** https://gpodder.net ## Captures d'écran -![](./doc/screenshots/screenshot1.png) +![Capture d'écran de mygpo (gPodder.net)](./doc/screenshots/screenshot1.png) ## Avertissements / informations importantes @@ -34,21 +38,22 @@ Edit files under `/opt/yunohost/APPDIR/envs/prod` to set environment variables. ## Documentations et ressources -* Site officiel de l'app : https://gpodder.net -* Documentation officielle de l'admin : https://gpoddernet.readthedocs.io/ -* Dépôt de code officiel de l'app : https://github.com/gpodder/mygpo -* Documentation YunoHost pour cette app : https://yunohost.org/app_mygpo -* Signaler un bug : https://github.com/YunoHost-Apps/mygpo_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/mygpo_ynh/tree/testing). Pour essayer la branche testing, procédez comme suit. -``` + +``` bash sudo yunohost app install https://github.com/YunoHost-Apps/mygpo_ynh/tree/testing --debug ou sudo yunohost app upgrade mygpo -u https://github.com/YunoHost-Apps/mygpo_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 :**