From 60d182d2778752983a4afe428649a43d82b996df Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 7 Dec 2020 15:54:47 +0100 Subject: [PATCH 001/150] Upgrade to v.4.0.4 --- README.md | 2 +- check_process | 3 --- conf/app.src | 4 ++-- manifest.json | 2 +- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 9402d4c..76cf0ec 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Matomo is the only analytics platform that gives you full control over your data - Easy to use - No data limits -**Shipped version:** 4.0.1 +**Shipped version:** 4.0.4 ## Screenshots diff --git a/check_process b/check_process index 5fa2ce3..487c4da 100644 --- a/check_process +++ b/check_process @@ -21,9 +21,6 @@ multi_instance=1 port_already_use=0 change_url=0 -;;; Levels - # If the level 5 (Package linter) is forced to 1. Please add justifications here. - Level 5=auto ;;; Options Email=anmol@datamol.org Notification=yes diff --git a/conf/app.src b/conf/app.src index ab5a194..c457864 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/matomo-org/matomo/archive/4.0.1.tar.gz -SOURCE_SUM=ef087588e7e02f8f10b00721a55c4ab4679c604ce299a563502079abc760bc22 +SOURCE_URL=https://github.com/matomo-org/matomo/archive/4.0.4.tar.gz +SOURCE_SUM=a32112400c3fbd6341bfa86e34666d7b348b0528f411e895cd0852810bad8620 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 32fea1b..8fe9efc 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.0.1~ynh1", + "version": "4.0.4~ynh1", "url": "https://matomo.org", "license": "GPL-3.0-or-later", "maintainer": { From 3e0ef4e309581890e823a8f09ddee77145db3019 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 8 Dec 2020 22:24:05 +0100 Subject: [PATCH 002/150] Upgrade to 4.0.5 --- README.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- scripts/install | 7 ++++--- scripts/upgrade | 18 +++--------------- 5 files changed, 11 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 76cf0ec..513028b 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Matomo is the only analytics platform that gives you full control over your data - Easy to use - No data limits -**Shipped version:** 4.0.4 +**Shipped version:** 4.0.5 ## Screenshots diff --git a/conf/app.src b/conf/app.src index c457864..2f64345 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/matomo-org/matomo/archive/4.0.4.tar.gz -SOURCE_SUM=a32112400c3fbd6341bfa86e34666d7b348b0528f411e895cd0852810bad8620 +SOURCE_URL=https://github.com/matomo-org/matomo/archive/4.0.5.tar.gz +SOURCE_SUM=b201dbcf0ce87433a6509cb83c7e565fed2da9a88f192ab222367e74ee28d55a SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 8fe9efc..35712cc 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.0.4~ynh1", + "version": "4.0.5~ynh1", "url": "https://matomo.org", "license": "GPL-3.0-or-later", "maintainer": { diff --git a/scripts/install b/scripts/install index 9b6a67b..6f18a0c 100755 --- a/scripts/install +++ b/scripts/install @@ -149,11 +149,12 @@ chown -R $app: $final_path #================================================= ynh_script_progression --message="Configuring SSOwat..." -# Make app public if necessary +# Make app public if necessary or protect it if [ $is_public -eq 1 ] then - # unprotected_uris allows SSO credentials to be passed anyway. - ynh_app_setting_set --app=$app --key=unprotected_uris --value="/" + # Everyone can access the app. + # The "main" permission is automatically created before the install script. + ynh_permission_update --permission "main" --add "visitors" fi #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index f929638..6f892f9 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -124,9 +124,9 @@ ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" ynh_script_progression --message="Setuping a cron..." ynh_replace_string --match_string="YNH_WWW_PATH" --replace_string="$final_path" --target_file="../conf/cron" -ynh_replace_string --match_string="__USER__" --replace_string="$app" --target_file="../conf/cron" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="../conf/cron" -ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="../conf/cron" +ynh_replace_string --match_string="__USER__" --replace_string="$app" --target_file="../conf/cron" +ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="../conf/cron" +ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="../conf/cron" cp -f ../conf/cron /etc/cron.d/$app #================================================= @@ -139,18 +139,6 @@ ynh_script_progression --message="Securing files and directories..." # Set permissions on app files chown -R $app: $final_path -#================================================= -# SETUP SSOWAT -#================================================= -ynh_script_progression --message="Upgrading SSOwat configuration..." - -# Make app public if necessary -if [ $is_public -eq 1 ] -then - # unprotected_uris allows SSO credentials to be passed anyway - ynh_app_setting_set --app=$app --key=unprotected_uris --value="/" -fi - #================================================= # RELOAD NGINX #================================================= From b7736718a996e9e8a9f318989c3c0a6e2304dc9a Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 9 Dec 2020 09:30:55 +0100 Subject: [PATCH 003/150] Add README_fr --- README.md | 10 +-------- README_fr.md | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 README_fr.md diff --git a/README.md b/README.md index 513028b..da127c8 100644 --- a/README.md +++ b/README.md @@ -7,15 +7,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* ## Overview -Matomo is the only analytics platform that gives you full control over your data and more: - -- Free open-source software -- 100% data ownership -- User privacy protection -- User-centric insights -- Customisable and extensible -- Easy to use -- No data limits +Matomo is the leading Free/Libre open analytics platform. It is a full-featured PHP MySQL software program that you download and install on your own webserver. At the end of the five-minute installation process, you will be given a JavaScript code. Simply copy and paste this tag on websites you wish to track and access your analytics reports in real-time. **Shipped version:** 4.0.5 diff --git a/README_fr.md b/README_fr.md new file mode 100644 index 0000000..3110260 --- /dev/null +++ b/README_fr.md @@ -0,0 +1,58 @@ +# Matomo pour YunoHost + +[![Niveau d'intégration](https://dash.yunohost.org/integration/matomo.svg)](https://dash.yunohost.org/appci/app/matomo) ![](https://ci-apps.yunohost.org/ci/badges/matomo.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/matomo.maintain.svg) +[![Installer Matomo avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=matomo) + +*[Read this readme in english.](./README.md)* + +> *Ce package vous permet d'installer Matomo 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.* + +## Vue d'ensemble +Matomo est une plateforme d'analyse open source de mesure de statistiques Web. Il s'agit d'un logiciel PHP MySQL complet que vous téléchargez et installez sur votre propre serveur Web. À la fin du processus d'installation de cinq minutes, vous recevrez un code JavaScript. Copiez et collez simplement cette balise sur les sites Web que vous souhaitez suivre et accédez à vos rapports d'analyse en temps réel. + +**Version incluse :** 4.0.5 + +## Captures d'écran + +![](https://img.matomo.org/spai/w_660+q_lossless+ret_img+to_webp/https://static.matomo.org/wp-content/uploads/2019/03/matomo-analytics-dashboard.png) + +## Démo + +* [Démo officielle](https://demo.matomo.org) + +## Configuration + +1. Une fois l'installation terminée, l'application devra terminer le processus d'enregistrement en **visitant le domaine** sur lequel Matomo est installé. +1. Les informations d'identification de la base de données MySQL seront envoyées à **l'email admin**. Remplissez ces détails lors du processus d'inscription. +1. Le support LDAP n'est pas encore implémenté pour cette l'application. + +## Documentation + + * Documentation officielle : https://matomo.org/docs + * Documentation YunoHost : Si une documentation spécifique est nécessaire, n'hésitez pas à contribuer. + +#### Architectures supportées + +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/matomo%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/matomo/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/matomo%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/matomo/) + +## Liens + + * Signaler un bug : https://github.com/YunoHost-Apps/matomo_ynh/issues + * Site de l'application : https://matomo.org/ + * Dépôt de l'application principale : https://github.com/matomo-org/matomo + * Site web YunoHost : https://yunohost.org/ + +--- + +## Informations pour les développeurs + +Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/matomo_ynh/tree/testing). + +Pour essayer la branche testing, procédez comme suit. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/matomo_ynh/tree/testing --debug +ou +sudo yunohost app upgrade matomo -u https://github.com/YunoHost-Apps/matomo_ynh/tree/testing --debug +``` From 39d98e95cb9064504aa616aff212968de881f279 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 9 Dec 2020 09:56:25 +0100 Subject: [PATCH 004/150] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index da127c8..92fd993 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ [![Integration level](https://dash.yunohost.org/integration/matomo.svg)](https://dash.yunohost.org/appci/app/matomo) ![](https://ci-apps.yunohost.org/ci/badges/matomo.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/matomo.maintain.svg) [![Install Matomo with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=matomo) +*[Lire ce readme en français.](./README_fr.md)* + > *This package allows you to install Matomo 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.* From 7dd2700fabcf926f1bac6dc45a8fe30ea04b0898 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 9 Dec 2020 10:13:09 +0100 Subject: [PATCH 005/150] Add link --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 92fd993..c0b4250 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Matomo is the leading Free/Libre open analytics platform. It is a full-featured ## Documentation * Official documentation: https://matomo.org/docs - * YunoHost documentation: If specific documentation is needed, feel free to contribute. + * YunoHost documentation: https://yunohost.org/#/app_matomo #### Supported architectures diff --git a/README_fr.md b/README_fr.md index 3110260..c8c5f56 100644 --- a/README_fr.md +++ b/README_fr.md @@ -30,7 +30,7 @@ Matomo est une plateforme d'analyse open source de mesure de statistiques Web. I ## Documentation * Documentation officielle : https://matomo.org/docs - * Documentation YunoHost : Si une documentation spécifique est nécessaire, n'hésitez pas à contribuer. + * Documentation YunoHost : https://yunohost.org/#/app_matomo_fr #### Architectures supportées From 55b8ef65322270f57b9907324ae7e5e8437bf165 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 9 Dec 2020 11:25:29 +0100 Subject: [PATCH 006/150] Add change_url script (#23) * Add change url * Create php-fpm.conf --- check_process | 2 +- conf/php-fpm.conf | 430 +++++++++++++++++++++++++++++++++++++++++++++ scripts/change_url | 105 +++++++++++ 3 files changed, 536 insertions(+), 1 deletion(-) create mode 100644 conf/php-fpm.conf create mode 100644 scripts/change_url diff --git a/check_process b/check_process index 487c4da..4292fa2 100644 --- a/check_process +++ b/check_process @@ -20,7 +20,7 @@ backup_restore=1 multi_instance=1 port_already_use=0 - change_url=0 + change_url=1 ;;; Options Email=anmol@datamol.org Notification=yes diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf new file mode 100644 index 0000000..9b2ecce --- /dev/null +++ b/conf/php-fpm.conf @@ -0,0 +1,430 @@ +; Start a new pool named 'www'. +; the variable $pool can be used in any directive and will be replaced by the +; pool name ('www' here) +[__NAMETOCHANGE__] + +; Per pool prefix +; It only applies on the following directives: +; - 'access.log' +; - 'slowlog' +; - 'listen' (unixsocket) +; - 'chroot' +; - 'chdir' +; - 'php_values' +; - 'php_admin_values' +; When not set, the global prefix (or /usr) applies instead. +; Note: This directive can also be relative to the global prefix. +; Default Value: none +;prefix = /path/to/pools/$pool + +; Unix user/group of processes +; Note: The user is mandatory. If the group is not set, the default user's group +; will be used. +user = __USER__ +group = __USER__ + +; The address on which to accept FastCGI requests. +; Valid syntaxes are: +; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on +; a specific port; +; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on +; a specific port; +; 'port' - to listen on a TCP socket to all addresses +; (IPv6 and IPv4-mapped) on a specific port; +; '/path/to/unix/socket' - to listen on a unix socket. +; Note: This value is mandatory. +listen = /var/run/php/php__PHPVERSION__-fpm-__NAMETOCHANGE__.sock + +; Set listen(2) backlog. +; Default Value: 511 (-1 on FreeBSD and OpenBSD) +;listen.backlog = 511 + +; Set permissions for unix socket, if one is used. In Linux, read/write +; permissions must be set in order to allow connections from a web server. Many +; BSD-derived systems allow connections regardless of permissions. +; Default Values: user and group are set as the running user +; mode is set to 0660 +listen.owner = www-data +listen.group = www-data +;listen.mode = 0660 +; When POSIX Access Control Lists are supported you can set them using +; these options, value is a comma separated list of user/group names. +; When set, listen.owner and listen.group are ignored +;listen.acl_users = +;listen.acl_groups = + +; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. +; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original +; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address +; must be separated by a comma. If this value is left blank, connections will be +; accepted from any ip address. +; Default Value: any +;listen.allowed_clients = 127.0.0.1 + +; Specify the nice(2) priority to apply to the pool processes (only if set) +; The value can vary from -19 (highest priority) to 20 (lower priority) +; Note: - It will only work if the FPM master process is launched as root +; - The pool processes will inherit the master process priority +; unless it specified otherwise +; Default Value: no set +; process.priority = -19 + +; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user +; or group is differrent than the master process user. It allows to create process +; core dump and ptrace the process for the pool user. +; Default Value: no +; process.dumpable = yes + +; Choose how the process manager will control the number of child processes. +; Possible Values: +; static - a fixed number (pm.max_children) of child processes; +; dynamic - the number of child processes are set dynamically based on the +; following directives. With this process management, there will be +; always at least 1 children. +; pm.max_children - the maximum number of children that can +; be alive at the same time. +; pm.start_servers - the number of children created on startup. +; pm.min_spare_servers - the minimum number of children in 'idle' +; state (waiting to process). If the number +; of 'idle' processes is less than this +; number then some children will be created. +; pm.max_spare_servers - the maximum number of children in 'idle' +; state (waiting to process). If the number +; of 'idle' processes is greater than this +; number then some children will be killed. +; ondemand - no children are created at startup. Children will be forked when +; new requests will connect. The following parameter are used: +; pm.max_children - the maximum number of children that +; can be alive at the same time. +; pm.process_idle_timeout - The number of seconds after which +; an idle process will be killed. +; Note: This value is mandatory. +pm = dynamic + +; The number of child processes to be created when pm is set to 'static' and the +; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. +; This value sets the limit on the number of simultaneous requests that will be +; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. +; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP +; CGI. The below defaults are based on a server without much resources. Don't +; forget to tweak pm.* to fit your needs. +; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' +; Note: This value is mandatory. +pm.max_children = 5 + +; The number of child processes created on startup. +; Note: Used only when pm is set to 'dynamic' +; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 +pm.start_servers = 2 + +; The desired minimum number of idle server processes. +; Note: Used only when pm is set to 'dynamic' +; Note: Mandatory when pm is set to 'dynamic' +pm.min_spare_servers = 1 + +; The desired maximum number of idle server processes. +; Note: Used only when pm is set to 'dynamic' +; Note: Mandatory when pm is set to 'dynamic' +pm.max_spare_servers = 3 + +; The number of seconds after which an idle process will be killed. +; Note: Used only when pm is set to 'ondemand' +; Default Value: 10s +;pm.process_idle_timeout = 10s; + +; The number of requests each child process should execute before respawning. +; This can be useful to work around memory leaks in 3rd party libraries. For +; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. +; Default Value: 0 +;pm.max_requests = 500 + +; The URI to view the FPM status page. If this value is not set, no URI will be +; recognized as a status page. It shows the following informations: +; pool - the name of the pool; +; process manager - static, dynamic or ondemand; +; start time - the date and time FPM has started; +; start since - number of seconds since FPM has started; +; accepted conn - the number of request accepted by the pool; +; listen queue - the number of request in the queue of pending +; connections (see backlog in listen(2)); +; max listen queue - the maximum number of requests in the queue +; of pending connections since FPM has started; +; listen queue len - the size of the socket queue of pending connections; +; idle processes - the number of idle processes; +; active processes - the number of active processes; +; total processes - the number of idle + active processes; +; max active processes - the maximum number of active processes since FPM +; has started; +; max children reached - number of times, the process limit has been reached, +; when pm tries to start more children (works only for +; pm 'dynamic' and 'ondemand'); +; Value are updated in real time. +; Example output: +; pool: www +; process manager: static +; start time: 01/Jul/2011:17:53:49 +0200 +; start since: 62636 +; accepted conn: 190460 +; listen queue: 0 +; max listen queue: 1 +; listen queue len: 42 +; idle processes: 4 +; active processes: 11 +; total processes: 15 +; max active processes: 12 +; max children reached: 0 +; +; By default the status page output is formatted as text/plain. Passing either +; 'html', 'xml' or 'json' in the query string will return the corresponding +; output syntax. Example: +; http://www.foo.bar/status +; http://www.foo.bar/status?json +; http://www.foo.bar/status?html +; http://www.foo.bar/status?xml +; +; By default the status page only outputs short status. Passing 'full' in the +; query string will also return status for each pool process. +; Example: +; http://www.foo.bar/status?full +; http://www.foo.bar/status?json&full +; http://www.foo.bar/status?html&full +; http://www.foo.bar/status?xml&full +; The Full status returns for each process: +; pid - the PID of the process; +; state - the state of the process (Idle, Running, ...); +; start time - the date and time the process has started; +; start since - the number of seconds since the process has started; +; requests - the number of requests the process has served; +; request duration - the duration in µs of the requests; +; request method - the request method (GET, POST, ...); +; request URI - the request URI with the query string; +; content length - the content length of the request (only with POST); +; user - the user (PHP_AUTH_USER) (or '-' if not set); +; script - the main script called (or '-' if not set); +; last request cpu - the %cpu the last request consumed +; it's always 0 if the process is not in Idle state +; because CPU calculation is done when the request +; processing has terminated; +; last request memory - the max amount of memory the last request consumed +; it's always 0 if the process is not in Idle state +; because memory calculation is done when the request +; processing has terminated; +; If the process is in Idle state, then informations are related to the +; last request the process has served. Otherwise informations are related to +; the current request being served. +; Example output: +; ************************ +; pid: 31330 +; state: Running +; start time: 01/Jul/2011:17:53:49 +0200 +; start since: 63087 +; requests: 12808 +; request duration: 1250261 +; request method: GET +; request URI: /test_mem.php?N=10000 +; content length: 0 +; user: - +; script: /home/fat/web/docs/php/test_mem.php +; last request cpu: 0.00 +; last request memory: 0 +; +; Note: There is a real-time FPM status monitoring sample web page available +; It's available in: /usr/share/php/7.0/fpm/status.html +; +; Note: The value must start with a leading slash (/). The value can be +; anything, but it may not be a good idea to use the .php extension or it +; may conflict with a real PHP file. +; Default Value: not set +;pm.status_path = /status + +; The ping URI to call the monitoring page of FPM. If this value is not set, no +; URI will be recognized as a ping page. This could be used to test from outside +; that FPM is alive and responding, or to +; - create a graph of FPM availability (rrd or such); +; - remove a server from a group if it is not responding (load balancing); +; - trigger alerts for the operating team (24/7). +; Note: The value must start with a leading slash (/). The value can be +; anything, but it may not be a good idea to use the .php extension or it +; may conflict with a real PHP file. +; Default Value: not set +;ping.path = /ping + +; This directive may be used to customize the response of a ping request. The +; response is formatted as text/plain with a 200 response code. +; Default Value: pong +;ping.response = pong + +; The access log file +; Default: not set +;access.log = log/$pool.access.log + +; The access log format. +; The following syntax is allowed +; %%: the '%' character +; %C: %CPU used by the request +; it can accept the following format: +; - %{user}C for user CPU only +; - %{system}C for system CPU only +; - %{total}C for user + system CPU (default) +; %d: time taken to serve the request +; it can accept the following format: +; - %{seconds}d (default) +; - %{miliseconds}d +; - %{mili}d +; - %{microseconds}d +; - %{micro}d +; %e: an environment variable (same as $_ENV or $_SERVER) +; it must be associated with embraces to specify the name of the env +; variable. Some exemples: +; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e +; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e +; %f: script filename +; %l: content-length of the request (for POST request only) +; %m: request method +; %M: peak of memory allocated by PHP +; it can accept the following format: +; - %{bytes}M (default) +; - %{kilobytes}M +; - %{kilo}M +; - %{megabytes}M +; - %{mega}M +; %n: pool name +; %o: output header +; it must be associated with embraces to specify the name of the header: +; - %{Content-Type}o +; - %{X-Powered-By}o +; - %{Transfert-Encoding}o +; - .... +; %p: PID of the child that serviced the request +; %P: PID of the parent of the child that serviced the request +; %q: the query string +; %Q: the '?' character if query string exists +; %r: the request URI (without the query string, see %q and %Q) +; %R: remote IP address +; %s: status (response code) +; %t: server time the request was received +; it can accept a strftime(3) format: +; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsuled in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t +; %T: time the log has been written (the request has finished) +; it can accept a strftime(3) format: +; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsuled in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t +; %u: remote user +; +; Default: "%R - %u %t \"%m %r\" %s" +;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" + +; The log file for slow requests +; Default Value: not set +; Note: slowlog is mandatory if request_slowlog_timeout is set +;slowlog = log/$pool.log.slow + +; The timeout for serving a single request after which a PHP backtrace will be +; dumped to the 'slowlog' file. A value of '0s' means 'off'. +; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) +; Default Value: 0 +;request_slowlog_timeout = 0 + +; The timeout for serving a single request after which the worker process will +; be killed. This option should be used when the 'max_execution_time' ini option +; does not stop script execution for some reason. A value of '0' means 'off'. +; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) +; Default Value: 0 +request_terminate_timeout = 1d + +; Set open file descriptor rlimit. +; Default Value: system defined value +;rlimit_files = 1024 + +; Set max core size rlimit. +; Possible Values: 'unlimited' or an integer greater or equal to 0 +; Default Value: system defined value +;rlimit_core = 0 + +; Chroot to this directory at the start. This value must be defined as an +; absolute path. When this value is not set, chroot is not used. +; Note: you can prefix with '$prefix' to chroot to the pool prefix or one +; of its subdirectories. If the pool prefix is not set, the global prefix +; will be used instead. +; Note: chrooting is a great security feature and should be used whenever +; possible. However, all PHP paths will be relative to the chroot +; (error_log, sessions.save_path, ...). +; Default Value: not set +;chroot = + +; Chdir to this directory at the start. +; Note: relative path can be used. +; Default Value: current directory or / when chroot +chdir = __FINALPATH__ + +; Redirect worker stdout and stderr into main error log. If not set, stdout and +; stderr will be redirected to /dev/null according to FastCGI specs. +; Note: on highloaded environement, this can cause some delay in the page +; process time (several ms). +; Default Value: no +;catch_workers_output = yes + +; Clear environment in FPM workers +; Prevents arbitrary environment variables from reaching FPM worker processes +; by clearing the environment in workers before env vars specified in this +; pool configuration are added. +; Setting to "no" will make all environment variables available to PHP code +; via getenv(), $_ENV and $_SERVER. +; Default Value: yes +;clear_env = no + +; Limits the extensions of the main script FPM will allow to parse. This can +; prevent configuration mistakes on the web server side. You should only limit +; FPM to .php extensions to prevent malicious users to use other extensions to +; execute php code. +; Note: set an empty value to allow all extensions. +; Default Value: .php +;security.limit_extensions = .php .php3 .php4 .php5 .php7 + +; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from +; the current environment. +; Default Value: clean env +;env[HOSTNAME] = $HOSTNAME +;env[PATH] = /usr/local/bin:/usr/bin:/bin +;env[TMP] = /tmp +;env[TMPDIR] = /tmp +;env[TEMP] = /tmp + +; Additional php.ini defines, specific to this pool of workers. These settings +; overwrite the values previously defined in the php.ini. The directives are the +; same as the PHP SAPI: +; php_value/php_flag - you can set classic ini defines which can +; be overwritten from PHP call 'ini_set'. +; php_admin_value/php_admin_flag - these directives won't be overwritten by +; PHP call 'ini_set' +; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no. + +; Defining 'extension' will load the corresponding shared extension from +; extension_dir. Defining 'disable_functions' or 'disable_classes' will not +; overwrite previously defined php.ini values, but will append the new value +; instead. + +; Note: path INI options can be relative and will be expanded with the prefix +; (pool, global or /usr) + +; Default Value: nothing is defined by default except the values in php.ini and +; specified at startup with the -d argument +;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com +;php_flag[display_errors] = off +;php_admin_value[error_log] = /var/log/fpm-php.www.log +;php_admin_flag[log_errors] = on +;php_admin_value[memory_limit] = 32M + +; Common values to change to increase file upload limit +; php_admin_value[upload_max_filesize] = 50M +; php_admin_value[post_max_size] = 50M +; php_admin_flag[mail.add_x_header] = Off + +; Other common parameters +; php_admin_value[max_execution_time] = 600 +; php_admin_value[max_input_time] = 300 +php_admin_value[memory_limit] = 256M +; php_admin_flag[short_open_tag] = On diff --git a/scripts/change_url b/scripts/change_url new file mode 100644 index 0000000..c6cfed0 --- /dev/null +++ b/scripts/change_url @@ -0,0 +1,105 @@ +#!/bin/bash + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# RETRIEVE ARGUMENTS +#================================================= + +old_domain=$YNH_APP_OLD_DOMAIN +old_path=$YNH_APP_OLD_PATH + +new_domain=$YNH_APP_NEW_DOMAIN +new_path=$YNH_APP_NEW_PATH + +app=$YNH_APP_INSTANCE_NAME + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 + +# Needed for helper "ynh_add_nginx_config" +final_path=$(ynh_app_setting_get --app=$app --key=final_path) + +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --weight=1 + +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + # Remove the new domain config file, the remove script won't do it as it doesn't know yet its location. + ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" + + # Restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# CHECK WHICH PARTS SHOULD BE CHANGED +#================================================= + +change_domain=0 +if [ "$old_domain" != "$new_domain" ] +then + change_domain=1 +fi + +change_path=0 +if [ "$old_path" != "$new_path" ] +then + change_path=1 +fi + +#================================================= +# MODIFY URL IN NGINX CONF +#================================================= +ynh_script_progression --message="Updating NGINX web server configuration..." --weight=3 + +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 + +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Change of URL completed for $app" --last From 48ec38f4ff8a23dc9c53085317faa61b5cc0bf81 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 9 Dec 2020 12:15:22 +0100 Subject: [PATCH 007/150] Update php-fpm.conf --- conf/php-fpm.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf index 9b2ecce..a02d3bb 100644 --- a/conf/php-fpm.conf +++ b/conf/php-fpm.conf @@ -420,7 +420,7 @@ chdir = __FINALPATH__ ; Common values to change to increase file upload limit ; php_admin_value[upload_max_filesize] = 50M -; php_admin_value[post_max_size] = 50M +php_admin_value[post_max_size] = 50M ; php_admin_flag[mail.add_x_header] = Off ; Other common parameters From 2ca13aad4d58fa18ebfce44ccc679bcd15aa1749 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 9 Dec 2020 12:16:01 +0100 Subject: [PATCH 008/150] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 6f18a0c..5c080f8 100755 --- a/scripts/install +++ b/scripts/install @@ -174,7 +174,7 @@ Please open your $app domain: https://$domain$path_url Complete the registration process from the setup page displayed. Details for mysql database to be enterted while registration process: Database login: $app -Database name: $app +Database name: $app Database password: $db_pwd If you are facing any problem or want to improve this app, please open a new issue here: https://github.com/YunoHost-Apps/matomo_ynh/issues" From a9b6294269cd4017dac3f0a2a1625fd215107e67 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 9 Dec 2020 12:57:21 +0100 Subject: [PATCH 009/150] Update install --- scripts/install | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/install b/scripts/install index 5c080f8..6eb4f78 100755 --- a/scripts/install +++ b/scripts/install @@ -169,12 +169,12 @@ ynh_systemd_action --service_name=nginx --action=reload #================================================= ynh_script_progression --message="Sending a readme for the admin..." -message=" $app was successfully installed :) +message="Matomo was successfully installed :) Please open your $app domain: https://$domain$path_url Complete the registration process from the setup page displayed. Details for mysql database to be enterted while registration process: -Database login: $app -Database name: $app +Database login: $app +Database name: $app Database password: $db_pwd If you are facing any problem or want to improve this app, please open a new issue here: https://github.com/YunoHost-Apps/matomo_ynh/issues" From 3bf27f6e091a4bdd205cf4a660dc25c3c41f519b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 9 Dec 2020 19:12:56 +0100 Subject: [PATCH 010/150] cron --- conf/cron | 2 +- scripts/install | 29 ++++------------------------- 2 files changed, 5 insertions(+), 26 deletions(-) diff --git a/conf/cron b/conf/cron index 8e8ce50..8d0c5c3 100644 --- a/conf/cron +++ b/conf/cron @@ -1,2 +1,2 @@ MAILTO="admin" -5 * * * * __USER__ /usr/bin/php YNH_WWW_PATH/console core:archive --url=https://__DOMAIN__/__PATH__ > /dev/null +5 * * * * __USER__ /usr/bin/php__PHPVERSION__ __FINALPATH__/console core:archive --url=https://__DOMAIN__/__PATH__ > /dev/null diff --git a/scripts/install b/scripts/install index 6eb4f78..c4061ad 100755 --- a/scripts/install +++ b/scripts/install @@ -96,7 +96,7 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # INSTALL COMPOSER AND DEPENDENCIES #================================================= -ynh_script_progression --message="Installing composer and dependencies..." +ynh_script_progression --message="Installing Composer and dependencies..." ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" @@ -105,35 +105,14 @@ ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" #================================================= ynh_script_progression --message="Setuping a cron..." -ynh_replace_string --match_string="YNH_WWW_PATH" --replace_string="$final_path" --target_file="../conf/cron" +ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="../conf/cron" ynh_replace_string --match_string="__USER__" --replace_string="$app" --target_file="../conf/cron" ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="../conf/cron" ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="../conf/cron" +ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="../conf/cron" + cp -f ../conf/cron /etc/cron.d/$app -#================================================= -# MODIFY A CONFIG FILE (TO DO: Automate install) -#================================================= -ynh_script_progression --message="Modifying a config file..." - -### `ynh_replace_string` is used to replace a string in a file. -### (It's compatible with sed regular expressions syntax) -## cp -f ../conf/config.ini.php "$final_path/config/config.ini.php" -## ynh_replace_string "__DB__" "$db_name" "$final_path/config/config.ini.php" -## ynh_replace_string "__DB_PASSWORD__" "$db_pwd" "$final_path/config/config.ini.php" - -#================================================= -# STORE THE CONFIG FILE CHECKSUM -#================================================= -ynh_script_progression --message="Storing the config file checksum..." - -### `ynh_store_file_checksum` is used to store the checksum of a file. -### That way, during the upgrade script, by using `ynh_backup_if_checksum_is_different`, -### you can make a backup of this file before modifying it again if the admin had modified it. - -# Calculate and store the config file checksum into the app settings -## ynh_store_file_checksum --file="$final_path/CONFIG_FILE" - #================================================= # GENERIC FINALIZATION #================================================= From 79265a89c411d9059b2565dceeed40c40ae95d8f Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 10 Dec 2020 12:30:54 +0100 Subject: [PATCH 011/150] Update upgrade --- scripts/upgrade | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/scripts/upgrade b/scripts/upgrade index 6f892f9..16a09d9 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -80,8 +80,28 @@ if [ "$upgrade_type" == "UPGRADE_APP" ] then ynh_script_progression --message="Upgrading source files..." + # Create a temporary directory + tmpdir="$(mktemp -d)" + # Backup the config file in the temp dir + cp -a "$final_path/config/config.ini.php" "$tmpdir/config.ini.php" + + # 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.ini.php" "$final_path/config/config.ini.php" + + # Remove the tmp directory securely + ynh_secure_remove --file="$tmpdir" + + pushd "$final_path" + chown -R $app: $final_path/tmp/* + ./console core:update + popd + fi #================================================= From fea14fc6b519adee666276a1366599919a08588c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 10 Dec 2020 12:31:54 +0100 Subject: [PATCH 012/150] Fix --- conf/cron | 2 +- scripts/install | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/cron b/conf/cron index 8d0c5c3..8ac1ec4 100644 --- a/conf/cron +++ b/conf/cron @@ -1,2 +1,2 @@ MAILTO="admin" -5 * * * * __USER__ /usr/bin/php__PHPVERSION__ __FINALPATH__/console core:archive --url=https://__DOMAIN__/__PATH__ > /dev/null +5 * * * * __APP__ /usr/bin/php__PHPVERSION__ __FINALPATH__/console core:archive --url=https://__DOMAIN__/__PATH__ > /dev/null diff --git a/scripts/install b/scripts/install index c4061ad..e32c5e8 100755 --- a/scripts/install +++ b/scripts/install @@ -106,7 +106,7 @@ ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" ynh_script_progression --message="Setuping a cron..." ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="../conf/cron" -ynh_replace_string --match_string="__USER__" --replace_string="$app" --target_file="../conf/cron" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="../conf/cron" ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="../conf/cron" ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="../conf/cron" ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="../conf/cron" From 24e4ff178ef7a7c274daa7031ddd6b4fe12275ee Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 10 Dec 2020 12:34:18 +0100 Subject: [PATCH 013/150] Add PHP variable to cron --- conf/cron | 2 +- scripts/install | 2 +- scripts/upgrade | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/conf/cron b/conf/cron index 8d0c5c3..8ac1ec4 100644 --- a/conf/cron +++ b/conf/cron @@ -1,2 +1,2 @@ MAILTO="admin" -5 * * * * __USER__ /usr/bin/php__PHPVERSION__ __FINALPATH__/console core:archive --url=https://__DOMAIN__/__PATH__ > /dev/null +5 * * * * __APP__ /usr/bin/php__PHPVERSION__ __FINALPATH__/console core:archive --url=https://__DOMAIN__/__PATH__ > /dev/null diff --git a/scripts/install b/scripts/install index c4061ad..e32c5e8 100755 --- a/scripts/install +++ b/scripts/install @@ -106,7 +106,7 @@ ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" ynh_script_progression --message="Setuping a cron..." ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="../conf/cron" -ynh_replace_string --match_string="__USER__" --replace_string="$app" --target_file="../conf/cron" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="../conf/cron" ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="../conf/cron" ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="../conf/cron" ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="../conf/cron" diff --git a/scripts/upgrade b/scripts/upgrade index 6f892f9..9e5186b 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -123,10 +123,11 @@ ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" #================================================= ynh_script_progression --message="Setuping a cron..." -ynh_replace_string --match_string="YNH_WWW_PATH" --replace_string="$final_path" --target_file="../conf/cron" -ynh_replace_string --match_string="__USER__" --replace_string="$app" --target_file="../conf/cron" +ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="../conf/cron" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="../conf/cron" ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="../conf/cron" ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="../conf/cron" +ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="../conf/cron" cp -f ../conf/cron /etc/cron.d/$app #================================================= From e46983358119443cd87f38daa8fb8fc2dd4a3334 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 10 Dec 2020 12:45:17 +0100 Subject: [PATCH 014/150] Update cron --- conf/cron | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/cron b/conf/cron index 8ac1ec4..02900b9 100644 --- a/conf/cron +++ b/conf/cron @@ -1,2 +1,2 @@ MAILTO="admin" -5 * * * * __APP__ /usr/bin/php__PHPVERSION__ __FINALPATH__/console core:archive --url=https://__DOMAIN__/__PATH__ > /dev/null +5 * * * * __APP__ /usr/bin/php__PHPVERSION__ __FINALPATH__/console core:archive --url=https://__DOMAIN____PATH__ > /dev/null From 28174b3582a79261918cca9bf0554680bb66b61a Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 10 Dec 2020 14:12:24 +0100 Subject: [PATCH 015/150] Add extra_php-fpm.conf --- conf/extra_php-fpm.conf | 5 + conf/php-fpm.conf | 430 ---------------------------------------- scripts/_common.sh | 16 ++ scripts/upgrade | 8 +- 4 files changed, 24 insertions(+), 435 deletions(-) create mode 100644 conf/extra_php-fpm.conf delete mode 100644 conf/php-fpm.conf diff --git a/conf/extra_php-fpm.conf b/conf/extra_php-fpm.conf new file mode 100644 index 0000000..c93210e --- /dev/null +++ b/conf/extra_php-fpm.conf @@ -0,0 +1,5 @@ +; Additional php.ini defines, specific to this pool of workers. + +php_admin_value[upload_max_filesize] = 50M +php_admin_value[memory_limit] = 64M +php_admin_value[post_max_size] = 50M diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf deleted file mode 100644 index a02d3bb..0000000 --- a/conf/php-fpm.conf +++ /dev/null @@ -1,430 +0,0 @@ -; Start a new pool named 'www'. -; the variable $pool can be used in any directive and will be replaced by the -; pool name ('www' here) -[__NAMETOCHANGE__] - -; Per pool prefix -; It only applies on the following directives: -; - 'access.log' -; - 'slowlog' -; - 'listen' (unixsocket) -; - 'chroot' -; - 'chdir' -; - 'php_values' -; - 'php_admin_values' -; When not set, the global prefix (or /usr) applies instead. -; Note: This directive can also be relative to the global prefix. -; Default Value: none -;prefix = /path/to/pools/$pool - -; Unix user/group of processes -; Note: The user is mandatory. If the group is not set, the default user's group -; will be used. -user = __USER__ -group = __USER__ - -; The address on which to accept FastCGI requests. -; Valid syntaxes are: -; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on -; a specific port; -; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on -; a specific port; -; 'port' - to listen on a TCP socket to all addresses -; (IPv6 and IPv4-mapped) on a specific port; -; '/path/to/unix/socket' - to listen on a unix socket. -; Note: This value is mandatory. -listen = /var/run/php/php__PHPVERSION__-fpm-__NAMETOCHANGE__.sock - -; Set listen(2) backlog. -; Default Value: 511 (-1 on FreeBSD and OpenBSD) -;listen.backlog = 511 - -; Set permissions for unix socket, if one is used. In Linux, read/write -; permissions must be set in order to allow connections from a web server. Many -; BSD-derived systems allow connections regardless of permissions. -; Default Values: user and group are set as the running user -; mode is set to 0660 -listen.owner = www-data -listen.group = www-data -;listen.mode = 0660 -; When POSIX Access Control Lists are supported you can set them using -; these options, value is a comma separated list of user/group names. -; When set, listen.owner and listen.group are ignored -;listen.acl_users = -;listen.acl_groups = - -; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. -; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original -; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address -; must be separated by a comma. If this value is left blank, connections will be -; accepted from any ip address. -; Default Value: any -;listen.allowed_clients = 127.0.0.1 - -; Specify the nice(2) priority to apply to the pool processes (only if set) -; The value can vary from -19 (highest priority) to 20 (lower priority) -; Note: - It will only work if the FPM master process is launched as root -; - The pool processes will inherit the master process priority -; unless it specified otherwise -; Default Value: no set -; process.priority = -19 - -; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user -; or group is differrent than the master process user. It allows to create process -; core dump and ptrace the process for the pool user. -; Default Value: no -; process.dumpable = yes - -; Choose how the process manager will control the number of child processes. -; Possible Values: -; static - a fixed number (pm.max_children) of child processes; -; dynamic - the number of child processes are set dynamically based on the -; following directives. With this process management, there will be -; always at least 1 children. -; pm.max_children - the maximum number of children that can -; be alive at the same time. -; pm.start_servers - the number of children created on startup. -; pm.min_spare_servers - the minimum number of children in 'idle' -; state (waiting to process). If the number -; of 'idle' processes is less than this -; number then some children will be created. -; pm.max_spare_servers - the maximum number of children in 'idle' -; state (waiting to process). If the number -; of 'idle' processes is greater than this -; number then some children will be killed. -; ondemand - no children are created at startup. Children will be forked when -; new requests will connect. The following parameter are used: -; pm.max_children - the maximum number of children that -; can be alive at the same time. -; pm.process_idle_timeout - The number of seconds after which -; an idle process will be killed. -; Note: This value is mandatory. -pm = dynamic - -; The number of child processes to be created when pm is set to 'static' and the -; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. -; This value sets the limit on the number of simultaneous requests that will be -; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. -; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP -; CGI. The below defaults are based on a server without much resources. Don't -; forget to tweak pm.* to fit your needs. -; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' -; Note: This value is mandatory. -pm.max_children = 5 - -; The number of child processes created on startup. -; Note: Used only when pm is set to 'dynamic' -; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 -pm.start_servers = 2 - -; The desired minimum number of idle server processes. -; Note: Used only when pm is set to 'dynamic' -; Note: Mandatory when pm is set to 'dynamic' -pm.min_spare_servers = 1 - -; The desired maximum number of idle server processes. -; Note: Used only when pm is set to 'dynamic' -; Note: Mandatory when pm is set to 'dynamic' -pm.max_spare_servers = 3 - -; The number of seconds after which an idle process will be killed. -; Note: Used only when pm is set to 'ondemand' -; Default Value: 10s -;pm.process_idle_timeout = 10s; - -; The number of requests each child process should execute before respawning. -; This can be useful to work around memory leaks in 3rd party libraries. For -; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. -; Default Value: 0 -;pm.max_requests = 500 - -; The URI to view the FPM status page. If this value is not set, no URI will be -; recognized as a status page. It shows the following informations: -; pool - the name of the pool; -; process manager - static, dynamic or ondemand; -; start time - the date and time FPM has started; -; start since - number of seconds since FPM has started; -; accepted conn - the number of request accepted by the pool; -; listen queue - the number of request in the queue of pending -; connections (see backlog in listen(2)); -; max listen queue - the maximum number of requests in the queue -; of pending connections since FPM has started; -; listen queue len - the size of the socket queue of pending connections; -; idle processes - the number of idle processes; -; active processes - the number of active processes; -; total processes - the number of idle + active processes; -; max active processes - the maximum number of active processes since FPM -; has started; -; max children reached - number of times, the process limit has been reached, -; when pm tries to start more children (works only for -; pm 'dynamic' and 'ondemand'); -; Value are updated in real time. -; Example output: -; pool: www -; process manager: static -; start time: 01/Jul/2011:17:53:49 +0200 -; start since: 62636 -; accepted conn: 190460 -; listen queue: 0 -; max listen queue: 1 -; listen queue len: 42 -; idle processes: 4 -; active processes: 11 -; total processes: 15 -; max active processes: 12 -; max children reached: 0 -; -; By default the status page output is formatted as text/plain. Passing either -; 'html', 'xml' or 'json' in the query string will return the corresponding -; output syntax. Example: -; http://www.foo.bar/status -; http://www.foo.bar/status?json -; http://www.foo.bar/status?html -; http://www.foo.bar/status?xml -; -; By default the status page only outputs short status. Passing 'full' in the -; query string will also return status for each pool process. -; Example: -; http://www.foo.bar/status?full -; http://www.foo.bar/status?json&full -; http://www.foo.bar/status?html&full -; http://www.foo.bar/status?xml&full -; The Full status returns for each process: -; pid - the PID of the process; -; state - the state of the process (Idle, Running, ...); -; start time - the date and time the process has started; -; start since - the number of seconds since the process has started; -; requests - the number of requests the process has served; -; request duration - the duration in µs of the requests; -; request method - the request method (GET, POST, ...); -; request URI - the request URI with the query string; -; content length - the content length of the request (only with POST); -; user - the user (PHP_AUTH_USER) (or '-' if not set); -; script - the main script called (or '-' if not set); -; last request cpu - the %cpu the last request consumed -; it's always 0 if the process is not in Idle state -; because CPU calculation is done when the request -; processing has terminated; -; last request memory - the max amount of memory the last request consumed -; it's always 0 if the process is not in Idle state -; because memory calculation is done when the request -; processing has terminated; -; If the process is in Idle state, then informations are related to the -; last request the process has served. Otherwise informations are related to -; the current request being served. -; Example output: -; ************************ -; pid: 31330 -; state: Running -; start time: 01/Jul/2011:17:53:49 +0200 -; start since: 63087 -; requests: 12808 -; request duration: 1250261 -; request method: GET -; request URI: /test_mem.php?N=10000 -; content length: 0 -; user: - -; script: /home/fat/web/docs/php/test_mem.php -; last request cpu: 0.00 -; last request memory: 0 -; -; Note: There is a real-time FPM status monitoring sample web page available -; It's available in: /usr/share/php/7.0/fpm/status.html -; -; Note: The value must start with a leading slash (/). The value can be -; anything, but it may not be a good idea to use the .php extension or it -; may conflict with a real PHP file. -; Default Value: not set -;pm.status_path = /status - -; The ping URI to call the monitoring page of FPM. If this value is not set, no -; URI will be recognized as a ping page. This could be used to test from outside -; that FPM is alive and responding, or to -; - create a graph of FPM availability (rrd or such); -; - remove a server from a group if it is not responding (load balancing); -; - trigger alerts for the operating team (24/7). -; Note: The value must start with a leading slash (/). The value can be -; anything, but it may not be a good idea to use the .php extension or it -; may conflict with a real PHP file. -; Default Value: not set -;ping.path = /ping - -; This directive may be used to customize the response of a ping request. The -; response is formatted as text/plain with a 200 response code. -; Default Value: pong -;ping.response = pong - -; The access log file -; Default: not set -;access.log = log/$pool.access.log - -; The access log format. -; The following syntax is allowed -; %%: the '%' character -; %C: %CPU used by the request -; it can accept the following format: -; - %{user}C for user CPU only -; - %{system}C for system CPU only -; - %{total}C for user + system CPU (default) -; %d: time taken to serve the request -; it can accept the following format: -; - %{seconds}d (default) -; - %{miliseconds}d -; - %{mili}d -; - %{microseconds}d -; - %{micro}d -; %e: an environment variable (same as $_ENV or $_SERVER) -; it must be associated with embraces to specify the name of the env -; variable. Some exemples: -; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e -; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e -; %f: script filename -; %l: content-length of the request (for POST request only) -; %m: request method -; %M: peak of memory allocated by PHP -; it can accept the following format: -; - %{bytes}M (default) -; - %{kilobytes}M -; - %{kilo}M -; - %{megabytes}M -; - %{mega}M -; %n: pool name -; %o: output header -; it must be associated with embraces to specify the name of the header: -; - %{Content-Type}o -; - %{X-Powered-By}o -; - %{Transfert-Encoding}o -; - .... -; %p: PID of the child that serviced the request -; %P: PID of the parent of the child that serviced the request -; %q: the query string -; %Q: the '?' character if query string exists -; %r: the request URI (without the query string, see %q and %Q) -; %R: remote IP address -; %s: status (response code) -; %t: server time the request was received -; it can accept a strftime(3) format: -; %d/%b/%Y:%H:%M:%S %z (default) -; The strftime(3) format must be encapsuled in a %{}t tag -; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t -; %T: time the log has been written (the request has finished) -; it can accept a strftime(3) format: -; %d/%b/%Y:%H:%M:%S %z (default) -; The strftime(3) format must be encapsuled in a %{}t tag -; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t -; %u: remote user -; -; Default: "%R - %u %t \"%m %r\" %s" -;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" - -; The log file for slow requests -; Default Value: not set -; Note: slowlog is mandatory if request_slowlog_timeout is set -;slowlog = log/$pool.log.slow - -; The timeout for serving a single request after which a PHP backtrace will be -; dumped to the 'slowlog' file. A value of '0s' means 'off'. -; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) -; Default Value: 0 -;request_slowlog_timeout = 0 - -; The timeout for serving a single request after which the worker process will -; be killed. This option should be used when the 'max_execution_time' ini option -; does not stop script execution for some reason. A value of '0' means 'off'. -; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) -; Default Value: 0 -request_terminate_timeout = 1d - -; Set open file descriptor rlimit. -; Default Value: system defined value -;rlimit_files = 1024 - -; Set max core size rlimit. -; Possible Values: 'unlimited' or an integer greater or equal to 0 -; Default Value: system defined value -;rlimit_core = 0 - -; Chroot to this directory at the start. This value must be defined as an -; absolute path. When this value is not set, chroot is not used. -; Note: you can prefix with '$prefix' to chroot to the pool prefix or one -; of its subdirectories. If the pool prefix is not set, the global prefix -; will be used instead. -; Note: chrooting is a great security feature and should be used whenever -; possible. However, all PHP paths will be relative to the chroot -; (error_log, sessions.save_path, ...). -; Default Value: not set -;chroot = - -; Chdir to this directory at the start. -; Note: relative path can be used. -; Default Value: current directory or / when chroot -chdir = __FINALPATH__ - -; Redirect worker stdout and stderr into main error log. If not set, stdout and -; stderr will be redirected to /dev/null according to FastCGI specs. -; Note: on highloaded environement, this can cause some delay in the page -; process time (several ms). -; Default Value: no -;catch_workers_output = yes - -; Clear environment in FPM workers -; Prevents arbitrary environment variables from reaching FPM worker processes -; by clearing the environment in workers before env vars specified in this -; pool configuration are added. -; Setting to "no" will make all environment variables available to PHP code -; via getenv(), $_ENV and $_SERVER. -; Default Value: yes -;clear_env = no - -; Limits the extensions of the main script FPM will allow to parse. This can -; prevent configuration mistakes on the web server side. You should only limit -; FPM to .php extensions to prevent malicious users to use other extensions to -; execute php code. -; Note: set an empty value to allow all extensions. -; Default Value: .php -;security.limit_extensions = .php .php3 .php4 .php5 .php7 - -; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from -; the current environment. -; Default Value: clean env -;env[HOSTNAME] = $HOSTNAME -;env[PATH] = /usr/local/bin:/usr/bin:/bin -;env[TMP] = /tmp -;env[TMPDIR] = /tmp -;env[TEMP] = /tmp - -; Additional php.ini defines, specific to this pool of workers. These settings -; overwrite the values previously defined in the php.ini. The directives are the -; same as the PHP SAPI: -; php_value/php_flag - you can set classic ini defines which can -; be overwritten from PHP call 'ini_set'. -; php_admin_value/php_admin_flag - these directives won't be overwritten by -; PHP call 'ini_set' -; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no. - -; Defining 'extension' will load the corresponding shared extension from -; extension_dir. Defining 'disable_functions' or 'disable_classes' will not -; overwrite previously defined php.ini values, but will append the new value -; instead. - -; Note: path INI options can be relative and will be expanded with the prefix -; (pool, global or /usr) - -; Default Value: nothing is defined by default except the values in php.ini and -; specified at startup with the -d argument -;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com -;php_flag[display_errors] = off -;php_admin_value[error_log] = /var/log/fpm-php.www.log -;php_admin_flag[log_errors] = on -;php_admin_value[memory_limit] = 32M - -; Common values to change to increase file upload limit -; php_admin_value[upload_max_filesize] = 50M -php_admin_value[post_max_size] = 50M -; php_admin_flag[mail.add_x_header] = Off - -; Other common parameters -; php_admin_value[max_execution_time] = 600 -; php_admin_value[max_input_time] = 300 -php_admin_value[memory_limit] = 256M -; php_admin_flag[short_open_tag] = On diff --git a/scripts/_common.sh b/scripts/_common.sh index e932edf..c685199 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -76,3 +76,19 @@ $(yunohost tools diagnosis | grep -B 100 "services:" | sed '/services:/d')" # Send the email to the recipients echo "$mail_message" | $mail_bin -a "Content-Type: text/plain; charset=UTF-8" -s "$mail_subject" "$recipients" } + + + +# Execute a command as another user +# usage: ynh_exec_as USER COMMAND [ARG ...] +ynh_exec_as() { + local USER=$1 + shift 1 + + if [[ $USER = $(whoami) ]]; then + eval "$@" + else + sudo -u "$USER" "$@" + fi +} + diff --git a/scripts/upgrade b/scripts/upgrade index 4ac52c8..2c3c24c 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -97,11 +97,9 @@ then # Remove the tmp directory securely ynh_secure_remove --file="$tmpdir" - pushd "$final_path" - chown -R $app: $final_path/tmp/* - ./console core:update + pushd "$final_path/console" + ynh_exec_as $app core:update popd - fi #================================================= @@ -125,7 +123,7 @@ ynh_system_user_create --username=$app #================================================= ynh_script_progression --message="Upgrading PHP-FPM configuration..." -# Create a dedicated php-fpm config +# Create a dedicated PHP-FPM config ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencies" phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) From 406a21ea8f1a74b68e70d5ba4286ff44e920bd65 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 10 Dec 2020 14:13:28 +0100 Subject: [PATCH 016/150] Add extra_php-fpm.conf --- conf/extra_php-fpm.conf | 5 + conf/php-fpm.conf | 430 ---------------------------------------- 2 files changed, 5 insertions(+), 430 deletions(-) create mode 100644 conf/extra_php-fpm.conf delete mode 100644 conf/php-fpm.conf diff --git a/conf/extra_php-fpm.conf b/conf/extra_php-fpm.conf new file mode 100644 index 0000000..c93210e --- /dev/null +++ b/conf/extra_php-fpm.conf @@ -0,0 +1,5 @@ +; Additional php.ini defines, specific to this pool of workers. + +php_admin_value[upload_max_filesize] = 50M +php_admin_value[memory_limit] = 64M +php_admin_value[post_max_size] = 50M diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf deleted file mode 100644 index a02d3bb..0000000 --- a/conf/php-fpm.conf +++ /dev/null @@ -1,430 +0,0 @@ -; Start a new pool named 'www'. -; the variable $pool can be used in any directive and will be replaced by the -; pool name ('www' here) -[__NAMETOCHANGE__] - -; Per pool prefix -; It only applies on the following directives: -; - 'access.log' -; - 'slowlog' -; - 'listen' (unixsocket) -; - 'chroot' -; - 'chdir' -; - 'php_values' -; - 'php_admin_values' -; When not set, the global prefix (or /usr) applies instead. -; Note: This directive can also be relative to the global prefix. -; Default Value: none -;prefix = /path/to/pools/$pool - -; Unix user/group of processes -; Note: The user is mandatory. If the group is not set, the default user's group -; will be used. -user = __USER__ -group = __USER__ - -; The address on which to accept FastCGI requests. -; Valid syntaxes are: -; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on -; a specific port; -; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on -; a specific port; -; 'port' - to listen on a TCP socket to all addresses -; (IPv6 and IPv4-mapped) on a specific port; -; '/path/to/unix/socket' - to listen on a unix socket. -; Note: This value is mandatory. -listen = /var/run/php/php__PHPVERSION__-fpm-__NAMETOCHANGE__.sock - -; Set listen(2) backlog. -; Default Value: 511 (-1 on FreeBSD and OpenBSD) -;listen.backlog = 511 - -; Set permissions for unix socket, if one is used. In Linux, read/write -; permissions must be set in order to allow connections from a web server. Many -; BSD-derived systems allow connections regardless of permissions. -; Default Values: user and group are set as the running user -; mode is set to 0660 -listen.owner = www-data -listen.group = www-data -;listen.mode = 0660 -; When POSIX Access Control Lists are supported you can set them using -; these options, value is a comma separated list of user/group names. -; When set, listen.owner and listen.group are ignored -;listen.acl_users = -;listen.acl_groups = - -; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. -; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original -; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address -; must be separated by a comma. If this value is left blank, connections will be -; accepted from any ip address. -; Default Value: any -;listen.allowed_clients = 127.0.0.1 - -; Specify the nice(2) priority to apply to the pool processes (only if set) -; The value can vary from -19 (highest priority) to 20 (lower priority) -; Note: - It will only work if the FPM master process is launched as root -; - The pool processes will inherit the master process priority -; unless it specified otherwise -; Default Value: no set -; process.priority = -19 - -; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user -; or group is differrent than the master process user. It allows to create process -; core dump and ptrace the process for the pool user. -; Default Value: no -; process.dumpable = yes - -; Choose how the process manager will control the number of child processes. -; Possible Values: -; static - a fixed number (pm.max_children) of child processes; -; dynamic - the number of child processes are set dynamically based on the -; following directives. With this process management, there will be -; always at least 1 children. -; pm.max_children - the maximum number of children that can -; be alive at the same time. -; pm.start_servers - the number of children created on startup. -; pm.min_spare_servers - the minimum number of children in 'idle' -; state (waiting to process). If the number -; of 'idle' processes is less than this -; number then some children will be created. -; pm.max_spare_servers - the maximum number of children in 'idle' -; state (waiting to process). If the number -; of 'idle' processes is greater than this -; number then some children will be killed. -; ondemand - no children are created at startup. Children will be forked when -; new requests will connect. The following parameter are used: -; pm.max_children - the maximum number of children that -; can be alive at the same time. -; pm.process_idle_timeout - The number of seconds after which -; an idle process will be killed. -; Note: This value is mandatory. -pm = dynamic - -; The number of child processes to be created when pm is set to 'static' and the -; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. -; This value sets the limit on the number of simultaneous requests that will be -; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. -; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP -; CGI. The below defaults are based on a server without much resources. Don't -; forget to tweak pm.* to fit your needs. -; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' -; Note: This value is mandatory. -pm.max_children = 5 - -; The number of child processes created on startup. -; Note: Used only when pm is set to 'dynamic' -; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 -pm.start_servers = 2 - -; The desired minimum number of idle server processes. -; Note: Used only when pm is set to 'dynamic' -; Note: Mandatory when pm is set to 'dynamic' -pm.min_spare_servers = 1 - -; The desired maximum number of idle server processes. -; Note: Used only when pm is set to 'dynamic' -; Note: Mandatory when pm is set to 'dynamic' -pm.max_spare_servers = 3 - -; The number of seconds after which an idle process will be killed. -; Note: Used only when pm is set to 'ondemand' -; Default Value: 10s -;pm.process_idle_timeout = 10s; - -; The number of requests each child process should execute before respawning. -; This can be useful to work around memory leaks in 3rd party libraries. For -; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. -; Default Value: 0 -;pm.max_requests = 500 - -; The URI to view the FPM status page. If this value is not set, no URI will be -; recognized as a status page. It shows the following informations: -; pool - the name of the pool; -; process manager - static, dynamic or ondemand; -; start time - the date and time FPM has started; -; start since - number of seconds since FPM has started; -; accepted conn - the number of request accepted by the pool; -; listen queue - the number of request in the queue of pending -; connections (see backlog in listen(2)); -; max listen queue - the maximum number of requests in the queue -; of pending connections since FPM has started; -; listen queue len - the size of the socket queue of pending connections; -; idle processes - the number of idle processes; -; active processes - the number of active processes; -; total processes - the number of idle + active processes; -; max active processes - the maximum number of active processes since FPM -; has started; -; max children reached - number of times, the process limit has been reached, -; when pm tries to start more children (works only for -; pm 'dynamic' and 'ondemand'); -; Value are updated in real time. -; Example output: -; pool: www -; process manager: static -; start time: 01/Jul/2011:17:53:49 +0200 -; start since: 62636 -; accepted conn: 190460 -; listen queue: 0 -; max listen queue: 1 -; listen queue len: 42 -; idle processes: 4 -; active processes: 11 -; total processes: 15 -; max active processes: 12 -; max children reached: 0 -; -; By default the status page output is formatted as text/plain. Passing either -; 'html', 'xml' or 'json' in the query string will return the corresponding -; output syntax. Example: -; http://www.foo.bar/status -; http://www.foo.bar/status?json -; http://www.foo.bar/status?html -; http://www.foo.bar/status?xml -; -; By default the status page only outputs short status. Passing 'full' in the -; query string will also return status for each pool process. -; Example: -; http://www.foo.bar/status?full -; http://www.foo.bar/status?json&full -; http://www.foo.bar/status?html&full -; http://www.foo.bar/status?xml&full -; The Full status returns for each process: -; pid - the PID of the process; -; state - the state of the process (Idle, Running, ...); -; start time - the date and time the process has started; -; start since - the number of seconds since the process has started; -; requests - the number of requests the process has served; -; request duration - the duration in µs of the requests; -; request method - the request method (GET, POST, ...); -; request URI - the request URI with the query string; -; content length - the content length of the request (only with POST); -; user - the user (PHP_AUTH_USER) (or '-' if not set); -; script - the main script called (or '-' if not set); -; last request cpu - the %cpu the last request consumed -; it's always 0 if the process is not in Idle state -; because CPU calculation is done when the request -; processing has terminated; -; last request memory - the max amount of memory the last request consumed -; it's always 0 if the process is not in Idle state -; because memory calculation is done when the request -; processing has terminated; -; If the process is in Idle state, then informations are related to the -; last request the process has served. Otherwise informations are related to -; the current request being served. -; Example output: -; ************************ -; pid: 31330 -; state: Running -; start time: 01/Jul/2011:17:53:49 +0200 -; start since: 63087 -; requests: 12808 -; request duration: 1250261 -; request method: GET -; request URI: /test_mem.php?N=10000 -; content length: 0 -; user: - -; script: /home/fat/web/docs/php/test_mem.php -; last request cpu: 0.00 -; last request memory: 0 -; -; Note: There is a real-time FPM status monitoring sample web page available -; It's available in: /usr/share/php/7.0/fpm/status.html -; -; Note: The value must start with a leading slash (/). The value can be -; anything, but it may not be a good idea to use the .php extension or it -; may conflict with a real PHP file. -; Default Value: not set -;pm.status_path = /status - -; The ping URI to call the monitoring page of FPM. If this value is not set, no -; URI will be recognized as a ping page. This could be used to test from outside -; that FPM is alive and responding, or to -; - create a graph of FPM availability (rrd or such); -; - remove a server from a group if it is not responding (load balancing); -; - trigger alerts for the operating team (24/7). -; Note: The value must start with a leading slash (/). The value can be -; anything, but it may not be a good idea to use the .php extension or it -; may conflict with a real PHP file. -; Default Value: not set -;ping.path = /ping - -; This directive may be used to customize the response of a ping request. The -; response is formatted as text/plain with a 200 response code. -; Default Value: pong -;ping.response = pong - -; The access log file -; Default: not set -;access.log = log/$pool.access.log - -; The access log format. -; The following syntax is allowed -; %%: the '%' character -; %C: %CPU used by the request -; it can accept the following format: -; - %{user}C for user CPU only -; - %{system}C for system CPU only -; - %{total}C for user + system CPU (default) -; %d: time taken to serve the request -; it can accept the following format: -; - %{seconds}d (default) -; - %{miliseconds}d -; - %{mili}d -; - %{microseconds}d -; - %{micro}d -; %e: an environment variable (same as $_ENV or $_SERVER) -; it must be associated with embraces to specify the name of the env -; variable. Some exemples: -; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e -; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e -; %f: script filename -; %l: content-length of the request (for POST request only) -; %m: request method -; %M: peak of memory allocated by PHP -; it can accept the following format: -; - %{bytes}M (default) -; - %{kilobytes}M -; - %{kilo}M -; - %{megabytes}M -; - %{mega}M -; %n: pool name -; %o: output header -; it must be associated with embraces to specify the name of the header: -; - %{Content-Type}o -; - %{X-Powered-By}o -; - %{Transfert-Encoding}o -; - .... -; %p: PID of the child that serviced the request -; %P: PID of the parent of the child that serviced the request -; %q: the query string -; %Q: the '?' character if query string exists -; %r: the request URI (without the query string, see %q and %Q) -; %R: remote IP address -; %s: status (response code) -; %t: server time the request was received -; it can accept a strftime(3) format: -; %d/%b/%Y:%H:%M:%S %z (default) -; The strftime(3) format must be encapsuled in a %{}t tag -; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t -; %T: time the log has been written (the request has finished) -; it can accept a strftime(3) format: -; %d/%b/%Y:%H:%M:%S %z (default) -; The strftime(3) format must be encapsuled in a %{}t tag -; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t -; %u: remote user -; -; Default: "%R - %u %t \"%m %r\" %s" -;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" - -; The log file for slow requests -; Default Value: not set -; Note: slowlog is mandatory if request_slowlog_timeout is set -;slowlog = log/$pool.log.slow - -; The timeout for serving a single request after which a PHP backtrace will be -; dumped to the 'slowlog' file. A value of '0s' means 'off'. -; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) -; Default Value: 0 -;request_slowlog_timeout = 0 - -; The timeout for serving a single request after which the worker process will -; be killed. This option should be used when the 'max_execution_time' ini option -; does not stop script execution for some reason. A value of '0' means 'off'. -; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) -; Default Value: 0 -request_terminate_timeout = 1d - -; Set open file descriptor rlimit. -; Default Value: system defined value -;rlimit_files = 1024 - -; Set max core size rlimit. -; Possible Values: 'unlimited' or an integer greater or equal to 0 -; Default Value: system defined value -;rlimit_core = 0 - -; Chroot to this directory at the start. This value must be defined as an -; absolute path. When this value is not set, chroot is not used. -; Note: you can prefix with '$prefix' to chroot to the pool prefix or one -; of its subdirectories. If the pool prefix is not set, the global prefix -; will be used instead. -; Note: chrooting is a great security feature and should be used whenever -; possible. However, all PHP paths will be relative to the chroot -; (error_log, sessions.save_path, ...). -; Default Value: not set -;chroot = - -; Chdir to this directory at the start. -; Note: relative path can be used. -; Default Value: current directory or / when chroot -chdir = __FINALPATH__ - -; Redirect worker stdout and stderr into main error log. If not set, stdout and -; stderr will be redirected to /dev/null according to FastCGI specs. -; Note: on highloaded environement, this can cause some delay in the page -; process time (several ms). -; Default Value: no -;catch_workers_output = yes - -; Clear environment in FPM workers -; Prevents arbitrary environment variables from reaching FPM worker processes -; by clearing the environment in workers before env vars specified in this -; pool configuration are added. -; Setting to "no" will make all environment variables available to PHP code -; via getenv(), $_ENV and $_SERVER. -; Default Value: yes -;clear_env = no - -; Limits the extensions of the main script FPM will allow to parse. This can -; prevent configuration mistakes on the web server side. You should only limit -; FPM to .php extensions to prevent malicious users to use other extensions to -; execute php code. -; Note: set an empty value to allow all extensions. -; Default Value: .php -;security.limit_extensions = .php .php3 .php4 .php5 .php7 - -; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from -; the current environment. -; Default Value: clean env -;env[HOSTNAME] = $HOSTNAME -;env[PATH] = /usr/local/bin:/usr/bin:/bin -;env[TMP] = /tmp -;env[TMPDIR] = /tmp -;env[TEMP] = /tmp - -; Additional php.ini defines, specific to this pool of workers. These settings -; overwrite the values previously defined in the php.ini. The directives are the -; same as the PHP SAPI: -; php_value/php_flag - you can set classic ini defines which can -; be overwritten from PHP call 'ini_set'. -; php_admin_value/php_admin_flag - these directives won't be overwritten by -; PHP call 'ini_set' -; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no. - -; Defining 'extension' will load the corresponding shared extension from -; extension_dir. Defining 'disable_functions' or 'disable_classes' will not -; overwrite previously defined php.ini values, but will append the new value -; instead. - -; Note: path INI options can be relative and will be expanded with the prefix -; (pool, global or /usr) - -; Default Value: nothing is defined by default except the values in php.ini and -; specified at startup with the -d argument -;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com -;php_flag[display_errors] = off -;php_admin_value[error_log] = /var/log/fpm-php.www.log -;php_admin_flag[log_errors] = on -;php_admin_value[memory_limit] = 32M - -; Common values to change to increase file upload limit -; php_admin_value[upload_max_filesize] = 50M -php_admin_value[post_max_size] = 50M -; php_admin_flag[mail.add_x_header] = Off - -; Other common parameters -; php_admin_value[max_execution_time] = 600 -; php_admin_value[max_input_time] = 300 -php_admin_value[memory_limit] = 256M -; php_admin_flag[short_open_tag] = On From 4dc4201e8920acf9a480034da6125c93796e008a Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 10 Dec 2020 14:44:25 +0100 Subject: [PATCH 017/150] Increase memory_limit to 256M --- conf/extra_php-fpm.conf | 2 +- scripts/install | 2 +- scripts/restore | 2 +- scripts/upgrade | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/extra_php-fpm.conf b/conf/extra_php-fpm.conf index c93210e..00d1fad 100644 --- a/conf/extra_php-fpm.conf +++ b/conf/extra_php-fpm.conf @@ -1,5 +1,5 @@ ; Additional php.ini defines, specific to this pool of workers. php_admin_value[upload_max_filesize] = 50M -php_admin_value[memory_limit] = 64M +php_admin_value[memory_limit] = 256M php_admin_value[post_max_size] = 50M diff --git a/scripts/install b/scripts/install index e32c5e8..8115366 100755 --- a/scripts/install +++ b/scripts/install @@ -88,7 +88,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Configuring PHP-FPM..." # Create a dedicated PHP-FPM config -ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencies" +ynh_add_fpm_config --usage=low --footprint=medium --package="$extra_php_dependencies" phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= diff --git a/scripts/restore b/scripts/restore index 4a51b1d..37d0227 100755 --- a/scripts/restore +++ b/scripts/restore @@ -82,7 +82,7 @@ ynh_script_progression --message="Restoring PHP-FPM configuration..." ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" # Recreate a dedicated php-fpm config -ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencies" +ynh_add_fpm_config --usage=low --footprint=medium --package="$extra_php_dependencies" #================================================= # RESTORE THE MYSQL DATABASE diff --git a/scripts/upgrade b/scripts/upgrade index 9e5186b..8099e56 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -106,7 +106,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Upgrading PHP-FPM configuration..." # Create a dedicated php-fpm config -ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencies" +ynh_add_fpm_config --usage=low --footprint=medium --package="$extra_php_dependencies" phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= From b549545b59707ded9cf1286dd38b8fbe9989bbf6 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 10 Dec 2020 14:46:03 +0100 Subject: [PATCH 018/150] Set memory_limit to 256M --- conf/extra_php-fpm.conf | 2 +- scripts/install | 2 +- scripts/restore | 2 +- scripts/upgrade | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/extra_php-fpm.conf b/conf/extra_php-fpm.conf index c93210e..00d1fad 100644 --- a/conf/extra_php-fpm.conf +++ b/conf/extra_php-fpm.conf @@ -1,5 +1,5 @@ ; Additional php.ini defines, specific to this pool of workers. php_admin_value[upload_max_filesize] = 50M -php_admin_value[memory_limit] = 64M +php_admin_value[memory_limit] = 256M php_admin_value[post_max_size] = 50M diff --git a/scripts/install b/scripts/install index e32c5e8..8115366 100755 --- a/scripts/install +++ b/scripts/install @@ -88,7 +88,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Configuring PHP-FPM..." # Create a dedicated PHP-FPM config -ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencies" +ynh_add_fpm_config --usage=low --footprint=medium --package="$extra_php_dependencies" phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= diff --git a/scripts/restore b/scripts/restore index 4a51b1d..37d0227 100755 --- a/scripts/restore +++ b/scripts/restore @@ -82,7 +82,7 @@ ynh_script_progression --message="Restoring PHP-FPM configuration..." ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" # Recreate a dedicated php-fpm config -ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencies" +ynh_add_fpm_config --usage=low --footprint=medium --package="$extra_php_dependencies" #================================================= # RESTORE THE MYSQL DATABASE diff --git a/scripts/upgrade b/scripts/upgrade index 2c3c24c..1c2b90a 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -124,7 +124,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Upgrading PHP-FPM configuration..." # Create a dedicated PHP-FPM config -ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencies" +ynh_add_fpm_config --usage=low --footprint=medium --package="$extra_php_dependencies" phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= From db43bb992e5018e49d9177d714c97d273806289f Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 10 Dec 2020 14:46:26 +0100 Subject: [PATCH 019/150] Update manifest.json --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 35712cc..65b687d 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.0.5~ynh1", + "version": "4.0.5~ynh2", "url": "https://matomo.org", "license": "GPL-3.0-or-later", "maintainer": { From 32d3cbdec3c5aef214e6ec4def77caae48e1d54a Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 10:07:46 +0100 Subject: [PATCH 020/150] Try to fix php7.3 service fail... --- conf/extra_php-fpm.conf | 5 - conf/nginx.conf | 4 +- conf/php-fpm.conf | 430 ++++++++++++++++++++++++++++++++++++++++ issue_template.md | 2 +- manifest.json | 4 + scripts/install | 7 +- scripts/restore | 2 +- scripts/upgrade | 4 +- 8 files changed, 445 insertions(+), 13 deletions(-) delete mode 100644 conf/extra_php-fpm.conf create mode 100644 conf/php-fpm.conf diff --git a/conf/extra_php-fpm.conf b/conf/extra_php-fpm.conf deleted file mode 100644 index 00d1fad..0000000 --- a/conf/extra_php-fpm.conf +++ /dev/null @@ -1,5 +0,0 @@ -; Additional php.ini defines, specific to this pool of workers. - -php_admin_value[upload_max_filesize] = 50M -php_admin_value[memory_limit] = 256M -php_admin_value[post_max_size] = 50M diff --git a/conf/nginx.conf b/conf/nginx.conf index 556b622..b41ead3 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -11,8 +11,8 @@ location __PATH__/ { index index.php; - # Common parameter to increase upload size limit in conjunction with dedicated php-fpm file - #client_max_body_size 50M; + # Common parameter to increase upload size limit in conjunction with dedicated PHP-FPM file + client_max_body_size 100M; try_files $uri $uri/ index.php; location ~ [^/]\.php(/|$) { diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf new file mode 100644 index 0000000..69e3ca7 --- /dev/null +++ b/conf/php-fpm.conf @@ -0,0 +1,430 @@ +; Start a new pool named 'www'. +; the variable $pool can be used in any directive and will be replaced by the +; pool name ('www' here) +[__NAMETOCHANGE__] + +; Per pool prefix +; It only applies on the following directives: +; - 'access.log' +; - 'slowlog' +; - 'listen' (unixsocket) +; - 'chroot' +; - 'chdir' +; - 'php_values' +; - 'php_admin_values' +; When not set, the global prefix (or /usr) applies instead. +; Note: This directive can also be relative to the global prefix. +; Default Value: none +;prefix = /path/to/pools/$pool + +; Unix user/group of processes +; Note: The user is mandatory. If the group is not set, the default user's group +; will be used. +user = __USER__ +group = __USER__ + +; The address on which to accept FastCGI requests. +; Valid syntaxes are: +; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on +; a specific port; +; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on +; a specific port; +; 'port' - to listen on a TCP socket to all addresses +; (IPv6 and IPv4-mapped) on a specific port; +; '/path/to/unix/socket' - to listen on a unix socket. +; Note: This value is mandatory. +listen = /var/run/php/php__PHPVERSION__-fpm-__NAMETOCHANGE__.sock + +; Set listen(2) backlog. +; Default Value: 511 (-1 on FreeBSD and OpenBSD) +;listen.backlog = 511 + +; Set permissions for unix socket, if one is used. In Linux, read/write +; permissions must be set in order to allow connections from a web server. Many +; BSD-derived systems allow connections regardless of permissions. +; Default Values: user and group are set as the running user +; mode is set to 0660 +listen.owner = www-data +listen.group = www-data +;listen.mode = 0660 +; When POSIX Access Control Lists are supported you can set them using +; these options, value is a comma separated list of user/group names. +; When set, listen.owner and listen.group are ignored +;listen.acl_users = +;listen.acl_groups = + +; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. +; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original +; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address +; must be separated by a comma. If this value is left blank, connections will be +; accepted from any ip address. +; Default Value: any +;listen.allowed_clients = 127.0.0.1 + +; Specify the nice(2) priority to apply to the pool processes (only if set) +; The value can vary from -19 (highest priority) to 20 (lower priority) +; Note: - It will only work if the FPM master process is launched as root +; - The pool processes will inherit the master process priority +; unless it specified otherwise +; Default Value: no set +; process.priority = -19 + +; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user +; or group is differrent than the master process user. It allows to create process +; core dump and ptrace the process for the pool user. +; Default Value: no +; process.dumpable = yes + +; Choose how the process manager will control the number of child processes. +; Possible Values: +; static - a fixed number (pm.max_children) of child processes; +; dynamic - the number of child processes are set dynamically based on the +; following directives. With this process management, there will be +; always at least 1 children. +; pm.max_children - the maximum number of children that can +; be alive at the same time. +; pm.start_servers - the number of children created on startup. +; pm.min_spare_servers - the minimum number of children in 'idle' +; state (waiting to process). If the number +; of 'idle' processes is less than this +; number then some children will be created. +; pm.max_spare_servers - the maximum number of children in 'idle' +; state (waiting to process). If the number +; of 'idle' processes is greater than this +; number then some children will be killed. +; ondemand - no children are created at startup. Children will be forked when +; new requests will connect. The following parameter are used: +; pm.max_children - the maximum number of children that +; can be alive at the same time. +; pm.process_idle_timeout - The number of seconds after which +; an idle process will be killed. +; Note: This value is mandatory. +pm = dynamic + +; The number of child processes to be created when pm is set to 'static' and the +; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. +; This value sets the limit on the number of simultaneous requests that will be +; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. +; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP +; CGI. The below defaults are based on a server without much resources. Don't +; forget to tweak pm.* to fit your needs. +; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' +; Note: This value is mandatory. +pm.max_children = 5 + +; The number of child processes created on startup. +; Note: Used only when pm is set to 'dynamic' +; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 +pm.start_servers = 2 + +; The desired minimum number of idle server processes. +; Note: Used only when pm is set to 'dynamic' +; Note: Mandatory when pm is set to 'dynamic' +pm.min_spare_servers = 1 + +; The desired maximum number of idle server processes. +; Note: Used only when pm is set to 'dynamic' +; Note: Mandatory when pm is set to 'dynamic' +pm.max_spare_servers = 3 + +; The number of seconds after which an idle process will be killed. +; Note: Used only when pm is set to 'ondemand' +; Default Value: 10s +;pm.process_idle_timeout = 10s; + +; The number of requests each child process should execute before respawning. +; This can be useful to work around memory leaks in 3rd party libraries. For +; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. +; Default Value: 0 +;pm.max_requests = 500 + +; The URI to view the FPM status page. If this value is not set, no URI will be +; recognized as a status page. It shows the following informations: +; pool - the name of the pool; +; process manager - static, dynamic or ondemand; +; start time - the date and time FPM has started; +; start since - number of seconds since FPM has started; +; accepted conn - the number of request accepted by the pool; +; listen queue - the number of request in the queue of pending +; connections (see backlog in listen(2)); +; max listen queue - the maximum number of requests in the queue +; of pending connections since FPM has started; +; listen queue len - the size of the socket queue of pending connections; +; idle processes - the number of idle processes; +; active processes - the number of active processes; +; total processes - the number of idle + active processes; +; max active processes - the maximum number of active processes since FPM +; has started; +; max children reached - number of times, the process limit has been reached, +; when pm tries to start more children (works only for +; pm 'dynamic' and 'ondemand'); +; Value are updated in real time. +; Example output: +; pool: www +; process manager: static +; start time: 01/Jul/2011:17:53:49 +0200 +; start since: 62636 +; accepted conn: 190460 +; listen queue: 0 +; max listen queue: 1 +; listen queue len: 42 +; idle processes: 4 +; active processes: 11 +; total processes: 15 +; max active processes: 12 +; max children reached: 0 +; +; By default the status page output is formatted as text/plain. Passing either +; 'html', 'xml' or 'json' in the query string will return the corresponding +; output syntax. Example: +; http://www.foo.bar/status +; http://www.foo.bar/status?json +; http://www.foo.bar/status?html +; http://www.foo.bar/status?xml +; +; By default the status page only outputs short status. Passing 'full' in the +; query string will also return status for each pool process. +; Example: +; http://www.foo.bar/status?full +; http://www.foo.bar/status?json&full +; http://www.foo.bar/status?html&full +; http://www.foo.bar/status?xml&full +; The Full status returns for each process: +; pid - the PID of the process; +; state - the state of the process (Idle, Running, ...); +; start time - the date and time the process has started; +; start since - the number of seconds since the process has started; +; requests - the number of requests the process has served; +; request duration - the duration in µs of the requests; +; request method - the request method (GET, POST, ...); +; request URI - the request URI with the query string; +; content length - the content length of the request (only with POST); +; user - the user (PHP_AUTH_USER) (or '-' if not set); +; script - the main script called (or '-' if not set); +; last request cpu - the %cpu the last request consumed +; it's always 0 if the process is not in Idle state +; because CPU calculation is done when the request +; processing has terminated; +; last request memory - the max amount of memory the last request consumed +; it's always 0 if the process is not in Idle state +; because memory calculation is done when the request +; processing has terminated; +; If the process is in Idle state, then informations are related to the +; last request the process has served. Otherwise informations are related to +; the current request being served. +; Example output: +; ************************ +; pid: 31330 +; state: Running +; start time: 01/Jul/2011:17:53:49 +0200 +; start since: 63087 +; requests: 12808 +; request duration: 1250261 +; request method: GET +; request URI: /test_mem.php?N=10000 +; content length: 0 +; user: - +; script: /home/fat/web/docs/php/test_mem.php +; last request cpu: 0.00 +; last request memory: 0 +; +; Note: There is a real-time FPM status monitoring sample web page available +; It's available in: /usr/share/php/7.0/fpm/status.html +; +; Note: The value must start with a leading slash (/). The value can be +; anything, but it may not be a good idea to use the .php extension or it +; may conflict with a real PHP file. +; Default Value: not set +;pm.status_path = /status + +; The ping URI to call the monitoring page of FPM. If this value is not set, no +; URI will be recognized as a ping page. This could be used to test from outside +; that FPM is alive and responding, or to +; - create a graph of FPM availability (rrd or such); +; - remove a server from a group if it is not responding (load balancing); +; - trigger alerts for the operating team (24/7). +; Note: The value must start with a leading slash (/). The value can be +; anything, but it may not be a good idea to use the .php extension or it +; may conflict with a real PHP file. +; Default Value: not set +;ping.path = /ping + +; This directive may be used to customize the response of a ping request. The +; response is formatted as text/plain with a 200 response code. +; Default Value: pong +;ping.response = pong + +; The access log file +; Default: not set +;access.log = log/$pool.access.log + +; The access log format. +; The following syntax is allowed +; %%: the '%' character +; %C: %CPU used by the request +; it can accept the following format: +; - %{user}C for user CPU only +; - %{system}C for system CPU only +; - %{total}C for user + system CPU (default) +; %d: time taken to serve the request +; it can accept the following format: +; - %{seconds}d (default) +; - %{miliseconds}d +; - %{mili}d +; - %{microseconds}d +; - %{micro}d +; %e: an environment variable (same as $_ENV or $_SERVER) +; it must be associated with embraces to specify the name of the env +; variable. Some exemples: +; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e +; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e +; %f: script filename +; %l: content-length of the request (for POST request only) +; %m: request method +; %M: peak of memory allocated by PHP +; it can accept the following format: +; - %{bytes}M (default) +; - %{kilobytes}M +; - %{kilo}M +; - %{megabytes}M +; - %{mega}M +; %n: pool name +; %o: output header +; it must be associated with embraces to specify the name of the header: +; - %{Content-Type}o +; - %{X-Powered-By}o +; - %{Transfert-Encoding}o +; - .... +; %p: PID of the child that serviced the request +; %P: PID of the parent of the child that serviced the request +; %q: the query string +; %Q: the '?' character if query string exists +; %r: the request URI (without the query string, see %q and %Q) +; %R: remote IP address +; %s: status (response code) +; %t: server time the request was received +; it can accept a strftime(3) format: +; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsuled in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t +; %T: time the log has been written (the request has finished) +; it can accept a strftime(3) format: +; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsuled in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t +; %u: remote user +; +; Default: "%R - %u %t \"%m %r\" %s" +;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" + +; The log file for slow requests +; Default Value: not set +; Note: slowlog is mandatory if request_slowlog_timeout is set +;slowlog = log/$pool.log.slow + +; The timeout for serving a single request after which a PHP backtrace will be +; dumped to the 'slowlog' file. A value of '0s' means 'off'. +; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) +; Default Value: 0 +;request_slowlog_timeout = 0 + +; The timeout for serving a single request after which the worker process will +; be killed. This option should be used when the 'max_execution_time' ini option +; does not stop script execution for some reason. A value of '0' means 'off'. +; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) +; Default Value: 0 +request_terminate_timeout = 1d + +; Set open file descriptor rlimit. +; Default Value: system defined value +;rlimit_files = 1024 + +; Set max core size rlimit. +; Possible Values: 'unlimited' or an integer greater or equal to 0 +; Default Value: system defined value +;rlimit_core = 0 + +; Chroot to this directory at the start. This value must be defined as an +; absolute path. When this value is not set, chroot is not used. +; Note: you can prefix with '$prefix' to chroot to the pool prefix or one +; of its subdirectories. If the pool prefix is not set, the global prefix +; will be used instead. +; Note: chrooting is a great security feature and should be used whenever +; possible. However, all PHP paths will be relative to the chroot +; (error_log, sessions.save_path, ...). +; Default Value: not set +;chroot = + +; Chdir to this directory at the start. +; Note: relative path can be used. +; Default Value: current directory or / when chroot +chdir = __FINALPATH__ + +; Redirect worker stdout and stderr into main error log. If not set, stdout and +; stderr will be redirected to /dev/null according to FastCGI specs. +; Note: on highloaded environement, this can cause some delay in the page +; process time (several ms). +; Default Value: no +;catch_workers_output = yes + +; Clear environment in FPM workers +; Prevents arbitrary environment variables from reaching FPM worker processes +; by clearing the environment in workers before env vars specified in this +; pool configuration are added. +; Setting to "no" will make all environment variables available to PHP code +; via getenv(), $_ENV and $_SERVER. +; Default Value: yes +;clear_env = no + +; Limits the extensions of the main script FPM will allow to parse. This can +; prevent configuration mistakes on the web server side. You should only limit +; FPM to .php extensions to prevent malicious users to use other extensions to +; execute php code. +; Note: set an empty value to allow all extensions. +; Default Value: .php +;security.limit_extensions = .php .php3 .php4 .php5 .php7 + +; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from +; the current environment. +; Default Value: clean env +;env[HOSTNAME] = $HOSTNAME +;env[PATH] = /usr/local/bin:/usr/bin:/bin +;env[TMP] = /tmp +;env[TMPDIR] = /tmp +;env[TEMP] = /tmp + +; Additional php.ini defines, specific to this pool of workers. These settings +; overwrite the values previously defined in the php.ini. The directives are the +; same as the PHP SAPI: +; php_value/php_flag - you can set classic ini defines which can +; be overwritten from PHP call 'ini_set'. +; php_admin_value/php_admin_flag - these directives won't be overwritten by +; PHP call 'ini_set' +; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no. + +; Defining 'extension' will load the corresponding shared extension from +; extension_dir. Defining 'disable_functions' or 'disable_classes' will not +; overwrite previously defined php.ini values, but will append the new value +; instead. + +; Note: path INI options can be relative and will be expanded with the prefix +; (pool, global or /usr) + +; Default Value: nothing is defined by default except the values in php.ini and +; specified at startup with the -d argument +;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com +;php_flag[display_errors] = off +;php_admin_value[error_log] = /var/log/fpm-php.www.log +;php_admin_flag[log_errors] = on +;php_admin_value[memory_limit] = 32M + +; Common values to change to increase file upload limit +php_admin_value[upload_max_filesize] = 100M +; php_admin_value[post_max_size] = 50M +; php_admin_flag[mail.add_x_header] = Off + +; Other common parameters +; php_admin_value[max_execution_time] = 600 +; php_admin_value[max_input_time] = 300 +php_admin_value[memory_limit] = 256M +; php_admin_flag[short_open_tag] = On diff --git a/issue_template.md b/issue_template.md index 0f954a7..1cad34d 100644 --- a/issue_template.md +++ b/issue_template.md @@ -20,7 +20,7 @@ about: Create a report to help us debug, it would be nice to fill the template a - 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* +- 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`* diff --git a/manifest.json b/manifest.json index 65b687d..7f5a27d 100644 --- a/manifest.json +++ b/manifest.json @@ -50,6 +50,10 @@ "en": "Is it a public application?", "fr": "Est-ce une application publique ?" }, + "help": { + "en": "If enabled, Matomo 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, Matomo sera accessible aux personnes n’ayant pas de compte. Vous pourrez changer ceci plus tard via la webadmin." + }, "default": true } ] diff --git a/scripts/install b/scripts/install index 8115366..d1ed935 100755 --- a/scripts/install +++ b/scripts/install @@ -88,7 +88,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Configuring PHP-FPM..." # Create a dedicated PHP-FPM config -ynh_add_fpm_config --usage=low --footprint=medium --package="$extra_php_dependencies" +ynh_add_fpm_config --package="$extra_php_dependencies" phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= @@ -149,9 +149,12 @@ ynh_systemd_action --service_name=nginx --action=reload ynh_script_progression --message="Sending a readme for the admin..." message="Matomo was successfully installed :) + Please open your $app domain: https://$domain$path_url + Complete the registration process from the setup page displayed. -Details for mysql database to be enterted while registration process: +Details for MySQL database to be enterted while registration process: + Database login: $app Database name: $app Database password: $db_pwd diff --git a/scripts/restore b/scripts/restore index 37d0227..4bbe7d7 100755 --- a/scripts/restore +++ b/scripts/restore @@ -82,7 +82,7 @@ ynh_script_progression --message="Restoring PHP-FPM configuration..." ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" # Recreate a dedicated php-fpm config -ynh_add_fpm_config --usage=low --footprint=medium --package="$extra_php_dependencies" +ynh_add_fpm_config --package="$extra_php_dependencies" #================================================= # RESTORE THE MYSQL DATABASE diff --git a/scripts/upgrade b/scripts/upgrade index 1c2b90a..2205d63 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -124,7 +124,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Upgrading PHP-FPM configuration..." # Create a dedicated PHP-FPM config -ynh_add_fpm_config --usage=low --footprint=medium --package="$extra_php_dependencies" +ynh_add_fpm_config --package="$extra_php_dependencies" phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= @@ -141,7 +141,7 @@ ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" #================================================= ynh_script_progression --message="Setuping a cron..." -ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="../conf/cron" +ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="../conf/cron" ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="../conf/cron" ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="../conf/cron" ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="../conf/cron" From f5bac2036067d3f8f132aed8e1bf7eb803b78f7e Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 10:28:59 +0100 Subject: [PATCH 021/150] Fix php... --- conf/config.ini.php | 8 - conf/extra_php-fpm.conf | 5 + conf/php-fpm.conf | 430 ---------------------------------------- scripts/install | 2 +- scripts/restore | 2 +- scripts/upgrade | 7 +- 6 files changed, 11 insertions(+), 443 deletions(-) delete mode 100644 conf/config.ini.php create mode 100644 conf/extra_php-fpm.conf delete mode 100644 conf/php-fpm.conf diff --git a/conf/config.ini.php b/conf/config.ini.php deleted file mode 100644 index beda577..0000000 --- a/conf/config.ini.php +++ /dev/null @@ -1,8 +0,0 @@ -; DO NOT REMOVE THIS LINE -; file automatically generated or modified by Matomo; you can manually override the default values in global.ini.php by redefining them in this file. -[database] -host = "127.0.0.1" -username = "__DB__" -password = "__DB_PASSWORD__" -dbname = "__DB__" -tables_prefix = "matomo_" diff --git a/conf/extra_php-fpm.conf b/conf/extra_php-fpm.conf new file mode 100644 index 0000000..a5425fc --- /dev/null +++ b/conf/extra_php-fpm.conf @@ -0,0 +1,5 @@ +; Additional php.ini defines, specific to this pool of workers. + +php_admin_value[upload_max_filesize] = 100M +php_admin_value[memory_limit] = 256M +php_admin_value[post_max_size] = 50M diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf deleted file mode 100644 index 69e3ca7..0000000 --- a/conf/php-fpm.conf +++ /dev/null @@ -1,430 +0,0 @@ -; Start a new pool named 'www'. -; the variable $pool can be used in any directive and will be replaced by the -; pool name ('www' here) -[__NAMETOCHANGE__] - -; Per pool prefix -; It only applies on the following directives: -; - 'access.log' -; - 'slowlog' -; - 'listen' (unixsocket) -; - 'chroot' -; - 'chdir' -; - 'php_values' -; - 'php_admin_values' -; When not set, the global prefix (or /usr) applies instead. -; Note: This directive can also be relative to the global prefix. -; Default Value: none -;prefix = /path/to/pools/$pool - -; Unix user/group of processes -; Note: The user is mandatory. If the group is not set, the default user's group -; will be used. -user = __USER__ -group = __USER__ - -; The address on which to accept FastCGI requests. -; Valid syntaxes are: -; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on -; a specific port; -; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on -; a specific port; -; 'port' - to listen on a TCP socket to all addresses -; (IPv6 and IPv4-mapped) on a specific port; -; '/path/to/unix/socket' - to listen on a unix socket. -; Note: This value is mandatory. -listen = /var/run/php/php__PHPVERSION__-fpm-__NAMETOCHANGE__.sock - -; Set listen(2) backlog. -; Default Value: 511 (-1 on FreeBSD and OpenBSD) -;listen.backlog = 511 - -; Set permissions for unix socket, if one is used. In Linux, read/write -; permissions must be set in order to allow connections from a web server. Many -; BSD-derived systems allow connections regardless of permissions. -; Default Values: user and group are set as the running user -; mode is set to 0660 -listen.owner = www-data -listen.group = www-data -;listen.mode = 0660 -; When POSIX Access Control Lists are supported you can set them using -; these options, value is a comma separated list of user/group names. -; When set, listen.owner and listen.group are ignored -;listen.acl_users = -;listen.acl_groups = - -; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. -; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original -; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address -; must be separated by a comma. If this value is left blank, connections will be -; accepted from any ip address. -; Default Value: any -;listen.allowed_clients = 127.0.0.1 - -; Specify the nice(2) priority to apply to the pool processes (only if set) -; The value can vary from -19 (highest priority) to 20 (lower priority) -; Note: - It will only work if the FPM master process is launched as root -; - The pool processes will inherit the master process priority -; unless it specified otherwise -; Default Value: no set -; process.priority = -19 - -; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user -; or group is differrent than the master process user. It allows to create process -; core dump and ptrace the process for the pool user. -; Default Value: no -; process.dumpable = yes - -; Choose how the process manager will control the number of child processes. -; Possible Values: -; static - a fixed number (pm.max_children) of child processes; -; dynamic - the number of child processes are set dynamically based on the -; following directives. With this process management, there will be -; always at least 1 children. -; pm.max_children - the maximum number of children that can -; be alive at the same time. -; pm.start_servers - the number of children created on startup. -; pm.min_spare_servers - the minimum number of children in 'idle' -; state (waiting to process). If the number -; of 'idle' processes is less than this -; number then some children will be created. -; pm.max_spare_servers - the maximum number of children in 'idle' -; state (waiting to process). If the number -; of 'idle' processes is greater than this -; number then some children will be killed. -; ondemand - no children are created at startup. Children will be forked when -; new requests will connect. The following parameter are used: -; pm.max_children - the maximum number of children that -; can be alive at the same time. -; pm.process_idle_timeout - The number of seconds after which -; an idle process will be killed. -; Note: This value is mandatory. -pm = dynamic - -; The number of child processes to be created when pm is set to 'static' and the -; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. -; This value sets the limit on the number of simultaneous requests that will be -; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. -; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP -; CGI. The below defaults are based on a server without much resources. Don't -; forget to tweak pm.* to fit your needs. -; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' -; Note: This value is mandatory. -pm.max_children = 5 - -; The number of child processes created on startup. -; Note: Used only when pm is set to 'dynamic' -; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 -pm.start_servers = 2 - -; The desired minimum number of idle server processes. -; Note: Used only when pm is set to 'dynamic' -; Note: Mandatory when pm is set to 'dynamic' -pm.min_spare_servers = 1 - -; The desired maximum number of idle server processes. -; Note: Used only when pm is set to 'dynamic' -; Note: Mandatory when pm is set to 'dynamic' -pm.max_spare_servers = 3 - -; The number of seconds after which an idle process will be killed. -; Note: Used only when pm is set to 'ondemand' -; Default Value: 10s -;pm.process_idle_timeout = 10s; - -; The number of requests each child process should execute before respawning. -; This can be useful to work around memory leaks in 3rd party libraries. For -; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. -; Default Value: 0 -;pm.max_requests = 500 - -; The URI to view the FPM status page. If this value is not set, no URI will be -; recognized as a status page. It shows the following informations: -; pool - the name of the pool; -; process manager - static, dynamic or ondemand; -; start time - the date and time FPM has started; -; start since - number of seconds since FPM has started; -; accepted conn - the number of request accepted by the pool; -; listen queue - the number of request in the queue of pending -; connections (see backlog in listen(2)); -; max listen queue - the maximum number of requests in the queue -; of pending connections since FPM has started; -; listen queue len - the size of the socket queue of pending connections; -; idle processes - the number of idle processes; -; active processes - the number of active processes; -; total processes - the number of idle + active processes; -; max active processes - the maximum number of active processes since FPM -; has started; -; max children reached - number of times, the process limit has been reached, -; when pm tries to start more children (works only for -; pm 'dynamic' and 'ondemand'); -; Value are updated in real time. -; Example output: -; pool: www -; process manager: static -; start time: 01/Jul/2011:17:53:49 +0200 -; start since: 62636 -; accepted conn: 190460 -; listen queue: 0 -; max listen queue: 1 -; listen queue len: 42 -; idle processes: 4 -; active processes: 11 -; total processes: 15 -; max active processes: 12 -; max children reached: 0 -; -; By default the status page output is formatted as text/plain. Passing either -; 'html', 'xml' or 'json' in the query string will return the corresponding -; output syntax. Example: -; http://www.foo.bar/status -; http://www.foo.bar/status?json -; http://www.foo.bar/status?html -; http://www.foo.bar/status?xml -; -; By default the status page only outputs short status. Passing 'full' in the -; query string will also return status for each pool process. -; Example: -; http://www.foo.bar/status?full -; http://www.foo.bar/status?json&full -; http://www.foo.bar/status?html&full -; http://www.foo.bar/status?xml&full -; The Full status returns for each process: -; pid - the PID of the process; -; state - the state of the process (Idle, Running, ...); -; start time - the date and time the process has started; -; start since - the number of seconds since the process has started; -; requests - the number of requests the process has served; -; request duration - the duration in µs of the requests; -; request method - the request method (GET, POST, ...); -; request URI - the request URI with the query string; -; content length - the content length of the request (only with POST); -; user - the user (PHP_AUTH_USER) (or '-' if not set); -; script - the main script called (or '-' if not set); -; last request cpu - the %cpu the last request consumed -; it's always 0 if the process is not in Idle state -; because CPU calculation is done when the request -; processing has terminated; -; last request memory - the max amount of memory the last request consumed -; it's always 0 if the process is not in Idle state -; because memory calculation is done when the request -; processing has terminated; -; If the process is in Idle state, then informations are related to the -; last request the process has served. Otherwise informations are related to -; the current request being served. -; Example output: -; ************************ -; pid: 31330 -; state: Running -; start time: 01/Jul/2011:17:53:49 +0200 -; start since: 63087 -; requests: 12808 -; request duration: 1250261 -; request method: GET -; request URI: /test_mem.php?N=10000 -; content length: 0 -; user: - -; script: /home/fat/web/docs/php/test_mem.php -; last request cpu: 0.00 -; last request memory: 0 -; -; Note: There is a real-time FPM status monitoring sample web page available -; It's available in: /usr/share/php/7.0/fpm/status.html -; -; Note: The value must start with a leading slash (/). The value can be -; anything, but it may not be a good idea to use the .php extension or it -; may conflict with a real PHP file. -; Default Value: not set -;pm.status_path = /status - -; The ping URI to call the monitoring page of FPM. If this value is not set, no -; URI will be recognized as a ping page. This could be used to test from outside -; that FPM is alive and responding, or to -; - create a graph of FPM availability (rrd or such); -; - remove a server from a group if it is not responding (load balancing); -; - trigger alerts for the operating team (24/7). -; Note: The value must start with a leading slash (/). The value can be -; anything, but it may not be a good idea to use the .php extension or it -; may conflict with a real PHP file. -; Default Value: not set -;ping.path = /ping - -; This directive may be used to customize the response of a ping request. The -; response is formatted as text/plain with a 200 response code. -; Default Value: pong -;ping.response = pong - -; The access log file -; Default: not set -;access.log = log/$pool.access.log - -; The access log format. -; The following syntax is allowed -; %%: the '%' character -; %C: %CPU used by the request -; it can accept the following format: -; - %{user}C for user CPU only -; - %{system}C for system CPU only -; - %{total}C for user + system CPU (default) -; %d: time taken to serve the request -; it can accept the following format: -; - %{seconds}d (default) -; - %{miliseconds}d -; - %{mili}d -; - %{microseconds}d -; - %{micro}d -; %e: an environment variable (same as $_ENV or $_SERVER) -; it must be associated with embraces to specify the name of the env -; variable. Some exemples: -; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e -; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e -; %f: script filename -; %l: content-length of the request (for POST request only) -; %m: request method -; %M: peak of memory allocated by PHP -; it can accept the following format: -; - %{bytes}M (default) -; - %{kilobytes}M -; - %{kilo}M -; - %{megabytes}M -; - %{mega}M -; %n: pool name -; %o: output header -; it must be associated with embraces to specify the name of the header: -; - %{Content-Type}o -; - %{X-Powered-By}o -; - %{Transfert-Encoding}o -; - .... -; %p: PID of the child that serviced the request -; %P: PID of the parent of the child that serviced the request -; %q: the query string -; %Q: the '?' character if query string exists -; %r: the request URI (without the query string, see %q and %Q) -; %R: remote IP address -; %s: status (response code) -; %t: server time the request was received -; it can accept a strftime(3) format: -; %d/%b/%Y:%H:%M:%S %z (default) -; The strftime(3) format must be encapsuled in a %{}t tag -; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t -; %T: time the log has been written (the request has finished) -; it can accept a strftime(3) format: -; %d/%b/%Y:%H:%M:%S %z (default) -; The strftime(3) format must be encapsuled in a %{}t tag -; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t -; %u: remote user -; -; Default: "%R - %u %t \"%m %r\" %s" -;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" - -; The log file for slow requests -; Default Value: not set -; Note: slowlog is mandatory if request_slowlog_timeout is set -;slowlog = log/$pool.log.slow - -; The timeout for serving a single request after which a PHP backtrace will be -; dumped to the 'slowlog' file. A value of '0s' means 'off'. -; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) -; Default Value: 0 -;request_slowlog_timeout = 0 - -; The timeout for serving a single request after which the worker process will -; be killed. This option should be used when the 'max_execution_time' ini option -; does not stop script execution for some reason. A value of '0' means 'off'. -; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) -; Default Value: 0 -request_terminate_timeout = 1d - -; Set open file descriptor rlimit. -; Default Value: system defined value -;rlimit_files = 1024 - -; Set max core size rlimit. -; Possible Values: 'unlimited' or an integer greater or equal to 0 -; Default Value: system defined value -;rlimit_core = 0 - -; Chroot to this directory at the start. This value must be defined as an -; absolute path. When this value is not set, chroot is not used. -; Note: you can prefix with '$prefix' to chroot to the pool prefix or one -; of its subdirectories. If the pool prefix is not set, the global prefix -; will be used instead. -; Note: chrooting is a great security feature and should be used whenever -; possible. However, all PHP paths will be relative to the chroot -; (error_log, sessions.save_path, ...). -; Default Value: not set -;chroot = - -; Chdir to this directory at the start. -; Note: relative path can be used. -; Default Value: current directory or / when chroot -chdir = __FINALPATH__ - -; Redirect worker stdout and stderr into main error log. If not set, stdout and -; stderr will be redirected to /dev/null according to FastCGI specs. -; Note: on highloaded environement, this can cause some delay in the page -; process time (several ms). -; Default Value: no -;catch_workers_output = yes - -; Clear environment in FPM workers -; Prevents arbitrary environment variables from reaching FPM worker processes -; by clearing the environment in workers before env vars specified in this -; pool configuration are added. -; Setting to "no" will make all environment variables available to PHP code -; via getenv(), $_ENV and $_SERVER. -; Default Value: yes -;clear_env = no - -; Limits the extensions of the main script FPM will allow to parse. This can -; prevent configuration mistakes on the web server side. You should only limit -; FPM to .php extensions to prevent malicious users to use other extensions to -; execute php code. -; Note: set an empty value to allow all extensions. -; Default Value: .php -;security.limit_extensions = .php .php3 .php4 .php5 .php7 - -; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from -; the current environment. -; Default Value: clean env -;env[HOSTNAME] = $HOSTNAME -;env[PATH] = /usr/local/bin:/usr/bin:/bin -;env[TMP] = /tmp -;env[TMPDIR] = /tmp -;env[TEMP] = /tmp - -; Additional php.ini defines, specific to this pool of workers. These settings -; overwrite the values previously defined in the php.ini. The directives are the -; same as the PHP SAPI: -; php_value/php_flag - you can set classic ini defines which can -; be overwritten from PHP call 'ini_set'. -; php_admin_value/php_admin_flag - these directives won't be overwritten by -; PHP call 'ini_set' -; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no. - -; Defining 'extension' will load the corresponding shared extension from -; extension_dir. Defining 'disable_functions' or 'disable_classes' will not -; overwrite previously defined php.ini values, but will append the new value -; instead. - -; Note: path INI options can be relative and will be expanded with the prefix -; (pool, global or /usr) - -; Default Value: nothing is defined by default except the values in php.ini and -; specified at startup with the -d argument -;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com -;php_flag[display_errors] = off -;php_admin_value[error_log] = /var/log/fpm-php.www.log -;php_admin_flag[log_errors] = on -;php_admin_value[memory_limit] = 32M - -; Common values to change to increase file upload limit -php_admin_value[upload_max_filesize] = 100M -; php_admin_value[post_max_size] = 50M -; php_admin_flag[mail.add_x_header] = Off - -; Other common parameters -; php_admin_value[max_execution_time] = 600 -; php_admin_value[max_input_time] = 300 -php_admin_value[memory_limit] = 256M -; php_admin_flag[short_open_tag] = On diff --git a/scripts/install b/scripts/install index d1ed935..60d4e84 100755 --- a/scripts/install +++ b/scripts/install @@ -88,7 +88,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Configuring PHP-FPM..." # Create a dedicated PHP-FPM config -ynh_add_fpm_config --package="$extra_php_dependencies" +ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencies" phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= diff --git a/scripts/restore b/scripts/restore index 4bbe7d7..4a51b1d 100755 --- a/scripts/restore +++ b/scripts/restore @@ -82,7 +82,7 @@ ynh_script_progression --message="Restoring PHP-FPM configuration..." ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" # Recreate a dedicated php-fpm config -ynh_add_fpm_config --package="$extra_php_dependencies" +ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencies" #================================================= # RESTORE THE MYSQL DATABASE diff --git a/scripts/upgrade b/scripts/upgrade index 2205d63..0f3ce37 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -22,6 +22,7 @@ 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) db_name=$(ynh_app_setting_get --app=$app --key=db_name) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # CHECK VERSION @@ -86,7 +87,7 @@ then cp -a "$final_path/config/config.ini.php" "$tmpdir/config.ini.php" # Remove the app directory securely - ynh_secure_remove --file=$final_path + ynh_secure_remove --file="$final_path" # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$final_path" @@ -124,8 +125,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Upgrading PHP-FPM configuration..." # Create a dedicated PHP-FPM config -ynh_add_fpm_config --package="$extra_php_dependencies" -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencies" #================================================= # SPECIFIC UPGRADE @@ -146,6 +146,7 @@ ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_fil ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="../conf/cron" ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="../conf/cron" ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="../conf/cron" + cp -f ../conf/cron /etc/cron.d/$app #================================================= From 2931b0bf593c8df89c8e1e31eb54680bbb3443d5 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 11:39:52 +0100 Subject: [PATCH 022/150] Fix --- conf/config.ini.php | 5 +++-- scripts/install | 5 +++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/conf/config.ini.php b/conf/config.ini.php index beda577..0d3b9c6 100644 --- a/conf/config.ini.php +++ b/conf/config.ini.php @@ -2,7 +2,8 @@ ; file automatically generated or modified by Matomo; you can manually override the default values in global.ini.php by redefining them in this file. [database] host = "127.0.0.1" -username = "__DB__" +username = "__DB_NAME__" password = "__DB_PASSWORD__" -dbname = "__DB__" +dbname = "__DB_NAME__" tables_prefix = "matomo_" + diff --git a/scripts/install b/scripts/install index 8115366..7856e1e 100755 --- a/scripts/install +++ b/scripts/install @@ -113,6 +113,11 @@ ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion cp -f ../conf/cron /etc/cron.d/$app +ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="../conf/config.ini.php" +ynh_replace_string --match_string="__DB_PASSWORD__" --replace_string="$db_pwd" --target_file="../conf/config.ini.php" + +cp -f ../conf/config.ini.php $final_path/config/config.ini.php + #================================================= # GENERIC FINALIZATION #================================================= From 04df2b22dcd03a384d4f44b2839c081e4decd531 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 11:56:48 +0100 Subject: [PATCH 023/150] Fix --- scripts/install | 5 ----- scripts/upgrade | 6 +++--- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/scripts/install b/scripts/install index 7856e1e..8115366 100755 --- a/scripts/install +++ b/scripts/install @@ -113,11 +113,6 @@ ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion cp -f ../conf/cron /etc/cron.d/$app -ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="../conf/config.ini.php" -ynh_replace_string --match_string="__DB_PASSWORD__" --replace_string="$db_pwd" --target_file="../conf/config.ini.php" - -cp -f ../conf/config.ini.php $final_path/config/config.ini.php - #================================================= # GENERIC FINALIZATION #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 1c2b90a..9f0c0e3 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -83,16 +83,16 @@ then # Create a temporary directory tmpdir="$(mktemp -d)" # Backup the config file in the temp dir - cp -a "$final_path/config/config.ini.php" "$tmpdir/config.ini.php" + cp -a "$final_path/config" "$tmpdir" # Remove the app directory securely - ynh_secure_remove --file=$final_path + 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.ini.php" "$final_path/config/config.ini.php" + cp -a "$tmpdir" "$final_path/config" # Remove the tmp directory securely ynh_secure_remove --file="$tmpdir" From c68d1ef6fb3ad9b2f6a952064c53defcea9b0aab Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 12:20:57 +0100 Subject: [PATCH 024/150] Update upgrade --- scripts/upgrade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 9f0c0e3..629fbc8 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -97,8 +97,8 @@ then # Remove the tmp directory securely ynh_secure_remove --file="$tmpdir" - pushd "$final_path/console" - ynh_exec_as $app core:update + pushd "$final_path" + ynh_exec_as $app ./console core:update popd fi From 3a41a40442a0bbc1bc7b9b70b7dcd5e8fbad713b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 12:34:01 +0100 Subject: [PATCH 025/150] Update upgrade --- scripts/upgrade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 0f3ce37..18104cf 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -98,8 +98,8 @@ then # Remove the tmp directory securely ynh_secure_remove --file="$tmpdir" - pushd "$final_path/console" - ynh_exec_as $app core:update + pushd "$final_path" + ynh_exec_as $app ./console core:update popd fi From 5a214dd784c04253ee4876a838955ba8e0f03dc2 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 12:36:49 +0100 Subject: [PATCH 026/150] Update upgrade --- scripts/upgrade | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/upgrade b/scripts/upgrade index 629fbc8..54d839d 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -91,6 +91,8 @@ then # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$final_path" + ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" + #Copy the admin saved settings from tmp directory to final path cp -a "$tmpdir" "$final_path/config" From ff90496a9fec36d52773d7c221ede5768311f5c4 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 12:45:42 +0100 Subject: [PATCH 027/150] Update upgrade --- scripts/upgrade | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 54d839d..f4630eb 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -22,6 +22,7 @@ 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) db_name=$(ynh_app_setting_get --app=$app --key=db_name) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # CHECK VERSION @@ -93,7 +94,7 @@ then ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" - #Copy the admin saved settings from tmp directory to final path + # Copy the admin saved settings from tmp directory to final path cp -a "$tmpdir" "$final_path/config" # Remove the tmp directory securely From af9210cd2f16bc74eeabdc13295d6e314b39f88d Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 12:59:10 +0100 Subject: [PATCH 028/150] Update upgrade --- scripts/upgrade | 5 ----- 1 file changed, 5 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index f4630eb..a857f7b 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -86,14 +86,9 @@ then # Backup the config file in the temp dir cp -a "$final_path/config" "$tmpdir" - # 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" - ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" - # Copy the admin saved settings from tmp directory to final path cp -a "$tmpdir" "$final_path/config" From 6cc63520f9cb1f4dd17262c81395bfc98a386fa2 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 13:30:51 +0100 Subject: [PATCH 029/150] Update upgrade --- scripts/upgrade | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index a857f7b..e108641 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -95,9 +95,6 @@ then # Remove the tmp directory securely ynh_secure_remove --file="$tmpdir" - pushd "$final_path" - ynh_exec_as $app ./console core:update - popd fi #================================================= @@ -134,6 +131,8 @@ ynh_script_progression --message="Installating composer and dependencies..." ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" +cd "$final_path" && ynh_exec_as $app ./console core:update + #================================================= # SETUP A CRON #================================================= @@ -144,6 +143,7 @@ ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_fil ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="../conf/cron" ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="../conf/cron" ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="../conf/cron" + cp -f ../conf/cron /etc/cron.d/$app #================================================= From b8f750779f4b62312859890d093ab41c85a9884c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 13:57:04 +0100 Subject: [PATCH 030/150] Fix --- scripts/upgrade | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index e108641..0456b5e 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -81,20 +81,24 @@ if [ "$upgrade_type" == "UPGRADE_APP" ] then ynh_script_progression --message="Upgrading source files..." - # Create a temporary directory - tmpdir="$(mktemp -d)" - # Backup the config file in the temp dir - cp -a "$final_path/config" "$tmpdir" + if [ -z "$final_path/config/config.ini.php" ]; then + ynh_setup_source --dest_dir="$final_path" + else + # Create a temporary directory + tmpdir="$(mktemp -d)" - # Download, check integrity, uncompress and patch the source from app.src - ynh_setup_source --dest_dir="$final_path" + # Backup the config file in the temp dir + cp -a "$final_path/config/config.ini.php" "$tmpdir/config.ini.php" - # Copy the admin saved settings from tmp directory to final path - cp -a "$tmpdir" "$final_path/config" + # Download, check integrity, uncompress and patch the source from app.src + ynh_setup_source --dest_dir="$final_path" - # Remove the tmp directory securely - ynh_secure_remove --file="$tmpdir" + # Copy the admin saved settings from tmp directory to final path + cp -a "$tmpdir/config.ini.php" "$final_path/config/config.ini.php" + # Remove the tmp directory securely + ynh_secure_remove --file="$tmpdir" + fi fi #================================================= @@ -131,7 +135,10 @@ ynh_script_progression --message="Installating composer and dependencies..." ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" -cd "$final_path" && ynh_exec_as $app ./console core:update +if [ -z "$final_path/config/config.ini.php" ]; then + cd "$final_path" + ynh_exec_as $app ./console core:update +fi #================================================= # SETUP A CRON From 023c0893541c5a9caaca250fc3c2d02d291ec26d Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 14:03:35 +0100 Subject: [PATCH 031/150] Update upgrade --- scripts/upgrade | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 0456b5e..52bbebe 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -81,7 +81,7 @@ if [ "$upgrade_type" == "UPGRADE_APP" ] then ynh_script_progression --message="Upgrading source files..." - if [ -z "$final_path/config/config.ini.php" ]; then + if [[ ! -f "$final_path/config/config.ini.php" ]]; then ynh_setup_source --dest_dir="$final_path" else # Create a temporary directory @@ -124,7 +124,6 @@ ynh_script_progression --message="Upgrading PHP-FPM configuration..." # Create a dedicated PHP-FPM config ynh_add_fpm_config --usage=low --footprint=medium --package="$extra_php_dependencies" -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # SPECIFIC UPGRADE @@ -135,7 +134,7 @@ ynh_script_progression --message="Installating composer and dependencies..." ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" -if [ -z "$final_path/config/config.ini.php" ]; then +if [[ -f "$final_path/config/config.ini.php" ]]; then cd "$final_path" ynh_exec_as $app ./console core:update fi From 4c97f7956eb8c8a39fd6de32a95254163b6f40fb Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 14:15:02 +0100 Subject: [PATCH 032/150] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 52bbebe..e181be9 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -144,7 +144,7 @@ fi #================================================= ynh_script_progression --message="Setuping a cron..." -ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="../conf/cron" +ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="../conf/cron" ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="../conf/cron" ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="../conf/cron" ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="../conf/cron" From 6e899aff69686e02bd176ea58f87894757f7d907 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 15:57:16 +0100 Subject: [PATCH 033/150] set up cron --- conf/{cron => matomo.cron} | 0 scripts/install | 15 +++++++++------ scripts/upgrade | 15 +++++++++------ 3 files changed, 18 insertions(+), 12 deletions(-) rename conf/{cron => matomo.cron} (100%) diff --git a/conf/cron b/conf/matomo.cron similarity index 100% rename from conf/cron rename to conf/matomo.cron diff --git a/scripts/install b/scripts/install index 60d4e84..6e4bfe0 100755 --- a/scripts/install +++ b/scripts/install @@ -105,13 +105,16 @@ ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" #================================================= ynh_script_progression --message="Setuping a cron..." -ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="../conf/cron" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="../conf/cron" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="../conf/cron" -ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="../conf/cron" -ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="../conf/cron" +cron_path="/etc/cron.d/$app" +cp -a ../conf/matomo.cron "$cron_path" +chown root: "$cron_path" +chmod 644 "$cron_path" -cp -f ../conf/cron /etc/cron.d/$app +ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="$cron_path" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$cron_path" +ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$cron_path" +ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="$cron_path" +ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="$cron_path" #================================================= # GENERIC FINALIZATION diff --git a/scripts/upgrade b/scripts/upgrade index ae0fa4d..944cf8a 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -144,13 +144,16 @@ fi #================================================= ynh_script_progression --message="Setuping a cron..." -ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="../conf/cron" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="../conf/cron" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="../conf/cron" -ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="../conf/cron" -ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="../conf/cron" +cron_path="/etc/cron.d/$app" +cp -a ../conf/matomo.cron "$cron_path" +chown root: "$cron_path" +chmod 644 "$cron_path" -cp -f ../conf/cron /etc/cron.d/$app +ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="$cron_path" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$cron_path" +ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$cron_path" +ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="$cron_path" +ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="$cron_path" #================================================= # GENERIC FINALIZATION From da9058b99a944606c49e89d0976a673108c1052c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 16:19:31 +0100 Subject: [PATCH 034/150] Install missing Icons --- scripts/install | 3 +++ scripts/upgrade | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/scripts/install b/scripts/install index 6e4bfe0..753b5a5 100755 --- a/scripts/install +++ b/scripts/install @@ -100,6 +100,9 @@ ynh_script_progression --message="Installing Composer and dependencies..." ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" +# Install missing icons +git clone https://github.com/matomo-org/matomo-icons.git "$final_path/plugins/Morpheus/icons" --quiet + #================================================= # SETUP A CRON #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 944cf8a..1a988b9 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -139,6 +139,15 @@ if [[ -f "$final_path/config/config.ini.php" ]]; then ynh_exec_as $app ./console core:update fi +#================================================= +# INSRALL MISSING ICONS +#================================================= + +if [ ! "$(ls -A "$final_path/plugins/Morpheus/icons")" ] +then + git clone https://github.com/matomo-org/matomo-icons.git "$final_path/plugins/Morpheus/icons" --quiet +fi + #================================================= # SETUP A CRON #================================================= From 4dd96debe0ea43b0bc25e8e9c95a186e86489081 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 16:41:59 +0100 Subject: [PATCH 035/150] Update install --- scripts/install | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/scripts/install b/scripts/install index 753b5a5..b228530 100755 --- a/scripts/install +++ b/scripts/install @@ -106,18 +106,18 @@ git clone https://github.com/matomo-org/matomo-icons.git "$final_path/plugins/Mo #================================================= # SETUP A CRON #================================================= -ynh_script_progression --message="Setuping a cron..." +# ynh_script_progression --message="Setuping a cron..." -cron_path="/etc/cron.d/$app" -cp -a ../conf/matomo.cron "$cron_path" -chown root: "$cron_path" -chmod 644 "$cron_path" +# cron_path="/etc/cron.d/$app" +# cp -a ../conf/matomo.cron "$cron_path" +# chown root: "$cron_path" +# chmod 644 "$cron_path" -ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="$cron_path" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$cron_path" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$cron_path" -ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="$cron_path" -ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="$cron_path" +# ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="$cron_path" +# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$cron_path" +# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$cron_path" +# ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="$cron_path" +# ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="$cron_path" #================================================= # GENERIC FINALIZATION From 57c4c35f1d7d413237769d597f8ddabcd09a3e3f Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 16:56:53 +0100 Subject: [PATCH 036/150] Update upgrade --- scripts/upgrade | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 1a988b9..c0552f9 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -151,18 +151,18 @@ fi #================================================= # SETUP A CRON #================================================= -ynh_script_progression --message="Setuping a cron..." +# ynh_script_progression --message="Setuping a cron..." -cron_path="/etc/cron.d/$app" -cp -a ../conf/matomo.cron "$cron_path" -chown root: "$cron_path" -chmod 644 "$cron_path" +# cron_path="/etc/cron.d/$app" +# cp -a ../conf/matomo.cron "$cron_path" +# chown root: "$cron_path" +# chmod 644 "$cron_path" -ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="$cron_path" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$cron_path" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$cron_path" -ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="$cron_path" -ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="$cron_path" +# ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="$cron_path" +# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$cron_path" +# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$cron_path" +# ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="$cron_path" +# ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="$cron_path" #================================================= # GENERIC FINALIZATION From 4f1e347d60068895068f3fe1c03a0aa4967fb4eb Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 17:20:31 +0100 Subject: [PATCH 037/150] setup cron --- scripts/change_url | 14 ++++++++++++++ scripts/upgrade | 17 +++++++---------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index c6cfed0..380353e 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -28,6 +28,7 @@ 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) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP @@ -91,6 +92,19 @@ then ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" fi +#================================================= +# SETUP A CRON +#================================================= +ynh_script_progression --message="Setuping a cron..." + +cp ../conf/matomo.cron /etc/cron.d/$app + +ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="/etc/cron.d/$app" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="/etc/cron.d/$app" +ynh_replace_string --match_string="__DOMAIN__" --replace_string="$new_domain" --target_file="/etc/cron.d/$app" +ynh_replace_string --match_string="__PATH__" --replace_string="$new_path" --target_file="/etc/cron.d/$app" +ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="/etc/cron.d/$app" + #================================================= # RELOAD NGINX #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index c0552f9..c7faa48 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -151,18 +151,15 @@ fi #================================================= # SETUP A CRON #================================================= -# ynh_script_progression --message="Setuping a cron..." +ynh_script_progression --message="Setuping a cron..." -# cron_path="/etc/cron.d/$app" -# cp -a ../conf/matomo.cron "$cron_path" -# chown root: "$cron_path" -# chmod 644 "$cron_path" +cp ../conf/matomo.cron /etc/cron.d/$app -# ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="$cron_path" -# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$cron_path" -# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$cron_path" -# ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="$cron_path" -# ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="$cron_path" +ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="/etc/cron.d/$app" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="/etc/cron.d/$app" +ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="/etc/cron.d/$app" +ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="/etc/cron.d/$app" +ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="/etc/cron.d/$app" #================================================= # GENERIC FINALIZATION From 45ef8a2aa3ec4616815c1a7e58946feaf7c1b9a4 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 17:31:47 +0100 Subject: [PATCH 038/150] Fix cron --- conf/{matomo.cron => cron} | 0 scripts/change_url | 2 +- scripts/install | 17 +++++++---------- scripts/upgrade | 2 +- 4 files changed, 9 insertions(+), 12 deletions(-) rename conf/{matomo.cron => cron} (100%) diff --git a/conf/matomo.cron b/conf/cron similarity index 100% rename from conf/matomo.cron rename to conf/cron diff --git a/scripts/change_url b/scripts/change_url index 380353e..253d54f 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -97,7 +97,7 @@ fi #================================================= ynh_script_progression --message="Setuping a cron..." -cp ../conf/matomo.cron /etc/cron.d/$app +cp ../conf/cron /etc/cron.d/$app ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="/etc/cron.d/$app" ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="/etc/cron.d/$app" diff --git a/scripts/install b/scripts/install index b228530..147f985 100755 --- a/scripts/install +++ b/scripts/install @@ -106,18 +106,15 @@ git clone https://github.com/matomo-org/matomo-icons.git "$final_path/plugins/Mo #================================================= # SETUP A CRON #================================================= -# ynh_script_progression --message="Setuping a cron..." +ynh_script_progression --message="Setuping a cron..." -# cron_path="/etc/cron.d/$app" -# cp -a ../conf/matomo.cron "$cron_path" -# chown root: "$cron_path" -# chmod 644 "$cron_path" +cp ../conf/cron /etc/cron.d/$app -# ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="$cron_path" -# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$cron_path" -# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$cron_path" -# ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="$cron_path" -# ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="$cron_path" +ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="/etc/cron.d/$app" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="/etc/cron.d/$app" +ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="/etc/cron.d/$app" +ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="/etc/cron.d/$app" +ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="/etc/cron.d/$app" #================================================= # GENERIC FINALIZATION diff --git a/scripts/upgrade b/scripts/upgrade index c7faa48..a81f194 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -153,7 +153,7 @@ fi #================================================= ynh_script_progression --message="Setuping a cron..." -cp ../conf/matomo.cron /etc/cron.d/$app +cp ../conf/cron /etc/cron.d/$app ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="/etc/cron.d/$app" ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="/etc/cron.d/$app" From baa581a9117573220545e3cf0030ff034ab09f46 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 18:19:43 +0100 Subject: [PATCH 039/150] Update upgrade --- scripts/upgrade | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index a81f194..47ad794 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -135,8 +135,9 @@ ynh_script_progression --message="Installating composer and dependencies..." ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" if [[ -f "$final_path/config/config.ini.php" ]]; then - cd "$final_path" - ynh_exec_as $app ./console core:update + pushd "$final_path" + ynh_exec_as $app ./console core:update + popd fi #================================================= From 69efd1b3b894dad04fd8afee39a54b8d3ae7baad Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 11 Dec 2020 18:51:06 +0100 Subject: [PATCH 040/150] Small typos --- scripts/install | 2 -- scripts/upgrade | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/install b/scripts/install index 147f985..6e913e3 100755 --- a/scripts/install +++ b/scripts/install @@ -134,8 +134,6 @@ ynh_script_progression --message="Configuring SSOwat..." # 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" fi diff --git a/scripts/upgrade b/scripts/upgrade index 47ad794..4ad8279 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -141,7 +141,7 @@ if [[ -f "$final_path/config/config.ini.php" ]]; then fi #================================================= -# INSRALL MISSING ICONS +# INSTALL MISSING ICONS #================================================= if [ ! "$(ls -A "$final_path/plugins/Morpheus/icons")" ] From 63b55c6d6d49c8a4f80bc039eb86e856d4087a43 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 12 Dec 2020 15:32:25 +0100 Subject: [PATCH 041/150] Set permissions to Morpheus folder to auto update --- scripts/install | 1 + scripts/upgrade | 1 + 2 files changed, 2 insertions(+) diff --git a/scripts/install b/scripts/install index 6e913e3..8391d17 100755 --- a/scripts/install +++ b/scripts/install @@ -102,6 +102,7 @@ ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" # Install missing icons git clone https://github.com/matomo-org/matomo-icons.git "$final_path/plugins/Morpheus/icons" --quiet +chmod -R 755 "$final_path/plugins/Morpheus" #================================================= # SETUP A CRON diff --git a/scripts/upgrade b/scripts/upgrade index 4ad8279..4672ff4 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -147,6 +147,7 @@ fi if [ ! "$(ls -A "$final_path/plugins/Morpheus/icons")" ] then git clone https://github.com/matomo-org/matomo-icons.git "$final_path/plugins/Morpheus/icons" --quiet + chmod -R 755 "$final_path/plugins/Morpheus" fi #================================================= From 13e02617b479b1eebc5be2d51b463c42e69ed67a Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 15 Dec 2020 09:02:37 +0100 Subject: [PATCH 042/150] Add icons repo --- conf/icons.src | 6 ++++++ scripts/install | 3 ++- scripts/upgrade | 11 ++++++++++- 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 conf/icons.src diff --git a/conf/icons.src b/conf/icons.src new file mode 100644 index 0000000..6ffad8e --- /dev/null +++ b/conf/icons.src @@ -0,0 +1,6 @@ +SOURCE_URL=https://github.com/matomo-org/matomo-icons/archive/e96ef33bf490794829831cbb795fd4ea67259699.tar.gz +SOURCE_SUM=9a6457d8f138216f911621db7a5af5fbce7214e62d6f184730f216986e498b53 +SOURCE_SUM_PRG=sha256sum +SOURCE_FORMAT=tar.gz +SOURCE_IN_SUBDIR=true +SOURCE_FILENAME= diff --git a/scripts/install b/scripts/install index 8391d17..abe70bf 100755 --- a/scripts/install +++ b/scripts/install @@ -101,7 +101,8 @@ ynh_script_progression --message="Installing Composer and dependencies..." ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" # Install missing icons -git clone https://github.com/matomo-org/matomo-icons.git "$final_path/plugins/Morpheus/icons" --quiet +#git clone https://github.com/matomo-org/matomo-icons.git "$final_path/plugins/Morpheus/icons" --quiet +ynh_setup_source --dest_dir="$final_path/plugins/Morpheus/icons" --source_id="icons" chmod -R 755 "$final_path/plugins/Morpheus" #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 4672ff4..3b9c37f 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -82,6 +82,11 @@ then ynh_script_progression --message="Upgrading source files..." if [[ ! -f "$final_path/config/config.ini.php" ]]; then + # config.ini.php is only created during the post-install process... + # it is therefore not present when the IC tests are carried out... + # This condition is only for CI test to go through the upgrade process + ynh_secure_remove --file="$final_path" + # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$final_path" else # Create a temporary directory @@ -90,6 +95,9 @@ then # Backup the config file in the temp dir cp -a "$final_path/config/config.ini.php" "$tmpdir/config.ini.php" + # 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" @@ -146,7 +154,8 @@ fi if [ ! "$(ls -A "$final_path/plugins/Morpheus/icons")" ] then - git clone https://github.com/matomo-org/matomo-icons.git "$final_path/plugins/Morpheus/icons" --quiet + #git clone https://github.com/matomo-org/matomo-icons.git "$final_path/plugins/Morpheus/icons" --quiet + ynh_setup_source --dest_dir="$final_path/plugins/Morpheus/icons" --source_id="icons" chmod -R 755 "$final_path/plugins/Morpheus" fi From e4207dce7009aa855af0f55c6b3f107b4a07d8e3 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 15 Dec 2020 09:16:10 +0100 Subject: [PATCH 043/150] Cleaning up --- scripts/install | 1 - scripts/upgrade | 1 - 2 files changed, 2 deletions(-) diff --git a/scripts/install b/scripts/install index abe70bf..9e41513 100755 --- a/scripts/install +++ b/scripts/install @@ -101,7 +101,6 @@ ynh_script_progression --message="Installing Composer and dependencies..." ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" # Install missing icons -#git clone https://github.com/matomo-org/matomo-icons.git "$final_path/plugins/Morpheus/icons" --quiet ynh_setup_source --dest_dir="$final_path/plugins/Morpheus/icons" --source_id="icons" chmod -R 755 "$final_path/plugins/Morpheus" diff --git a/scripts/upgrade b/scripts/upgrade index 3b9c37f..a7facba 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -154,7 +154,6 @@ fi if [ ! "$(ls -A "$final_path/plugins/Morpheus/icons")" ] then - #git clone https://github.com/matomo-org/matomo-icons.git "$final_path/plugins/Morpheus/icons" --quiet ynh_setup_source --dest_dir="$final_path/plugins/Morpheus/icons" --source_id="icons" chmod -R 755 "$final_path/plugins/Morpheus" fi From ea210f2a9e1fbde91c06217328cb1679c4ddb665 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 16 Dec 2020 15:50:09 +0100 Subject: [PATCH 044/150] Fix typo --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index a7facba..bddff85 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -83,7 +83,7 @@ then if [[ ! -f "$final_path/config/config.ini.php" ]]; then # config.ini.php is only created during the post-install process... - # it is therefore not present when the IC tests are carried out... + # it is therefore not present when the CI tests are carried out... # This condition is only for CI test to go through the upgrade process ynh_secure_remove --file="$final_path" # Download, check integrity, uncompress and patch the source from app.src From 075a280bc49af20017a6003c62217cfb8e7d1100 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 17 Dec 2020 21:46:13 +0100 Subject: [PATCH 045/150] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c0b4250..5343f38 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Matomo for YunoHost [![Integration level](https://dash.yunohost.org/integration/matomo.svg)](https://dash.yunohost.org/appci/app/matomo) ![](https://ci-apps.yunohost.org/ci/badges/matomo.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/matomo.maintain.svg) -[![Install Matomo with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=matomo) +[![Install Matomo with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=matomo) *[Lire ce readme en français.](./README_fr.md)* From c1d716aea9ebff85a84fefa35be26810c1b7b130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 6 Jan 2021 09:28:00 +0100 Subject: [PATCH 046/150] Upgrade to 4.1.0 (#27) * Upgrade to 4.1.0 --- README.md | 2 +- README_fr.md | 4 ++-- conf/app.src | 4 ++-- manifest.json | 2 +- scripts/install | 2 +- scripts/restore | 2 +- scripts/upgrade | 7 +++---- 7 files changed, 11 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 5343f38..1d31a0a 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 Matomo is the leading Free/Libre open analytics platform. It is a full-featured PHP MySQL software program that you download and install on your own webserver. At the end of the five-minute installation process, you will be given a JavaScript code. Simply copy and paste this tag on websites you wish to track and access your analytics reports in real-time. -**Shipped version:** 4.0.5 +**Shipped version:** 4.1.0 ## Screenshots diff --git a/README_fr.md b/README_fr.md index c8c5f56..85793c6 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,7 +1,7 @@ # Matomo pour YunoHost [![Niveau d'intégration](https://dash.yunohost.org/integration/matomo.svg)](https://dash.yunohost.org/appci/app/matomo) ![](https://ci-apps.yunohost.org/ci/badges/matomo.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/matomo.maintain.svg) -[![Installer Matomo avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=matomo) +[![Installer Matomo avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=matomo) *[Read this readme in english.](./README.md)* @@ -11,7 +11,7 @@ Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install ## Vue d'ensemble Matomo est une plateforme d'analyse open source de mesure de statistiques Web. Il s'agit d'un logiciel PHP MySQL complet que vous téléchargez et installez sur votre propre serveur Web. À la fin du processus d'installation de cinq minutes, vous recevrez un code JavaScript. Copiez et collez simplement cette balise sur les sites Web que vous souhaitez suivre et accédez à vos rapports d'analyse en temps réel. -**Version incluse :** 4.0.5 +**Version incluse :** 4.1.0 ## Captures d'écran diff --git a/conf/app.src b/conf/app.src index 2f64345..31bd2bb 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/matomo-org/matomo/archive/4.0.5.tar.gz -SOURCE_SUM=b201dbcf0ce87433a6509cb83c7e565fed2da9a88f192ab222367e74ee28d55a +SOURCE_URL=https://github.com/matomo-org/matomo/archive/4.1.0.tar.gz +SOURCE_SUM=13b74fffbe794b8de3da46e91485a5a5c71c8f0267d0db80e88889db8a44aa03 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 7f5a27d..8185c36 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.0.5~ynh2", + "version": "4.1.0~ynh1", "url": "https://matomo.org", "license": "GPL-3.0-or-later", "maintainer": { diff --git a/scripts/install b/scripts/install index 9e41513..192b249 100755 --- a/scripts/install +++ b/scripts/install @@ -125,7 +125,7 @@ ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion ynh_script_progression --message="Securing files and directories..." # Set permissions to app files -chown -R $app: $final_path +chown -R $app:$app $final_path #================================================= # SETUP SSOWAT diff --git a/scripts/restore b/scripts/restore index 4a51b1d..5b97f86 100755 --- a/scripts/restore +++ b/scripts/restore @@ -71,7 +71,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Restoring user rights..." # Restore permissions on app files -chown -R $app: $final_path +chown -R $app:$app $final_path #================================================= # RESTORE THE PHP-FPM CONFIGURATION diff --git a/scripts/upgrade b/scripts/upgrade index bddff85..3c9f6bd 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -143,9 +143,7 @@ ynh_script_progression --message="Installating composer and dependencies..." ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" if [[ -f "$final_path/config/config.ini.php" ]]; then - pushd "$final_path" - ynh_exec_as $app ./console core:update - popd + php$phpversion $final_path/console core:update fi #================================================= @@ -154,6 +152,7 @@ fi if [ ! "$(ls -A "$final_path/plugins/Morpheus/icons")" ] then + ynh_script_progression --message="Installating Morpheus icons..." ynh_setup_source --dest_dir="$final_path/plugins/Morpheus/icons" --source_id="icons" chmod -R 755 "$final_path/plugins/Morpheus" fi @@ -179,7 +178,7 @@ ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion ynh_script_progression --message="Securing files and directories..." # Set permissions on app files -chown -R $app: $final_path +chown -R $app:$app $final_path #================================================= # RELOAD NGINX From 78fb037921e9866b6c1d6390d6f5b2071717860e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 3 Feb 2021 08:31:46 +0100 Subject: [PATCH 047/150] 4.1.1 (#31) * Upgrade to 4.1.1 --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1d31a0a..bea624e 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 Matomo is the leading Free/Libre open analytics platform. It is a full-featured PHP MySQL software program that you download and install on your own webserver. At the end of the five-minute installation process, you will be given a JavaScript code. Simply copy and paste this tag on websites you wish to track and access your analytics reports in real-time. -**Shipped version:** 4.1.0 +**Shipped version:** 4.1.1 ## Screenshots diff --git a/README_fr.md b/README_fr.md index 85793c6..bc3739c 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 Matomo est une plateforme d'analyse open source de mesure de statistiques Web. Il s'agit d'un logiciel PHP MySQL complet que vous téléchargez et installez sur votre propre serveur Web. À la fin du processus d'installation de cinq minutes, vous recevrez un code JavaScript. Copiez et collez simplement cette balise sur les sites Web que vous souhaitez suivre et accédez à vos rapports d'analyse en temps réel. -**Version incluse :** 4.1.0 +**Version incluse :** 4.1.1 ## Captures d'écran diff --git a/conf/app.src b/conf/app.src index 31bd2bb..a6c1935 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/matomo-org/matomo/archive/4.1.0.tar.gz -SOURCE_SUM=13b74fffbe794b8de3da46e91485a5a5c71c8f0267d0db80e88889db8a44aa03 +SOURCE_URL=https://github.com/matomo-org/matomo/archive/4.1.1.tar.gz +SOURCE_SUM=c7ee86a1b7c9b648de41d0efe75b7f92766976dfb559523d2db95e97be7a5d29 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 8185c36..6fb2f01 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.1.0~ynh1", + "version": "4.1.1~ynh1", "url": "https://matomo.org", "license": "GPL-3.0-or-later", "maintainer": { @@ -19,7 +19,7 @@ "multi_instance": true, "services": [ "nginx", - "php7.0-fpm", + "php7.3-fpm", "mysql" ], "arguments": { From 04b609fb3d378dc987f98d5b693065a0b68c2356 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 22 Feb 2021 18:44:54 +0100 Subject: [PATCH 048/150] Upgrade to 4.2.0 (#32) --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- scripts/install | 6 +++--- scripts/upgrade | 11 +++++++++-- 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index bea624e..d16e39d 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 Matomo is the leading Free/Libre open analytics platform. It is a full-featured PHP MySQL software program that you download and install on your own webserver. At the end of the five-minute installation process, you will be given a JavaScript code. Simply copy and paste this tag on websites you wish to track and access your analytics reports in real-time. -**Shipped version:** 4.1.1 +**Shipped version:** 4.2.0 ## Screenshots diff --git a/README_fr.md b/README_fr.md index bc3739c..8192196 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 Matomo est une plateforme d'analyse open source de mesure de statistiques Web. Il s'agit d'un logiciel PHP MySQL complet que vous téléchargez et installez sur votre propre serveur Web. À la fin du processus d'installation de cinq minutes, vous recevrez un code JavaScript. Copiez et collez simplement cette balise sur les sites Web que vous souhaitez suivre et accédez à vos rapports d'analyse en temps réel. -**Version incluse :** 4.1.1 +**Version incluse :** 4.2.0 ## Captures d'écran diff --git a/conf/app.src b/conf/app.src index a6c1935..2d9d7f6 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/matomo-org/matomo/archive/4.1.1.tar.gz -SOURCE_SUM=c7ee86a1b7c9b648de41d0efe75b7f92766976dfb559523d2db95e97be7a5d29 +SOURCE_URL=https://github.com/matomo-org/matomo/archive/4.2.0.tar.gz +SOURCE_SUM=6b452bc2c1f7c4eb0427ae92467deea120f7b5aa51f43b741b5cdf9f934c3e4d SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 6fb2f01..f48ad2c 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.1.1~ynh1", + "version": "4.2.0~ynh1", "url": "https://matomo.org", "license": "GPL-3.0-or-later", "maintainer": { diff --git a/scripts/install b/scripts/install index 192b249..e9ecbee 100755 --- a/scripts/install +++ b/scripts/install @@ -125,17 +125,17 @@ ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion ynh_script_progression --message="Securing files and directories..." # Set permissions to app files -chown -R $app:$app $final_path +chown -R $app: $final_path #================================================= # SETUP SSOWAT #================================================= -ynh_script_progression --message="Configuring SSOwat..." +ynh_script_progression --message="Configuring permissions..." # Make app public if necessary or protect it if [ $is_public -eq 1 ] then - ynh_permission_update --permission "main" --add "visitors" + ynh_permission_update --permission="main" --add="visitors" fi #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 21d1e64..b91629c 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -57,6 +57,13 @@ if [ -z "$final_path" ]; then ynh_app_setting_set --app=$app --key=final_path --value=$final_path fi +# Cleaning legacy permissions +if ynh_legacy_permissions_exists; then + ynh_legacy_permissions_delete_all + + ynh_app_setting_delete --app=$app --key=is_public +fi + #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= @@ -152,7 +159,7 @@ fi if [ ! "$(ls -A "$final_path/plugins/Morpheus/icons")" ] then - ynh_script_progression --message="Installating Morpheus icons..." + ynh_script_progression --message="Installating Morpheus icons..." ynh_setup_source --dest_dir="$final_path/plugins/Morpheus/icons" --source_id="icons" chmod -R 755 "$final_path/plugins/Morpheus" fi @@ -178,7 +185,7 @@ ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion ynh_script_progression --message="Securing files and directories..." # Set permissions on app files -chown -R $app:$app $final_path +chown -R $app: $final_path #================================================= # RELOAD NGINX From 0e2f49dcc71919dd3176fca19d1a1bf865516601 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 1 Mar 2021 23:33:29 +0100 Subject: [PATCH 049/150] Upgrade to 4.2.1 (#34) --- 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 d16e39d..8b2ec84 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 Matomo is the leading Free/Libre open analytics platform. It is a full-featured PHP MySQL software program that you download and install on your own webserver. At the end of the five-minute installation process, you will be given a JavaScript code. Simply copy and paste this tag on websites you wish to track and access your analytics reports in real-time. -**Shipped version:** 4.2.0 +**Shipped version:** 4.2.1 ## Screenshots diff --git a/README_fr.md b/README_fr.md index 8192196..03741e5 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 Matomo est une plateforme d'analyse open source de mesure de statistiques Web. Il s'agit d'un logiciel PHP MySQL complet que vous téléchargez et installez sur votre propre serveur Web. À la fin du processus d'installation de cinq minutes, vous recevrez un code JavaScript. Copiez et collez simplement cette balise sur les sites Web que vous souhaitez suivre et accédez à vos rapports d'analyse en temps réel. -**Version incluse :** 4.2.0 +**Version incluse :** 4.2.1 ## Captures d'écran diff --git a/conf/app.src b/conf/app.src index 2d9d7f6..4ac6a9a 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/matomo-org/matomo/archive/4.2.0.tar.gz -SOURCE_SUM=6b452bc2c1f7c4eb0427ae92467deea120f7b5aa51f43b741b5cdf9f934c3e4d +SOURCE_URL=https://github.com/matomo-org/matomo/archive/4.2.1.tar.gz +SOURCE_SUM=e84b86186ef0924b4d4479ec3162bbc9cb30e430b3a55a7f6d8a08e84704b33f SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index f48ad2c..7688cfe 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.2.0~ynh1", + "version": "4.2.1~ynh1", "url": "https://matomo.org", "license": "GPL-3.0-or-later", "maintainer": { From d7f35b346760455b948f5287bd752ad627159e93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 16 Mar 2021 17:37:48 +0100 Subject: [PATCH 050/150] cleaning up (#38) --- README.md | 2 +- README_fr.md | 2 +- manifest.json | 16 ++-------------- pull_request_template.md | 4 +--- scripts/install | 1 - scripts/upgrade | 10 ---------- 6 files changed, 5 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 8b2ec84..2c62c0a 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Matomo is the leading Free/Libre open analytics platform. It is a full-featured ## Documentation * Official documentation: https://matomo.org/docs - * YunoHost documentation: https://yunohost.org/#/app_matomo + * YunoHost documentation: https://yunohost.org/en/app_matomo #### Supported architectures diff --git a/README_fr.md b/README_fr.md index 03741e5..cd9c4cf 100644 --- a/README_fr.md +++ b/README_fr.md @@ -30,7 +30,7 @@ Matomo est une plateforme d'analyse open source de mesure de statistiques Web. I ## Documentation * Documentation officielle : https://matomo.org/docs - * Documentation YunoHost : https://yunohost.org/#/app_matomo_fr + * Documentation YunoHost : https://yunohost.org/fr/app_matomo #### Architectures supportées diff --git a/manifest.json b/manifest.json index 7688cfe..48e1218 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.2.1~ynh1", + "version": "4.2.1~ynh2", "url": "https://matomo.org", "license": "GPL-3.0-or-later", "maintainer": { @@ -14,7 +14,7 @@ "email": "anmol@datamol.org" }, "requirements": { - "yunohost": ">= 4.0.0" + "yunohost": ">= 4.1.7" }, "multi_instance": true, "services": [ @@ -27,29 +27,17 @@ { "name": "domain", "type": "domain", - "ask": { - "en": "Choose a domain name for Matomo", - "fr": "Choisissez un nom de domaine pour Matomo" - }, "example": "example.com" }, { "name": "path", "type": "path", - "ask": { - "en": "Choose a path for Matomo", - "fr": "Choisissez un chemin pour Matomo" - }, "example": "/matomo", "default": "/matomo" }, { "name": "is_public", "type": "boolean", - "ask": { - "en": "Is it a public application?", - "fr": "Est-ce une application publique ?" - }, "help": { "en": "If enabled, Matomo 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, Matomo sera accessible aux personnes n’ayant pas de compte. Vous pourrez changer ceci plus tard via la webadmin." diff --git a/pull_request_template.md b/pull_request_template.md index 60ecdcf..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/matomo_ynh%20PR-NUM-%20(USERNAME)/badge/icon)](https://ci-apps-dev.yunohost.org/jenkins/job/matomo_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/install b/scripts/install index e9ecbee..526d64f 100755 --- a/scripts/install +++ b/scripts/install @@ -45,7 +45,6 @@ ynh_script_progression --message="Storing installation settings..." 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 #================================================= # CREATE A MYSQL DATABASE diff --git a/scripts/upgrade b/scripts/upgrade index b91629c..2a041b7 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -19,7 +19,6 @@ 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) db_name=$(ynh_app_setting_get --app=$app --key=db_name) phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) @@ -36,15 +35,6 @@ upgrade_type=$(ynh_check_app_version_changed) #================================================= ynh_script_progression --message="Ensuring downward compatibility..." -# Fix is_public as a boolean value -if [ "$is_public" = "Yes" ]; then - ynh_app_setting_set --app=$app --key=is_public --value=1 - is_public=1 -elif [ "$is_public" = "No" ]; then - ynh_app_setting_set --app=$app --key=is_public --value=0 - is_public=0 -fi - # If db_name doesn't exist, create it if [ -z "$db_name" ]; then db_name=$(ynh_sanitize_dbid --db_name=$app) From d1e245eeed62455b3dc1c4ddef6ec8d24225d9c8 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 25 Mar 2021 20:13:51 +0100 Subject: [PATCH 051/150] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 2a041b7..1ff6bf5 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -96,7 +96,7 @@ then ynh_secure_remove --file="$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="$final_path" #--keep="foo bar" to integrate when https://github.com/YunoHost/yunohost/pull/1200 is upstream # Copy the admin saved settings from tmp directory to final path cp -a "$tmpdir/config.ini.php" "$final_path/config/config.ini.php" From 63c73f80a6d086a4f4e204320b8c8120dd6b2176 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Mar 2021 23:51:50 +0100 Subject: [PATCH 052/150] Fix --- scripts/install | 30 ++++++++++++++++-------------- scripts/upgrade | 14 ++++++++------ 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/scripts/install b/scripts/install index 526d64f..a06fd6d 100755 --- a/scripts/install +++ b/scripts/install @@ -56,6 +56,14 @@ db_user=$db_name ynh_app_setting_set --app=$app --key=db_name --value=$db_name ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Configuring system user..." + +# Create a system user +ynh_system_user_create --username=$app + #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= @@ -73,14 +81,6 @@ ynh_script_progression --message="Configuring NGINX web server..." # Create a dedicated NGINX config ynh_add_nginx_config -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Configuring system user..." - -# Create a system user -ynh_system_user_create --username=$app - #================================================= # PHP-FPM CONFIGURATION #================================================= @@ -108,13 +108,15 @@ chmod -R 755 "$final_path/plugins/Morpheus" #================================================= ynh_script_progression --message="Setuping a cron..." -cp ../conf/cron /etc/cron.d/$app +# cp ../conf/cron /etc/cron.d/$app -ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="/etc/cron.d/$app" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="/etc/cron.d/$app" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="/etc/cron.d/$app" -ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="/etc/cron.d/$app" -ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="/etc/cron.d/$app" +# ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="/etc/cron.d/$app" +# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="/etc/cron.d/$app" +# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="/etc/cron.d/$app" +# ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="/etc/cron.d/$app" +# ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="/etc/cron.d/$app" + +ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" #================================================= # GENERIC FINALIZATION diff --git a/scripts/upgrade b/scripts/upgrade index 1ff6bf5..fefaa1d 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -159,13 +159,15 @@ fi #================================================= ynh_script_progression --message="Setuping a cron..." -cp ../conf/cron /etc/cron.d/$app +# cp ../conf/cron /etc/cron.d/$app -ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="/etc/cron.d/$app" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="/etc/cron.d/$app" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="/etc/cron.d/$app" -ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="/etc/cron.d/$app" -ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="/etc/cron.d/$app" +# ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="/etc/cron.d/$app" +# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="/etc/cron.d/$app" +# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="/etc/cron.d/$app" +# ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="/etc/cron.d/$app" +# ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="/etc/cron.d/$app" + +ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" #================================================= # GENERIC FINALIZATION From 85afc4dec41ed011fbe7229c40f2f4bb58ce2c9d Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 17 Apr 2021 22:57:11 +0200 Subject: [PATCH 053/150] Cleaning up --- README.md | 4 ++-- README_fr.md | 4 ++-- scripts/install | 8 -------- scripts/upgrade | 8 -------- 4 files changed, 4 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 2c62c0a..126bfda 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,8 @@ Matomo is the leading Free/Libre open analytics platform. It is a full-featured #### Supported architectures -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/matomo%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/matomo/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/matomo%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/matomo/) +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/matomo.svg)](https://ci-apps.yunohost.org/ci/apps/matomo/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/matomo.svg)](https://ci-apps-arm.yunohost.org/ci/apps/matomo/) ## Links diff --git a/README_fr.md b/README_fr.md index cd9c4cf..2ee1411 100644 --- a/README_fr.md +++ b/README_fr.md @@ -34,8 +34,8 @@ Matomo est une plateforme d'analyse open source de mesure de statistiques Web. I #### Architectures supportées -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/matomo%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/matomo/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/matomo%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/matomo/) +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/matomo.svg)](https://ci-apps.yunohost.org/ci/apps/matomo/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/matomo.svg)](https://ci-apps-arm.yunohost.org/ci/apps/matomo/) ## Liens diff --git a/scripts/install b/scripts/install index a06fd6d..37389a7 100755 --- a/scripts/install +++ b/scripts/install @@ -108,14 +108,6 @@ chmod -R 755 "$final_path/plugins/Morpheus" #================================================= ynh_script_progression --message="Setuping a cron..." -# cp ../conf/cron /etc/cron.d/$app - -# ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="/etc/cron.d/$app" -# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="/etc/cron.d/$app" -# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="/etc/cron.d/$app" -# ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="/etc/cron.d/$app" -# ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="/etc/cron.d/$app" - ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index fefaa1d..dc54adc 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -159,14 +159,6 @@ fi #================================================= ynh_script_progression --message="Setuping a cron..." -# cp ../conf/cron /etc/cron.d/$app - -# ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="/etc/cron.d/$app" -# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="/etc/cron.d/$app" -# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="/etc/cron.d/$app" -# ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="/etc/cron.d/$app" -# ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="/etc/cron.d/$app" - ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" #================================================= From 32242e91b49b67acfddfa7cd785c3856f79f1f75 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 24 Apr 2021 09:10:17 +0200 Subject: [PATCH 054/150] Update change_url --- scripts/change_url | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index 253d54f..f21a608 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -97,13 +97,17 @@ fi #================================================= ynh_script_progression --message="Setuping a cron..." -cp ../conf/cron /etc/cron.d/$app +#cp ../conf/cron /etc/cron.d/$app -ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="/etc/cron.d/$app" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="/etc/cron.d/$app" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$new_domain" --target_file="/etc/cron.d/$app" -ynh_replace_string --match_string="__PATH__" --replace_string="$new_path" --target_file="/etc/cron.d/$app" -ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="/etc/cron.d/$app" +path=$new_path +domain=$new_domain +ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" + +# ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="/etc/cron.d/$app" +# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="/etc/cron.d/$app" +# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$new_domain" --target_file="/etc/cron.d/$app" +# ynh_replace_string --match_string="__PATH__" --replace_string="$new_path" --target_file="/etc/cron.d/$app" +# ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="/etc/cron.d/$app" #================================================= # RELOAD NGINX From 5a18ef7f19dba3712e8d061c09b621d25218ad09 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 24 Apr 2021 09:25:48 +0200 Subject: [PATCH 055/150] Update config.ini.php --- conf/config.ini.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/config.ini.php b/conf/config.ini.php index 0d3b9c6..548d94b 100644 --- a/conf/config.ini.php +++ b/conf/config.ini.php @@ -3,7 +3,7 @@ [database] host = "127.0.0.1" username = "__DB_NAME__" -password = "__DB_PASSWORD__" +password = "__DB_PWD__" dbname = "__DB_NAME__" tables_prefix = "matomo_" - +charset = "utf8mb4" From 3880a1fe9a967a984593bb7335cc604b3071533c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 26 Apr 2021 18:43:31 +0200 Subject: [PATCH 056/150] Fix links --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 126bfda..59c3c67 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ *[Lire ce readme en français.](./README_fr.md)* > *This package allows you to install Matomo 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 Matomo is the leading Free/Libre open analytics platform. It is a full-featured PHP MySQL software program that you download and install on your own webserver. At the end of the five-minute installation process, you will be given a JavaScript code. Simply copy and paste this tag on websites you wish to track and access your analytics reports in real-time. diff --git a/README_fr.md b/README_fr.md index 2ee1411..3209e87 100644 --- a/README_fr.md +++ b/README_fr.md @@ -6,7 +6,7 @@ *[Read this readme in english.](./README.md)* > *Ce package vous permet d'installer Matomo 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 Matomo est une plateforme d'analyse open source de mesure de statistiques Web. Il s'agit d'un logiciel PHP MySQL complet que vous téléchargez et installez sur votre propre serveur Web. À la fin du processus d'installation de cinq minutes, vous recevrez un code JavaScript. Copiez et collez simplement cette balise sur les sites Web que vous souhaitez suivre et accédez à vos rapports d'analyse en temps réel. From a6516fb0f39a3dc01a79fc734198aa718a5e9112 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 7 May 2021 11:21:19 +0200 Subject: [PATCH 057/150] Upgrade to 4.3.0 --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- scripts/change_url | 8 -------- 5 files changed, 5 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 59c3c67..117f0c1 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 Matomo is the leading Free/Libre open analytics platform. It is a full-featured PHP MySQL software program that you download and install on your own webserver. At the end of the five-minute installation process, you will be given a JavaScript code. Simply copy and paste this tag on websites you wish to track and access your analytics reports in real-time. -**Shipped version:** 4.2.1 +**Shipped version:** 4.3.0 ## Screenshots diff --git a/README_fr.md b/README_fr.md index 3209e87..026f861 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 Matomo est une plateforme d'analyse open source de mesure de statistiques Web. Il s'agit d'un logiciel PHP MySQL complet que vous téléchargez et installez sur votre propre serveur Web. À la fin du processus d'installation de cinq minutes, vous recevrez un code JavaScript. Copiez et collez simplement cette balise sur les sites Web que vous souhaitez suivre et accédez à vos rapports d'analyse en temps réel. -**Version incluse :** 4.2.1 +**Version incluse :** 4.3.0 ## Captures d'écran diff --git a/conf/app.src b/conf/app.src index 4ac6a9a..58a6529 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/matomo-org/matomo/archive/4.2.1.tar.gz -SOURCE_SUM=e84b86186ef0924b4d4479ec3162bbc9cb30e430b3a55a7f6d8a08e84704b33f +SOURCE_URL=https://github.com/matomo-org/matomo/archive/refs/tags/4.3.0-rc1.zip +SOURCE_SUM=fd6bb4706493989c6a29a44e6ae460c3eb0fc659236eff32042b2e66f246abaa SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 48e1218..ad58315 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.2.1~ynh2", + "version": "4.3.0~ynh1", "url": "https://matomo.org", "license": "GPL-3.0-or-later", "maintainer": { diff --git a/scripts/change_url b/scripts/change_url index f21a608..49138df 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -97,18 +97,10 @@ fi #================================================= ynh_script_progression --message="Setuping a cron..." -#cp ../conf/cron /etc/cron.d/$app - path=$new_path domain=$new_domain ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" -# ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="/etc/cron.d/$app" -# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="/etc/cron.d/$app" -# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$new_domain" --target_file="/etc/cron.d/$app" -# ynh_replace_string --match_string="__PATH__" --replace_string="$new_path" --target_file="/etc/cron.d/$app" -# ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="/etc/cron.d/$app" - #================================================= # RELOAD NGINX #================================================= From f46bbb327946aaa4f26483101c89a6d2fb4e2006 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 7 May 2021 12:21:35 +0200 Subject: [PATCH 058/150] 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 58a6529..a854ead 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/matomo-org/matomo/archive/refs/tags/4.3.0-rc1.zip -SOURCE_SUM=fd6bb4706493989c6a29a44e6ae460c3eb0fc659236eff32042b2e66f246abaa +SOURCE_URL=https://github.com/matomo-org/matomo/archive/refs/tags/4.3.0-rc1.tar.gz +SOURCE_SUM=af0951e086a4ac0f3fdc63fbe0d809dd202e47f36c735358ab20bc7479d36b87 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true From 9e03e882169e087c9004b93286ce58f4be42b8d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 7 May 2021 13:02:33 +0200 Subject: [PATCH 059/150] Update nginx.conf (#42) * Update nginx.conf --- conf/nginx.conf | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/conf/nginx.conf b/conf/nginx.conf index b41ead3..d16f443 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -26,6 +26,44 @@ location __PATH__/ { fastcgi_param SCRIPT_FILENAME $request_filename; } + + ## deny access to all other .php files + location ~* ^.+\.php$ { + deny all; + return 403; + } + + + ## disable all access to the following directories + location ~ ^/(config|tmp|core|lang) { + deny all; + return 403; # replace with 404 to not show these directories exist + } + + location ~ js/container_.*_preview\.js$ { + expires off; + more_set_headers "Cache-Control: private, no-cache, no-store"; + } + + location ~ \.(gif|ico|jpg|png|svg|js|css|htm|html|mp3|mp4|wav|ogg|avi|ttf|eot|woff|woff2|json)$ { + allow all; + ## Cache images,CSS,JS and webfonts for an hour + ## Increasing the duration may improve the load-time, but may cause old files to show after an Matomo upgrade + expires 1h; + more_set_headers "Cache-Control: public"; + more_set_headers "Pragma: public"; + } + + location __PATH__/(libs|vendor|plugins|misc|node_modules) { + deny all; + return 403; + } + + ## properly display textfiles in root directory + location ~/(.*\.md|LEGALNOTICE|LICENSE) { + default_type text/plain; + } + # Include SSOWAT user panel. include conf.d/yunohost_panel.conf.inc; } From 4835460616468c063c05479458b8a1adc7d079d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 7 May 2021 13:03:10 +0200 Subject: [PATCH 060/150] Upgrade to 4.3.0 (#44) * Upgrade to 4.3.0 --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- scripts/change_url | 8 -------- 5 files changed, 5 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 59c3c67..117f0c1 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 Matomo is the leading Free/Libre open analytics platform. It is a full-featured PHP MySQL software program that you download and install on your own webserver. At the end of the five-minute installation process, you will be given a JavaScript code. Simply copy and paste this tag on websites you wish to track and access your analytics reports in real-time. -**Shipped version:** 4.2.1 +**Shipped version:** 4.3.0 ## Screenshots diff --git a/README_fr.md b/README_fr.md index 3209e87..026f861 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 Matomo est une plateforme d'analyse open source de mesure de statistiques Web. Il s'agit d'un logiciel PHP MySQL complet que vous téléchargez et installez sur votre propre serveur Web. À la fin du processus d'installation de cinq minutes, vous recevrez un code JavaScript. Copiez et collez simplement cette balise sur les sites Web que vous souhaitez suivre et accédez à vos rapports d'analyse en temps réel. -**Version incluse :** 4.2.1 +**Version incluse :** 4.3.0 ## Captures d'écran diff --git a/conf/app.src b/conf/app.src index 4ac6a9a..a854ead 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/matomo-org/matomo/archive/4.2.1.tar.gz -SOURCE_SUM=e84b86186ef0924b4d4479ec3162bbc9cb30e430b3a55a7f6d8a08e84704b33f +SOURCE_URL=https://github.com/matomo-org/matomo/archive/refs/tags/4.3.0-rc1.tar.gz +SOURCE_SUM=af0951e086a4ac0f3fdc63fbe0d809dd202e47f36c735358ab20bc7479d36b87 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 48e1218..ad58315 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.2.1~ynh2", + "version": "4.3.0~ynh1", "url": "https://matomo.org", "license": "GPL-3.0-or-later", "maintainer": { diff --git a/scripts/change_url b/scripts/change_url index f21a608..49138df 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -97,18 +97,10 @@ fi #================================================= ynh_script_progression --message="Setuping a cron..." -#cp ../conf/cron /etc/cron.d/$app - path=$new_path domain=$new_domain ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" -# ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="/etc/cron.d/$app" -# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="/etc/cron.d/$app" -# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$new_domain" --target_file="/etc/cron.d/$app" -# ynh_replace_string --match_string="__PATH__" --replace_string="$new_path" --target_file="/etc/cron.d/$app" -# ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="/etc/cron.d/$app" - #================================================= # RELOAD NGINX #================================================= From fc5511d51f652287c5bc84cad5f11afb6247b427 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 9 May 2021 11:07:54 +0200 Subject: [PATCH 061/150] Keep config --- manifest.json | 2 +- scripts/_common.sh | 19 +++------------ scripts/install | 1 - scripts/upgrade | 21 +--------------- scripts/ynh_composer__2 | 53 ----------------------------------------- 5 files changed, 5 insertions(+), 91 deletions(-) delete mode 100644 scripts/ynh_composer__2 diff --git a/manifest.json b/manifest.json index ad58315..cad6831 100644 --- a/manifest.json +++ b/manifest.json @@ -14,7 +14,7 @@ "email": "anmol@datamol.org" }, "requirements": { - "yunohost": ">= 4.1.7" + "yunohost": ">= 4.2.4" }, "multi_instance": true, "services": [ diff --git a/scripts/_common.sh b/scripts/_common.sh index c685199..b7778d4 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -8,6 +8,9 @@ YNH_PHP_VERSION="7.3" extra_php_dependencies="php${YNH_PHP_VERSION}-curl php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-cli php${YNH_PHP_VERSION}-mysql php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-mbstring" +# Composer version +composer_version=1.10.17 + #================================================= # PERSONAL HELPERS #================================================= @@ -76,19 +79,3 @@ $(yunohost tools diagnosis | grep -B 100 "services:" | sed '/services:/d')" # Send the email to the recipients echo "$mail_message" | $mail_bin -a "Content-Type: text/plain; charset=UTF-8" -s "$mail_subject" "$recipients" } - - - -# Execute a command as another user -# usage: ynh_exec_as USER COMMAND [ARG ...] -ynh_exec_as() { - local USER=$1 - shift 1 - - if [[ $USER = $(whoami) ]]; then - eval "$@" - else - sudo -u "$USER" "$@" - fi -} - diff --git a/scripts/install b/scripts/install index 37389a7..9c8d3a6 100755 --- a/scripts/install +++ b/scripts/install @@ -7,7 +7,6 @@ #================================================= source _common.sh -source ynh_composer__2 source /usr/share/yunohost/helpers #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index dc54adc..eff80eb 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -79,30 +79,11 @@ then ynh_script_progression --message="Upgrading source files..." if [[ ! -f "$final_path/config/config.ini.php" ]]; then - # config.ini.php is only created during the post-install process... - # it is therefore not present when the CI tests are carried out... - # This condition is only for CI test to go through the upgrade process - ynh_secure_remove --file="$final_path" # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$final_path" else - # Create a temporary directory - tmpdir="$(mktemp -d)" - - # Backup the config file in the temp dir - cp -a "$final_path/config/config.ini.php" "$tmpdir/config.ini.php" - - # 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" #--keep="foo bar" to integrate when https://github.com/YunoHost/yunohost/pull/1200 is upstream - - # Copy the admin saved settings from tmp directory to final path - cp -a "$tmpdir/config.ini.php" "$final_path/config/config.ini.php" - - # Remove the tmp directory securely - ynh_secure_remove --file="$tmpdir" + ynh_setup_source --dest_dir="$final_path" --keep="$final_path/config/config.ini.php" fi fi diff --git a/scripts/ynh_composer__2 b/scripts/ynh_composer__2 deleted file mode 100644 index 762b7f7..0000000 --- a/scripts/ynh_composer__2 +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash - -# Execute a command with Composer -# -# usage: ynh_composer_exec [--phpversion=phpversion] [--workdir=$final_path] --commands="commands" -# | arg: -v, --phpversion - PHP version to use with composer -# | arg: -w, --workdir - The directory from where the command will be executed. Default $final_path. -# | arg: -c, --commands - Commands to execute. -ynh_composer_exec () { - # Declare an array to define the options of this helper. - local legacy_args=vwc - declare -Ar args_array=( [v]=phpversion= [w]=workdir= [c]=commands= ) - local phpversion - local workdir - local commands - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - workdir="${workdir:-$final_path}" - phpversion="${phpversion:-$YNH_PHP_VERSION}" - - COMPOSER_HOME="$workdir/.composer" \ - php${phpversion} "$workdir/composer.phar" $commands \ - -d "$workdir" --quiet --no-interaction -} - -# Install and initialize Composer in the given directory -# -# usage: ynh_install_composer [--phpversion=phpversion] [--workdir=$final_path] [--install_args="--optimize-autoloader"] -# | arg: -v, --phpversion - PHP version to use with composer -# | arg: -w, --workdir - The directory from where the command will be executed. Default $final_path. -# | arg: -a, --install_args - Additional arguments provided to the composer install. Argument --no-dev already include -ynh_install_composer () { - # Declare an array to define the options of this helper. - local legacy_args=vwa - declare -Ar args_array=( [v]=phpversion= [w]=workdir= [a]=install_args=) - local phpversion - local workdir - local install_args - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - workdir="${workdir:-$final_path}" - phpversion="${phpversion:-$YNH_PHP_VERSION}" - install_args="${install_args:-}" - - curl -sS https://getcomposer.org/installer \ - | COMPOSER_HOME="$workdir/.composer" \ - php${phpversion} -- --quiet --install-dir="$workdir" \ - || ynh_die "Unable to install Composer." - - # update dependencies to create composer.lock - ynh_composer_exec --phpversion="${phpversion}" --workdir="$workdir" --commands="install --no-dev $install_args" \ - || ynh_die "Unable to update core dependencies with Composer." -} From 03442c3f6fd05821b5841f10e3d715bab93ec116 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 9 May 2021 11:11:06 +0200 Subject: [PATCH 062/150] 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 b7778d4..3b8334d 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -9,7 +9,7 @@ YNH_PHP_VERSION="7.3" extra_php_dependencies="php${YNH_PHP_VERSION}-curl php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-cli php${YNH_PHP_VERSION}-mysql php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-mbstring" # Composer version -composer_version=1.10.17 +composer_version=2.0.13 #================================================= # PERSONAL HELPERS From 71869e49c8d6413525e9c3c8daea80329826e5e9 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 14 May 2021 12:40:55 +0200 Subject: [PATCH 063/150] Update check_process --- check_process | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check_process b/check_process index 4292fa2..2f95cfc 100644 --- a/check_process +++ b/check_process @@ -5,9 +5,9 @@ ;; Test complet ; Manifest - domain="domain.tld" (DOMAIN) - path="/path" (PATH) - is_public=1 (PUBLIC|public=1|private=0) + domain="domain.tld" + path="/path" + is_public=1 ; Checks pkg_linter=1 setup_sub_dir=1 From 06c2eec3874c24f6e582033ac000731f9fbc7ca9 Mon Sep 17 00:00:00 2001 From: YunoHost Bot Date: Mon, 17 May 2021 08:26:55 +0200 Subject: [PATCH 064/150] [autopatch] Update issue and PR templates (#46) Co-authored-by: Yunohost-Bot <> --- .../ISSUE_TEMPLATE.md | 31 ++++++++++++------- .github/PULL_REQUEST_TEMPLATE.md | 16 ++++++++++ pull_request_template.md | 16 ---------- 3 files changed, 36 insertions(+), 27 deletions(-) rename issue_template.md => .github/ISSUE_TEMPLATE.md (57%) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 pull_request_template.md diff --git a/issue_template.md b/.github/ISSUE_TEMPLATE.md similarity index 57% rename from issue_template.md rename to .github/ISSUE_TEMPLATE.md index 1cad34d..2729a6b 100644 --- a/issue_template.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,6 +1,6 @@ --- 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. +about: When creating a bug report, please use the following template to provide all the relevant information and help debugging efficiently. --- @@ -8,15 +8,17 @@ about: Create a report to help us debug, it would be nice to fill the template a 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 Matomo itself. Refer to its documentation or repository for help.* - - *If you have a doubt, post here, we will figure it out together.* + - *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** +### Describe the bug + *A clear and concise description of what the bug is.* -**Versions** +### 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 | ...* @@ -25,11 +27,11 @@ about: Create a report to help us debug, it would be nice to fill the template a - 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`* -**To Reproduce** -*Steps to reproduce the behavior.* +### Steps to reproduce + - *If you performed a command from the CLI, the command itself is enough. For example:* ```sh - sudo yunohost app install matomo + 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:* @@ -38,9 +40,16 @@ about: Create a report to help us debug, it would be nice to fill the template a 3. *Scroll down to '...'* 4. *See error* -**Expected behavior** +### 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.* +### 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) 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 44f243bad7e5cb4c1a53b9a5dd7e7817ae1bd932 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 17 May 2021 08:29:39 +0200 Subject: [PATCH 065/150] Upgrade to 4.3.0 --- check_process | 1 - conf/app.src | 4 ++-- scripts/install | 4 +++- scripts/restore | 4 +++- scripts/upgrade | 4 +++- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/check_process b/check_process index 2f95cfc..883dc13 100644 --- a/check_process +++ b/check_process @@ -19,7 +19,6 @@ upgrade=1 from_commit=1d3e9f3dbf72a6a124c879fa549ab8107367e36a backup_restore=1 multi_instance=1 - port_already_use=0 change_url=1 ;;; Options Email=anmol@datamol.org diff --git a/conf/app.src b/conf/app.src index a854ead..3b6999d 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/matomo-org/matomo/archive/refs/tags/4.3.0-rc1.tar.gz -SOURCE_SUM=af0951e086a4ac0f3fdc63fbe0d809dd202e47f36c735358ab20bc7479d36b87 +SOURCE_URL=https://github.com/matomo-org/matomo/archive/refs/tags/4.3.0.tar.gz +SOURCE_SUM=1e45495e9313c2deaf58ebb608564dfbf6bf05ed13cc823f013335b956556587 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/scripts/install b/scripts/install index 9c8d3a6..32fa320 100755 --- a/scripts/install +++ b/scripts/install @@ -117,7 +117,9 @@ ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" ynh_script_progression --message="Securing files and directories..." # Set permissions to app files -chown -R $app: $final_path +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" #================================================= # SETUP SSOWAT diff --git a/scripts/restore b/scripts/restore index 5b97f86..90d6af1 100755 --- a/scripts/restore +++ b/scripts/restore @@ -71,7 +71,9 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Restoring user rights..." # Restore permissions on app files -chown -R $app:$app $final_path +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" #================================================= # RESTORE THE PHP-FPM CONFIGURATION diff --git a/scripts/upgrade b/scripts/upgrade index eff80eb..903edfe 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -150,7 +150,9 @@ ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" ynh_script_progression --message="Securing files and directories..." # Set permissions on app files -chown -R $app: $final_path +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" #================================================= # RELOAD NGINX From 9ec2dd223f5d197c11fd0337176bfdcd3521cab2 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 17 May 2021 08:33:09 +0200 Subject: [PATCH 066/150] Update upgrade --- scripts/upgrade | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 903edfe..9b72c98 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -7,7 +7,6 @@ #================================================= source _common.sh -source ynh_composer__2 source /usr/share/yunohost/helpers #================================================= From 98163604d4f3cddd00f44ebed827e142acf14076 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 17 May 2021 09:47:18 +0200 Subject: [PATCH 067/150] 4.3.0 (#45) * Upgrade to 4.3.0 --- .../ISSUE_TEMPLATE.md | 31 +++++++---- .github/PULL_REQUEST_TEMPLATE.md | 16 ++++++ check_process | 7 ++- conf/app.src | 4 +- manifest.json | 2 +- pull_request_template.md | 16 ------ scripts/_common.sh | 19 ++----- scripts/install | 5 +- scripts/restore | 4 +- scripts/upgrade | 26 ++------- scripts/ynh_composer__2 | 53 ------------------- 11 files changed, 55 insertions(+), 128 deletions(-) rename issue_template.md => .github/ISSUE_TEMPLATE.md (57%) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 pull_request_template.md delete mode 100644 scripts/ynh_composer__2 diff --git a/issue_template.md b/.github/ISSUE_TEMPLATE.md similarity index 57% rename from issue_template.md rename to .github/ISSUE_TEMPLATE.md index 1cad34d..2729a6b 100644 --- a/issue_template.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,6 +1,6 @@ --- 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. +about: When creating a bug report, please use the following template to provide all the relevant information and help debugging efficiently. --- @@ -8,15 +8,17 @@ about: Create a report to help us debug, it would be nice to fill the template a 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 Matomo itself. Refer to its documentation or repository for help.* - - *If you have a doubt, post here, we will figure it out together.* + - *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** +### Describe the bug + *A clear and concise description of what the bug is.* -**Versions** +### 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 | ...* @@ -25,11 +27,11 @@ about: Create a report to help us debug, it would be nice to fill the template a - 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`* -**To Reproduce** -*Steps to reproduce the behavior.* +### Steps to reproduce + - *If you performed a command from the CLI, the command itself is enough. For example:* ```sh - sudo yunohost app install matomo + 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:* @@ -38,9 +40,16 @@ about: Create a report to help us debug, it would be nice to fill the template a 3. *Scroll down to '...'* 4. *See error* -**Expected behavior** +### 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.* +### 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) diff --git a/check_process b/check_process index 4292fa2..883dc13 100644 --- a/check_process +++ b/check_process @@ -5,9 +5,9 @@ ;; Test complet ; Manifest - domain="domain.tld" (DOMAIN) - path="/path" (PATH) - is_public=1 (PUBLIC|public=1|private=0) + domain="domain.tld" + path="/path" + is_public=1 ; Checks pkg_linter=1 setup_sub_dir=1 @@ -19,7 +19,6 @@ upgrade=1 from_commit=1d3e9f3dbf72a6a124c879fa549ab8107367e36a backup_restore=1 multi_instance=1 - port_already_use=0 change_url=1 ;;; Options Email=anmol@datamol.org diff --git a/conf/app.src b/conf/app.src index a854ead..3b6999d 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/matomo-org/matomo/archive/refs/tags/4.3.0-rc1.tar.gz -SOURCE_SUM=af0951e086a4ac0f3fdc63fbe0d809dd202e47f36c735358ab20bc7479d36b87 +SOURCE_URL=https://github.com/matomo-org/matomo/archive/refs/tags/4.3.0.tar.gz +SOURCE_SUM=1e45495e9313c2deaf58ebb608564dfbf6bf05ed13cc823f013335b956556587 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index ad58315..cad6831 100644 --- a/manifest.json +++ b/manifest.json @@ -14,7 +14,7 @@ "email": "anmol@datamol.org" }, "requirements": { - "yunohost": ">= 4.1.7" + "yunohost": ">= 4.2.4" }, "multi_instance": true, "services": [ 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!"* diff --git a/scripts/_common.sh b/scripts/_common.sh index c685199..3b8334d 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -8,6 +8,9 @@ YNH_PHP_VERSION="7.3" extra_php_dependencies="php${YNH_PHP_VERSION}-curl php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-cli php${YNH_PHP_VERSION}-mysql php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-mbstring" +# Composer version +composer_version=2.0.13 + #================================================= # PERSONAL HELPERS #================================================= @@ -76,19 +79,3 @@ $(yunohost tools diagnosis | grep -B 100 "services:" | sed '/services:/d')" # Send the email to the recipients echo "$mail_message" | $mail_bin -a "Content-Type: text/plain; charset=UTF-8" -s "$mail_subject" "$recipients" } - - - -# Execute a command as another user -# usage: ynh_exec_as USER COMMAND [ARG ...] -ynh_exec_as() { - local USER=$1 - shift 1 - - if [[ $USER = $(whoami) ]]; then - eval "$@" - else - sudo -u "$USER" "$@" - fi -} - diff --git a/scripts/install b/scripts/install index 37389a7..32fa320 100755 --- a/scripts/install +++ b/scripts/install @@ -7,7 +7,6 @@ #================================================= source _common.sh -source ynh_composer__2 source /usr/share/yunohost/helpers #================================================= @@ -118,7 +117,9 @@ ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" ynh_script_progression --message="Securing files and directories..." # Set permissions to app files -chown -R $app: $final_path +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" #================================================= # SETUP SSOWAT diff --git a/scripts/restore b/scripts/restore index 5b97f86..90d6af1 100755 --- a/scripts/restore +++ b/scripts/restore @@ -71,7 +71,9 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Restoring user rights..." # Restore permissions on app files -chown -R $app:$app $final_path +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" #================================================= # RESTORE THE PHP-FPM CONFIGURATION diff --git a/scripts/upgrade b/scripts/upgrade index dc54adc..9b72c98 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -7,7 +7,6 @@ #================================================= source _common.sh -source ynh_composer__2 source /usr/share/yunohost/helpers #================================================= @@ -79,30 +78,11 @@ then ynh_script_progression --message="Upgrading source files..." if [[ ! -f "$final_path/config/config.ini.php" ]]; then - # config.ini.php is only created during the post-install process... - # it is therefore not present when the CI tests are carried out... - # This condition is only for CI test to go through the upgrade process - ynh_secure_remove --file="$final_path" # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$final_path" else - # Create a temporary directory - tmpdir="$(mktemp -d)" - - # Backup the config file in the temp dir - cp -a "$final_path/config/config.ini.php" "$tmpdir/config.ini.php" - - # 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" #--keep="foo bar" to integrate when https://github.com/YunoHost/yunohost/pull/1200 is upstream - - # Copy the admin saved settings from tmp directory to final path - cp -a "$tmpdir/config.ini.php" "$final_path/config/config.ini.php" - - # Remove the tmp directory securely - ynh_secure_remove --file="$tmpdir" + ynh_setup_source --dest_dir="$final_path" --keep="$final_path/config/config.ini.php" fi fi @@ -169,7 +149,9 @@ ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" ynh_script_progression --message="Securing files and directories..." # Set permissions on app files -chown -R $app: $final_path +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" #================================================= # RELOAD NGINX diff --git a/scripts/ynh_composer__2 b/scripts/ynh_composer__2 deleted file mode 100644 index 762b7f7..0000000 --- a/scripts/ynh_composer__2 +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash - -# Execute a command with Composer -# -# usage: ynh_composer_exec [--phpversion=phpversion] [--workdir=$final_path] --commands="commands" -# | arg: -v, --phpversion - PHP version to use with composer -# | arg: -w, --workdir - The directory from where the command will be executed. Default $final_path. -# | arg: -c, --commands - Commands to execute. -ynh_composer_exec () { - # Declare an array to define the options of this helper. - local legacy_args=vwc - declare -Ar args_array=( [v]=phpversion= [w]=workdir= [c]=commands= ) - local phpversion - local workdir - local commands - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - workdir="${workdir:-$final_path}" - phpversion="${phpversion:-$YNH_PHP_VERSION}" - - COMPOSER_HOME="$workdir/.composer" \ - php${phpversion} "$workdir/composer.phar" $commands \ - -d "$workdir" --quiet --no-interaction -} - -# Install and initialize Composer in the given directory -# -# usage: ynh_install_composer [--phpversion=phpversion] [--workdir=$final_path] [--install_args="--optimize-autoloader"] -# | arg: -v, --phpversion - PHP version to use with composer -# | arg: -w, --workdir - The directory from where the command will be executed. Default $final_path. -# | arg: -a, --install_args - Additional arguments provided to the composer install. Argument --no-dev already include -ynh_install_composer () { - # Declare an array to define the options of this helper. - local legacy_args=vwa - declare -Ar args_array=( [v]=phpversion= [w]=workdir= [a]=install_args=) - local phpversion - local workdir - local install_args - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - workdir="${workdir:-$final_path}" - phpversion="${phpversion:-$YNH_PHP_VERSION}" - install_args="${install_args:-}" - - curl -sS https://getcomposer.org/installer \ - | COMPOSER_HOME="$workdir/.composer" \ - php${phpversion} -- --quiet --install-dir="$workdir" \ - || ynh_die "Unable to install Composer." - - # update dependencies to create composer.lock - ynh_composer_exec --phpversion="${phpversion}" --workdir="$workdir" --commands="install --no-dev $install_args" \ - || ynh_die "Unable to update core dependencies with Composer." -} From 03a5f200f67734a8afde7c51d4e1a2f18ce26592 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 17 May 2021 17:57:24 +0200 Subject: [PATCH 068/150] Update nginx.conf --- conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index d16f443..989f093 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -35,7 +35,7 @@ location __PATH__/ { ## disable all access to the following directories - location ~ ^/(config|tmp|core|lang) { + location __PATH__/(config|tmp|core|lang) { deny all; return 403; # replace with 404 to not show these directories exist } From 3d9e098bd5f3a52731c06ea2a7c6dfc9cb2a70e6 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 17 May 2021 18:27:27 +0200 Subject: [PATCH 069/150] Update nginx.conf --- conf/nginx.conf | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 989f093..5ece882 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -15,24 +15,22 @@ location __PATH__/ { client_max_body_size 100M; try_files $uri $uri/ index.php; - location ~ [^/]\.php(/|$) { - fastcgi_split_path_info ^(.+?\.php)(/.*)$; + location __PATH__/(index|matomo|piwik|js/index|plugins/HeatmapSessionRecording/configs)\.php(/|$) { + include snippets/fastcgi-php.conf; + try_files $fastcgi_script_name =404; + fastcgi_param HTTP_PROXY ""; fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; - - fastcgi_index index.php; - include fastcgi_params; - fastcgi_param REMOTE_USER $remote_user; - fastcgi_param PATH_INFO $fastcgi_path_info; - fastcgi_param SCRIPT_FILENAME $request_filename; } - ## deny access to all other .php files location ~* ^.+\.php$ { deny all; return 403; } + location __PATH__/ { + try_files $uri $uri/ =404; + } ## disable all access to the following directories location __PATH__/(config|tmp|core|lang) { @@ -40,7 +38,12 @@ location __PATH__/ { return 403; # replace with 404 to not show these directories exist } - location ~ js/container_.*_preview\.js$ { + location __PATH__/\.ht { + deny all; + return 403; + } + + location ~ js/container_.*_preview\.js$ { expires off; more_set_headers "Cache-Control: private, no-cache, no-store"; } @@ -60,7 +63,7 @@ location __PATH__/ { } ## properly display textfiles in root directory - location ~/(.*\.md|LEGALNOTICE|LICENSE) { + location __PATH__/(.*\.md|LEGALNOTICE|LICENSE) { default_type text/plain; } From 82e733f94413cb828deea25d44745d81c1e5c4f1 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 17 May 2021 18:35:17 +0200 Subject: [PATCH 070/150] Update nginx.conf --- conf/nginx.conf | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 5ece882..37cc876 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -15,11 +15,15 @@ location __PATH__/ { client_max_body_size 100M; try_files $uri $uri/ index.php; - location __PATH__/(index|matomo|piwik|js/index|plugins/HeatmapSessionRecording/configs)\.php(/|$) { - include snippets/fastcgi-php.conf; - try_files $fastcgi_script_name =404; - fastcgi_param HTTP_PROXY ""; + location ~ [^/]\.php(/|$) { + fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; + + fastcgi_index index.php; + include fastcgi_params; + fastcgi_param REMOTE_USER $remote_user; + fastcgi_param PATH_INFO $fastcgi_path_info; + fastcgi_param SCRIPT_FILENAME $request_filename; } ## deny access to all other .php files From 87caa582baba295b8051d0453d8df21a9192b4eb Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 17 May 2021 21:54:15 +0200 Subject: [PATCH 071/150] Update nginx.conf --- conf/nginx.conf | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 37cc876..24b508e 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -14,7 +14,8 @@ location __PATH__/ { # Common parameter to increase upload size limit in conjunction with dedicated PHP-FPM file client_max_body_size 100M; - try_files $uri $uri/ index.php; + try_files $uri $uri/ =404; + location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; @@ -32,10 +33,6 @@ location __PATH__/ { return 403; } - location __PATH__/ { - try_files $uri $uri/ =404; - } - ## disable all access to the following directories location __PATH__/(config|tmp|core|lang) { deny all; From 16f3a5d8460ef485df3c93bb0e38cfae96dca878 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 17 May 2021 22:16:06 +0200 Subject: [PATCH 072/150] Update nginx.conf --- conf/nginx.conf | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 24b508e..671c163 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,5 +1,5 @@ #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; -location __PATH__/ { +location ^~ __PATH__/ { # Path to source alias __FINALPATH__/ ; @@ -9,6 +9,10 @@ location __PATH__/ { rewrite ^ https://$server_name$request_uri? permanent; } + more_set_headers "Referrer-Policy; origin always"; + more_set_headers "X-Content-Type-Options: nosniff"; + more_set_headers "X-XSS-Protection: 1; mode=block"; + index index.php; # Common parameter to increase upload size limit in conjunction with dedicated PHP-FPM file @@ -17,14 +21,16 @@ location __PATH__/ { try_files $uri $uri/ =404; location ~ [^/]\.php(/|$) { + rewrite ^__PATH__/(index|matomo|piwik|js/index|plugins/HeatmapSessionRecording/configs)\.php$; + include snippets/fastcgi-php.conf; fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; - fastcgi_index index.php; - include fastcgi_params; - fastcgi_param REMOTE_USER $remote_user; - fastcgi_param PATH_INFO $fastcgi_path_info; - fastcgi_param SCRIPT_FILENAME $request_filename; + #fastcgi_index index.php; + #include fastcgi_params; + #fastcgi_param REMOTE_USER $remote_user; + #fastcgi_param PATH_INFO $fastcgi_path_info; + #fastcgi_param SCRIPT_FILENAME $request_filename; } ## deny access to all other .php files @@ -34,9 +40,9 @@ location __PATH__/ { } ## disable all access to the following directories - location __PATH__/(config|tmp|core|lang) { + location ~ ^__PATH__/(config|tmp|core|lang) { deny all; - return 403; # replace with 404 to not show these directories exist + return 404; } location __PATH__/\.ht { From 1d8d55af8291a4e421922693e6a97136e5c2d5f4 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 17 May 2021 22:23:00 +0200 Subject: [PATCH 073/150] Update nginx.conf --- conf/nginx.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 671c163..f3b3194 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -21,7 +21,6 @@ location ^~ __PATH__/ { try_files $uri $uri/ =404; location ~ [^/]\.php(/|$) { - rewrite ^__PATH__/(index|matomo|piwik|js/index|plugins/HeatmapSessionRecording/configs)\.php$; include snippets/fastcgi-php.conf; fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; From 6e1c4906b493dfb6ce268dc85786177385ba86f7 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 17 May 2021 22:37:53 +0200 Subject: [PATCH 074/150] Update nginx.conf --- conf/nginx.conf | 50 +++++++++++++++++++------------------------------ 1 file changed, 19 insertions(+), 31 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index f3b3194..b0516b8 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,8 +1,8 @@ #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; -location ^~ __PATH__/ { +server __PATH__/{ - # Path to source - alias __FINALPATH__/ ; + # Path to source + alias __FINALPATH__/; # Force usage of https if ($scheme = http) { @@ -12,25 +12,14 @@ location ^~ __PATH__/ { more_set_headers "Referrer-Policy; origin always"; more_set_headers "X-Content-Type-Options: nosniff"; more_set_headers "X-XSS-Protection: 1; mode=block"; + + index index.php; - index index.php; - - # Common parameter to increase upload size limit in conjunction with dedicated PHP-FPM file - client_max_body_size 100M; - - try_files $uri $uri/ =404; - - location ~ [^/]\.php(/|$) { - include snippets/fastcgi-php.conf; - fastcgi_split_path_info ^(.+?\.php)(/.*)$; - fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; - - #fastcgi_index index.php; - #include fastcgi_params; - #fastcgi_param REMOTE_USER $remote_user; - #fastcgi_param PATH_INFO $fastcgi_path_info; - #fastcgi_param SCRIPT_FILENAME $request_filename; - } + ## only allow accessing the following php files + location ~ ^/(index|matomo|piwik|js/index|plugins/HeatmapSessionRecording/configs)\.php$ { + fastcgi_param HTTP_PROXY ""; # prohibit httpoxy: https://httpoxy.org/ + fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; #replace with the path to your PHP socket file + } ## deny access to all other .php files location ~* ^.+\.php$ { @@ -38,20 +27,22 @@ location ^~ __PATH__/ { return 403; } + try_files $uri $uri/ =404; + ## disable all access to the following directories location ~ ^__PATH__/(config|tmp|core|lang) { deny all; - return 404; + return 403; # replace with 404 to not show these directories exist } - location __PATH__/\.ht { + location ~ __PATH__/\.ht { deny all; return 403; } location ~ js/container_.*_preview\.js$ { expires off; - more_set_headers "Cache-Control: private, no-cache, no-store"; + add_header Cache-Control 'private, no-cache, no-store'; } location ~ \.(gif|ico|jpg|png|svg|js|css|htm|html|mp3|mp4|wav|ogg|avi|ttf|eot|woff|woff2|json)$ { @@ -59,20 +50,17 @@ location ^~ __PATH__/ { ## Cache images,CSS,JS and webfonts for an hour ## Increasing the duration may improve the load-time, but may cause old files to show after an Matomo upgrade expires 1h; - more_set_headers "Cache-Control: public"; - more_set_headers "Pragma: public"; + add_header Pragma public; + add_header Cache-Control "public"; } - location __PATH__/(libs|vendor|plugins|misc|node_modules) { + location ~ ^__PATH__/(libs|vendor|plugins|misc|node_modules) { deny all; return 403; } ## properly display textfiles in root directory - location __PATH__/(.*\.md|LEGALNOTICE|LICENSE) { + location ~/(.*\.md|LEGALNOTICE|LICENSE) { default_type text/plain; } - - # Include SSOWAT user panel. - include conf.d/yunohost_panel.conf.inc; } From 51892c3a7c6fa8e0ce4f3829275721e845bee0c2 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 17 May 2021 22:43:01 +0200 Subject: [PATCH 075/150] Update nginx.conf --- conf/nginx.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index b0516b8..f9fc1d7 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,5 +1,5 @@ #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; -server __PATH__/{ +location __PATH__/ { # Path to source alias __FINALPATH__/; @@ -42,7 +42,7 @@ server __PATH__/{ location ~ js/container_.*_preview\.js$ { expires off; - add_header Cache-Control 'private, no-cache, no-store'; + more_set_headers "Cache-Control: private, no-cache, no-store"'"; } location ~ \.(gif|ico|jpg|png|svg|js|css|htm|html|mp3|mp4|wav|ogg|avi|ttf|eot|woff|woff2|json)$ { @@ -50,8 +50,8 @@ server __PATH__/{ ## Cache images,CSS,JS and webfonts for an hour ## Increasing the duration may improve the load-time, but may cause old files to show after an Matomo upgrade expires 1h; - add_header Pragma public; - add_header Cache-Control "public"; + more_set_headers "Pragma: public"; + more_set_headers "Cache-Control: public"; } location ~ ^__PATH__/(libs|vendor|plugins|misc|node_modules) { From 5cc0031f57e471e0070f30f7333c1fb413f76289 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 17 May 2021 22:46:37 +0200 Subject: [PATCH 076/150] Update nginx.conf --- conf/nginx.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index f9fc1d7..08b68fa 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -9,7 +9,7 @@ location __PATH__/ { rewrite ^ https://$server_name$request_uri? permanent; } - more_set_headers "Referrer-Policy; origin always"; + more_set_headers "Referrer-Policy: origin always"; more_set_headers "X-Content-Type-Options: nosniff"; more_set_headers "X-XSS-Protection: 1; mode=block"; @@ -42,7 +42,7 @@ location __PATH__/ { location ~ js/container_.*_preview\.js$ { expires off; - more_set_headers "Cache-Control: private, no-cache, no-store"'"; + more_set_headers "Cache-Control: private, no-cache, no-store"; } location ~ \.(gif|ico|jpg|png|svg|js|css|htm|html|mp3|mp4|wav|ogg|avi|ttf|eot|woff|woff2|json)$ { From c9c53149391cc8c70e3561381395bd212b2b2f0d Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 17 May 2021 22:58:01 +0200 Subject: [PATCH 077/150] Update nginx.conf --- conf/nginx.conf | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 08b68fa..ba230ca 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -13,12 +13,19 @@ location __PATH__/ { more_set_headers "X-Content-Type-Options: nosniff"; more_set_headers "X-XSS-Protection: 1; mode=block"; - index index.php; + index index.php; - ## only allow accessing the following php files - location ~ ^/(index|matomo|piwik|js/index|plugins/HeatmapSessionRecording/configs)\.php$ { - fastcgi_param HTTP_PROXY ""; # prohibit httpoxy: https://httpoxy.org/ - fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; #replace with the path to your PHP socket file + try_files $uri $uri/ =404; + + location ~ [^/]\.php(/|$) { + fastcgi_split_path_info ^(.+?\.php)(/.*)$; + fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; + + fastcgi_index index.php; + include fastcgi_params; + fastcgi_param REMOTE_USER $remote_user; + fastcgi_param PATH_INFO $fastcgi_path_info; + fastcgi_param SCRIPT_FILENAME $request_filename; } ## deny access to all other .php files @@ -27,12 +34,10 @@ location __PATH__/ { return 403; } - try_files $uri $uri/ =404; - ## disable all access to the following directories location ~ ^__PATH__/(config|tmp|core|lang) { deny all; - return 403; # replace with 404 to not show these directories exist + return 404; } location ~ __PATH__/\.ht { From f12c5ce18dfdf87ed9447257a7846409dd490015 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 17 May 2021 23:36:32 +0200 Subject: [PATCH 078/150] Update nginx.conf --- conf/nginx.conf | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index ba230ca..09cca21 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,5 +1,5 @@ #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; -location __PATH__/ { +location ^~ __PATH__/ { # Path to source alias __FINALPATH__/; @@ -65,7 +65,10 @@ location __PATH__/ { } ## properly display textfiles in root directory - location ~/(.*\.md|LEGALNOTICE|LICENSE) { + location ~__PATH__/(.*\.md|LEGALNOTICE|LICENSE) { default_type text/plain; } + + # show YunoHost panel access + include conf.d/yunohost_panel.conf.inc; } From 6ab1bf13aaca8a35b477a15eeb5dd4ba57e1b51e Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 17 May 2021 23:39:12 +0200 Subject: [PATCH 079/150] Update nginx.conf --- conf/nginx.conf | 43 ++++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index d16f443..09cca21 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,31 +1,32 @@ #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; -location __PATH__/ { +location ^~ __PATH__/ { - # Path to source - alias __FINALPATH__/ ; + # Path to source + alias __FINALPATH__/; # Force usage of https if ($scheme = http) { rewrite ^ https://$server_name$request_uri? permanent; } + more_set_headers "Referrer-Policy: origin always"; + more_set_headers "X-Content-Type-Options: nosniff"; + more_set_headers "X-XSS-Protection: 1; mode=block"; + index index.php; - # Common parameter to increase upload size limit in conjunction with dedicated PHP-FPM file - client_max_body_size 100M; + try_files $uri $uri/ =404; - try_files $uri $uri/ index.php; location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; fastcgi_index index.php; include fastcgi_params; - fastcgi_param REMOTE_USER $remote_user; - fastcgi_param PATH_INFO $fastcgi_path_info; + fastcgi_param REMOTE_USER $remote_user; + fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $request_filename; - } - + } ## deny access to all other .php files location ~* ^.+\.php$ { @@ -33,14 +34,18 @@ location __PATH__/ { return 403; } - ## disable all access to the following directories - location ~ ^/(config|tmp|core|lang) { + location ~ ^__PATH__/(config|tmp|core|lang) { deny all; - return 403; # replace with 404 to not show these directories exist + return 404; } - location ~ js/container_.*_preview\.js$ { + location ~ __PATH__/\.ht { + deny all; + return 403; + } + + location ~ js/container_.*_preview\.js$ { expires off; more_set_headers "Cache-Control: private, no-cache, no-store"; } @@ -50,20 +55,20 @@ location __PATH__/ { ## Cache images,CSS,JS and webfonts for an hour ## Increasing the duration may improve the load-time, but may cause old files to show after an Matomo upgrade expires 1h; - more_set_headers "Cache-Control: public"; more_set_headers "Pragma: public"; + more_set_headers "Cache-Control: public"; } - location __PATH__/(libs|vendor|plugins|misc|node_modules) { + location ~ ^__PATH__/(libs|vendor|plugins|misc|node_modules) { deny all; return 403; } ## properly display textfiles in root directory - location ~/(.*\.md|LEGALNOTICE|LICENSE) { + location ~__PATH__/(.*\.md|LEGALNOTICE|LICENSE) { default_type text/plain; } - # Include SSOWAT user panel. - include conf.d/yunohost_panel.conf.inc; + # show YunoHost panel access + include conf.d/yunohost_panel.conf.inc; } From 97d5558ebe8103450e3af0acf9b46f3664c78924 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 17 May 2021 23:52:05 +0200 Subject: [PATCH 080/150] Update nginx.conf --- conf/nginx.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 09cca21..d1c54ad 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -35,9 +35,9 @@ location ^~ __PATH__/ { } ## disable all access to the following directories - location ~ ^__PATH__/(config|tmp|core|lang) { + location ~ ^__PATH__/(config/|tmp/|core/|lang/) { deny all; - return 404; + return 403; } location ~ __PATH__/\.ht { From 041bc3c460bff6f2e9c7065ac15e86d8982814db Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 18 May 2021 00:09:23 +0200 Subject: [PATCH 081/150] Update nginx.conf --- conf/nginx.conf | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index d1c54ad..f1da700 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -35,7 +35,22 @@ location ^~ __PATH__/ { } ## disable all access to the following directories - location ~ ^__PATH__/(config/|tmp/|core/|lang/) { + location ^~ __PATH__/config/ { + deny all; + return 403; + } + + location ^~ __PATH__/tmp/ { + deny all; + return 403; + } + + location ^~ __PATH__/core/ { + deny all; + return 403; + } + + location ^~ __PATH__/lang/ { deny all; return 403; } From ff69449466a2ea566d8500bfc0078d77a8ad1dc5 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 18 May 2021 00:12:54 +0200 Subject: [PATCH 082/150] Update cron --- conf/cron | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/cron b/conf/cron index 02900b9..3450193 100644 --- a/conf/cron +++ b/conf/cron @@ -1,2 +1,2 @@ MAILTO="admin" -5 * * * * __APP__ /usr/bin/php__PHPVERSION__ __FINALPATH__/console core:archive --url=https://__DOMAIN____PATH__ > /dev/null +5 * * * * www-data /usr/bin/php__PHPVERSION__ __FINALPATH__/console core:archive --url=https://__DOMAIN____PATH__ > /dev/null From 9a1833c733eddf157ba28f1cc704eb7a07a4e1ca Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 18 May 2021 10:20:17 +0200 Subject: [PATCH 083/150] 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 3b8334d..00f941c 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -9,7 +9,7 @@ YNH_PHP_VERSION="7.3" extra_php_dependencies="php${YNH_PHP_VERSION}-curl php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-cli php${YNH_PHP_VERSION}-mysql php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-mbstring" # Composer version -composer_version=2.0.13 +YNH_COMPOSER_VERSION="2.0.13" #================================================= # PERSONAL HELPERS From 0e1c832c4aff4b302d992efc838bfbffd952ea65 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 18 May 2021 10:20:47 +0200 Subject: [PATCH 084/150] Update cron --- conf/cron | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/cron b/conf/cron index 3450193..02900b9 100644 --- a/conf/cron +++ b/conf/cron @@ -1,2 +1,2 @@ MAILTO="admin" -5 * * * * www-data /usr/bin/php__PHPVERSION__ __FINALPATH__/console core:archive --url=https://__DOMAIN____PATH__ > /dev/null +5 * * * * __APP__ /usr/bin/php__PHPVERSION__ __FINALPATH__/console core:archive --url=https://__DOMAIN____PATH__ > /dev/null From d8238ba6a1834d672cd25ec7844d3f8151d38a62 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 18 May 2021 10:35:49 +0200 Subject: [PATCH 085/150] Update upgrade --- scripts/upgrade | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 9b72c98..1b07991 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -78,11 +78,31 @@ then ynh_script_progression --message="Upgrading source files..." if [[ ! -f "$final_path/config/config.ini.php" ]]; then - # Download, check integrity, uncompress and patch the source from app.src + # config.ini.php is only created during the post-install process... + # it is therefore not present when the CI tests are carried out... + # This condition is only for CI test to go through the upgrade process ynh_setup_source --dest_dir="$final_path" else + # Create a temporary directory + tmpdir="$(mktemp -d)" + + # Backup the config file in the temp dir + cp -a "$final_path/config/config.ini.php" "$tmpdir/config.ini.php" + + # 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" --keep="$final_path/config/config.ini.php" + ynh_setup_source --dest_dir="$final_path" #--keep="foo bar" to integrate when https://github.com/YunoHost/yunohost/pull/1200 is upstream + + # Copy the admin saved settings from tmp directory to final path + cp -a "$tmpdir/config.ini.php" "$final_path/config/config.ini.php" + + # Remove the tmp directory securely + ynh_secure_remove --file="$tmpdir" + + # Download, check integrity, uncompress and patch the source from app.src + #ynh_setup_source --dest_dir="$final_path" --keep="$final_path/config/config.ini.php" fi fi From 881e3736d3b7a2e3ef9fcc0d8c27984c4bc9bfc0 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 18 May 2021 10:41:49 +0200 Subject: [PATCH 086/150] Update upgrade --- scripts/upgrade | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 1b07991..4341ad4 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -100,7 +100,7 @@ then # Remove the tmp directory securely ynh_secure_remove --file="$tmpdir" - + # Download, check integrity, uncompress and patch the source from app.src #ynh_setup_source --dest_dir="$final_path" --keep="$final_path/config/config.ini.php" fi @@ -137,10 +137,17 @@ ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencie #================================================= ynh_script_progression --message="Installating composer and dependencies..." +if [ "$upgrade_type" == "UPGRADE_APP" ] +then + ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" -if [[ -f "$final_path/config/config.ini.php" ]]; then - php$phpversion $final_path/console core:update +# if [[ -f "$final_path/config/config.ini.php" ]]; then +# php$phpversion $final_path/console core:update -n +# fi + + + php$phpversion $final_path/console core:update -n fi #================================================= From f9c793bac470886d487e261186417a704a2d5638 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 18 May 2021 11:32:20 +0200 Subject: [PATCH 087/150] Fix --- conf/config.ini.php | 6 ++++++ scripts/install | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/conf/config.ini.php b/conf/config.ini.php index 548d94b..5ccebd8 100644 --- a/conf/config.ini.php +++ b/conf/config.ini.php @@ -7,3 +7,9 @@ password = "__DB_PWD__" dbname = "__DB_NAME__" tables_prefix = "matomo_" charset = "utf8mb4" + +[General] +force_ssl = 1 +salt = "__SALT__" +trusted_hosts[] = "__DOMAIN__" +trusted_hosts[] = "WWW.__DOMAIN__" diff --git a/scripts/install b/scripts/install index 32fa320..7c9c209 100755 --- a/scripts/install +++ b/scripts/install @@ -55,6 +55,13 @@ db_user=$db_name ynh_app_setting_set --app=$app --key=db_name --value=$db_name ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name +#================================================= +# SETUP MYSQL +#================================================= +ynh_script_progression --message="Setuping MySQL..." + +ynh_replace_string --match_string="max_allowed_packet = 16M" --replace_string="max_allowed_packet = 64M" --target_file="/etc/mysql/my.cnf" + #================================================= # CREATE DEDICATED USER #================================================= @@ -96,7 +103,7 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= ynh_script_progression --message="Installing Composer and dependencies..." -ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" +ynh_install_composer #--phpversion="$phpversion" --workdir="$final_path" # Install missing icons ynh_setup_source --dest_dir="$final_path/plugins/Morpheus/icons" --source_id="icons" @@ -109,6 +116,13 @@ ynh_script_progression --message="Setuping a cron..." ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" +#================================================= +# SETUP A CRON +#================================================= +ynh_script_progression --message="Setuping a configuration file..." + +ynh_add_config --template="../conf/config.ini.php" --destination="$final_path/config/config.ini.php" + #================================================= # GENERIC FINALIZATION #================================================= From 039dd42ea40c50c0c14d7146d1eddd86c92b3299 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 18 May 2021 11:35:44 +0200 Subject: [PATCH 088/150] Update install --- scripts/install | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/install b/scripts/install index 7c9c209..60ab2ab 100755 --- a/scripts/install +++ b/scripts/install @@ -121,6 +121,7 @@ ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" #================================================= ynh_script_progression --message="Setuping a configuration file..." +salt="$(ynh_string_random --length=30)" ynh_add_config --template="../conf/config.ini.php" --destination="$final_path/config/config.ini.php" #================================================= From 91d2d079c9c20438c971cb65bab426c76bd52a6f Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 18 May 2021 11:38:21 +0200 Subject: [PATCH 089/150] fix --- conf/config.ini.php | 10 ---------- scripts/install | 1 - 2 files changed, 11 deletions(-) diff --git a/conf/config.ini.php b/conf/config.ini.php index 5ccebd8..2cd9950 100644 --- a/conf/config.ini.php +++ b/conf/config.ini.php @@ -1,15 +1,5 @@ ; DO NOT REMOVE THIS LINE ; file automatically generated or modified by Matomo; you can manually override the default values in global.ini.php by redefining them in this file. -[database] -host = "127.0.0.1" -username = "__DB_NAME__" -password = "__DB_PWD__" -dbname = "__DB_NAME__" -tables_prefix = "matomo_" -charset = "utf8mb4" [General] force_ssl = 1 -salt = "__SALT__" -trusted_hosts[] = "__DOMAIN__" -trusted_hosts[] = "WWW.__DOMAIN__" diff --git a/scripts/install b/scripts/install index 60ab2ab..7c9c209 100755 --- a/scripts/install +++ b/scripts/install @@ -121,7 +121,6 @@ ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" #================================================= ynh_script_progression --message="Setuping a configuration file..." -salt="$(ynh_string_random --length=30)" ynh_add_config --template="../conf/config.ini.php" --destination="$final_path/config/config.ini.php" #================================================= From 91c0a78bd414ea01ca60d9689c2d31fa04bcf8c0 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 18 May 2021 11:40:24 +0200 Subject: [PATCH 090/150] Fix --- conf/config.ini.php | 5 ----- scripts/install | 7 ------- 2 files changed, 12 deletions(-) delete mode 100644 conf/config.ini.php diff --git a/conf/config.ini.php b/conf/config.ini.php deleted file mode 100644 index 2cd9950..0000000 --- a/conf/config.ini.php +++ /dev/null @@ -1,5 +0,0 @@ -; DO NOT REMOVE THIS LINE -; file automatically generated or modified by Matomo; you can manually override the default values in global.ini.php by redefining them in this file. - -[General] -force_ssl = 1 diff --git a/scripts/install b/scripts/install index 7c9c209..8b9e8e7 100755 --- a/scripts/install +++ b/scripts/install @@ -116,13 +116,6 @@ ynh_script_progression --message="Setuping a cron..." ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" -#================================================= -# SETUP A CRON -#================================================= -ynh_script_progression --message="Setuping a configuration file..." - -ynh_add_config --template="../conf/config.ini.php" --destination="$final_path/config/config.ini.php" - #================================================= # GENERIC FINALIZATION #================================================= From 06722ed55d113b1258233ff78b8104af964c26c3 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 18 May 2021 11:41:30 +0200 Subject: [PATCH 091/150] Fix --- scripts/install | 2 +- scripts/upgrade | 20 ++------------------ 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/scripts/install b/scripts/install index 8b9e8e7..5967a78 100755 --- a/scripts/install +++ b/scripts/install @@ -103,7 +103,7 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= ynh_script_progression --message="Installing Composer and dependencies..." -ynh_install_composer #--phpversion="$phpversion" --workdir="$final_path" +ynh_install_composer # Install missing icons ynh_setup_source --dest_dir="$final_path/plugins/Morpheus/icons" --source_id="icons" diff --git a/scripts/upgrade b/scripts/upgrade index 966a796..fb41339 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -84,16 +84,7 @@ then ynh_setup_source --dest_dir="$final_path" else # Download, check integrity, uncompress and patch the source from app.src - ynh_setup_source --dest_dir="$final_path" #--keep="foo bar" to integrate when https://github.com/YunoHost/yunohost/pull/1200 is upstream - - # Copy the admin saved settings from tmp directory to final path - cp -a "$tmpdir/config.ini.php" "$final_path/config/config.ini.php" - - # Remove the tmp directory securely - ynh_secure_remove --file="$tmpdir" - - # Download, check integrity, uncompress and patch the source from app.src - #ynh_setup_source --dest_dir="$final_path" --keep="$final_path/config/config.ini.php" + ynh_setup_source --dest_dir="$final_path" --keep="$final_path/config/config.ini.php" fi fi @@ -130,14 +121,7 @@ ynh_script_progression --message="Installating composer and dependencies..." if [ "$upgrade_type" == "UPGRADE_APP" ] then - -ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" - -# if [[ -f "$final_path/config/config.ini.php" ]]; then -# php$phpversion $final_path/console core:update -n -# fi - - + ynh_install_composer php$phpversion $final_path/console core:update -n fi From a6c1f888f4cf3fc872e9ed5055fe089488fd93ba Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 18 May 2021 12:37:42 +0200 Subject: [PATCH 092/150] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 5967a78..5c833ac 100755 --- a/scripts/install +++ b/scripts/install @@ -58,7 +58,7 @@ ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name #================================================= # SETUP MYSQL #================================================= -ynh_script_progression --message="Setuping MySQL..." +ynh_script_progression --message="Configuring MySQL..." ynh_replace_string --match_string="max_allowed_packet = 16M" --replace_string="max_allowed_packet = 64M" --target_file="/etc/mysql/my.cnf" From 40c97571393e492d5b5ec9ebe4f55a00350b7632 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 20 May 2021 09:47:11 +0200 Subject: [PATCH 093/150] Update install --- scripts/install | 7 ------- 1 file changed, 7 deletions(-) diff --git a/scripts/install b/scripts/install index 5c833ac..6969415 100755 --- a/scripts/install +++ b/scripts/install @@ -55,13 +55,6 @@ db_user=$db_name ynh_app_setting_set --app=$app --key=db_name --value=$db_name ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name -#================================================= -# SETUP MYSQL -#================================================= -ynh_script_progression --message="Configuring MySQL..." - -ynh_replace_string --match_string="max_allowed_packet = 16M" --replace_string="max_allowed_packet = 64M" --target_file="/etc/mysql/my.cnf" - #================================================= # CREATE DEDICATED USER #================================================= From 0827fd914f8be901684ea151e1fd9db0a66c8367 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 26 May 2021 07:41:51 +0200 Subject: [PATCH 094/150] Upgrade to version 4.3.1 --- README.md | 2 +- README_fr.md | 2 +- check_process | 5 ----- conf/app.src | 4 ++-- manifest.json | 2 +- scripts/install | 17 +++++------------ scripts/restore | 14 ++++---------- scripts/upgrade | 16 ++++------------ 8 files changed, 18 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index 117f0c1..efcd962 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 Matomo is the leading Free/Libre open analytics platform. It is a full-featured PHP MySQL software program that you download and install on your own webserver. At the end of the five-minute installation process, you will be given a JavaScript code. Simply copy and paste this tag on websites you wish to track and access your analytics reports in real-time. -**Shipped version:** 4.3.0 +**Shipped version:** 4.3.1 ## Screenshots diff --git a/README_fr.md b/README_fr.md index 026f861..2416c5d 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 Matomo est une plateforme d'analyse open source de mesure de statistiques Web. Il s'agit d'un logiciel PHP MySQL complet que vous téléchargez et installez sur votre propre serveur Web. À la fin du processus d'installation de cinq minutes, vous recevrez un code JavaScript. Copiez et collez simplement cette balise sur les sites Web que vous souhaitez suivre et accédez à vos rapports d'analyse en temps réel. -**Version incluse :** 4.3.0 +**Version incluse :** 4.3.1 ## Captures d'écran diff --git a/check_process b/check_process index 883dc13..2fd209e 100644 --- a/check_process +++ b/check_process @@ -1,8 +1,3 @@ -# 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" diff --git a/conf/app.src b/conf/app.src index 3b6999d..5e9b8ce 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/matomo-org/matomo/archive/refs/tags/4.3.0.tar.gz -SOURCE_SUM=1e45495e9313c2deaf58ebb608564dfbf6bf05ed13cc823f013335b956556587 +SOURCE_URL=https://github.com/matomo-org/matomo/archive/refs/tags/4.3.1.tar.gz +SOURCE_SUM=1b81dff17dd35e1b3a1fe6a5fe28a2916c5fb5537bf3fafc13020f52becf888a SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index cad6831..36d0d9e 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.3.0~ynh1", + "version": "4.3.1~ynh1", "url": "https://matomo.org", "license": "GPL-3.0-or-later", "maintainer": { diff --git a/scripts/install b/scripts/install index 5967a78..12b5e32 100755 --- a/scripts/install +++ b/scripts/install @@ -79,6 +79,11 @@ 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" +# Set permissions to app files +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + #================================================= # NGINX CONFIGURATION #================================================= @@ -116,18 +121,6 @@ ynh_script_progression --message="Setuping a cron..." ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" -#================================================= -# GENERIC FINALIZATION -#================================================= -# SECURE FILES AND DIRECTORIES -#================================================= -ynh_script_progression --message="Securing files and directories..." - -# Set permissions to app files -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" - #================================================= # SETUP SSOWAT #================================================= diff --git a/scripts/restore b/scripts/restore index 90d6af1..5f639dc 100755 --- a/scripts/restore +++ b/scripts/restore @@ -57,6 +57,10 @@ ynh_script_progression --message="Restoring Matomo main directory..." ynh_restore_file --origin_path="$final_path" +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + #================================================= # RECREATE THE DEDICATED USER #================================================= @@ -65,16 +69,6 @@ ynh_script_progression --message="Recreating the dedicated system user..." # Create the dedicated user (if not existing) ynh_system_user_create --username=$app -#================================================= -# RESTORE USER RIGHTS -#================================================= -ynh_script_progression --message="Restoring user rights..." - -# Restore permissions on app files -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" - #================================================= # RESTORE THE PHP-FPM CONFIGURATION #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index fb41339..22035b7 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -88,6 +88,10 @@ then fi fi +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + #================================================= # NGINX CONFIGURATION #================================================= @@ -143,18 +147,6 @@ ynh_script_progression --message="Setuping a cron..." ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" -#================================================= -# GENERIC FINALIZATION -#================================================= -# SECURE FILES AND DIRECTORIES -#================================================= -ynh_script_progression --message="Securing files and directories..." - -# Set permissions on app files -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" - #================================================= # RELOAD NGINX #================================================= From 5e25eb64c592019b83afb6ffe32ba96acb17dc83 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 26 May 2021 07:57:49 +0200 Subject: [PATCH 095/150] Add templates --- doc/.DS_Store | Bin 0 -> 6148 bytes doc/DISCLAIMER.md | 5 +++++ doc/DISCLAIMER_fr.md | 5 +++++ doc/screenshots/screenshot.png | Bin 0 -> 155260 bytes manifest.json | 8 ++++++++ 5 files changed, 18 insertions(+) create mode 100644 doc/.DS_Store create mode 100644 doc/DISCLAIMER.md create mode 100644 doc/DISCLAIMER_fr.md create mode 100644 doc/screenshots/screenshot.png diff --git a/doc/.DS_Store b/doc/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..fc7b8a40949f5488c93362acd831b939baeb97b0 GIT binary patch literal 6148 zcmeHK%}(4f5FRhvHZG_NQV$?;u*9L4J#4kxa*ejYsS>C`a479IX{>If$VN$)J*-xW z`T%`^a_!H1ls*J6!kro0TZFb;QK>x9_?wJp#>wZ%jsbuT#@Ta#5C8&H!WPHoFGBsK z3(|5PLS|}6P*A}LG}H^x-tjLoKy$Z@bM_HRka%6sUzJX(leEw&MqH*RMPAk2?geWt zwI4iu6!6D!gC&TdRE3N7zSF$wqY>nfiTxEJP&|{TVCf*e{_I^^2unymhWMi1+0Uw5I z(`m2wq9c0!{;VUWTU*_Z==WaEW;_VipY6VRKmPpX>)E&OKYso?H(9{&(>1c{a1OuG zxP_Y2xKxE!pD<#cJVBNAwJM2JV&tS|0=|VdSu}XqFCa z==YKO+k_-&(^-O0IE)-N7O@9~*;GWE%G?oy*>v;^7Z*8fEZTHnW@N16MrQ7W!p!LC z7bYB7WYM>t0nflq2A1q?Nc;cJ?dSiSN&e0=;2HR@7+~$~czb}a=^gL=TGp5im6P#xroI3|s*i)MY*Z literal 0 HcmV?d00001 diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md new file mode 100644 index 0000000..0cb06eb --- /dev/null +++ b/doc/DISCLAIMER.md @@ -0,0 +1,5 @@ +## Configuration + +1. The app will require to complete the registration process after the instllation is complete by **visiting the domain** on which Matomo is installed. +1. The MySQL database credentials will be sent to the **admin mail**. Fill these details while doing the registration process. +1. No LDAP support yet for the app. diff --git a/doc/DISCLAIMER_fr.md b/doc/DISCLAIMER_fr.md new file mode 100644 index 0000000..737fcc0 --- /dev/null +++ b/doc/DISCLAIMER_fr.md @@ -0,0 +1,5 @@ +## Configuration + +1. Une fois l'installation terminée, l'application devra terminer le processus d'enregistrement en **visitant le domaine** sur lequel Matomo est installé. +1. Les informations d'identification de la base de données MySQL seront envoyées à **l'email admin**. Remplissez ces détails lors du processus d'inscription. +1. Le support LDAP n'est pas encore implémenté pour cette l'application. diff --git a/doc/screenshots/screenshot.png b/doc/screenshots/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..472076676cb5078ff6cf7bacdcf88c08ee068cdc GIT binary patch literal 155260 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°_54glp-y+GJWlY0C%vyMH&Wo^ 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%0AOd75{Ii!O1<4(%E-zS0Oi- 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 Date: Wed, 26 May 2021 08:03:24 +0200 Subject: [PATCH 096/150] Fix --- scripts/install | 2 +- scripts/restore | 16 ++++++++-------- scripts/upgrade | 16 ++++++++-------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/scripts/install b/scripts/install index 12b5e32..3c5cdac 100755 --- a/scripts/install +++ b/scripts/install @@ -68,7 +68,7 @@ ynh_replace_string --match_string="max_allowed_packet = 16M" --replace_string="m ynh_script_progression --message="Configuring system user..." # Create a system user -ynh_system_user_create --username=$app +ynh_system_user_create --username=$app --home_dir="$final_path" #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE diff --git a/scripts/restore b/scripts/restore index 5f639dc..27db4c7 100755 --- a/scripts/restore +++ b/scripts/restore @@ -50,6 +50,14 @@ ynh_script_progression --message="Restoring the NGINX configuration..." 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..." + +# Create the dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir="$final_path" + #================================================= # RESTORE THE APP MAIN DIR #================================================= @@ -61,14 +69,6 @@ chmod 750 "$final_path" chmod -R o-rwx "$final_path" chown -R $app:www-data "$final_path" -#================================================= -# RECREATE THE DEDICATED USER -#================================================= -ynh_script_progression --message="Recreating the dedicated system user..." - -# Create the dedicated user (if not existing) -ynh_system_user_create --username=$app - #================================================= # RESTORE THE PHP-FPM CONFIGURATION #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 22035b7..2712591 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -53,6 +53,14 @@ if ynh_legacy_permissions_exists; then ynh_app_setting_delete --app=$app --key=is_public fi +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Making sure dedicated system user exists..." + +# Create a dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir="$final_path" + #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= @@ -100,14 +108,6 @@ ynh_script_progression --message="Upgrading NGINX web server configuration..." # Create a dedicated NGINX config ynh_add_nginx_config -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Making sure dedicated system user exists..." - -# Create a dedicated user (if not existing) -ynh_system_user_create --username=$app - #================================================= # PHP-FPM CONFIGURATION #================================================= From 8da76ae8a2a3d0c832937b9dfbc09ae1e6017c66 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 26 May 2021 09:03:58 +0200 Subject: [PATCH 097/150] Update upgrade --- scripts/upgrade | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 2712591..d07323b 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -125,8 +125,10 @@ ynh_script_progression --message="Installating composer and dependencies..." if [ "$upgrade_type" == "UPGRADE_APP" ] then - ynh_install_composer + ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" + if [[ -f "$final_path/config/config.ini.php" ]]; then php$phpversion $final_path/console core:update -n + fi fi #================================================= From 777ca487ae4e22009dcdcb2428345f82c5ee26cf Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 27 May 2021 11:30:22 +0200 Subject: [PATCH 098/150] Update install --- scripts/install | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/install b/scripts/install index db3f7f2..d256023 100755 --- a/scripts/install +++ b/scripts/install @@ -113,6 +113,8 @@ chmod -R 755 "$final_path/plugins/Morpheus" ynh_script_progression --message="Setuping a cron..." ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" +chown root: "/etc/cron.d/$app" +chmod 644 "/etc/cron.d/$app" #================================================= # SETUP SSOWAT From 084d9af1e59f0f98cc34ae7e32b00db3328fcef0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lemonsu=20Lo=C3=AFc?= Date: Thu, 8 Jul 2021 08:11:39 +0200 Subject: [PATCH 099/150] Changed the URL of the sources to include all sub modules (#48) * Change for the URL used in the official documentation This archive contains the git sub-modules such as the tag manager for example * no more need for the specific setup part * Same, no more need for the specific setup part --- conf/app.src | 4 ++-- scripts/install | 9 --------- scripts/upgrade | 22 ---------------------- 3 files changed, 2 insertions(+), 33 deletions(-) diff --git a/conf/app.src b/conf/app.src index 5e9b8ce..98d6c1d 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/matomo-org/matomo/archive/refs/tags/4.3.1.tar.gz -SOURCE_SUM=1b81dff17dd35e1b3a1fe6a5fe28a2916c5fb5537bf3fafc13020f52becf888a +SOURCE_URL=https://builds.matomo.org/matomo-4.3.1.tar.gz +SOURCE_SUM=55ee0fd5c555fee679f4171069464b4d33b0a635fbbdea1ff6347497763dc4e4 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/scripts/install b/scripts/install index d256023..a040cdd 100755 --- a/scripts/install +++ b/scripts/install @@ -97,15 +97,6 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # SPECIFIC SETUP #================================================= -# INSTALL COMPOSER AND DEPENDENCIES -#================================================= -ynh_script_progression --message="Installing Composer and dependencies..." - -ynh_install_composer - -# Install missing icons -ynh_setup_source --dest_dir="$final_path/plugins/Morpheus/icons" --source_id="icons" -chmod -R 755 "$final_path/plugins/Morpheus" #================================================= # SETUP A CRON diff --git a/scripts/upgrade b/scripts/upgrade index d07323b..5d36b94 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -119,28 +119,6 @@ ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencie #================================================= # SPECIFIC UPGRADE #================================================= -# INSTALL COMPOSER AND DEPENDENCIES -#================================================= -ynh_script_progression --message="Installating composer and dependencies..." - -if [ "$upgrade_type" == "UPGRADE_APP" ] -then - ynh_install_composer --phpversion="$phpversion" --workdir="$final_path" - if [[ -f "$final_path/config/config.ini.php" ]]; then - php$phpversion $final_path/console core:update -n - fi -fi - -#================================================= -# INSTALL MISSING ICONS -#================================================= - -if [ ! "$(ls -A "$final_path/plugins/Morpheus/icons")" ] -then - ynh_script_progression --message="Installating Morpheus icons..." - ynh_setup_source --dest_dir="$final_path/plugins/Morpheus/icons" --source_id="icons" - chmod -R 755 "$final_path/plugins/Morpheus" -fi #================================================= # SETUP A CRON From 8abfaa27016262284767f1ab40d0cb4fd3abea48 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Thu, 8 Jul 2021 06:11:42 +0000 Subject: [PATCH 100/150] Auto-update README --- README.md | 48 +++++++++++++++++++++++------------------------- README_fr.md | 46 ++++++++++++++++++++-------------------------- 2 files changed, 43 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index efcd962..42a2f1d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ + + # Matomo for YunoHost [![Integration level](https://dash.yunohost.org/integration/matomo.svg)](https://dash.yunohost.org/appci/app/matomo) ![](https://ci-apps.yunohost.org/ci/badges/matomo.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/matomo.maintain.svg) @@ -5,21 +10,22 @@ *[Lire ce readme en français.](./README_fr.md)* -> *This package allows you to install Matomo 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 Matomo 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 -Matomo is the leading Free/Libre open analytics platform. It is a full-featured PHP MySQL software program that you download and install on your own webserver. At the end of the five-minute installation process, you will be given a JavaScript code. Simply copy and paste this tag on websites you wish to track and access your analytics reports in real-time. -**Shipped version:** 4.3.1 +Open source analytics platform for measuring Web statistics + +**Shipped version:** 4.3.1~ynh1 + +**Demo:** https://demo.matomo.org ## Screenshots -![](https://img.matomo.org/spai/w_660+q_lossless+ret_img+to_webp/https://static.matomo.org/wp-content/uploads/2019/03/matomo-analytics-dashboard.png) +![](./doc/screenshots/screenshot.png) -## Demo - -* [Official demo](https://demo.matomo.org) +## Disclaimers / important information ## Configuration @@ -27,24 +33,14 @@ Matomo is the leading Free/Libre open analytics platform. It is a full-featured 1. The MySQL database credentials will be sent to the **admin mail**. Fill these details while doing the registration process. 1. No LDAP support yet for the app. -## Documentation +## Documentation and resources - * Official documentation: https://matomo.org/docs - * YunoHost documentation: https://yunohost.org/en/app_matomo - -#### Supported architectures - -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/matomo.svg)](https://ci-apps.yunohost.org/ci/apps/matomo/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/matomo.svg)](https://ci-apps-arm.yunohost.org/ci/apps/matomo/) - -## Links - - * Report a bug: https://github.com/YunoHost-Apps/matomo_ynh/issues - * App website: https://matomo.org/ - * Upstream app repository: https://github.com/matomo-org/matomo - * YunoHost website: https://yunohost.org/ - ---- +* Official app website: https://matomo.org +* Official user documentation: https://yunohost.org/en/app_matomo +* Official admin documentation: https://matomo.org/docs +* Upstream app code repository: https://github.com/matomo-org/matomo +* YunoHost documentation for this app: https://yunohost.org/app_matomo +* Report a bug: https://github.com/YunoHost-Apps/matomo_ynh/issues ## Developer info @@ -56,3 +52,5 @@ sudo yunohost app install https://github.com/YunoHost-Apps/matomo_ynh/tree/testi or sudo yunohost app upgrade matomo -u https://github.com/YunoHost-Apps/matomo_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 2416c5d..67c9b34 100644 --- a/README_fr.md +++ b/README_fr.md @@ -3,23 +3,25 @@ [![Niveau d'intégration](https://dash.yunohost.org/integration/matomo.svg)](https://dash.yunohost.org/appci/app/matomo) ![](https://ci-apps.yunohost.org/ci/badges/matomo.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/matomo.maintain.svg) [![Installer Matomo avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=matomo) -*[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 Matomo 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 Matomo 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 -Matomo est une plateforme d'analyse open source de mesure de statistiques Web. Il s'agit d'un logiciel PHP MySQL complet que vous téléchargez et installez sur votre propre serveur Web. À la fin du processus d'installation de cinq minutes, vous recevrez un code JavaScript. Copiez et collez simplement cette balise sur les sites Web que vous souhaitez suivre et accédez à vos rapports d'analyse en temps réel. -**Version incluse :** 4.3.1 +Plateforme d'analyse open source de mesure de statistiques Web + +**Version incluse :** 4.3.1~ynh1 + +**Démo :** https://demo.matomo.org ## Captures d'écran -![](https://img.matomo.org/spai/w_660+q_lossless+ret_img+to_webp/https://static.matomo.org/wp-content/uploads/2019/03/matomo-analytics-dashboard.png) +![](./doc/screenshots/screenshot.png) -## Démo - -* [Démo officielle](https://demo.matomo.org) +## Avertissements / informations importantes ## Configuration @@ -27,24 +29,14 @@ Matomo est une plateforme d'analyse open source de mesure de statistiques Web. I 1. Les informations d'identification de la base de données MySQL seront envoyées à **l'email admin**. Remplissez ces détails lors du processus d'inscription. 1. Le support LDAP n'est pas encore implémenté pour cette l'application. -## Documentation +## Documentations et ressources - * Documentation officielle : https://matomo.org/docs - * Documentation YunoHost : https://yunohost.org/fr/app_matomo - -#### Architectures supportées - -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/matomo.svg)](https://ci-apps.yunohost.org/ci/apps/matomo/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/matomo.svg)](https://ci-apps-arm.yunohost.org/ci/apps/matomo/) - -## Liens - - * Signaler un bug : https://github.com/YunoHost-Apps/matomo_ynh/issues - * Site de l'application : https://matomo.org/ - * Dépôt de l'application principale : https://github.com/matomo-org/matomo - * Site web YunoHost : https://yunohost.org/ - ---- +* Site officiel de l'app : https://matomo.org +* Documentation officielle utilisateur : https://yunohost.org/en/app_matomo +* Documentation officielle de l'admin : https://matomo.org/docs +* Dépôt de code officiel de l'app : https://github.com/matomo-org/matomo +* Documentation YunoHost pour cette app : https://yunohost.org/app_matomo +* Signaler un bug : https://github.com/YunoHost-Apps/matomo_ynh/issues ## Informations pour les développeurs @@ -56,3 +48,5 @@ sudo yunohost app install https://github.com/YunoHost-Apps/matomo_ynh/tree/testi ou sudo yunohost app upgrade matomo -u https://github.com/YunoHost-Apps/matomo_ynh/tree/testing --debug ``` + +**Plus d'infos sur le packaging d'applications :** https://yunohost.org/packaging_apps \ No newline at end of file From 1aa0f970e1c25b79f4be892f90931ef6b2114205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 8 Jul 2021 08:12:50 +0200 Subject: [PATCH 101/150] Patch (#49) --- conf/cron | 2 +- conf/icons.src | 6 ------ manifest.json | 5 +++++ scripts/_common.sh | 3 --- scripts/install | 6 ++---- scripts/upgrade | 26 +++++++++++++++++++++----- 6 files changed, 29 insertions(+), 19 deletions(-) delete mode 100644 conf/icons.src diff --git a/conf/cron b/conf/cron index 02900b9..d3bd95c 100644 --- a/conf/cron +++ b/conf/cron @@ -1,2 +1,2 @@ -MAILTO="admin" +MAILTO="__EMAIL__" 5 * * * * __APP__ /usr/bin/php__PHPVERSION__ __FINALPATH__/console core:archive --url=https://__DOMAIN____PATH__ > /dev/null diff --git a/conf/icons.src b/conf/icons.src deleted file mode 100644 index 6ffad8e..0000000 --- a/conf/icons.src +++ /dev/null @@ -1,6 +0,0 @@ -SOURCE_URL=https://github.com/matomo-org/matomo-icons/archive/e96ef33bf490794829831cbb795fd4ea67259699.tar.gz -SOURCE_SUM=9a6457d8f138216f911621db7a5af5fbce7214e62d6f184730f216986e498b53 -SOURCE_SUM_PRG=sha256sum -SOURCE_FORMAT=tar.gz -SOURCE_IN_SUBDIR=true -SOURCE_FILENAME= diff --git a/manifest.json b/manifest.json index cdecd7d..8e01b22 100644 --- a/manifest.json +++ b/manifest.json @@ -43,6 +43,11 @@ "example": "/matomo", "default": "/matomo" }, + { + "name": "admin", + "type": "user", + "example": "johndoe" + }, { "name": "is_public", "type": "boolean", diff --git a/scripts/_common.sh b/scripts/_common.sh index 00f941c..e932edf 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -8,9 +8,6 @@ YNH_PHP_VERSION="7.3" extra_php_dependencies="php${YNH_PHP_VERSION}-curl php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-cli php${YNH_PHP_VERSION}-mysql php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-mbstring" -# Composer version -YNH_COMPOSER_VERSION="2.0.13" - #================================================= # PERSONAL HELPERS #================================================= diff --git a/scripts/install b/scripts/install index a040cdd..bcb0142 100755 --- a/scripts/install +++ b/scripts/install @@ -22,6 +22,8 @@ ynh_abort_if_errors domain=$YNH_APP_ARG_DOMAIN path_url=$YNH_APP_ARG_PATH +admin=$YNH_APP_ARG_ADMIN +email=$(ynh_user_get_info --username=$admin --key=mail) is_public=$YNH_APP_ARG_IS_PUBLIC app=$YNH_APP_INSTANCE_NAME @@ -94,10 +96,6 @@ ynh_script_progression --message="Configuring PHP-FPM..." ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencies" phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) -#================================================= -# SPECIFIC SETUP -#================================================= - #================================================= # SETUP A CRON #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 5d36b94..75bfb3a 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -21,6 +21,8 @@ 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) phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +admin=$YNH_APP_ARG_ADMIN +email=$(ynh_user_get_info --username=$admin --key=mail) #================================================= # CHECK VERSION @@ -46,6 +48,11 @@ if [ -z "$final_path" ]; then ynh_app_setting_set --app=$app --key=final_path --value=$final_path fi +# If admin doesn't exist +if [ -z "$admin" ]; then + email=root@$domain +fi + # Cleaning legacy permissions if ynh_legacy_permissions_exists; then ynh_legacy_permissions_delete_all @@ -91,8 +98,19 @@ then # This condition is only for CI test to go through the upgrade process ynh_setup_source --dest_dir="$final_path" else + # Create a temporary directory + tmpdir="$(mktemp -d)" + + cp -a "$final_path/config/config.ini.php" "$tmpdir/config.ini.php" + # 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" --keep="$final_path/config/config.ini.php" + ynh_setup_source --dest_dir="$final_path" + cp -a "$tmpdir/config.ini.php" "$final_path/config/config.ini.php" + # Remove the tmp directory securely + ynh_secure_remove --file="$tmpdir" + + ynh_exec_as $app php${phpversion} $final_path/console core:update -n fi fi @@ -116,16 +134,14 @@ ynh_script_progression --message="Upgrading PHP-FPM configuration..." # Create a dedicated PHP-FPM config ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencies" -#================================================= -# SPECIFIC UPGRADE -#================================================= - #================================================= # SETUP A CRON #================================================= ynh_script_progression --message="Setuping a cron..." ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" +chown root: "/etc/cron.d/$app" +chmod 644 "/etc/cron.d/$app" #================================================= # RELOAD NGINX From e79f35ee773f2461e3fe09b4ada8e58752faeb5c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 8 Jul 2021 08:52:33 +0200 Subject: [PATCH 102/150] Set email --- scripts/change_url | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/change_url b/scripts/change_url index 49138df..20d878f 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -29,6 +29,7 @@ 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) phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +email=$(ynh_user_get_info --username=$admin --key=mail) #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP @@ -100,6 +101,8 @@ ynh_script_progression --message="Setuping a cron..." path=$new_path domain=$new_domain ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" +chown root: "/etc/cron.d/$app" +chmod 644 "/etc/cron.d/$app" #================================================= # RELOAD NGINX From 9c5879132fd8f1b32cf97fbcca92ffc509ed4e17 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 10 Jul 2021 14:39:27 +0200 Subject: [PATCH 103/150] Update check_process --- check_process | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/check_process b/check_process index 2fd209e..f6a8ac5 100644 --- a/check_process +++ b/check_process @@ -11,10 +11,15 @@ setup_private=1 setup_public=1 upgrade=1 - upgrade=1 from_commit=1d3e9f3dbf72a6a124c879fa549ab8107367e36a + #4.3.0 (#47) + upgrade=1 from_commit=1d967a751135c3801ef95cf989ab3fb9e45e6f70 backup_restore=1 multi_instance=1 change_url=1 ;;; Options Email=anmol@datamol.org Notification=yes +;;; Upgrade options + ; commit=1d967a751135c3801ef95cf989ab3fb9e45e6f70 + name= Upgrade from 4.3.0 (#47) + manifest_arg=domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666& \ No newline at end of file From b01f00af10f31108b2d9cc2f57ed927231efcec6 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 10 Jul 2021 14:40:46 +0200 Subject: [PATCH 104/150] Update check_process --- check_process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check_process b/check_process index f6a8ac5..2478a66 100644 --- a/check_process +++ b/check_process @@ -21,5 +21,5 @@ Email=anmol@datamol.org Notification=yes ;;; Upgrade options ; commit=1d967a751135c3801ef95cf989ab3fb9e45e6f70 - name= Upgrade from 4.3.0 (#47) + name= 4.3.0 (#47) manifest_arg=domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666& \ No newline at end of file From cddc197449e834883248f569a51ada8b6012418b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 10 Jul 2021 14:46:35 +0200 Subject: [PATCH 105/150] Add weight --- scripts/change_url | 2 +- scripts/install | 24 ++++++++++++------------ scripts/remove | 16 ++++++++-------- scripts/restore | 20 ++++++++++---------- scripts/upgrade | 22 +++++++++++----------- 5 files changed, 42 insertions(+), 42 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index 20d878f..3658832 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -96,7 +96,7 @@ fi #================================================= # SETUP A CRON #================================================= -ynh_script_progression --message="Setuping a cron..." +ynh_script_progression --message="Setuping a cron..." --weight=1 path=$new_path domain=$new_domain diff --git a/scripts/install b/scripts/install index bcb0142..af0fc07 100755 --- a/scripts/install +++ b/scripts/install @@ -31,7 +31,7 @@ app=$YNH_APP_INSTANCE_NAME #================================================= # CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS #================================================= -ynh_script_progression --message="Validating installation parameters..." +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" @@ -42,7 +42,7 @@ ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url #================================================= # STORE SETTINGS FROM MANIFEST #================================================= -ynh_script_progression --message="Storing installation settings..." +ynh_script_progression --message="Storing installation settings..." --weight=1 ynh_app_setting_set --app=$app --key=domain --value=$domain ynh_app_setting_set --app=$app --key=path --value=$path_url @@ -50,7 +50,7 @@ ynh_app_setting_set --app=$app --key=path --value=$path_url #================================================= # CREATE A MYSQL DATABASE #================================================= -ynh_script_progression --message="Creating a MySQL database..." +ynh_script_progression --message="Creating a MySQL database..." --weight=1 db_name=$(ynh_sanitize_dbid --db_name=$app) db_user=$db_name @@ -60,7 +60,7 @@ ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name #================================================= # CREATE DEDICATED USER #================================================= -ynh_script_progression --message="Configuring system user..." +ynh_script_progression --message="Configuring system user..." --weight=1 # Create a system user ynh_system_user_create --username=$app --home_dir="$final_path" @@ -68,7 +68,7 @@ ynh_system_user_create --username=$app --home_dir="$final_path" #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= -ynh_script_progression --message="Setting up source files..." +ynh_script_progression --message="Setting up source files..." --weight=4 ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src @@ -82,7 +82,7 @@ chown -R $app:www-data "$final_path" #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Configuring NGINX web server..." +ynh_script_progression --message="Configuring NGINX web server..." --weight=2 # Create a dedicated NGINX config ynh_add_nginx_config @@ -90,7 +90,7 @@ ynh_add_nginx_config #================================================= # PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Configuring PHP-FPM..." +ynh_script_progression --message="Configuring PHP-FPM..." --weight=3 # Create a dedicated PHP-FPM config ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencies" @@ -99,7 +99,7 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # SETUP A CRON #================================================= -ynh_script_progression --message="Setuping a cron..." +ynh_script_progression --message="Setuping a cron..." --weight=1 ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" chown root: "/etc/cron.d/$app" @@ -108,7 +108,7 @@ chmod 644 "/etc/cron.d/$app" #================================================= # SETUP SSOWAT #================================================= -ynh_script_progression --message="Configuring permissions..." +ynh_script_progression --message="Configuring permissions..." --weight=1 # Make app public if necessary or protect it if [ $is_public -eq 1 ] @@ -119,14 +119,14 @@ fi #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name=nginx --action=reload #================================================= # SEND A README FOR THE ADMIN #================================================= -ynh_script_progression --message="Sending a readme for the admin..." +ynh_script_progression --message="Sending a readme for the admin..." --weight=1 message="Matomo was successfully installed :) @@ -147,4 +147,4 @@ ynh_send_readme_to_admin "$message" # END OF SCRIPT #================================================= -ynh_script_progression --message="Installation of Matomo completed" +ynh_script_progression --message="Installation of Matomo completed" --last diff --git a/scripts/remove b/scripts/remove index b1472df..a0d4af7 100755 --- a/scripts/remove +++ b/scripts/remove @@ -12,7 +12,7 @@ source /usr/share/yunohost/helpers #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." +ynh_script_progression --message="Loading installation settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME @@ -26,7 +26,7 @@ final_path=$(ynh_app_setting_get --app=$app --key=final_path) #================================================= # REMOVE THE MYSQL DATABASE #================================================= -ynh_script_progression --message="Removing the MySQL database..." +ynh_script_progression --message="Removing the MySQL database..." --weight=1 # Remove a database if it exists, along with the associated user ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name @@ -34,7 +34,7 @@ ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name #================================================= # REMOVE APP MAIN DIR #================================================= -ynh_script_progression --message="Removing Matomo main directory..." +ynh_script_progression --message="Removing Matomo main directory..." --weight=2 # Remove the app directory securely ynh_secure_remove --file="$final_path" @@ -42,7 +42,7 @@ ynh_secure_remove --file="$final_path" #================================================= # REMOVE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Removing NGINX web server configuration..." +ynh_script_progression --message="Removing NGINX web server configuration..." --weight=1 # Remove the dedicated NGINX config ynh_remove_nginx_config @@ -50,7 +50,7 @@ ynh_remove_nginx_config #================================================= # REMOVE PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Removing PHP-FPM configuration..." +ynh_script_progression --message="Removing PHP-FPM configuration..." --weight=1 # Remove the dedicated PHP-FPM config ynh_remove_fpm_config @@ -60,7 +60,7 @@ ynh_remove_fpm_config #================================================= # REMOVE THE CRON FILE #================================================= -ynh_script_progression --message="Removing the cron file..." +ynh_script_progression --message="Removing the cron file..." --weight=1 # Remove a cron file ynh_secure_remove --file="/etc/cron.d/$app" @@ -70,7 +70,7 @@ ynh_secure_remove --file="/etc/cron.d/$app" #================================================= # REMOVE DEDICATED USER #================================================= -ynh_script_progression --message="Removing the dedicated system user..." +ynh_script_progression --message="Removing the dedicated system user..." --weight=1 # Delete a system user ynh_system_user_delete --username=$app @@ -79,4 +79,4 @@ ynh_system_user_delete --username=$app # END OF SCRIPT #================================================= -ynh_script_progression --message="Removal of Matomo completed" +ynh_script_progression --message="Removal of Matomo completed" --last diff --git a/scripts/restore b/scripts/restore index 27db4c7..c054658 100755 --- a/scripts/restore +++ b/scripts/restore @@ -20,7 +20,7 @@ ynh_abort_if_errors #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading settings..." +ynh_script_progression --message="Loading settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME @@ -34,7 +34,7 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # CHECK IF THE APP CAN BE RESTORED #================================================= -ynh_script_progression --message="Validating restoration parameters..." +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}" @@ -46,14 +46,14 @@ test ! -d $final_path \ #================================================= # RESTORE THE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Restoring 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" #================================================= # RECREATE THE DEDICATED USER #================================================= -ynh_script_progression --message="Recreating the dedicated system 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" @@ -61,7 +61,7 @@ ynh_system_user_create --username=$app --home_dir="$final_path" #================================================= # RESTORE THE APP MAIN DIR #================================================= -ynh_script_progression --message="Restoring Matomo main directory..." +ynh_script_progression --message="Restoring Matomo main directory..." --weight=3 ynh_restore_file --origin_path="$final_path" @@ -72,7 +72,7 @@ chown -R $app:www-data "$final_path" #================================================= # RESTORE THE PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Restoring PHP-FPM configuration..." +ynh_script_progression --message="Restoring PHP-FPM configuration..." --weight=2 # Restore the file first, so it can have a backup if different ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" @@ -83,7 +83,7 @@ ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencie #================================================= # RESTORE THE MYSQL DATABASE #================================================= -ynh_script_progression --message="Restoring the MySQL database..." +ynh_script_progression --message="Restoring the MySQL database..." --weight=1 db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd @@ -92,7 +92,7 @@ ynh_mysql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./ #================================================= # RESTORE THE CRON FILE #================================================= -ynh_script_progression --message="Restoring the cron file..." +ynh_script_progression --message="Restoring the cron file..." --weight=1 ynh_restore_file --origin_path="/etc/cron.d/$app" @@ -101,7 +101,7 @@ ynh_restore_file --origin_path="/etc/cron.d/$app" #================================================= # RELOAD NGINX AND PHP-FPM #================================================= -ynh_script_progression --message="Reloading NGINX web server and PHP-FPM..." +ynh_script_progression --message="Reloading NGINX web server and PHP-FPM..." --weight=1 ynh_systemd_action --service_name=php$phpversion-fpm --action=reload ynh_systemd_action --service_name=nginx --action=reload @@ -110,4 +110,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Restoration completed for Matomo" +ynh_script_progression --message="Restoration completed for Matomo" --last diff --git a/scripts/upgrade b/scripts/upgrade index 75bfb3a..03363d7 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -12,7 +12,7 @@ source /usr/share/yunohost/helpers #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." +ynh_script_progression --message="Loading installation settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME @@ -27,14 +27,14 @@ email=$(ynh_user_get_info --username=$admin --key=mail) #================================================= # CHECK VERSION #================================================= -ynh_script_progression --message="Checking version..." +ynh_script_progression --message="Checking version..." --weight=1 upgrade_type=$(ynh_check_app_version_changed) #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= -ynh_script_progression --message="Ensuring downward compatibility..." +ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 # If db_name doesn't exist, create it if [ -z "$db_name" ]; then @@ -63,7 +63,7 @@ fi #================================================= # CREATE DEDICATED USER #================================================= -ynh_script_progression --message="Making sure dedicated system user exists..." +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" @@ -71,7 +71,7 @@ ynh_system_user_create --username=$app --home_dir="$final_path" #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= -ynh_script_progression --message="Backing up Matomo before upgrading (may take a while)..." +ynh_script_progression --message="Backing up Matomo before upgrading (may take a while)..." --weight=3 # Backup the current version of the app ynh_backup_before_upgrade @@ -90,7 +90,7 @@ ynh_abort_if_errors if [ "$upgrade_type" == "UPGRADE_APP" ] then - ynh_script_progression --message="Upgrading source files..." + ynh_script_progression --message="Upgrading source files..." --weight=3 if [[ ! -f "$final_path/config/config.ini.php" ]]; then # config.ini.php is only created during the post-install process... @@ -121,7 +121,7 @@ chown -R $app:www-data "$final_path" #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading NGINX web server configuration..." +ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=1 # Create a dedicated NGINX config ynh_add_nginx_config @@ -129,7 +129,7 @@ ynh_add_nginx_config #================================================= # PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading PHP-FPM configuration..." +ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=2 # Create a dedicated PHP-FPM config ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencies" @@ -137,7 +137,7 @@ ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencie #================================================= # SETUP A CRON #================================================= -ynh_script_progression --message="Setuping a cron..." +ynh_script_progression --message="Setuping a cron..." --weight=1 ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" chown root: "/etc/cron.d/$app" @@ -146,7 +146,7 @@ chmod 644 "/etc/cron.d/$app" #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name=nginx --action=reload @@ -154,4 +154,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Upgrade of Matomo completed" +ynh_script_progression --message="Upgrade of Matomo completed" --last From f05702b769e1acdb1a9ad2d7db6b9ac64021beda Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 10 Jul 2021 18:25:25 +0200 Subject: [PATCH 106/150] Update manifest.json --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 8e01b22..24750d8 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.3.1~ynh1", + "version": "4.3.1~ynh2", "url": "https://matomo.org", "upstream": { "license": "GPL-3.0-or-later", From 10192a74fe8a84e05739318c66fef6c3855e2453 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sat, 10 Jul 2021 16:25:33 +0000 Subject: [PATCH 107/150] 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 42a2f1d..e2762df 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 Open source analytics platform for measuring Web statistics -**Shipped version:** 4.3.1~ynh1 +**Shipped version:** 4.3.1~ynh2 **Demo:** https://demo.matomo.org diff --git a/README_fr.md b/README_fr.md index 67c9b34..99b4e58 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme d'analyse open source de mesure de statistiques Web -**Version incluse :** 4.3.1~ynh1 +**Version incluse :** 4.3.1~ynh2 **Démo :** https://demo.matomo.org From 8b21a19cdc993c70f972dad3812c26914b440df4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 28 Jul 2021 08:17:10 +0200 Subject: [PATCH 108/150] 4.4.0 (#51) * 4.4.0 --- 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 e2762df..150283c 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 Open source analytics platform for measuring Web statistics -**Shipped version:** 4.3.1~ynh2 +**Shipped version:** 4.4.0~ynh1 **Demo:** https://demo.matomo.org diff --git a/README_fr.md b/README_fr.md index 99b4e58..416eeac 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme d'analyse open source de mesure de statistiques Web -**Version incluse :** 4.3.1~ynh2 +**Version incluse :** 4.4.0~ynh1 **Démo :** https://demo.matomo.org diff --git a/conf/app.src b/conf/app.src index 98d6c1d..ea3324b 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://builds.matomo.org/matomo-4.3.1.tar.gz -SOURCE_SUM=55ee0fd5c555fee679f4171069464b4d33b0a635fbbdea1ff6347497763dc4e4 +SOURCE_URL=https://builds.matomo.org/matomo-4.4.0.tar.gz +SOURCE_SUM=3eea92155178a53410c35a6489995ff4deb9ece7182dc4a11e06f96ad3b707ba SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 24750d8..ba7a88b 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.3.1~ynh2", + "version": "4.4.0~ynh1", "url": "https://matomo.org", "upstream": { "license": "GPL-3.0-or-later", From be01ae23ca95d2d4dc3ab6dab6e2b2e7539778e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 2 Aug 2021 07:46:55 +0200 Subject: [PATCH 109/150] 4.4.1 (#53) * 4.4.1 --- README.md | 2 +- README_fr.md | 2 +- check_process | 6 +++++- conf/app.src | 4 ++-- manifest.json | 2 +- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 150283c..6a5a373 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 Open source analytics platform for measuring Web statistics -**Shipped version:** 4.4.0~ynh1 +**Shipped version:** 4.4.1~ynh1 **Demo:** https://demo.matomo.org diff --git a/README_fr.md b/README_fr.md index 416eeac..0155e85 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme d'analyse open source de mesure de statistiques Web -**Version incluse :** 4.4.0~ynh1 +**Version incluse :** 4.4.1~ynh1 **Démo :** https://demo.matomo.org diff --git a/check_process b/check_process index 2478a66..f1d52d9 100644 --- a/check_process +++ b/check_process @@ -13,6 +13,8 @@ upgrade=1 #4.3.0 (#47) upgrade=1 from_commit=1d967a751135c3801ef95cf989ab3fb9e45e6f70 + #4.4.0 + upgrade=1 from_commit=9edf3d60ea391925f835ece1309bbcb54e6d33fe backup_restore=1 multi_instance=1 change_url=1 @@ -21,5 +23,7 @@ Email=anmol@datamol.org Notification=yes ;;; Upgrade options ; commit=1d967a751135c3801ef95cf989ab3fb9e45e6f70 - name= 4.3.0 (#47) + name= 4.3.0 + ; commit=9edf3d60ea391925f835ece1309bbcb54e6d33fe + name= 4.4.0 manifest_arg=domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666& \ No newline at end of file diff --git a/conf/app.src b/conf/app.src index ea3324b..fb3a5ee 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://builds.matomo.org/matomo-4.4.0.tar.gz -SOURCE_SUM=3eea92155178a53410c35a6489995ff4deb9ece7182dc4a11e06f96ad3b707ba +SOURCE_URL=https://builds.matomo.org/matomo-4.4.1.tar.gz +SOURCE_SUM=94b9a90c61afabff55e08ea53ff8532355349336fae439e168dbfe9364931479 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index ba7a88b..33347ee 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.4.0~ynh1", + "version": "4.4.1~ynh1", "url": "https://matomo.org", "upstream": { "license": "GPL-3.0-or-later", From aaec189570249b412f99ee016df10f690e4e541e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 3 Aug 2021 00:09:15 +0200 Subject: [PATCH 110/150] Update upgrade (#55) --- scripts/upgrade | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 03363d7..05adba4 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -110,14 +110,14 @@ then # Remove the tmp directory securely ynh_secure_remove --file="$tmpdir" + chmod 750 "$final_path" + chmod -R o-rwx "$final_path" + chown -R $app:www-data "$final_path" + ynh_exec_as $app php${phpversion} $final_path/console core:update -n fi fi -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" - #================================================= # NGINX CONFIGURATION #================================================= From 0bec1c2bb3ec5f20077c68c9409d3505531949be Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 3 Aug 2021 00:09:57 +0200 Subject: [PATCH 111/150] Update manifest.json --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 33347ee..db8d93b 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.4.1~ynh1", + "version": "4.4.1~ynh2", "url": "https://matomo.org", "upstream": { "license": "GPL-3.0-or-later", From 8d845d84502c6a69361d1c2c1bfb02b77d5d2bdd Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Mon, 2 Aug 2021 22:10:07 +0000 Subject: [PATCH 112/150] 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 6a5a373..95b4275 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 Open source analytics platform for measuring Web statistics -**Shipped version:** 4.4.1~ynh1 +**Shipped version:** 4.4.1~ynh2 **Demo:** https://demo.matomo.org diff --git a/README_fr.md b/README_fr.md index 0155e85..ca8ae67 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme d'analyse open source de mesure de statistiques Web -**Version incluse :** 4.4.1~ynh1 +**Version incluse :** 4.4.1~ynh2 **Démo :** https://demo.matomo.org From 8eb6acf20cd3bd05fb629b1bd686679564a8d119 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 3 Aug 2021 07:00:09 +0200 Subject: [PATCH 113/150] Update upgrade --- scripts/upgrade | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 05adba4..3b0bee7 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -110,14 +110,15 @@ then # Remove the tmp directory securely ynh_secure_remove --file="$tmpdir" - chmod 750 "$final_path" - chmod -R o-rwx "$final_path" chown -R $app:www-data "$final_path" - ynh_exec_as $app php${phpversion} $final_path/console core:update -n fi fi +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + #================================================= # NGINX CONFIGURATION #================================================= From e0d2d95bdd407f9b583bcab7d6450aeacb6c1c49 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 3 Aug 2021 07:31:50 +0200 Subject: [PATCH 114/150] Update manifest.json --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index db8d93b..8557b28 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.4.1~ynh2", + "version": "4.4.1~ynh3", "url": "https://matomo.org", "upstream": { "license": "GPL-3.0-or-later", From aa4f886f6c8c100ac1bf4f21b99018a925a4d002 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Tue, 3 Aug 2021 05:31:58 +0000 Subject: [PATCH 115/150] 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 95b4275..21b8093 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 Open source analytics platform for measuring Web statistics -**Shipped version:** 4.4.1~ynh2 +**Shipped version:** 4.4.1~ynh3 **Demo:** https://demo.matomo.org diff --git a/README_fr.md b/README_fr.md index ca8ae67..78ce9f7 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme d'analyse open source de mesure de statistiques Web -**Version incluse :** 4.4.1~ynh2 +**Version incluse :** 4.4.1~ynh3 **Démo :** https://demo.matomo.org From 72cfcb9ac4aa3d4e92179e4f69a88f10a5f871fd Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 2 Oct 2021 21:01:06 +0200 Subject: [PATCH 116/150] cleaning --- manifest.json | 6 ++---- scripts/restore | 2 -- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/manifest.json b/manifest.json index 8557b28..44086a4 100644 --- a/manifest.json +++ b/manifest.json @@ -34,8 +34,7 @@ "install" : [ { "name": "domain", - "type": "domain", - "example": "example.com" + "type": "domain" }, { "name": "path", @@ -45,8 +44,7 @@ }, { "name": "admin", - "type": "user", - "example": "johndoe" + "type": "user" }, { "name": "is_public", diff --git a/scripts/restore b/scripts/restore index c054658..4fe14e8 100755 --- a/scripts/restore +++ b/scripts/restore @@ -36,8 +36,6 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= ynh_script_progression --message="Validating restoration parameters..." --weight=1 -ynh_webpath_available --domain=$domain --path_url=$path_url \ - || ynh_die --message="Path not available: ${domain}${path_url}" test ! -d $final_path \ || ynh_die --message="There is already a directory: $final_path " From 664db1e9474a204fe2fb4d0bb97e07b15e90ba27 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 2 Oct 2021 21:07:01 +0200 Subject: [PATCH 117/150] Update app.src --- conf/app.src | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/app.src b/conf/app.src index fb3a5ee..76e73de 100644 --- a/conf/app.src +++ b/conf/app.src @@ -3,4 +3,3 @@ SOURCE_SUM=94b9a90c61afabff55e08ea53ff8532355349336fae439e168dbfe9364931479 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true -SOURCE_FILENAME= From 77f5a396399061db20ab82a7e2b0f787ba25b32c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 7 Oct 2021 11:34:21 +0200 Subject: [PATCH 118/150] 4.5.0 (#58) * Upgrade to 4.5.0 --- README.md | 3 +-- README_fr.md | 3 +-- check_process | 4 ---- conf/app.src | 4 ++-- manifest.json | 3 +-- scripts/restore | 2 ++ scripts/upgrade | 29 ++++++++++++++--------------- 7 files changed, 21 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 21b8093..9cf1b77 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 Open source analytics platform for measuring Web statistics -**Shipped version:** 4.4.1~ynh3 +**Shipped version:** 4.5.0~ynh1 **Demo:** https://demo.matomo.org @@ -36,7 +36,6 @@ Open source analytics platform for measuring Web statistics ## Documentation and resources * Official app website: https://matomo.org -* Official user documentation: https://yunohost.org/en/app_matomo * Official admin documentation: https://matomo.org/docs * Upstream app code repository: https://github.com/matomo-org/matomo * YunoHost documentation for this app: https://yunohost.org/app_matomo diff --git a/README_fr.md b/README_fr.md index 78ce9f7..42a8fd4 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme d'analyse open source de mesure de statistiques Web -**Version incluse :** 4.4.1~ynh3 +**Version incluse :** 4.5.0~ynh1 **Démo :** https://demo.matomo.org @@ -32,7 +32,6 @@ Plateforme d'analyse open source de mesure de statistiques Web ## Documentations et ressources * Site officiel de l'app : https://matomo.org -* Documentation officielle utilisateur : https://yunohost.org/en/app_matomo * Documentation officielle de l'admin : https://matomo.org/docs * Dépôt de code officiel de l'app : https://github.com/matomo-org/matomo * Documentation YunoHost pour cette app : https://yunohost.org/app_matomo diff --git a/check_process b/check_process index f1d52d9..a4dae0a 100644 --- a/check_process +++ b/check_process @@ -11,8 +11,6 @@ setup_private=1 setup_public=1 upgrade=1 - #4.3.0 (#47) - upgrade=1 from_commit=1d967a751135c3801ef95cf989ab3fb9e45e6f70 #4.4.0 upgrade=1 from_commit=9edf3d60ea391925f835ece1309bbcb54e6d33fe backup_restore=1 @@ -22,8 +20,6 @@ Email=anmol@datamol.org Notification=yes ;;; Upgrade options - ; commit=1d967a751135c3801ef95cf989ab3fb9e45e6f70 - name= 4.3.0 ; commit=9edf3d60ea391925f835ece1309bbcb54e6d33fe name= 4.4.0 manifest_arg=domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666& \ No newline at end of file diff --git a/conf/app.src b/conf/app.src index 76e73de..e7dba63 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://builds.matomo.org/matomo-4.4.1.tar.gz -SOURCE_SUM=94b9a90c61afabff55e08ea53ff8532355349336fae439e168dbfe9364931479 +SOURCE_URL=https://builds.matomo.org/matomo-4.5.0.tar.gz +SOURCE_SUM=3b28ddcd8f84358c4e4d58c32e38f6ba725ba5a18e0c81f623901c9ade391c30 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 44086a4..958cd12 100644 --- a/manifest.json +++ b/manifest.json @@ -6,14 +6,13 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.4.1~ynh3", + "version": "4.5.0~ynh1", "url": "https://matomo.org", "upstream": { "license": "GPL-3.0-or-later", "website": "https://matomo.org", "demo": "https://demo.matomo.org", "admindoc": "https://matomo.org/docs", - "userdoc": "https://yunohost.org/en/app_matomo", "code": "https://github.com/matomo-org/matomo" }, "license": "GPL-3.0-or-later", diff --git a/scripts/restore b/scripts/restore index 4fe14e8..4c4c94a 100755 --- a/scripts/restore +++ b/scripts/restore @@ -93,6 +93,8 @@ ynh_mysql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./ ynh_script_progression --message="Restoring the cron file..." --weight=1 ynh_restore_file --origin_path="/etc/cron.d/$app" +chown root: "/etc/cron.d/$app" +chmod 644 "/etc/cron.d/$app" #================================================= # GENERIC FINALIZATION diff --git a/scripts/upgrade b/scripts/upgrade index 3b0bee7..76f50e9 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -27,10 +27,23 @@ email=$(ynh_user_get_info --username=$admin --key=mail) #================================================= # CHECK VERSION #================================================= -ynh_script_progression --message="Checking version..." --weight=1 upgrade_type=$(ynh_check_app_version_changed) +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up Matomo before upgrading (may take a while)..." --weight=3 + +# 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 + #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= @@ -68,20 +81,6 @@ ynh_script_progression --message="Making sure dedicated system user exists..." - # Create a dedicated user (if not existing) ynh_system_user_create --username=$app --home_dir="$final_path" -#================================================= -# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP -#================================================= -ynh_script_progression --message="Backing up Matomo before upgrading (may take a while)..." --weight=3 - -# 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 #================================================= From 22e905cc481000c6f24358d2007bf69c0282c014 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 20 Nov 2021 18:31:00 +0100 Subject: [PATCH 119/150] 4.3 (#60) * 4.3 * Fix --- conf/nginx.conf | 5 ----- manifest.json | 2 +- scripts/_common.sh | 2 +- scripts/install | 9 ++++++++- scripts/remove | 8 ++++++++ scripts/restore | 10 +++++++++- scripts/upgrade | 9 ++++++++- 7 files changed, 35 insertions(+), 10 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index f1da700..5714403 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -4,11 +4,6 @@ location ^~ __PATH__/ { # Path to source alias __FINALPATH__/; - # Force usage of https - if ($scheme = http) { - rewrite ^ https://$server_name$request_uri? permanent; - } - more_set_headers "Referrer-Policy: origin always"; more_set_headers "X-Content-Type-Options: nosniff"; more_set_headers "X-XSS-Protection: 1; mode=block"; diff --git a/manifest.json b/manifest.json index 958cd12..2b92c9c 100644 --- a/manifest.json +++ b/manifest.json @@ -21,7 +21,7 @@ "email": "anmol@datamol.org" }, "requirements": { - "yunohost": ">= 4.2.4" + "yunohost": ">= 4.3.0" }, "multi_instance": true, "services": [ diff --git a/scripts/_common.sh b/scripts/_common.sh index e932edf..ac31ed1 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -6,7 +6,7 @@ YNH_PHP_VERSION="7.3" -extra_php_dependencies="php${YNH_PHP_VERSION}-curl php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-cli php${YNH_PHP_VERSION}-mysql php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-mbstring" +pkg_dependencies="php${YNH_PHP_VERSION}-curl php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-cli php${YNH_PHP_VERSION}-mysql php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-mbstring" #================================================= # PERSONAL HELPERS diff --git a/scripts/install b/scripts/install index af0fc07..329a2c9 100755 --- a/scripts/install +++ b/scripts/install @@ -47,6 +47,13 @@ ynh_script_progression --message="Storing installation settings..." --weight=1 ynh_app_setting_set --app=$app --key=domain --value=$domain ynh_app_setting_set --app=$app --key=path --value=$path_url +#================================================= +# INSTALL DEPENDENCIES +#================================================= +ynh_script_progression --message="Installing dependencies..." --weight=1 + +ynh_install_app_dependencies $pkg_dependencies + #================================================= # CREATE A MYSQL DATABASE #================================================= @@ -93,7 +100,7 @@ ynh_add_nginx_config ynh_script_progression --message="Configuring PHP-FPM..." --weight=3 # Create a dedicated PHP-FPM config -ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencies" +ynh_add_fpm_config --usage=low --footprint=low phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= diff --git a/scripts/remove b/scripts/remove index a0d4af7..8246f27 100755 --- a/scripts/remove +++ b/scripts/remove @@ -31,6 +31,14 @@ ynh_script_progression --message="Removing the MySQL database..." --weight=1 # Remove a database if it exists, along with the associated user ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name +#================================================= +# REMOVE DEPENDENCIES +#================================================= +ynh_script_progression --message="Removing dependencies..." --time --weight=1 + +# Remove metapackage and its dependencies +ynh_remove_app_dependencies + #================================================= # REMOVE APP MAIN DIR #================================================= diff --git a/scripts/restore b/scripts/restore index 4c4c94a..842d4de 100755 --- a/scripts/restore +++ b/scripts/restore @@ -76,7 +76,15 @@ ynh_script_progression --message="Restoring PHP-FPM configuration..." --weight=2 ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" # Recreate a dedicated php-fpm config -ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencies" +ynh_add_fpm_config --usage=low --footprint=low + +#================================================= +# REINSTALL DEPENDENCIES +#================================================= +ynh_script_progression --message="Reinstalling dependencies..." --weight=1 + +# Define and install dependencies +ynh_install_app_dependencies $pkg_dependencies #================================================= # RESTORE THE MYSQL DATABASE diff --git a/scripts/upgrade b/scripts/upgrade index 76f50e9..6b3d888 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -126,13 +126,20 @@ 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..." --time --weight=1 + +ynh_install_app_dependencies $pkg_dependencies + #================================================= # PHP-FPM CONFIGURATION #================================================= ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=2 # Create a dedicated PHP-FPM config -ynh_add_fpm_config --usage=low --footprint=low --package="$extra_php_dependencies" +ynh_add_fpm_config --usage=low --footprint=low #================================================= # SETUP A CRON From f6d1230f91c7eca15e1420f2125f31657a5e2b75 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 24 Nov 2021 12:22:18 +0100 Subject: [PATCH 120/150] Update remove --- scripts/remove | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/remove b/scripts/remove index 8246f27..cfe1f30 100755 --- a/scripts/remove +++ b/scripts/remove @@ -34,7 +34,7 @@ ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name #================================================= # REMOVE DEPENDENCIES #================================================= -ynh_script_progression --message="Removing dependencies..." --time --weight=1 +ynh_script_progression --message="Removing dependencies..." --weight=1 # Remove metapackage and its dependencies ynh_remove_app_dependencies From eec91a5239e890484d501dd866dfd87606295dde Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 30 Nov 2021 07:30:13 +0100 Subject: [PATCH 121/150] 4.6.0 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index e7dba63..c1b22cc 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://builds.matomo.org/matomo-4.5.0.tar.gz -SOURCE_SUM=3b28ddcd8f84358c4e4d58c32e38f6ba725ba5a18e0c81f623901c9ade391c30 +SOURCE_URL=https://builds.matomo.org/matomo-4.6.0.tar.gz +SOURCE_SUM=38d1c770b02b78db272c11678737ea8c20e28a34470a605287615fd5b9d86d6c SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 2b92c9c..6d1c740 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.5.0~ynh1", + "version": "4.6.0~ynh1", "url": "https://matomo.org", "upstream": { "license": "GPL-3.0-or-later", From 2adc1ef7860fb5b722a9f5df24b301df1eb602bf Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Tue, 30 Nov 2021 06:30:18 +0000 Subject: [PATCH 122/150] 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 9cf1b77..1476b91 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 Open source analytics platform for measuring Web statistics -**Shipped version:** 4.5.0~ynh1 +**Shipped version:** 4.6.0~ynh1 **Demo:** https://demo.matomo.org diff --git a/README_fr.md b/README_fr.md index 42a8fd4..555d782 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme d'analyse open source de mesure de statistiques Web -**Version incluse :** 4.5.0~ynh1 +**Version incluse :** 4.6.0~ynh1 **Démo :** https://demo.matomo.org From f6a74f5f48c8cae2848e2a1fec6747dd5c31f75e Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 1 Dec 2021 07:47:43 +0100 Subject: [PATCH 123/150] 4.6.1 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index c1b22cc..f1923a8 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://builds.matomo.org/matomo-4.6.0.tar.gz -SOURCE_SUM=38d1c770b02b78db272c11678737ea8c20e28a34470a605287615fd5b9d86d6c +SOURCE_URL=https://builds.matomo.org/matomo-4.6.1.tar.gz +SOURCE_SUM=995302b5fe4e7f01b218283daeb338160cd2f69e0567601709e359e030ea0149 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 6d1c740..e4cb2e1 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.6.0~ynh1", + "version": "4.6.1~ynh1", "url": "https://matomo.org", "upstream": { "license": "GPL-3.0-or-later", From 84bec7be179bca6ae0e010fc98c90c58fa4e8eee Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Wed, 1 Dec 2021 06:47:52 +0000 Subject: [PATCH 124/150] 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 1476b91..15ea8c8 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 Open source analytics platform for measuring Web statistics -**Shipped version:** 4.6.0~ynh1 +**Shipped version:** 4.6.1~ynh1 **Demo:** https://demo.matomo.org diff --git a/README_fr.md b/README_fr.md index 555d782..22e240c 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme d'analyse open source de mesure de statistiques Web -**Version incluse :** 4.6.0~ynh1 +**Version incluse :** 4.6.1~ynh1 **Démo :** https://demo.matomo.org From 6a78872e8be2a4ada211270d1780f57a6e1a2302 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 1 Dec 2021 11:40:55 +0100 Subject: [PATCH 125/150] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 6b3d888..c608442 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -129,7 +129,7 @@ ynh_add_nginx_config #================================================= # UPGRADE DEPENDENCIES #================================================= -ynh_script_progression --message="Upgrading dependencies..." --time --weight=1 +ynh_script_progression --message="Upgrading dependencies..." --weight=1 ynh_install_app_dependencies $pkg_dependencies From 5d825901f8fcf71072b6363ec68b5d55caa422ce Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 10 Dec 2021 08:57:30 +0100 Subject: [PATCH 126/150] 4.6.2 --- conf/app.src | 4 ++-- manifest.json | 2 +- scripts/restore | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/conf/app.src b/conf/app.src index f1923a8..eced125 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://builds.matomo.org/matomo-4.6.1.tar.gz -SOURCE_SUM=995302b5fe4e7f01b218283daeb338160cd2f69e0567601709e359e030ea0149 +SOURCE_URL=https://builds.matomo.org/matomo-4.6.2.tar.gz +SOURCE_SUM=4e35e84a2744954ec4b4e7e5e7e8d6ad65f4258024e47b9c80670b43443315b9 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index e4cb2e1..595595d 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.6.1~ynh1", + "version": "4.6.2~ynh1", "url": "https://matomo.org", "upstream": { "license": "GPL-3.0-or-later", diff --git a/scripts/restore b/scripts/restore index 842d4de..2b16a4f 100755 --- a/scripts/restore +++ b/scripts/restore @@ -36,8 +36,7 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= ynh_script_progression --message="Validating restoration parameters..." --weight=1 -test ! -d $final_path \ - || ynh_die --message="There is already a directory: $final_path " +test ! -d $final_path || ynh_die --message="There is already a directory: $final_path " #================================================= # STANDARD RESTORATION STEPS From 1574676faa198871fc1c28131fdcaeed942309f0 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Fri, 10 Dec 2021 07:57:36 +0000 Subject: [PATCH 127/150] 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 15ea8c8..095f9df 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 Open source analytics platform for measuring Web statistics -**Shipped version:** 4.6.1~ynh1 +**Shipped version:** 4.6.2~ynh1 **Demo:** https://demo.matomo.org diff --git a/README_fr.md b/README_fr.md index 22e240c..26d7de4 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme d'analyse open source de mesure de statistiques Web -**Version incluse :** 4.6.1~ynh1 +**Version incluse :** 4.6.2~ynh1 **Démo :** https://demo.matomo.org From b8bcb476621def10036708987637bc009f5daa9d Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 10 Dec 2021 11:16:28 +0100 Subject: [PATCH 128/150] Add config panel --- config_panel.toml | 25 +++++++++++++ scripts/config | 95 +++++++++++++++++++++++++++++++++++++++++++++++ scripts/install | 1 + scripts/restore | 7 +++- scripts/upgrade | 17 ++++++++- 5 files changed, 142 insertions(+), 3 deletions(-) create mode 100644 config_panel.toml create mode 100644 scripts/config diff --git a/config_panel.toml b/config_panel.toml new file mode 100644 index 0000000..cde6230 --- /dev/null +++ b/config_panel.toml @@ -0,0 +1,25 @@ +version = "1.0" + +[main] +name = "Matomo configuration" + + [main.php_fpm_config] + name = "PHP-FPM configuration" + + [main.php_fpm_config.fpm_footprint] + ask = "Memory footprint of the service?" + choices = ["low", "medium", "high", "specific"] + default = "low" + help = "low <= 20Mb per pool. medium between 20Mb and 40Mb per pool. high > 40Mb per pool.
Use specific to set a value with the following option." + + [main.php_fpm_config.free_footprint] + ask = "Memory footprint of the service?" + type = "number" + default = "0" + help = "Free field to specify exactly the footprint in Mb if you don't want to use one of the three previous values." + + [main.php_fpm_config.fpm_usage] + ask = "Expected usage of the service?" + choices = ["low", "medium", "high"] + default = "low" + help = "low: Personal usage, behind the SSO. No RAM footprint when not used, but the impact on the processor can be high if many users are using the service.
medium: Low usage, few people or/and publicly accessible. Low RAM footprint, medium processor footprint when used.
high: High usage, frequently visited website. High RAM footprint, but lower on processor usage and quickly responding." diff --git a/scripts/config b/scripts/config new file mode 100644 index 0000000..3440bd2 --- /dev/null +++ b/scripts/config @@ -0,0 +1,95 @@ +#!/bin/bash + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +ynh_abort_if_errors + +#================================================= +# RETRIEVE ARGUMENTS +#================================================= + +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +current_fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) + +#================================================= +# SPECIFIC GETTERS FOR TOML SHORT KEY +#================================================= + +get__fpm_footprint() { + # Free footprint value for php-fpm + # Check if current_fpm_footprint is an integer + if [ "$current_fpm_footprint" -eq "$current_fpm_footprint" ] 2> /dev/null + then + echo "specific" + else + echo "$current_fpm_footprint" + fi +} + +get__free_footprint() { + # Free footprint value for php-fpm + # Check if current_fpm_footprint is an integer + if [ "$current_fpm_footprint" -eq "$current_fpm_footprint" ] 2> /dev/null + then + # If current_fpm_footprint is an integer, that's a numeric value for the footprint + echo "$current_fpm_footprint" + else + echo "0" + fi +} + +#================================================= +# SPECIFIC SETTERS FOR TOML SHORT KEYS +#================================================= + +set__fpm_footprint() { + if [ "$fpm_footprint" != "specific" ] + then + ynh_app_setting_set --app=$app --key=fpm_footprint --value="$fpm_footprint" + fi +} + +set__free_footprint() { + if [ "$fpm_footprint" = "specific" ] + then + ynh_app_setting_set --app=$app --key=fpm_footprint --value="$free_footprint" + fi +} + +#================================================= +# GENERIC FINALIZATION +#================================================= + +ynh_app_config_validate() { + _ynh_app_config_validate + + if [ "${changed[fpm_usage]}" == "true" ] || [ "${changed[fpm_footprint]}" == "true" ] || [ "${changed[free_footprint]}" == "true" ]; then + # If fpm_footprint is set to 'specific', use $free_footprint value. + if [ "$fpm_footprint" = "specific" ] + then + fpm_footprint=$free_footprint + fi + + if [ "$fpm_footprint" == "0" ] + then + ynh_print_err --message="When selecting 'specific', you have to set a footprint value into the field below." + + exit 0 + fi + fi +} + +ynh_app_config_apply() { + _ynh_app_config_apply + + ynh_add_fpm_config --phpversion=$phpversion --usage=$fpm_usage --footprint=$fpm_footprint +} + +ynh_app_config_run $1 diff --git a/scripts/install b/scripts/install index 329a2c9..9be910c 100755 --- a/scripts/install +++ b/scripts/install @@ -25,6 +25,7 @@ path_url=$YNH_APP_ARG_PATH admin=$YNH_APP_ARG_ADMIN email=$(ynh_user_get_info --username=$admin --key=mail) is_public=$YNH_APP_ARG_IS_PUBLIC +phpversion=$YNH_PHP_VERSION app=$YNH_APP_INSTANCE_NAME diff --git a/scripts/restore b/scripts/restore index 2b16a4f..adde81f 100755 --- a/scripts/restore +++ b/scripts/restore @@ -31,6 +31,9 @@ db_name=$(ynh_app_setting_get --app=$app --key=db_name) db_user=$db_name phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) +fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) + #================================================= # CHECK IF THE APP CAN BE RESTORED #================================================= @@ -74,8 +77,8 @@ ynh_script_progression --message="Restoring PHP-FPM configuration..." --weight=2 # Restore the file first, so it can have a backup if different ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" -# Recreate a dedicated php-fpm config -ynh_add_fpm_config --usage=low --footprint=low +# Recreate a dedicated PHP-FPM config +ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --phpversion=$phpversion #================================================= # REINSTALL DEPENDENCIES diff --git a/scripts/upgrade b/scripts/upgrade index c608442..3ec42ab 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -24,6 +24,9 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) admin=$YNH_APP_ARG_ADMIN email=$(ynh_user_get_info --username=$admin --key=mail) +fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) +fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) + #================================================= # CHECK VERSION #================================================= @@ -66,6 +69,18 @@ if [ -z "$admin" ]; then email=root@$domain fi +# If fpm_footprint doesn't exist, create it +if [ -z "$fpm_footprint" ]; then + fpm_footprint=low + ynh_app_setting_set --app=$app --key=fpm_footprint --value=$fpm_footprint +fi + +# If fpm_usage doesn't exist, create it +if [ -z "$fpm_usage" ]; then + fpm_usage=low + ynh_app_setting_set --app=$app --key=fpm_usage --value=$fpm_usage +fi + # Cleaning legacy permissions if ynh_legacy_permissions_exists; then ynh_legacy_permissions_delete_all @@ -139,7 +154,7 @@ ynh_install_app_dependencies $pkg_dependencies ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=2 # Create a dedicated PHP-FPM config -ynh_add_fpm_config --usage=low --footprint=low +ynh_add_fpm_config --phpversion=$phpversion --usage=$fpm_usage --footprint=$fpm_footprint #================================================= # SETUP A CRON From 48707e9b3d1f8004ec055623e1e0f9b3e5cc7082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 3 Feb 2022 09:25:05 +0100 Subject: [PATCH 129/150] add PHP8 (#63) * add PHP8 * 4.7.1 --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 4 ++-- scripts/_common.sh | 2 +- scripts/config | 4 ++-- scripts/install | 1 - scripts/remove | 16 ++++++++-------- scripts/restore | 18 +++++++++--------- scripts/upgrade | 2 +- 10 files changed, 27 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 095f9df..f618e13 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 Open source analytics platform for measuring Web statistics -**Shipped version:** 4.6.2~ynh1 +**Shipped version:** 4.7.1~ynh1 **Demo:** https://demo.matomo.org diff --git a/README_fr.md b/README_fr.md index 26d7de4..8d47cc3 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme d'analyse open source de mesure de statistiques Web -**Version incluse :** 4.6.2~ynh1 +**Version incluse :** 4.7.1~ynh1 **Démo :** https://demo.matomo.org diff --git a/conf/app.src b/conf/app.src index eced125..58e2f00 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://builds.matomo.org/matomo-4.6.2.tar.gz -SOURCE_SUM=4e35e84a2744954ec4b4e7e5e7e8d6ad65f4258024e47b9c80670b43443315b9 +SOURCE_URL=https://builds.matomo.org/matomo-4.7.1.tar.gz +SOURCE_SUM=32eb82296288cdfe15ec9995e32d841fca0e3527ad2727222a62cda47742d60f SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 595595d..c602b0c 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.6.2~ynh1", + "version": "4.7.1~ynh1", "url": "https://matomo.org", "upstream": { "license": "GPL-3.0-or-later", @@ -26,7 +26,7 @@ "multi_instance": true, "services": [ "nginx", - "php7.3-fpm", + "php8.0-fpm", "mysql" ], "arguments": { diff --git a/scripts/_common.sh b/scripts/_common.sh index ac31ed1..edd23b9 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -4,7 +4,7 @@ # COMMON VARIABLES #================================================= -YNH_PHP_VERSION="7.3" +YNH_PHP_VERSION="8.0" pkg_dependencies="php${YNH_PHP_VERSION}-curl php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-cli php${YNH_PHP_VERSION}-mysql php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-mbstring" diff --git a/scripts/config b/scripts/config index 3440bd2..8a9110c 100644 --- a/scripts/config +++ b/scripts/config @@ -57,7 +57,7 @@ set__fpm_footprint() { } set__free_footprint() { - if [ "$fpm_footprint" = "specific" ] + if [ "$fpm_footprint" == "specific" ] then ynh_app_setting_set --app=$app --key=fpm_footprint --value="$free_footprint" fi @@ -72,7 +72,7 @@ ynh_app_config_validate() { if [ "${changed[fpm_usage]}" == "true" ] || [ "${changed[fpm_footprint]}" == "true" ] || [ "${changed[free_footprint]}" == "true" ]; then # If fpm_footprint is set to 'specific', use $free_footprint value. - if [ "$fpm_footprint" = "specific" ] + if [ "$fpm_footprint" == "specific" ] then fpm_footprint=$free_footprint fi diff --git a/scripts/install b/scripts/install index 9be910c..b116502 100755 --- a/scripts/install +++ b/scripts/install @@ -102,7 +102,6 @@ ynh_script_progression --message="Configuring PHP-FPM..." --weight=3 # Create a dedicated PHP-FPM config ynh_add_fpm_config --usage=low --footprint=low -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # SETUP A CRON diff --git a/scripts/remove b/scripts/remove index cfe1f30..b78d1d6 100755 --- a/scripts/remove +++ b/scripts/remove @@ -31,14 +31,6 @@ ynh_script_progression --message="Removing the MySQL database..." --weight=1 # Remove a database if it exists, along with the associated user ynh_mysql_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 #================================================= @@ -63,6 +55,14 @@ ynh_script_progression --message="Removing PHP-FPM configuration..." --weight=1 # Remove the dedicated PHP-FPM config ynh_remove_fpm_config +#================================================= +# REMOVE DEPENDENCIES +#================================================= +ynh_script_progression --message="Removing dependencies..." --weight=1 + +# Remove metapackage and its dependencies +ynh_remove_app_dependencies + #================================================= # SPECIFIC REMOVE #================================================= diff --git a/scripts/restore b/scripts/restore index adde81f..9a59da7 100755 --- a/scripts/restore +++ b/scripts/restore @@ -29,7 +29,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 -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +phpversion=$YNH_PHP_VERSION fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) @@ -69,6 +69,14 @@ chmod 750 "$final_path" chmod -R o-rwx "$final_path" chown -R $app:www-data "$final_path" +#================================================= +# REINSTALL DEPENDENCIES +#================================================= +ynh_script_progression --message="Reinstalling dependencies..." --weight=1 + +# Define and install dependencies +ynh_install_app_dependencies $pkg_dependencies + #================================================= # RESTORE THE PHP-FPM CONFIGURATION #================================================= @@ -80,14 +88,6 @@ ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" # Recreate a dedicated PHP-FPM config ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --phpversion=$phpversion -#================================================= -# REINSTALL DEPENDENCIES -#================================================= -ynh_script_progression --message="Reinstalling dependencies..." --weight=1 - -# Define and install dependencies -ynh_install_app_dependencies $pkg_dependencies - #================================================= # RESTORE THE MYSQL DATABASE #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 3ec42ab..4da8c79 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -20,7 +20,7 @@ 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) -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +phpversion=$YNH_PHP_VERSION admin=$YNH_APP_ARG_ADMIN email=$(ynh_user_get_info --username=$admin --key=mail) From 9bf71a954117380c89f0165c40f450419016662a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 3 Feb 2022 16:54:51 +0100 Subject: [PATCH 130/150] Delete .DS_Store --- doc/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 doc/.DS_Store diff --git a/doc/.DS_Store b/doc/.DS_Store deleted file mode 100644 index fc7b8a40949f5488c93362acd831b939baeb97b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}(4f5FRhvHZG_NQV$?;u*9L4J#4kxa*ejYsS>C`a479IX{>If$VN$)J*-xW z`T%`^a_!H1ls*J6!kro0TZFb;QK>x9_?wJp#>wZ%jsbuT#@Ta#5C8&H!WPHoFGBsK z3(|5PLS|}6P*A}LG}H^x-tjLoKy$Z@bM_HRka%6sUzJX(leEw&MqH*RMPAk2?geWt zwI4iu6!6D!gC&TdRE3N7zSF$wqY>nfiTxEJP&|{TVCf*e{_I^^2unymhWMi1+0Uw5I z(`m2wq9c0!{;VUWTU*_Z==WaEW;_VipY6VRKmPpX>)E&OKYso?H(9{&(>1c{a1OuG zxP_Y2xKxE!pD<#cJVBNAwJM2JV&tS|0=|VdSu}XqFCa z==YKO+k_-&(^-O0IE)-N7O@9~*;GWE%G?oy*>v;^7Z*8fEZTHnW@N16MrQ7W!p!LC z7bYB7WYM>t0nflq2A1q?Nc;cJ?dSiSN&e0=;2HR@7+~$~czb}a=^gL=TGp5im6P#xroI3|s*i)MY*Z From 69d06164d2417de0ef5dc600bda8d56aaf9ceea8 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 7 Feb 2022 23:25:46 +0100 Subject: [PATCH 131/150] Update upgrade --- scripts/upgrade | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 4da8c79..f2d3b54 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -112,17 +112,8 @@ then # This condition is only for CI test to go through the upgrade process ynh_setup_source --dest_dir="$final_path" else - # Create a temporary directory - tmpdir="$(mktemp -d)" - - cp -a "$final_path/config/config.ini.php" "$tmpdir/config.ini.php" - # 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" - cp -a "$tmpdir/config.ini.php" "$final_path/config/config.ini.php" - # Remove the tmp directory securely - ynh_secure_remove --file="$tmpdir" + ynh_setup_source --dest_dir="$final_path" --keep="$final_path/config/config.ini.php" chown -R $app:www-data "$final_path" ynh_exec_as $app php${phpversion} $final_path/console core:update -n From aa41db0fd0b7127617d30fdce5e7811079ab18d0 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 8 Feb 2022 14:43:05 +0100 Subject: [PATCH 132/150] upgrade: gotta upgrade apt dependencies *before* calling core:update, because it needs the appropriate php version --- scripts/upgrade | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index f2d3b54..6e1d232 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -98,6 +98,14 @@ ynh_system_user_create --username=$app --home_dir="$final_path" #================================================= # STANDARD UPGRADE STEPS +#================================================= +#================================================= +# UPGRADE DEPENDENCIES +#================================================= +ynh_script_progression --message="Upgrading dependencies..." --weight=1 + +ynh_install_app_dependencies $pkg_dependencies + #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= @@ -132,13 +140,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 - #================================================= # PHP-FPM CONFIGURATION #================================================= From 811fa47df8a7902c52053470fbdc0abd2a3c0dd1 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 8 Feb 2022 14:43:08 +0100 Subject: [PATCH 133/150] Update manifest.json --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index c602b0c..1383316 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.7.1~ynh1", + "version": "4.7.1~ynh2", "url": "https://matomo.org", "upstream": { "license": "GPL-3.0-or-later", From 6c32b93cedbf32f3c298d48b859173e7e1b9a929 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Tue, 8 Feb 2022 13:43:27 +0000 Subject: [PATCH 134/150] 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 f618e13..e174588 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 Open source analytics platform for measuring Web statistics -**Shipped version:** 4.7.1~ynh1 +**Shipped version:** 4.7.1~ynh2 **Demo:** https://demo.matomo.org diff --git a/README_fr.md b/README_fr.md index 8d47cc3..38272c5 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme d'analyse open source de mesure de statistiques Web -**Version incluse :** 4.7.1~ynh1 +**Version incluse :** 4.7.1~ynh2 **Démo :** https://demo.matomo.org From 7f31ec266e16df4c59fba6f74ae3f106e11171d0 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 8 Mar 2022 22:54:32 +0100 Subject: [PATCH 135/150] 4.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 58e2f00..2cba80d 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://builds.matomo.org/matomo-4.7.1.tar.gz -SOURCE_SUM=32eb82296288cdfe15ec9995e32d841fca0e3527ad2727222a62cda47742d60f +SOURCE_URL=https://builds.matomo.org/matomo-4.8.0.tar.gz +SOURCE_SUM=1a74a9de8c860d0b4a4f1cde4f3b422403620cce170cca5e5fac3df273b869d8 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 1383316..b1e3fc8 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.7.1~ynh2", + "version": "4.8.0~ynh1", "url": "https://matomo.org", "upstream": { "license": "GPL-3.0-or-later", From ef82cbed8e75889b883df9a41f5607915168c2d4 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Tue, 8 Mar 2022 21:54:40 +0000 Subject: [PATCH 136/150] 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 e174588..08ddd35 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 Open source analytics platform for measuring Web statistics -**Shipped version:** 4.7.1~ynh2 +**Shipped version:** 4.8.0~ynh1 **Demo:** https://demo.matomo.org diff --git a/README_fr.md b/README_fr.md index 38272c5..14b986b 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme d'analyse open source de mesure de statistiques Web -**Version incluse :** 4.7.1~ynh2 +**Version incluse :** 4.8.0~ynh1 **Démo :** https://demo.matomo.org From ce061241967f9cffc392ab28d561b6578f24b78a Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 13 Mar 2022 14:32:10 +0100 Subject: [PATCH 137/150] Update restore --- scripts/restore | 3 --- 1 file changed, 3 deletions(-) diff --git a/scripts/restore b/scripts/restore index 67f2743..9a59da7 100755 --- a/scripts/restore +++ b/scripts/restore @@ -34,9 +34,6 @@ phpversion=$YNH_PHP_VERSION fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) -fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) -fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) - #================================================= # CHECK IF THE APP CAN BE RESTORED #================================================= From 13d3ba2c0e8d36ac85321b8cf74f4dda878c9d39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 13 Apr 2022 15:05:12 +0200 Subject: [PATCH 138/150] 4.9.0 (#71) * 4.9.0 * Auto-update README Co-authored-by: yunohost-bot --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 08ddd35..f7906df 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 Open source analytics platform for measuring Web statistics -**Shipped version:** 4.8.0~ynh1 +**Shipped version:** 4.9.0~ynh1 **Demo:** https://demo.matomo.org diff --git a/README_fr.md b/README_fr.md index 14b986b..cba063d 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme d'analyse open source de mesure de statistiques Web -**Version incluse :** 4.8.0~ynh1 +**Version incluse :** 4.9.0~ynh1 **Démo :** https://demo.matomo.org diff --git a/conf/app.src b/conf/app.src index 2cba80d..254045b 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://builds.matomo.org/matomo-4.8.0.tar.gz -SOURCE_SUM=1a74a9de8c860d0b4a4f1cde4f3b422403620cce170cca5e5fac3df273b869d8 +SOURCE_URL=https://builds.matomo.org/matomo-4.9.0.tar.gz +SOURCE_SUM=deb05490f45f3219d9e31b547cbc9f6fd0d28040339e708e787f9e56d70889a6 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index b1e3fc8..7f135e8 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.8.0~ynh1", + "version": "4.9.0~ynh1", "url": "https://matomo.org", "upstream": { "license": "GPL-3.0-or-later", From 686cdc82c2d29b23c70ab2b9e25a53907916bce2 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 13 Apr 2022 15:08:25 +0200 Subject: [PATCH 139/150] Fix --- scripts/backup | 2 +- scripts/install | 2 +- scripts/remove | 2 +- scripts/restore | 2 +- scripts/upgrade | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/backup b/scripts/backup index 08d4b96..81b0f6d 100755 --- a/scripts/backup +++ b/scripts/backup @@ -69,4 +69,4 @@ ynh_mysql_dump_db --database="$db_name" > db.sql # END OF SCRIPT #================================================= -ynh_print_info --message="Backup script completed for Matomo. (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/install b/scripts/install index b116502..6d58158 100755 --- a/scripts/install +++ b/scripts/install @@ -154,4 +154,4 @@ ynh_send_readme_to_admin "$message" # END OF SCRIPT #================================================= -ynh_script_progression --message="Installation of Matomo completed" --last +ynh_script_progression --message="Installation of $app completed" --last diff --git a/scripts/remove b/scripts/remove index b78d1d6..f37ed10 100755 --- a/scripts/remove +++ b/scripts/remove @@ -87,4 +87,4 @@ ynh_system_user_delete --username=$app # END OF SCRIPT #================================================= -ynh_script_progression --message="Removal of Matomo completed" --last +ynh_script_progression --message="Removal of $app completed" --last diff --git a/scripts/restore b/scripts/restore index 9a59da7..e5fb27d 100755 --- a/scripts/restore +++ b/scripts/restore @@ -120,4 +120,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Restoration completed for Matomo" --last +ynh_script_progression --message="Restoration completed for $app" --last diff --git a/scripts/upgrade b/scripts/upgrade index 6e1d232..b39aceb 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -168,4 +168,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Upgrade of Matomo completed" --last +ynh_script_progression --message="Upgrade of $app completed" --last From cbae7040572846331b40550c0c00e6dad23b1617 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 13 Apr 2022 15:09:39 +0200 Subject: [PATCH 140/150] Create DESCRIPTION.md --- doc/DESCRIPTION.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 doc/DESCRIPTION.md diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md new file mode 100644 index 0000000..ff369fa --- /dev/null +++ b/doc/DESCRIPTION.md @@ -0,0 +1,5 @@ +Matomo is the leading Free/Libre open analytics platform. + +Matomo is a full-featured PHP MySQL software program that you download and install on your own webserver. At the end of the five-minute installation process, you will be given a JavaScript code. Simply copy and paste this tag on websites you wish to track and access your analytics reports in real-time. + +Matomo aims to be a Free software alternative to Google Analytics and is already used on more than 1,400,000 websites. Privacy is built-in! From dd902b72cde1c6b003744d070569b36d82cbfe2b Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 13 Apr 2022 13:09:45 +0000 Subject: [PATCH 141/150] Auto-update README --- README.md | 7 ++++++- README_fr.md | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f7906df..d32af90 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,12 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in ## Overview -Open source analytics platform for measuring Web statistics +Matomo is the leading Free/Libre open analytics platform. + +Matomo is a full-featured PHP MySQL software program that you download and install on your own webserver. At the end of the five-minute installation process, you will be given a JavaScript code. Simply copy and paste this tag on websites you wish to track and access your analytics reports in real-time. + +Matomo aims to be a Free software alternative to Google Analytics and is already used on more than 1,400,000 websites. Privacy is built-in! + **Shipped version:** 4.9.0~ynh1 diff --git a/README_fr.md b/README_fr.md index cba063d..c18fec1 100644 --- a/README_fr.md +++ b/README_fr.md @@ -11,7 +11,12 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour ## Vue d'ensemble -Plateforme d'analyse open source de mesure de statistiques Web +Matomo is the leading Free/Libre open analytics platform. + +Matomo is a full-featured PHP MySQL software program that you download and install on your own webserver. At the end of the five-minute installation process, you will be given a JavaScript code. Simply copy and paste this tag on websites you wish to track and access your analytics reports in real-time. + +Matomo aims to be a Free software alternative to Google Analytics and is already used on more than 1,400,000 websites. Privacy is built-in! + **Version incluse :** 4.9.0~ynh1 From aedd28f1f29c20d297c2a522c3a802c6fe840f1c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 27 Apr 2022 08:27:47 +0200 Subject: [PATCH 142/150] 4.9.1 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index 254045b..1e6a712 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://builds.matomo.org/matomo-4.9.0.tar.gz -SOURCE_SUM=deb05490f45f3219d9e31b547cbc9f6fd0d28040339e708e787f9e56d70889a6 +SOURCE_URL=https://builds.matomo.org/matomo-4.9.1.tar.gz +SOURCE_SUM=2ff734151ce43d050fc2ecf0dcbb845859430c5106b9755c5be3244b8d9d5a54 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 7f135e8..2a0740a 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.9.0~ynh1", + "version": "4.9.1~ynh1", "url": "https://matomo.org", "upstream": { "license": "GPL-3.0-or-later", From e332bbcf8b1fca364367922cd9df54f746633bfe Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 27 Apr 2022 06:27:54 +0000 Subject: [PATCH 143/150] 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 d32af90..dff8d1a 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Matomo is a full-featured PHP MySQL software program that you download and insta Matomo aims to be a Free software alternative to Google Analytics and is already used on more than 1,400,000 websites. Privacy is built-in! -**Shipped version:** 4.9.0~ynh1 +**Shipped version:** 4.9.1~ynh1 **Demo:** https://demo.matomo.org diff --git a/README_fr.md b/README_fr.md index c18fec1..31cdba8 100644 --- a/README_fr.md +++ b/README_fr.md @@ -18,7 +18,7 @@ Matomo is a full-featured PHP MySQL software program that you download and insta Matomo aims to be a Free software alternative to Google Analytics and is already used on more than 1,400,000 websites. Privacy is built-in! -**Version incluse :** 4.9.0~ynh1 +**Version incluse :** 4.9.1~ynh1 **Démo :** https://demo.matomo.org From e600a942d55a6f8d8a1272fd3325d0dc18f766e8 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 16 May 2022 07:27:18 +0200 Subject: [PATCH 144/150] 4.10.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 1e6a712..a17c205 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://builds.matomo.org/matomo-4.9.1.tar.gz -SOURCE_SUM=2ff734151ce43d050fc2ecf0dcbb845859430c5106b9755c5be3244b8d9d5a54 +SOURCE_URL=https://builds.matomo.org/matomo-4.10.0.tar.gz +SOURCE_SUM=00f4bcf3178501e14132db2e354e6233bf855251cb6bd1dc69750d921570b824 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 2a0740a..3084cad 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.9.1~ynh1", + "version": "4.10.0~ynh1", "url": "https://matomo.org", "upstream": { "license": "GPL-3.0-or-later", From ed2067b780214edf914e793b72ccdfd15803659e Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 16 May 2022 05:27:22 +0000 Subject: [PATCH 145/150] 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 dff8d1a..99c3dd7 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Matomo is a full-featured PHP MySQL software program that you download and insta Matomo aims to be a Free software alternative to Google Analytics and is already used on more than 1,400,000 websites. Privacy is built-in! -**Shipped version:** 4.9.1~ynh1 +**Shipped version:** 4.10.0~ynh1 **Demo:** https://demo.matomo.org diff --git a/README_fr.md b/README_fr.md index 31cdba8..9dfc2f8 100644 --- a/README_fr.md +++ b/README_fr.md @@ -18,7 +18,7 @@ Matomo is a full-featured PHP MySQL software program that you download and insta Matomo aims to be a Free software alternative to Google Analytics and is already used on more than 1,400,000 websites. Privacy is built-in! -**Version incluse :** 4.9.1~ynh1 +**Version incluse :** 4.10.0~ynh1 **Démo :** https://demo.matomo.org From 2a1c715a747eb3ea92e6b0c3e8ec488b00805814 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 25 May 2022 06:11:21 +0000 Subject: [PATCH 146/150] Auto-update README --- README.md | 19 ++++++++++--------- README_fr.md | 25 +++++++++++++++---------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 99c3dd7..488488e 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ It shall NOT be edited by hand. # Matomo for YunoHost -[![Integration level](https://dash.yunohost.org/integration/matomo.svg)](https://dash.yunohost.org/appci/app/matomo) ![](https://ci-apps.yunohost.org/ci/badges/matomo.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/matomo.maintain.svg) +[![Integration level](https://dash.yunohost.org/integration/matomo.svg)](https://dash.yunohost.org/appci/app/matomo) ![Working status](https://ci-apps.yunohost.org/ci/badges/matomo.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/matomo.maintain.svg) [![Install Matomo with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=matomo) *[Lire ce readme en français.](./README_fr.md)* @@ -28,7 +28,7 @@ Matomo aims to be a Free software alternative to Google Analytics and is already ## Screenshots -![](./doc/screenshots/screenshot.png) +![Screenshot of Matomo](./doc/screenshots/screenshot.png) ## Disclaimers / important information @@ -40,21 +40,22 @@ Matomo aims to be a Free software alternative to Google Analytics and is already ## Documentation and resources -* Official app website: https://matomo.org -* Official admin documentation: https://matomo.org/docs -* Upstream app code repository: https://github.com/matomo-org/matomo -* YunoHost documentation for this app: https://yunohost.org/app_matomo -* Report a bug: https://github.com/YunoHost-Apps/matomo_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/matomo_ynh/tree/testing). To try the testing branch, please proceed like that. -``` + +``` bash sudo yunohost app install https://github.com/YunoHost-Apps/matomo_ynh/tree/testing --debug or sudo yunohost app upgrade matomo -u https://github.com/YunoHost-Apps/matomo_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 9dfc2f8..29a7aa5 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,10 +1,14 @@ + + # Matomo pour YunoHost -[![Niveau d'intégration](https://dash.yunohost.org/integration/matomo.svg)](https://dash.yunohost.org/appci/app/matomo) ![](https://ci-apps.yunohost.org/ci/badges/matomo.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/matomo.maintain.svg) +[![Niveau d'intégration](https://dash.yunohost.org/integration/matomo.svg)](https://dash.yunohost.org/appci/app/matomo) ![Status du fonctionnement](https://ci-apps.yunohost.org/ci/badges/matomo.status.svg) ![Status de maintenance](https://ci-apps.yunohost.org/ci/badges/matomo.maintain.svg) [![Installer Matomo avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=matomo) *[Read this readme in english.](./README.md)* -*[Lire ce readme en français.](./README_fr.md)* > *Ce package vous permet d'installer Matomo 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.* @@ -24,7 +28,7 @@ Matomo aims to be a Free software alternative to Google Analytics and is already ## Captures d'écran -![](./doc/screenshots/screenshot.png) +![Capture d'écran de Matomo](./doc/screenshots/screenshot.png) ## Avertissements / informations importantes @@ -36,21 +40,22 @@ Matomo aims to be a Free software alternative to Google Analytics and is already ## Documentations et ressources -* Site officiel de l'app : https://matomo.org -* Documentation officielle de l'admin : https://matomo.org/docs -* Dépôt de code officiel de l'app : https://github.com/matomo-org/matomo -* Documentation YunoHost pour cette app : https://yunohost.org/app_matomo -* Signaler un bug : https://github.com/YunoHost-Apps/matomo_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/matomo_ynh/tree/testing). Pour essayer la branche testing, procédez comme suit. -``` + +``` bash sudo yunohost app install https://github.com/YunoHost-Apps/matomo_ynh/tree/testing --debug ou sudo yunohost app upgrade matomo -u https://github.com/YunoHost-Apps/matomo_ynh/tree/testing --debug ``` -**Plus d'infos sur le packaging d'applications :** https://yunohost.org/packaging_apps \ No newline at end of file +**Plus d'infos sur le packaging d'applications :** From 27e1f79b38d9717bf3479157d5203a5c51a2665a Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 25 May 2022 08:13:17 +0200 Subject: [PATCH 147/150] 4.10.1 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index a17c205..4889bb2 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://builds.matomo.org/matomo-4.10.0.tar.gz -SOURCE_SUM=00f4bcf3178501e14132db2e354e6233bf855251cb6bd1dc69750d921570b824 +SOURCE_URL=https://builds.matomo.org/matomo-4.10.1.tar.gz +SOURCE_SUM=4cddb1cb760786db9ec268bb87dbed30a125448f2e58ebe76331b54652064f75 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 3084cad..70ca6a2 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.10.0~ynh1", + "version": "4.10.1~ynh1", "url": "https://matomo.org", "upstream": { "license": "GPL-3.0-or-later", From a21c4ac069a607e6e6e98fd819b7f5d6e8529fa3 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 25 May 2022 06:13:33 +0000 Subject: [PATCH 148/150] 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 488488e..f102c28 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Matomo is a full-featured PHP MySQL software program that you download and insta Matomo aims to be a Free software alternative to Google Analytics and is already used on more than 1,400,000 websites. Privacy is built-in! -**Shipped version:** 4.10.0~ynh1 +**Shipped version:** 4.10.1~ynh1 **Demo:** https://demo.matomo.org diff --git a/README_fr.md b/README_fr.md index 29a7aa5..95a7434 100644 --- a/README_fr.md +++ b/README_fr.md @@ -22,7 +22,7 @@ Matomo is a full-featured PHP MySQL software program that you download and insta Matomo aims to be a Free software alternative to Google Analytics and is already used on more than 1,400,000 websites. Privacy is built-in! -**Version incluse :** 4.10.0~ynh1 +**Version incluse :** 4.10.1~ynh1 **Démo :** https://demo.matomo.org From 23f97d8c2700939d6b47b876da09cb2a5e00b828 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Sat, 18 Jun 2022 18:16:35 +0200 Subject: [PATCH 149/150] Apply example_ynh --- check_process | 2 +- conf/app.src | 2 + conf/extra_php-fpm.conf | 5 -- conf/nginx.conf | 110 ++++++++++++++++++++-------------------- manifest.json | 14 ++--- scripts/_common.sh | 5 +- scripts/backup | 4 +- scripts/change_url | 7 ++- scripts/install | 47 +++++++++-------- scripts/remove | 6 +-- scripts/restore | 34 ++++++------- scripts/upgrade | 61 +++++++++++----------- 12 files changed, 151 insertions(+), 146 deletions(-) delete mode 100644 conf/extra_php-fpm.conf diff --git a/check_process b/check_process index a4dae0a..6076f60 100644 --- a/check_process +++ b/check_process @@ -11,7 +11,7 @@ setup_private=1 setup_public=1 upgrade=1 - #4.4.0 + # 4.4.0~ynh1 upgrade=1 from_commit=9edf3d60ea391925f835ece1309bbcb54e6d33fe backup_restore=1 multi_instance=1 diff --git a/conf/app.src b/conf/app.src index 4889bb2..903f3cb 100644 --- a/conf/app.src +++ b/conf/app.src @@ -3,3 +3,5 @@ SOURCE_SUM=4cddb1cb760786db9ec268bb87dbed30a125448f2e58ebe76331b54652064f75 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true +SOURCE_FILENAME= +SOURCE_EXTRACT=true diff --git a/conf/extra_php-fpm.conf b/conf/extra_php-fpm.conf deleted file mode 100644 index a5425fc..0000000 --- a/conf/extra_php-fpm.conf +++ /dev/null @@ -1,5 +0,0 @@ -; Additional php.ini defines, specific to this pool of workers. - -php_admin_value[upload_max_filesize] = 100M -php_admin_value[memory_limit] = 256M -php_admin_value[post_max_size] = 50M diff --git a/conf/nginx.conf b/conf/nginx.conf index 5714403..9221731 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,8 +1,8 @@ #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; location ^~ __PATH__/ { - # Path to source - alias __FINALPATH__/; + # Path to source + alias __FINALPATH__/; more_set_headers "Referrer-Policy: origin always"; more_set_headers "X-Content-Type-Options: nosniff"; @@ -10,75 +10,77 @@ location ^~ __PATH__/ { index index.php; - try_files $uri $uri/ =404; + # Common parameter to increase upload size limit in conjunction with dedicated php-fpm file + #client_max_body_size 50M; + try_files $uri $uri/ =404; location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; fastcgi_index index.php; include fastcgi_params; - fastcgi_param REMOTE_USER $remote_user; - fastcgi_param PATH_INFO $fastcgi_path_info; + fastcgi_param REMOTE_USER $remote_user; + fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $request_filename; - } + } - ## deny access to all other .php files - location ~* ^.+\.php$ { - deny all; - return 403; - } + ## deny access to all other .php files + location ~* ^.+\.php$ { + deny all; + return 403; + } - ## disable all access to the following directories - location ^~ __PATH__/config/ { - deny all; - return 403; - } + ## disable all access to the following directories + location ^~ __PATH__/config/ { + deny all; + return 403; + } - location ^~ __PATH__/tmp/ { - deny all; - return 403; - } + location ^~ __PATH__/tmp/ { + deny all; + return 403; + } - location ^~ __PATH__/core/ { - deny all; - return 403; - } + location ^~ __PATH__/core/ { + deny all; + return 403; + } - location ^~ __PATH__/lang/ { - deny all; - return 403; - } + location ^~ __PATH__/lang/ { + deny all; + return 403; + } - location ~ __PATH__/\.ht { - deny all; - return 403; - } + location ~ __PATH__/\.ht { + deny all; + return 403; + } - location ~ js/container_.*_preview\.js$ { - expires off; - more_set_headers "Cache-Control: private, no-cache, no-store"; - } + location ~ js/container_.*_preview\.js$ { + expires off; + more_set_headers "Cache-Control: private, no-cache, no-store"; + } - location ~ \.(gif|ico|jpg|png|svg|js|css|htm|html|mp3|mp4|wav|ogg|avi|ttf|eot|woff|woff2|json)$ { - allow all; - ## Cache images,CSS,JS and webfonts for an hour - ## Increasing the duration may improve the load-time, but may cause old files to show after an Matomo upgrade - expires 1h; - more_set_headers "Pragma: public"; - more_set_headers "Cache-Control: public"; - } + location ~ \.(gif|ico|jpg|png|svg|js|css|htm|html|mp3|mp4|wav|ogg|avi|ttf|eot|woff|woff2|json)$ { + allow all; + ## Cache images,CSS,JS and webfonts for an hour + ## Increasing the duration may improve the load-time, but may cause old files to show after an Matomo upgrade + expires 1h; + more_set_headers "Pragma: public"; + more_set_headers "Cache-Control: public"; + } - location ~ ^__PATH__/(libs|vendor|plugins|misc|node_modules) { - deny all; - return 403; - } + location ~ ^__PATH__/(libs|vendor|plugins|misc|node_modules) { + deny all; + return 403; + } - ## properly display textfiles in root directory - location ~__PATH__/(.*\.md|LEGALNOTICE|LICENSE) { - default_type text/plain; - } + ## properly display textfiles in root directory + location ~__PATH__/(.*\.md|LEGALNOTICE|LICENSE) { + default_type text/plain; + } - # show YunoHost panel access - include conf.d/yunohost_panel.conf.inc; + # Include SSOWAT user panel. + include conf.d/yunohost_panel.conf.inc; } diff --git a/manifest.json b/manifest.json index 70ca6a2..0770856 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Open source analytics platform for measuring Web statistics", "fr": "Plateforme d'analyse open source de mesure de statistiques Web" }, - "version": "4.10.1~ynh1", + "version": "4.10.1~ynh2", "url": "https://matomo.org", "upstream": { "license": "GPL-3.0-or-later", @@ -26,11 +26,11 @@ "multi_instance": true, "services": [ "nginx", - "php8.0-fpm", + "php7.3-fpm", "mysql" ], "arguments": { - "install" : [ + "install": [ { "name": "domain", "type": "domain" @@ -41,10 +41,6 @@ "example": "/matomo", "default": "/matomo" }, - { - "name": "admin", - "type": "user" - }, { "name": "is_public", "type": "boolean", @@ -53,6 +49,10 @@ "fr": "Si cette case est cochée, Matomo sera accessible aux personnes n’ayant pas de compte. Vous pourrez changer ceci plus tard via la webadmin." }, "default": true + }, + { + "name": "admin", + "type": "user" } ] } diff --git a/scripts/_common.sh b/scripts/_common.sh index edd23b9..3dfaa50 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -4,9 +4,8 @@ # COMMON VARIABLES #================================================= -YNH_PHP_VERSION="8.0" - -pkg_dependencies="php${YNH_PHP_VERSION}-curl php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-cli php${YNH_PHP_VERSION}-mysql php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-mbstring" +# dependencies used by the app +pkg_dependencies="php$YNH_DEFAULT_PHP_VERSION-curl php$YNH_DEFAULT_PHP_VERSION-gd php$YNH_DEFAULT_PHP_VERSION-cli php$YNH_DEFAULT_PHP_VERSION-mysql php$YNH_DEFAULT_PHP_VERSION-xml php$YNH_DEFAULT_PHP_VERSION-mbstring" #================================================= # PERSONAL HELPERS diff --git a/scripts/backup b/scripts/backup index 81b0f6d..b5fb7bd 100755 --- a/scripts/backup +++ b/scripts/backup @@ -6,7 +6,7 @@ # IMPORT GENERIC HELPERS #================================================= -#Keep this path for calling _common.sh inside the execution's context of backup and restore scripts +# 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 @@ -53,7 +53,7 @@ ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" ynh_backup --src_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" #================================================= -# BACKUP A CRON FILE +# BACKUP VARIOUS FILES #================================================= ynh_backup --src_path="/etc/cron.d/$app" diff --git a/scripts/change_url b/scripts/change_url index 3658832..6c40b4f 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -28,11 +28,13 @@ 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) -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) + +# Add settings here as needed by your application +admin=$(ynh_app_setting_get --app=$app --key=admin) email=$(ynh_user_get_info --username=$admin --key=mail) #================================================= -# 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 @@ -100,6 +102,7 @@ ynh_script_progression --message="Setuping a cron..." --weight=1 path=$new_path domain=$new_domain + ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" chown root: "/etc/cron.d/$app" chmod 644 "/etc/cron.d/$app" diff --git a/scripts/install b/scripts/install index 6d58158..755f39b 100755 --- a/scripts/install +++ b/scripts/install @@ -22,13 +22,13 @@ ynh_abort_if_errors domain=$YNH_APP_ARG_DOMAIN path_url=$YNH_APP_ARG_PATH -admin=$YNH_APP_ARG_ADMIN -email=$(ynh_user_get_info --username=$admin --key=mail) is_public=$YNH_APP_ARG_IS_PUBLIC -phpversion=$YNH_PHP_VERSION +admin=$YNH_APP_ARG_ADMIN app=$YNH_APP_INSTANCE_NAME +email=$(ynh_user_get_info --username=$admin --key=mail) + #================================================= # CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS #================================================= @@ -55,6 +55,14 @@ ynh_script_progression --message="Installing dependencies..." --weight=1 ynh_install_app_dependencies $pkg_dependencies +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Configuring system user..." --weight=1 + +# Create a system user +ynh_system_user_create --username=$app --home_dir="$final_path" + #================================================= # CREATE A MYSQL DATABASE #================================================= @@ -65,14 +73,6 @@ db_user=$db_name ynh_app_setting_set --app=$app --key=db_name --value=$db_name ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Configuring system user..." --weight=1 - -# Create a system user -ynh_system_user_create --username=$app --home_dir="$final_path" - #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= @@ -82,11 +82,18 @@ 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" -# Set permissions to app files chmod 750 "$final_path" chmod -R o-rwx "$final_path" chown -R $app:www-data "$final_path" +#================================================= +# PHP-FPM CONFIGURATION +#================================================= +ynh_script_progression --message="Configuring PHP-FPM..." --weight=3 + +# Create a dedicated PHP-FPM config +ynh_add_fpm_config --usage=low --footprint=low + #================================================= # NGINX CONFIGURATION #================================================= @@ -96,13 +103,7 @@ ynh_script_progression --message="Configuring NGINX web server..." --weight=2 ynh_add_nginx_config #================================================= -# PHP-FPM CONFIGURATION -#================================================= -ynh_script_progression --message="Configuring PHP-FPM..." --weight=3 - -# Create a dedicated PHP-FPM config -ynh_add_fpm_config --usage=low --footprint=low - +# SPECIFIC SETUP #================================================= # SETUP A CRON #================================================= @@ -117,9 +118,11 @@ chmod 644 "/etc/cron.d/$app" #================================================= ynh_script_progression --message="Configuring permissions..." --weight=1 -# Make app public if necessary or protect it +# Make app public if necessary 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" fi @@ -142,8 +145,8 @@ Please open your $app domain: https://$domain$path_url Complete the registration process from the setup page displayed. Details for MySQL database to be enterted while registration process: -Database login: $app -Database name: $app +Database login: $db_user +Database name: $db_name Database password: $db_pwd If you are facing any problem or want to improve this app, please open a new issue here: https://github.com/YunoHost-Apps/matomo_ynh/issues" diff --git a/scripts/remove b/scripts/remove index f37ed10..0269a3d 100755 --- a/scripts/remove +++ b/scripts/remove @@ -34,7 +34,7 @@ ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name #================================================= # REMOVE APP MAIN DIR #================================================= -ynh_script_progression --message="Removing Matomo main directory..." --weight=2 +ynh_script_progression --message="Removing app main directory..." --weight=2 # Remove the app directory securely ynh_secure_remove --file="$final_path" @@ -66,9 +66,9 @@ ynh_remove_app_dependencies #================================================= # SPECIFIC REMOVE #================================================= -# REMOVE THE CRON FILE +# REMOVE VARIOUS FILES #================================================= -ynh_script_progression --message="Removing the cron file..." --weight=1 +ynh_script_progression --message="Removing various files..." --weight=1 # Remove a cron file ynh_secure_remove --file="/etc/cron.d/$app" diff --git a/scripts/restore b/scripts/restore index e5fb27d..0856a95 100755 --- a/scripts/restore +++ b/scripts/restore @@ -6,7 +6,7 @@ # IMPORT GENERIC HELPERS #================================================= -#Keep this path for calling _common.sh inside the execution's context of backup and restore scripts +# 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 @@ -20,7 +20,7 @@ ynh_abort_if_errors #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading settings..." --weight=1 +ynh_script_progression --message="Loading installation settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME @@ -29,8 +29,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 -phpversion=$YNH_PHP_VERSION - +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) @@ -39,17 +38,11 @@ fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) #================================================= ynh_script_progression --message="Validating restoration parameters..." --weight=1 -test ! -d $final_path || ynh_die --message="There is already a directory: $final_path " +test ! -d $final_path \ + || ynh_die --message="There is already a directory: $final_path " #================================================= # STANDARD RESTORATION STEPS -#================================================= -# 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" - #================================================= # RECREATE THE DEDICATED USER #================================================= @@ -61,7 +54,7 @@ ynh_system_user_create --username=$app --home_dir="$final_path" #================================================= # RESTORE THE APP MAIN DIR #================================================= -ynh_script_progression --message="Restoring Matomo main directory..." --weight=3 +ynh_script_progression --message="Restoring the app main directory..." --weight=3 ynh_restore_file --origin_path="$final_path" @@ -80,13 +73,20 @@ ynh_install_app_dependencies $pkg_dependencies #================================================= # RESTORE THE PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Restoring PHP-FPM configuration..." --weight=2 +ynh_script_progression --message="Restoring the PHP-FPM configuration..." --weight=2 # Restore the file first, so it can have a backup if different ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" # Recreate a dedicated PHP-FPM config -ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --phpversion=$phpversion +ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint + +#================================================= +# 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 MYSQL DATABASE @@ -98,9 +98,9 @@ ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd ynh_mysql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./db.sql #================================================= -# RESTORE THE CRON FILE +# RESTORE VARIOUS FILES #================================================= -ynh_script_progression --message="Restoring the cron file..." --weight=1 +ynh_script_progression --message="Restoring various files..." --weight=1 ynh_restore_file --origin_path="/etc/cron.d/$app" chown root: "/etc/cron.d/$app" diff --git a/scripts/upgrade b/scripts/upgrade index b39aceb..89fa25c 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -18,30 +18,30 @@ app=$YNH_APP_INSTANCE_NAME domain=$(ynh_app_setting_get --app=$app --key=domain) path_url=$(ynh_app_setting_get --app=$app --key=path) +admin=$(ynh_app_setting_get --app=$app --key=admin) final_path=$(ynh_app_setting_get --app=$app --key=final_path) db_name=$(ynh_app_setting_get --app=$app --key=db_name) -phpversion=$YNH_PHP_VERSION -admin=$YNH_APP_ARG_ADMIN -email=$(ynh_user_get_info --username=$admin --key=mail) - fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) +email=$(ynh_user_get_info --username=$admin --key=mail) + #================================================= # CHECK VERSION #================================================= +ynh_script_progression --message="Checking version..." upgrade_type=$(ynh_check_app_version_changed) #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= -ynh_script_progression --message="Backing up Matomo before upgrading (may take a while)..." --weight=3 +ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --weight=3 # Backup the current version of the app ynh_backup_before_upgrade ynh_clean_setup () { - # restore it if the upgrade fails + # Restore it if the upgrade fails ynh_restore_upgradebackup } # Exit if an error occurs during the execution of the script @@ -52,6 +52,13 @@ ynh_abort_if_errors #================================================= 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 + # If db_name doesn't exist, create it if [ -z "$db_name" ]; then db_name=$(ynh_sanitize_dbid --db_name=$app) @@ -81,13 +88,6 @@ if [ -z "$fpm_usage" ]; then ynh_app_setting_set --app=$app --key=fpm_usage --value=$fpm_usage 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 - #================================================= # CREATE DEDICATED USER #================================================= @@ -96,16 +96,6 @@ ynh_script_progression --message="Making sure dedicated system user exists..." - # Create a dedicated user (if not existing) ynh_system_user_create --username=$app --home_dir="$final_path" -#================================================= -# STANDARD UPGRADE STEPS -#================================================= -#================================================= -# UPGRADE DEPENDENCIES -#================================================= -ynh_script_progression --message="Upgrading dependencies..." --weight=1 - -ynh_install_app_dependencies $pkg_dependencies - #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= @@ -132,6 +122,21 @@ chmod 750 "$final_path" chmod -R o-rwx "$final_path" chown -R $app:www-data "$final_path" +#================================================= +# UPGRADE DEPENDENCIES +#================================================= +ynh_script_progression --message="Upgrading dependencies..." --weight=1 + +ynh_install_app_dependencies $pkg_dependencies + +#================================================= +# PHP-FPM CONFIGURATION +#================================================= +ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=2 + +# Create a dedicated PHP-FPM config +ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint + #================================================= # NGINX CONFIGURATION #================================================= @@ -141,13 +146,7 @@ ynh_script_progression --message="Upgrading NGINX web server configuration..." - ynh_add_nginx_config #================================================= -# PHP-FPM CONFIGURATION -#================================================= -ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=2 - -# Create a dedicated PHP-FPM config -ynh_add_fpm_config --phpversion=$phpversion --usage=$fpm_usage --footprint=$fpm_footprint - +# SPECIFIC UPGRADE #================================================= # SETUP A CRON #================================================= @@ -157,6 +156,8 @@ ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" chown root: "/etc/cron.d/$app" chmod 644 "/etc/cron.d/$app" +#================================================= +# GENERIC FINALIZATION #================================================= # RELOAD NGINX #================================================= From c4154ee15d7acf4dbdf6fb5140d9c720dc6b42d8 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sat, 18 Jun 2022 16:16:39 +0000 Subject: [PATCH 150/150] 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 f102c28..a1e016f 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Matomo is a full-featured PHP MySQL software program that you download and insta Matomo aims to be a Free software alternative to Google Analytics and is already used on more than 1,400,000 websites. Privacy is built-in! -**Shipped version:** 4.10.1~ynh1 +**Shipped version:** 4.10.1~ynh2 **Demo:** https://demo.matomo.org diff --git a/README_fr.md b/README_fr.md index b1e11bf..560dc28 100644 --- a/README_fr.md +++ b/README_fr.md @@ -22,7 +22,7 @@ Matomo is a full-featured PHP MySQL software program that you download and insta Matomo aims to be a Free software alternative to Google Analytics and is already used on more than 1,400,000 websites. Privacy is built-in! -**Version incluse :** 4.10.1~ynh1 +**Version incluse :** 4.10.1~ynh2 **Démo :** https://demo.matomo.org