From c3d0058d3d2705ff1ddbec64c04f94dcda9a3d5d Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Wed, 17 Jan 2024 12:41:51 +0100 Subject: [PATCH 01/81] init v_2 --- weblate_v2.zip | Bin 0 -> 122562 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 weblate_v2.zip diff --git a/weblate_v2.zip b/weblate_v2.zip new file mode 100644 index 0000000000000000000000000000000000000000..c78a46a5c8b33589826b79a80438b3425a95bf6a GIT binary patch literal 122562 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 R683xnVQ-;TiCle(+gReEC0VGorB%~?+=J} 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 z≥oMYb2&g%|HY2PgH@+{Gfrt4Acz_c~hlJImN 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 Date: Wed, 17 Jan 2024 14:13:59 +0100 Subject: [PATCH 03/81] Rename doc/DISCLAIMER.md to ADMIN.md --- doc/DISCLAIMER.md => ADMIN.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename doc/DISCLAIMER.md => ADMIN.md (100%) diff --git a/doc/DISCLAIMER.md b/ADMIN.md similarity index 100% rename from doc/DISCLAIMER.md rename to ADMIN.md From bc1199420a0f346b8e178616e1ff59aaa9c45d59 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Wed, 17 Jan 2024 14:14:26 +0100 Subject: [PATCH 04/81] Rename doc/DISCLAIMER_fr.md to ADMIN_fr.md --- doc/DISCLAIMER_fr.md => ADMIN_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename doc/DISCLAIMER_fr.md => ADMIN_fr.md (99%) diff --git a/doc/DISCLAIMER_fr.md b/ADMIN_fr.md similarity index 99% rename from doc/DISCLAIMER_fr.md rename to ADMIN_fr.md index ffab432..3890ac4 100644 --- a/doc/DISCLAIMER_fr.md +++ b/ADMIN_fr.md @@ -14,4 +14,4 @@ Vous pouvez éditer le fichier `$final_path/local_settings.py` pour activer ou d ## Connexion LDAP -Cela ne fonctionne pas encore, mais bien que [cela semble faisable](https://docs.weblate.org/en/latest/admin/auth.html?highlight=LDAP#ldap-authentication), je ne suis pas sûr que ce soit le cas une bonne idée de connecter ce genre d'outils à votre LDAP. \ No newline at end of file +Cela ne fonctionne pas encore, mais bien que [cela semble faisable](https://docs.weblate.org/en/latest/admin/auth.html?highlight=LDAP#ldap-authentication), je ne suis pas sûr que ce soit le cas une bonne idée de connecter ce genre d'outils à votre LDAP. From b0721359ba7e444ec46ee6424e68b328d9172616 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Wed, 17 Jan 2024 19:12:51 +0100 Subject: [PATCH 05/81] try install/remove --- manifest.toml | 18 ++++++++- scripts/_common.sh | 72 ------------------------------------ scripts/install | 92 ++-------------------------------------------- scripts/remove | 46 ----------------------- 4 files changed, 20 insertions(+), 208 deletions(-) diff --git a/manifest.toml b/manifest.toml index 9b46c0a..41ad2cb 100644 --- a/manifest.toml +++ b/manifest.toml @@ -72,6 +72,14 @@ ram.runtime = "3G" optional = true [resources] + + [resources.sources] + [resources.sources.libxxhash] + url = "https://github.com/Cyan4973/xxHash/archive/refs/tags/v0.8.1.tar.gz" + sha256 = "3bb6b7d6f30c591dd65aaaff1c8b7a5b94d81687998ca9400082c739a690436c" + in_subdir = true + autoupdate.strategy = "latest_github_tag" + [resources.system_user] [resources.install_dir] @@ -80,7 +88,15 @@ ram.runtime = "3G" main.url = "/" [resources.apt] - packages = "libxml2-dev, libxslt-dev, libfreetype6-dev, libjpeg-dev, libz-dev, libyaml-dev, libacl1-dev, libacl1, libssl-dev, liblz4-dev, libzstd-dev, libxxhash-dev" + #first § = weblate dependecies, second § = borgbackup dependencies + packages = "libxml2-dev, libxslt-dev, libfreetype6-dev, libjpeg-dev, libz-dev, libyaml-dev \ + libffi-dev, libcairo-dev, gir1.2-pango-1.0, libgirepository1.0-dev \ + libacl1-dev, libssl-dev, libpq-dev, libjpeg62-turbo-dev, build-essential \ + python3-gdbm, python3-dev, python3-pip, python3-virtualenv, virtualenv, git \ + uwsgi, uwsgi-plugin-python3, redis-server, postgresql, postgresql-contrib, hub + + libacl1-dev, libacl1, libssl-dev, liblz4-dev, libzstd-dev, libxxhash-dev \ + build-essential, pkg-config, python3-pkgconfig" [resources.database] type = "postgresql" diff --git a/scripts/_common.sh b/scripts/_common.sh index 47f84c9..9b485c5 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -4,17 +4,6 @@ # COMMON VARIABLES #================================================= -# dependencies used by the app -#REMOVEME? weblate_dependencies="libxml2-dev libxslt-dev libfreetype6-dev libjpeg-dev libz-dev libyaml-dev \ - libffi-dev libcairo-dev gir1.2-pango-1.0 libgirepository1.0-dev \ - libacl1-dev libssl-dev libpq-dev libjpeg62-turbo-dev build-essential \ - python3-gdbm python3-dev python3-pip python3-virtualenv virtualenv git \ - uwsgi uwsgi-plugin-python3 redis-server postgresql postgresql-contrib hub" - -# because weblate install borgbackup -#REMOVEME? borgbackup_dependencies="libacl1-dev libacl1 libssl-dev liblz4-dev libzstd-dev libxxhash-dev \ - build-essential pkg-config python3-pkgconfig" - #REMOVEME? pkg_dependencies="$weblate_dependencies $borgbackup_dependencies" debian_maj_version=$(sed 's/\..*//' /etc/debian_version) @@ -49,67 +38,6 @@ set_forge_variables() { # EXPERIMENTAL HELPERS #================================================= -# Send an email to inform the administrator -# -# usage: ynh_send_readme_to_admin app_message [recipients] -# | arg: app_message - The message to send to the administrator. -# | arg: recipients - The recipients of this email. Use spaces to separate multiples recipients. - default: root -# example: "root admin@domain" -# If you give the name of a YunoHost user, ynh_send_readme_to_admin will find its email adress for you -# example: "root admin@domain user1 user2" -ynh_send_readme_to_admin() { - local app_message="${1:-...No specific information...}" - local recipients="${2:-root}" - - # Retrieve the email of users - find_mails () { - local list_mails="$1" - local mail - local recipients=" " - # Read each mail in argument - for mail in $list_mails - do - # Keep root or a real email address as it is - if [ "$mail" = "root" ] || echo "$mail" | grep --quiet "@" - then - recipients="$recipients $mail" - else - # But replace an user name without a domain after by its email - if mail=$(ynh_user_get_info "$mail" "mail" 2> /dev/null) - then - recipients="$recipients $mail" - fi - fi - done - echo "$recipients" - } - recipients=$(find_mails "$recipients") - - local mail_subject="☁️🆈🅽🅷☁️: \`$app\` was just installed!" - - local mail_message="This is an automated message from your beloved YunoHost server. - -Specific information for the application $app. - -$app_message - ---- -Automatic diagnosis data from YunoHost - -$(yunohost tools diagnosis | grep -B 100 "services:" | sed '/services:/d')" - - # Define binary to use for mail command - if [ -e /usr/bin/bsd-mailx ] - then - local mail_bin=/usr/bin/bsd-mailx - else - local mail_bin=/usr/bin/mail.mailutils - fi - - # Send the email to the recipients - echo "$mail_message" | $mail_bin -a "Content-Type: text/plain; charset=UTF-8" -s "$mail_subject" "$recipients" -} - #================================================= # # Redis HELPERS diff --git a/scripts/install b/scripts/install index 2e9d9ce..b2f7939 100755 --- a/scripts/install +++ b/scripts/install @@ -9,53 +9,18 @@ source _common.sh source /usr/share/yunohost/helpers -#================================================= -# MANAGE SCRIPT FAILURE -#================================================= - -#REMOVEME? ynh_clean_setup () { - ynh_clean_check_starting -} -# Exit if an error occurs during the execution of the script -#REMOVEME? ynh_abort_if_errors - #================================================= # RETRIEVE ARGUMENTS FROM THE MANIFEST #================================================= -#REMOVEME? domain=$YNH_APP_ARG_DOMAIN -#REMOVEME? path=$YNH_APP_ARG_PATH -#REMOVEME? is_public=$YNH_APP_ARG_IS_PUBLIC -#REMOVEME? admin=$YNH_APP_ARG_ADMIN -#REMOVEME? password=$YNH_APP_ARG_PASSWORD -#REMOVEME? used_forge=$YNH_APP_ARG_USED_FORGE -#REMOVEME? forge_username=$YNH_APP_ARG_FORGE_USERNAME -#REMOVEME? forge_token=$YNH_APP_ARG_FORGE_TOKEN - -#REMOVEME? app=$YNH_APP_INSTANCE_NAME - admin_mail=$(ynh_user_get_info --username="$admin" --key=mail) key=$(ynh_string_random --length=50) -#================================================= -# CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS -#================================================= -#REMOVEME? ynh_script_progression --message="Validating installation parameters..." --weight=1 - -#REMOVEME? install_dir=/var/www/$app -#REMOVEME? test ! -e "$install_dir" || ynh_die --message="This path already contains a folder" - -# Register (book) web path -#REMOVEME? ynh_webpath_register --app=$app --domain=$domain --path=$path - #================================================= # STORE SETTINGS FROM MANIFEST #================================================= -#REMOVEME? ynh_script_progression --message="Storing installation settings..." --weight=1 +ynh_script_progression --message="Storing installation settings..." --weight=1 -#REMOVEME? ynh_app_setting_set --app=$app --key=domain --value=$domain -#REMOVEME? ynh_app_setting_set --app=$app --key=path --value=$path -#REMOVEME? ynh_app_setting_set --app=$app --key=admin --value=$admin ynh_app_setting_set --app=$app --key=used_forge --value=$used_forge ynh_app_setting_set --app=$app --key=forge_username --value=$forge_username ynh_app_setting_set --app=$app --key=forge_token --value=$forge_token @@ -63,40 +28,19 @@ ynh_app_setting_set --app=$app --key=forge_token --value=$forge_token #================================================= # STANDARD MODIFICATIONS #================================================= -# INSTALL DEPENDENCIES -#================================================= -#REMOVEME? ynh_script_progression --message="Installing dependencies..." --weight=40 - -#REMOVEME? ynh_exec_warn_less ynh_install_app_dependencies $pkg_dependencies - -#================================================= -# CREATE DEDICATED USER -#================================================= -#REMOVEME? ynh_script_progression --message="Configuring system user..." --weight=1 - -# Create a system user -#REMOVEME? ynh_system_user_create --username=$app --home_dir="$install_dir" --use_shell #================================================= # CREATE A POSTGRESQL DATABASE #================================================= -#REMOVEME? ynh_script_progression --message="Creating a PostgreSQL database..." --weight=2 +REMOVEME? ynh_script_progression --message="Creating a PostgreSQL database..." --weight=2 -#REMOVEME? db_name=$(ynh_sanitize_dbid --db_name=$app) -#REMOVEME? db_user=$db_name -#REMOVEME? ynh_app_setting_set --app=$app --key=db_name --value=$db_name -#REMOVEME? ynh_psql_test_if_first_run -#REMOVEME? ynh_psql_setup_db --db_user=$db_user --db_name=$db_name ynh_psql_execute_as_root --sql="CREATE EXTENSION IF NOT EXISTS pg_trgm;" --database=$db_name -#REMOVEME? db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= ynh_script_progression --message="Setting up source files..." -#REMOVEME? ynh_app_setting_set --app=$app --key=install_dir --value=$install_dir -mkdir -p "$install_dir" mkdir -p "$install_dir/avatar-cache" mkdir -p "$install_dir/data" @@ -165,6 +109,7 @@ chown -R $app: "$install_dir" sudo --user=$app BORG_OPENSSL_PREFIX=/usr/lib/x86_64-linux-gnu/ $install_dir/venv/bin/pip install Weblate=="$(ynh_app_upstream_version)" sudo --user=$app $install_dir/venv/bin/pip install psycopg2-binary ruamel.yaml aeidon phply #pip install pytz python-bidi PyYaML Babel pyuca pylibravatar py3dns psycopg2-binary phply django-redis hiredis aeidon ruamel.yaml + # specific to YunoHost package: sudo --user=$app $install_dir/venv/bin/pip install django_sendmail_backend ) @@ -256,37 +201,6 @@ ynh_script_progression --message="Starting a systemd service..." --weight=5 ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/weblate.log" --line_match="spawned uWSGI" ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery-celery.log" --line_match="mingle: all alone" -#================================================= -# SETUP SSOWAT -#================================================= -#REMOVEME? ynh_script_progression --message="Configuring permissions..." --weight=1 - -# Make app public if necessary -#REMOVEME? if [ $is_public -eq 1 ] -then - # Everyone can access the app. - # The "main" permission is automatically created before the install script. -#REMOVEME? ynh_permission_update --permission="main" --add="visitors" -fi - -#================================================= -# RELOAD NGINX -#================================================= -#REMOVEME? ynh_script_progression --message="Reloading NGINX web server..." --weight=1 - -ynh_systemd_action --service_name="nginx" --action="reload" - -#================================================= -# SEND A README FOR THE ADMIN -#================================================= - -message=" -Weblate settings file : $settings -If you facing an issue or want to improve this app, please open a new issue in this project: https://github.com/YunoHost-Apps/weblate_ynh -" - -ynh_send_readme_to_admin "$message" "$admin" - #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/remove b/scripts/remove index b899e7f..f6d4bd6 100755 --- a/scripts/remove +++ b/scripts/remove @@ -9,18 +9,6 @@ source _common.sh source /usr/share/yunohost/helpers -#================================================= -# LOAD SETTINGS -#================================================= -#REMOVEME? ynh_script_progression --message="Loading installation settings..." --weight=1 - -#REMOVEME? app=$YNH_APP_INSTANCE_NAME - -#REMOVEME? domain=$(ynh_app_setting_get --app=$app --key=domain) -#REMOVEME? db_name=$(ynh_app_setting_get --app=$app --key=db_name) -#REMOVEME? db_user=$db_name -#REMOVEME? #REMOVEME? install_dir=$(ynh_app_setting_get --app=$app --key=install_dir) - #================================================= # STANDARD REMOVE #================================================= @@ -58,22 +46,6 @@ ynh_script_progression --message="Removing logrotate configuration..." --weight= # Remove the app-specific logrotate config ynh_remove_logrotate -#================================================= -# REMOVE THE POSTGRESQL DATABASE -#================================================= -#REMOVEME? ynh_script_progression --message="Removing the PostgreSQL database..." --weight=1 - -# Remove a database if it exists, along with the associated user -#REMOVEME? ynh_psql_remove_db --db_user=$db_user --db_name=$db_name - -#================================================= -# REMOVE APP MAIN DIR -#================================================= -#REMOVEME? ynh_script_progression --message="Removing app main directory..." --weight=2 - -# Remove the app directory securely -#REMOVEME? ynh_secure_remove --file="$install_dir" - #================================================= # REMOVE NGINX CONFIGURATION #================================================= @@ -82,14 +54,6 @@ ynh_script_progression --message="Removing NGINX web server configuration..." -- # Remove the dedicated NGINX config ynh_remove_nginx_config -#================================================= -# REMOVE DEPENDENCIES -#================================================= -#REMOVEME? ynh_script_progression --message="Removing dependencies..." --weight=10 - -# Remove metapackage and its dependencies -#REMOVEME? ynh_exec_warn_less ynh_remove_app_dependencies - #================================================= # REMOVE XXHASH #================================================= @@ -116,16 +80,6 @@ ynh_secure_remove --file="/var/run/$app-celery" ynh_redis_remove_db -#================================================= -# GENERIC FINALIZATION -#================================================= -# REMOVE DEDICATED USER -#================================================= -#REMOVEME? ynh_script_progression --message="Removing the dedicated system user..." --weight=1 - -# Delete a system user -#REMOVEME? ynh_system_user_delete --username=$app - #================================================= # END OF SCRIPT #================================================= From 3a205497ca7ec856cfd6736fad36ceaf9e739f5a Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Wed, 17 Jan 2024 19:16:48 +0100 Subject: [PATCH 06/81] fix syntax issue? --- manifest.toml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/manifest.toml b/manifest.toml index 41ad2cb..f714c6d 100644 --- a/manifest.toml +++ b/manifest.toml @@ -89,13 +89,13 @@ ram.runtime = "3G" [resources.apt] #first § = weblate dependecies, second § = borgbackup dependencies - packages = "libxml2-dev, libxslt-dev, libfreetype6-dev, libjpeg-dev, libz-dev, libyaml-dev \ - libffi-dev, libcairo-dev, gir1.2-pango-1.0, libgirepository1.0-dev \ - libacl1-dev, libssl-dev, libpq-dev, libjpeg62-turbo-dev, build-essential \ - python3-gdbm, python3-dev, python3-pip, python3-virtualenv, virtualenv, git \ - uwsgi, uwsgi-plugin-python3, redis-server, postgresql, postgresql-contrib, hub + packages = "libxml2-dev, libxslt-dev, libfreetype6-dev, libjpeg-dev, libz-dev, libyaml-dev, + libffi-dev, libcairo-dev, gir1.2-pango-1.0, libgirepository1.0-dev, + libacl1-dev, libssl-dev, libpq-dev, libjpeg62-turbo-dev, build-essential, + python3-gdbm, python3-dev, python3-pip, python3-virtualenv, virtualenv, git, + uwsgi, uwsgi-plugin-python3, redis-server, postgresql, postgresql-contrib, hub, - libacl1-dev, libacl1, libssl-dev, liblz4-dev, libzstd-dev, libxxhash-dev \ + libacl1-dev, libacl1, libssl-dev, liblz4-dev, libzstd-dev, libxxhash-dev, build-essential, pkg-config, python3-pkgconfig" [resources.database] From 5ee42b1c703e06331bad150ebcf805c9eee53c0c Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Wed, 17 Jan 2024 19:23:40 +0100 Subject: [PATCH 07/81] fix syntax --- manifest.toml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/manifest.toml b/manifest.toml index f714c6d..d23015b 100644 --- a/manifest.toml +++ b/manifest.toml @@ -89,14 +89,9 @@ ram.runtime = "3G" [resources.apt] #first § = weblate dependecies, second § = borgbackup dependencies - packages = "libxml2-dev, libxslt-dev, libfreetype6-dev, libjpeg-dev, libz-dev, libyaml-dev, - libffi-dev, libcairo-dev, gir1.2-pango-1.0, libgirepository1.0-dev, - libacl1-dev, libssl-dev, libpq-dev, libjpeg62-turbo-dev, build-essential, - python3-gdbm, python3-dev, python3-pip, python3-virtualenv, virtualenv, git, - uwsgi, uwsgi-plugin-python3, redis-server, postgresql, postgresql-contrib, hub, + packages = "libxml2-dev, libxslt-dev, libfreetype6-dev, libjpeg-dev, libz-dev, libyaml-dev, libffi-dev, libcairo-dev, gir1.2-pango-1.0, libgirepository1.0-dev, libacl1-dev, libssl-dev, libpq-dev, libjpeg62-turbo-dev, build-essential, python3-gdbm, python3-dev, python3-pip, python3-virtualenv, virtualenv, git, uwsgi, uwsgi-plugin-python3, redis-server, postgresql, postgresql-contrib, hub" - libacl1-dev, libacl1, libssl-dev, liblz4-dev, libzstd-dev, libxxhash-dev, - build-essential, pkg-config, python3-pkgconfig" + #libacl1-dev, libacl1, libssl-dev, liblz4-dev, libzstd-dev, libxxhash-dev, build-essential, pkg-config, python3-pkgconfig" [resources.database] type = "postgresql" From 686fc7901a4ba3298d7b3d1c8fb8c180d7aa44da Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Wed, 17 Jan 2024 19:48:00 +0100 Subject: [PATCH 08/81] fix a forgotten REMOVEME --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index b2f7939..ae5bc85 100755 --- a/scripts/install +++ b/scripts/install @@ -32,7 +32,7 @@ ynh_app_setting_set --app=$app --key=forge_token --value=$forge_token #================================================= # CREATE A POSTGRESQL DATABASE #================================================= -REMOVEME? ynh_script_progression --message="Creating a PostgreSQL database..." --weight=2 +ynh_script_progression --message="Creating a PostgreSQL database..." --weight=2 ynh_psql_execute_as_root --sql="CREATE EXTENSION IF NOT EXISTS pg_trgm;" --database=$db_name From d38ec441b2ccdbe076afc514e86a258ec47da7c8 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Wed, 17 Jan 2024 20:13:18 +0100 Subject: [PATCH 09/81] Update weblate --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index d23015b..4feeba2 100644 --- a/manifest.toml +++ b/manifest.toml @@ -7,7 +7,7 @@ name = "Weblate" description.en = "Translation platform using Git and Python" description.fr = "Plateforme de traduction utilisant Git et Python" -version = "4.18.2~ynh1" +version = "5.3.1~ynh1" maintainers = ["YunoHost Contributors"] From 0ecd94a39c9b49e586dcf8395c694d233ee01a74 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Wed, 17 Jan 2024 21:13:22 +0100 Subject: [PATCH 10/81] update settings.py --- conf/settings.py | 150 +++++++++++++---------------------------------- 1 file changed, 42 insertions(+), 108 deletions(-) diff --git a/conf/settings.py b/conf/settings.py index 2f79bc6..52c55cc 100644 --- a/conf/settings.py +++ b/conf/settings.py @@ -70,7 +70,8 @@ DATABASES = { # "connect_timeout": 28800, }, # Persistent connections - "CONN_MAX_AGE": 0, + "CONN_MAX_AGE": None, + "CONN_HEALTH_CHECKS": True, # Disable server-side cursors, might be needed with pgbouncer "DISABLE_SERVER_SIDE_CURSORS": False, } @@ -78,7 +79,7 @@ DATABASES = { # Data directory, you can use following for the development purposes: # os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "data") -DATA_DIR = os.path.join("__INSTALL_DIR__", "data") +DATA_DIR = "__INSTALL_DIR/" CACHE_DIR = f"{DATA_DIR}/cache" # Local time zone for this installation. Choices can be found here: @@ -95,11 +96,12 @@ LANGUAGES = ( ("ar", "العربية"), ("az", "Azərbaycan"), ("be", "Беларуская"), - ("be@latin", "Biełaruskaja"), + ("be-latn", "Biełaruskaja"), ("bg", "Български"), ("br", "Brezhoneg"), ("ca", "Català"), ("cs", "Čeština"), + ("cy", "Cymraeg"), ("da", "Dansk"), ("de", "Deutsch"), ("en", "English"), @@ -145,10 +147,6 @@ SITE_ID = 1 # to load the internationalization machinery. USE_I18N = True -# If you set this to False, Django will not format dates, numbers and -# calendars according to the current locale. -USE_L10N = True - # If you set this to False, Django will not use timezone-aware datetimes. USE_TZ = True @@ -220,6 +218,10 @@ GITHUB_CREDENTIALS = { } } +# Azure DevOps username and token for sending pull requests. +# Please see the documentation for more details. +AZURE_DEVOPS_CREDENTIALS = {} + # GitLab username and token for sending merge requests. # Please see the documentation for more details. GITLAB_CREDENTIALS = { @@ -238,6 +240,7 @@ AUTHENTICATION_BACKENDS = ( "social_core.backends.email.EmailAuth", # "social_core.backends.google.GoogleOAuth2", # "social_core.backends.github.GithubOAuth2", + # "social_core.backends.github_enterprise.GithubEnterpriseOAuth2", # "social_core.backends.bitbucket.BitbucketOAuth2", # "social_core.backends.suse.OpenSUSEOpenId", # "social_core.backends.ubuntu.UbuntuOpenId", @@ -262,6 +265,12 @@ SOCIAL_AUTH_GITHUB_TEAM_KEY = "" SOCIAL_AUTH_GITHUB_TEAM_SECRET = "" SOCIAL_AUTH_GITHUB_TEAM_ID = "" +SOCIAL_AUTH_GITHUB_ENTERPRISE_KEY = "" +SOCIAL_AUTH_GITHUB_ENTERPRISE_SECRET = "" +SOCIAL_AUTH_GITHUB_ENTERPRISE_URL = "" +SOCIAL_AUTH_GITHUB_ENTERPRISE_API_URL = "" +SOCIAL_AUTH_GITHUB_ENTERPRISE_SCOPE = "" + SOCIAL_AUTH_BITBUCKET_OAUTH2_KEY = "" SOCIAL_AUTH_BITBUCKET_OAUTH2_SECRET = "" SOCIAL_AUTH_BITBUCKET_OAUTH2_VERIFIED_EMAILS_ONLY = True @@ -298,6 +307,7 @@ SOCIAL_AUTH_PIPELINE = ( "weblate.accounts.pipeline.user_full_name", "weblate.accounts.pipeline.store_email", "weblate.accounts.pipeline.notify_connect", + "weblate.accounts.pipeline.handle_invite", "weblate.accounts.pipeline.password_reset", ) SOCIAL_AUTH_DISCONNECT_PIPELINE = ( @@ -329,7 +339,7 @@ SOCIAL_AUTH_SLUGIFY_FUNCTION = "weblate.accounts.pipeline.slugify_username" # Password validation configuration AUTH_PASSWORD_VALIDATORS = [ { - "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator" # noqa: E501, pylint: disable=line-too-long + "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator" }, { "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", @@ -443,8 +453,11 @@ HAVE_SYSLOG = False if platform.system() != "Windows": try: handler = SysLogHandler(address="/dev/log", facility=SysLogHandler.LOG_LOCAL2) + # Since Python 3.7 connect failures are silently discarded, so + # the exception is almost never raised here. Instead we look whether the socket + # to syslog is open after init. + HAVE_SYSLOG = handler.socket.fileno() != -1 handler.close() - HAVE_SYSLOG = True except OSError: HAVE_SYSLOG = False @@ -519,6 +532,7 @@ LOGGING = { # "handlers": [DEFAULT_LOG], # "level": "DEBUG", # }, + "redis_lock": {"handlers": [DEFAULT_LOG], "level": DEFAULT_LOGLEVEL}, "weblate": {"handlers": [DEFAULT_LOG], "level": DEFAULT_LOGLEVEL}, # Logging VCS operations "weblate.vcs": {"handlers": [DEFAULT_LOG], "level": DEFAULT_LOGLEVEL}, @@ -535,89 +549,6 @@ LOGGING = { if not HAVE_SYSLOG: del LOGGING["handlers"]["syslog"] -# List of machine translations -MT_SERVICES = ( - # "weblate.machinery.apertium.ApertiumAPYTranslation", - # "weblate.machinery.baidu.BaiduTranslation", - # "weblate.machinery.deepl.DeepLTranslation", - # "weblate.machinery.glosbe.GlosbeTranslation", - # "weblate.machinery.google.GoogleTranslation", - # "weblate.machinery.googlev3.GoogleV3Translation", - # "weblate.machinery.libretranslate.LibreTranslateTranslation", - # "weblate.machinery.microsoft.MicrosoftCognitiveTranslation", - # "weblate.machinery.microsoftterminology.MicrosoftTerminologyService", - # "weblate.machinery.modernmt.ModernMTTranslation", - # "weblate.machinery.mymemory.MyMemoryTranslation", - # "weblate.machinery.netease.NeteaseSightTranslation", - # "weblate.machinery.tmserver.AmagamaTranslation", - # "weblate.machinery.tmserver.TMServerTranslation", - # "weblate.machinery.yandex.YandexTranslation", - # "weblate.machinery.saptranslationhub.SAPTranslationHub", - # "weblate.machinery.youdao.YoudaoTranslation", - "weblate.machinery.weblatetm.WeblateTranslation", - "weblate.memory.machine.WeblateMemory", -) - -# Machine translation API keys - -# URL of the Apertium APy server -MT_APERTIUM_APY = None - -# DeepL API key -MT_DEEPL_KEY = None - -# LibreTranslate -MT_LIBRETRANSLATE_API_URL = None -MT_LIBRETRANSLATE_KEY = None - -# Microsoft Cognitive Services Translator API, register at -# https://portal.azure.com/ -MT_MICROSOFT_COGNITIVE_KEY = None -MT_MICROSOFT_REGION = None - -# ModernMT -MT_MODERNMT_KEY = None - -# MyMemory identification email, see -# https://mymemory.translated.net/doc/spec.php -MT_MYMEMORY_EMAIL = None - -# Optional MyMemory credentials to access private translation memory -MT_MYMEMORY_USER = None -MT_MYMEMORY_KEY = None - -# Google API key for Google Translate API v2 -MT_GOOGLE_KEY = None - -# Google Translate API3 credentials and project id -MT_GOOGLE_CREDENTIALS = None -MT_GOOGLE_PROJECT = None - -# Baidu app key and secret -MT_BAIDU_ID = None -MT_BAIDU_SECRET = None - -# Youdao Zhiyun app key and secret -MT_YOUDAO_ID = None -MT_YOUDAO_SECRET = None - -# Netease Sight (Jianwai) app key and secret -MT_NETEASE_KEY = None -MT_NETEASE_SECRET = None - -# API key for Yandex Translate API -MT_YANDEX_KEY = None - -# tmserver URL -MT_TMSERVER = None - -# SAP Translation Hub -MT_SAP_BASE_URL = None -MT_SAP_SANDBOX_APIKEY = None -MT_SAP_USERNAME = None -MT_SAP_PASSWORD = None -MT_SAP_USE_MT = True - # Use HTTPS when creating redirect URLs for social authentication, see # documentation for more details: # https://python-social-auth-docs.readthedocs.io/en/latest/configuration/settings.html#processing-redirects-and-urlopen @@ -636,7 +567,7 @@ SESSION_COOKIE_HTTPONLY = True # SSL redirect SECURE_SSL_REDIRECT = ENABLE_HTTPS SECURE_SSL_HOST = SITE_DOMAIN -# Sent referrrer only for same origin links +# Sent referrer only for same origin links SECURE_REFERRER_POLICY = "same-origin" # SSL redirect URL exemption list SECURE_REDIRECT_EXEMPT = (r"healthz/$",) # Allowing HTTP access to health check @@ -683,7 +614,7 @@ ANONYMOUS_USER_NAME = "anonymous" # Reverse proxy settings IP_PROXY_HEADER = "HTTP_X_FORWARDED_FOR" IP_BEHIND_REVERSE_PROXY = False -IP_PROXY_OFFSET = 0 +IP_PROXY_OFFSET = -1 # Sending HTML in mails EMAIL_SEND_HTML = True @@ -728,6 +659,7 @@ CRISPY_TEMPLATE_PACK = "bootstrap3" # "weblate.checks.format.PHPFormatCheck", # "weblate.checks.format.CFormatCheck", # "weblate.checks.format.PerlFormatCheck", +# "weblate.checks.format.PerlBraceFormatCheck", # "weblate.checks.format.JavaScriptFormatCheck", # "weblate.checks.format.LuaFormatCheck", # "weblate.checks.format.ObjectPascalFormatCheck", @@ -748,6 +680,7 @@ CRISPY_TEMPLATE_PACK = "bootstrap3" # "weblate.checks.consistency.PluralsCheck", # "weblate.checks.consistency.SamePluralsCheck", # "weblate.checks.consistency.ConsistencyCheck", +# "weblate.checks.consistency.ReusedCheck", # "weblate.checks.consistency.TranslatedCheck", # "weblate.checks.chars.EscapedNewlineCountingCheck", # "weblate.checks.chars.NewLineCountCheck", @@ -770,6 +703,12 @@ CRISPY_TEMPLATE_PACK = "bootstrap3" # "weblate.checks.source.LongUntranslatedCheck", # "weblate.checks.format.MultipleUnnamedFormatsCheck", # "weblate.checks.glossary.GlossaryCheck", +# "weblate.checks.fluent.syntax.FluentSourceSyntaxCheck", +# "weblate.checks.fluent.syntax.FluentTargetSyntaxCheck", +# "weblate.checks.fluent.parts.FluentPartsCheck", +# "weblate.checks.fluent.references.FluentReferencesCheck", +# "weblate.checks.fluent.inner_html.FluentSourceInnerHTMLCheck", +# "weblate.checks.fluent.inner_html.FluentTargetInnerHTMLCheck", # ) # List of automatic fixups @@ -778,6 +717,8 @@ CRISPY_TEMPLATE_PACK = "bootstrap3" # "weblate.trans.autofixes.chars.ReplaceTrailingDotsWithEllipsis", # "weblate.trans.autofixes.chars.RemoveZeroSpace", # "weblate.trans.autofixes.chars.RemoveControlChars", +# "weblate.trans.autofixes.chars.DevanagariDanda", +# "weblate.trans.autofixes.html.BleachHTML", # ) # List of enabled addons @@ -800,6 +741,7 @@ CRISPY_TEMPLATE_PACK = "bootstrap3" # "weblate.addons.generate.GenerateFileAddon", # "weblate.addons.generate.PseudolocaleAddon", # "weblate.addons.generate.PrefillAddon", +# "weblate.addons.generate.FillReadOnlyAddon", # "weblate.addons.json.JSONCustomizeAddon", # "weblate.addons.xml.XMLCustomizeAddon", # "weblate.addons.properties.PropertiesSortAddon", @@ -812,7 +754,7 @@ CRISPY_TEMPLATE_PACK = "bootstrap3" # ) # E-mail address that error messages come from. -SERVER_EMAIL = "noreply@__DOMAIN__" +SERVER_EMAIL = "__APP__@__DOMAIN__" # Default email address to use for various automated correspondence from # the site managers. Used for registration emails. @@ -824,14 +766,13 @@ ALLOWED_HOSTS = ["__DOMAIN__"] # Configuration for caching CACHES = { "default": { - "BACKEND": "django_redis.cache.RedisCache", + "BACKEND": "redis_lock.django_cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/__REDIS_DB__", # If redis is running on same host as Weblate, you might # want to use unix sockets instead: # "LOCATION": "unix:///var/run/redis/redis.sock?db=1", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", - "PARSER_CLASS": "redis.connection.HiredisParser", # If you set password here, adjust CELERY_BROKER_URL as well "PASSWORD": None, "CONNECTION_POOL_KWARGS": {}, @@ -883,10 +824,8 @@ FONTS_CDN_URL = None # Django compressor offline mode COMPRESS_OFFLINE = False -COMPRESS_OFFLINE_CONTEXT = [ - {"fonts_cdn_url": FONTS_CDN_URL, "STATIC_URL": STATIC_URL, "LANGUAGE_BIDI": True}, - {"fonts_cdn_url": FONTS_CDN_URL, "STATIC_URL": STATIC_URL, "LANGUAGE_BIDI": False}, -] +COMPRESS_OFFLINE_CONTEXT = "weblate.utils.compress.offline_context" +COMPRESS_CSS_HASHING_METHOD = "content" # Require login for all URLs if REQUIRE_LOGIN: @@ -897,7 +836,7 @@ if REQUIRE_LOGIN: # rf"{URL_PREFIX}/accounts/(.*)$", # Required for login # rf"{URL_PREFIX}/admin/login/(.*)$", # Required for admin login # rf"{URL_PREFIX}/static/(.*)$", # Required for development mode -# rf"{URL_PREFIX}/widgets/(.*)$", # Allowing public access to widgets +# rf"{URL_PREFIX}/widget/(.*)$", # Allowing public access to widgets # rf"{URL_PREFIX}/data/(.*)$", # Allowing public access to data exports # rf"{URL_PREFIX}/hooks/(.*)$", # Allowing public access to notification hooks # rf"{URL_PREFIX}/healthz/$", # Allowing public access to health check @@ -957,9 +896,4 @@ MATOMO_URL = None GOOGLE_ANALYTICS_ID = None SENTRY_DSN = None SENTRY_ENVIRONMENT = SITE_DOMAIN -AKISMET_API_KEY = None - -try: - from .local_settings import * -except ImportError: - pass +AKISMET_API_KEY = None \ No newline at end of file From 2457c3a13fe970a1bc0a89acb6f6d8cec46e1d09 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Wed, 17 Jan 2024 21:18:05 +0100 Subject: [PATCH 11/81] fix some linter errors --- manifest.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index 4feeba2..1c1ad28 100644 --- a/manifest.toml +++ b/manifest.toml @@ -24,8 +24,8 @@ cpe = "cpe:2.3:a:weblate:weblate" yunohost = ">= 11.2.0" architectures = "all" multi_instance = true -ldap = "false" -sso = "false" +ldap = false +sso = false disk = "1G" ram.build = "3G" @@ -52,7 +52,7 @@ ram.runtime = "3G" [install.used_forge] ask.en = "Choose the forge you use" ask.fr = "Choisissez la forge que vous utilisez" - type = "string" + type = "select" choices = ["GitHub", "GitLab"] default = "GitHub" optional = true From 9fccd0260bd4ddc7d53524c73b23f7fbb7be9798 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Wed, 17 Jan 2024 21:29:52 +0100 Subject: [PATCH 12/81] fix typo --- conf/settings.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/settings.py b/conf/settings.py index 52c55cc..a10ce50 100644 --- a/conf/settings.py +++ b/conf/settings.py @@ -79,7 +79,7 @@ DATABASES = { # Data directory, you can use following for the development purposes: # os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "data") -DATA_DIR = "__INSTALL_DIR/" +DATA_DIR = "__INSTALL_DIR__/" CACHE_DIR = f"{DATA_DIR}/cache" # Local time zone for this installation. Choices can be found here: @@ -896,4 +896,4 @@ MATOMO_URL = None GOOGLE_ANALYTICS_ID = None SENTRY_DSN = None SENTRY_ENVIRONMENT = SITE_DOMAIN -AKISMET_API_KEY = None \ No newline at end of file +AKISMET_API_KEY = None From f6b083601b861dcfc34d1b3ba2f805d1b292a2d8 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Thu, 18 Jan 2024 13:12:54 +0100 Subject: [PATCH 13/81] some cleaning --- conf/nginx.conf | 5 - conf/settings.4.1.1.py | 877 --------------------------------- ADMIN.md => doc/ADMIN.md | 2 +- ADMIN_fr.md => doc/ADMIN_fr.md | 2 +- scripts/_common.sh | 2 + scripts/backup | 21 - scripts/change_url | 94 +--- scripts/restore | 56 +-- scripts/upgrade | 78 +-- 9 files changed, 13 insertions(+), 1124 deletions(-) delete mode 100644 conf/settings.4.1.1.py rename ADMIN.md => doc/ADMIN.md (91%) rename ADMIN_fr.md => doc/ADMIN_fr.md (90%) diff --git a/conf/nginx.conf b/conf/nginx.conf index 12c4e0b..d595418 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,31 +1,26 @@ #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; # https://github.com/WeblateOrg/weblate/blob/master/weblate/examples/weblate.nginx.conf location = __PATH__/favicon.ico { - # DATA_DIR/static/favicon.ico alias __INSTALL_DIR__/data/static/favicon.ico; expires 30d; } location = __PATH__/robots.txt { - # DATA_DIR/static/robots.txt alias __INSTALL_DIR__/data/static/robots.txt; expires 30d; } location __PATH__/static/ { - # DATA_DIR/static/ alias __INSTALL_DIR__/data/static/; expires 30d; } location __PATH__/media/ { - # DATA_DIR/media/ alias __INSTALL_DIR__/data/media/; expires 30d; } location __PATH__/ { - # Path to source alias __INSTALL_DIR__/ ; include uwsgi_params; diff --git a/conf/settings.4.1.1.py b/conf/settings.4.1.1.py deleted file mode 100644 index c234938..0000000 --- a/conf/settings.4.1.1.py +++ /dev/null @@ -1,877 +0,0 @@ -# -# Copyright © 2012 - 2020 Michal Čihař -# -# This file is part of Weblate -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - - -import os -import platform -from logging.handlers import SysLogHandler - -# -# Django settings for Weblate project. -# - -DEBUG = False - -ADMINS = ( - ('__ADMIN__', '__ADMINMAIL__'), -) - -MANAGERS = ADMINS - -DATABASES = { - "default": { - # Use "postgresql" or "mysql". - "ENGINE": "django.db.backends.postgresql", - # Database name. - "NAME": "__NAME__", - # Database user. - "USER": "__NAME__", - # Database password. - "PASSWORD": "__DB_PWD__", - # Set to empty string for localhost. - "HOST": "127.0.0.1", - # Set to empty string for default. - "PORT": "", - # Customizations for databases. - "OPTIONS": { - # In case of using an older MySQL server, - # which has MyISAM as a default storage - # "init_command": "SET storage_engine=INNODB", - # Uncomment for MySQL older than 5.7: - # "init_command": "SET sql_mode='STRICT_TRANS_TABLES'", - # Set emoji capable charset for MySQL: - # "charset": "utf8mb4", - # Change connection timeout in case you get MySQL gone away error: - # "connect_timeout": 28800, - }, - } -} - -BASE_DIR = "__INSTALL_DIR__" - -# Data directory -DATA_DIR = os.path.join(BASE_DIR, "data") - -# Local time zone for this installation. Choices can be found here: -# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name -# although not all choices may be available on all operating systems. -# In a Windows environment this must be set to your system time zone. -TIME_ZONE = "UTC" - -# Language code for this installation. All choices can be found here: -# http://www.i18nguy.com/unicode/language-identifiers.html -LANGUAGE_CODE = "en-us" - -LANGUAGES = ( - ("ar", "العربية"), - ("az", "Azərbaycan"), - ("be", "Беларуская"), - ("be@latin", "Biełaruskaja"), - ("bg", "Български"), - ("br", "Brezhoneg"), - ("ca", "Català"), - ("cs", "Čeština"), - ("da", "Dansk"), - ("de", "Deutsch"), - ("en", "English"), - ("el", "Ελληνικά"), - ("en-gb", "English (United Kingdom)"), - ("es", "Español"), - ("fi", "Suomi"), - ("fr", "Français"), - ("gl", "Galego"), - ("he", "עברית"), - ("hu", "Magyar"), - ("hr", "Hrvatski"), - ("id", "Indonesia"), - ("it", "Italiano"), - ("ja", "日本語"), - ("kab", "Taqbaylit"), - ("kk", "Қазақ тілі"), - ("ko", "한국어"), - ("nb", "Norsk bokmål"), - ("nl", "Nederlands"), - ("pl", "Polski"), - ("pt", "Português"), - ("pt-br", "Português brasileiro"), - ("ru", "Русский"), - ("sk", "Slovenčina"), - ("sl", "Slovenščina"), - ("sq", "Shqip"), - ("sr", "Српски"), - ("sv", "Svenska"), - ("tr", "Türkçe"), - ("uk", "Українська"), - ("zh-hans", "简体字"), - ("zh-hant", "正體字"), -) - -SITE_ID = 1 - -# If you set this to False, Django will make some optimizations so as not -# to load the internationalization machinery. -USE_I18N = True - -# If you set this to False, Django will not format dates, numbers and -# calendars according to the current locale. -USE_L10N = True - -# If you set this to False, Django will not use timezone-aware datetimes. -USE_TZ = True - -# URL prefix to use, please see documentation for more details -URL_PREFIX = "__PATH__" - -# Absolute filesystem path to the directory that will hold user-uploaded files. -MEDIA_ROOT = os.path.join(DATA_DIR, "media") - -# URL that handles the media served from MEDIA_ROOT. Make sure to use a -# trailing slash. -MEDIA_URL = f"{URL_PREFIX}/media/" - -# Absolute path to the directory static files should be collected to. -# Don't put anything in this directory yourself; store your static files -# in apps' "static/" subdirectories and in STATICFILES_DIRS. -STATIC_ROOT = os.path.join(DATA_DIR, "static") - -# URL prefix for static files. -STATIC_URL = f"{URL_PREFIX}/static/" - -# Additional locations of static files -STATICFILES_DIRS = ( - # Put strings here, like "/home/html/static" or "C:/www/django/static". - # Always use forward slashes, even on Windows. - # Don't forget to use absolute paths, not relative paths. -) - -# List of finder classes that know how to find static files in -# various locations. -STATICFILES_FINDERS = ( - "django.contrib.staticfiles.finders.FileSystemFinder", - "django.contrib.staticfiles.finders.AppDirectoriesFinder", - "compressor.finders.CompressorFinder", -) - -# Make this unique, and don't share it with anybody. -# You can generate it using weblate/examples/generate-secret-key -SECRET_KEY = "__KEY__" # noqa - -_TEMPLATE_LOADERS = [ - "django.template.loaders.filesystem.Loader", - "django.template.loaders.app_directories.Loader", -] -if not DEBUG: - _TEMPLATE_LOADERS = [("django.template.loaders.cached.Loader", _TEMPLATE_LOADERS)] -TEMPLATES = [ - { - "BACKEND": "django.template.backends.django.DjangoTemplates", - "OPTIONS": { - "context_processors": [ - "django.contrib.auth.context_processors.auth", - "django.template.context_processors.debug", - "django.template.context_processors.i18n", - "django.template.context_processors.request", - "django.template.context_processors.csrf", - "django.contrib.messages.context_processors.messages", - "weblate.trans.context_processors.weblate_context", - ], - "loaders": _TEMPLATE_LOADERS, - }, - } -] - - -# GitHub username for sending pull requests. -# Please see the documentation for more details. -GITHUB_USERNAME = None - -# GitLab username for sending merge requests. -# Please see the documentation for more details. -GITLAB_USERNAME = None - -# Authentication configuration -AUTHENTICATION_BACKENDS = ( - "social_core.backends.email.EmailAuth", - # "social_core.backends.google.GoogleOAuth2", - # "social_core.backends.github.GithubOAuth2", - # "social_core.backends.bitbucket.BitbucketOAuth", - # "social_core.backends.suse.OpenSUSEOpenId", - # "social_core.backends.ubuntu.UbuntuOpenId", - # "social_core.backends.fedora.FedoraOpenId", - # "social_core.backends.facebook.FacebookOAuth2", - "weblate.accounts.auth.WeblateUserBackend", -) - -# Custom user model -AUTH_USER_MODEL = "weblate_auth.User" - -# Social auth backends setup -SOCIAL_AUTH_GITHUB_KEY = "" -SOCIAL_AUTH_GITHUB_SECRET = "" -SOCIAL_AUTH_GITHUB_SCOPE = ["user:email"] - -SOCIAL_AUTH_BITBUCKET_KEY = "" -SOCIAL_AUTH_BITBUCKET_SECRET = "" -SOCIAL_AUTH_BITBUCKET_VERIFIED_EMAILS_ONLY = True - -SOCIAL_AUTH_FACEBOOK_KEY = "" -SOCIAL_AUTH_FACEBOOK_SECRET = "" -SOCIAL_AUTH_FACEBOOK_SCOPE = ["email", "public_profile"] -SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {"fields": "id,name,email"} -SOCIAL_AUTH_FACEBOOK_API_VERSION = "3.1" - -SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = "" -SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = "" - -# Social auth settings -SOCIAL_AUTH_PIPELINE = ( - "social_core.pipeline.social_auth.social_details", - "social_core.pipeline.social_auth.social_uid", - "social_core.pipeline.social_auth.auth_allowed", - "social_core.pipeline.social_auth.social_user", - "weblate.accounts.pipeline.store_params", - "weblate.accounts.pipeline.verify_open", - "social_core.pipeline.user.get_username", - "weblate.accounts.pipeline.require_email", - "social_core.pipeline.mail.mail_validation", - "weblate.accounts.pipeline.revoke_mail_code", - "weblate.accounts.pipeline.ensure_valid", - "weblate.accounts.pipeline.remove_account", - "social_core.pipeline.social_auth.associate_by_email", - "weblate.accounts.pipeline.reauthenticate", - "weblate.accounts.pipeline.verify_username", - "social_core.pipeline.user.create_user", - "social_core.pipeline.social_auth.associate_user", - "social_core.pipeline.social_auth.load_extra_data", - "weblate.accounts.pipeline.cleanup_next", - "weblate.accounts.pipeline.user_full_name", - "weblate.accounts.pipeline.store_email", - "weblate.accounts.pipeline.notify_connect", - "weblate.accounts.pipeline.password_reset", -) -SOCIAL_AUTH_DISCONNECT_PIPELINE = ( - "social_core.pipeline.disconnect.allowed_to_disconnect", - "social_core.pipeline.disconnect.get_entries", - "social_core.pipeline.disconnect.revoke_tokens", - "weblate.accounts.pipeline.cycle_session", - "weblate.accounts.pipeline.adjust_primary_mail", - "weblate.accounts.pipeline.notify_disconnect", - "social_core.pipeline.disconnect.disconnect", - "weblate.accounts.pipeline.cleanup_next", -) - -# Custom authentication strategy -SOCIAL_AUTH_STRATEGY = "weblate.accounts.strategy.WeblateStrategy" - -# Raise exceptions so that we can handle them later -SOCIAL_AUTH_RAISE_EXCEPTIONS = True - -SOCIAL_AUTH_EMAIL_VALIDATION_FUNCTION = "weblate.accounts.pipeline.send_validation" -SOCIAL_AUTH_EMAIL_VALIDATION_URL = "{0}/accounts/email-sent/".format(URL_PREFIX) -SOCIAL_AUTH_LOGIN_ERROR_URL = "{0}/accounts/login/".format(URL_PREFIX) -SOCIAL_AUTH_EMAIL_FORM_URL = "{0}/accounts/email/".format(URL_PREFIX) -SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = "{0}/accounts/profile/#account".format( - URL_PREFIX -) -SOCIAL_AUTH_PROTECTED_USER_FIELDS = ("email",) -SOCIAL_AUTH_SLUGIFY_USERNAMES = True -SOCIAL_AUTH_SLUGIFY_FUNCTION = "weblate.accounts.pipeline.slugify_username" - -# Password validation configuration -AUTH_PASSWORD_VALIDATORS = [ - { - "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator" # noqa: E501, pylint: disable=line-too-long - }, - { - "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", - "OPTIONS": {"min_length": 10}, - }, - {"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator"}, - {"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator"}, - {"NAME": "weblate.accounts.password_validation.CharsPasswordValidator"}, - {"NAME": "weblate.accounts.password_validation.PastPasswordsValidator"}, - # Optional password strength validation by django-zxcvbn-password - # { - # "NAME": "zxcvbn_password.ZXCVBNValidator", - # "OPTIONS": { - # "min_score": 3, - # "user_attributes": ("username", "email", "full_name") - # } - # }, -] - -# Allow new user registrations -REGISTRATION_OPEN = True - -# Shortcut for login required setting -REQUIRE_LOGIN = False - -# Middleware -MIDDLEWARE = [ - "weblate.middleware.ProxyMiddleware", - "django.middleware.security.SecurityMiddleware", - "django.contrib.sessions.middleware.SessionMiddleware", - "django.middleware.common.CommonMiddleware", - "django.middleware.csrf.CsrfViewMiddleware", - "weblate.accounts.middleware.AuthenticationMiddleware", - "django.contrib.messages.middleware.MessageMiddleware", - "django.middleware.clickjacking.XFrameOptionsMiddleware", - "social_django.middleware.SocialAuthExceptionMiddleware", - "weblate.accounts.middleware.RequireLoginMiddleware", - "weblate.api.middleware.ThrottlingMiddleware", - "weblate.middleware.SecurityMiddleware", -] - -ROOT_URLCONF = "weblate.urls" - -# Django and Weblate apps -INSTALLED_APPS = [ - # Weblate apps on top to override Django locales and templates - "weblate.addons", - "weblate.auth", - "weblate.checks", - "weblate.formats", - "weblate.glossary", - "weblate.machinery", - "weblate.trans", - "weblate.lang", - "weblate.langdata", - "weblate.memory", - "weblate.screenshots", - "weblate.fonts", - "weblate.accounts", - "weblate.utils", - "weblate.vcs", - "weblate.wladmin", - "weblate", - # Optional: Git exporter - "weblate.gitexport", - # Standard Django modules - "django.contrib.auth", - "django.contrib.contenttypes", - "django.contrib.sessions", - "django.contrib.sites", - "django.contrib.messages", - "django.contrib.staticfiles", - "django.contrib.admin.apps.SimpleAdminConfig", - "django.contrib.admindocs", - "django.contrib.sitemaps", - "django.contrib.humanize", - # Third party Django modules - "social_django", - "crispy_forms", - "compressor", - "rest_framework", - "rest_framework.authtoken", - "django_filters", -] - -# Custom exception reporter to include some details -DEFAULT_EXCEPTION_REPORTER_FILTER = "weblate.trans.debug.WeblateExceptionReporterFilter" - -# Default logging of Weblate messages -# - to syslog in production (if available) -# - otherwise to console -# - you can also choose "logfile" to log into separate file -# after configuring it below - -# Detect if we can connect to syslog -HAVE_SYSLOG = False -if platform.system() != "Windows": - try: - handler = SysLogHandler(address="/dev/log", facility=SysLogHandler.LOG_LOCAL2) - handler.close() - HAVE_SYSLOG = True - except IOError: - HAVE_SYSLOG = False - -if DEBUG or not HAVE_SYSLOG: - DEFAULT_LOG = "console" -else: - DEFAULT_LOG = "syslog" - -# A sample logging configuration. The only tangible logging -# performed by this configuration is to send an email to -# the site admins on every HTTP 500 error when DEBUG=False. -# See http://docs.djangoproject.com/en/stable/topics/logging for -# more details on how to customize your logging configuration. -LOGGING = { - "version": 1, - "disable_existing_loggers": True, - "filters": {"require_debug_false": {"()": "django.utils.log.RequireDebugFalse"}}, - "formatters": { - "syslog": {"format": "weblate[%(process)d]: %(levelname)s %(message)s"}, - "simple": {"format": "%(levelname)s %(message)s"}, - "logfile": {"format": "%(asctime)s %(levelname)s %(message)s"}, - "django.server": { - "()": "django.utils.log.ServerFormatter", - "format": "[%(server_time)s] %(message)s", - }, - }, - "handlers": { - "mail_admins": { - "level": "ERROR", - "filters": ["require_debug_false"], - "class": "django.utils.log.AdminEmailHandler", - "include_html": True, - }, - "console": { - "level": "DEBUG", - "class": "logging.StreamHandler", - "formatter": "simple", - }, - "django.server": { - "level": "INFO", - "class": "logging.StreamHandler", - "formatter": "django.server", - }, - "syslog": { - "level": "DEBUG", - "class": "logging.handlers.SysLogHandler", - "formatter": "syslog", - "address": "/dev/log", - "facility": SysLogHandler.LOG_LOCAL2, - }, - # Logging to a file - # "logfile": { - # "level":"DEBUG", - # "class":"logging.handlers.RotatingFileHandler", - # "filename": "/var/log/weblate/weblate.log", - # "maxBytes": 100000, - # "backupCount": 3, - # "formatter": "logfile", - # }, - }, - "loggers": { - "django.request": { - "handlers": ["mail_admins", DEFAULT_LOG], - "level": "ERROR", - "propagate": True, - }, - "django.server": { - "handlers": ["django.server"], - "level": "INFO", - "propagate": False, - }, - # Logging database queries - # "django.db.backends": { - # "handlers": [DEFAULT_LOG], - # "level": "DEBUG", - # }, - "weblate": {"handlers": [DEFAULT_LOG], "level": "DEBUG"}, - # Logging search operations - "weblate.search": {"handlers": [DEFAULT_LOG], "level": "INFO"}, - # Logging VCS operations - "weblate.vcs": {"handlers": [DEFAULT_LOG], "level": "WARNING"}, - # Python Social Auth - "social": {"handlers": [DEFAULT_LOG], "level": "DEBUG" if DEBUG else "WARNING"}, - # Django Authentication Using LDAP - "django_auth_ldap": { - "level": "DEBUG" if DEBUG else "WARNING", - "handlers": [DEFAULT_LOG], - }, - }, -} - -# Remove syslog setup if it's not present -if not HAVE_SYSLOG: - del LOGGING["handlers"]["syslog"] - -# List of machine translations -# MT_SERVICES = ( -# "weblate.machinery.apertium.ApertiumAPYTranslation", -# "weblate.machinery.baidu.BaiduTranslation", -# "weblate.machinery.deepl.DeepLTranslation", -# "weblate.machinery.glosbe.GlosbeTranslation", -# "weblate.machinery.google.GoogleTranslation", -# "weblate.machinery.googlev3.GoogleV3Translation", -# "weblate.machinery.microsoft.MicrosoftCognitiveTranslation", -# "weblate.machinery.microsoftterminology.MicrosoftTerminologyService", -# "weblate.machinery.mymemory.MyMemoryTranslation", -# "weblate.machinery.netease.NeteaseSightTranslation", -# "weblate.machinery.tmserver.AmagamaTranslation", -# "weblate.machinery.tmserver.TMServerTranslation", -# "weblate.machinery.yandex.YandexTranslation", -# "weblate.machinery.saptranslationhub.SAPTranslationHub", -# "weblate.machinery.youdao.YoudaoTranslation", -# "weblate.machinery.weblatetm.WeblateTranslation", -# "weblate.memory.machine.WeblateMemory", -# ) - -# Machine translation API keys - -# URL of the Apertium APy server -MT_APERTIUM_APY = None - -# DeepL API key -MT_DEEPL_KEY = None - -# Microsoft Cognitive Services Translator API, register at -# https://portal.azure.com/ -MT_MICROSOFT_COGNITIVE_KEY = None -MT_MICROSOFT_REGION = None - -# MyMemory identification email, see -# https://mymemory.translated.net/doc/spec.php -MT_MYMEMORY_EMAIL = None - -# Optional MyMemory credentials to access private translation memory -MT_MYMEMORY_USER = None -MT_MYMEMORY_KEY = None - -# Google API key for Google Translate API v2 -MT_GOOGLE_KEY = None - -# Google Translate API3 credentials and project id -MT_GOOGLE_CREDENTIALS = None -MT_GOOGLE_PROJECT = None - -# Baidu app key and secret -MT_BAIDU_ID = None -MT_BAIDU_SECRET = None - -# Youdao Zhiyun app key and secret -MT_YOUDAO_ID = None -MT_YOUDAO_SECRET = None - -# Netease Sight (Jianwai) app key and secret -MT_NETEASE_KEY = None -MT_NETEASE_SECRET = None - -# API key for Yandex Translate API -MT_YANDEX_KEY = None - -# tmserver URL -MT_TMSERVER = None - -# SAP Translation Hub -MT_SAP_BASE_URL = None -MT_SAP_SANDBOX_APIKEY = None -MT_SAP_USERNAME = None -MT_SAP_PASSWORD = None -MT_SAP_USE_MT = True - -# Title of site to use -SITE_TITLE = "Weblate" - -# Whether site uses https -ENABLE_HTTPS = False - -# Use HTTPS when creating redirect URLs for social authentication, see -# documentation for more details: -# https://python-social-auth-docs.readthedocs.io/en/latest/configuration/settings.html#processing-redirects-and-urlopen -SOCIAL_AUTH_REDIRECT_IS_HTTPS = ENABLE_HTTPS - -# Make CSRF cookie HttpOnly, see documentation for more details: -# https://docs.djangoproject.com/en/1.11/ref/settings/#csrf-cookie-httponly -CSRF_COOKIE_HTTPONLY = True -CSRF_COOKIE_SECURE = ENABLE_HTTPS -# Store CSRF token in session -CSRF_USE_SESSIONS = True -# Customize CSRF failure view -CSRF_FAILURE_VIEW = "weblate.trans.views.error.csrf_failure" -SESSION_COOKIE_SECURE = ENABLE_HTTPS -SESSION_COOKIE_HTTPONLY = True -# SSL redirect -SECURE_SSL_REDIRECT = ENABLE_HTTPS -# Sent referrrer only for same origin links -SECURE_REFERRER_POLICY = "same-origin" -# SSL redirect URL exemption list -SECURE_REDIRECT_EXEMPT = (r"healthz/$",) # Allowing HTTP access to health check -# Session cookie age (in seconds) -SESSION_COOKIE_AGE = 1209600 -# Increase allowed upload size -DATA_UPLOAD_MAX_MEMORY_SIZE = 50000000 - -# Apply session coookie settings to language cookie as ewll -LANGUAGE_COOKIE_SECURE = SESSION_COOKIE_SECURE -LANGUAGE_COOKIE_HTTPONLY = SESSION_COOKIE_HTTPONLY -LANGUAGE_COOKIE_AGE = SESSION_COOKIE_AGE * 10 - -# Some security headers -SECURE_BROWSER_XSS_FILTER = True -X_FRAME_OPTIONS = "DENY" -SECURE_CONTENT_TYPE_NOSNIFF = True - -# Optionally enable HSTS -SECURE_HSTS_SECONDS = 31536000 if ENABLE_HTTPS else 0 -SECURE_HSTS_PRELOAD = ENABLE_HTTPS -SECURE_HSTS_INCLUDE_SUBDOMAINS = False - -# URL of login -LOGIN_URL = "{0}/accounts/login/".format(URL_PREFIX) - -# URL of logout -LOGOUT_URL = "{0}/accounts/logout/".format(URL_PREFIX) - -# Default location for login -LOGIN_REDIRECT_URL = "{0}/".format(URL_PREFIX) - -# Anonymous user name -ANONYMOUS_USER_NAME = "anonymous" - -# Reverse proxy settings -IP_PROXY_HEADER = "HTTP_X_FORWARDED_FOR" -IP_BEHIND_REVERSE_PROXY = False -IP_PROXY_OFFSET = 0 - -# Sending HTML in mails -EMAIL_SEND_HTML = True - -# Subject of emails includes site title -EMAIL_SUBJECT_PREFIX = "[{0}] ".format(SITE_TITLE) - -# Enable remote hooks -ENABLE_HOOKS = True - -# Number of nearby messages to show in each direction -NEARBY_MESSAGES = 5 - -# By default the length of a given translation is limited to the length of -# the source string * 10 characters. Set this option to False to allow longer -# translations (up to 10.000 characters) -LIMIT_TRANSLATION_LENGTH_BY_SOURCE_LENGTH = True - -# Use simple language codes for default language/country combinations -SIMPLIFY_LANGUAGES = True - -# Render forms using bootstrap -CRISPY_TEMPLATE_PACK = "bootstrap3" - -# List of quality checks -# CHECK_LIST = ( -# "weblate.checks.same.SameCheck", -# "weblate.checks.chars.BeginNewlineCheck", -# "weblate.checks.chars.EndNewlineCheck", -# "weblate.checks.chars.BeginSpaceCheck", -# "weblate.checks.chars.EndSpaceCheck", -# "weblate.checks.chars.DoubleSpaceCheck", -# "weblate.checks.chars.EndStopCheck", -# "weblate.checks.chars.EndColonCheck", -# "weblate.checks.chars.EndQuestionCheck", -# "weblate.checks.chars.EndExclamationCheck", -# "weblate.checks.chars.EndEllipsisCheck", -# "weblate.checks.chars.EndSemicolonCheck", -# "weblate.checks.chars.MaxLengthCheck", -# "weblate.checks.chars.KashidaCheck", -# "weblate.checks.chars.PuctuationSpacingCheck", -# "weblate.checks.format.PythonFormatCheck", -# "weblate.checks.format.PythonBraceFormatCheck", -# "weblate.checks.format.PHPFormatCheck", -# "weblate.checks.format.CFormatCheck", -# "weblate.checks.format.PerlFormatCheck", -# "weblate.checks.format.JavaScriptFormatCheck", -# "weblate.checks.format.CSharpFormatCheck", -# "weblate.checks.format.JavaFormatCheck", -# "weblate.checks.format.JavaMessageFormatCheck", -# "weblate.checks.format.PercentPlaceholdersCheck", -# "weblate.checks.format.I18NextInterpolationCheck", -# "weblate.checks.angularjs.AngularJSInterpolationCheck", -# "weblate.checks.qt.QtFormatCheck", -# "weblate.checks.qt.QtPluralCheck", -# "weblate.checks.ruby.RubyFormatCheck", -# "weblate.checks.consistency.PluralsCheck", -# "weblate.checks.consistency.SamePluralsCheck", -# "weblate.checks.consistency.ConsistencyCheck", -# "weblate.checks.consistency.TranslatedCheck", -# "weblate.checks.chars.EscapedNewlineCountingCheck", -# "weblate.checks.chars.NewLineCountCheck", -# "weblate.checks.markup.BBCodeCheck", -# "weblate.checks.chars.ZeroWidthSpaceCheck", -# "weblate.checks.render.MaxSizeCheck", -# "weblate.checks.markup.XMLValidityCheck", -# "weblate.checks.markup.XMLTagsCheck", -# "weblate.checks.markup.MarkdownRefLinkCheck", -# "weblate.checks.markup.MarkdownLinkCheck", -# "weblate.checks.markup.MarkdownSyntaxCheck", -# "weblate.checks.markup.URLCheck", -# "weblate.checks.markup.SafeHTMLCheck", -# "weblate.checks.placeholders.PlaceholderCheck", -# "weblate.checks.placeholders.RegexCheck", -# "weblate.checks.duplicate.DuplicateCheck", -# "weblate.checks.source.OptionalPluralCheck", -# "weblate.checks.source.EllipsisCheck", -# "weblate.checks.source.MultipleFailingCheck", -# "weblate.checks.source.LongUntranslatedCheck", -# "weblate.checks.format.MultipleUnnamedFormatsCheck", -# ) - -# List of automatic fixups -# AUTOFIX_LIST = ( -# "weblate.trans.autofixes.whitespace.SameBookendingWhitespace", -# "weblate.trans.autofixes.chars.ReplaceTrailingDotsWithEllipsis", -# "weblate.trans.autofixes.chars.RemoveZeroSpace", -# "weblate.trans.autofixes.chars.RemoveControlChars", -# ) - -# List of enabled addons -# WEBLATE_ADDONS = ( -# "weblate.addons.gettext.GenerateMoAddon", -# "weblate.addons.gettext.UpdateLinguasAddon", -# "weblate.addons.gettext.UpdateConfigureAddon", -# "weblate.addons.gettext.MsgmergeAddon", -# "weblate.addons.gettext.GettextCustomizeAddon", -# "weblate.addons.gettext.GettextAuthorComments", -# "weblate.addons.cleanup.CleanupAddon", -# "weblate.addons.consistency.LangaugeConsistencyAddon", -# "weblate.addons.discovery.DiscoveryAddon", -# "weblate.addons.flags.SourceEditAddon", -# "weblate.addons.flags.TargetEditAddon", -# "weblate.addons.flags.SameEditAddon", -# "weblate.addons.flags.BulkEditAddon", -# "weblate.addons.generate.GenerateFileAddon", -# "weblate.addons.json.JSONCustomizeAddon", -# "weblate.addons.properties.PropertiesSortAddon", -# "weblate.addons.git.GitSquashAddon", -# "weblate.addons.removal.RemoveComments", -# "weblate.addons.removal.RemoveSuggestions", -# "weblate.addons.resx.ResxUpdateAddon", -# "weblate.addons.yaml.YAMLCustomizeAddon", -# "weblate.addons.autotranslate.AutoTranslateAddon", -# ) - -# E-mail address that error messages come from. -SERVER_EMAIL = "noreply@__DOMAIN__" - -# Default email address to use for various automated correspondence from -# the site managers. Used for registration emails. -DEFAULT_FROM_EMAIL = "noreply@__ADMINMAIL__" - -# List of URLs your site is supposed to serve -ALLOWED_HOSTS = ["__DOMAIN__"] - -# Configuration for caching -CACHES = { - "default": { - "BACKEND": "django_redis.cache.RedisCache", - "LOCATION": "redis://127.0.0.1:6379/__REDIS_DB__", - # If redis is running on same host as Weblate, you might - # want to use unix sockets instead: - # "LOCATION": "unix:///var/run/redis/redis.sock?db=1", - "OPTIONS": { - "CLIENT_CLASS": "django_redis.client.DefaultClient", - "PARSER_CLASS": "redis.connection.HiredisParser", - "PASSWORD": None, - "CONNECTION_POOL_KWARGS": {}, - }, - "KEY_PREFIX": "weblate", - }, - "avatar": { - "BACKEND": "django.core.cache.backends.filebased.FileBasedCache", - "LOCATION": os.path.join(DATA_DIR, "avatar-cache"), - "TIMEOUT": 86400, - "OPTIONS": {"MAX_ENTRIES": 1000}, - }, -} - -# Store sessions in cache -SESSION_ENGINE = "django.contrib.sessions.backends.cache" -# Store messages in session -MESSAGE_STORAGE = "django.contrib.messages.storage.session.SessionStorage" - -# REST framework settings for API -REST_FRAMEWORK = { - # Use Django's standard `django.contrib.auth` permissions, - # or allow read-only access for unauthenticated users. - "DEFAULT_PERMISSION_CLASSES": [ - # Require authentication for login required sites - "rest_framework.permissions.IsAuthenticated" - if REQUIRE_LOGIN - else "rest_framework.permissions.IsAuthenticatedOrReadOnly" - ], - "DEFAULT_AUTHENTICATION_CLASSES": ( - "rest_framework.authentication.TokenAuthentication", - "weblate.api.authentication.BearerAuthentication", - "rest_framework.authentication.SessionAuthentication", - ), - "DEFAULT_THROTTLE_CLASSES": ( - "weblate.api.throttling.UserRateThrottle", - "weblate.api.throttling.AnonRateThrottle", - ), - "DEFAULT_THROTTLE_RATES": {"anon": "100/day", "user": "5000/hour"}, - "DEFAULT_PAGINATION_CLASS": ("rest_framework.pagination.PageNumberPagination"), - "PAGE_SIZE": 20, - "VIEW_DESCRIPTION_FUNCTION": "weblate.api.views.get_view_description", - "UNAUTHENTICATED_USER": "weblate.auth.models.get_anonymous", -} - -# Require login for all URLs -if REQUIRE_LOGIN: - LOGIN_REQUIRED_URLS = (r"/(.*)$",) - -# In such case you will want to include some of the exceptions -# LOGIN_REQUIRED_URLS_EXCEPTIONS = ( -# rf"{URL_PREFIX}/accounts/(.*)$", # Required for login -# rf"{URL_PREFIX}/admin/login/(.*)$", # Required for admin login -# rf"{URL_PREFIX}/static/(.*)$", # Required for development mode -# rf"{URL_PREFIX}/widgets/(.*)$", # Allowing public access to widgets -# rf"{URL_PREFIX}/data/(.*)$", # Allowing public access to data exports -# rf"{URL_PREFIX}/hooks/(.*)$", # Allowing public access to notification hooks -# rf"{URL_PREFIX}/healthz/$", # Allowing public access to health check -# rf"{URL_PREFIX}/api/(.*)$", # Allowing access to API -# rf"{URL_PREFIX}/js/i18n/$", # JavaScript localization -# rf"{URL_PREFIX}/contact/$", # Optional for contact form -# rf"{URL_PREFIX}/legal/(.*)$", # Optional for legal app -# ) - -# Silence some of the Django system checks -SILENCED_SYSTEM_CHECKS = [ - # We have modified django.contrib.auth.middleware.AuthenticationMiddleware - # as weblate.accounts.middleware.AuthenticationMiddleware - "admin.E408" -] - -# Celery worker configuration for testing -# CELERY_TASK_ALWAYS_EAGER = True -# CELERY_BROKER_URL = "memory://" -# CELERY_TASK_EAGER_PROPAGATES = True -# Celery worker configuration for production -CELERY_TASK_ALWAYS_EAGER = False -CELERY_BROKER_URL = "redis://127.0.0.1:6379" -CELERY_RESULT_BACKEND = CELERY_BROKER_URL - -# Celery settings, it is not recommended to change these -CELERY_WORKER_MAX_MEMORY_PER_CHILD = 200000 -CELERY_BEAT_SCHEDULE_FILENAME = os.path.join(DATA_DIR, "celery", "beat-schedule") -CELERY_TASK_ROUTES = { - "weblate.trans.tasks.auto_translate": {"queue": "translate"}, - "weblate.memory.tasks.*": {"queue": "memory"}, - "weblate.accounts.tasks.notify_*": {"queue": "notify"}, - "weblate.accounts.tasks.send_mails": {"queue": "notify"}, - "weblate.utils.tasks.settings_backup": {"queue": "backup"}, - "weblate.utils.tasks.database_backup": {"queue": "backup"}, - "weblate.wladmin.tasks.backup": {"queue": "backup"}, - "weblate.wladmin.tasks.backup_service": {"queue": "backup"}, -} - -# Enable plain database backups -DATABASE_BACKUP = "plain" - -# Enable auto updating -AUTO_UPDATE = False - -# PGP commits signing -WEBLATE_GPG_IDENTITY = None - -# Third party services integration -MATOMO_SITE_ID = None -MATOMO_URL = None -GOOGLE_ANALYTICS_ID = None -SENTRY_DSN = None -AKISMET_API_KEY = None \ No newline at end of file diff --git a/ADMIN.md b/doc/ADMIN.md similarity index 91% rename from ADMIN.md rename to doc/ADMIN.md index fa73e74..b45a318 100644 --- a/ADMIN.md +++ b/doc/ADMIN.md @@ -8,7 +8,7 @@ This user will only be used to open the pull-request, each translation keep his ## Settings and upgrades Almost everything related to Weblate's configuration is handled in a `settings.py` file. -You can edit the file `$final_path/local_settings.py` to enable or disable features. +You can edit the file `__INSTALL_DIR__/local_settings.py` to enable or disable features. # Miscellaneous diff --git a/ADMIN_fr.md b/doc/ADMIN_fr.md similarity index 90% rename from ADMIN_fr.md rename to doc/ADMIN_fr.md index 3890ac4..15cd506 100644 --- a/ADMIN_fr.md +++ b/doc/ADMIN_fr.md @@ -8,7 +8,7 @@ Cet utilisateur ne sera utilisé que pour ouvrir la pull-request, chaque traduct ## Paramètres et mises à niveau Presque tout ce qui concerne la configuration de Weblate est géré dans un fichier `settings.py`. -Vous pouvez éditer le fichier `$final_path/local_settings.py` pour activer ou désactiver des fonctionnalités. +Vous pouvez éditer le fichier `__INSTALL_DIR__/local_settings.py` pour activer ou désactiver des fonctionnalités. # Divers diff --git a/scripts/_common.sh b/scripts/_common.sh index 9b485c5..bfc9a94 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -14,6 +14,8 @@ elif [ "$debian_maj_version" -eq 10 ] ; then weblate_pypath="python3.7" elif [ "$debian_maj_version" -eq 11 ] ; then weblate_pypath="python3.9" +elif [ "$debian_maj_version" -eq 12 ] ; then + weblate_pypath="python3.11" fi #================================================= diff --git a/scripts/backup b/scripts/backup index 4472f3d..dbbe2a8 100755 --- a/scripts/backup +++ b/scripts/backup @@ -10,27 +10,6 @@ source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -#================================================= -# MANAGE SCRIPT FAILURE -#================================================= - -#REMOVEME? ynh_clean_setup () { - true -} -# Exit if an error occurs during the execution of the script -#REMOVEME? ynh_abort_if_errors - -#================================================= -# LOAD SETTINGS -#================================================= -#REMOVEME? ynh_print_info --message="Loading installation settings..." - -#REMOVEME? app=$YNH_APP_INSTANCE_NAME - -#REMOVEME? #REMOVEME? install_dir=$(ynh_app_setting_get --app=$app --key=install_dir) -#REMOVEME? domain=$(ynh_app_setting_get --app=$app --key=domain) -#REMOVEME? db_name=$(ynh_app_setting_get --app=$app --key=db_name) - #================================================= # DECLARE DATA AND CONF FILES TO BACKUP #================================================= diff --git a/scripts/change_url b/scripts/change_url index afe336e..5a4d779 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -9,61 +9,6 @@ source _common.sh source /usr/share/yunohost/helpers -#================================================= -# RETRIEVE ARGUMENTS -#================================================= - -#REMOVEME? old_domain=$YNH_APP_OLD_DOMAIN -#REMOVEME? old_path=$YNH_APP_OLD_PATH - -#REMOVEME? new_domain=$YNH_APP_NEW_DOMAIN -#REMOVEME? new_path=$YNH_APP_NEW_PATH - -#REMOVEME? app=$YNH_APP_INSTANCE_NAME - -#================================================= -# LOAD SETTINGS -#================================================= -#REMOVEME? ynh_script_progression --message="Loading installation settings..." --weight=1 - -#REMOVEME? # Needed for helper "ynh_add_nginx_config" -#REMOVEME? #REMOVEME? install_dir=$(ynh_app_setting_get --app=$app --key=install_dir) - - -#================================================= -# BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP -#================================================= -#REMOVEME? ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." - -# Backup the current version of the app -#REMOVEME? ynh_backup_before_upgrade -#REMOVEME? ynh_clean_setup () { - #REMOVEME? ynh_clean_check_starting - # Remove the new domain config file, the remove script won't do it as it doesn't know yet its location. -#REMOVEME? ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" - - # Restore it if the upgrade fails -#REMOVEME? ynh_restore_upgradebackup -} -# Exit if an error occurs during the execution of the script -#REMOVEME? ynh_abort_if_errors - -#================================================= -# CHECK WHICH PARTS SHOULD BE CHANGED -#================================================= - -#REMOVEME? change_domain=0 -#REMOVEME? if [ "$old_domain" != "$new_domain" ] -then - #REMOVEME? change_domain=1 -fi - -#REMOVEME? change_path=0 -#REMOVEME? if [ "$old_path" != "$new_path" ] -then - #REMOVEME? change_path=1 -fi - #================================================= # STANDARD MODIFICATIONS #================================================= @@ -72,7 +17,7 @@ fi ynh_script_progression --message="Stopping systemd services..." --weight=1 ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/weblate.log" --line_match="goodbye to uWSGI" -ynh_systemd_action --service_name="$app-celery" --action="stop" --log_path="systemd" --line_match="Stopped" +ynh_systemd_action --service_name="$app-celery" --action="stop" --log_path="systemd" #================================================= # MODIFY URL IN NGINX CONF @@ -81,30 +26,6 @@ ynh_script_progression --message="Updating NGINX web server configuration..." -- ynh_change_url_nginx_config -#REMOVEME? 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 -#REMOVEME? ynh_backup_if_checksum_is_different --file="$nginx_conf_path" - # Set global variables for NGINX helper -#REMOVEME? domain="$old_domain" -#REMOVEME? path="$new_path" - # Create a dedicated NGINX config -#REMOVEME? 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 -#REMOVEME? ynh_delete_file_checksum --file="$nginx_conf_path" -#REMOVEME? mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf - # Store file checksum for the new config file location -#REMOVEME? ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" -fi - #================================================= # SPECIFIC MODIFICATIONS #================================================= @@ -115,13 +36,13 @@ ynh_script_progression --message="Modify weblate's config file..." --weight=1 settings="$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" ynh_backup_if_checksum_is_different --file="$settings" -#REMOVEME? # Change the path in the nginx config file +# Change the path in the nginx config file if [ $change_path -eq 1 ] then ynh_replace_string --match_string="URL_PREFIX = \"${old_path%/}\"" --replace_string="URL_PREFIX = \"${new_path%/}\"" --target_file="$settings" fi -#REMOVEME? # Change the domain for nginx +# Change the domain for nginx if [ $change_domain -eq 1 ] then # replace SERVER_EMAIL @@ -141,7 +62,7 @@ ynh_store_file_checksum --file="$settings" finaluwsgiini="/etc/uwsgi/apps-available/$app.ini" ynh_backup_if_checksum_is_different --file="$finaluwsgiini" -#REMOVEME? # Change the path in the nginx config file +# Change the path in the nginx config file if [ $change_path -eq 1 ] then ynh_replace_string --match_string="mount = $old_path=" --replace_string="mount = $new_path=" --target_file="$finaluwsgiini" @@ -159,13 +80,6 @@ ynh_script_progression --message="Starting a systemd service..." --weight=5 ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/weblate.log" --line_match="spawned uWSGI" ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery-celery.log" --line_match="mingle: all alone" -#================================================= -# RELOAD NGINX -#================================================= -#REMOVEME? ynh_script_progression --message="Reloading NGINX web server..." --weight=1 - -#REMOVEME? #REMOVEME? ynh_systemd_action --service_name=nginx --action=reload - #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/restore b/scripts/restore index f23e067..28759ce 100755 --- a/scripts/restore +++ b/scripts/restore @@ -10,47 +10,6 @@ source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -#================================================= -# MANAGE SCRIPT FAILURE -#================================================= - -#REMOVEME? ynh_clean_setup () { - ynh_clean_check_starting -} -# Exit if an error occurs during the execution of the script -#REMOVEME? ynh_abort_if_errors - -#================================================= -# LOAD SETTINGS -#================================================= -#REMOVEME? ynh_script_progression --message="Loading installation settings..." --weight=1 - -#REMOVEME? app=$YNH_APP_INSTANCE_NAME - -#REMOVEME? domain=$(ynh_app_setting_get --app=$app --key=domain) -#REMOVEME? path=$(ynh_app_setting_get --app=$app --key=path) -#REMOVEME? #REMOVEME? install_dir=$(ynh_app_setting_get --app=$app --key=install_dir) -#REMOVEME? db_name=$(ynh_app_setting_get --app=$app --key=db_name) -#REMOVEME? db_user=$db_name - -#================================================= -# CHECK IF THE APP CAN BE RESTORED -#================================================= -#REMOVEME? ynh_script_progression --message="Validating restoration parameters..." --weight=1 - -#REMOVEME? test ! -d $install_dir \ - || ynh_die --message="There is already a directory: $install_dir " - -#================================================= -# STANDARD RESTORATION STEPS -#================================================= -# RECREATE THE DEDICATED USER -#================================================= -#REMOVEME? ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 - -# Create the dedicated user (if not existing) -#REMOVEME? ynh_system_user_create --username=$app --home_dir="$install_dir" --use_shell - #================================================= # RESTORE THE APP MAIN DIR #================================================= @@ -67,16 +26,6 @@ chown -R $app: "$install_dir" chown $app:www-data "$install_dir" chown -R $app:www-data "$install_dir/data" -#================================================= -# SPECIFIC RESTORATION -#================================================= -# REINSTALL DEPENDENCIES -#================================================= -#REMOVEME? ynh_script_progression --message="Reinstalling dependencies..." --weight=40 - -# Define and install dependencies -#REMOVEME? ynh_exec_warn_less ynh_install_app_dependencies "$pkg_dependencies" - #================================================= # RESTORE THE NGINX CONFIGURATION #================================================= @@ -87,11 +36,8 @@ ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # RESTORE THE POSTGRESQL DATABASE #================================================= -#REMOVEME? ynh_script_progression --message="Restoring the PostgreSQL database..." --weight=5 +REMOVEME? ynh_script_progression --message="Restoring the PostgreSQL database..." --weight=5 -#REMOVEME? db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) -#REMOVEME? ynh_psql_test_if_first_run -#REMOVEME? ynh_psql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd ynh_psql_execute_as_root --sql="CREATE EXTENSION IF NOT EXISTS pg_trgm;" --database=$db_name ynh_psql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./db.sql diff --git a/scripts/upgrade b/scripts/upgrade index 3457486..5115190 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -12,21 +12,7 @@ source /usr/share/yunohost/helpers #================================================= # LOAD SETTINGS #================================================= -#REMOVEME? ynh_script_progression --message="Loading installation settings..." --weight=1 - -#REMOVEME? app=$YNH_APP_INSTANCE_NAME - -#REMOVEME? domain=$(ynh_app_setting_get --app=$app --key=domain) -#REMOVEME? path=$(ynh_app_setting_get --app=$app --key=path) -#REMOVEME? admin=$(ynh_app_setting_get --app=$app --key=admin) -#REMOVEME? #REMOVEME? install_dir=$(ynh_app_setting_get --app=$app --key=install_dir) -#REMOVEME? db_name=$(ynh_app_setting_get --app=$app --key=db_name) -#REMOVEME? db_user=$db_name -#REMOVEME? db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) -#REMOVEME? used_forge=$(ynh_app_setting_get --app=$app --key=used_forge) -#REMOVEME? forge_username=$(ynh_app_setting_get --app=$app --key=forge_username) -#REMOVEME? forge_token=$(ynh_app_setting_get --app=$app --key=forge_token) -#REMOVEME? redis_db=$(ynh_app_setting_get --app=$app --key=redis_db) +REMOVEME? ynh_script_progression --message="Loading installation settings..." --weight=1 admin_mail=$(ynh_user_get_info --username="$admin" --key=mail) key=$(ynh_string_random --length=50) @@ -37,21 +23,6 @@ key=$(ynh_string_random --length=50) upgrade_type=$(ynh_check_app_version_changed) -#================================================= -# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP -#================================================= -#REMOVEME? ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --weight=40 - -# Backup the current version of the app -#REMOVEME? ynh_backup_before_upgrade -#REMOVEME? ynh_clean_setup () { - ynh_clean_check_starting - # Restore it if the upgrade fails -#REMOVEME? ynh_restore_upgradebackup -} -# Exit if an error occurs during the execution of the script -#REMOVEME? ynh_abort_if_errors - #================================================= # STANDARD UPGRADE STEPS #================================================= @@ -60,59 +31,23 @@ upgrade_type=$(ynh_check_app_version_changed) ynh_script_progression --message="Stopping systemd services..." --weight=5 ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/weblate.log" --line_match="goodbye to uWSGI" -ynh_systemd_action --service_name="$app-celery" --action="stop" --log_path="systemd" --line_match="Stopped" +ynh_systemd_action --service_name="$app-celery" --action="stop" --log_path="systemd" #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 -#REMOVEME? if ynh_legacy_permissions_exists -then -#REMOVEME? ynh_legacy_permissions_delete_all - - ynh_app_setting_delete --app=$app --key=is_public -fi - -if [[ -d "$install_dir/bin/" ]] -then -#REMOVEME? ynh_secure_remove --file="$install_dir/bin/" -fi - -# (<3.8) log cleanups -if [[ -e "/var/log/uwsgi/app/$app" ]] -then - ynh_systemd_action --service_name=$app --action="stop" - ynh_systemd_action --service_name="$app-celery" --action="stop" - ynh_secure_remove --file="/var/log/uwsgi/app/$app" - ynh_secure_remove --file="/var/log/$app-celery" -fi - # If used_forge, forge_username, forge_token don't exist, create them if [ -z "$used_forge" ]; then used_forge="GitHub" -#REMOVEME? forge_username=$(ynh_app_setting_get --app=$app --key=github_account) -#REMOVEME? forge_token=$(ynh_app_setting_get --app=$app --key=github_token) + forge_username=$(ynh_app_setting_get --app=$app --key=github_account) + forge_token=$(ynh_app_setting_get --app=$app --key=github_token) ynh_app_setting_set --app=$app --key=used_forge --value=$used_forge ynh_app_setting_set --app=$app --key=forge_username --value=$forge_username ynh_app_setting_set --app=$app --key=forge_token --value=$forge_token fi -#================================================= -# CREATE DEDICATED USER -#================================================= -#REMOVEME? ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 - -# Create a dedicated user (if not existing) -#REMOVEME? ynh_system_user_create --username=$app --home_dir="$install_dir" --use_shell - -#================================================= -# UPGRADE DEPENDENCIES -#================================================= -#REMOVEME? ynh_script_progression --message="Upgrading dependencies..." --weight=5 - -#REMOVEME? ynh_exec_warn_less ynh_install_app_dependencies "$pkg_dependencies" - #================================================= # NGINX CONFIGURATION #================================================= @@ -268,11 +203,6 @@ fi ynh_psql_execute_as_root --sql="CREATE EXTENSION IF NOT EXISTS pg_trgm;" --database=$db_name -if [ "$current_version" -lt "4" ] -then - upgrade "4.1.1" "../conf/settings.4.1.1.py" -fi - upgrade $(ynh_app_upstream_version) "../conf/settings.py" # Set right permissions for curl installation From c895e8f0cb1505dc66f5ee34b42356eb6f46a3f6 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Thu, 18 Jan 2024 14:16:32 +0100 Subject: [PATCH 14/81] further cleaning --- conf/libxxhash.src | 7 ------- manifest.toml | 2 ++ scripts/_common.sh | 9 +-------- scripts/restore | 2 +- 4 files changed, 4 insertions(+), 16 deletions(-) delete mode 100644 conf/libxxhash.src diff --git a/conf/libxxhash.src b/conf/libxxhash.src deleted file mode 100644 index 5d4f0c6..0000000 --- a/conf/libxxhash.src +++ /dev/null @@ -1,7 +0,0 @@ -SOURCE_URL=https://github.com/Cyan4973/xxHash/archive/refs/tags/v0.8.1.tar.gz -SOURCE_SUM=3bb6b7d6f30c591dd65aaaff1c8b7a5b94d81687998ca9400082c739a690436c -SOURCE_SUM_PRG=sha256sum -SOURCE_FORMAT=tar.gz -SOURCE_IN_SUBDIR=true -SOURCE_FILENAME= -SOURCE_EXTRACT=true diff --git a/manifest.toml b/manifest.toml index 1c1ad28..a08ad00 100644 --- a/manifest.toml +++ b/manifest.toml @@ -62,6 +62,7 @@ ram.runtime = "3G" ask.fr = "Nom d'utilisateur de votre forge" type = "string" example = "Your username" + default = "username" optional = true [install.forge_token] @@ -69,6 +70,7 @@ ram.runtime = "3G" ask.fr = "Jeton de votre forge (OAuth)" type = "string" example = "A secret token" + default = "thisisanexampletoken" optional = true [resources] diff --git a/scripts/_common.sh b/scripts/_common.sh index bfc9a94..0338ce8 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -40,13 +40,6 @@ set_forge_variables() { # EXPERIMENTAL HELPERS #================================================= -#================================================= -# -# Redis HELPERS -# -# Point of contact : Jean-Baptiste Holcroft -#================================================= - # get the first available redis database # # usage: ynh_redis_get_free_db @@ -70,7 +63,7 @@ ynh_redis_get_free_db() { db=-1 done - test "$db" -eq -1 && ynh_die "No available Redis databases..." + test "$db" -eq -1 && ynh_die --message="No available Redis databases..." echo "$db" } diff --git a/scripts/restore b/scripts/restore index 28759ce..1d3f6b7 100755 --- a/scripts/restore +++ b/scripts/restore @@ -36,7 +36,7 @@ ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # RESTORE THE POSTGRESQL DATABASE #================================================= -REMOVEME? ynh_script_progression --message="Restoring the PostgreSQL database..." --weight=5 +ynh_script_progression --message="Restoring the PostgreSQL database..." --weight=5 ynh_psql_execute_as_root --sql="CREATE EXTENSION IF NOT EXISTS pg_trgm;" --database=$db_name ynh_psql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./db.sql From a00c5fe2db480dd1c778b7591008fc32ec8c77ed Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Thu, 18 Jan 2024 14:23:24 +0100 Subject: [PATCH 15/81] Delete legacy removeme --- scripts/upgrade | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 5115190..2c0b395 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -12,7 +12,7 @@ source /usr/share/yunohost/helpers #================================================= # LOAD SETTINGS #================================================= -REMOVEME? ynh_script_progression --message="Loading installation settings..." --weight=1 +ynh_script_progression --message="Loading installation settings..." --weight=1 admin_mail=$(ynh_user_get_info --username="$admin" --key=mail) key=$(ynh_string_random --length=50) @@ -240,13 +240,6 @@ ynh_script_progression --message="Starting systemd services..." --weight=5 ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/weblate.log" --line_match="spawned uWSGI" ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery-celery.log" --line_match="mingle: all alone" -#================================================= -# RELOAD NGINX -#================================================= -#REMOVEME? ynh_script_progression --message="Reloading NGINX web server..." --weight=1 - -#REMOVEME? ynh_systemd_action --service_name=nginx --action=reload - #================================================= # END OF SCRIPT #================================================= From 713f70ec5bb643d99385bc97a0a265433c5fe35e Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Thu, 18 Jan 2024 19:57:54 +0100 Subject: [PATCH 16/81] try to simplify things --- scripts/install | 64 +++++++++++++++++----------------------- scripts/restore | 4 +-- scripts/upgrade | 78 ++++++++++++++++++++++--------------------------- 3 files changed, 64 insertions(+), 82 deletions(-) diff --git a/scripts/install b/scripts/install index ae5bc85..bd0d1f7 100755 --- a/scripts/install +++ b/scripts/install @@ -89,38 +89,34 @@ fi #================================================= # PIP INSTALLATION #================================================= -ynh_script_progression --message="Install weblate using PIP..." --weight=80 +ynh_script_progression --message="Install weblate using PIP..." --weight=5 -virtualenv --python=python3 "${install_dir}/venv" -chown -R $app: "$install_dir" +pushd $install_dir + python3 -m venv $install_dir/venv + source $install_dir/venv/bin/activate + ynh_exec_warn_less pip install --upgrade pip setuptools wheel pkgconfig xxhash -#run source in a 'sub shell' -( - set +o nounset - source "${install_dir}/venv/bin/activate" - set -o nounset - cd "${install_dir}" + # Read the "Note" section in https://docs.weblate.org/en/weblate-5.3/admin/install/venv-debian.html#python-modules + ynh_exec_warn_less pip install install --force-reinstall --no-binary :all: cffi - sudo --user=$app $install_dir/venv/bin/pip install --upgrade pip setuptools wheel pkgconfig xxhash + ynh_exec_warn_less pip install Weblate=="$(ynh_app_upstream_version)" + + ynh_exec_warn_less pip install psycopg2-binary ruamel.yaml aeidon phply - # Read the "Note" section in https://docs.weblate.org/en/weblate-4.11/admin/install/venv-debian.html#python-modules - sudo --user=$app $install_dir/venv/bin/pip install --force-reinstall --no-binary :all: cffi - # Still needed with latest version of weblate? - sudo --user=$app BORG_OPENSSL_PREFIX=/usr/lib/x86_64-linux-gnu/ $install_dir/venv/bin/pip install Weblate=="$(ynh_app_upstream_version)" - sudo --user=$app $install_dir/venv/bin/pip install psycopg2-binary ruamel.yaml aeidon phply - #pip install pytz python-bidi PyYaML Babel pyuca pylibravatar py3dns psycopg2-binary phply django-redis hiredis aeidon ruamel.yaml - # specific to YunoHost package: - sudo --user=$app $install_dir/venv/bin/pip install django_sendmail_backend -) + ynh_exec_warn_less pip install django_sendmail_backend + +popd #================================================= # ADD A CONFIGURATION #================================================= ynh_script_progression --message="Adding a configuration file..." --weight=1 +# Configure redis redis_db=$(ynh_redis_get_free_db) -ynh_app_setting_set --app=$app --key=redis_db --value="$redis_db" +ynh_app_setting_set --app="$app" --key=redis_db --value="$redis_db" + path="${path%/}" settings="$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" @@ -146,26 +142,20 @@ chown -R "$app:www-data" "$install_dir/data" #========================================== ynh_script_progression --message="Filling up the database..." --weight=10 -( - set +o nounset - source "${install_dir}/venv/bin/activate" - set -o nounset - export DJANGO_SETTINGS_MODULE="weblate.settings" - cd "${install_dir}" +export DJANGO_SETTINGS_MODULE="weblate.settings" - # the user needs to be weblate for postgresql - ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate migrate --noinput - # generate static files - ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate collectstatic --noinput - ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate createadmin --no-color \ +ynh_exec_warn_less $install_dir/venv/bin/weblate migrate --noinput + +ynh_exec_warn_less $install_dir/venv/bin/weblate collectstatic --noinput + +ynh_exec_warn_less $install_dir/venv/bin/weblate createadmin --no-color \ --password "$password" \ --username "$admin" \ --email "$admin_mail" - # Check the configuration - # This may fail in some cases with errors, etc., but the app works and the user can fix issues later. - ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate check --deploy || true -) +# Check the configuration +# This may fail in some cases with errors, etc., but the app works and the user can fix issues later. +ynh_exec_warn_less $install_dir/venv/bin/weblate check --deploy || true #================================================= # SETUP SYSTEMD @@ -191,7 +181,7 @@ ynh_use_logrotate --non-append ynh_script_progression --message="Integrating service in YunoHost..." --weight=3 yunohost service add $app --log="/var/log/$app/weblate.log" -yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery-w1.log" +yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery.log" #================================================= # START SYSTEMD SERVICE @@ -199,7 +189,7 @@ yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery-w1.log" ynh_script_progression --message="Starting a systemd service..." --weight=5 ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/weblate.log" --line_match="spawned uWSGI" -ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery-celery.log" --line_match="mingle: all alone" +ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery.log" --line_match="mingle: all alone" #================================================= # END OF SCRIPT diff --git a/scripts/restore b/scripts/restore index 1d3f6b7..bf8586d 100755 --- a/scripts/restore +++ b/scripts/restore @@ -85,7 +85,7 @@ ynh_restore_file --origin_path="/etc/logrotate.d/$app" ynh_script_progression --message="Integrating service in YunoHost..." --weight=3 yunohost service add $app --log="/var/log/$app/weblate.log" -yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery-w1.log" +yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery.log" #================================================= # START SYSTEMD SERVICE @@ -93,7 +93,7 @@ yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery-w1.log" ynh_script_progression --message="Starting a systemd service..." --weight=5 ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/weblate.log" --line_match="spawned uWSGI" -ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery-celery.log" --line_match="mingle: all alone" +ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery.log" --line_match="mingle: all alone" #================================================= # GENERIC FINALIZATION diff --git a/scripts/upgrade b/scripts/upgrade index 2c0b395..a839640 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -110,33 +110,27 @@ ynh_add_systemd_config --service="$app-celery" --template="celery-weblate.servic upgrade() { new_version=$1 settings_template=$2 - #================================================= - # PIP INSTALLATION - #================================================= - ynh_script_progression --message="Install weblate using PIP..." --weight=15 +#================================================= +# PIP INSTALLATION +#================================================= +ynh_script_progression --message="Install weblate using PIP..." --weight=5 - ynh_secure_remove --file="${install_dir}/venv" - virtualenv --python=python3 "${install_dir}/venv" - chown -R $app: "$install_dir" +pushd $install_dir + python3 -m venv $install_dir/venv + source $install_dir/venv/bin/activate + ynh_exec_warn_less pip install --upgrade pip setuptools wheel pkgconfig xxhash - #run source in a 'sub shell' - ( - set +o nounset - source "${install_dir}/venv/bin/activate" - set -o nounset - cd "${install_dir}" + # Read the "Note" section in https://docs.weblate.org/en/weblate-5.3/admin/install/venv-debian.html#python-modules + ynh_exec_warn_less pip install install --force-reinstall --no-binary :all: cffi - sudo --user=$app $install_dir/venv/bin/pip install --upgrade pip setuptools wheel pkgconfig xxhash + ynh_exec_warn_less pip install Weblate=="$(ynh_app_upstream_version)" - # Read the "Note" section in https://docs.weblate.org/en/weblate-4.11/admin/install/venv-debian.html#python-modules - sudo --user=$app $install_dir/venv/bin/pip install --force-reinstall --no-binary :all: cffi - # Still needed with latest version of weblate? - sudo --user=$app $install_dir/venv/bin/pip install --upgrade Weblate=="$new_version" - sudo --user=$app $install_dir/venv/bin/pip install psycopg2-binary ruamel.yaml aeidon phply - #pip install pytz python-bidi PyYaML Babel pyuca pylibravatar py3dns psycopg2-binary phply django-redis hiredis aeidon ruamel.yaml - # specific to YunoHost package: - sudo --user=$app $install_dir/venv/bin/pip install django_sendmail_backend - ) + ynh_exec_warn_less pip install psycopg2-binary ruamel.yaml aeidon phply + + # specific to YunoHost package: + ynh_exec_warn_less pip install django_sendmail_backend + +popd #================================================= # MODIFY A CONFIG FILE @@ -165,25 +159,23 @@ upgrade() { ynh_systemd_action --service_name="$app-celery" --action="start" - ( - set +o nounset - source "${install_dir}/venv/bin/activate" - set -o nounset - export DJANGO_SETTINGS_MODULE="weblate.settings" - cd "${install_dir}" + export DJANGO_SETTINGS_MODULE="weblate.settings" - sudo --user=$app $install_dir/venv/bin/weblate migrate --noinput - sudo --user=$app $install_dir/venv/bin/weblate collectstatic --noinput - sudo --user=$app $install_dir/venv/bin/weblate setuplang - sudo --user=$app $install_dir/venv/bin/weblate setupgroups - sudo --user=$app $install_dir/venv/bin/weblate compilemessages - - # Check the configuration - # This may fail in some cases with errors, etc., but the app works and the user can fix issues later. - if [ "$new_version" == "$(ynh_app_upstream_version)" ]; then - sudo --user=$app $install_dir/venv/bin/weblate check --deploy || true - fi - ) + ynh_exec_warn_less $install_dir/venv/bin/weblate migrate --noinput + + ynh_exec_warn_less $install_dir/venv/bin/weblate collectstatic --noinput + + ynh_exec_warn_less $install_dir/venv/bin/weblate setuplang + + ynh_exec_warn_less $install_dir/venv/bin/weblate setupgroups + + ynh_exec_warn_less $install_dir/venv/bin/weblate compilemessages + + # Check the configuration + # This may fail in some cases with errors, etc., but the app works and the user can fix issues later. + if [ "$new_version" == "$(ynh_app_upstream_version)" ]; then + ynh_exec_warn_less $install_dir/venv/bin/weblate check --deploy || true + fi ynh_systemd_action --service_name="$app-celery" --action="stop" } @@ -230,7 +222,7 @@ ynh_use_logrotate --non-append ynh_script_progression --message="Integrating service in YunoHost..." --weight=2 yunohost service add $app --log="/var/log/$app/weblate.log" -yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery-w1.log" +yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery.log" #================================================= # START SYSTEMD SERVICES @@ -238,7 +230,7 @@ yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery-w1.log" ynh_script_progression --message="Starting systemd services..." --weight=5 ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/weblate.log" --line_match="spawned uWSGI" -ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery-celery.log" --line_match="mingle: all alone" +ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery.log" --line_match="mingle: all alone" #================================================= # END OF SCRIPT From 238024d40131bb23f1f8b6be56e1262ab91b84a6 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Thu, 18 Jan 2024 21:41:52 +0100 Subject: [PATCH 17/81] add python3-venv to dependencies --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index a08ad00..ea13997 100644 --- a/manifest.toml +++ b/manifest.toml @@ -91,7 +91,7 @@ ram.runtime = "3G" [resources.apt] #first § = weblate dependecies, second § = borgbackup dependencies - packages = "libxml2-dev, libxslt-dev, libfreetype6-dev, libjpeg-dev, libz-dev, libyaml-dev, libffi-dev, libcairo-dev, gir1.2-pango-1.0, libgirepository1.0-dev, libacl1-dev, libssl-dev, libpq-dev, libjpeg62-turbo-dev, build-essential, python3-gdbm, python3-dev, python3-pip, python3-virtualenv, virtualenv, git, uwsgi, uwsgi-plugin-python3, redis-server, postgresql, postgresql-contrib, hub" + packages = "libxml2-dev, libxslt-dev, libfreetype6-dev, libjpeg-dev, libz-dev, libyaml-dev, libffi-dev, libcairo-dev, gir1.2-pango-1.0, libgirepository1.0-dev, libacl1-dev, libssl-dev, libpq-dev, libjpeg62-turbo-dev, build-essential, python3-gdbm, python3-dev, python3-pip, python3-venv, python3-virtualenv, virtualenv, git, uwsgi, uwsgi-plugin-python3, redis-server, postgresql, postgresql-contrib, hub" #libacl1-dev, libacl1, libssl-dev, liblz4-dev, libzstd-dev, libxxhash-dev, build-essential, pkg-config, python3-pkgconfig" From a3079a36128ccf51ec3b74c56a40bf2743b7dcf0 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Thu, 18 Jan 2024 21:50:37 +0100 Subject: [PATCH 18/81] add pip yaml --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index bd0d1f7..53f290c 100755 --- a/scripts/install +++ b/scripts/install @@ -94,7 +94,7 @@ ynh_script_progression --message="Install weblate using PIP..." --weight=5 pushd $install_dir python3 -m venv $install_dir/venv source $install_dir/venv/bin/activate - ynh_exec_warn_less pip install --upgrade pip setuptools wheel pkgconfig xxhash + ynh_exec_warn_less pip install --upgrade pip setuptools wheel yaml pkgconfig xxhash # Read the "Note" section in https://docs.weblate.org/en/weblate-5.3/admin/install/venv-debian.html#python-modules ynh_exec_warn_less pip install install --force-reinstall --no-binary :all: cffi From b75f4fb63b5b7ab5ddc4dc3ec5eb2c7a3e4584e8 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Thu, 18 Jan 2024 21:51:27 +0100 Subject: [PATCH 19/81] add pip yaml --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index a839640..0a91b62 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -118,7 +118,7 @@ ynh_script_progression --message="Install weblate using PIP..." --weight=5 pushd $install_dir python3 -m venv $install_dir/venv source $install_dir/venv/bin/activate - ynh_exec_warn_less pip install --upgrade pip setuptools wheel pkgconfig xxhash + ynh_exec_warn_less pip install --upgrade pip setuptools wheel yaml pkgconfig xxhash # Read the "Note" section in https://docs.weblate.org/en/weblate-5.3/admin/install/venv-debian.html#python-modules ynh_exec_warn_less pip install install --force-reinstall --no-binary :all: cffi From f5b4d8eddacd23546f35951dc1759f68be47ef5d Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Thu, 18 Jan 2024 21:58:29 +0100 Subject: [PATCH 20/81] typo --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 53f290c..1fc847a 100755 --- a/scripts/install +++ b/scripts/install @@ -94,7 +94,7 @@ ynh_script_progression --message="Install weblate using PIP..." --weight=5 pushd $install_dir python3 -m venv $install_dir/venv source $install_dir/venv/bin/activate - ynh_exec_warn_less pip install --upgrade pip setuptools wheel yaml pkgconfig xxhash + ynh_exec_warn_less pip install --upgrade pip setuptools wheel toml pyyaml kgconfig xxhash # Read the "Note" section in https://docs.weblate.org/en/weblate-5.3/admin/install/venv-debian.html#python-modules ynh_exec_warn_less pip install install --force-reinstall --no-binary :all: cffi From 59454f1884188f7dfea4348399c3789da565b8c6 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Thu, 18 Jan 2024 21:59:07 +0100 Subject: [PATCH 21/81] typo --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 0a91b62..6839fb1 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -118,7 +118,7 @@ ynh_script_progression --message="Install weblate using PIP..." --weight=5 pushd $install_dir python3 -m venv $install_dir/venv source $install_dir/venv/bin/activate - ynh_exec_warn_less pip install --upgrade pip setuptools wheel yaml pkgconfig xxhash + ynh_exec_warn_less pip install --upgrade pip setuptools wheel toml pyyaml pkgconfig xxhash # Read the "Note" section in https://docs.weblate.org/en/weblate-5.3/admin/install/venv-debian.html#python-modules ynh_exec_warn_less pip install install --force-reinstall --no-binary :all: cffi From a6ee123bae37fdc0c0c0aeaffcd06b8bf1c7ac52 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Thu, 18 Jan 2024 22:03:58 +0100 Subject: [PATCH 22/81] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 1fc847a..5d65981 100755 --- a/scripts/install +++ b/scripts/install @@ -94,7 +94,7 @@ ynh_script_progression --message="Install weblate using PIP..." --weight=5 pushd $install_dir python3 -m venv $install_dir/venv source $install_dir/venv/bin/activate - ynh_exec_warn_less pip install --upgrade pip setuptools wheel toml pyyaml kgconfig xxhash + ynh_exec_warn_less pip install --upgrade pip setuptools wheel toml pyyaml xxhash # Read the "Note" section in https://docs.weblate.org/en/weblate-5.3/admin/install/venv-debian.html#python-modules ynh_exec_warn_less pip install install --force-reinstall --no-binary :all: cffi From 6094b3d3cc3a995c24ca908587770412b22d714e Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Thu, 18 Jan 2024 22:30:25 +0100 Subject: [PATCH 23/81] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 5d65981..e4493f9 100755 --- a/scripts/install +++ b/scripts/install @@ -99,7 +99,7 @@ pushd $install_dir # Read the "Note" section in https://docs.weblate.org/en/weblate-5.3/admin/install/venv-debian.html#python-modules ynh_exec_warn_less pip install install --force-reinstall --no-binary :all: cffi - ynh_exec_warn_less pip install Weblate=="$(ynh_app_upstream_version)" + ynh_exec_warn_less pip install Weblate[all]=="$(ynh_app_upstream_version)" ynh_exec_warn_less pip install psycopg2-binary ruamel.yaml aeidon phply From 91f3abca55ee55a08db1b1339621c90f190381eb Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 07:33:46 +0100 Subject: [PATCH 24/81] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index e4493f9..5d65981 100755 --- a/scripts/install +++ b/scripts/install @@ -99,7 +99,7 @@ pushd $install_dir # Read the "Note" section in https://docs.weblate.org/en/weblate-5.3/admin/install/venv-debian.html#python-modules ynh_exec_warn_less pip install install --force-reinstall --no-binary :all: cffi - ynh_exec_warn_less pip install Weblate[all]=="$(ynh_app_upstream_version)" + ynh_exec_warn_less pip install Weblate=="$(ynh_app_upstream_version)" ynh_exec_warn_less pip install psycopg2-binary ruamel.yaml aeidon phply From 9e9ee7cb8add32fd0c7f38f11cd9afa5f32a597e Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 08:22:14 +0100 Subject: [PATCH 25/81] Update install --- scripts/install | 64 ++++++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/scripts/install b/scripts/install index 5d65981..ae5bc85 100755 --- a/scripts/install +++ b/scripts/install @@ -89,34 +89,38 @@ fi #================================================= # PIP INSTALLATION #================================================= -ynh_script_progression --message="Install weblate using PIP..." --weight=5 +ynh_script_progression --message="Install weblate using PIP..." --weight=80 -pushd $install_dir - python3 -m venv $install_dir/venv - source $install_dir/venv/bin/activate - ynh_exec_warn_less pip install --upgrade pip setuptools wheel toml pyyaml xxhash +virtualenv --python=python3 "${install_dir}/venv" +chown -R $app: "$install_dir" - # Read the "Note" section in https://docs.weblate.org/en/weblate-5.3/admin/install/venv-debian.html#python-modules - ynh_exec_warn_less pip install install --force-reinstall --no-binary :all: cffi +#run source in a 'sub shell' +( + set +o nounset + source "${install_dir}/venv/bin/activate" + set -o nounset + cd "${install_dir}" - ynh_exec_warn_less pip install Weblate=="$(ynh_app_upstream_version)" - - ynh_exec_warn_less pip install psycopg2-binary ruamel.yaml aeidon phply + sudo --user=$app $install_dir/venv/bin/pip install --upgrade pip setuptools wheel pkgconfig xxhash + # Read the "Note" section in https://docs.weblate.org/en/weblate-4.11/admin/install/venv-debian.html#python-modules + sudo --user=$app $install_dir/venv/bin/pip install --force-reinstall --no-binary :all: cffi + # Still needed with latest version of weblate? + sudo --user=$app BORG_OPENSSL_PREFIX=/usr/lib/x86_64-linux-gnu/ $install_dir/venv/bin/pip install Weblate=="$(ynh_app_upstream_version)" + sudo --user=$app $install_dir/venv/bin/pip install psycopg2-binary ruamel.yaml aeidon phply + #pip install pytz python-bidi PyYaML Babel pyuca pylibravatar py3dns psycopg2-binary phply django-redis hiredis aeidon ruamel.yaml + # specific to YunoHost package: - ynh_exec_warn_less pip install django_sendmail_backend - -popd + sudo --user=$app $install_dir/venv/bin/pip install django_sendmail_backend +) #================================================= # ADD A CONFIGURATION #================================================= ynh_script_progression --message="Adding a configuration file..." --weight=1 -# Configure redis redis_db=$(ynh_redis_get_free_db) -ynh_app_setting_set --app="$app" --key=redis_db --value="$redis_db" - +ynh_app_setting_set --app=$app --key=redis_db --value="$redis_db" path="${path%/}" settings="$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" @@ -142,20 +146,26 @@ chown -R "$app:www-data" "$install_dir/data" #========================================== ynh_script_progression --message="Filling up the database..." --weight=10 -export DJANGO_SETTINGS_MODULE="weblate.settings" +( + set +o nounset + source "${install_dir}/venv/bin/activate" + set -o nounset + export DJANGO_SETTINGS_MODULE="weblate.settings" + cd "${install_dir}" -ynh_exec_warn_less $install_dir/venv/bin/weblate migrate --noinput - -ynh_exec_warn_less $install_dir/venv/bin/weblate collectstatic --noinput - -ynh_exec_warn_less $install_dir/venv/bin/weblate createadmin --no-color \ + # the user needs to be weblate for postgresql + ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate migrate --noinput + # generate static files + ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate collectstatic --noinput + ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate createadmin --no-color \ --password "$password" \ --username "$admin" \ --email "$admin_mail" -# Check the configuration -# This may fail in some cases with errors, etc., but the app works and the user can fix issues later. -ynh_exec_warn_less $install_dir/venv/bin/weblate check --deploy || true + # Check the configuration + # This may fail in some cases with errors, etc., but the app works and the user can fix issues later. + ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate check --deploy || true +) #================================================= # SETUP SYSTEMD @@ -181,7 +191,7 @@ ynh_use_logrotate --non-append ynh_script_progression --message="Integrating service in YunoHost..." --weight=3 yunohost service add $app --log="/var/log/$app/weblate.log" -yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery.log" +yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery-w1.log" #================================================= # START SYSTEMD SERVICE @@ -189,7 +199,7 @@ yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery.log" ynh_script_progression --message="Starting a systemd service..." --weight=5 ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/weblate.log" --line_match="spawned uWSGI" -ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery.log" --line_match="mingle: all alone" +ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery-celery.log" --line_match="mingle: all alone" #================================================= # END OF SCRIPT From 7eb3e8350b08000afd6d7a485085c704182429cd Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 08:23:09 +0100 Subject: [PATCH 26/81] Revert to old install/upgrade --- scripts/upgrade | 78 +++++++++++++++++++++++++++---------------------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 6839fb1..2c0b395 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -110,27 +110,33 @@ ynh_add_systemd_config --service="$app-celery" --template="celery-weblate.servic upgrade() { new_version=$1 settings_template=$2 -#================================================= -# PIP INSTALLATION -#================================================= -ynh_script_progression --message="Install weblate using PIP..." --weight=5 + #================================================= + # PIP INSTALLATION + #================================================= + ynh_script_progression --message="Install weblate using PIP..." --weight=15 -pushd $install_dir - python3 -m venv $install_dir/venv - source $install_dir/venv/bin/activate - ynh_exec_warn_less pip install --upgrade pip setuptools wheel toml pyyaml pkgconfig xxhash + ynh_secure_remove --file="${install_dir}/venv" + virtualenv --python=python3 "${install_dir}/venv" + chown -R $app: "$install_dir" - # Read the "Note" section in https://docs.weblate.org/en/weblate-5.3/admin/install/venv-debian.html#python-modules - ynh_exec_warn_less pip install install --force-reinstall --no-binary :all: cffi + #run source in a 'sub shell' + ( + set +o nounset + source "${install_dir}/venv/bin/activate" + set -o nounset + cd "${install_dir}" - ynh_exec_warn_less pip install Weblate=="$(ynh_app_upstream_version)" + sudo --user=$app $install_dir/venv/bin/pip install --upgrade pip setuptools wheel pkgconfig xxhash - ynh_exec_warn_less pip install psycopg2-binary ruamel.yaml aeidon phply - - # specific to YunoHost package: - ynh_exec_warn_less pip install django_sendmail_backend - -popd + # Read the "Note" section in https://docs.weblate.org/en/weblate-4.11/admin/install/venv-debian.html#python-modules + sudo --user=$app $install_dir/venv/bin/pip install --force-reinstall --no-binary :all: cffi + # Still needed with latest version of weblate? + sudo --user=$app $install_dir/venv/bin/pip install --upgrade Weblate=="$new_version" + sudo --user=$app $install_dir/venv/bin/pip install psycopg2-binary ruamel.yaml aeidon phply + #pip install pytz python-bidi PyYaML Babel pyuca pylibravatar py3dns psycopg2-binary phply django-redis hiredis aeidon ruamel.yaml + # specific to YunoHost package: + sudo --user=$app $install_dir/venv/bin/pip install django_sendmail_backend + ) #================================================= # MODIFY A CONFIG FILE @@ -159,23 +165,25 @@ popd ynh_systemd_action --service_name="$app-celery" --action="start" - export DJANGO_SETTINGS_MODULE="weblate.settings" + ( + set +o nounset + source "${install_dir}/venv/bin/activate" + set -o nounset + export DJANGO_SETTINGS_MODULE="weblate.settings" + cd "${install_dir}" - ynh_exec_warn_less $install_dir/venv/bin/weblate migrate --noinput - - ynh_exec_warn_less $install_dir/venv/bin/weblate collectstatic --noinput - - ynh_exec_warn_less $install_dir/venv/bin/weblate setuplang - - ynh_exec_warn_less $install_dir/venv/bin/weblate setupgroups - - ynh_exec_warn_less $install_dir/venv/bin/weblate compilemessages - - # Check the configuration - # This may fail in some cases with errors, etc., but the app works and the user can fix issues later. - if [ "$new_version" == "$(ynh_app_upstream_version)" ]; then - ynh_exec_warn_less $install_dir/venv/bin/weblate check --deploy || true - fi + sudo --user=$app $install_dir/venv/bin/weblate migrate --noinput + sudo --user=$app $install_dir/venv/bin/weblate collectstatic --noinput + sudo --user=$app $install_dir/venv/bin/weblate setuplang + sudo --user=$app $install_dir/venv/bin/weblate setupgroups + sudo --user=$app $install_dir/venv/bin/weblate compilemessages + + # Check the configuration + # This may fail in some cases with errors, etc., but the app works and the user can fix issues later. + if [ "$new_version" == "$(ynh_app_upstream_version)" ]; then + sudo --user=$app $install_dir/venv/bin/weblate check --deploy || true + fi + ) ynh_systemd_action --service_name="$app-celery" --action="stop" } @@ -222,7 +230,7 @@ ynh_use_logrotate --non-append ynh_script_progression --message="Integrating service in YunoHost..." --weight=2 yunohost service add $app --log="/var/log/$app/weblate.log" -yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery.log" +yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery-w1.log" #================================================= # START SYSTEMD SERVICES @@ -230,7 +238,7 @@ yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery.log" ynh_script_progression --message="Starting systemd services..." --weight=5 ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/weblate.log" --line_match="spawned uWSGI" -ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery.log" --line_match="mingle: all alone" +ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery-celery.log" --line_match="mingle: all alone" #================================================= # END OF SCRIPT From 9ea6179d8a09e1bb6be1b8d5536c0fce84dd8b20 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 08:27:45 +0100 Subject: [PATCH 27/81] Update restore --- scripts/restore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/restore b/scripts/restore index bf8586d..a96b12e 100755 --- a/scripts/restore +++ b/scripts/restore @@ -93,7 +93,7 @@ yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery.log" ynh_script_progression --message="Starting a systemd service..." --weight=5 ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/weblate.log" --line_match="spawned uWSGI" -ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery.log" --line_match="mingle: all alone" +ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery-w1.log" --line_match="mingle: all alone" #================================================= # GENERIC FINALIZATION From 1a77487d62321de99d62a106f295169d1595c88d Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 08:44:21 +0100 Subject: [PATCH 28/81] consistencies between variables --- conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index d595418..26d7a7c 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -26,7 +26,7 @@ location __PATH__/ { include uwsgi_params; # Needed for long running operations in admin interface uwsgi_read_timeout 3600; - uwsgi_pass unix:///var/run/__NAME__/socket; + uwsgi_pass unix:///var/run/__APP__/socket; # Include SSOWAT user panel. include conf.d/yunohost_panel.conf.inc; From 3740972942247761dc10a20ae3ef7a0d1b5628a8 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 14:22:05 +0100 Subject: [PATCH 29/81] Update uwsgi.ini --- conf/uwsgi.ini | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/conf/uwsgi.ini b/conf/uwsgi.ini index 38372c9..185fe30 100644 --- a/conf/uwsgi.ini +++ b/conf/uwsgi.ini @@ -3,9 +3,10 @@ plugins = python3 master = true protocol = uwsgi socket = /var/run/__APP__/socket +wsgi-file. = __INSTALL_DIR__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/wsgi.py # http://uwsgi-docs.readthedocs.io/en/latest/Nginx.html#hosting-multiple-apps-in-the-same-process-aka-managing-script-name-and-path-info -mount = __PATH__=__INSTALL_DIR__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/wsgi.py +#mount = __PATH__=__INSTALL_DIR__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/wsgi.py # Add path to Weblate checkout if you did not install # Weblate by pip @@ -49,4 +50,4 @@ chmod-socket = 666 # Do not log some errors caused by client disconnects ignore-sigpipe = true ignore-write-errors = true -disable-write-exception = true \ No newline at end of file +disable-write-exception = true From 9243ffb59ab0375a41e22922107e2978c4bc0522 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 14:30:13 +0100 Subject: [PATCH 30/81] Update restore --- scripts/restore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/restore b/scripts/restore index a96b12e..a8bdd34 100755 --- a/scripts/restore +++ b/scripts/restore @@ -85,7 +85,7 @@ ynh_restore_file --origin_path="/etc/logrotate.d/$app" ynh_script_progression --message="Integrating service in YunoHost..." --weight=3 yunohost service add $app --log="/var/log/$app/weblate.log" -yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery.log" +yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery-w1.log" #================================================= # START SYSTEMD SERVICE From d563f55990f2ca4a84fbbb6a121ac5e2dec136c7 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 14:45:25 +0100 Subject: [PATCH 31/81] typo --- conf/uwsgi.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/uwsgi.ini b/conf/uwsgi.ini index 185fe30..b7dcdd6 100644 --- a/conf/uwsgi.ini +++ b/conf/uwsgi.ini @@ -3,7 +3,7 @@ plugins = python3 master = true protocol = uwsgi socket = /var/run/__APP__/socket -wsgi-file. = __INSTALL_DIR__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/wsgi.py +wsgi-file = __INSTALL_DIR__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/wsgi.py # http://uwsgi-docs.readthedocs.io/en/latest/Nginx.html#hosting-multiple-apps-in-the-same-process-aka-managing-script-name-and-path-info #mount = __PATH__=__INSTALL_DIR__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/wsgi.py From 4d4b5a0a549f97daf7095e6d894fcab8fd301fc5 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 14:59:11 +0100 Subject: [PATCH 32/81] Add port --- conf/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/settings.py b/conf/settings.py index a10ce50..c0a4245 100644 --- a/conf/settings.py +++ b/conf/settings.py @@ -56,7 +56,7 @@ DATABASES = { # Set to empty string for localhost. "HOST": "127.0.0.1", # Set to empty string for default. - "PORT": "", + "PORT": "__PORT__", # Customizations for databases. "OPTIONS": { # In case of using an older MySQL server, From ec9a10b613affb2b3b6858c71e1b6ba3d63da37f Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 15:02:23 +0100 Subject: [PATCH 33/81] add port --- manifest.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/manifest.toml b/manifest.toml index ea13997..97e8ec5 100644 --- a/manifest.toml +++ b/manifest.toml @@ -89,6 +89,9 @@ ram.runtime = "3G" [resources.permissions] main.url = "/" + [resources.ports] + main.default = 8080 + [resources.apt] #first § = weblate dependecies, second § = borgbackup dependencies packages = "libxml2-dev, libxslt-dev, libfreetype6-dev, libjpeg-dev, libz-dev, libyaml-dev, libffi-dev, libcairo-dev, gir1.2-pango-1.0, libgirepository1.0-dev, libacl1-dev, libssl-dev, libpq-dev, libjpeg62-turbo-dev, build-essential, python3-gdbm, python3-dev, python3-pip, python3-venv, python3-virtualenv, virtualenv, git, uwsgi, uwsgi-plugin-python3, redis-server, postgresql, postgresql-contrib, hub" From 5f5707a5798a8627b5e1c6b2407cc495a0b76a41 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 15:04:22 +0100 Subject: [PATCH 34/81] Update uwsgi.ini --- conf/uwsgi.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/uwsgi.ini b/conf/uwsgi.ini index b7dcdd6..e7a5225 100644 --- a/conf/uwsgi.ini +++ b/conf/uwsgi.ini @@ -2,7 +2,7 @@ plugins = python3 master = true protocol = uwsgi -socket = /var/run/__APP__/socket +socket = 127.0.0.1:__PORT__ wsgi-file = __INSTALL_DIR__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/wsgi.py # http://uwsgi-docs.readthedocs.io/en/latest/Nginx.html#hosting-multiple-apps-in-the-same-process-aka-managing-script-name-and-path-info From 5c9309671ea236c44359e97bb7d6e21f63a0472f Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 15:05:54 +0100 Subject: [PATCH 35/81] 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 26d7a7c..dbdc8ae 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -26,7 +26,7 @@ location __PATH__/ { include uwsgi_params; # Needed for long running operations in admin interface uwsgi_read_timeout 3600; - uwsgi_pass unix:///var/run/__APP__/socket; + uwsgi_pass 127.0.0.1:__PORT__; # Include SSOWAT user panel. include conf.d/yunohost_panel.conf.inc; From 2aa534d82ce2dac9025db9e6386d5a18fa4639c4 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 15:16:14 +0100 Subject: [PATCH 36/81] Update settings.py --- conf/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/settings.py b/conf/settings.py index c0a4245..a10ce50 100644 --- a/conf/settings.py +++ b/conf/settings.py @@ -56,7 +56,7 @@ DATABASES = { # Set to empty string for localhost. "HOST": "127.0.0.1", # Set to empty string for default. - "PORT": "__PORT__", + "PORT": "", # Customizations for databases. "OPTIONS": { # In case of using an older MySQL server, From 96b86125d9bcfd0042aa1f5de2f255429e0dfded Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 19:14:31 +0100 Subject: [PATCH 37/81] some fixes --- conf/nginx.conf | 43 ++++++++++++++++++++----------------------- conf/uwsgi.ini | 9 ++------- 2 files changed, 22 insertions(+), 30 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index dbdc8ae..c84a5fe 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,32 +1,29 @@ #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; # https://github.com/WeblateOrg/weblate/blob/master/weblate/examples/weblate.nginx.conf -location = __PATH__/favicon.ico { - alias __INSTALL_DIR__/data/static/favicon.ico; - expires 30d; -} + location ~ ^__PATH__/favicon.ico$ { -location = __PATH__/robots.txt { - alias __INSTALL_DIR__/data/static/robots.txt; - expires 30d; -} + alias __INSTALL_DIR__/data/cache/static/favicon.ico; + expires 30d; + } -location __PATH__/static/ { - alias __INSTALL_DIR__/data/static/; - expires 30d; -} + location __PATH__/static/ { + alias __INSTALL_DIR__/data/cache/static/; + expires 30d; + } -location __PATH__/media/ { - alias __INSTALL_DIR__/data/media/; - expires 30d; -} + location __PATH__/media/ { + alias __INSTALL_DIR__/data/media/; + expires 30d; + } -location __PATH__/ { - alias __INSTALL_DIR__/ ; - - include uwsgi_params; - # Needed for long running operations in admin interface - uwsgi_read_timeout 3600; - uwsgi_pass 127.0.0.1:__PORT__; + location __PATH__/ { + include uwsgi_params; + # Needed for long running operations in admin interface + uwsgi_read_timeout 3600; + # Adjust based to uwsgi configuration: + uwsgi_pass unix:///run/uwsgi/app/weblate/socket; + # uwsgi_pass 127.0.0.1:8080; + # Include SSOWAT user panel. include conf.d/yunohost_panel.conf.inc; diff --git a/conf/uwsgi.ini b/conf/uwsgi.ini index e7a5225..6019dbf 100644 --- a/conf/uwsgi.ini +++ b/conf/uwsgi.ini @@ -2,12 +2,9 @@ plugins = python3 master = true protocol = uwsgi -socket = 127.0.0.1:__PORT__ +socket = 127.0.0.1:8080 wsgi-file = __INSTALL_DIR__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/wsgi.py -# http://uwsgi-docs.readthedocs.io/en/latest/Nginx.html#hosting-multiple-apps-in-the-same-process-aka-managing-script-name-and-path-info -#mount = __PATH__=__INSTALL_DIR__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/wsgi.py - # Add path to Weblate checkout if you did not install # Weblate by pip # python-path = /path/to/weblate @@ -37,8 +34,6 @@ umask = 0022 uid = __APP__ gid = __APP__ -chmod-socket = 666 - # Enable harakiri mode (kill requests after some time) # harakiri = 3600 # harakiri-verbose = true @@ -50,4 +45,4 @@ chmod-socket = 666 # Do not log some errors caused by client disconnects ignore-sigpipe = true ignore-write-errors = true -disable-write-exception = true +disable-write-exception = true \ No newline at end of file From 97997e2bc0d04afaf37d0c812aaea98430ae6385 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 19:26:01 +0100 Subject: [PATCH 38/81] fix nginx --- conf/nginx.conf | 2 +- conf/uwsgi.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index c84a5fe..8ad3d15 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -21,7 +21,7 @@ # Needed for long running operations in admin interface uwsgi_read_timeout 3600; # Adjust based to uwsgi configuration: - uwsgi_pass unix:///run/uwsgi/app/weblate/socket; + uwsgi_pass unix:////var/run/__APP__/socket # uwsgi_pass 127.0.0.1:8080; diff --git a/conf/uwsgi.ini b/conf/uwsgi.ini index 6019dbf..f9fb39b 100644 --- a/conf/uwsgi.ini +++ b/conf/uwsgi.ini @@ -2,7 +2,7 @@ plugins = python3 master = true protocol = uwsgi -socket = 127.0.0.1:8080 +socket = /var/run/__APP__/socket wsgi-file = __INSTALL_DIR__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/wsgi.py # Add path to Weblate checkout if you did not install From 3de67cbe4d18564d879f5a5da5863339a19420f1 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 19:31:50 +0100 Subject: [PATCH 39/81] test --- conf/uwsgi.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/uwsgi.ini b/conf/uwsgi.ini index f9fb39b..9420bb8 100644 --- a/conf/uwsgi.ini +++ b/conf/uwsgi.ini @@ -3,7 +3,7 @@ plugins = python3 master = true protocol = uwsgi socket = /var/run/__APP__/socket -wsgi-file = __INSTALL_DIR__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/wsgi.py +wsgi-file = /etc/uwsgi/apps-available/__APP__.ini # Add path to Weblate checkout if you did not install # Weblate by pip From 16ff497a963bfe3934e8c203b7f318d3f0040865 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 19:32:48 +0100 Subject: [PATCH 40/81] fix nginx --- conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 8ad3d15..3c7026b 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -21,7 +21,7 @@ # Needed for long running operations in admin interface uwsgi_read_timeout 3600; # Adjust based to uwsgi configuration: - uwsgi_pass unix:////var/run/__APP__/socket + uwsgi_pass unix:///var/run/__APP__/socket # uwsgi_pass 127.0.0.1:8080; From f7b1b5d3fa4de79c30be0e1a11dfc0d1fa448b79 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 19:32:55 +0100 Subject: [PATCH 41/81] re --- conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 3c7026b..295694f 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -21,7 +21,7 @@ # Needed for long running operations in admin interface uwsgi_read_timeout 3600; # Adjust based to uwsgi configuration: - uwsgi_pass unix:///var/run/__APP__/socket + uwsgi_pass unix:///var/run/__APP__/socket; # uwsgi_pass 127.0.0.1:8080; From 473765263f5dae92a66edbb9147b729d3fd10245 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 19:47:21 +0100 Subject: [PATCH 42/81] fix --- conf/uwsgi.ini | 2 +- scripts/install | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/uwsgi.ini b/conf/uwsgi.ini index 9420bb8..56b1bab 100644 --- a/conf/uwsgi.ini +++ b/conf/uwsgi.ini @@ -3,7 +3,7 @@ plugins = python3 master = true protocol = uwsgi socket = /var/run/__APP__/socket -wsgi-file = /etc/uwsgi/apps-available/__APP__.ini +wsgi-file = __INSTALL_DIR__/venv/lib/$weblate_pypath/site-packages/weblate/__APP__.ini # Add path to Weblate checkout if you did not install # Weblate by pip diff --git a/scripts/install b/scripts/install index ae5bc85..02fd61c 100755 --- a/scripts/install +++ b/scripts/install @@ -128,7 +128,7 @@ set_forge_variables ynh_add_config --template="../conf/settings.py" --destination="$settings" ynh_add_config --template="../conf/celery-weblate" --destination="$install_dir/celery-weblate" -ynh_add_config --template="../conf/uwsgi.ini" --destination="/etc/uwsgi/apps-available/$app.ini" +ynh_add_config --template="../conf/uwsgi.ini" --destination="$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/$app.ini" touch "$install_dir/local_settings.py" ln -sf "$install_dir/local_settings.py" "$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/local_settings.py" From b90b518b172ca7497b10a5446e3c9a29bcdc6aa0 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 19:58:02 +0100 Subject: [PATCH 43/81] fix uwsgi dir --- conf/weblate.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/weblate.service b/conf/weblate.service index 6ffe8df..7533c72 100644 --- a/conf/weblate.service +++ b/conf/weblate.service @@ -15,7 +15,7 @@ RuntimeDirectory=__APP__ ExecStartPre=/bin/chown -R __APP__ /var/log/__APP__ ExecStart=/usr/bin/uwsgi \ - --ini /etc/uwsgi/apps-available/__APP__.ini \ + --ini __INSTALL_DIR__/venv/lib/$weblate_pypath/site-packages/weblate/__APP__.ini \ --logto /var/log/__APP__/weblate.log From 3ef8ed2b9989e9089c3d63fe6018e9eb3f560377 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 19 Jan 2024 20:24:41 +0100 Subject: [PATCH 44/81] fix variable --- conf/weblate.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/weblate.service b/conf/weblate.service index 7533c72..a3a2f13 100644 --- a/conf/weblate.service +++ b/conf/weblate.service @@ -15,7 +15,7 @@ RuntimeDirectory=__APP__ ExecStartPre=/bin/chown -R __APP__ /var/log/__APP__ ExecStart=/usr/bin/uwsgi \ - --ini __INSTALL_DIR__/venv/lib/$weblate_pypath/site-packages/weblate/__APP__.ini \ + --ini __INSTALL_DIR__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/__APP__.ini \ --logto /var/log/__APP__/weblate.log From 5c11d671596f3b99c572b5e7647f1aa02f74d443 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Sat, 20 Jan 2024 09:37:11 +0100 Subject: [PATCH 45/81] test --- conf/uwsgi.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/uwsgi.ini b/conf/uwsgi.ini index 56b1bab..ef9d34c 100644 --- a/conf/uwsgi.ini +++ b/conf/uwsgi.ini @@ -2,7 +2,7 @@ plugins = python3 master = true protocol = uwsgi -socket = /var/run/__APP__/socket +socket = 127.0.0.1:8080 wsgi-file = __INSTALL_DIR__/venv/lib/$weblate_pypath/site-packages/weblate/__APP__.ini # Add path to Weblate checkout if you did not install From eca120a3114ce9c31811cd9f5682ca597a8a031b Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Sat, 20 Jan 2024 09:46:18 +0100 Subject: [PATCH 46/81] test --- conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 295694f..7eba942 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -21,7 +21,7 @@ # Needed for long running operations in admin interface uwsgi_read_timeout 3600; # Adjust based to uwsgi configuration: - uwsgi_pass unix:///var/run/__APP__/socket; + uwsgi_pass 127.0.0.1:8080; # uwsgi_pass 127.0.0.1:8080; From 2dd9da90332d6a148b469163c22ab5caa9aab8b4 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Sat, 20 Jan 2024 10:59:49 +0100 Subject: [PATCH 47/81] revert --- conf/nginx.conf | 2 +- conf/weblate.service | 2 +- scripts/install | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 7eba942..4e226ab 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -21,7 +21,7 @@ # Needed for long running operations in admin interface uwsgi_read_timeout 3600; # Adjust based to uwsgi configuration: - uwsgi_pass 127.0.0.1:8080; + uwsgi_pass unix:///var/run/__NAME__/socket; # uwsgi_pass 127.0.0.1:8080; diff --git a/conf/weblate.service b/conf/weblate.service index a3a2f13..6ffe8df 100644 --- a/conf/weblate.service +++ b/conf/weblate.service @@ -15,7 +15,7 @@ RuntimeDirectory=__APP__ ExecStartPre=/bin/chown -R __APP__ /var/log/__APP__ ExecStart=/usr/bin/uwsgi \ - --ini __INSTALL_DIR__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/__APP__.ini \ + --ini /etc/uwsgi/apps-available/__APP__.ini \ --logto /var/log/__APP__/weblate.log diff --git a/scripts/install b/scripts/install index 02fd61c..77213da 100755 --- a/scripts/install +++ b/scripts/install @@ -128,7 +128,7 @@ set_forge_variables ynh_add_config --template="../conf/settings.py" --destination="$settings" ynh_add_config --template="../conf/celery-weblate" --destination="$install_dir/celery-weblate" -ynh_add_config --template="../conf/uwsgi.ini" --destination="$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/$app.ini" +ynh_add_config --template="../conf/uwsgi.ini" --destination="/etc/uwsgi/apps-available//$app.ini" touch "$install_dir/local_settings.py" ln -sf "$install_dir/local_settings.py" "$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/local_settings.py" From 46a35fa941e4f8669d57f4efc10f6ade7ba55980 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Sat, 20 Jan 2024 11:13:46 +0100 Subject: [PATCH 48/81] fix variable --- conf/uwsgi.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/uwsgi.ini b/conf/uwsgi.ini index ef9d34c..d4f13d7 100644 --- a/conf/uwsgi.ini +++ b/conf/uwsgi.ini @@ -3,7 +3,7 @@ plugins = python3 master = true protocol = uwsgi socket = 127.0.0.1:8080 -wsgi-file = __INSTALL_DIR__/venv/lib/$weblate_pypath/site-packages/weblate/__APP__.ini +wsgi-file = __INSTALL_DIR__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/__APP__.ini # Add path to Weblate checkout if you did not install # Weblate by pip From 1278330dd4c3875508d05406af5087ed331e0780 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Sat, 20 Jan 2024 11:26:29 +0100 Subject: [PATCH 49/81] revert part 2 --- conf/nginx.conf | 2 +- conf/uwsgi.ini | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 4e226ab..295694f 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -21,7 +21,7 @@ # Needed for long running operations in admin interface uwsgi_read_timeout 3600; # Adjust based to uwsgi configuration: - uwsgi_pass unix:///var/run/__NAME__/socket; + uwsgi_pass unix:///var/run/__APP__/socket; # uwsgi_pass 127.0.0.1:8080; diff --git a/conf/uwsgi.ini b/conf/uwsgi.ini index d4f13d7..dd05900 100644 --- a/conf/uwsgi.ini +++ b/conf/uwsgi.ini @@ -2,8 +2,11 @@ plugins = python3 master = true protocol = uwsgi -socket = 127.0.0.1:8080 -wsgi-file = __INSTALL_DIR__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/__APP__.ini +socket = /var/run/__APP__/socket + +# http://uwsgi-docs.readthedocs.io/en/latest/Nginx.html#hosting-multiple-apps-in-the-same-process-aka-managing-script-name-and-path-info +mount = __PATH__=__INSTALL_DIR__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/wsgi.py + # Add path to Weblate checkout if you did not install # Weblate by pip From 8565546fca272054c508c7c020220b7ab4bdddce Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Sat, 20 Jan 2024 11:41:56 +0100 Subject: [PATCH 50/81] fix --- conf/settings.py | 2 +- scripts/restore | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/conf/settings.py b/conf/settings.py index a10ce50..5534292 100644 --- a/conf/settings.py +++ b/conf/settings.py @@ -79,7 +79,7 @@ DATABASES = { # Data directory, you can use following for the development purposes: # os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "data") -DATA_DIR = "__INSTALL_DIR__/" +DATA_DIR = "__INSTALL_DIR__/data" CACHE_DIR = f"{DATA_DIR}/cache" # Local time zone for this installation. Choices can be found here: diff --git a/scripts/restore b/scripts/restore index a8bdd34..0263875 100755 --- a/scripts/restore +++ b/scripts/restore @@ -38,7 +38,6 @@ ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= ynh_script_progression --message="Restoring the PostgreSQL database..." --weight=5 -ynh_psql_execute_as_root --sql="CREATE EXTENSION IF NOT EXISTS pg_trgm;" --database=$db_name ynh_psql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./db.sql #================================================= From c93a700a428cd532ef43ae88a5c097fa35bae249 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Sat, 20 Jan 2024 11:55:04 +0100 Subject: [PATCH 51/81] fix standarderror --- conf/weblate.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/weblate.service b/conf/weblate.service index 6ffe8df..bf30598 100644 --- a/conf/weblate.service +++ b/conf/weblate.service @@ -22,7 +22,7 @@ ExecStart=/usr/bin/uwsgi \ Restart=on-failure KillSignal=SIGQUIT Type=notify -StandardError=syslog +StandardError=inherit NotifyAccess=all [Install] From 6262b5dbde857af6a59df7d60a1b1941586cce47 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Sat, 20 Jan 2024 12:13:06 +0100 Subject: [PATCH 52/81] fix permissions --- conf/uwsgi.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/uwsgi.ini b/conf/uwsgi.ini index dd05900..23259ec 100644 --- a/conf/uwsgi.ini +++ b/conf/uwsgi.ini @@ -37,6 +37,8 @@ umask = 0022 uid = __APP__ gid = __APP__ +chmod-socket = 666 + # Enable harakiri mode (kill requests after some time) # harakiri = 3600 # harakiri-verbose = true From 106d86a266848d280b9458c6b62213e8138848fa Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Sat, 20 Jan 2024 18:50:59 +0100 Subject: [PATCH 53/81] fix nginx since settings changes --- conf/nginx.conf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 295694f..a0b66e9 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -2,17 +2,17 @@ # https://github.com/WeblateOrg/weblate/blob/master/weblate/examples/weblate.nginx.conf location ~ ^__PATH__/favicon.ico$ { - alias __INSTALL_DIR__/data/cache/static/favicon.ico; + alias __INSTALL_DIR__/cache/static/favicon.ico; expires 30d; } location __PATH__/static/ { - alias __INSTALL_DIR__/data/cache/static/; + alias __INSTALL_DIR__/cache/static/; expires 30d; } location __PATH__/media/ { - alias __INSTALL_DIR__/data/media/; + alias __INSTALL_DIR__/media/; expires 30d; } From 0fa37332852bcdc12d751ad3b1c479ac074b9ade Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Sat, 20 Jan 2024 18:59:33 +0100 Subject: [PATCH 54/81] fix nginx --- conf/nginx.conf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/conf/nginx.conf b/conf/nginx.conf index a0b66e9..2925a33 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -17,6 +17,9 @@ } location __PATH__/ { + + alias __INSTALL_DIR__/; + include uwsgi_params; # Needed for long running operations in admin interface uwsgi_read_timeout 3600; From c3997adf3126f5f06bb1c404045278647aa27040 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Sat, 20 Jan 2024 19:25:40 +0100 Subject: [PATCH 55/81] fix path --- scripts/install | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index 77213da..bf05f9f 100755 --- a/scripts/install +++ b/scripts/install @@ -109,7 +109,7 @@ chown -R $app: "$install_dir" sudo --user=$app BORG_OPENSSL_PREFIX=/usr/lib/x86_64-linux-gnu/ $install_dir/venv/bin/pip install Weblate=="$(ynh_app_upstream_version)" sudo --user=$app $install_dir/venv/bin/pip install psycopg2-binary ruamel.yaml aeidon phply #pip install pytz python-bidi PyYaML Babel pyuca pylibravatar py3dns psycopg2-binary phply django-redis hiredis aeidon ruamel.yaml - + # specific to YunoHost package: sudo --user=$app $install_dir/venv/bin/pip install django_sendmail_backend ) @@ -128,7 +128,7 @@ set_forge_variables ynh_add_config --template="../conf/settings.py" --destination="$settings" ynh_add_config --template="../conf/celery-weblate" --destination="$install_dir/celery-weblate" -ynh_add_config --template="../conf/uwsgi.ini" --destination="/etc/uwsgi/apps-available//$app.ini" +ynh_add_config --template="../conf/uwsgi.ini" --destination="/etc/uwsgi/apps-available/$app.ini" touch "$install_dir/local_settings.py" ln -sf "$install_dir/local_settings.py" "$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/local_settings.py" From 426256b7fa07f65e124a867cd260e3c8e3888be9 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Sun, 21 Jan 2024 09:09:51 +0100 Subject: [PATCH 56/81] some fixes --- conf/settings.py | 2 +- manifest.toml | 4 +--- scripts/install | 2 +- tests.toml | 2 ++ 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/conf/settings.py b/conf/settings.py index 5534292..364566a 100644 --- a/conf/settings.py +++ b/conf/settings.py @@ -860,7 +860,7 @@ SILENCED_SYSTEM_CHECKS = [ # CELERY_TASK_EAGER_PROPAGATES = True # Celery worker configuration for production CELERY_TASK_ALWAYS_EAGER = False -CELERY_BROKER_URL = "redis://127.0.0.1:6379" +CELERY_BROKER_URL = "redis://127.0.0.1:6379/__REDIS_DB__" CELERY_RESULT_BACKEND = CELERY_BROKER_URL # Celery settings, it is not recommended to change these diff --git a/manifest.toml b/manifest.toml index 97e8ec5..908a943 100644 --- a/manifest.toml +++ b/manifest.toml @@ -94,9 +94,7 @@ ram.runtime = "3G" [resources.apt] #first § = weblate dependecies, second § = borgbackup dependencies - packages = "libxml2-dev, libxslt-dev, libfreetype6-dev, libjpeg-dev, libz-dev, libyaml-dev, libffi-dev, libcairo-dev, gir1.2-pango-1.0, libgirepository1.0-dev, libacl1-dev, libssl-dev, libpq-dev, libjpeg62-turbo-dev, build-essential, python3-gdbm, python3-dev, python3-pip, python3-venv, python3-virtualenv, virtualenv, git, uwsgi, uwsgi-plugin-python3, redis-server, postgresql, postgresql-contrib, hub" - - #libacl1-dev, libacl1, libssl-dev, liblz4-dev, libzstd-dev, libxxhash-dev, build-essential, pkg-config, python3-pkgconfig" + packages = "libxml2-dev, libxslt-dev, libfreetype6-dev, libjpeg-dev, libz-dev, libyaml-dev, libffi-dev, libcairo-dev, gir1.2-pango-1.0, libgirepository1.0-dev, libacl1-dev, libssl-dev, libpq-dev, libjpeg62-turbo-dev, build-essential, python3-gdbm, python3-dev, python3-pip, python3-venv, python3-virtualenv, virtualenv, git, uwsgi, uwsgi-plugin-python3, redis-server, postgresql, postgresql-contrib, hub, libacl1-dev, libacl1, libssl-dev, liblz4-dev, libzstd-dev, libxxhash-dev, build-essential, pkg-config, python3-pkgconfig" [resources.database] type = "postgresql" diff --git a/scripts/install b/scripts/install index bf05f9f..b3d66b0 100755 --- a/scripts/install +++ b/scripts/install @@ -101,7 +101,7 @@ chown -R $app: "$install_dir" set -o nounset cd "${install_dir}" - sudo --user=$app $install_dir/venv/bin/pip install --upgrade pip setuptools wheel pkgconfig xxhash + sudo --user=$app $install_dir/venv/bin/pip install --upgrade pip setuptools wheel pkgconfig xxhash # Read the "Note" section in https://docs.weblate.org/en/weblate-4.11/admin/install/venv-debian.html#python-modules sudo --user=$app $install_dir/venv/bin/pip install --force-reinstall --no-binary :all: cffi diff --git a/tests.toml b/tests.toml index 82dcc43..40788e5 100644 --- a/tests.toml +++ b/tests.toml @@ -16,4 +16,6 @@ test_format = 1.0 # Commits to test upgrade from # ------------------------------- + test_upgrade_from.2749e7b.name = "0.5.3 - packaging v1" + \ No newline at end of file From ba8b7468af911fee70e2dcbc4056f5b77fe06e76 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Sun, 21 Jan 2024 12:21:47 +0100 Subject: [PATCH 57/81] fix --- conf/nginx.conf | 6 +++--- scripts/install | 9 +++++++-- tests.toml | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 2925a33..d8ae4c2 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -2,17 +2,17 @@ # https://github.com/WeblateOrg/weblate/blob/master/weblate/examples/weblate.nginx.conf location ~ ^__PATH__/favicon.ico$ { - alias __INSTALL_DIR__/cache/static/favicon.ico; + alias __INSTALL_DIR__/data/cache/static/favicon.ico; expires 30d; } location __PATH__/static/ { - alias __INSTALL_DIR__/cache/static/; + alias __INSTALL_DIR__/data/cache/static/; expires 30d; } location __PATH__/media/ { - alias __INSTALL_DIR__/media/; + alias __INSTALL_DIR__/data/media/; expires 30d; } diff --git a/scripts/install b/scripts/install index b3d66b0..e6ceb0c 100755 --- a/scripts/install +++ b/scripts/install @@ -155,13 +155,18 @@ ynh_script_progression --message="Filling up the database..." --weight=10 # the user needs to be weblate for postgresql ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate migrate --noinput - # generate static files - ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate collectstatic --noinput + ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate createadmin --no-color \ --password "$password" \ --username "$admin" \ --email "$admin_mail" + # generate static files + ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate collectstatic --noinput + + # https://docs.weblate.org/en/latest/admin/install/venv-debian.html + ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate compress --noinput + # Check the configuration # This may fail in some cases with errors, etc., but the app works and the user can fix issues later. ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate check --deploy || true diff --git a/tests.toml b/tests.toml index 40788e5..9156afc 100644 --- a/tests.toml +++ b/tests.toml @@ -16,6 +16,6 @@ test_format = 1.0 # Commits to test upgrade from # ------------------------------- - test_upgrade_from.2749e7b.name = "0.5.3 - packaging v1" + test_upgrade_from.2749e7b.name = "5.3.1 - packaging v1" \ No newline at end of file From 5d65d85c4feaab5258ec35a28109a20eb12f6843 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Sun, 21 Jan 2024 12:28:54 +0100 Subject: [PATCH 58/81] fix weblate compress --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index e6ceb0c..62f54a6 100755 --- a/scripts/install +++ b/scripts/install @@ -165,7 +165,7 @@ ynh_script_progression --message="Filling up the database..." --weight=10 ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate collectstatic --noinput # https://docs.weblate.org/en/latest/admin/install/venv-debian.html - ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate compress --noinput + ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate compress # Check the configuration # This may fail in some cases with errors, etc., but the app works and the user can fix issues later. From 9cbe02d1419161c78192048fb08078a326e64eae Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Sun, 21 Jan 2024 12:40:13 +0100 Subject: [PATCH 59/81] fix compress --- conf/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/settings.py b/conf/settings.py index 364566a..87b8494 100644 --- a/conf/settings.py +++ b/conf/settings.py @@ -823,7 +823,7 @@ REST_FRAMEWORK = { FONTS_CDN_URL = None # Django compressor offline mode -COMPRESS_OFFLINE = False +COMPRESS_OFFLINE = True COMPRESS_OFFLINE_CONTEXT = "weblate.utils.compress.offline_context" COMPRESS_CSS_HASHING_METHOD = "content" From 21efd8c5e155eeea472a955d01c855318bda4ee7 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Tue, 23 Jan 2024 13:10:54 +0100 Subject: [PATCH 60/81] fix path --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 62f54a6..c0357d6 100755 --- a/scripts/install +++ b/scripts/install @@ -121,7 +121,7 @@ ynh_script_progression --message="Adding a configuration file..." --weight=1 redis_db=$(ynh_redis_get_free_db) ynh_app_setting_set --app=$app --key=redis_db --value="$redis_db" -path="${path%/}" +#path="${path%/}" settings="$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" set_forge_variables From 1b2fc8fd967061ac3702a54a0e5d2ec56dad554a Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Tue, 23 Jan 2024 16:33:31 +0100 Subject: [PATCH 61/81] Update install --- scripts/install | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/install b/scripts/install index c0357d6..63e75fa 100755 --- a/scripts/install +++ b/scripts/install @@ -29,6 +29,9 @@ ynh_app_setting_set --app=$app --key=forge_token --value=$forge_token # STANDARD MODIFICATIONS #================================================= +# Remove trailing "/" for next commands +path2=${path%/} + #================================================= # CREATE A POSTGRESQL DATABASE #================================================= From ef06c66dc98d8e6b6527d85d25054e02cb024812 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Tue, 23 Jan 2024 16:34:04 +0100 Subject: [PATCH 62/81] Update settings.py --- conf/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/settings.py b/conf/settings.py index 87b8494..f272876 100644 --- a/conf/settings.py +++ b/conf/settings.py @@ -154,7 +154,7 @@ USE_TZ = True DEFAULT_AUTO_FIELD = "django.db.models.AutoField" # URL prefix to use, please see documentation for more details -URL_PREFIX = "__PATH__" +URL_PREFIX = "__PATH2__" # Absolute filesystem path to the directory that will hold user-uploaded files. MEDIA_ROOT = os.path.join(DATA_DIR, "media") From c1aa604144a328a96b545a8df541b24bd4c325ac Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Tue, 23 Jan 2024 17:45:35 +0100 Subject: [PATCH 63/81] some cleaning --- conf/settings.py | 1 + manifest.toml | 2 +- scripts/install | 1 - scripts/upgrade | 3 +++ 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/conf/settings.py b/conf/settings.py index f272876..7c1229d 100644 --- a/conf/settings.py +++ b/conf/settings.py @@ -154,6 +154,7 @@ USE_TZ = True DEFAULT_AUTO_FIELD = "django.db.models.AutoField" # URL prefix to use, please see documentation for more details +# WARNING: this must be without trailing slash (this is why we set __PATH2__ (cf. loaded settings in install and upgrade)) URL_PREFIX = "__PATH2__" # Absolute filesystem path to the directory that will hold user-uploaded files. diff --git a/manifest.toml b/manifest.toml index 908a943..ce2f08b 100644 --- a/manifest.toml +++ b/manifest.toml @@ -93,7 +93,7 @@ ram.runtime = "3G" main.default = 8080 [resources.apt] - #first § = weblate dependecies, second § = borgbackup dependencies + #first = weblate dependecies, after hub = borgbackup dependencies packages = "libxml2-dev, libxslt-dev, libfreetype6-dev, libjpeg-dev, libz-dev, libyaml-dev, libffi-dev, libcairo-dev, gir1.2-pango-1.0, libgirepository1.0-dev, libacl1-dev, libssl-dev, libpq-dev, libjpeg62-turbo-dev, build-essential, python3-gdbm, python3-dev, python3-pip, python3-venv, python3-virtualenv, virtualenv, git, uwsgi, uwsgi-plugin-python3, redis-server, postgresql, postgresql-contrib, hub, libacl1-dev, libacl1, libssl-dev, liblz4-dev, libzstd-dev, libxxhash-dev, build-essential, pkg-config, python3-pkgconfig" [resources.database] diff --git a/scripts/install b/scripts/install index 63e75fa..92ae346 100755 --- a/scripts/install +++ b/scripts/install @@ -124,7 +124,6 @@ ynh_script_progression --message="Adding a configuration file..." --weight=1 redis_db=$(ynh_redis_get_free_db) ynh_app_setting_set --app=$app --key=redis_db --value="$redis_db" -#path="${path%/}" settings="$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" set_forge_variables diff --git a/scripts/upgrade b/scripts/upgrade index 2c0b395..b73554e 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -17,6 +17,9 @@ ynh_script_progression --message="Loading installation settings..." --weight=1 admin_mail=$(ynh_user_get_info --username="$admin" --key=mail) key=$(ynh_string_random --length=50) +# Remove trailing "/" for next commands +path2=${path%/} + #================================================= # CHECK VERSION #================================================= From 378bb879a10840d52a6b590f89426517f4413e4a Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Tue, 23 Jan 2024 19:24:08 +0100 Subject: [PATCH 64/81] =?UTF-8?q?Apply=20some=20Salamandar=E2=80=99s=20sug?= =?UTF-8?q?gestions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/settings.py | 2 +- manifest.toml | 12 +++++++----- scripts/install | 2 +- scripts/upgrade | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/conf/settings.py b/conf/settings.py index 7c1229d..f52fe78 100644 --- a/conf/settings.py +++ b/conf/settings.py @@ -155,7 +155,7 @@ DEFAULT_AUTO_FIELD = "django.db.models.AutoField" # URL prefix to use, please see documentation for more details # WARNING: this must be without trailing slash (this is why we set __PATH2__ (cf. loaded settings in install and upgrade)) -URL_PREFIX = "__PATH2__" +URL_PREFIX = "__PATH_NO_SLASH__" # Absolute filesystem path to the directory that will hold user-uploaded files. MEDIA_ROOT = os.path.join(DATA_DIR, "media") diff --git a/manifest.toml b/manifest.toml index ce2f08b..5ac42af 100644 --- a/manifest.toml +++ b/manifest.toml @@ -9,7 +9,7 @@ description.fr = "Plateforme de traduction utilisant Git et Python" version = "5.3.1~ynh1" -maintainers = ["YunoHost Contributors"] +maintainers = ["Thovi98"] [upstream] license = "AGPL-3.0" @@ -19,6 +19,7 @@ admindoc = "https://docs.weblate.org/" userdoc = "https://docs.weblate.org/" code = "https://github.com/WeblateOrg/weblate" cpe = "cpe:2.3:a:weblate:weblate" +fund = "https://weblate.org/fr/donate/" [integration] yunohost = ">= 11.2.0" @@ -62,7 +63,6 @@ ram.runtime = "3G" ask.fr = "Nom d'utilisateur de votre forge" type = "string" example = "Your username" - default = "username" optional = true [install.forge_token] @@ -70,7 +70,6 @@ ram.runtime = "3G" ask.fr = "Jeton de votre forge (OAuth)" type = "string" example = "A secret token" - default = "thisisanexampletoken" optional = true [resources] @@ -93,8 +92,11 @@ ram.runtime = "3G" main.default = 8080 [resources.apt] - #first = weblate dependecies, after hub = borgbackup dependencies - packages = "libxml2-dev, libxslt-dev, libfreetype6-dev, libjpeg-dev, libz-dev, libyaml-dev, libffi-dev, libcairo-dev, gir1.2-pango-1.0, libgirepository1.0-dev, libacl1-dev, libssl-dev, libpq-dev, libjpeg62-turbo-dev, build-essential, python3-gdbm, python3-dev, python3-pip, python3-venv, python3-virtualenv, virtualenv, git, uwsgi, uwsgi-plugin-python3, redis-server, postgresql, postgresql-contrib, hub, libacl1-dev, libacl1, libssl-dev, liblz4-dev, libzstd-dev, libxxhash-dev, build-essential, pkg-config, python3-pkgconfig" + # §1 = weblate dependecies, §2 = borgbackup dependencies + packages = ["libxml2-dev, libxslt-dev, libfreetype6-dev, libjpeg-dev, libz-dev, libyaml-dev, libffi-dev, libcairo-dev, gir1.2-pango-1.0, libgirepository1.0-dev, libacl1-dev, libssl-dev, libpq-dev, libjpeg62-turbo-dev, build-essential, python3-gdbm, python3-dev, python3-pip, python3-venv, python3-virtualenv, virtualenv, git, uwsgi, uwsgi-plugin-python3, redis-server, postgresql, postgresql-contrib, hub, + + + libacl1-dev, libacl1, libssl-dev, liblz4-dev, libzstd-dev, libxxhash-dev, build-essential, pkg-config, python3-pkgconfig"] [resources.database] type = "postgresql" diff --git a/scripts/install b/scripts/install index 92ae346..3dfd209 100755 --- a/scripts/install +++ b/scripts/install @@ -30,7 +30,7 @@ ynh_app_setting_set --app=$app --key=forge_token --value=$forge_token #================================================= # Remove trailing "/" for next commands -path2=${path%/} +path_no_slash=${path%/} #================================================= # CREATE A POSTGRESQL DATABASE diff --git a/scripts/upgrade b/scripts/upgrade index b73554e..dce0edb 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -18,7 +18,7 @@ admin_mail=$(ynh_user_get_info --username="$admin" --key=mail) key=$(ynh_string_random --length=50) # Remove trailing "/" for next commands -path2=${path%/} +path_no_slash=${path%/} #================================================= # CHECK VERSION From 95b0b0e7005cc0a3318c767521c99fa2c62cc1ba Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Tue, 23 Jan 2024 19:32:15 +0100 Subject: [PATCH 65/81] some cleanings --- manifest.toml | 3 ++- scripts/install | 6 +----- scripts/upgrade | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/manifest.toml b/manifest.toml index 5ac42af..4a48ea2 100644 --- a/manifest.toml +++ b/manifest.toml @@ -54,7 +54,8 @@ ram.runtime = "3G" ask.en = "Choose the forge you use" ask.fr = "Choisissez la forge que vous utilisez" type = "select" - choices = ["GitHub", "GitLab"] + choices.github = "Github" + choices.gitlab = "GitLab" default = "GitHub" optional = true diff --git a/scripts/install b/scripts/install index 3dfd209..8ebffea 100755 --- a/scripts/install +++ b/scripts/install @@ -25,11 +25,7 @@ ynh_app_setting_set --app=$app --key=used_forge --value=$used_forge ynh_app_setting_set --app=$app --key=forge_username --value=$forge_username ynh_app_setting_set --app=$app --key=forge_token --value=$forge_token -#================================================= -# STANDARD MODIFICATIONS -#================================================= - -# Remove trailing "/" for next commands +# Remove trailing "/" from the path path_no_slash=${path%/} #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index dce0edb..401db27 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -17,7 +17,7 @@ ynh_script_progression --message="Loading installation settings..." --weight=1 admin_mail=$(ynh_user_get_info --username="$admin" --key=mail) key=$(ynh_string_random --length=50) -# Remove trailing "/" for next commands +# Remove trailing "/" from the path path_no_slash=${path%/} #================================================= From 1e0d93a796d28214231a152e1b3c9ef7d9a1ac91 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Tue, 23 Jan 2024 19:35:09 +0100 Subject: [PATCH 66/81] add some dependencies --- scripts/install | 2 +- scripts/upgrade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index 8ebffea..0ccfd2f 100755 --- a/scripts/install +++ b/scripts/install @@ -106,7 +106,7 @@ chown -R $app: "$install_dir" sudo --user=$app $install_dir/venv/bin/pip install --force-reinstall --no-binary :all: cffi # Still needed with latest version of weblate? sudo --user=$app BORG_OPENSSL_PREFIX=/usr/lib/x86_64-linux-gnu/ $install_dir/venv/bin/pip install Weblate=="$(ynh_app_upstream_version)" - sudo --user=$app $install_dir/venv/bin/pip install psycopg2-binary ruamel.yaml aeidon phply + sudo --user=$app $install_dir/venv/bin/pip install psycopg2-binary ruamel.yaml aeidon phply boto3 aliyunsdkalimt google openai #pip install pytz python-bidi PyYaML Babel pyuca pylibravatar py3dns psycopg2-binary phply django-redis hiredis aeidon ruamel.yaml # specific to YunoHost package: diff --git a/scripts/upgrade b/scripts/upgrade index 401db27..d71996a 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -135,7 +135,7 @@ upgrade() { sudo --user=$app $install_dir/venv/bin/pip install --force-reinstall --no-binary :all: cffi # Still needed with latest version of weblate? sudo --user=$app $install_dir/venv/bin/pip install --upgrade Weblate=="$new_version" - sudo --user=$app $install_dir/venv/bin/pip install psycopg2-binary ruamel.yaml aeidon phply + sudo --user=$app $install_dir/venv/bin/pip install psycopg2-binary ruamel.yaml aeidon phply boto3 aliyunsdkalimt google openai #pip install pytz python-bidi PyYaML Babel pyuca pylibravatar py3dns psycopg2-binary phply django-redis hiredis aeidon ruamel.yaml # specific to YunoHost package: sudo --user=$app $install_dir/venv/bin/pip install django_sendmail_backend From f12783dd3a4f3da8f5556d8c7f7e3a256a66bd6f Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Wed, 24 Jan 2024 13:43:58 +0100 Subject: [PATCH 67/81] readd the possibility to have local_settings --- conf/settings.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/conf/settings.py b/conf/settings.py index f52fe78..4b75e0a 100644 --- a/conf/settings.py +++ b/conf/settings.py @@ -898,3 +898,9 @@ GOOGLE_ANALYTICS_ID = None SENTRY_DSN = None SENTRY_ENVIRONMENT = SITE_DOMAIN AKISMET_API_KEY = None + +# Yunohost hack so users can define a new conf, and we can just replace the conf +try: + from .local_settings import * +except ImportError: + pass From 41944195437233526c8cd9b16d2ebd50200fbbdd Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Wed, 24 Jan 2024 13:51:31 +0100 Subject: [PATCH 68/81] fix syntax? --- manifest.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.toml b/manifest.toml index 4a48ea2..342007c 100644 --- a/manifest.toml +++ b/manifest.toml @@ -94,10 +94,10 @@ ram.runtime = "3G" [resources.apt] # §1 = weblate dependecies, §2 = borgbackup dependencies - packages = ["libxml2-dev, libxslt-dev, libfreetype6-dev, libjpeg-dev, libz-dev, libyaml-dev, libffi-dev, libcairo-dev, gir1.2-pango-1.0, libgirepository1.0-dev, libacl1-dev, libssl-dev, libpq-dev, libjpeg62-turbo-dev, build-essential, python3-gdbm, python3-dev, python3-pip, python3-venv, python3-virtualenv, virtualenv, git, uwsgi, uwsgi-plugin-python3, redis-server, postgresql, postgresql-contrib, hub, + packages = ["libxml2-dev", "libxslt-dev", "libfreetype6-dev", "libjpeg-dev", "libz-dev", "libyaml-dev", "libffi-dev", "libcairo-dev", "gir1.2-pango-1.0", "libgirepository1.0-dev", "libacl1-dev", "libssl-dev", "libpq-dev", "libjpeg62-turbo-dev", "build-essential", "python3-gdbm", "python3-dev", "python3-pip", "python3-venv", "python3-virtualenv", "virtualenv", "git", "uwsgi", "uwsgi-plugin-python3", "redis-server", "postgresql", "postgresql-contrib", "hub", - libacl1-dev, libacl1, libssl-dev, liblz4-dev, libzstd-dev, libxxhash-dev, build-essential, pkg-config, python3-pkgconfig"] + "libacl1-dev", "libacl1", "libssl-dev", "liblz4-dev", "libzstd-dev", "libxxhash-dev", "build-essential", "pkg-config", "python3-pkgconfig"] [resources.database] type = "postgresql" From 7aabe32fb2ea7d6081f70e6f0cfb347d159279d7 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Wed, 24 Jan 2024 13:56:40 +0100 Subject: [PATCH 69/81] Fix default value --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 342007c..d9cc98d 100644 --- a/manifest.toml +++ b/manifest.toml @@ -56,7 +56,7 @@ ram.runtime = "3G" type = "select" choices.github = "Github" choices.gitlab = "GitLab" - default = "GitHub" + default = "github" optional = true [install.forge_username] From d343b67e75f3479c9ae602e85f95b61e4a4475f5 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:05:57 +0100 Subject: [PATCH 70/81] fix pip install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 0ccfd2f..4e13e85 100755 --- a/scripts/install +++ b/scripts/install @@ -106,7 +106,7 @@ chown -R $app: "$install_dir" sudo --user=$app $install_dir/venv/bin/pip install --force-reinstall --no-binary :all: cffi # Still needed with latest version of weblate? sudo --user=$app BORG_OPENSSL_PREFIX=/usr/lib/x86_64-linux-gnu/ $install_dir/venv/bin/pip install Weblate=="$(ynh_app_upstream_version)" - sudo --user=$app $install_dir/venv/bin/pip install psycopg2-binary ruamel.yaml aeidon phply boto3 aliyunsdkalimt google openai + sudo --user=$app $install_dir/venv/bin/pip install psycopg2-binary ruamel.yaml aeidon phply boto3 google openai #pip install pytz python-bidi PyYaML Babel pyuca pylibravatar py3dns psycopg2-binary phply django-redis hiredis aeidon ruamel.yaml # specific to YunoHost package: From 1319ef8c5609156c1c55c60485a855408fbf6ae3 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:06:32 +0100 Subject: [PATCH 71/81] Fix pip install --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index d71996a..86d0b8a 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -135,7 +135,7 @@ upgrade() { sudo --user=$app $install_dir/venv/bin/pip install --force-reinstall --no-binary :all: cffi # Still needed with latest version of weblate? sudo --user=$app $install_dir/venv/bin/pip install --upgrade Weblate=="$new_version" - sudo --user=$app $install_dir/venv/bin/pip install psycopg2-binary ruamel.yaml aeidon phply boto3 aliyunsdkalimt google openai + sudo --user=$app $install_dir/venv/bin/pip install psycopg2-binary ruamel.yaml aeidon phply boto3 google openai #pip install pytz python-bidi PyYaML Babel pyuca pylibravatar py3dns psycopg2-binary phply django-redis hiredis aeidon ruamel.yaml # specific to YunoHost package: sudo --user=$app $install_dir/venv/bin/pip install django_sendmail_backend From e95eb2239193af111bb024210997a863a72e560d Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:20:27 +0100 Subject: [PATCH 72/81] Fix variable --- conf/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/settings.py b/conf/settings.py index 4b75e0a..e9722d7 100644 --- a/conf/settings.py +++ b/conf/settings.py @@ -154,7 +154,7 @@ USE_TZ = True DEFAULT_AUTO_FIELD = "django.db.models.AutoField" # URL prefix to use, please see documentation for more details -# WARNING: this must be without trailing slash (this is why we set __PATH2__ (cf. loaded settings in install and upgrade)) +# WARNING: this must be without trailing slash (this is why we set __PATH_NO_SLASH__ (cf. loaded settings in install and upgrade)) URL_PREFIX = "__PATH_NO_SLASH__" # Absolute filesystem path to the directory that will hold user-uploaded files. From fd266f9bfe67fa335789abd7b7510ce560192563 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Wed, 24 Jan 2024 17:00:29 +0100 Subject: [PATCH 73/81] Fix missing variable on upgrade --- scripts/upgrade | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/upgrade b/scripts/upgrade index 86d0b8a..8778e89 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -20,6 +20,9 @@ key=$(ynh_string_random --length=50) # Remove trailing "/" from the path path_no_slash=${path%/} +Github=$github +GitLab=gitlab + #================================================= # CHECK VERSION #================================================= From 8b418185df03438d84814fcad195d504ecb4d15c Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Thu, 25 Jan 2024 13:25:36 +0100 Subject: [PATCH 74/81] fix CI test --- scripts/upgrade | 3 --- tests.toml | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 8778e89..86d0b8a 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -20,9 +20,6 @@ key=$(ynh_string_random --length=50) # Remove trailing "/" from the path path_no_slash=${path%/} -Github=$github -GitLab=gitlab - #================================================= # CHECK VERSION #================================================= diff --git a/tests.toml b/tests.toml index 9156afc..ffce70b 100644 --- a/tests.toml +++ b/tests.toml @@ -17,5 +17,6 @@ test_format = 1.0 # ------------------------------- test_upgrade_from.2749e7b.name = "5.3.1 - packaging v1" + test_upgrade_from.2749e7b.args.used_forge = "GitHub" \ No newline at end of file From 09e98c7f9f1804e845bd8caa8b83c203fffbc4c4 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Thu, 25 Jan 2024 17:05:24 +0100 Subject: [PATCH 75/81] Fix weblate commands --- scripts/upgrade | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 86d0b8a..6dea564 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -180,7 +180,8 @@ upgrade() { sudo --user=$app $install_dir/venv/bin/weblate setuplang sudo --user=$app $install_dir/venv/bin/weblate setupgroups sudo --user=$app $install_dir/venv/bin/weblate compilemessages - + sudo --user=$app $install_dir/venv/bin/weblate compress + # Check the configuration # This may fail in some cases with errors, etc., but the app works and the user can fix issues later. if [ "$new_version" == "$(ynh_app_upstream_version)" ]; then From 80e517402931debea803c148969e4c6b2e3c03e3 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Thu, 25 Jan 2024 17:06:39 +0100 Subject: [PATCH 76/81] Update tests.toml --- tests.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests.toml b/tests.toml index ffce70b..670a9c1 100644 --- a/tests.toml +++ b/tests.toml @@ -17,6 +17,9 @@ test_format = 1.0 # ------------------------------- test_upgrade_from.2749e7b.name = "5.3.1 - packaging v1" + test_upgrade_from.2749e7b.args.domain = "domain.tld" test_upgrade_from.2749e7b.args.used_forge = "GitHub" - \ No newline at end of file + + + From d42a12dc5cbedbac91fececcaad84ef3099e0ed6 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 26 Jan 2024 13:08:39 +0100 Subject: [PATCH 77/81] update tests args --- tests.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests.toml b/tests.toml index 670a9c1..f314d96 100644 --- a/tests.toml +++ b/tests.toml @@ -18,6 +18,8 @@ test_format = 1.0 test_upgrade_from.2749e7b.name = "5.3.1 - packaging v1" test_upgrade_from.2749e7b.args.domain = "domain.tld" + test_upgrade_from.2749e7b.args.name = "user" + test_upgrade_from.2749e7b.args.password = "password" test_upgrade_from.2749e7b.args.used_forge = "GitHub" From ed49c0ff2d8564af3e1489166f1de3959bd01549 Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 26 Jan 2024 14:26:32 +0100 Subject: [PATCH 78/81] Update tests.toml --- tests.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests.toml b/tests.toml index f314d96..3a0ea2b 100644 --- a/tests.toml +++ b/tests.toml @@ -18,7 +18,7 @@ test_format = 1.0 test_upgrade_from.2749e7b.name = "5.3.1 - packaging v1" test_upgrade_from.2749e7b.args.domain = "domain.tld" - test_upgrade_from.2749e7b.args.name = "user" + test_upgrade_from.2749e7b.args.admin = "package_checker" test_upgrade_from.2749e7b.args.password = "password" test_upgrade_from.2749e7b.args.used_forge = "GitHub" From 592c25c88c28f3376d6ddead4fa0cddabf11f2ad Mon Sep 17 00:00:00 2001 From: Thomas <51749973+Thovi98@users.noreply.github.com> Date: Fri, 26 Jan 2024 15:58:19 +0100 Subject: [PATCH 79/81] Update tests.toml --- tests.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/tests.toml b/tests.toml index 3a0ea2b..4c04593 100644 --- a/tests.toml +++ b/tests.toml @@ -21,6 +21,7 @@ test_format = 1.0 test_upgrade_from.2749e7b.args.admin = "package_checker" test_upgrade_from.2749e7b.args.password = "password" test_upgrade_from.2749e7b.args.used_forge = "GitHub" + test_upgrade_from.2749e7b.args.forge_token = "11111111111" From 575a99036a652deee2d7778090c71a3483c7c126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Fri, 2 Feb 2024 12:45:18 +0100 Subject: [PATCH 80/81] Fix upgrade from manifestv1 : is_public=true --- tests.toml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/tests.toml b/tests.toml index 4c04593..9240d68 100644 --- a/tests.toml +++ b/tests.toml @@ -5,24 +5,21 @@ test_format = 1.0 # ------------ # Tests to run # ------------ - + # ------------------------------- # Default args to use for install # ------------------------------- - - + + # ------------------------------- # Commits to test upgrade from # ------------------------------- test_upgrade_from.2749e7b.name = "5.3.1 - packaging v1" test_upgrade_from.2749e7b.args.domain = "domain.tld" + test_upgrade_from.2749e7b.args.is_public = true test_upgrade_from.2749e7b.args.admin = "package_checker" test_upgrade_from.2749e7b.args.password = "password" test_upgrade_from.2749e7b.args.used_forge = "GitHub" test_upgrade_from.2749e7b.args.forge_token = "11111111111" - - - - From 6d9319bca5fd0a1bd26a868dbf12701a5f7d10bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Fri, 2 Feb 2024 14:24:34 +0100 Subject: [PATCH 81/81] Fix test_upgrade_from args --- tests.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/tests.toml b/tests.toml index 9240d68..ef21ba7 100644 --- a/tests.toml +++ b/tests.toml @@ -18,6 +18,7 @@ test_format = 1.0 test_upgrade_from.2749e7b.name = "5.3.1 - packaging v1" test_upgrade_from.2749e7b.args.domain = "domain.tld" + test_upgrade_from.2749e7b.args.path = "/" test_upgrade_from.2749e7b.args.is_public = true test_upgrade_from.2749e7b.args.admin = "package_checker" test_upgrade_from.2749e7b.args.password = "password"

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 z≥oMYb2&g%|HY2PgH@+{Gfrt4Acz_c~hlJImN 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 Date: Wed, 17 Jan 2024 14:07:41 +0100 Subject: [PATCH 02/81] Convert to v2 + some fixes --- README.md | 2 +- README_fr.md | 2 +- check_process | 31 -------- conf/celery-weblate | 2 +- conf/celery-weblate.service | 4 +- conf/nginx.conf | 10 +-- conf/settings.4.1.1.py | 4 +- conf/settings.py | 6 +- conf/uwsgi.ini | 4 +- manifest.json | 95 ------------------------- manifest.toml | 86 ++++++++++++++++++++++ scripts/_common.sh | 6 +- scripts/backup | 16 ++--- scripts/change_url | 72 ++++++++++--------- scripts/install | 138 ++++++++++++++++++------------------ scripts/remove | 28 ++++---- scripts/restore | 56 +++++++-------- scripts/upgrade | 128 ++++++++++++++++----------------- tests.toml | 19 +++++ weblate_v2.zip | Bin 122562 -> 0 bytes 20 files changed, 345 insertions(+), 364 deletions(-) delete mode 100644 check_process delete mode 100644 manifest.json create mode 100644 manifest.toml create mode 100644 tests.toml delete mode 100644 weblate_v2.zip diff --git a/README.md b/README.md index d51b4f5..c908b96 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Weblate is a libre web-based translation tool with tight version control integration. It provides two user interfaces, propagation of translations across components, quality checks and automatic linking to source files. -**Shipped version:** 5.3.1~ynh1 +**Shipped version:** 4.18.2~ynh1 **Demo:** https://hosted.weblate.org/ diff --git a/README_fr.md b/README_fr.md index 2996aed..98557db 100644 --- a/README_fr.md +++ b/README_fr.md @@ -18,7 +18,7 @@ Si vous n’avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) po Weblate est un outil de traduction libre avec une intégration étroite du contrôle de version. Il fournit deux interfaces utilisateur, la propagation des traductions entre les composants, les contrôles de qualité et la liaison automatique aux fichiers source. -**Version incluse :** 5.3.1~ynh1 +**Version incluse :** 4.18.2~ynh1 **Démo :** https://hosted.weblate.org/ diff --git a/check_process b/check_process deleted file mode 100644 index 53afd2b..0000000 --- a/check_process +++ /dev/null @@ -1,31 +0,0 @@ -;; Test complet - ; Manifest - domain="domain.tld" - path="/path" - is_public=1 - admin="john" - password="1Strong-Password" - used_forge="GitLab" - forge_username="myusername" - forge_token="myoauthtoken" - ; Checks - pkg_linter=1 - setup_sub_dir=1 - setup_root=1 - setup_nourl=0 - setup_private=1 - setup_public=1 - upgrade=1 - # 4.9~ynh1 - upgrade=1 from_commit=7fec5a47a80e00458a31f1270c4ace822961e7bf - backup_restore=1 - multi_instance=1 - port_already_use=0 - change_url=1 -;;; Options -Email= -Notification=all -;;; Upgrade options - ; commit=3f8363cdc588e609a775cb8b78b9d080f96405d9 - name=Upgrade from 4.6.1 - manifest_arg=domain=DOMAIN&path=PATH&admin=USER&is_public=1&github_account=fake&github_token=fake diff --git a/conf/celery-weblate b/conf/celery-weblate index 4624a9b..15436d5 100644 --- a/conf/celery-weblate +++ b/conf/celery-weblate @@ -2,7 +2,7 @@ CELERYD_NODES="celery notify memory backup translate" # Absolute or relative path to the 'celery' command: -CELERY_BIN="__FINALPATH__/venv/bin/celery" +CELERY_BIN="__INSTALL_DIR__/venv/bin/celery" # App instance to use # comment out this line if you don't use an app diff --git a/conf/celery-weblate.service b/conf/celery-weblate.service index 867f85f..7f6254c 100644 --- a/conf/celery-weblate.service +++ b/conf/celery-weblate.service @@ -6,8 +6,8 @@ After=network.target Type=forking User=__APP__ Group=__APP__ -EnvironmentFile=__FINALPATH__/celery-weblate -WorkingDirectory=__FINALPATH__/ +EnvironmentFile=__INSTALL_DIR__/celery-weblate +WorkingDirectory=__INSTALL_DIR__/ RuntimeDirectory=__APP__ RuntimeDirectoryPreserve=restart LogsDirectory=celery diff --git a/conf/nginx.conf b/conf/nginx.conf index e65307b..12c4e0b 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -2,31 +2,31 @@ # https://github.com/WeblateOrg/weblate/blob/master/weblate/examples/weblate.nginx.conf location = __PATH__/favicon.ico { # DATA_DIR/static/favicon.ico - alias __FINALPATH__/data/static/favicon.ico; + alias __INSTALL_DIR__/data/static/favicon.ico; expires 30d; } location = __PATH__/robots.txt { # DATA_DIR/static/robots.txt - alias __FINALPATH__/data/static/robots.txt; + alias __INSTALL_DIR__/data/static/robots.txt; expires 30d; } location __PATH__/static/ { # DATA_DIR/static/ - alias __FINALPATH__/data/static/; + alias __INSTALL_DIR__/data/static/; expires 30d; } location __PATH__/media/ { # DATA_DIR/media/ - alias __FINALPATH__/data/media/; + alias __INSTALL_DIR__/data/media/; expires 30d; } location __PATH__/ { # Path to source - alias __FINALPATH__/ ; + alias __INSTALL_DIR__/ ; include uwsgi_params; # Needed for long running operations in admin interface diff --git a/conf/settings.4.1.1.py b/conf/settings.4.1.1.py index 3174475..c234938 100644 --- a/conf/settings.4.1.1.py +++ b/conf/settings.4.1.1.py @@ -63,7 +63,7 @@ DATABASES = { } } -BASE_DIR = "__FINALPATH__" +BASE_DIR = "__INSTALL_DIR__" # Data directory DATA_DIR = os.path.join(BASE_DIR, "data") @@ -136,7 +136,7 @@ USE_L10N = True USE_TZ = True # URL prefix to use, please see documentation for more details -URL_PREFIX = "__PATH_URL__" +URL_PREFIX = "__PATH__" # Absolute filesystem path to the directory that will hold user-uploaded files. MEDIA_ROOT = os.path.join(DATA_DIR, "media") diff --git a/conf/settings.py b/conf/settings.py index 343688e..2f79bc6 100644 --- a/conf/settings.py +++ b/conf/settings.py @@ -5,7 +5,7 @@ ################################################################################ # Please do not modify this file, it will be reset at the next update. -# You can edit the file __FINALPATH__/local_settings.py and add/modify the settings you need. +# You can edit the file __INSTALL_DIR__/local_settings.py and add/modify the settings you need. # The parameters you add in local_settings.py will overwrite these, # but you can use the options and documentation in this file to find out what can be done. @@ -78,7 +78,7 @@ DATABASES = { # Data directory, you can use following for the development purposes: # os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "data") -DATA_DIR = os.path.join("__FINALPATH__", "data") +DATA_DIR = os.path.join("__INSTALL_DIR__", "data") CACHE_DIR = f"{DATA_DIR}/cache" # Local time zone for this installation. Choices can be found here: @@ -156,7 +156,7 @@ USE_TZ = True DEFAULT_AUTO_FIELD = "django.db.models.AutoField" # URL prefix to use, please see documentation for more details -URL_PREFIX = "__PATH_URL__" +URL_PREFIX = "__PATH__" # Absolute filesystem path to the directory that will hold user-uploaded files. MEDIA_ROOT = os.path.join(DATA_DIR, "media") diff --git a/conf/uwsgi.ini b/conf/uwsgi.ini index bbabbad..38372c9 100644 --- a/conf/uwsgi.ini +++ b/conf/uwsgi.ini @@ -5,14 +5,14 @@ protocol = uwsgi socket = /var/run/__APP__/socket # http://uwsgi-docs.readthedocs.io/en/latest/Nginx.html#hosting-multiple-apps-in-the-same-process-aka-managing-script-name-and-path-info -mount = __PATH_URL__=__FINALPATH__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/wsgi.py +mount = __PATH__=__INSTALL_DIR__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/wsgi.py # Add path to Weblate checkout if you did not install # Weblate by pip # python-path = /path/to/weblate # In case you're using virtualenv uncomment this: -virtualenv = __FINALPATH__/venv +virtualenv = __INSTALL_DIR__/venv # Needed for OAuth/OpenID buffer-size = 8192 diff --git a/manifest.json b/manifest.json deleted file mode 100644 index 8f50f4e..0000000 --- a/manifest.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "name": "Weblate", - "id": "weblate", - "packaging_format": 1, - "description": { - "en": "Translation platform using Git and Python", - "fr": "Plateforme de traduction utilisant Git et Python" - }, - "version": "5.3.1~ynh1", - "url": "https://weblate.org", - "upstream": { - "license": "AGPL-3.0", - "website": "https://weblate.org", - "demo": "https://hosted.weblate.org/", - "admindoc": "https://docs.weblate.org/", - "userdoc": "https://docs.weblate.org/", - "code": "https://github.com/WeblateOrg/weblate" - }, - "license": "AGPL-3.0", - "maintainer": { - "name": "YunoHost Contributors", - "email": "apps@yunohost.org" - }, - "previous_maintainers": [ - { - "name": "Jean-Baptiste Holcroft", - "email": "jean-baptiste@holcroft.fr" - } - ], - "requirements": { - "yunohost": ">= 11.2" - }, - "multi_instance": true, - "services": [ - "nginx" - ], - "arguments": { - "install": [ - { - "name": "domain", - "type": "domain" - }, - { - "name": "path", - "type": "path", - "example": "/weblate", - "default": "/weblate" - }, - { - "name": "is_public", - "type": "boolean", - "default": false - }, - { - "name": "admin", - "type": "user" - }, - { - "name": "password", - "type": "password" - }, - { - "name": "used_forge", - "type": "select", - "ask": { - "en": "Choose the forge you use", - "fr": "Choisissez la forge que vous utilisez" - }, - "choices": [ - "GitHub", - "GitLab" - ], - "default": "GitHub" - }, - { - "name": "forge_username", - "type": "string", - "ask": { - "en": "Your forge's username", - "fr": "Nom d'utilisateur de votre forge" - }, - "example": "Your username" - }, - { - "name": "forge_token", - "type": "string", - "ask": { - "en": "Your forge's token (OAuth)", - "fr": "Jeton de votre forge (OAuth)" - }, - "example": "A secret token" - } - ] - } -} diff --git a/manifest.toml b/manifest.toml new file mode 100644 index 0000000..9b46c0a --- /dev/null +++ b/manifest.toml @@ -0,0 +1,86 @@ +#:schema https://raw.githubusercontent.com/YunoHost/apps/master/schemas/manifest.v2.schema.json + +packaging_format = 2 + +id = "weblate" +name = "Weblate" +description.en = "Translation platform using Git and Python" +description.fr = "Plateforme de traduction utilisant Git et Python" + +version = "4.18.2~ynh1" + +maintainers = ["YunoHost Contributors"] + +[upstream] +license = "AGPL-3.0" +website = "https://weblate.org" +demo = "https://hosted.weblate.org/" +admindoc = "https://docs.weblate.org/" +userdoc = "https://docs.weblate.org/" +code = "https://github.com/WeblateOrg/weblate" +cpe = "cpe:2.3:a:weblate:weblate" + +[integration] +yunohost = ">= 11.2.0" +architectures = "all" +multi_instance = true +ldap = "false" +sso = "false" + +disk = "1G" +ram.build = "3G" +ram.runtime = "3G" + +[install] + [install.domain] + type = "domain" + + [install.path] + type = "path" + default = "/weblate" + + [install.init_main_permission] + type = "group" + default = false + + [install.admin] + type = "user" + + [install.password] + type = "password" + + [install.used_forge] + ask.en = "Choose the forge you use" + ask.fr = "Choisissez la forge que vous utilisez" + type = "string" + choices = ["GitHub", "GitLab"] + default = "GitHub" + optional = true + + [install.forge_username] + ask.en = "Your forge's username" + ask.fr = "Nom d'utilisateur de votre forge" + type = "string" + example = "Your username" + optional = true + + [install.forge_token] + ask.en = "Your forge's token (OAuth)" + ask.fr = "Jeton de votre forge (OAuth)" + type = "string" + example = "A secret token" + optional = true + +[resources] + [resources.system_user] + + [resources.install_dir] + + [resources.permissions] + main.url = "/" + + [resources.apt] + packages = "libxml2-dev, libxslt-dev, libfreetype6-dev, libjpeg-dev, libz-dev, libyaml-dev, libacl1-dev, libacl1, libssl-dev, liblz4-dev, libzstd-dev, libxxhash-dev" + + [resources.database] + type = "postgresql" diff --git a/scripts/_common.sh b/scripts/_common.sh index 85a0b0d..47f84c9 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -5,17 +5,17 @@ #================================================= # dependencies used by the app -weblate_dependencies="libxml2-dev libxslt-dev libfreetype6-dev libjpeg-dev libz-dev libyaml-dev \ +#REMOVEME? weblate_dependencies="libxml2-dev libxslt-dev libfreetype6-dev libjpeg-dev libz-dev libyaml-dev \ libffi-dev libcairo-dev gir1.2-pango-1.0 libgirepository1.0-dev \ libacl1-dev libssl-dev libpq-dev libjpeg62-turbo-dev build-essential \ python3-gdbm python3-dev python3-pip python3-virtualenv virtualenv git \ uwsgi uwsgi-plugin-python3 redis-server postgresql postgresql-contrib hub" # because weblate install borgbackup -borgbackup_dependencies="libacl1-dev libacl1 libssl-dev liblz4-dev libzstd-dev libxxhash-dev \ +#REMOVEME? borgbackup_dependencies="libacl1-dev libacl1 libssl-dev liblz4-dev libzstd-dev libxxhash-dev \ build-essential pkg-config python3-pkgconfig" -pkg_dependencies="$weblate_dependencies $borgbackup_dependencies" +#REMOVEME? pkg_dependencies="$weblate_dependencies $borgbackup_dependencies" debian_maj_version=$(sed 's/\..*//' /etc/debian_version) diff --git a/scripts/backup b/scripts/backup index 9e36f62..4472f3d 100755 --- a/scripts/backup +++ b/scripts/backup @@ -14,22 +14,22 @@ source /usr/share/yunohost/helpers # MANAGE SCRIPT FAILURE #================================================= -ynh_clean_setup () { +#REMOVEME? ynh_clean_setup () { true } # Exit if an error occurs during the execution of the script -ynh_abort_if_errors +#REMOVEME? ynh_abort_if_errors #================================================= # LOAD SETTINGS #================================================= -ynh_print_info --message="Loading installation settings..." +#REMOVEME? ynh_print_info --message="Loading installation settings..." -app=$YNH_APP_INSTANCE_NAME +#REMOVEME? app=$YNH_APP_INSTANCE_NAME -final_path=$(ynh_app_setting_get --app=$app --key=final_path) -domain=$(ynh_app_setting_get --app=$app --key=domain) -db_name=$(ynh_app_setting_get --app=$app --key=db_name) +#REMOVEME? #REMOVEME? install_dir=$(ynh_app_setting_get --app=$app --key=install_dir) +#REMOVEME? domain=$(ynh_app_setting_get --app=$app --key=domain) +#REMOVEME? db_name=$(ynh_app_setting_get --app=$app --key=db_name) #================================================= # DECLARE DATA AND CONF FILES TO BACKUP @@ -40,7 +40,7 @@ ynh_print_info --message="Declaring files to be backed up..." # BACKUP THE APP MAIN DIR #================================================= -ynh_backup --src_path="$final_path" +ynh_backup --src_path="$install_dir" #================================================= # BACKUP THE NGINX CONFIGURATION diff --git a/scripts/change_url b/scripts/change_url index 7bbb34d..afe336e 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -13,55 +13,55 @@ source /usr/share/yunohost/helpers # RETRIEVE ARGUMENTS #================================================= -old_domain=$YNH_APP_OLD_DOMAIN -old_path=$YNH_APP_OLD_PATH +#REMOVEME? old_domain=$YNH_APP_OLD_DOMAIN +#REMOVEME? old_path=$YNH_APP_OLD_PATH -new_domain=$YNH_APP_NEW_DOMAIN -new_path=$YNH_APP_NEW_PATH +#REMOVEME? new_domain=$YNH_APP_NEW_DOMAIN +#REMOVEME? new_path=$YNH_APP_NEW_PATH -app=$YNH_APP_INSTANCE_NAME +#REMOVEME? app=$YNH_APP_INSTANCE_NAME #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." --weight=1 +#REMOVEME? 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) +#REMOVEME? # Needed for helper "ynh_add_nginx_config" +#REMOVEME? #REMOVEME? install_dir=$(ynh_app_setting_get --app=$app --key=install_dir) #================================================= # BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP #================================================= -ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." +#REMOVEME? ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." # Backup the current version of the app -ynh_backup_before_upgrade -ynh_clean_setup () { - ynh_clean_check_starting +#REMOVEME? ynh_backup_before_upgrade +#REMOVEME? ynh_clean_setup () { + #REMOVEME? ynh_clean_check_starting # Remove the new domain config file, the remove script won't do it as it doesn't know yet its location. - ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" +#REMOVEME? ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" # Restore it if the upgrade fails - ynh_restore_upgradebackup +#REMOVEME? ynh_restore_upgradebackup } # Exit if an error occurs during the execution of the script -ynh_abort_if_errors +#REMOVEME? ynh_abort_if_errors #================================================= # CHECK WHICH PARTS SHOULD BE CHANGED #================================================= -change_domain=0 -if [ "$old_domain" != "$new_domain" ] +#REMOVEME? change_domain=0 +#REMOVEME? if [ "$old_domain" != "$new_domain" ] then - change_domain=1 + #REMOVEME? change_domain=1 fi -change_path=0 -if [ "$old_path" != "$new_path" ] +#REMOVEME? change_path=0 +#REMOVEME? if [ "$old_path" != "$new_path" ] then - change_path=1 + #REMOVEME? change_path=1 fi #================================================= @@ -79,28 +79,30 @@ ynh_systemd_action --service_name="$app-celery" --action="stop" --log_path="syst #================================================= ynh_script_progression --message="Updating NGINX web server configuration..." --weight=1 -nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf +ynh_change_url_nginx_config + +#REMOVEME? 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" +#REMOVEME? ynh_backup_if_checksum_is_different --file="$nginx_conf_path" # Set global variables for NGINX helper - domain="$old_domain" - path_url="$new_path" +#REMOVEME? domain="$old_domain" +#REMOVEME? path="$new_path" # Create a dedicated NGINX config - ynh_add_nginx_config +#REMOVEME? 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 +#REMOVEME? ynh_delete_file_checksum --file="$nginx_conf_path" +#REMOVEME? 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" +#REMOVEME? ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" fi #================================================= @@ -110,16 +112,16 @@ fi #================================================= ynh_script_progression --message="Modify weblate's config file..." --weight=1 -settings="$final_path/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" +settings="$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" ynh_backup_if_checksum_is_different --file="$settings" -# Change the path in the nginx config file +#REMOVEME? # Change the path in the nginx config file if [ $change_path -eq 1 ] then ynh_replace_string --match_string="URL_PREFIX = \"${old_path%/}\"" --replace_string="URL_PREFIX = \"${new_path%/}\"" --target_file="$settings" fi -# Change the domain for nginx +#REMOVEME? # Change the domain for nginx if [ $change_domain -eq 1 ] then # replace SERVER_EMAIL @@ -139,7 +141,7 @@ ynh_store_file_checksum --file="$settings" finaluwsgiini="/etc/uwsgi/apps-available/$app.ini" ynh_backup_if_checksum_is_different --file="$finaluwsgiini" -# Change the path in the nginx config file +#REMOVEME? # Change the path in the nginx config file if [ $change_path -eq 1 ] then ynh_replace_string --match_string="mount = $old_path=" --replace_string="mount = $new_path=" --target_file="$finaluwsgiini" @@ -160,9 +162,9 @@ ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/va #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." --weight=1 +#REMOVEME? ynh_script_progression --message="Reloading NGINX web server..." --weight=1 -ynh_systemd_action --service_name=nginx --action=reload +#REMOVEME? #REMOVEME? ynh_systemd_action --service_name=nginx --action=reload #================================================= # END OF SCRIPT diff --git a/scripts/install b/scripts/install index 357b07f..2e9d9ce 100755 --- a/scripts/install +++ b/scripts/install @@ -13,26 +13,26 @@ source /usr/share/yunohost/helpers # MANAGE SCRIPT FAILURE #================================================= -ynh_clean_setup () { +#REMOVEME? ynh_clean_setup () { ynh_clean_check_starting } # Exit if an error occurs during the execution of the script -ynh_abort_if_errors +#REMOVEME? ynh_abort_if_errors #================================================= # RETRIEVE ARGUMENTS FROM THE MANIFEST #================================================= -domain=$YNH_APP_ARG_DOMAIN -path_url=$YNH_APP_ARG_PATH -is_public=$YNH_APP_ARG_IS_PUBLIC -admin=$YNH_APP_ARG_ADMIN -password=$YNH_APP_ARG_PASSWORD -used_forge=$YNH_APP_ARG_USED_FORGE -forge_username=$YNH_APP_ARG_FORGE_USERNAME -forge_token=$YNH_APP_ARG_FORGE_TOKEN +#REMOVEME? domain=$YNH_APP_ARG_DOMAIN +#REMOVEME? path=$YNH_APP_ARG_PATH +#REMOVEME? is_public=$YNH_APP_ARG_IS_PUBLIC +#REMOVEME? admin=$YNH_APP_ARG_ADMIN +#REMOVEME? password=$YNH_APP_ARG_PASSWORD +#REMOVEME? used_forge=$YNH_APP_ARG_USED_FORGE +#REMOVEME? forge_username=$YNH_APP_ARG_FORGE_USERNAME +#REMOVEME? forge_token=$YNH_APP_ARG_FORGE_TOKEN -app=$YNH_APP_INSTANCE_NAME +#REMOVEME? app=$YNH_APP_INSTANCE_NAME admin_mail=$(ynh_user_get_info --username="$admin" --key=mail) key=$(ynh_string_random --length=50) @@ -40,22 +40,22 @@ key=$(ynh_string_random --length=50) #================================================= # CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS #================================================= -ynh_script_progression --message="Validating installation parameters..." --weight=1 +#REMOVEME? 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" +#REMOVEME? install_dir=/var/www/$app +#REMOVEME? test ! -e "$install_dir" || ynh_die --message="This path already contains a folder" # Register (book) web path -ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url +#REMOVEME? ynh_webpath_register --app=$app --domain=$domain --path=$path #================================================= # STORE SETTINGS FROM MANIFEST #================================================= -ynh_script_progression --message="Storing installation settings..." --weight=1 +#REMOVEME? 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 -ynh_app_setting_set --app=$app --key=admin --value=$admin +#REMOVEME? ynh_app_setting_set --app=$app --key=domain --value=$domain +#REMOVEME? ynh_app_setting_set --app=$app --key=path --value=$path +#REMOVEME? ynh_app_setting_set --app=$app --key=admin --value=$admin ynh_app_setting_set --app=$app --key=used_forge --value=$used_forge ynh_app_setting_set --app=$app --key=forge_username --value=$forge_username ynh_app_setting_set --app=$app --key=forge_token --value=$forge_token @@ -65,44 +65,44 @@ ynh_app_setting_set --app=$app --key=forge_token --value=$forge_token #================================================= # INSTALL DEPENDENCIES #================================================= -ynh_script_progression --message="Installing dependencies..." --weight=40 +#REMOVEME? ynh_script_progression --message="Installing dependencies..." --weight=40 -ynh_exec_warn_less ynh_install_app_dependencies $pkg_dependencies +#REMOVEME? ynh_exec_warn_less ynh_install_app_dependencies $pkg_dependencies #================================================= # CREATE DEDICATED USER #================================================= -ynh_script_progression --message="Configuring system user..." --weight=1 +#REMOVEME? ynh_script_progression --message="Configuring system user..." --weight=1 # Create a system user -ynh_system_user_create --username=$app --home_dir="$final_path" --use_shell +#REMOVEME? ynh_system_user_create --username=$app --home_dir="$install_dir" --use_shell #================================================= # CREATE A POSTGRESQL DATABASE #================================================= -ynh_script_progression --message="Creating a PostgreSQL database..." --weight=2 +#REMOVEME? ynh_script_progression --message="Creating a PostgreSQL database..." --weight=2 -db_name=$(ynh_sanitize_dbid --db_name=$app) -db_user=$db_name -ynh_app_setting_set --app=$app --key=db_name --value=$db_name -ynh_psql_test_if_first_run -ynh_psql_setup_db --db_user=$db_user --db_name=$db_name +#REMOVEME? db_name=$(ynh_sanitize_dbid --db_name=$app) +#REMOVEME? db_user=$db_name +#REMOVEME? ynh_app_setting_set --app=$app --key=db_name --value=$db_name +#REMOVEME? ynh_psql_test_if_first_run +#REMOVEME? ynh_psql_setup_db --db_user=$db_user --db_name=$db_name ynh_psql_execute_as_root --sql="CREATE EXTENSION IF NOT EXISTS pg_trgm;" --database=$db_name -db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) +#REMOVEME? db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= ynh_script_progression --message="Setting up source files..." -ynh_app_setting_set --app=$app --key=final_path --value=$final_path -mkdir -p "$final_path" -mkdir -p "$final_path/avatar-cache" -mkdir -p "$final_path/data" +#REMOVEME? ynh_app_setting_set --app=$app --key=install_dir --value=$install_dir +mkdir -p "$install_dir" +mkdir -p "$install_dir/avatar-cache" +mkdir -p "$install_dir/data" -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" +chmod 750 "$install_dir" +chmod -R o-rwx "$install_dir" +chown -R $app:www-data "$install_dir" #================================================= # NGINX CONFIGURATION @@ -134,10 +134,10 @@ ynh_secure_remove --file="$tempdir" if [ $used_forge = "GitHub" ] ; then ynh_script_progression --message="Configure hub..." --weight=1 - mkdir "$final_path/.config/" - ynh_add_config --template="../conf/hub_config" --destination="$final_path/.config/hub" + mkdir "$install_dir/.config/" + ynh_add_config --template="../conf/hub_config" --destination="$install_dir/.config/hub" - cat < "$final_path/.bashrc" + cat < "$install_dir/.bashrc" eval "$(hub alias -s /bin/bash)" EOF fi @@ -147,26 +147,26 @@ fi #================================================= ynh_script_progression --message="Install weblate using PIP..." --weight=80 -virtualenv --python=python3 "${final_path}/venv" -chown -R $app: "$final_path" +virtualenv --python=python3 "${install_dir}/venv" +chown -R $app: "$install_dir" #run source in a 'sub shell' ( set +o nounset - source "${final_path}/venv/bin/activate" + source "${install_dir}/venv/bin/activate" set -o nounset - cd "${final_path}" + cd "${install_dir}" - sudo --user=$app $final_path/venv/bin/pip install --upgrade pip setuptools wheel pkgconfig xxhash + sudo --user=$app $install_dir/venv/bin/pip install --upgrade pip setuptools wheel pkgconfig xxhash # Read the "Note" section in https://docs.weblate.org/en/weblate-4.11/admin/install/venv-debian.html#python-modules - sudo --user=$app $final_path/venv/bin/pip install --force-reinstall --no-binary :all: cffi + sudo --user=$app $install_dir/venv/bin/pip install --force-reinstall --no-binary :all: cffi # Still needed with latest version of weblate? - sudo --user=$app BORG_OPENSSL_PREFIX=/usr/lib/x86_64-linux-gnu/ $final_path/venv/bin/pip install Weblate=="$(ynh_app_upstream_version)" - sudo --user=$app $final_path/venv/bin/pip install psycopg2-binary ruamel.yaml aeidon phply + sudo --user=$app BORG_OPENSSL_PREFIX=/usr/lib/x86_64-linux-gnu/ $install_dir/venv/bin/pip install Weblate=="$(ynh_app_upstream_version)" + sudo --user=$app $install_dir/venv/bin/pip install psycopg2-binary ruamel.yaml aeidon phply #pip install pytz python-bidi PyYaML Babel pyuca pylibravatar py3dns psycopg2-binary phply django-redis hiredis aeidon ruamel.yaml # specific to YunoHost package: - sudo --user=$app $final_path/venv/bin/pip install django_sendmail_backend + sudo --user=$app $install_dir/venv/bin/pip install django_sendmail_backend ) #================================================= @@ -176,24 +176,24 @@ ynh_script_progression --message="Adding a configuration file..." --weight=1 redis_db=$(ynh_redis_get_free_db) ynh_app_setting_set --app=$app --key=redis_db --value="$redis_db" -path_url="${path_url%/}" -settings="$final_path/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" +path="${path%/}" +settings="$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" set_forge_variables ynh_add_config --template="../conf/settings.py" --destination="$settings" -ynh_add_config --template="../conf/celery-weblate" --destination="$final_path/celery-weblate" +ynh_add_config --template="../conf/celery-weblate" --destination="$install_dir/celery-weblate" ynh_add_config --template="../conf/uwsgi.ini" --destination="/etc/uwsgi/apps-available/$app.ini" -touch "$final_path/local_settings.py" -ln -sf "$final_path/local_settings.py" "$final_path/venv/lib/$weblate_pypath/site-packages/weblate/local_settings.py" +touch "$install_dir/local_settings.py" +ln -sf "$install_dir/local_settings.py" "$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/local_settings.py" # Set permissions to app files -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app: "$final_path" -chown "$app:www-data" "$final_path" -chown -R "$app:www-data" "$final_path/data" +chmod 750 "$install_dir" +chmod -R o-rwx "$install_dir" +chown -R $app: "$install_dir" +chown "$app:www-data" "$install_dir" +chown -R "$app:www-data" "$install_dir/data" #================================================= # SPECIFIC SETUP Filling up the database @@ -203,23 +203,23 @@ ynh_script_progression --message="Filling up the database..." --weight=10 ( set +o nounset - source "${final_path}/venv/bin/activate" + source "${install_dir}/venv/bin/activate" set -o nounset export DJANGO_SETTINGS_MODULE="weblate.settings" - cd "${final_path}" + cd "${install_dir}" # the user needs to be weblate for postgresql - ynh_exec_warn_less sudo --user=$app $final_path/venv/bin/weblate migrate --noinput + ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate migrate --noinput # generate static files - ynh_exec_warn_less sudo --user=$app $final_path/venv/bin/weblate collectstatic --noinput - ynh_exec_warn_less sudo --user=$app $final_path/venv/bin/weblate createadmin --no-color \ + ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate collectstatic --noinput + ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate createadmin --no-color \ --password "$password" \ --username "$admin" \ --email "$admin_mail" # Check the configuration # This may fail in some cases with errors, etc., but the app works and the user can fix issues later. - ynh_exec_warn_less sudo --user=$app $final_path/venv/bin/weblate check --deploy || true + ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate check --deploy || true ) #================================================= @@ -259,20 +259,20 @@ ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/va #================================================= # SETUP SSOWAT #================================================= -ynh_script_progression --message="Configuring permissions..." --weight=1 +#REMOVEME? ynh_script_progression --message="Configuring permissions..." --weight=1 # Make app public if necessary -if [ $is_public -eq 1 ] +#REMOVEME? 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" +#REMOVEME? ynh_permission_update --permission="main" --add="visitors" fi #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." --weight=1 +#REMOVEME? ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name="nginx" --action="reload" diff --git a/scripts/remove b/scripts/remove index 40bb765..b899e7f 100755 --- a/scripts/remove +++ b/scripts/remove @@ -12,14 +12,14 @@ source /usr/share/yunohost/helpers #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." --weight=1 +#REMOVEME? ynh_script_progression --message="Loading installation settings..." --weight=1 -app=$YNH_APP_INSTANCE_NAME +#REMOVEME? app=$YNH_APP_INSTANCE_NAME -domain=$(ynh_app_setting_get --app=$app --key=domain) -db_name=$(ynh_app_setting_get --app=$app --key=db_name) -db_user=$db_name -final_path=$(ynh_app_setting_get --app=$app --key=final_path) +#REMOVEME? domain=$(ynh_app_setting_get --app=$app --key=domain) +#REMOVEME? db_name=$(ynh_app_setting_get --app=$app --key=db_name) +#REMOVEME? db_user=$db_name +#REMOVEME? #REMOVEME? install_dir=$(ynh_app_setting_get --app=$app --key=install_dir) #================================================= # STANDARD REMOVE @@ -61,18 +61,18 @@ ynh_remove_logrotate #================================================= # REMOVE THE POSTGRESQL DATABASE #================================================= -ynh_script_progression --message="Removing the PostgreSQL database..." --weight=1 +#REMOVEME? ynh_script_progression --message="Removing the PostgreSQL database..." --weight=1 # Remove a database if it exists, along with the associated user -ynh_psql_remove_db --db_user=$db_user --db_name=$db_name +#REMOVEME? ynh_psql_remove_db --db_user=$db_user --db_name=$db_name #================================================= # REMOVE APP MAIN DIR #================================================= -ynh_script_progression --message="Removing app main directory..." --weight=2 +#REMOVEME? ynh_script_progression --message="Removing app main directory..." --weight=2 # Remove the app directory securely -ynh_secure_remove --file="$final_path" +#REMOVEME? ynh_secure_remove --file="$install_dir" #================================================= # REMOVE NGINX CONFIGURATION @@ -85,10 +85,10 @@ ynh_remove_nginx_config #================================================= # REMOVE DEPENDENCIES #================================================= -ynh_script_progression --message="Removing dependencies..." --weight=10 +#REMOVEME? ynh_script_progression --message="Removing dependencies..." --weight=10 # Remove metapackage and its dependencies -ynh_exec_warn_less ynh_remove_app_dependencies +#REMOVEME? ynh_exec_warn_less ynh_remove_app_dependencies #================================================= # REMOVE XXHASH @@ -121,10 +121,10 @@ ynh_redis_remove_db #================================================= # REMOVE DEDICATED USER #================================================= -ynh_script_progression --message="Removing the dedicated system user..." --weight=1 +#REMOVEME? ynh_script_progression --message="Removing the dedicated system user..." --weight=1 # Delete a system user -ynh_system_user_delete --username=$app +#REMOVEME? ynh_system_user_delete --username=$app #================================================= # END OF SCRIPT diff --git a/scripts/restore b/scripts/restore index 79712aa..f23e067 100755 --- a/scripts/restore +++ b/scripts/restore @@ -14,68 +14,68 @@ source /usr/share/yunohost/helpers # MANAGE SCRIPT FAILURE #================================================= -ynh_clean_setup () { +#REMOVEME? ynh_clean_setup () { ynh_clean_check_starting } # Exit if an error occurs during the execution of the script -ynh_abort_if_errors +#REMOVEME? ynh_abort_if_errors #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." --weight=1 +#REMOVEME? ynh_script_progression --message="Loading installation settings..." --weight=1 -app=$YNH_APP_INSTANCE_NAME +#REMOVEME? app=$YNH_APP_INSTANCE_NAME -domain=$(ynh_app_setting_get --app=$app --key=domain) -path_url=$(ynh_app_setting_get --app=$app --key=path) -final_path=$(ynh_app_setting_get --app=$app --key=final_path) -db_name=$(ynh_app_setting_get --app=$app --key=db_name) -db_user=$db_name +#REMOVEME? domain=$(ynh_app_setting_get --app=$app --key=domain) +#REMOVEME? path=$(ynh_app_setting_get --app=$app --key=path) +#REMOVEME? #REMOVEME? install_dir=$(ynh_app_setting_get --app=$app --key=install_dir) +#REMOVEME? db_name=$(ynh_app_setting_get --app=$app --key=db_name) +#REMOVEME? db_user=$db_name #================================================= # CHECK IF THE APP CAN BE RESTORED #================================================= -ynh_script_progression --message="Validating restoration parameters..." --weight=1 +#REMOVEME? ynh_script_progression --message="Validating restoration parameters..." --weight=1 -test ! -d $final_path \ - || ynh_die --message="There is already a directory: $final_path " +#REMOVEME? test ! -d $install_dir \ + || ynh_die --message="There is already a directory: $install_dir " #================================================= # STANDARD RESTORATION STEPS #================================================= # RECREATE THE DEDICATED USER #================================================= -ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 +#REMOVEME? 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" --use_shell +#REMOVEME? ynh_system_user_create --username=$app --home_dir="$install_dir" --use_shell #================================================= # RESTORE THE APP MAIN DIR #================================================= ynh_script_progression --message="Restoring the app main directory..." --weight=4 -ynh_restore_file --origin_path="$final_path" +ynh_restore_file --origin_path="$install_dir" -touch "$final_path/local_settings.py" -ln -sf "$final_path/local_settings.py" "$final_path/venv/lib/$weblate_pypath/site-packages/weblate/local_settings.py" +touch "$install_dir/local_settings.py" +ln -sf "$install_dir/local_settings.py" "$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/local_settings.py" -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app: "$final_path" -chown $app:www-data "$final_path" -chown -R $app:www-data "$final_path/data" +chmod 750 "$install_dir" +chmod -R o-rwx "$install_dir" +chown -R $app: "$install_dir" +chown $app:www-data "$install_dir" +chown -R $app:www-data "$install_dir/data" #================================================= # SPECIFIC RESTORATION #================================================= # REINSTALL DEPENDENCIES #================================================= -ynh_script_progression --message="Reinstalling dependencies..." --weight=40 +#REMOVEME? ynh_script_progression --message="Reinstalling dependencies..." --weight=40 # Define and install dependencies -ynh_exec_warn_less ynh_install_app_dependencies "$pkg_dependencies" +#REMOVEME? ynh_exec_warn_less ynh_install_app_dependencies "$pkg_dependencies" #================================================= # RESTORE THE NGINX CONFIGURATION @@ -87,11 +87,11 @@ ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # RESTORE THE POSTGRESQL DATABASE #================================================= -ynh_script_progression --message="Restoring the PostgreSQL database..." --weight=5 +#REMOVEME? ynh_script_progression --message="Restoring the PostgreSQL database..." --weight=5 -db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) -ynh_psql_test_if_first_run -ynh_psql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd +#REMOVEME? db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) +#REMOVEME? ynh_psql_test_if_first_run +#REMOVEME? ynh_psql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd ynh_psql_execute_as_root --sql="CREATE EXTENSION IF NOT EXISTS pg_trgm;" --database=$db_name ynh_psql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./db.sql diff --git a/scripts/upgrade b/scripts/upgrade index 253c470..3457486 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -12,21 +12,21 @@ source /usr/share/yunohost/helpers #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." --weight=1 +#REMOVEME? ynh_script_progression --message="Loading installation settings..." --weight=1 -app=$YNH_APP_INSTANCE_NAME +#REMOVEME? 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) -db_user=$db_name -db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) -used_forge=$(ynh_app_setting_get --app=$app --key=used_forge) -forge_username=$(ynh_app_setting_get --app=$app --key=forge_username) -forge_token=$(ynh_app_setting_get --app=$app --key=forge_token) -redis_db=$(ynh_app_setting_get --app=$app --key=redis_db) +#REMOVEME? domain=$(ynh_app_setting_get --app=$app --key=domain) +#REMOVEME? path=$(ynh_app_setting_get --app=$app --key=path) +#REMOVEME? admin=$(ynh_app_setting_get --app=$app --key=admin) +#REMOVEME? #REMOVEME? install_dir=$(ynh_app_setting_get --app=$app --key=install_dir) +#REMOVEME? db_name=$(ynh_app_setting_get --app=$app --key=db_name) +#REMOVEME? db_user=$db_name +#REMOVEME? db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) +#REMOVEME? used_forge=$(ynh_app_setting_get --app=$app --key=used_forge) +#REMOVEME? forge_username=$(ynh_app_setting_get --app=$app --key=forge_username) +#REMOVEME? forge_token=$(ynh_app_setting_get --app=$app --key=forge_token) +#REMOVEME? redis_db=$(ynh_app_setting_get --app=$app --key=redis_db) admin_mail=$(ynh_user_get_info --username="$admin" --key=mail) key=$(ynh_string_random --length=50) @@ -40,17 +40,17 @@ upgrade_type=$(ynh_check_app_version_changed) #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= -ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --weight=40 +#REMOVEME? ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --weight=40 # Backup the current version of the app -ynh_backup_before_upgrade -ynh_clean_setup () { +#REMOVEME? ynh_backup_before_upgrade +#REMOVEME? ynh_clean_setup () { ynh_clean_check_starting # Restore it if the upgrade fails - ynh_restore_upgradebackup +#REMOVEME? ynh_restore_upgradebackup } # Exit if an error occurs during the execution of the script -ynh_abort_if_errors +#REMOVEME? ynh_abort_if_errors #================================================= # STANDARD UPGRADE STEPS @@ -67,16 +67,16 @@ ynh_systemd_action --service_name="$app-celery" --action="stop" --log_path="syst #================================================= ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 -if ynh_legacy_permissions_exists +#REMOVEME? if ynh_legacy_permissions_exists then - ynh_legacy_permissions_delete_all +#REMOVEME? ynh_legacy_permissions_delete_all ynh_app_setting_delete --app=$app --key=is_public fi -if [[ -d "$final_path/bin/" ]] +if [[ -d "$install_dir/bin/" ]] then - ynh_secure_remove --file="$final_path/bin/" +#REMOVEME? ynh_secure_remove --file="$install_dir/bin/" fi # (<3.8) log cleanups @@ -91,8 +91,8 @@ fi # If used_forge, forge_username, forge_token don't exist, create them if [ -z "$used_forge" ]; then used_forge="GitHub" - forge_username=$(ynh_app_setting_get --app=$app --key=github_account) - forge_token=$(ynh_app_setting_get --app=$app --key=github_token) +#REMOVEME? forge_username=$(ynh_app_setting_get --app=$app --key=github_account) +#REMOVEME? forge_token=$(ynh_app_setting_get --app=$app --key=github_token) ynh_app_setting_set --app=$app --key=used_forge --value=$used_forge ynh_app_setting_set --app=$app --key=forge_username --value=$forge_username ynh_app_setting_set --app=$app --key=forge_token --value=$forge_token @@ -101,17 +101,17 @@ fi #================================================= # CREATE DEDICATED USER #================================================= -ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 +#REMOVEME? 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" --use_shell +#REMOVEME? ynh_system_user_create --username=$app --home_dir="$install_dir" --use_shell #================================================= # UPGRADE DEPENDENCIES #================================================= -ynh_script_progression --message="Upgrading dependencies..." --weight=5 +#REMOVEME? ynh_script_progression --message="Upgrading dependencies..." --weight=5 -ynh_exec_warn_less ynh_install_app_dependencies "$pkg_dependencies" +#REMOVEME? ynh_exec_warn_less ynh_install_app_dependencies "$pkg_dependencies" #================================================= # NGINX CONFIGURATION @@ -143,10 +143,10 @@ ynh_secure_remove --file="$tempdir" if [ $used_forge = "GitHub" ] ; then ynh_script_progression --message="Configure hub..." --weight=1 - #mkdir "$final_path/.config/" - ynh_add_config --template="../conf/hub_config" --destination="$final_path/.config/hub" + #mkdir "$install_dir/.config/" + ynh_add_config --template="../conf/hub_config" --destination="$install_dir/.config/hub" - cat < "$final_path/.bashrc" + cat < "$install_dir/.bashrc" eval "$(hub alias -s /bin/bash)" EOF fi @@ -158,7 +158,7 @@ ynh_script_progression --message="Updating a configuration file..." --weight=2 ynh_add_config --template="../conf/uwsgi.ini" --destination="/etc/uwsgi/apps-available/$app.ini" -ynh_add_config --template="../conf/celery-weblate" --destination="$final_path/celery-weblate" +ynh_add_config --template="../conf/celery-weblate" --destination="$install_dir/celery-weblate" #================================================= # SETUP SYSTEMD @@ -180,27 +180,27 @@ upgrade() { #================================================= ynh_script_progression --message="Install weblate using PIP..." --weight=15 - ynh_secure_remove --file="${final_path}/venv" - virtualenv --python=python3 "${final_path}/venv" - chown -R $app: "$final_path" + ynh_secure_remove --file="${install_dir}/venv" + virtualenv --python=python3 "${install_dir}/venv" + chown -R $app: "$install_dir" #run source in a 'sub shell' ( set +o nounset - source "${final_path}/venv/bin/activate" + source "${install_dir}/venv/bin/activate" set -o nounset - cd "${final_path}" + cd "${install_dir}" - sudo --user=$app $final_path/venv/bin/pip install --upgrade pip setuptools wheel pkgconfig xxhash + sudo --user=$app $install_dir/venv/bin/pip install --upgrade pip setuptools wheel pkgconfig xxhash # Read the "Note" section in https://docs.weblate.org/en/weblate-4.11/admin/install/venv-debian.html#python-modules - sudo --user=$app $final_path/venv/bin/pip install --force-reinstall --no-binary :all: cffi + sudo --user=$app $install_dir/venv/bin/pip install --force-reinstall --no-binary :all: cffi # Still needed with latest version of weblate? - sudo --user=$app $final_path/venv/bin/pip install --upgrade Weblate=="$new_version" - sudo --user=$app $final_path/venv/bin/pip install psycopg2-binary ruamel.yaml aeidon phply + sudo --user=$app $install_dir/venv/bin/pip install --upgrade Weblate=="$new_version" + sudo --user=$app $install_dir/venv/bin/pip install psycopg2-binary ruamel.yaml aeidon phply #pip install pytz python-bidi PyYaML Babel pyuca pylibravatar py3dns psycopg2-binary phply django-redis hiredis aeidon ruamel.yaml # specific to YunoHost package: - sudo --user=$app $final_path/venv/bin/pip install django_sendmail_backend + sudo --user=$app $install_dir/venv/bin/pip install django_sendmail_backend ) #================================================= @@ -208,8 +208,8 @@ upgrade() { #================================================= ynh_script_progression --message="Create weblate configuration file..." --weight=2 # save old settings file - settings="$final_path/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" - path_url="${path_url%/}" + settings="$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" + path="${path%/}" set_forge_variables @@ -220,8 +220,8 @@ upgrade() { # Recalculate and store the config file checksum into the app settings ynh_store_file_checksum --file="$settings" - touch "$final_path/local_settings.py" - ln -sf "$final_path/local_settings.py" "$final_path/venv/lib/$weblate_pypath/site-packages/weblate/local_settings.py" + touch "$install_dir/local_settings.py" + ln -sf "$install_dir/local_settings.py" "$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/local_settings.py" #================================================= # MIGRATE WEBLATE @@ -232,34 +232,34 @@ upgrade() { ( set +o nounset - source "${final_path}/venv/bin/activate" + source "${install_dir}/venv/bin/activate" set -o nounset export DJANGO_SETTINGS_MODULE="weblate.settings" - cd "${final_path}" + cd "${install_dir}" - sudo --user=$app $final_path/venv/bin/weblate migrate --noinput - sudo --user=$app $final_path/venv/bin/weblate collectstatic --noinput - sudo --user=$app $final_path/venv/bin/weblate setuplang - sudo --user=$app $final_path/venv/bin/weblate setupgroups - sudo --user=$app $final_path/venv/bin/weblate compilemessages + sudo --user=$app $install_dir/venv/bin/weblate migrate --noinput + sudo --user=$app $install_dir/venv/bin/weblate collectstatic --noinput + sudo --user=$app $install_dir/venv/bin/weblate setuplang + sudo --user=$app $install_dir/venv/bin/weblate setupgroups + sudo --user=$app $install_dir/venv/bin/weblate compilemessages # Check the configuration # This may fail in some cases with errors, etc., but the app works and the user can fix issues later. if [ "$new_version" == "$(ynh_app_upstream_version)" ]; then - sudo --user=$app $final_path/venv/bin/weblate check --deploy || true + sudo --user=$app $install_dir/venv/bin/weblate check --deploy || true fi ) ynh_systemd_action --service_name="$app-celery" --action="stop" } -file_version="${final_path}/venv/lib/$weblate_pypath/site-packages/weblate/__init__.py" +file_version="${install_dir}/venv/lib/$weblate_pypath/site-packages/weblate/__init__.py" if [ -e $file_version ] then current_version=$(cat $file_version | grep "^VERSION = " | grep -o "[0-9].[0-9]" | head -n1 | cut -d"." -f1) if [ -z "$current_version" ] then - file_version="${final_path}/venv/lib/$weblate_pypath/site-packages/weblate/utils/version.py" + file_version="${install_dir}/venv/lib/$weblate_pypath/site-packages/weblate/utils/version.py" current_version=$(cat $file_version | grep "^VERSION = " | grep -o "[0-9].[0-9]" | head -n1 | cut -d"." -f1) fi else @@ -276,13 +276,13 @@ fi upgrade $(ynh_app_upstream_version) "../conf/settings.py" # Set right permissions for curl installation -mkdir -p "$final_path/avatar-cache" -chown -R $app: "$final_path" -chown "$app:www-data" "$final_path" -chown -R "$app:www-data" "$final_path/data" +mkdir -p "$install_dir/avatar-cache" +chown -R $app: "$install_dir" +chown "$app:www-data" "$install_dir" +chown -R "$app:www-data" "$install_dir/data" -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" +chmod 750 "$install_dir" +chmod -R o-rwx "$install_dir" #================================================= # GENERIC FINALIZATION @@ -313,9 +313,9 @@ ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/va #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." --weight=1 +#REMOVEME? ynh_script_progression --message="Reloading NGINX web server..." --weight=1 -ynh_systemd_action --service_name=nginx --action=reload +#REMOVEME? ynh_systemd_action --service_name=nginx --action=reload #================================================= # END OF SCRIPT diff --git a/tests.toml b/tests.toml new file mode 100644 index 0000000..82dcc43 --- /dev/null +++ b/tests.toml @@ -0,0 +1,19 @@ +test_format = 1.0 + +[default] + + # ------------ + # Tests to run + # ------------ + + + # ------------------------------- + # Default args to use for install + # ------------------------------- + + + # ------------------------------- + # Commits to test upgrade from + # ------------------------------- + + \ No newline at end of file diff --git a/weblate_v2.zip b/weblate_v2.zip deleted file mode 100644 index c78a46a5c8b33589826b79a80438b3425a95bf6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122562 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 R683xnVQ-;TiCle(+gReEC0VGorB%~?+=J} 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