From 76ce0e961e27a80ca7a01d778b856de2bd06c730 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 11 Oct 2020 22:38:04 +0200 Subject: [PATCH 001/131] v.0.12.3 --- README.md | 32 ++++++++---------- conf/arm.src | 10 ++---- conf/i386.src | 10 ++---- conf/x86-64.src | 10 ++---- manifest.json | 5 ++- scripts/backup | 1 - scripts/change_url | 1 - scripts/experimental_helper.sh | 61 ---------------------------------- scripts/install | 1 - scripts/remove | 1 - scripts/restore | 1 - scripts/upgrade | 1 - 12 files changed, 22 insertions(+), 112 deletions(-) delete mode 100644 scripts/experimental_helper.sh diff --git a/README.md b/README.md index 1e22aa8..0a8ab12 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Gogs package for YunoHost +# Gogs for YunoHost Gogs is a self-hosted Git service written in Go. Alternative to Github. - [Gogs website](http://gogs.io) @@ -77,27 +77,23 @@ Architecture: this package is compatible with amd64, i386 and arm. The package w ## Private Mode Actually it's possible to access to the git repositories by the `git` command over http also in private mode installation. It's important to know that in this mode the repository could be ALSO getted if you don't set the repository as private in the repos settings. -## Issue -Any issue is welcome here : https://github.com/YunoHost-Apps/gogs_ynh/issues +## Links -## License -Gogs is published under the MIT License: -https://github.com/gogits/gogs/blob/master/LICENSE + * Report a bug: https://github.com/YunoHost-Apps/gogs_ynh/issues + * App website: http://gogs.io + * Upstream app repository: https://github.com/gogs/gogs + * YunoHost website: https://yunohost.org/ -This package is published under the MIT License. +--- +## Developer info -## Developper info -Please do your pull requests to the `dev` branch. - -Test or upgrade to dev version: -```bash -sudo su - admin -git clone -b dev https://github.com/YunoHost-Apps/gogs_ynh -# to install -sudo yunohost app install -l Gogs /home/admin/gogs_ynh -# to upgrade -sudo yunohost app upgrade -f /home/admin/gogs_ynh gogs +Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/gogs_ynh/tree/testing). +To try the testing branch, please proceed like that. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/gogs_ynh/tree/testing --debug +or +sudo yunohost app upgrade gogs -u https://github.com/YunoHost-Apps/gogs_ynh/tree/testing --debug ``` diff --git a/conf/arm.src b/conf/arm.src index 7c882e3..f75a170 100644 --- a/conf/arm.src +++ b/conf/arm.src @@ -1,11 +1,5 @@ -SOURCE_URL=https://github.com/gogits/gogs/releases/download/v0.11.79/raspi2_armv6.zip -SOURCE_SUM=a7d17f6dc542fd2d88f884271bca9c62729fbd725fdb310616b2987dba382631 -# (Optional) Program to check the integrity (sha256sum, md5sum...) -# default: sha256 +SOURCE_URL=https://github.com/gogs/gogs/releases/download/v0.12.3/gogs_0.12.3_linux_armv7.zip +SOURCE_SUM=9116d4f1baf6a47dc3a47cfce8f435ad77f7939f2e80323f31382913e895ab35 SOURCE_SUM_PRG=sha256sum -# (Optional) Archive format -# default: tar.gz SOURCE_FORMAT=zip -# (Optional) Put false if sources are directly in the archive root -# default: true SOURCE_IN_SUBDIR=true diff --git a/conf/i386.src b/conf/i386.src index abf6148..a30b0a9 100644 --- a/conf/i386.src +++ b/conf/i386.src @@ -1,11 +1,5 @@ -SOURCE_URL=https://github.com/gogits/gogs/releases/download/v0.11.79/linux_386.zip -SOURCE_SUM=ad1a89eb01723a4b289b7b8773fd018f78b0dad801101f27c1af0f2d649edeeb -# (Optional) Program to check the integrity (sha256sum, md5sum...) -# default: sha256 +SOURCE_URL=https://github.com/gogs/gogs/releases/download/v0.12.3/gogs_0.12.3_linux_386.zip +SOURCE_SUM=bcf7a31ad61865217eca93f4d90ede15837c857accb2394782ebf4a7805e1cbc SOURCE_SUM_PRG=sha256sum -# (Optional) Archive format -# default: tar.gz SOURCE_FORMAT=zip -# (Optional) Put false if sources are directly in the archive root -# default: true SOURCE_IN_SUBDIR=true diff --git a/conf/x86-64.src b/conf/x86-64.src index cd8f52b..1e54b76 100644 --- a/conf/x86-64.src +++ b/conf/x86-64.src @@ -1,11 +1,5 @@ -SOURCE_URL=https://github.com/gogits/gogs/releases/download/v0.11.79/linux_amd64.zip -SOURCE_SUM=85f60494de63e6c4af16faba9bc739eb7c9e5477de1f16d11c6665495141162f -# (Optional) Program to check the integrity (sha256sum, md5sum...) -# default: sha256 +SOURCE_URL=https://github.com/gogs/gogs/releases/download/v0.12.3/gogs_0.12.3_linux_amd64.zip +SOURCE_SUM=0eeab278aaf8fc999329e611fe0709e95e08c26d15bdf60d499268f144e40406 SOURCE_SUM_PRG=sha256sum -# (Optional) Archive format -# default: tar.gz SOURCE_FORMAT=zip -# (Optional) Put false if sources are directly in the archive root -# default: true SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index f25402e..9a365df 100644 --- a/manifest.json +++ b/manifest.json @@ -1,5 +1,4 @@ { - "package_format": 1, "name": "Gogs", "id": "gogs", "packaging_format": 1, @@ -9,7 +8,7 @@ }, "url": "http://gogs.io", "license": "MIT", - "version": "0.11.66~ynh1", + "version": "0.12.3~ynh1", "maintainer": { "name": "Josué Tille", "email": "josue@tille.ch" @@ -24,7 +23,7 @@ "mysql" ], "requirements": { - "yunohost": ">= 2.7.12" + "yunohost": ">= 3.8.1" }, "arguments": { "install" : [ diff --git a/scripts/backup b/scripts/backup index 772fae0..01a0761 100644 --- a/scripts/backup +++ b/scripts/backup @@ -11,7 +11,6 @@ source /usr/share/yunohost/helpers ynh_abort_if_errors # Load common variables and helpers -source ../settings/scripts/experimental_helper.sh source ../settings/scripts/_common.sh # Retrieve app settings diff --git a/scripts/change_url b/scripts/change_url index c85fa31..fb02f6c 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -11,7 +11,6 @@ source /usr/share/yunohost/helpers ynh_abort_if_errors # Import common cmd -source ./experimental_helper.sh source ./_common.sh # RETRIEVE ARGUMENTS diff --git a/scripts/experimental_helper.sh b/scripts/experimental_helper.sh deleted file mode 100644 index 600a653..0000000 --- a/scripts/experimental_helper.sh +++ /dev/null @@ -1,61 +0,0 @@ -# Delete a file checksum from the app settings -# -# $app should be defined when calling this helper -# -# usage: ynh_remove_file_checksum file -# | arg: file - The file for which the checksum will be deleted -ynh_delete_file_checksum () { - local checksum_setting_name=checksum_${1//[\/ ]/_} # Replace all '/' and ' ' by '_' - ynh_app_setting_delete $app $checksum_setting_name -} - -# Start or restart a service and follow its booting -# -# usage: ynh_check_starting "Line to match" [Log file] [Timeout] [Service name] -# -# | arg: Line to match - The line to find in the log to attest the service have finished to boot. -# | arg: Log file - The log file to watch -# | arg: Service name -# /var/log/$app/$app.log will be used if no other log is defined. -# | arg: Timeout - The maximum time to wait before ending the watching. Defaut 300 seconds. -ynh_check_starting () { - local line_to_match="$1" - local service_name="${4:-$app}" - local app_log="${2:-/var/log/$service_name/$service_name.log}" - local timeout=${3:-300} - - ynh_clean_check_starting () { - # Stop the execution of tail. - kill -s 15 $pid_tail 2>&1 - ynh_secure_remove "$templog" 2>&1 - } - - echo "Starting of $service_name" >&2 - systemctl stop $service_name - local templog="$(mktemp)" - # Following the starting of the app in its log - tail -F -n0 "$app_log" > "$templog" & - # Get the PID of the tail command - local pid_tail=$! - systemctl start $service_name - - local i=0 - for i in `seq 1 $timeout` - do - # Read the log until the sentence is found, that means the app finished to start. Or run until the timeout - if grep --quiet "$line_to_match" "$templog" - then - echo "The service $service_name has correctly started." >&2 - break - fi - echo -n "." >&2 - sleep 1 - done - if [ $i -eq $timeout ] - then - echo "The service $service_name didn't fully started before the timeout." >&2 - fi - - echo "" - ynh_clean_check_starting -} \ No newline at end of file diff --git a/scripts/install b/scripts/install index 76586ee..b97b0a9 100644 --- a/scripts/install +++ b/scripts/install @@ -11,7 +11,6 @@ source /usr/share/yunohost/helpers ynh_abort_if_errors # Load common variables and helpers -source ./experimental_helper.sh source ./_common.sh # Retrieve arguments diff --git a/scripts/remove b/scripts/remove index 681dd01..e5deb31 100644 --- a/scripts/remove +++ b/scripts/remove @@ -8,7 +8,6 @@ source /usr/share/yunohost/helpers # Load common variables and helpers -source ./experimental_helper.sh source ./_common.sh #================================================= diff --git a/scripts/restore b/scripts/restore index 27b6ee5..f135ead 100644 --- a/scripts/restore +++ b/scripts/restore @@ -11,7 +11,6 @@ source /usr/share/yunohost/helpers ynh_abort_if_errors # Load common variables and helpers -source ../settings/scripts/experimental_helper.sh source ../settings/scripts/_common.sh # Retrieve old app settings diff --git a/scripts/upgrade b/scripts/upgrade index 82d0b6d..483f6b4 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -11,7 +11,6 @@ source /usr/share/yunohost/helpers ynh_abort_if_errors # Load common variables and helpers -source ./experimental_helper.sh source ./_common.sh # Retrieve app settings From 1390568de3cb3d7228659f20dacf2ead7bfe40f5 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 11 Oct 2020 22:45:51 +0200 Subject: [PATCH 002/131] fix --- README.md | 22 +++++++++++--------- scripts/_common.sh | 52 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 0a8ab12..4f3af24 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,20 @@ # Gogs for YunoHost -Gogs is a self-hosted Git service written in Go. Alternative to Github. -- [Gogs website](http://gogs.io) - -[![Integration level](https://dash.yunohost.org/integration/gogs.svg)](https://ci-apps.yunohost.org/jenkins/job/gogs%20%28Community%29/lastBuild/consoleFull) - +[![Integration level](https://dash.yunohost.org/integration/gogs.svg)](https://dash.yunohost.org/appci/app/gogs) ![](https://ci-apps.yunohost.org/ci/badges/gogs.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/gogs.maintain.svg) [![Install Gogs with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=gogs) -# IMPORTANT INFORMATION +*[Lire ce readme en français.](./README_fr.md)* -**Note that this package will not be longer be maintened by the actual maintener. -The idea is to migrate to [gitea](https://github.com/YunoHost-Apps/gitea_ynh) which is more featured.** +> *This package allows you to install Gogs quickly and simply on a YunoHost server. +If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* + +## Overview +Gogs is a self-hosted Git service written in Go. Alternative to Github. + +## Info +**Shipped version:** 0.12.3 + +# IMPORTANT INFORMATION For the old install you can migrate to gitea easly by juste upgrading your actuall gogs instance with the gitea source by this command: ``` @@ -67,8 +71,6 @@ Also, in some cases, Gogs will not restart properly during the update. If so, yo Sources and issues of the old package can be found [here](https://github.com/YunoHost-Apps/gogs_ynh_old/) -## Info -Gogs v0.11.66 - [YunoHost forum thread](https://forum.yunohost.org/t/gogs-package-an-awesome-github-alternative/1127) diff --git a/scripts/_common.sh b/scripts/_common.sh index 38d9424..ae6de87 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -106,3 +106,55 @@ set_access_settings() { ynh_app_setting_set $app skipped_regex "$excaped_domain$excaped_path/[%w-.]*/[%w-.]*/git%-receive%-pack,$excaped_domain$excaped_path/[%w-.]*/[%w-.]*/git%-upload%-pack,$excaped_domain$excaped_path/[%w-.]*/[%w-.]*/info/refs" fi } + + +# Start or restart a service and follow its booting +# +# usage: ynh_check_starting "Line to match" [Log file] [Timeout] [Service name] +# +# | arg: Line to match - The line to find in the log to attest the service have finished to boot. +# | arg: Log file - The log file to watch +# | arg: Service name +# /var/log/$app/$app.log will be used if no other log is defined. +# | arg: Timeout - The maximum time to wait before ending the watching. Defaut 300 seconds. +ynh_check_starting () { + local line_to_match="$1" + local service_name="${4:-$app}" + local app_log="${2:-/var/log/$service_name/$service_name.log}" + local timeout=${3:-300} + + ynh_clean_check_starting () { + # Stop the execution of tail. + kill -s 15 $pid_tail 2>&1 + ynh_secure_remove "$templog" 2>&1 + } + + echo "Starting of $service_name" >&2 + systemctl stop $service_name + local templog="$(mktemp)" + # Following the starting of the app in its log + tail -F -n0 "$app_log" > "$templog" & + # Get the PID of the tail command + local pid_tail=$! + systemctl start $service_name + + local i=0 + for i in `seq 1 $timeout` + do + # Read the log until the sentence is found, that means the app finished to start. Or run until the timeout + if grep --quiet "$line_to_match" "$templog" + then + echo "The service $service_name has correctly started." >&2 + break + fi + echo -n "." >&2 + sleep 1 + done + if [ $i -eq $timeout ] + then + echo "The service $service_name didn't fully started before the timeout." >&2 + fi + + echo "" + ynh_clean_check_starting +} From a62b96d9e563974bac8e640a567e27d7796cb4ca Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 11 Oct 2020 23:46:18 +0200 Subject: [PATCH 003/131] fix --- check_process | 3 --- manifest.json | 2 +- scripts/backup | 59 ++++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/check_process b/check_process index 14429cb..e03f6ef 100644 --- a/check_process +++ b/check_process @@ -14,7 +14,6 @@ upgrade=1 upgrade=1 from_commit=aa075b2051ffad7b0b6fef3a9c767376d5bdbfab upgrade=1 from_commit=1cbec051e1171de5a8ed1e850eb4fb3506114da5 - upgrade=1 from_commit=5a706ed246392c1ce39c47a648cb93e2996e80d3 backup_restore=1 multi_instance=1 incorrect_path=0 @@ -37,5 +36,3 @@ name=Before multi_instance and refactoring ; commit=1cbec051e1171de5a8ed1e850eb4fb3506114da5 name=From V0.10.18 - ; commit=5a706ed246392c1ce39c47a648cb93e2996e80d3 - name=The oldest package diff --git a/manifest.json b/manifest.json index 9a365df..0994575 100644 --- a/manifest.json +++ b/manifest.json @@ -59,7 +59,7 @@ "name": "is_public", "type": "boolean", "ask": { - "en": "Is it a public site ?", + "en": "Is it a public site?", "fr": "Est-ce un site public ?" }, "default": true diff --git a/scripts/backup b/scripts/backup index 01a0761..318a30c 100644 --- a/scripts/backup +++ b/scripts/backup @@ -3,35 +3,70 @@ #================================================= # GENERIC START #================================================= - # IMPORT GENERIC HELPERS +#================================================= + +source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -# Exit if an error occurs during the execution of the script +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + ynh_abort_if_errors -# Load common variables and helpers -source ../settings/scripts/_common.sh +#================================================= +# LOAD SETTINGS +#================================================= +ynh_print_info --message="Loading installation settings..." -# Retrieve app settings -domain=$(ynh_app_setting_get "$app" domain) +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) #================================================= -# STANDARD BACKUP STEPS +# DECLARE DATA AND CONF FILES TO BACKUP +#================================================= +ynh_print_info --message="Declaring files to be backed up..." + +#================================================= +# BACKUP THE APP MAIN DIR #================================================= -# Copy the app source files ynh_backup "$final_path" # Copy the data files ynh_backup "$DATADIR" -# Copy the conf files +#================================================= +# BACKUP THE NGINX CONFIGURATION +#================================================= + ynh_backup "/etc/nginx/conf.d/${domain}.d/${app}.conf" + +#================================================= +# BACKUP SYSTEMD +#================================================= + ynh_backup "/etc/systemd/system/${app}.service" -# Backup logs +#================================================= +# BACKUP VARIOUS FILES +#================================================= + ynh_backup "/var/log/$app" -# Dump the database -ynh_mysql_dump_db "$dbname" > ./db.sql \ No newline at end of file +#================================================= +# BACKUP THE MYSQL DATABASE +#================================================= +ynh_print_info --message="Backing up the MySQL database..." + +ynh_mysql_dump_db --database="$db_name" > db.sql + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." From 8c4ff1d828437a01a890f9b7c5fda4f904aa3865 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 11 Oct 2020 23:51:25 +0200 Subject: [PATCH 004/131] Update remove --- scripts/remove | 91 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 72 insertions(+), 19 deletions(-) diff --git a/scripts/remove b/scripts/remove index e5deb31..6dabec1 100644 --- a/scripts/remove +++ b/scripts/remove @@ -3,43 +3,96 @@ #================================================= # GENERIC START #================================================= - # IMPORT GENERIC HELPERS +#================================================= + +source _common.sh source /usr/share/yunohost/helpers -# Load common variables and helpers -source ./_common.sh +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 + +app=$YNH_APP_INSTANCE_NAME + +domain=$(ynh_app_setting_get --app=$app --key=domain) +port=$(ynh_app_setting_get --app=$app --key=port) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$db_name +final_path=$(ynh_app_setting_get --app=$app --key=final_path) #================================================= # STANDARD REMOVE #================================================= +# REMOVE SERVICE INTEGRATION IN YUNOHOST +#================================================= -# Stop gogs -systemctl stop "$app".service +# Remove the service from the list of services known by Yunohost (added from `yunohost service add`) +if ynh_exec_warn_less yunohost service status $app >/dev/null +then + ynh_script_progression --message="Removing $app service integration..." --weight=1 + yunohost service remove $app +fi -# Drop MySQL database and user -ynh_mysql_drop_db "$dbname" 2>/dev/null -ynh_mysql_drop_user "$dbuser" 2>/dev/null +#================================================= +# STOP AND REMOVE SERVICE +#================================================= +ynh_script_progression --message="Stopping and removing the systemd service..." --weight=1 -# Retrieve domain from app settings -domain=$(ynh_app_setting_get "$app" domain) +# Remove the dedicated systemd config +ynh_remove_systemd_config + +#================================================= +# REMOVE THE MYSQL DATABASE +#================================================= +ynh_script_progression --message="Removing the MySQL database..." --weight=2 + +# Remove a database if it exists, along with the associated user +ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name + +#================================================= +# REMOVE APP MAIN DIR +#================================================= +ynh_script_progression --message="Removing app main directory..." --time --weight=3 + +# Remove the app directory securely +ynh_secure_remove --file="$final_path" + +#================================================= +# REMOVE VARIOUS FILES +#================================================= -# Delete app directory and configurations -ynh_secure_remove "$final_path" ynh_secure_remove "$DATADIR" + ynh_secure_remove "/var/log/$app" +#================================================= +# REMOVE LOGROTATE CONFIGURATION +#================================================= +ynh_script_progression --message="Removing logrotate configuration..." --weight=1 + # Remove the app-specific logrotate config ynh_remove_logrotate -# Remove nginx config +#================================================= +# REMOVE NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Removing NGINX web server configuration..." --weight=1 + +# Remove the dedicated nginx config ynh_remove_nginx_config -# Remove gogs user and data -ynh_system_user_delete $app +#================================================= +# REMOVE DEDICATED USER +#================================================= +ynh_script_progression --message="Removing the dedicated system user..." --weight=1 -# Remove init script -ynh_remove_systemd_config +# Delete a system user +ynh_system_user_delete --username=$app -# Remove monitor -yunohost service remove "$app" \ No newline at end of file +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Removal of $app completed" --last From 7482a6be327ee6d0ebaf113aca3711ba1ee88ac2 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 11 Oct 2020 23:52:45 +0200 Subject: [PATCH 005/131] Update README.md --- README.md | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/README.md b/README.md index 4f3af24..9dfcb2b 100644 --- a/README.md +++ b/README.md @@ -31,19 +31,6 @@ For the new install just install gitea by this command: sudo yunohost app install -l Gitea https://github.com/YunoHost-Apps/gitea_ynh ``` -## Requirements -A functional instance of [YunoHost](https://yunohost.org) - -## Installation -From the command-line: - -`sudo yunohost app install -l Gogs https://github.com/YunoHost-Apps/gogs_ynh` - -## Upgrade -From the command-line: - -`sudo yunohost app upgrade -u https://github.com/YunoHost-Apps/gogs_ynh gogs` - ## Notes on SSH usage If you want to use Gogs with ssh and be able to pull/push with you ssh key, your ssh daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: @@ -64,16 +51,6 @@ Host domain.tld port 2222 # change this with the port you use ``` -## Info on upgrading from the old package version (gogs <0.9.xx) -Previous versions of this package used to build Gogs from sources instead of using the pre-compiled binary. It also left data in many places which was not good. The upgrade tries to take care of moving everything to the right place **BUT it's strongly advised to do a backup of your repositories and of the Gogs directory before the update**. Your avatars and issue attachments files may be lost in the process. - -Also, in some cases, Gogs will not restart properly during the update. If so, you can rerun the update safely or try to start Gogs with `sudo systemctl restart gogs.service`. - -Sources and issues of the old package can be found [here](https://github.com/YunoHost-Apps/gogs_ynh_old/) - - -- [YunoHost forum thread](https://forum.yunohost.org/t/gogs-package-an-awesome-github-alternative/1127) - Architecture: this package is compatible with amd64, i386 and arm. The package will try to detect it with the command uname -m and fail if it can't detect the architecture. If that happens please open an issue describing your hardware and the result of the command `uname -m`. ## Private Mode From b210eb4a09218f5d311765136625718551646460 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 3 Nov 2020 22:59:36 +0100 Subject: [PATCH 006/131] Update manifest.json --- manifest.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/manifest.json b/manifest.json index f25402e..a503649 100644 --- a/manifest.json +++ b/manifest.json @@ -1,5 +1,4 @@ { - "package_format": 1, "name": "Gogs", "id": "gogs", "packaging_format": 1, @@ -7,9 +6,9 @@ "en": "Lightweight git forge", "fr": "Forge git légère" }, + "version": "0.11.66~ynh1", "url": "http://gogs.io", "license": "MIT", - "version": "0.11.66~ynh1", "maintainer": { "name": "Josué Tille", "email": "josue@tille.ch" @@ -24,7 +23,7 @@ "mysql" ], "requirements": { - "yunohost": ">= 2.7.12" + "yunohost": ">= 3.8.1" }, "arguments": { "install" : [ @@ -60,7 +59,7 @@ "name": "is_public", "type": "boolean", "ask": { - "en": "Is it a public site ?", + "en": "Is it a public site?", "fr": "Est-ce un site public ?" }, "default": true From 8ae491b0e854fee4c9122c211c13604dcd6fe41f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 3 Nov 2020 23:08:23 +0100 Subject: [PATCH 007/131] Update README.md --- README.md | 78 +++++++++++++++++++++++-------------------------------- 1 file changed, 32 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 1e22aa8..9c6944f 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,6 @@ -# Gogs package for YunoHost - -Gogs is a self-hosted Git service written in Go. Alternative to Github. -- [Gogs website](http://gogs.io) - -[![Integration level](https://dash.yunohost.org/integration/gogs.svg)](https://ci-apps.yunohost.org/jenkins/job/gogs%20%28Community%29/lastBuild/consoleFull) +# Gogs for YunoHost +[![Integration level](https://dash.yunohost.org/integration/gogs.svg)](https://dash.yunohost.org/appci/app/gogs) ![](https://ci-apps.yunohost.org/ci/badges/gogs.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/gogs.maintain.svg) [![Install Gogs with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=gogs) # IMPORTANT INFORMATION @@ -12,6 +8,20 @@ Gogs is a self-hosted Git service written in Go. Alternative to Github. **Note that this package will not be longer be maintened by the actual maintener. The idea is to migrate to [gitea](https://github.com/YunoHost-Apps/gitea_ynh) which is more featured.** +## Overview +Gogs is a self-hosted Git service written in Go. Alternative to Github. + +**Shipped version:** 0.11.66 + +## Screenshots + +![](https://gogs.io/img/screenshots/2.png) + + +## Demo + +* [Official demo](https://try.gogs.io/user/login) + For the old install you can migrate to gitea easly by juste upgrading your actuall gogs instance with the gitea source by this command: ``` sudo yunohost app upgrade -u https://github.com/YunoHost-Apps/gitea_ynh gogs @@ -27,19 +37,6 @@ For the new install just install gitea by this command: sudo yunohost app install -l Gitea https://github.com/YunoHost-Apps/gitea_ynh ``` -## Requirements -A functional instance of [YunoHost](https://yunohost.org) - -## Installation -From the command-line: - -`sudo yunohost app install -l Gogs https://github.com/YunoHost-Apps/gogs_ynh` - -## Upgrade -From the command-line: - -`sudo yunohost app upgrade -u https://github.com/YunoHost-Apps/gogs_ynh gogs` - ## Notes on SSH usage If you want to use Gogs with ssh and be able to pull/push with you ssh key, your ssh daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: @@ -65,39 +62,28 @@ Previous versions of this package used to build Gogs from sources instead of usi Also, in some cases, Gogs will not restart properly during the update. If so, you can rerun the update safely or try to start Gogs with `sudo systemctl restart gogs.service`. -Sources and issues of the old package can be found [here](https://github.com/YunoHost-Apps/gogs_ynh_old/) -## Info -Gogs v0.11.66 +#### Supported architectures -- [YunoHost forum thread](https://forum.yunohost.org/t/gogs-package-an-awesome-github-alternative/1127) +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/gogs%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/gogs/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/gogs%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/gogs/) -Architecture: this package is compatible with amd64, i386 and arm. The package will try to detect it with the command uname -m and fail if it can't detect the architecture. If that happens please open an issue describing your hardware and the result of the command `uname -m`. +## Links -## Private Mode -Actually it's possible to access to the git repositories by the `git` command over http also in private mode installation. It's important to know that in this mode the repository could be ALSO getted if you don't set the repository as private in the repos settings. + * Report a bug: https://github.com/YunoHost-Apps/gogs_ynh/issues + * App website: http://gogs.io + * Upstream app repository: https://github.com/gogs/gogs + * YunoHost website: https://yunohost.org/ -## Issue +--- -Any issue is welcome here : https://github.com/YunoHost-Apps/gogs_ynh/issues +## Developer info -## License -Gogs is published under the MIT License: -https://github.com/gogits/gogs/blob/master/LICENSE - -This package is published under the MIT License. - - -## Developper info -Please do your pull requests to the `dev` branch. - -Test or upgrade to dev version: -```bash -sudo su - admin -git clone -b dev https://github.com/YunoHost-Apps/gogs_ynh -# to install -sudo yunohost app install -l Gogs /home/admin/gogs_ynh -# to upgrade -sudo yunohost app upgrade -f /home/admin/gogs_ynh gogs +Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/gogs_ynh/tree/testing). +To try the testing branch, please proceed like that. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/gogs_ynh/tree/testing --debug +or +sudo yunohost app upgrade gogs -u https://github.com/YunoHost-Apps/gogs_ynh/tree/testing --debug ``` From b0dd390f9d2042df08f2a844ad81176a3e86dc16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 3 Nov 2020 23:10:09 +0100 Subject: [PATCH 008/131] Update README.md --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9c6944f..7afdd81 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,11 @@ [![Integration level](https://dash.yunohost.org/integration/gogs.svg)](https://dash.yunohost.org/appci/app/gogs) ![](https://ci-apps.yunohost.org/ci/badges/gogs.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/gogs.maintain.svg) [![Install Gogs with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=gogs) -# IMPORTANT INFORMATION +> *This package allows you to install Gogs quickly and simply on a YunoHost server. +If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* -**Note that this package will not be longer be maintened by the actual maintener. -The idea is to migrate to [gitea](https://github.com/YunoHost-Apps/gitea_ynh) which is more featured.** +> :warning: **Note that this package will not be longer be maintened by the actual maintener. +> The idea is to migrate to [gitea](https://github.com/YunoHost-Apps/gitea_ynh) which is more featured.** ## Overview Gogs is a self-hosted Git service written in Go. Alternative to Github. From 299913f64c5632b47a422117510946bf2f13cd56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 3 Nov 2020 23:12:19 +0100 Subject: [PATCH 009/131] Update arm.src --- conf/arm.src | 6 ------ 1 file changed, 6 deletions(-) diff --git a/conf/arm.src b/conf/arm.src index 7c882e3..af22379 100644 --- a/conf/arm.src +++ b/conf/arm.src @@ -1,11 +1,5 @@ SOURCE_URL=https://github.com/gogits/gogs/releases/download/v0.11.79/raspi2_armv6.zip SOURCE_SUM=a7d17f6dc542fd2d88f884271bca9c62729fbd725fdb310616b2987dba382631 -# (Optional) Program to check the integrity (sha256sum, md5sum...) -# default: sha256 SOURCE_SUM_PRG=sha256sum -# (Optional) Archive format -# default: tar.gz SOURCE_FORMAT=zip -# (Optional) Put false if sources are directly in the archive root -# default: true SOURCE_IN_SUBDIR=true From 048dc5fdf1d8070cd86b655b654e7a815e23f207 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 3 Nov 2020 23:12:43 +0100 Subject: [PATCH 010/131] Update i386.src --- conf/i386.src | 6 ------ 1 file changed, 6 deletions(-) diff --git a/conf/i386.src b/conf/i386.src index abf6148..da1dc46 100644 --- a/conf/i386.src +++ b/conf/i386.src @@ -1,11 +1,5 @@ SOURCE_URL=https://github.com/gogits/gogs/releases/download/v0.11.79/linux_386.zip SOURCE_SUM=ad1a89eb01723a4b289b7b8773fd018f78b0dad801101f27c1af0f2d649edeeb -# (Optional) Program to check the integrity (sha256sum, md5sum...) -# default: sha256 SOURCE_SUM_PRG=sha256sum -# (Optional) Archive format -# default: tar.gz SOURCE_FORMAT=zip -# (Optional) Put false if sources are directly in the archive root -# default: true SOURCE_IN_SUBDIR=true From f3827df3690abaf49d270de0695ec9751ac42a27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 3 Nov 2020 23:13:06 +0100 Subject: [PATCH 011/131] Update x86-64.src --- conf/x86-64.src | 6 ------ 1 file changed, 6 deletions(-) diff --git a/conf/x86-64.src b/conf/x86-64.src index cd8f52b..94bb3a0 100644 --- a/conf/x86-64.src +++ b/conf/x86-64.src @@ -1,11 +1,5 @@ SOURCE_URL=https://github.com/gogits/gogs/releases/download/v0.11.79/linux_amd64.zip SOURCE_SUM=85f60494de63e6c4af16faba9bc739eb7c9e5477de1f16d11c6665495141162f -# (Optional) Program to check the integrity (sha256sum, md5sum...) -# default: sha256 SOURCE_SUM_PRG=sha256sum -# (Optional) Archive format -# default: tar.gz SOURCE_FORMAT=zip -# (Optional) Put false if sources are directly in the archive root -# default: true SOURCE_IN_SUBDIR=true From 9818bda151ded179a61c552d44404b5dcc6fd5d2 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Nov 2020 17:59:20 +0100 Subject: [PATCH 012/131] Fix --- check_process | 11 ----- manifest.json | 4 +- scripts/change_url | 13 +++-- scripts/install | 120 +++++++++++++++++++++++++++++++++++++++------ scripts/restore | 32 +++++++++--- scripts/upgrade | 13 +++-- 6 files changed, 149 insertions(+), 44 deletions(-) diff --git a/check_process b/check_process index e03f6ef..d60ae23 100644 --- a/check_process +++ b/check_process @@ -16,21 +16,10 @@ upgrade=1 from_commit=1cbec051e1171de5a8ed1e850eb4fb3506114da5 backup_restore=1 multi_instance=1 - incorrect_path=0 port_already_use=1 (6000) change_url=1 ;;; Levels - Level 1=auto - Level 2=auto - Level 3=auto - # https://github.com/YunoHost-Apps/gogs_ynh/blob/master/conf/login_source.sql - Level 4=1 Level 5=auto - Level 6=auto - Level 7=auto - Level 8=0 - Level 9=0 - Level 10=0 ;;; Upgrade options ; commit=aa075b2051ffad7b0b6fef3a9c767376d5bdbfab name=Before multi_instance and refactoring diff --git a/manifest.json b/manifest.json index 0994575..d4d8617 100644 --- a/manifest.json +++ b/manifest.json @@ -6,9 +6,9 @@ "en": "Lightweight git forge", "fr": "Forge git légère" }, + "version": "0.12.3~ynh1", "url": "http://gogs.io", "license": "MIT", - "version": "0.12.3~ynh1", "maintainer": { "name": "Josué Tille", "email": "josue@tille.ch" @@ -23,7 +23,7 @@ "mysql" ], "requirements": { - "yunohost": ">= 3.8.1" + "yunohost": ">= 4.0.0" }, "arguments": { "install" : [ diff --git a/scripts/change_url b/scripts/change_url index fb02f6c..36c742a 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -1,21 +1,24 @@ #!/bin/bash #================================================= -# GENERIC START +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS #================================================= -# IMPORT GENERIC HELPERS +source _common.sh source /usr/share/yunohost/helpers # Exit if an error occurs during the execution of the script ynh_abort_if_errors -# Import common cmd -source ./_common.sh - +#================================================= # RETRIEVE ARGUMENTS +#================================================= + old_domain=$YNH_APP_OLD_DOMAIN domain=$YNH_APP_NEW_DOMAIN + path_url=$(ynh_normalize_url_path ${YNH_APP_NEW_PATH:-'/'}) app=$YNH_APP_INSTANCE_NAME diff --git a/scripts/install b/scripts/install index b97b0a9..89da145 100644 --- a/scripts/install +++ b/scripts/install @@ -3,15 +3,25 @@ #================================================= # GENERIC START #================================================= - # IMPORT GENERIC HELPERS +#================================================= + +source _common.sh source /usr/share/yunohost/helpers +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +ynh_clean_setup () { + true +} # Exit if an error occurs during the execution of the script ynh_abort_if_errors -# Load common variables and helpers -source ./_common.sh +#================================================= +# RETRIEVE ARGUMENTS FROM THE MANIFEST +#================================================= # Retrieve arguments domain=$YNH_APP_ARG_DOMAIN @@ -19,6 +29,9 @@ path_url=$(ynh_normalize_url_path $YNH_APP_ARG_PATH) admin=$YNH_APP_ARG_ADMIN is_public=$YNH_APP_ARG_IS_PUBLIC +app=$YNH_APP_INSTANCE_NAME + + # Check domain/path availability ynh_webpath_available $domain $path_url || ynh_die "$domain is not available as domain, please use an other domain." ynh_webpath_register $app $domain $path_url @@ -57,36 +70,115 @@ test getent passwd "$app" &>/dev/null || \ useradd -d "$DATADIR" --system --user-group "$app" --shell /bin/bash || \ ynh_die "Unable to create $app system account" +#================================================= +# CREAT DIRECTORIES +#================================================= + # create needed directories -create_dir +mkdir -p "$final_path/data" +mkdir -p "$final_path/custom/conf/auth.d" +mkdir -p "$DATA_PATH/avatars" +mkdir -p "$DATA_PATH/attachments" +mkdir -p "/var/log/$app" + +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= +ynh_script_progression --message="Setting up source files..." --weight=3 + +ynh_setup_source --dest_dir=$final_path $architecture + +#================================================= +# MODIFY A CONFIG FILE +#================================================= + +cp ../conf/app.ini "$final_path/custom/conf" +cp ../conf/ldap.conf "$final_path/custom/conf/auth.d/ldap.conf" + +if [ "$path_url" = "/" ] +then + ynh_replace_string --match_string="__URL__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" +else + ynh_replace_string --match_string="__URL__" --replace_string="$domain${path_url%/}" --target_file="$final_path/custom/conf/app.ini" +fi + +ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_PASSWORD__" --replace_string="$dbpass" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_USER__" --replace_string="$dbuser" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__KEY__" --replace_string="$key" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" + +if [[ "$is_public" = '1' ]] +then + ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="false" --target_file="$final_path/custom/conf/app.ini" +else + ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="true" --target_file="$final_path/custom/conf/app.ini" +fi + +ynh_replace_string --match_string="__ADMIN__" --replace_string="$admin" --target_file="$final_path/custom/conf/auth.d/ldap.conf" + +ynh_store_file_checksum --file="$final_path/custom/conf/app.ini" +ynh_store_file_checksum --file="$final_path/custom/conf/auth.d/ldap.conf" + -# Install Gogs -ynh_setup_source $final_path $architecture -# Configure gogs with app.ini file -config_gogs # Configure init script ynh_add_systemd_config +#================================================= +# CONFIGURE NGINX +#================================================= # Modify Nginx configuration file and copy it to Nginx conf directory -config_nginx +if [ "$path_url" != "/" ] +then + ynh_replace_string --match_string="^#sub_path_only" --replace_string="" --target_file="../conf/nginx.conf" +fi + ynh_add_nginx_config #================================================= # GENERIC FINALIZATION #================================================= +# SECURE FILES AND DIRECTORIES +#================================================= + +chown -R $app:$app "$final_path" +chown -R $app:$app "/home/$app" +chown -R $app:$app "/var/log/$app" +chmod u=rwX,g=rX,o= "$final_path" +chmod u=rwX,g=rX,o= "/home/$app" +chmod u=rwX,g=rX,o= "/var/log/$app" -# Set permissions -set_permission # Unprotect root from SSO if public set_access_settings -# Add Gogs to YunoHost's monitored services +#================================================= +# INTEGRATE SERVICE IN YUNOHOST +#================================================= +ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 + yunohost service add "$app" --log "/var/log/$app/$app.log" -# Configure logrotate +#================================================= +# SETUP LOGROTATE +#================================================= +ynh_script_progression --message="Configuring log rotation..." --weight=1 + ynh_use_logrotate "/var/log/$app" -# Reload services +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a systemd service..." --weight=1 + ynh_check_starting "INFO] Listen: http://0.0.0.0:" "/var/log/$app/gogs.log" + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Installation of $app completed" --last diff --git a/scripts/restore b/scripts/restore index f135ead..4fd1ad7 100644 --- a/scripts/restore +++ b/scripts/restore @@ -3,21 +3,37 @@ #================================================= # GENERIC START #================================================= - # IMPORT GENERIC HELPERS +#================================================= + +#Keep this path for calling _common.sh inside the execution's context of backup and restore scripts +source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +ynh_clean_setup () { + #### Remove this function if there's nothing to clean before calling the remove script. + true +} # Exit if an error occurs during the execution of the script ynh_abort_if_errors -# Load common variables and helpers -source ../settings/scripts/_common.sh +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 + +app=$YNH_APP_INSTANCE_NAME + +domain=$(ynh_app_setting_get --app=$app --key=domain) +path_url=$(ynh_app_setting_get --app=$app --key=path) +dbpass=$(ynh_app_setting_get --app=$app --key=mysqlpwd) +admin=$(ynh_app_setting_get --app=$app --key=adminusername) + -# Retrieve old app settings -domain=$(ynh_app_setting_get "$app" domain) -path_url=$(ynh_app_setting_get "$app" path) -dbpass=$(ynh_app_setting_get "$app" mysqlpwd) -admin=$(ynh_app_setting_get "$app" adminusername) # Check domain/path availability with app helper ynh_webpath_available $domain $path_url || ynh_die "$domain is not available as domain, please use an other domain." diff --git a/scripts/upgrade b/scripts/upgrade index 483f6b4..03b953b 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -3,17 +3,22 @@ #================================================= # GENERIC START #================================================= - # IMPORT GENERIC HELPERS +#================================================= + +source _common.sh source /usr/share/yunohost/helpers # Exit if an error occurs during the execution of the script ynh_abort_if_errors -# Load common variables and helpers -source ./_common.sh +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 + +app=$YNH_APP_INSTANCE_NAME -# Retrieve app settings domain=$(ynh_app_setting_get "$app" domain) path_url=$(ynh_normalize_url_path $(ynh_app_setting_get "$app" path)) dbpass=$(ynh_app_setting_get "$app" mysqlpwd) From 3a2be9d683431f0956b5b0b4c9e8939d47a8db4d Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 08:45:49 +0100 Subject: [PATCH 013/131] Fix linter warnings --- check_process | 10 ------ scripts/backup | 2 +- scripts/change_url | 2 +- scripts/experimental_helper.sh | 61 ---------------------------------- scripts/install | 2 +- scripts/remove | 1 - scripts/restore | 1 - scripts/upgrade | 1 - 8 files changed, 3 insertions(+), 77 deletions(-) delete mode 100644 scripts/experimental_helper.sh diff --git a/check_process b/check_process index 14429cb..a62c0f4 100644 --- a/check_process +++ b/check_process @@ -21,17 +21,7 @@ port_already_use=1 (6000) change_url=1 ;;; Levels - Level 1=auto - Level 2=auto - Level 3=auto - # https://github.com/YunoHost-Apps/gogs_ynh/blob/master/conf/login_source.sql - Level 4=1 Level 5=auto - Level 6=auto - Level 7=auto - Level 8=0 - Level 9=0 - Level 10=0 ;;; Upgrade options ; commit=aa075b2051ffad7b0b6fef3a9c767376d5bdbfab name=Before multi_instance and refactoring diff --git a/scripts/backup b/scripts/backup index 772fae0..aef132b 100644 --- a/scripts/backup +++ b/scripts/backup @@ -11,7 +11,7 @@ source /usr/share/yunohost/helpers ynh_abort_if_errors # Load common variables and helpers -source ../settings/scripts/experimental_helper.sh + source ../settings/scripts/_common.sh # Retrieve app settings diff --git a/scripts/change_url b/scripts/change_url index c85fa31..883baf6 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -11,7 +11,7 @@ source /usr/share/yunohost/helpers ynh_abort_if_errors # Import common cmd -source ./experimental_helper.sh + source ./_common.sh # RETRIEVE ARGUMENTS diff --git a/scripts/experimental_helper.sh b/scripts/experimental_helper.sh deleted file mode 100644 index 600a653..0000000 --- a/scripts/experimental_helper.sh +++ /dev/null @@ -1,61 +0,0 @@ -# Delete a file checksum from the app settings -# -# $app should be defined when calling this helper -# -# usage: ynh_remove_file_checksum file -# | arg: file - The file for which the checksum will be deleted -ynh_delete_file_checksum () { - local checksum_setting_name=checksum_${1//[\/ ]/_} # Replace all '/' and ' ' by '_' - ynh_app_setting_delete $app $checksum_setting_name -} - -# Start or restart a service and follow its booting -# -# usage: ynh_check_starting "Line to match" [Log file] [Timeout] [Service name] -# -# | arg: Line to match - The line to find in the log to attest the service have finished to boot. -# | arg: Log file - The log file to watch -# | arg: Service name -# /var/log/$app/$app.log will be used if no other log is defined. -# | arg: Timeout - The maximum time to wait before ending the watching. Defaut 300 seconds. -ynh_check_starting () { - local line_to_match="$1" - local service_name="${4:-$app}" - local app_log="${2:-/var/log/$service_name/$service_name.log}" - local timeout=${3:-300} - - ynh_clean_check_starting () { - # Stop the execution of tail. - kill -s 15 $pid_tail 2>&1 - ynh_secure_remove "$templog" 2>&1 - } - - echo "Starting of $service_name" >&2 - systemctl stop $service_name - local templog="$(mktemp)" - # Following the starting of the app in its log - tail -F -n0 "$app_log" > "$templog" & - # Get the PID of the tail command - local pid_tail=$! - systemctl start $service_name - - local i=0 - for i in `seq 1 $timeout` - do - # Read the log until the sentence is found, that means the app finished to start. Or run until the timeout - if grep --quiet "$line_to_match" "$templog" - then - echo "The service $service_name has correctly started." >&2 - break - fi - echo -n "." >&2 - sleep 1 - done - if [ $i -eq $timeout ] - then - echo "The service $service_name didn't fully started before the timeout." >&2 - fi - - echo "" - ynh_clean_check_starting -} \ No newline at end of file diff --git a/scripts/install b/scripts/install index 76586ee..d2a8f2f 100644 --- a/scripts/install +++ b/scripts/install @@ -11,7 +11,7 @@ source /usr/share/yunohost/helpers ynh_abort_if_errors # Load common variables and helpers -source ./experimental_helper.sh + source ./_common.sh # Retrieve arguments diff --git a/scripts/remove b/scripts/remove index 681dd01..e5deb31 100644 --- a/scripts/remove +++ b/scripts/remove @@ -8,7 +8,6 @@ source /usr/share/yunohost/helpers # Load common variables and helpers -source ./experimental_helper.sh source ./_common.sh #================================================= diff --git a/scripts/restore b/scripts/restore index 27b6ee5..f135ead 100644 --- a/scripts/restore +++ b/scripts/restore @@ -11,7 +11,6 @@ source /usr/share/yunohost/helpers ynh_abort_if_errors # Load common variables and helpers -source ../settings/scripts/experimental_helper.sh source ../settings/scripts/_common.sh # Retrieve old app settings diff --git a/scripts/upgrade b/scripts/upgrade index 82d0b6d..483f6b4 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -11,7 +11,6 @@ source /usr/share/yunohost/helpers ynh_abort_if_errors # Load common variables and helpers -source ./experimental_helper.sh source ./_common.sh # Retrieve app settings From 520fad9304b2f0549166f56a1b08a318d5402405 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 08:56:54 +0100 Subject: [PATCH 014/131] Fix back-up script --- scripts/backup | 70 ++++++++++++++++++++++++++++++++++++++----------- scripts/install | 2 +- 2 files changed, 56 insertions(+), 16 deletions(-) diff --git a/scripts/backup b/scripts/backup index aef132b..490a4b0 100644 --- a/scripts/backup +++ b/scripts/backup @@ -3,36 +3,76 @@ #================================================= # GENERIC START #================================================= - # IMPORT GENERIC HELPERS +#================================================= + +source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +ynh_clean_setup () { + true +} # Exit if an error occurs during the execution of the script ynh_abort_if_errors -# Load common variables and helpers +#================================================= +# LOAD SETTINGS +#================================================= +ynh_print_info --message="Loading installation settings..." -source ../settings/scripts/_common.sh +app=$YNH_APP_INSTANCE_NAME # Retrieve app settings -domain=$(ynh_app_setting_get "$app" domain) +domain=$(ynh_app_setting_get --app=$app --key=domain) + +#================================================= +# DECLARE DATA AND CONF FILES TO BACKUP +#================================================= +ynh_print_info --message="Declaring files to be backed up..." #================================================= # STANDARD BACKUP STEPS #================================================= -# Copy the app source files -ynh_backup "$final_path" +ynh_backup --src_path="$final_path" -# Copy the data files -ynh_backup "$DATADIR" +#================================================= +# BACKUP DATA FILES +#================================================= -# Copy the conf files -ynh_backup "/etc/nginx/conf.d/${domain}.d/${app}.conf" -ynh_backup "/etc/systemd/system/${app}.service" +ynh_backup --src_path="$DATADIR" -# Backup logs -ynh_backup "/var/log/$app" +#================================================= +# BACKUP THE NGINX CONFIGURATION +#================================================= -# Dump the database -ynh_mysql_dump_db "$dbname" > ./db.sql \ No newline at end of file +ynh_backup --src_path="/etc/nginx/conf.d/${domain}.d/${app}.conf" + +#================================================= +# BACKUP SYSTEMD +#================================================= + +ynh_backup --src_path="/etc/systemd/system/${app}.service" + +#================================================= +# BACKUP VARIOUS FILES +#================================================= + +ynh_backup --src_path="/var/log/$app" + +#================================================= +# BACKUP THE MYSQL DATABASE +#================================================= +ynh_print_info --message="Backing up the MySQL database..." + +ynh_mysql_dump_db "$dbname" > ./db.sql + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." diff --git a/scripts/install b/scripts/install index d2a8f2f..6838126 100644 --- a/scripts/install +++ b/scripts/install @@ -90,4 +90,4 @@ yunohost service add "$app" --log "/var/log/$app/$app.log" ynh_use_logrotate "/var/log/$app" # Reload services -ynh_check_starting "INFO] Listen: http://0.0.0.0:" "/var/log/$app/gogs.log" +ynh_clean_check_starting "INFO] Listen: http://0.0.0.0:" "/var/log/$app/gogs.log" From 5251631f03ab1a56aac6a4d54da89c5c7d1355bb Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 09:20:50 +0100 Subject: [PATCH 015/131] fix --- scripts/_common.sh | 5 +-- scripts/install | 86 +++++++++++++++++++++++++++++++--------------- 2 files changed, 59 insertions(+), 32 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index ae6de87..89ea043 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -2,10 +2,7 @@ # SET ALL CONSTANTS #================================================= -app=$YNH_APP_INSTANCE_NAME -dbname=$app -dbuser=$app -final_path="/opt/$app" + DATADIR="/home/$app" REPO_PATH="$DATADIR/repositories" DATA_PATH="$DATADIR/data" diff --git a/scripts/install b/scripts/install index 89da145..d679a9e 100644 --- a/scripts/install +++ b/scripts/install @@ -25,44 +25,68 @@ ynh_abort_if_errors # Retrieve arguments domain=$YNH_APP_ARG_DOMAIN -path_url=$(ynh_normalize_url_path $YNH_APP_ARG_PATH) +path_url=$YNH_APP_ARG_PATH admin=$YNH_APP_ARG_ADMIN is_public=$YNH_APP_ARG_IS_PUBLIC app=$YNH_APP_INSTANCE_NAME +#================================================= +# CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS +#================================================= +ynh_script_progression --message="Validating installation parameters..." --weight=1 -# Check domain/path availability -ynh_webpath_available $domain $path_url || ynh_die "$domain is not available as domain, please use an other domain." -ynh_webpath_register $app $domain $path_url +final_path=/opt/$app +test ! -e "$final_path" || ynh_die --message="This path already contains a folder" + +# Register (book) web path +ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url -# Check user parameter -ynh_user_exists "$admin" \ - || ynh_die "The chosen admin user does not exist." -# Check Final Path availability -test ! -e "$final_path" || ynh_die "This path already contains a folder" # Generate random password and key -dbpass=$(ynh_string_random) + key=$(ynh_string_random) -# Find available ports -port=$(ynh_find_port 6000) -# Store Settings -ynh_app_setting_set $app mysqlpwd $dbpass -ynh_app_setting_set $app adminusername $admin -ynh_app_setting_set $app is_public $is_public -ynh_app_setting_set $app secret_key $key -ynh_app_setting_set $app web_port $port + +#================================================= +# STORE SETTINGS FROM MANIFEST +#================================================= +ynh_script_progression --message="Storing installation settings..." --weight=1 + +ynh_app_setting_set --app=$app --key=mysqlpwd --value=$dbpass +ynh_app_setting_set --app=$app --key=adminusername --value=$admin +ynh_app_setting_set --app=$app --key=is_public --value=$is_public +ynh_app_setting_set --app=$app --key=secret_key --value=$key +ynh_app_setting_set --app=$app --key=web_port --value=$port #================================================= # STANDARD MODIFICATIONS #================================================= +# FIND AND OPEN A PORT +#================================================= +ynh_script_progression --message="Configuring firewall..." --weight=1 -# Initialize database and store mysql password for upgrade -ynh_mysql_create_db "$dbname" "$dbuser" "$dbpass" +# Find an available port +port=$(ynh_find_port --port=6000) +ynh_app_setting_set --app=$app --key=port --value=$port + +#================================================= +# CREATE A MYSQL DATABASE +#================================================= +ynh_script_progression --message="Creating a MySQL database..." --weight=1 + +db_name=$(ynh_sanitize_dbid --db_name=$app) +db_user=$db_name +ynh_app_setting_set --app=$app --key=db_name --value=$db_name +ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name + + +dbpass=$(ynh_string_random) #to be changed +#================================================= +# STANDARD MODIFICATIONS +#================================================= # Add users # We can't use the official helper because we need to set the shell for the login @@ -130,14 +154,12 @@ ynh_store_file_checksum --file="$final_path/custom/conf/auth.d/ldap.conf" ynh_add_systemd_config #================================================= -# CONFIGURE NGINX +# NGINX CONFIGURATION #================================================= -# Modify Nginx configuration file and copy it to Nginx conf directory -if [ "$path_url" != "/" ] -then - ynh_replace_string --match_string="^#sub_path_only" --replace_string="" --target_file="../conf/nginx.conf" -fi - ynh_add_nginx_config +ynh_script_progression --message="Configuring nginx web server..." --weight=1 + +# Create a dedicated nginx config +ynh_add_nginx_config #================================================= # GENERIC FINALIZATION @@ -175,7 +197,15 @@ ynh_use_logrotate "/var/log/$app" #================================================= ynh_script_progression --message="Starting a systemd service..." --weight=1 -ynh_check_starting "INFO] Listen: http://0.0.0.0:" "/var/log/$app/gogs.log" +# Start a systemd service +ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" + +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading nginx web server..." --time --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload #================================================= # END OF SCRIPT From 2400eee2b1a962d1a6ec32eabc2c58346ffd9782 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 09:28:52 +0100 Subject: [PATCH 016/131] Fix --- conf/nginx.conf | 11 ++++++----- scripts/_common.sh | 36 +----------------------------------- scripts/change_url | 2 +- scripts/install | 7 +++---- scripts/restore | 2 +- scripts/upgrade | 4 ++-- 6 files changed, 14 insertions(+), 48 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 4aca76b..2521185 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,16 +1,17 @@ #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; location __PATH__/ { + + # Force https + if ($scheme = http) { + rewrite ^ https://$server_name$request_uri? permanent; + } + proxy_pass http://localhost:__PORT__/; proxy_set_header Host $host; proxy_buffering off; fastcgi_param REMOTE_USER $remote_user; client_max_body_size 200M; - # Force https - if ($scheme = http) { - rewrite ^ https://$server_name$request_uri? permanent; - } - # Include SSOWAT user panel. include conf.d/yunohost_panel.conf.inc; } diff --git a/scripts/_common.sh b/scripts/_common.sh index 89ea043..6176b97 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -120,38 +120,4 @@ ynh_check_starting () { local app_log="${2:-/var/log/$service_name/$service_name.log}" local timeout=${3:-300} - ynh_clean_check_starting () { - # Stop the execution of tail. - kill -s 15 $pid_tail 2>&1 - ynh_secure_remove "$templog" 2>&1 - } - - echo "Starting of $service_name" >&2 - systemctl stop $service_name - local templog="$(mktemp)" - # Following the starting of the app in its log - tail -F -n0 "$app_log" > "$templog" & - # Get the PID of the tail command - local pid_tail=$! - systemctl start $service_name - - local i=0 - for i in `seq 1 $timeout` - do - # Read the log until the sentence is found, that means the app finished to start. Or run until the timeout - if grep --quiet "$line_to_match" "$templog" - then - echo "The service $service_name has correctly started." >&2 - break - fi - echo -n "." >&2 - sleep 1 - done - if [ $i -eq $timeout ] - then - echo "The service $service_name didn't fully started before the timeout." >&2 - fi - - echo "" - ynh_clean_check_starting -} + \ No newline at end of file diff --git a/scripts/change_url b/scripts/change_url index 36c742a..b7998fe 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -22,7 +22,7 @@ domain=$YNH_APP_NEW_DOMAIN path_url=$(ynh_normalize_url_path ${YNH_APP_NEW_PATH:-'/'}) app=$YNH_APP_INSTANCE_NAME -dbpass=$(ynh_app_setting_get "$app" mysqlpwd) +db_pwd=$(ynh_app_setting_get "$app" mysqlpwd) admin=$(ynh_app_setting_get "$app" adminusername) key=$(ynh_app_setting_get "$app" secret_key) port=$(ynh_app_setting_get "$app" web_port) diff --git a/scripts/install b/scripts/install index d679a9e..26e6d8c 100644 --- a/scripts/install +++ b/scripts/install @@ -81,9 +81,8 @@ 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_mysql_setup_db --db_user=$db_user --db_name=$db_name +db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) - -dbpass=$(ynh_string_random) #to be changed #================================================= # STANDARD MODIFICATIONS #================================================= @@ -127,8 +126,8 @@ else fi ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_PASSWORD__" --replace_string="$dbpass" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_USER__" --replace_string="$dbuser" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_PASSWORD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__KEY__" --replace_string="$key" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" diff --git a/scripts/restore b/scripts/restore index 4fd1ad7..5222e54 100644 --- a/scripts/restore +++ b/scripts/restore @@ -30,7 +30,7 @@ app=$YNH_APP_INSTANCE_NAME domain=$(ynh_app_setting_get --app=$app --key=domain) path_url=$(ynh_app_setting_get --app=$app --key=path) -dbpass=$(ynh_app_setting_get --app=$app --key=mysqlpwd) +db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) admin=$(ynh_app_setting_get --app=$app --key=adminusername) diff --git a/scripts/upgrade b/scripts/upgrade index 03b953b..75dbcaf 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -21,7 +21,7 @@ app=$YNH_APP_INSTANCE_NAME domain=$(ynh_app_setting_get "$app" domain) path_url=$(ynh_normalize_url_path $(ynh_app_setting_get "$app" path)) -dbpass=$(ynh_app_setting_get "$app" mysqlpwd) +db_pwd=$(ynh_app_setting_get "$app" mysqlpwd) admin=$(ynh_app_setting_get "$app" adminusername) key=$(ynh_app_setting_get "$app" secret_key) is_public=$(ynh_app_setting_get "$app" is_public) @@ -87,7 +87,7 @@ fi # Remove old authentification mecanisme, actually the registry in the database has been replaced by a config file if [[ ! -e "$final_path/custom/conf/auth.d/ldap.conf" ]] then - ynh_mysql_connect_as "$dbuser" "$dbpass" "$dbname" <<< "DELETE FROM login_source WHERE name = 'Yunohost LDAP';" + ynh_mysql_connect_as "$db_user" "$db_pwd" "$db_name" <<< "DELETE FROM login_source WHERE name = 'Yunohost LDAP';" mkdir -p "$final_path/custom/conf/auth.d" fi From 7d2369f8dfce140ccda56cfd8c200ce6c53a92f3 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 09:33:27 +0100 Subject: [PATCH 017/131] Fix --- scripts/_common.sh | 2 +- scripts/install | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 6176b97..f0f9832 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -119,5 +119,5 @@ ynh_check_starting () { local service_name="${4:-$app}" local app_log="${2:-/var/log/$service_name/$service_name.log}" local timeout=${3:-300} - +} \ No newline at end of file diff --git a/scripts/install b/scripts/install index 26e6d8c..c694fdb 100644 --- a/scripts/install +++ b/scripts/install @@ -55,7 +55,6 @@ key=$(ynh_string_random) #================================================= ynh_script_progression --message="Storing installation settings..." --weight=1 -ynh_app_setting_set --app=$app --key=mysqlpwd --value=$dbpass ynh_app_setting_set --app=$app --key=adminusername --value=$admin ynh_app_setting_set --app=$app --key=is_public --value=$is_public ynh_app_setting_set --app=$app --key=secret_key --value=$key From 73bf03bc6a26c984634aedc89a90d97fdc71b751 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 09:37:34 +0100 Subject: [PATCH 018/131] Update install --- scripts/install | 5 ----- 1 file changed, 5 deletions(-) diff --git a/scripts/install b/scripts/install index c694fdb..dc7d763 100644 --- a/scripts/install +++ b/scripts/install @@ -42,14 +42,10 @@ test ! -e "$final_path" || ynh_die --message="This path already contains a folde # Register (book) web path ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url - - # Generate random password and key key=$(ynh_string_random) - - #================================================= # STORE SETTINGS FROM MANIFEST #================================================= @@ -58,7 +54,6 @@ ynh_script_progression --message="Storing installation settings..." --weight=1 ynh_app_setting_set --app=$app --key=adminusername --value=$admin ynh_app_setting_set --app=$app --key=is_public --value=$is_public ynh_app_setting_set --app=$app --key=secret_key --value=$key -ynh_app_setting_set --app=$app --key=web_port --value=$port #================================================= # STANDARD MODIFICATIONS From ec197bf6429dfcf22b8f24f2f8ee1add00649cc6 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 09:46:58 +0100 Subject: [PATCH 019/131] Update install --- scripts/install | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/install b/scripts/install index dc7d763..caa39f0 100644 --- a/scripts/install +++ b/scripts/install @@ -103,6 +103,8 @@ mkdir -p "/var/log/$app" #================================================= ynh_script_progression --message="Setting up source files..." --weight=3 +ynh_app_setting_set --app=$app --key=final_path --value=$final_path +# Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir=$final_path $architecture #================================================= From 707d9f796b1dc3f5c7a2aa66b1db02c5e3bbf94b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 09:56:25 +0100 Subject: [PATCH 020/131] fix --- check_process | 12 +++++------- scripts/install | 22 ++++++++++++---------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/check_process b/check_process index d60ae23..d68c2c9 100644 --- a/check_process +++ b/check_process @@ -1,9 +1,9 @@ ;; General ; Manifest - domain="domain.tld" (DOMAIN) - path="/path" (PATH) - admin="john" (USER) - is_public=1 (PUBLIC|public=1|private=0) + domain="domain.tld" (DOMAIN) + path="/path" (PATH) + admin="john" (USER) + is_public=1 (PUBLIC|public=1|private=0) ; Checks pkg_linter=1 setup_sub_dir=1 @@ -12,11 +12,9 @@ setup_private=1 setup_public=1 upgrade=1 - upgrade=1 from_commit=aa075b2051ffad7b0b6fef3a9c767376d5bdbfab - upgrade=1 from_commit=1cbec051e1171de5a8ed1e850eb4fb3506114da5 backup_restore=1 multi_instance=1 - port_already_use=1 (6000) + port_already_use=1 change_url=1 ;;; Levels Level 5=auto diff --git a/scripts/install b/scripts/install index caa39f0..fc7e0a5 100644 --- a/scripts/install +++ b/scripts/install @@ -36,7 +36,7 @@ app=$YNH_APP_INSTANCE_NAME #================================================= ynh_script_progression --message="Validating installation parameters..." --weight=1 -final_path=/opt/$app +final_path=/var/www/$app test ! -e "$final_path" || ynh_die --message="This path already contains a folder" # Register (book) web path @@ -51,7 +51,9 @@ key=$(ynh_string_random) #================================================= 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=adminusername --value=$admin +ynh_app_setting_set --app=$app --key=path --value=$path_url ynh_app_setting_set --app=$app --key=is_public --value=$is_public ynh_app_setting_set --app=$app --key=secret_key --value=$key @@ -77,6 +79,15 @@ ynh_app_setting_set --app=$app --key=db_name --value=$db_name ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= +ynh_script_progression --message="Setting up source files..." --weight=3 + +ynh_app_setting_set --app=$app --key=final_path --value=$final_path +# Download, check integrity, uncompress and patch the source from app.src +ynh_setup_source --dest_dir=$final_path $architecture + #================================================= # STANDARD MODIFICATIONS #================================================= @@ -98,15 +109,6 @@ mkdir -p "$DATA_PATH/avatars" mkdir -p "$DATA_PATH/attachments" mkdir -p "/var/log/$app" -#================================================= -# DOWNLOAD, CHECK AND UNPACK SOURCE -#================================================= -ynh_script_progression --message="Setting up source files..." --weight=3 - -ynh_app_setting_set --app=$app --key=final_path --value=$final_path -# Download, check integrity, uncompress and patch the source from app.src -ynh_setup_source --dest_dir=$final_path $architecture - #================================================= # MODIFY A CONFIG FILE #================================================= From 715e6ee32b5376f59a70ac563903be9beebab469 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 10:09:41 +0100 Subject: [PATCH 021/131] Fix --- conf/{arm.src => armv7.src} | 0 scripts/_common.sh | 33 ++++++++++++++++++++++++++++++++- scripts/install | 3 ++- 3 files changed, 34 insertions(+), 2 deletions(-) rename conf/{arm.src => armv7.src} (100%) diff --git a/conf/arm.src b/conf/armv7.src similarity index 100% rename from conf/arm.src rename to conf/armv7.src diff --git a/scripts/_common.sh b/scripts/_common.sh index f0f9832..d95bb40 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -10,16 +10,47 @@ DATA_PATH="$DATADIR/data" # Detect the system architecture to download the right tarball # NOTE: `uname -m` is more accurate and universal than `arch` # See https://en.wikipedia.org/wiki/Uname +ynh_detect_arch(){ + local architecture if [ -n "$(uname -m | grep 64)" ]; then architecture="x86-64" elif [ -n "$(uname -m | grep 86)" ]; then architecture="i386" elif [ -n "$(uname -m | grep arm)" ]; then - architecture="arm" + architecture="armv7" else ynh_die "Unable to detect your achitecture, please open a bug describing \ your hardware and the result of the command \"uname -m\"." 1 fi +} + + +# Check the architecture +# +# example: architecture=$(ynh_detect_arch) +# +# usage: ynh_detect_arch +# +# Requires YunoHost version 2.2.4 or higher. +# ynh_detect_arch(){ +# local architecture +# if [ -n "$(uname -m | grep arm64)" ] || [ -n "$(uname -m | grep aarch64)" ]; then +# architecture="arm64" +# elif [ -n "$(uname -m | grep 86)" ]; then +# architecture="i386" +# elif [ -n "$(uname -m | grep 64)" ]; then +# architecture="x86-64" +# elif [ -n "$(uname -m | grep armv7)" ]; then +# architecture="armv7" +# elif [ -n "$(uname -m | grep armv6)" ]; then +# architecture="armv6" +# elif [ -n "$(uname -m | grep armv5)" ]; then +# architecture="armv5" +# else +# architecture="unknown" +# fi +# echo $architecture +# } #================================================= # DEFINE ALL COMMON FONCTIONS diff --git a/scripts/install b/scripts/install index fc7e0a5..ae7ee3a 100644 --- a/scripts/install +++ b/scripts/install @@ -28,6 +28,7 @@ domain=$YNH_APP_ARG_DOMAIN path_url=$YNH_APP_ARG_PATH admin=$YNH_APP_ARG_ADMIN is_public=$YNH_APP_ARG_IS_PUBLIC +architecture=$(ynh_detect_arch) app=$YNH_APP_INSTANCE_NAME @@ -86,7 +87,7 @@ ynh_script_progression --message="Setting up source files..." --weight=3 ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src -ynh_setup_source --dest_dir=$final_path $architecture +ynh_setup_source --dest_dir=$final_path --source_id="$architecture" #================================================= # STANDARD MODIFICATIONS From b8ff995b62a0ef8f61cd671df7c12c669abf02cd Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 10:22:05 +0100 Subject: [PATCH 022/131] Update _common.sh --- scripts/_common.sh | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index d95bb40..20fa5a2 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -12,16 +12,17 @@ DATA_PATH="$DATADIR/data" # See https://en.wikipedia.org/wiki/Uname ynh_detect_arch(){ local architecture -if [ -n "$(uname -m | grep 64)" ]; then - architecture="x86-64" -elif [ -n "$(uname -m | grep 86)" ]; then - architecture="i386" -elif [ -n "$(uname -m | grep arm)" ]; then - architecture="armv7" -else - ynh_die "Unable to detect your achitecture, please open a bug describing \ - your hardware and the result of the command \"uname -m\"." 1 -fi + if [ -n "$(uname -m | grep 64)" ]; then + architecture="x86-64" + elif [ -n "$(uname -m | grep 86)" ]; then + architecture="i386" + elif [ -n "$(uname -m | grep arm)" ]; then + architecture="armv7" + else + ynh_die "Unable to detect your achitecture, please open a bug describing \ + your hardware and the result of the command \"uname -m\"." 1 + fi + echo $architecture } From f714d51c3fa53b2eb5ea1195a4b86ddbfad28973 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 10:40:14 +0100 Subject: [PATCH 023/131] fix --- scripts/_common.sh | 4 ++-- scripts/install | 32 +++++++++++++++++++------------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 20fa5a2..e3c14e2 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -21,8 +21,8 @@ ynh_detect_arch(){ else ynh_die "Unable to detect your achitecture, please open a bug describing \ your hardware and the result of the command \"uname -m\"." 1 - fi - echo $architecture + fi + echo $architecture } diff --git a/scripts/install b/scripts/install index ae7ee3a..82cd81f 100644 --- a/scripts/install +++ b/scripts/install @@ -89,6 +89,24 @@ ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir=$final_path --source_id="$architecture" +#================================================= +# CREAT DIRECTORIES +#================================================= + +mkdir -p "/home/$app" + +DATADIR="/home/$app" + +REPO_PATH="/home/$app/repositories" +DATA_PATH="/home/$app/data" + +# create needed directories +mkdir -p "$final_path/data" +mkdir -p "$final_path/custom/conf/auth.d" +mkdir -p "/home/$app/data/avatars" +mkdir -p "/home/$app/data/attachments" +mkdir -p "/var/log/$app" + #================================================= # STANDARD MODIFICATIONS #================================================= @@ -96,20 +114,9 @@ ynh_setup_source --dest_dir=$final_path --source_id="$architecture" # Add users # We can't use the official helper because we need to set the shell for the login test getent passwd "$app" &>/dev/null || \ - useradd -d "$DATADIR" --system --user-group "$app" --shell /bin/bash || \ + useradd -d "/home/$app" --system --user-group "$app" --shell /bin/bash || \ ynh_die "Unable to create $app system account" -#================================================= -# CREAT DIRECTORIES -#================================================= - -# create needed directories -mkdir -p "$final_path/data" -mkdir -p "$final_path/custom/conf/auth.d" -mkdir -p "$DATA_PATH/avatars" -mkdir -p "$DATA_PATH/attachments" -mkdir -p "/var/log/$app" - #================================================= # MODIFY A CONFIG FILE #================================================= @@ -172,7 +179,6 @@ chmod u=rwX,g=rX,o= "$final_path" chmod u=rwX,g=rX,o= "/home/$app" chmod u=rwX,g=rX,o= "/var/log/$app" - # Unprotect root from SSO if public set_access_settings From 92212e99e85052c9a12fec7ce3e2626c67a5051a Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 10:49:08 +0100 Subject: [PATCH 024/131] fix --- scripts/install | 2 +- scripts/remove | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/install b/scripts/install index 82cd81f..22a574a 100644 --- a/scripts/install +++ b/scripts/install @@ -207,7 +207,7 @@ ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$ap #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." --time --weight=1 +ynh_script_progression --message="Reloading nginx web server..." --weight=1 ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/remove b/scripts/remove index 6dabec1..d31ed84 100644 --- a/scripts/remove +++ b/scripts/remove @@ -63,9 +63,9 @@ ynh_secure_remove --file="$final_path" # REMOVE VARIOUS FILES #================================================= -ynh_secure_remove "$DATADIR" +ynh_secure_remove --file="/home/$app" -ynh_secure_remove "/var/log/$app" +ynh_secure_remove --file="/var/log/$app" #================================================= # REMOVE LOGROTATE CONFIGURATION From 4c23496c3aea9efe704e542d89631b2ba5462116 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 11:02:28 +0100 Subject: [PATCH 025/131] Fix --- conf/app.ini | 2 +- conf/ldap.conf | 2 +- conf/nginx.conf | 2 +- conf/systemd.service | 2 +- scripts/install | 8 +------- 5 files changed, 5 insertions(+), 11 deletions(-) diff --git a/conf/app.ini b/conf/app.ini index 5a08d74..f32f401 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -9,7 +9,7 @@ RUN_MODE = prod PROTOCOL = http DOMAIN = __DOMAIN__ ROOT_URL = https://__URL__/ -HTTP_ADDR = 0.0.0.0 +HTTP_ADDR = 127.0.0.1 HTTP_PORT = __PORT__ ; Permission for unix socket UNIX_SOCKET_PERMISSION = 666 diff --git a/conf/ldap.conf b/conf/ldap.conf index 52ea4a3..6d811d3 100644 --- a/conf/ldap.conf +++ b/conf/ldap.conf @@ -6,7 +6,7 @@ name = Yunohost LDAP is_activated = true [config] -host = localhost +host = 127.0.0.1 port = 389 # 0 - Unencrypted, 1 - LDAPS, 2 - StartTLS security_protocol = 0 diff --git a/conf/nginx.conf b/conf/nginx.conf index 2521185..89c46de 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -6,7 +6,7 @@ location __PATH__/ { rewrite ^ https://$server_name$request_uri? permanent; } - proxy_pass http://localhost:__PORT__/; + proxy_pass http://127.0.0.1:__PORT__/; proxy_set_header Host $host; proxy_buffering off; fastcgi_param REMOTE_USER $remote_user; diff --git a/conf/systemd.service b/conf/systemd.service index e237439..df646e1 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -16,7 +16,7 @@ Type=simple User=__APP__ Group=__APP__ WorkingDirectory=/home/__APP__ -ExecStart=/opt/__APP__/gogs web +ExecStart=__FINAL_PATH__/gogs web Restart=always Environment=USER=__APP__ HOME=/home/__APP__ diff --git a/scripts/install b/scripts/install index 22a574a..97ff93d 100644 --- a/scripts/install +++ b/scripts/install @@ -43,10 +43,6 @@ test ! -e "$final_path" || ynh_die --message="This path already contains a folde # Register (book) web path ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url -# Generate random password and key - -key=$(ynh_string_random) - #================================================= # STORE SETTINGS FROM MANIFEST #================================================= @@ -135,7 +131,7 @@ ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH ynh_replace_string --match_string="__DB_PASSWORD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__KEY__" --replace_string="$key" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__KEY__" --replace_string="$(ynh_string_random)" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" @@ -153,8 +149,6 @@ ynh_store_file_checksum --file="$final_path/custom/conf/app.ini" ynh_store_file_checksum --file="$final_path/custom/conf/auth.d/ldap.conf" - - # Configure init script ynh_add_systemd_config From fdb47fde5dfce303e3bc74744ee934c238d59369 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 11:06:54 +0100 Subject: [PATCH 026/131] Update install --- scripts/install | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 97ff93d..b814429 100644 --- a/scripts/install +++ b/scripts/install @@ -52,7 +52,6 @@ ynh_app_setting_set --app=$app --key=domain --value=$domain ynh_app_setting_set --app=$app --key=adminusername --value=$admin ynh_app_setting_set --app=$app --key=path --value=$path_url ynh_app_setting_set --app=$app --key=is_public --value=$is_public -ynh_app_setting_set --app=$app --key=secret_key --value=$key #================================================= # STANDARD MODIFICATIONS @@ -76,6 +75,14 @@ ynh_app_setting_set --app=$app --key=db_name --value=$db_name ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Configuring system user..." --weight=1 + +# Create a system user +ynh_system_user_create --username=$app --home_dir=$final_path + #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= From ac1a1187806dd6d54e641ce02aafd4b054ab8148 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 11:09:54 +0100 Subject: [PATCH 027/131] Update install --- scripts/install | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/install b/scripts/install index b814429..5d4ccc0 100644 --- a/scripts/install +++ b/scripts/install @@ -114,11 +114,11 @@ mkdir -p "/var/log/$app" # STANDARD MODIFICATIONS #================================================= -# Add users -# We can't use the official helper because we need to set the shell for the login -test getent passwd "$app" &>/dev/null || \ - useradd -d "/home/$app" --system --user-group "$app" --shell /bin/bash || \ - ynh_die "Unable to create $app system account" +# # Add users +# # We can't use the official helper because we need to set the shell for the login +# test getent passwd "$app" &>/dev/null || \ +# useradd -d "/home/$app" --system --user-group "$app" --shell /bin/bash || \ +# ynh_die "Unable to create $app system account" #================================================= # MODIFY A CONFIG FILE From f2bf6d2faf454b8e9b43cd75e7b5d2a7bd6cb78f Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 11:13:01 +0100 Subject: [PATCH 028/131] Update systemd.service --- conf/systemd.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/systemd.service b/conf/systemd.service index df646e1..0f08a9d 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -16,7 +16,7 @@ Type=simple User=__APP__ Group=__APP__ WorkingDirectory=/home/__APP__ -ExecStart=__FINAL_PATH__/gogs web +ExecStart=/var/www/gogs/gogs web Restart=always Environment=USER=__APP__ HOME=/home/__APP__ From 98ea08576077b7355abafbc53ac7a7985f05d3f9 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 11:16:48 +0100 Subject: [PATCH 029/131] Fix --- conf/app.ini | 2 +- conf/ldap.conf | 2 +- conf/nginx.conf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.ini b/conf/app.ini index f32f401..5a08d74 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -9,7 +9,7 @@ RUN_MODE = prod PROTOCOL = http DOMAIN = __DOMAIN__ ROOT_URL = https://__URL__/ -HTTP_ADDR = 127.0.0.1 +HTTP_ADDR = 0.0.0.0 HTTP_PORT = __PORT__ ; Permission for unix socket UNIX_SOCKET_PERMISSION = 666 diff --git a/conf/ldap.conf b/conf/ldap.conf index 6d811d3..52ea4a3 100644 --- a/conf/ldap.conf +++ b/conf/ldap.conf @@ -6,7 +6,7 @@ name = Yunohost LDAP is_activated = true [config] -host = 127.0.0.1 +host = localhost port = 389 # 0 - Unencrypted, 1 - LDAPS, 2 - StartTLS security_protocol = 0 diff --git a/conf/nginx.conf b/conf/nginx.conf index 89c46de..5b83c4d 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -6,7 +6,7 @@ location __PATH__/ { rewrite ^ https://$server_name$request_uri? permanent; } - proxy_pass http://127.0.0.1:__PORT__/; + proxy_pass http://localhost:__PORT__; proxy_set_header Host $host; proxy_buffering off; fastcgi_param REMOTE_USER $remote_user; From 8134c875c897ae289639fa730fb5458de380d8cf Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 11:22:58 +0100 Subject: [PATCH 030/131] fix --- conf/nginx.conf | 18 ++++++++++++------ scripts/_common.sh | 33 --------------------------------- 2 files changed, 12 insertions(+), 39 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 5b83c4d..cf3b636 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -5,12 +5,18 @@ location __PATH__/ { if ($scheme = http) { rewrite ^ https://$server_name$request_uri? permanent; } - - proxy_pass http://localhost:__PORT__; - proxy_set_header Host $host; - proxy_buffering off; - fastcgi_param REMOTE_USER $remote_user; - client_max_body_size 200M; + + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + rewrite ^__PATH__/gogs/(.*) /$1 break; + rewrite ^__PATH__/gogs$ /$1 break; + proxy_pass http://localhost:__PORT__; + proxy_read_timeout 90; + + client_max_body_size 200M; # Include SSOWAT user panel. include conf.d/yunohost_panel.conf.inc; diff --git a/scripts/_common.sh b/scripts/_common.sh index e3c14e2..6849d61 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -2,11 +2,6 @@ # SET ALL CONSTANTS #================================================= - -DATADIR="/home/$app" -REPO_PATH="$DATADIR/repositories" -DATA_PATH="$DATADIR/data" - # Detect the system architecture to download the right tarball # NOTE: `uname -m` is more accurate and universal than `arch` # See https://en.wikipedia.org/wiki/Uname @@ -25,34 +20,6 @@ ynh_detect_arch(){ echo $architecture } - -# Check the architecture -# -# example: architecture=$(ynh_detect_arch) -# -# usage: ynh_detect_arch -# -# Requires YunoHost version 2.2.4 or higher. -# ynh_detect_arch(){ -# local architecture -# if [ -n "$(uname -m | grep arm64)" ] || [ -n "$(uname -m | grep aarch64)" ]; then -# architecture="arm64" -# elif [ -n "$(uname -m | grep 86)" ]; then -# architecture="i386" -# elif [ -n "$(uname -m | grep 64)" ]; then -# architecture="x86-64" -# elif [ -n "$(uname -m | grep armv7)" ]; then -# architecture="armv7" -# elif [ -n "$(uname -m | grep armv6)" ]; then -# architecture="armv6" -# elif [ -n "$(uname -m | grep armv5)" ]; then -# architecture="armv5" -# else -# architecture="unknown" -# fi -# echo $architecture -# } - #================================================= # DEFINE ALL COMMON FONCTIONS #================================================= From 1eede7976859e1071cfdaa4f7057640a1b75ac2b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 11:23:52 +0100 Subject: [PATCH 031/131] Update upgrade --- scripts/upgrade | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 75dbcaf..9bb1f10 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -9,7 +9,6 @@ source _common.sh source /usr/share/yunohost/helpers -# Exit if an error occurs during the execution of the script ynh_abort_if_errors #================================================= @@ -23,7 +22,6 @@ domain=$(ynh_app_setting_get "$app" domain) path_url=$(ynh_normalize_url_path $(ynh_app_setting_get "$app" path)) db_pwd=$(ynh_app_setting_get "$app" mysqlpwd) admin=$(ynh_app_setting_get "$app" adminusername) -key=$(ynh_app_setting_get "$app" secret_key) is_public=$(ynh_app_setting_get "$app" is_public) port=$(ynh_app_setting_get "$app" web_port) From 65353785cce8d85f0c89a0fbf068bba95a61b5c2 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 20 Nov 2020 11:25:30 +0100 Subject: [PATCH 032/131] Update manifest.json --- manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index d4d8617..3a5a8e2 100644 --- a/manifest.json +++ b/manifest.json @@ -3,8 +3,8 @@ "id": "gogs", "packaging_format": 1, "description": { - "en": "Lightweight git forge", - "fr": "Forge git légère" + "en": "Lightweight Git forge", + "fr": "Forge Git légère" }, "version": "0.12.3~ynh1", "url": "http://gogs.io", From 33baffdb2e01ed8d746864c691ae95208a94b586 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 6 Dec 2020 14:08:58 +0100 Subject: [PATCH 033/131] Update restore --- scripts/restore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/restore b/scripts/restore index 5222e54..b094263 100644 --- a/scripts/restore +++ b/scripts/restore @@ -64,7 +64,7 @@ ynh_mysql_connect_as "$dbuser" "$dbpass" "$dbname" < ./db.sql # Restore systemd files systemctl daemon-reload -systemctl enable "$app".service +systemctl enable "$app".service --quiet #================================================= # GENERIC FINALIZATION From 224225a7adfe76983853a2971c979c7a915e55bf Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 6 Dec 2020 14:12:04 +0100 Subject: [PATCH 034/131] Fix --- check_process | 7 +------ conf/systemd.service | 5 ++--- manifest.json | 4 ++-- scripts/install | 4 ++-- 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/check_process b/check_process index d68c2c9..744f63e 100644 --- a/check_process +++ b/check_process @@ -16,10 +16,5 @@ multi_instance=1 port_already_use=1 change_url=1 -;;; Levels - Level 5=auto ;;; Upgrade options - ; commit=aa075b2051ffad7b0b6fef3a9c767376d5bdbfab - name=Before multi_instance and refactoring - ; commit=1cbec051e1171de5a8ed1e850eb4fb3506114da5 - name=From V0.10.18 + diff --git a/conf/systemd.service b/conf/systemd.service index 0f08a9d..e9cac24 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -6,9 +6,8 @@ After=mysql.service After=slapd.service [Service] -# Modify these two values and uncomment them if you have -# repos with lots of files and get an HTTP error 500 because -# of that +# Modify these two values and uncomment them if you have repos +# with lots of files and get an HTTP error 500 because of that ### #LimitMEMLOCK=infinity #LimitNOFILE=65535 diff --git a/manifest.json b/manifest.json index 3a5a8e2..cbb8d81 100644 --- a/manifest.json +++ b/manifest.json @@ -10,8 +10,8 @@ "url": "http://gogs.io", "license": "MIT", "maintainer": { - "name": "Josué Tille", - "email": "josue@tille.ch" + "name": "", + "email": "" }, "previous_maintainers": { "name": "tostaki", diff --git a/scripts/install b/scripts/install index 5d4ccc0..580937b 100644 --- a/scripts/install +++ b/scripts/install @@ -188,7 +188,7 @@ set_access_settings #================================================= ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 -yunohost service add "$app" --log "/var/log/$app/$app.log" +yunohost service add "$app" --log="/var/log/$app/$app.log" #================================================= # SETUP LOGROTATE @@ -208,7 +208,7 @@ ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$ap #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." --weight=1 +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name=nginx --action=reload From 90d8a28cf6314e6ff3b231d716b029fec3a12597 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 6 Dec 2020 14:40:38 +0100 Subject: [PATCH 035/131] fix --- scripts/backup | 10 +-- scripts/install | 19 +++-- scripts/restore | 3 - scripts/upgrade | 180 ++++++++++++++++++++++++++++-------------------- 4 files changed, 124 insertions(+), 88 deletions(-) diff --git a/scripts/backup b/scripts/backup index 318a30c..aa34e44 100644 --- a/scripts/backup +++ b/scripts/backup @@ -35,28 +35,28 @@ ynh_print_info --message="Declaring files to be backed up..." # BACKUP THE APP MAIN DIR #================================================= -ynh_backup "$final_path" +ynh_backup --src_path="$final_path" # Copy the data files -ynh_backup "$DATADIR" +ynh_backup --src_path="/home/$app" #================================================= # BACKUP THE NGINX CONFIGURATION #================================================= -ynh_backup "/etc/nginx/conf.d/${domain}.d/${app}.conf" +ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # BACKUP SYSTEMD #================================================= -ynh_backup "/etc/systemd/system/${app}.service" +ynh_backup --src_path="/etc/systemd/system/$app.service" #================================================= # BACKUP VARIOUS FILES #================================================= -ynh_backup "/var/log/$app" +ynh_backup --src_path="/var/log/$app" #================================================= # BACKUP THE MYSQL DATABASE diff --git a/scripts/install b/scripts/install index 580937b..d126627 100644 --- a/scripts/install +++ b/scripts/install @@ -155,14 +155,13 @@ ynh_replace_string --match_string="__ADMIN__" --replace_string="$admin" --target ynh_store_file_checksum --file="$final_path/custom/conf/app.ini" ynh_store_file_checksum --file="$final_path/custom/conf/auth.d/ldap.conf" - # Configure init script ynh_add_systemd_config #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Configuring nginx web server..." --weight=1 +ynh_script_progression --message="Configuring NGINX web server..." --weight=1 # Create a dedicated nginx config ynh_add_nginx_config @@ -180,9 +179,6 @@ chmod u=rwX,g=rX,o= "$final_path" chmod u=rwX,g=rX,o= "/home/$app" chmod u=rwX,g=rX,o= "/var/log/$app" -# Unprotect root from SSO if public -set_access_settings - #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= @@ -205,6 +201,19 @@ ynh_script_progression --message="Starting a systemd service..." --weight=1 # Start a systemd service ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" +#================================================= +# SETUP SSOWAT +#================================================= +ynh_script_progression --message="Configuring SSOwat..." --weight=1 + +# Make app public if necessary or protect it +if [ $is_public -eq 1 ] +then + # Everyone can access the app. + # The "main" permission is automatically created before the install script. + ynh_permission_update --permission "main" --add "visitors" +fi + #================================================= # RELOAD NGINX #================================================= diff --git a/scripts/restore b/scripts/restore index b094263..ae5913a 100644 --- a/scripts/restore +++ b/scripts/restore @@ -15,7 +15,6 @@ source /usr/share/yunohost/helpers #================================================= ynh_clean_setup () { - #### Remove this function if there's nothing to clean before calling the remove script. true } # Exit if an error occurs during the execution of the script @@ -33,8 +32,6 @@ path_url=$(ynh_app_setting_get --app=$app --key=path) db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) admin=$(ynh_app_setting_get --app=$app --key=adminusername) - - # Check domain/path availability with app helper ynh_webpath_available $domain $path_url || ynh_die "$domain is not available as domain, please use an other domain." diff --git a/scripts/upgrade b/scripts/upgrade index 9bb1f10..f1f6f20 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -18,105 +18,135 @@ ynh_script_progression --message="Loading installation settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME -domain=$(ynh_app_setting_get "$app" domain) -path_url=$(ynh_normalize_url_path $(ynh_app_setting_get "$app" path)) -db_pwd=$(ynh_app_setting_get "$app" mysqlpwd) -admin=$(ynh_app_setting_get "$app" adminusername) -is_public=$(ynh_app_setting_get "$app" is_public) -port=$(ynh_app_setting_get "$app" web_port) +domain=$(ynh_app_setting_get --app=$app --key=domain) +path_url=$(ynh_app_setting_get --app=$app --key=path) +db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) +admin=$(ynh_app_setting_get --app=$app --key=adminusername) +is_public=$(ynh_app_setting_get --app=$app --key=is_public) +port=$(ynh_app_setting_get --app=$app --key=web_port) + +#================================================= +# CHECK VERSION +#================================================= + +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=1 # Backup the current version of the app ynh_backup_before_upgrade ynh_clean_setup () { + # Restore it if the upgrade fails ynh_restore_upgradebackup } - -# Stop service -systemctl stop "$app".service +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors #================================================= -# MIGRATION FROM OLD VERSION +# STANDARD UPGRADE STEPS #================================================= +# STOP SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Stopping a systemd service..." --time --weight=1 -# Update settings is_public to new standard -if [ "$is_public" = "Yes" ]; then - ynh_app_setting_set $app is_public 1 # Fixe is_public en booléen - is_public=1 -elif [ "$is_public" = "No" ]; then - ynh_app_setting_set $app is_public 0 - is_public=0 -fi - -if [[ $port == "" ]] -then - port=$(ynh_find_port 6000) - ynh_app_setting_set $app web_port $port -fi - -# handle upgrade from old package installation -# this test that /etc/gogs exist since this was used in the old package -# but not in the new -# this code will be removed in the future -if [ -d "/etc/gogs" ] -then - # create needed directories if not already created - create_dir - - # move repositories to new dir - old_repo_path=$(ynh_app_setting_get "$app" repopath) - mv "${old_repo_path:-/home/yunohost.app/gogs}"/* "$REPO_PATH" || true # Avoid if the directory is empty - # cleanup old dir and conf - ynh_secure_remove /opt/gogs - ynh_secure_remove /etc/gogs - ynh_secure_remove /opt/gogs_src - - # create needed directories if not already created - create_dir -fi -# end of old package upgrade - -# test if user gogs is locked because of an old installation of the package. -# if it's blocked, unlock it to allow ssh usage with git -if [[ $(grep "$app" /etc/shadow | cut -d: -f2) == '!' ]] -then - usermod -p '*' "$app" -fi - -# Remove old authentification mecanisme, actually the registry in the database has been replaced by a config file -if [[ ! -e "$final_path/custom/conf/auth.d/ldap.conf" ]] -then - ynh_mysql_connect_as "$db_user" "$db_pwd" "$db_name" <<< "DELETE FROM login_source WHERE name = 'Yunohost LDAP';" - mkdir -p "$final_path/custom/conf/auth.d" -fi +ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log" #================================================= # STANDARD UPGRADE STEPS #================================================= # Clean template to fix issue : https://github.com/gogits/gogs/issues/4585 -ynh_secure_remove "/opt/gogs/templates" +ynh_secure_remove "/opt/$app/templates" -# Install Gogs -ynh_setup_source $final_path $architecture +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= +ynh_script_progression --message="Setting up source files..." --weight=3 -# Configure gogs with app.ini file -config_gogs +ynh_app_setting_set --app=$app --key=final_path --value=$final_path +# Download, check integrity, uncompress and patch the source from app.src +ynh_setup_source --dest_dir=$final_path --source_id="$architecture" -# Configure init script +ynh_backup_if_checksum_is_different "$final_path/custom/conf/app.ini" +ynh_backup_if_checksum_is_different "$final_path/custom/conf/auth.d/ldap.conf" + +cp ../conf/app.ini "$final_path/custom/conf" +cp ../conf/ldap.conf "$final_path/custom/conf/auth.d/ldap.conf" + +if [ "$path_url" = "/" ] +then + ynh_replace_string "__URL__" "$domain" "$final_path/custom/conf/app.ini" +else + ynh_replace_string "__URL__" "$domain${path_url%/}" "$final_path/custom/conf/app.ini" +fi + +ynh_replace_string "__REPOS_PATH__" "$REPO_PATH" "$final_path/custom/conf/app.ini" +ynh_replace_string "__DB_PASSWORD__" "$dbpass" "$final_path/custom/conf/app.ini" +ynh_replace_string "__DB_USER__" "$dbuser" "$final_path/custom/conf/app.ini" +ynh_replace_string "__DOMAIN__" "$domain" "$final_path/custom/conf/app.ini" +ynh_replace_string "__KEY__" "$key" "$final_path/custom/conf/app.ini" +ynh_replace_string "__DATA_PATH__" "$DATA_PATH" "$final_path/custom/conf/app.ini" +ynh_replace_string "__PORT__" $port "$final_path/custom/conf/app.ini" +ynh_replace_string "__APP__" $app "$final_path/custom/conf/app.ini" + +if [[ "$is_public" = '1' ]] +then + ynh_replace_string "__PRIVATE_MODE__" "false" "$final_path/custom/conf/app.ini" +else + ynh_replace_string "__PRIVATE_MODE__" "true" "$final_path/custom/conf/app.ini" +fi + +ynh_replace_string "__ADMIN__" "$admin" "$final_path/custom/conf/auth.d/ldap.conf" + +ynh_store_file_checksum "$final_path/custom/conf/app.ini" +ynh_store_file_checksum "$final_path/custom/conf/auth.d/ldap.conf" + +#================================================= +# SETUP SYSTEMD +#================================================= +ynh_script_progression --message="Upgrading systemd configuration..." --time --weight=1 + +# Create a dedicated systemd config ynh_add_systemd_config -# Modify Nginx configuration file and copy it to Nginx conf directory -config_nginx +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Upgrading NGINX web server configuration..." --time --weight=1 + +# Create a dedicated NGINX config +ynh_add_nginx_config #================================================= -# GENERIC FINALIZATION +# SECURE FILES AND DIRECTORIES #================================================= -# Unprotect root from SSO if public -set_access_settings +chown -R $app:$app "$final_path" +chown -R $app:$app "/home/$app" +chown -R $app:$app "/var/log/$app" +chmod u=rwX,g=rX,o= "$final_path" +chmod u=rwX,g=rX,o= "/home/$app" +chmod u=rwX,g=rX,o= "/var/log/$app" -# Set permissions -set_permission +#================================================= +# INTEGRATE SERVICE IN YUNOHOST +#================================================= +ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 -# Reload services -ynh_check_starting "INFO] Listen: http://0.0.0.0:" "/var/log/$app/gogs.log" +yunohost service add "$app" --log="/var/log/$app/$app.log" + +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --time --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Upgrade of $app completed" --last From 6839f6e2e5d1a2e3cbeab22424dcf8ff7054d3d6 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 6 Dec 2020 14:47:29 +0100 Subject: [PATCH 036/131] Fix --- scripts/install | 2 +- scripts/restore | 94 +++++++++++++++++++++++++++++++++---------------- scripts/upgrade | 5 ++- 3 files changed, 68 insertions(+), 33 deletions(-) diff --git a/scripts/install b/scripts/install index d126627..43591ed 100644 --- a/scripts/install +++ b/scripts/install @@ -184,7 +184,7 @@ chmod u=rwX,g=rX,o= "/var/log/$app" #================================================= ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 -yunohost service add "$app" --log="/var/log/$app/$app.log" +yunohost service add $app --description="Lightweight Git forge" --log="/var/log/$app/$app.log" #================================================= # SETUP LOGROTATE diff --git a/scripts/restore b/scripts/restore index ae5913a..e7f68dc 100644 --- a/scripts/restore +++ b/scripts/restore @@ -32,50 +32,82 @@ path_url=$(ynh_app_setting_get --app=$app --key=path) db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) admin=$(ynh_app_setting_get --app=$app --key=adminusername) -# Check domain/path availability with app helper -ynh_webpath_available $domain $path_url || ynh_die "$domain is not available as domain, please use an other domain." +#================================================= +# CHECK IF THE APP CAN BE RESTORED +#================================================= +ynh_script_progression --message="Validating restoration parameters..." --weight=2 -# Check user parameter -ynh_user_exists "$admin" \ - || ynh_die "The chosen admin user does not exist." - -# Check Final Path availability -test ! -e "$final_path" || ynh_die "This path already contains a folder" +ynh_webpath_available --domain=$domain --path_url=$path_url \ + || ynh_die --message="Path not available: ${domain}${path_url}" +test ! -d $final_path \ + || ynh_die --message="There is already a directory: $final_path " #================================================= # STANDARD RESTORATION STEPS #================================================= +# RESTORE THE NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Restoring the NGINX configuration..." -# Add users -# We can't use the official helper because we need to set the shell for the login -test getent passwd "$app" &>/dev/null || \ - useradd -d "$DATADIR" --system --user-group "$app" --shell /bin/bash || \ - ynh_die "Unable to create $app system account" +ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" -# Restore all files -ynh_restore +#================================================= +# RESTORE THE APP MAIN DIR +#================================================= +ynh_script_progression --message="Restoring $app main directory..." --weight=10 -# Create and restore the database -ynh_mysql_create_db "$dbname" "$dbuser" "$dbpass" -ynh_mysql_connect_as "$dbuser" "$dbpass" "$dbname" < ./db.sql +ynh_restore_file --origin_path="$final_path" -# Restore systemd files -systemctl daemon-reload -systemctl enable "$app".service --quiet +#================================================= +# RECREATE THE DEDICATED USER +#================================================= +ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 + +# Create the dedicated user (if not existing) +ynh_system_user_create --username=$app + +#================================================= +# RESTORE THE MYSQL DATABASE +#================================================= +ynh_script_progression --message="Restoring the MySQL database..." --time --weight=1 + +db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) +ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd +ynh_mysql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./db.sql + +#================================================= +# RESTORE SYSTEMD +#================================================= +ynh_script_progression --message="Restoring the systemd configuration..." --weight=5 + +ynh_restore_file --origin_path="/etc/systemd/system/$app.service" +systemctl enable $app.service --quiet + +#================================================= +# INTEGRATE SERVICE IN YUNOHOST +#================================================= +ynh_script_progression --message="Integrating service in YunoHost..." + +yunohost service add $app --description="Lightweight Git forge" --log="/var/log/$app/$app.log" + +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a systemd service..." --weight=1 + +ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" --line_match="HTTP Server listening" #================================================= # GENERIC FINALIZATION #================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 -# Set permissions -set_permission +ynh_systemd_action --service_name=nginx --action=reload -# Configure logrotate -ynh_use_logrotate "/var/log/$app" +#================================================= +# END OF SCRIPT +#================================================= -# Add Gogs to YunoHost's monitored services -yunohost service add "$app" --log /var/log/"$app"/"$app".log - -# Reload services -systemctl reload nginx.service -ynh_check_starting "INFO] Listen: http://0.0.0.0:" "/var/log/$app/gogs.log" +ynh_script_progression --message="Restoration completed for $app" --last diff --git a/scripts/upgrade b/scripts/upgrade index f1f6f20..324e007 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -20,6 +20,9 @@ app=$YNH_APP_INSTANCE_NAME domain=$(ynh_app_setting_get --app=$app --key=domain) path_url=$(ynh_app_setting_get --app=$app --key=path) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$db_name db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) admin=$(ynh_app_setting_get --app=$app --key=adminusername) is_public=$(ynh_app_setting_get --app=$app --key=is_public) @@ -136,7 +139,7 @@ chmod u=rwX,g=rX,o= "/var/log/$app" #================================================= ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 -yunohost service add "$app" --log="/var/log/$app/$app.log" +yunohost service add $app --description="Lightweight Git forge" --log="/var/log/$app/$app.log" #================================================= # RELOAD NGINX From e8fb1af2f885e7950325e8e858cb7d6820cdae37 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 6 Dec 2020 14:50:47 +0100 Subject: [PATCH 037/131] Fix --- scripts/_common.sh | 8 -------- scripts/remove | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 6849d61..cbb0fd4 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -32,14 +32,6 @@ create_dir() { mkdir -p "/var/log/$app" } -config_nginx() { - if [ "$path_url" != "/" ] - then - ynh_replace_string "^#sub_path_only" "" "../conf/nginx.conf" - fi - ynh_add_nginx_config -} - config_gogs() { ynh_backup_if_checksum_is_different "$final_path/custom/conf/app.ini" ynh_backup_if_checksum_is_different "$final_path/custom/conf/auth.d/ldap.conf" diff --git a/scripts/remove b/scripts/remove index d31ed84..6f49832 100644 --- a/scripts/remove +++ b/scripts/remove @@ -80,7 +80,7 @@ ynh_remove_logrotate #================================================= ynh_script_progression --message="Removing NGINX web server configuration..." --weight=1 -# Remove the dedicated nginx config +# Remove the dedicated NGINX config ynh_remove_nginx_config #================================================= From 1ee87a1c1de0b2d3d10e3b4ca6c817d29fcf0ef6 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 6 Dec 2020 14:56:01 +0100 Subject: [PATCH 038/131] Fix --- scripts/install | 4 ++-- scripts/upgrade | 39 ++++++++++++++++++++++++--------------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/scripts/install b/scripts/install index 43591ed..24955c5 100644 --- a/scripts/install +++ b/scripts/install @@ -163,7 +163,7 @@ ynh_add_systemd_config #================================================= ynh_script_progression --message="Configuring NGINX web server..." --weight=1 -# Create a dedicated nginx config +# Create a dedicated NGINX config ynh_add_nginx_config #================================================= @@ -191,7 +191,7 @@ yunohost service add $app --description="Lightweight Git forge" --log="/var/log/ #================================================= ynh_script_progression --message="Configuring log rotation..." --weight=1 -ynh_use_logrotate "/var/log/$app" +ynh_use_logrotate #================================================= # START SYSTEMD SERVICE diff --git a/scripts/upgrade b/scripts/upgrade index 324e007..daf7ab1 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -86,23 +86,23 @@ else ynh_replace_string "__URL__" "$domain${path_url%/}" "$final_path/custom/conf/app.ini" fi -ynh_replace_string "__REPOS_PATH__" "$REPO_PATH" "$final_path/custom/conf/app.ini" -ynh_replace_string "__DB_PASSWORD__" "$dbpass" "$final_path/custom/conf/app.ini" -ynh_replace_string "__DB_USER__" "$dbuser" "$final_path/custom/conf/app.ini" -ynh_replace_string "__DOMAIN__" "$domain" "$final_path/custom/conf/app.ini" -ynh_replace_string "__KEY__" "$key" "$final_path/custom/conf/app.ini" -ynh_replace_string "__DATA_PATH__" "$DATA_PATH" "$final_path/custom/conf/app.ini" -ynh_replace_string "__PORT__" $port "$final_path/custom/conf/app.ini" -ynh_replace_string "__APP__" $app "$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_PASSWORD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__KEY__" --replace_string="$(ynh_string_random)" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" if [[ "$is_public" = '1' ]] then - ynh_replace_string "__PRIVATE_MODE__" "false" "$final_path/custom/conf/app.ini" + ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="false" --target_file="$final_path/custom/conf/app.ini" else - ynh_replace_string "__PRIVATE_MODE__" "true" "$final_path/custom/conf/app.ini" + ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="true" --target_file="$final_path/custom/conf/app.ini" fi -ynh_replace_string "__ADMIN__" "$admin" "$final_path/custom/conf/auth.d/ldap.conf" +ynh_replace_string --match_string="__ADMIN__" --replace_string="$admin" --target_file="$final_path/custom/conf/auth.d/ldap.conf" ynh_store_file_checksum "$final_path/custom/conf/app.ini" ynh_store_file_checksum "$final_path/custom/conf/auth.d/ldap.conf" @@ -110,7 +110,7 @@ ynh_store_file_checksum "$final_path/custom/conf/auth.d/ldap.conf" #================================================= # SETUP SYSTEMD #================================================= -ynh_script_progression --message="Upgrading systemd configuration..." --time --weight=1 +ynh_script_progression --message="Upgrading systemd configuration..." --weight=1 # Create a dedicated systemd config ynh_add_systemd_config @@ -118,7 +118,7 @@ ynh_add_systemd_config #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading NGINX web server configuration..." --time --weight=1 +ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=2 # Create a dedicated NGINX config ynh_add_nginx_config @@ -127,6 +127,7 @@ ynh_add_nginx_config # SECURE FILES AND DIRECTORIES #================================================= +# Set permissions to app files chown -R $app:$app "$final_path" chown -R $app:$app "/home/$app" chown -R $app:$app "/var/log/$app" @@ -137,14 +138,22 @@ chmod u=rwX,g=rX,o= "/var/log/$app" #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= -ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 +ynh_script_progression --message="Integrating service in YunoHost..." --weight=2 yunohost service add $app --description="Lightweight Git forge" --log="/var/log/$app/$app.log" +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a systemd service..." --weight=1 + +# Start a systemd service +ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" + #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." --time --weight=1 +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name=nginx --action=reload From 1f8dc8a12aed806696f00b06db7b2b5d2ab5abed Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 6 Dec 2020 15:04:29 +0100 Subject: [PATCH 039/131] Fix --- conf/nginx.conf | 3 ++- scripts/restore | 1 + scripts/upgrade | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index cf3b636..5d086cb 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -6,6 +6,7 @@ location __PATH__/ { rewrite ^ https://$server_name$request_uri? permanent; } + proxy_pass http://127.0.0.1:__PORT__; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; @@ -13,7 +14,7 @@ location __PATH__/ { rewrite ^__PATH__/gogs/(.*) /$1 break; rewrite ^__PATH__/gogs$ /$1 break; - proxy_pass http://localhost:__PORT__; + proxy_read_timeout 90; client_max_body_size 200M; diff --git a/scripts/restore b/scripts/restore index e7f68dc..fa9f062 100644 --- a/scripts/restore +++ b/scripts/restore @@ -29,6 +29,7 @@ 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_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) admin=$(ynh_app_setting_get --app=$app --key=adminusername) diff --git a/scripts/upgrade b/scripts/upgrade index daf7ab1..5e0b9e8 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -27,6 +27,7 @@ db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) admin=$(ynh_app_setting_get --app=$app --key=adminusername) is_public=$(ynh_app_setting_get --app=$app --key=is_public) port=$(ynh_app_setting_get --app=$app --key=web_port) +architecture=$(ynh_detect_arch) #================================================= # CHECK VERSION From 75626e35fe5bcb889616709ed88ba77701c6d2cb Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 6 Dec 2020 15:08:51 +0100 Subject: [PATCH 040/131] Fix --- scripts/install | 6 +++--- scripts/remove | 2 +- scripts/restore | 2 ++ scripts/upgrade | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/scripts/install b/scripts/install index 24955c5..c13dfed 100644 --- a/scripts/install +++ b/scripts/install @@ -67,7 +67,7 @@ ynh_app_setting_set --app=$app --key=port --value=$port #================================================= # CREATE A MYSQL DATABASE #================================================= -ynh_script_progression --message="Creating a MySQL database..." --weight=1 +ynh_script_progression --message="Creating a MySQL database..." --weight=3 db_name=$(ynh_sanitize_dbid --db_name=$app) db_user=$db_name @@ -161,7 +161,7 @@ ynh_add_systemd_config #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Configuring NGINX web server..." --weight=1 +ynh_script_progression --message="Configuring NGINX web server..." --weight=2 # Create a dedicated NGINX config ynh_add_nginx_config @@ -196,7 +196,7 @@ ynh_use_logrotate #================================================= # START SYSTEMD SERVICE #================================================= -ynh_script_progression --message="Starting a systemd service..." --weight=1 +ynh_script_progression --message="Starting a systemd service..." --weight=3 # Start a systemd service ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" diff --git a/scripts/remove b/scripts/remove index 6f49832..3384e84 100644 --- a/scripts/remove +++ b/scripts/remove @@ -54,7 +54,7 @@ ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name #================================================= # REMOVE APP MAIN DIR #================================================= -ynh_script_progression --message="Removing app main directory..." --time --weight=3 +ynh_script_progression --message="Removing app main directory..." --weight=3 # Remove the app directory securely ynh_secure_remove --file="$final_path" diff --git a/scripts/restore b/scripts/restore index fa9f062..b6201a9 100644 --- a/scripts/restore +++ b/scripts/restore @@ -30,6 +30,8 @@ app=$YNH_APP_INSTANCE_NAME domain=$(ynh_app_setting_get --app=$app --key=domain) path_url=$(ynh_app_setting_get --app=$app --key=path) final_path=$(ynh_app_setting_get --app=$app --key=final_path) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$db_name db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) admin=$(ynh_app_setting_get --app=$app --key=adminusername) diff --git a/scripts/upgrade b/scripts/upgrade index 5e0b9e8..c2cc614 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -54,7 +54,7 @@ ynh_abort_if_errors #================================================= # STOP SYSTEMD SERVICE #================================================= -ynh_script_progression --message="Stopping a systemd service..." --time --weight=1 +ynh_script_progression --message="Stopping a systemd service..." --weight=2 ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log" From f5cfd9534e21f928d759baa7a9cbabb82d7e4904 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 6 Dec 2020 15:23:22 +0100 Subject: [PATCH 041/131] Fix --- README.md | 20 ++---- scripts/change_url | 160 ++++++++++++++++++++++++++++++++++++++------- scripts/install | 2 +- scripts/remove | 2 +- scripts/restore | 9 ++- scripts/upgrade | 3 + 6 files changed, 149 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index 9dfcb2b..d4c686a 100644 --- a/README.md +++ b/README.md @@ -11,25 +11,15 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in ## Overview Gogs is a self-hosted Git service written in Go. Alternative to Github. -## Info **Shipped version:** 0.12.3 -# IMPORTANT INFORMATION +## Screenshots -For the old install you can migrate to gitea easly by juste upgrading your actuall gogs instance with the gitea source by this command: -``` -sudo yunohost app upgrade -u https://github.com/YunoHost-Apps/gitea_ynh gogs -``` -**Note that this command contains some risk of data lost. So it's important to make a backup of the app before the install.** -To make a backup you can use this command: -``` -sudo yunohost backup create --debug --apps gogs -``` +![](https://gogs.io/img/screenshots/2.png) -For the new install just install gitea by this command: -``` -sudo yunohost app install -l Gitea https://github.com/YunoHost-Apps/gitea_ynh -``` +## Demo + +* [Official demo](https://try.gogs.io/user/login) ## Notes on SSH usage If you want to use Gogs with ssh and be able to pull/push with you ssh key, your ssh daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: diff --git a/scripts/change_url b/scripts/change_url index b7998fe..0f9668f 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -9,46 +9,156 @@ source _common.sh source /usr/share/yunohost/helpers -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - #================================================= # RETRIEVE ARGUMENTS #================================================= old_domain=$YNH_APP_OLD_DOMAIN -domain=$YNH_APP_NEW_DOMAIN +old_path=$YNH_APP_OLD_PATH + +new_domain=$YNH_APP_NEW_DOMAIN +new_path=$YNH_APP_NEW_PATH -path_url=$(ynh_normalize_url_path ${YNH_APP_NEW_PATH:-'/'}) app=$YNH_APP_INSTANCE_NAME -db_pwd=$(ynh_app_setting_get "$app" mysqlpwd) -admin=$(ynh_app_setting_get "$app" adminusername) -key=$(ynh_app_setting_get "$app" secret_key) -port=$(ynh_app_setting_get "$app" web_port) -is_public=$(ynh_app_setting_get "$app" is_public) +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --time --weight=1 + +# Needed for helper "ynh_add_nginx_config" +final_path=$(ynh_app_setting_get --app=$app --key=final_path) + +# Add settings here as needed by your application +#db_name=$(ynh_app_setting_get --app=$app --key=db_name) +#db_user=$db_name +#db_pwd=$(ynh_app_setting_get --app=$app --key=db_pwd) + +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --time --weight=1 + +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + # Remove the new domain config file, the remove script won't do it as it doesn't know yet its location. + ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" + + # Restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# CHECK WHICH PARTS SHOULD BE CHANGED +#================================================= + +change_domain=0 +if [ "$old_domain" != "$new_domain" ] +then + change_domain=1 +fi + +change_path=0 +if [ "$old_path" != "$new_path" ] +then + change_path=1 +fi #================================================= # STANDARD MODIFICATIONS #================================================= +# STOP SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Stopping a systemd service..." --time --weight=1 -# Change the domain for nginx -if [ "$old_domain" != "$domain" ] +ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log" + +#================================================= +# MODIFY URL IN NGINX CONF +#================================================= +ynh_script_progression --message="Updating NGINX web server configuration..." --time --weight=1 + +nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf + +# Change the path in the NGINX config file +if [ $change_path -eq 1 ] then - # Delete file checksum for the old conf file location - ynh_delete_file_checksum "/etc/nginx/conf.d/$old_domain.d/$app.conf" - - mv "/etc/nginx/conf.d/$old_domain.d/$app.conf" "/etc/nginx/conf.d/$domain.d/$app.conf" - - # Store file checksum for the new config file location - ynh_store_file_checksum "/etc/nginx/conf.d/$domain.d/$app.conf" + # Make a backup of the original NGINX config file if modified + ynh_backup_if_checksum_is_different --file="$nginx_conf_path" + # Set global variables for NGINX helper + domain="$old_domain" + path_url="$new_path" + # Create a dedicated NGINX config + ynh_add_nginx_config fi -config_nginx +# Change the domain for NGINX +if [ $change_domain -eq 1 ] +then + # Delete file checksum for the old conf file location + ynh_delete_file_checksum --file="$nginx_conf_path" + mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf + # Store file checksum for the new config file location + ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" +fi -# Update gogs config -config_gogs +#================================================= +# SPECIFIC MODIFICATIONS +#================================================= +REPO_PATH="/home/$app/repositories" +DATA_PATH="/home/$app/data" -# RELOAD services -ynh_check_starting "INFO] Listen: http://0.0.0.0:" "/var/log/$app/gogs.log" -sleep 1 \ No newline at end of file +cp ../conf/app.ini "$final_path/custom/conf" +cp ../conf/ldap.conf "$final_path/custom/conf/auth.d/ldap.conf" + +if [ "$path_url" = "/" ] +then + ynh_replace_string --match_string="__URL__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" +else + ynh_replace_string --match_string="__URL__" --replace_string="$domain${path_url%/}" --target_file="$final_path/custom/conf/app.ini" +fi + +ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_PASSWORD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__KEY__" --replace_string="$(ynh_string_random)" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" + +if [[ "$is_public" = '1' ]] +then + ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="false" --target_file="$final_path/custom/conf/app.ini" +else + ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="true" --target_file="$final_path/custom/conf/app.ini" +fi + +ynh_replace_string --match_string="__ADMIN__" --replace_string="$admin" --target_file="$final_path/custom/conf/auth.d/ldap.conf" + +ynh_store_file_checksum --file="$final_path/custom/conf/app.ini" + +#================================================= +# GENERIC FINALISATION +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a systemd service..." --time --weight=1 + +ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" + +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --time --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Change of URL completed for $app" --time --last diff --git a/scripts/install b/scripts/install index c13dfed..e45194f 100644 --- a/scripts/install +++ b/scripts/install @@ -14,7 +14,7 @@ source /usr/share/yunohost/helpers #================================================= ynh_clean_setup () { - true + ynh_clean_check_starting } # Exit if an error occurs during the execution of the script ynh_abort_if_errors diff --git a/scripts/remove b/scripts/remove index 3384e84..a0bbe42 100644 --- a/scripts/remove +++ b/scripts/remove @@ -28,7 +28,7 @@ final_path=$(ynh_app_setting_get --app=$app --key=final_path) # REMOVE SERVICE INTEGRATION IN YUNOHOST #================================================= -# Remove the service from the list of services known by Yunohost (added from `yunohost service add`) +# Remove the service from the list of services known by YunoHost (added from `yunohost service add`) if ynh_exec_warn_less yunohost service status $app >/dev/null then ynh_script_progression --message="Removing $app service integration..." --weight=1 diff --git a/scripts/restore b/scripts/restore index b6201a9..d57cdd5 100644 --- a/scripts/restore +++ b/scripts/restore @@ -6,7 +6,6 @@ # IMPORT GENERIC HELPERS #================================================= -#Keep this path for calling _common.sh inside the execution's context of backup and restore scripts source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers @@ -15,7 +14,7 @@ source /usr/share/yunohost/helpers #================================================= ynh_clean_setup () { - true + ynh_clean_check_starting } # Exit if an error occurs during the execution of the script ynh_abort_if_errors @@ -72,7 +71,7 @@ ynh_system_user_create --username=$app #================================================= # RESTORE THE MYSQL DATABASE #================================================= -ynh_script_progression --message="Restoring the MySQL database..." --time --weight=1 +ynh_script_progression --message="Restoring the MySQL database..." --weight=3 db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd @@ -89,14 +88,14 @@ systemctl enable $app.service --quiet #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= -ynh_script_progression --message="Integrating service in YunoHost..." +ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 yunohost service add $app --description="Lightweight Git forge" --log="/var/log/$app/$app.log" #================================================= # START SYSTEMD SERVICE #================================================= -ynh_script_progression --message="Starting a systemd service..." --weight=1 +ynh_script_progression --message="Starting a systemd service..." --weight=3 ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" --line_match="HTTP Server listening" diff --git a/scripts/upgrade b/scripts/upgrade index c2cc614..8719960 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -70,6 +70,9 @@ ynh_secure_remove "/opt/$app/templates" #================================================= ynh_script_progression --message="Setting up source files..." --weight=3 +REPO_PATH="/home/$app/repositories" +DATA_PATH="/home/$app/data" + ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir=$final_path --source_id="$architecture" From e8ca959fd3cad51190dfaf2da3f5907150233268 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 6 Dec 2020 15:37:51 +0100 Subject: [PATCH 042/131] Fix --- conf/systemd.service | 5 +---- scripts/change_url | 6 +----- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/conf/systemd.service b/conf/systemd.service index e9cac24..d25a978 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -1,9 +1,6 @@ [Unit] Description=Gogs (Go Git Service) -After=syslog.target -After=network.target -After=mysql.service -After=slapd.service +After=syslog.target network.target mysql.service slapd.service [Service] # Modify these two values and uncomment them if you have repos diff --git a/scripts/change_url b/scripts/change_url index 0f9668f..852e1ab 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -28,11 +28,7 @@ ynh_script_progression --message="Loading installation settings..." --time --wei # Needed for helper "ynh_add_nginx_config" final_path=$(ynh_app_setting_get --app=$app --key=final_path) - -# Add settings here as needed by your application -#db_name=$(ynh_app_setting_get --app=$app --key=db_name) -#db_user=$db_name -#db_pwd=$(ynh_app_setting_get --app=$app --key=db_pwd) +port=$(ynh_app_setting_get --app=$app --key=web_port) #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP From 9942c3406f63487d51259ae2bf7698fb3170268d Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 6 Dec 2020 15:53:56 +0100 Subject: [PATCH 043/131] Update install --- scripts/install | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/install b/scripts/install index e45194f..825482a 100644 --- a/scripts/install +++ b/scripts/install @@ -172,9 +172,9 @@ ynh_add_nginx_config # SECURE FILES AND DIRECTORIES #================================================= -chown -R $app:$app "$final_path" -chown -R $app:$app "/home/$app" -chown -R $app:$app "/var/log/$app" +chown -R $app: "$final_path" +chown -R $app: "/home/$app" +chown -R $app: "/var/log/$app" chmod u=rwX,g=rX,o= "$final_path" chmod u=rwX,g=rX,o= "/home/$app" chmod u=rwX,g=rX,o= "/var/log/$app" From e947bf2a7f575d84ea41fb3cb7b6edae8d207072 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 29 Dec 2020 23:34:14 +0100 Subject: [PATCH 044/131] Update systemd.service --- conf/systemd.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/systemd.service b/conf/systemd.service index d25a978..cae79f0 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -12,7 +12,7 @@ Type=simple User=__APP__ Group=__APP__ WorkingDirectory=/home/__APP__ -ExecStart=/var/www/gogs/gogs web +ExecStart=__FINALPATH__/gogs web Restart=always Environment=USER=__APP__ HOME=/home/__APP__ From cc878ea07a58a6571a64954e7577b0b059d18e4e Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 29 Dec 2020 23:35:55 +0100 Subject: [PATCH 045/131] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d4c686a..c8137d3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Gogs for YunoHost [![Integration level](https://dash.yunohost.org/integration/gogs.svg)](https://dash.yunohost.org/appci/app/gogs) ![](https://ci-apps.yunohost.org/ci/badges/gogs.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/gogs.maintain.svg) -[![Install Gogs with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=gogs) +[![Install Gogs with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=gogs) *[Lire ce readme en français.](./README_fr.md)* From 4695d907ba6454d0bdba6798d545dd64e5940404 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 29 Dec 2020 23:42:57 +0100 Subject: [PATCH 046/131] Update nginx.conf --- conf/nginx.conf | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 5d086cb..3c8eff4 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -6,17 +6,17 @@ location __PATH__/ { rewrite ^ https://$server_name$request_uri? permanent; } - proxy_pass http://127.0.0.1:__PORT__; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://127.0.0.1:__PORT__/; + proxy_set_header Host $host; + proxy_buffering off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; - rewrite ^__PATH__/gogs/(.*) /$1 break; - rewrite ^__PATH__/gogs$ /$1 break; - - proxy_read_timeout 90; + #rewrite ^__PATH__/gogs/(.*) /$1 break; + #rewrite ^__PATH__/gogs$ /$1 break; + #proxy_read_timeout 90; client_max_body_size 200M; # Include SSOWAT user panel. From ed8432731ac8d7a123755e83495c40db39774845 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 29 Dec 2020 23:52:57 +0100 Subject: [PATCH 047/131] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 8719960..31e14e7 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -26,7 +26,7 @@ db_user=$db_name db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) admin=$(ynh_app_setting_get --app=$app --key=adminusername) is_public=$(ynh_app_setting_get --app=$app --key=is_public) -port=$(ynh_app_setting_get --app=$app --key=web_port) +port=$(ynh_app_setting_get --app=$app --key=port) architecture=$(ynh_detect_arch) #================================================= From 1540e359829ea5e4f42517deff772a1829fb03cb Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 29 Dec 2020 23:53:18 +0100 Subject: [PATCH 048/131] Fix --- scripts/change_url | 14 +++++++------- scripts/install | 2 -- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index 852e1ab..e50aa0f 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -24,7 +24,7 @@ app=$YNH_APP_INSTANCE_NAME #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." --time --weight=1 +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) @@ -33,7 +33,7 @@ port=$(ynh_app_setting_get --app=$app --key=web_port) #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= -ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --time --weight=1 +ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --weight=1 # Backup the current version of the app ynh_backup_before_upgrade @@ -68,14 +68,14 @@ fi #================================================= # STOP SYSTEMD SERVICE #================================================= -ynh_script_progression --message="Stopping a systemd service..." --time --weight=1 +ynh_script_progression --message="Stopping a systemd service..." --weight=2 ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log" #================================================= # MODIFY URL IN NGINX CONF #================================================= -ynh_script_progression --message="Updating NGINX web server configuration..." --time --weight=1 +ynh_script_progression --message="Updating NGINX web server configuration..." --weight=3 nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf @@ -142,14 +142,14 @@ ynh_store_file_checksum --file="$final_path/custom/conf/app.ini" #================================================= # START SYSTEMD SERVICE #================================================= -ynh_script_progression --message="Starting a systemd service..." --time --weight=1 +ynh_script_progression --message="Starting a systemd service..." --weight=2 ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." --time --weight=1 +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name=nginx --action=reload @@ -157,4 +157,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Change of URL completed for $app" --time --last +ynh_script_progression --message="Change of URL completed for $app" --last diff --git a/scripts/install b/scripts/install index 825482a..58dcdab 100644 --- a/scripts/install +++ b/scripts/install @@ -209,8 +209,6 @@ ynh_script_progression --message="Configuring SSOwat..." --weight=1 # Make app public if necessary or protect it if [ $is_public -eq 1 ] then - # Everyone can access the app. - # The "main" permission is automatically created before the install script. ynh_permission_update --permission "main" --add "visitors" fi From 94c671c567558020cda59bda2c34349f35ef0a80 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 29 Dec 2020 23:54:49 +0100 Subject: [PATCH 049/131] Fix --- check_process | 1 - scripts/change_url | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/check_process b/check_process index 744f63e..67035eb 100644 --- a/check_process +++ b/check_process @@ -17,4 +17,3 @@ port_already_use=1 change_url=1 ;;; Upgrade options - diff --git a/scripts/change_url b/scripts/change_url index e50aa0f..896239c 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -28,7 +28,7 @@ ynh_script_progression --message="Loading installation settings..." --weight=1 # Needed for helper "ynh_add_nginx_config" final_path=$(ynh_app_setting_get --app=$app --key=final_path) -port=$(ynh_app_setting_get --app=$app --key=web_port) +port=$(ynh_app_setting_get --app=$app --key=port) #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP From e4556f3ef0d2468f5d743b756f454ee9a335c5b5 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 29 Dec 2020 23:55:21 +0100 Subject: [PATCH 050/131] 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 3c8eff4..d2fd210 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -13,7 +13,7 @@ location __PATH__/ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - #rewrite ^__PATH__/gogs/(.*) /$1 break; + #wrewrite ^__PATH__/gogs/(.*) /$1 break; #rewrite ^__PATH__/gogs$ /$1 break; #proxy_read_timeout 90; From 975afd3b65a7ad0b8c86bd8dda11c7710b304734 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 30 Dec 2020 14:16:37 +0100 Subject: [PATCH 051/131] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c8137d3..6be8552 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* ## Overview -Gogs is a self-hosted Git service written in Go. Alternative to Github. +Gogs is a self-hosted Git service written in Go. Alternative to GitHub. **Shipped version:** 0.12.3 @@ -22,7 +22,7 @@ Gogs is a self-hosted Git service written in Go. Alternative to Github. * [Official demo](https://try.gogs.io/user/login) ## Notes on SSH usage -If you want to use Gogs with ssh and be able to pull/push with you ssh key, your ssh daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: +If you want to use Gogs with ssh and be able to pull/push with you ssh key, your SSH daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: ```bash PubkeyAuthentication yes @@ -34,7 +34,7 @@ UsePAM no You also need to add your public key to your Gogs profile. -If you use ssh on another port than 22, you need to add theses lines to your ssh config in `~/.ssh/config`: +If you use SSH on another port than 22, you need to add theses lines to your SSH config in `~/.ssh/config`: ```bash Host domain.tld From c8f90e385bad7566f7f8698a593875539bee6aac Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 30 Dec 2020 15:07:15 +0100 Subject: [PATCH 052/131] Fix --- conf/nginx.conf | 4 ++-- scripts/backup | 6 ++++++ scripts/change_url | 17 +++++++++-------- scripts/restore | 8 +++++++- scripts/upgrade | 6 +++--- 5 files changed, 27 insertions(+), 14 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index d2fd210..5c003bb 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -13,8 +13,8 @@ location __PATH__/ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - #wrewrite ^__PATH__/gogs/(.*) /$1 break; - #rewrite ^__PATH__/gogs$ /$1 break; + #wrewrite ^__PATH__/gogs/(.*) /$1 break; + #rewrite ^__PATH__/gogs$ /$1 break; #proxy_read_timeout 90; client_max_body_size 200M; diff --git a/scripts/backup b/scripts/backup index aa34e44..b9bc0ec 100644 --- a/scripts/backup +++ b/scripts/backup @@ -58,6 +58,12 @@ ynh_backup --src_path="/etc/systemd/system/$app.service" ynh_backup --src_path="/var/log/$app" +#================================================= +# BACKUP LOGROTATE +#================================================= + +ynh_backup --src_path="/etc/logrotate.d/$app" + #================================================= # BACKUP THE MYSQL DATABASE #================================================= diff --git a/scripts/change_url b/scripts/change_url index 896239c..e8c9218 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -29,6 +29,7 @@ ynh_script_progression --message="Loading installation settings..." --weight=1 # Needed for helper "ynh_add_nginx_config" final_path=$(ynh_app_setting_get --app=$app --key=final_path) port=$(ynh_app_setting_get --app=$app --key=port) +admin=$(ynh_app_setting_get --app=$app --key=admin) #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP @@ -112,19 +113,19 @@ cp ../conf/ldap.conf "$final_path/custom/conf/auth.d/ldap.conf" if [ "$path_url" = "/" ] then - ynh_replace_string --match_string="__URL__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" + ynh_replace_string --match_string="__URL__" --replace_string="$new_domain" --target_file="$final_path/custom/conf/app.ini" else - ynh_replace_string --match_string="__URL__" --replace_string="$domain${path_url%/}" --target_file="$final_path/custom/conf/app.ini" + ynh_replace_string --match_string="__URL__" --replace_string="$new_domain${new_path%/}" --target_file="$final_path/custom/conf/app.ini" fi -ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_PASSWORD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_PASSWORD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DOMAIN__" --replace_string="$new_domain" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__KEY__" --replace_string="$(ynh_string_random)" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" if [[ "$is_public" = '1' ]] then diff --git a/scripts/restore b/scripts/restore index d57cdd5..b699b72 100644 --- a/scripts/restore +++ b/scripts/restore @@ -32,7 +32,7 @@ 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=mysqlpwd) -admin=$(ynh_app_setting_get --app=$app --key=adminusername) +admin=$(ynh_app_setting_get --app=$app --key=admin) #================================================= # CHECK IF THE APP CAN BE RESTORED @@ -99,6 +99,12 @@ ynh_script_progression --message="Starting a systemd service..." --weight=3 ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" --line_match="HTTP Server listening" +#================================================= +# RESTORE THE LOGROTATE CONFIGURATION +#================================================= + +ynh_restore_file --origin_path="/etc/logrotate.d/$app" + #================================================= # GENERIC FINALIZATION #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 31e14e7..336d457 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -24,7 +24,7 @@ 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=mysqlpwd) -admin=$(ynh_app_setting_get --app=$app --key=adminusername) +admin=$(ynh_app_setting_get --app=$app --key=admin) is_public=$(ynh_app_setting_get --app=$app --key=is_public) port=$(ynh_app_setting_get --app=$app --key=port) architecture=$(ynh_detect_arch) @@ -85,9 +85,9 @@ cp ../conf/ldap.conf "$final_path/custom/conf/auth.d/ldap.conf" if [ "$path_url" = "/" ] then - ynh_replace_string "__URL__" "$domain" "$final_path/custom/conf/app.ini" + ynh_replace_string --match_string="__URL__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" else - ynh_replace_string "__URL__" "$domain${path_url%/}" "$final_path/custom/conf/app.ini" + ynh_replace_string --match_string="__URL__" --replace_string="$domain${path_url%/}" --target_file="$final_path/custom/conf/app.ini" fi ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" From 5a16b67a8393be21310ce67149ab8c66a8a7bb01 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 30 Dec 2020 16:04:25 +0100 Subject: [PATCH 053/131] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 58dcdab..f654017 100644 --- a/scripts/install +++ b/scripts/install @@ -175,7 +175,7 @@ ynh_add_nginx_config chown -R $app: "$final_path" chown -R $app: "/home/$app" chown -R $app: "/var/log/$app" -chmod u=rwX,g=rX,o= "$final_path" +#chmod u=rwX,g=rX,o= "$final_path" chmod u=rwX,g=rX,o= "/home/$app" chmod u=rwX,g=rX,o= "/var/log/$app" From 5b54dc4938c72c16cae81d95ba350853695bb1a1 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 3 Apr 2021 23:44:42 +0200 Subject: [PATCH 054/131] Fix --- manifest.json | 18 +----------------- scripts/install | 3 +-- scripts/upgrade | 1 - 3 files changed, 2 insertions(+), 20 deletions(-) diff --git a/manifest.json b/manifest.json index cbb8d81..8c75d13 100644 --- a/manifest.json +++ b/manifest.json @@ -23,45 +23,29 @@ "mysql" ], "requirements": { - "yunohost": ">= 4.0.0" + "yunohost": ">= 4.1.7" }, "arguments": { "install" : [ { "name": "domain", "type": "domain", - "ask": { - "en": "Choose a domain for Gogs", - "fr": "Choisissez un domaine pour Gogs" - }, "example": "domain.org" }, { "name": "path", "type": "path", - "ask": { - "en": "Choose a path for Gogs", - "fr": "Choisissez un chemin pour Gogs" - }, "example": "/gogs", "default": "/gogs" }, { "name": "admin", "type": "user", - "ask": { - "en": "Choose the Gogs administrator (must be an existing YunoHost user)", - "fr": "Choisissez l'administrateur de Gogs (doit être un utilisateur YunoHost existant)" - }, "example": "johndoe" }, { "name": "is_public", "type": "boolean", - "ask": { - "en": "Is it a public site?", - "fr": "Est-ce un site public ?" - }, "default": true } ] diff --git a/scripts/install b/scripts/install index f654017..f6efc51 100644 --- a/scripts/install +++ b/scripts/install @@ -51,7 +51,6 @@ 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=adminusername --value=$admin ynh_app_setting_set --app=$app --key=path --value=$path_url -ynh_app_setting_set --app=$app --key=is_public --value=$is_public #================================================= # STANDARD MODIFICATIONS @@ -209,7 +208,7 @@ ynh_script_progression --message="Configuring SSOwat..." --weight=1 # Make app public if necessary or protect it if [ $is_public -eq 1 ] then - ynh_permission_update --permission "main" --add "visitors" + ynh_permission_update --permission="main" --add="visitors" fi #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 336d457..d3d3b99 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -25,7 +25,6 @@ db_name=$(ynh_app_setting_get --app=$app --key=db_name) db_user=$db_name db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) admin=$(ynh_app_setting_get --app=$app --key=admin) -is_public=$(ynh_app_setting_get --app=$app --key=is_public) port=$(ynh_app_setting_get --app=$app --key=port) architecture=$(ynh_detect_arch) From b9c6ab427f6d6cd1ff23bb459763c30822758c4c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 23 Apr 2021 07:57:08 +0200 Subject: [PATCH 055/131] Fix --- conf/app.ini | 6 +++--- scripts/_common.sh | 9 +++------ scripts/install | 8 +++----- scripts/upgrade | 10 ++++------ 4 files changed, 13 insertions(+), 20 deletions(-) diff --git a/conf/app.ini b/conf/app.ini index 5a08d74..7e6a99a 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -162,9 +162,9 @@ DSA = 1024 ; Either "mysql", "postgres" or "sqlite3", you can connect to TiDB with MySQL protocol DB_TYPE = mysql HOST = 127.0.0.1:3306 -NAME = __DB_USER__ -USER = __DB_USER__ -PASSWD = __DB_PASSWORD__ +NAME = __DB_NAME__ +USER = __DB_NAME__ +PASSWD = __DB_PWD__ ; For "postgres" only, either "disable", "require" or "verify-full" SSL_MODE = disable ; For "sqlite3" and "tidb", use absolute path when you start as service diff --git a/scripts/_common.sh b/scripts/_common.sh index cbb0fd4..624dae9 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -34,10 +34,8 @@ create_dir() { config_gogs() { ynh_backup_if_checksum_is_different "$final_path/custom/conf/app.ini" - ynh_backup_if_checksum_is_different "$final_path/custom/conf/auth.d/ldap.conf" cp ../conf/app.ini "$final_path/custom/conf" - cp ../conf/ldap.conf "$final_path/custom/conf/auth.d/ldap.conf" if [ "$path_url" = "/" ] then @@ -47,8 +45,8 @@ config_gogs() { fi ynh_replace_string "__REPOS_PATH__" "$REPO_PATH" "$final_path/custom/conf/app.ini" - ynh_replace_string "__DB_PASSWORD__" "$dbpass" "$final_path/custom/conf/app.ini" - ynh_replace_string "__DB_USER__" "$dbuser" "$final_path/custom/conf/app.ini" + ynh_replace_string "__DB_PWD__" "$dbpass" "$final_path/custom/conf/app.ini" + ynh_replace_string "__DB_NAME__" "$dbuser" "$final_path/custom/conf/app.ini" ynh_replace_string "__DOMAIN__" "$domain" "$final_path/custom/conf/app.ini" ynh_replace_string "__KEY__" "$key" "$final_path/custom/conf/app.ini" ynh_replace_string "__DATA_PATH__" "$DATA_PATH" "$final_path/custom/conf/app.ini" @@ -62,10 +60,9 @@ config_gogs() { ynh_replace_string "__PRIVATE_MODE__" "true" "$final_path/custom/conf/app.ini" fi - ynh_replace_string "__ADMIN__" "$admin" "$final_path/custom/conf/auth.d/ldap.conf" + ynh_add_config --template="../conf/ldap.conf" --destination="$final_path/custom/conf/auth.d/ldap.conf" ynh_store_file_checksum "$final_path/custom/conf/app.ini" - ynh_store_file_checksum "$final_path/custom/conf/auth.d/ldap.conf" } set_permission() { diff --git a/scripts/install b/scripts/install index f6efc51..6cabfed 100644 --- a/scripts/install +++ b/scripts/install @@ -124,7 +124,6 @@ mkdir -p "/var/log/$app" #================================================= cp ../conf/app.ini "$final_path/custom/conf" -cp ../conf/ldap.conf "$final_path/custom/conf/auth.d/ldap.conf" if [ "$path_url" = "/" ] then @@ -134,8 +133,8 @@ else fi ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_PASSWORD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__KEY__" --replace_string="$(ynh_string_random)" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" @@ -149,10 +148,9 @@ else ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="true" --target_file="$final_path/custom/conf/app.ini" fi -ynh_replace_string --match_string="__ADMIN__" --replace_string="$admin" --target_file="$final_path/custom/conf/auth.d/ldap.conf" +ynh_add_config --template="../conf/ldap.conf" --destination="$final_path/custom/conf/auth.d/ldap.conf" ynh_store_file_checksum --file="$final_path/custom/conf/app.ini" -ynh_store_file_checksum --file="$final_path/custom/conf/auth.d/ldap.conf" # Configure init script ynh_add_systemd_config diff --git a/scripts/upgrade b/scripts/upgrade index d3d3b99..32c4383 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -77,10 +77,8 @@ ynh_app_setting_set --app=$app --key=final_path --value=$final_path ynh_setup_source --dest_dir=$final_path --source_id="$architecture" ynh_backup_if_checksum_is_different "$final_path/custom/conf/app.ini" -ynh_backup_if_checksum_is_different "$final_path/custom/conf/auth.d/ldap.conf" cp ../conf/app.ini "$final_path/custom/conf" -cp ../conf/ldap.conf "$final_path/custom/conf/auth.d/ldap.conf" if [ "$path_url" = "/" ] then @@ -90,8 +88,8 @@ else fi ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_PASSWORD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__KEY__" --replace_string="$(ynh_string_random)" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" @@ -105,10 +103,10 @@ else ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="true" --target_file="$final_path/custom/conf/app.ini" fi -ynh_replace_string --match_string="__ADMIN__" --replace_string="$admin" --target_file="$final_path/custom/conf/auth.d/ldap.conf" + +ynh_add_config --template="../conf/ldap.conf" --destination="$final_path/custom/conf/auth.d/ldap.conf" ynh_store_file_checksum "$final_path/custom/conf/app.ini" -ynh_store_file_checksum "$final_path/custom/conf/auth.d/ldap.conf" #================================================= # SETUP SYSTEMD From d81f42a5be2b35eef93658f8426993dd05308457 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 17 May 2021 09:45:06 +0200 Subject: [PATCH 056/131] Fix --- check_process | 8 ++++---- manifest.json | 2 +- scripts/_common.sh | 8 ++++---- scripts/install | 12 +++++++----- scripts/upgrade | 12 ++++++++++++ 5 files changed, 28 insertions(+), 14 deletions(-) diff --git a/check_process b/check_process index 67035eb..f10ca2f 100644 --- a/check_process +++ b/check_process @@ -1,9 +1,9 @@ ;; General ; Manifest - domain="domain.tld" (DOMAIN) - path="/path" (PATH) - admin="john" (USER) - is_public=1 (PUBLIC|public=1|private=0) + domain="domain.tld" + path="/path" + admin="john" + is_public=1 ; Checks pkg_linter=1 setup_sub_dir=1 diff --git a/manifest.json b/manifest.json index 8c75d13..db9ffaf 100644 --- a/manifest.json +++ b/manifest.json @@ -23,7 +23,7 @@ "mysql" ], "requirements": { - "yunohost": ">= 4.1.7" + "yunohost": ">= 4.2.4" }, "arguments": { "install" : [ diff --git a/scripts/_common.sh b/scripts/_common.sh index 624dae9..b04dd7b 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -45,8 +45,8 @@ config_gogs() { fi ynh_replace_string "__REPOS_PATH__" "$REPO_PATH" "$final_path/custom/conf/app.ini" - ynh_replace_string "__DB_PWD__" "$dbpass" "$final_path/custom/conf/app.ini" - ynh_replace_string "__DB_NAME__" "$dbuser" "$final_path/custom/conf/app.ini" + ynh_replace_string "__DB_PWD__" "$db_pwd" "$final_path/custom/conf/app.ini" + ynh_replace_string "__DB_NAME__" "$db_name" "$final_path/custom/conf/app.ini" ynh_replace_string "__DOMAIN__" "$domain" "$final_path/custom/conf/app.ini" ynh_replace_string "__KEY__" "$key" "$final_path/custom/conf/app.ini" ynh_replace_string "__DATA_PATH__" "$DATA_PATH" "$final_path/custom/conf/app.ini" @@ -75,9 +75,9 @@ set_permission() { } set_access_settings() { - if [ "$is_public" = '1' ] + if [ $is_public -eq 1 ] then - ynh_app_setting_set $app unprotected_uris "/" + ynh_permission_update --permission="main" --add="visitors" else # For an access to the git server by https in private mode we need to allow the access to theses URL : # - "DOMAIN/PATH/USER/REPOSITORY/info/refs" diff --git a/scripts/install b/scripts/install index 6cabfed..077d7fe 100644 --- a/scripts/install +++ b/scripts/install @@ -203,11 +203,13 @@ ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$ap #================================================= ynh_script_progression --message="Configuring SSOwat..." --weight=1 -# Make app public if necessary or protect it -if [ $is_public -eq 1 ] -then - ynh_permission_update --permission="main" --add="visitors" -fi +set_access_settings + +# # Make app public if necessary or protect it +# if [ $is_public -eq 1 ] +# then +# ynh_permission_update --permission="main" --add="visitors" +# fi #================================================= # RELOAD NGINX diff --git a/scripts/upgrade b/scripts/upgrade index 32c4383..75b7251 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -34,6 +34,18 @@ architecture=$(ynh_detect_arch) upgrade_type=$(ynh_check_app_version_changed) +#================================================= +# ENSURE DOWNWARD COMPATIBILITY +#================================================= +ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 + +# Cleaning legacy permissions +if ynh_legacy_permissions_exists; then + ynh_legacy_permissions_delete_all + + ynh_app_setting_delete --app=$app --key=is_public +fi + #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= From 1bc7799952f9565f0dfa91acf9aa139bd022dda1 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 25 Jun 2021 18:42:27 +0200 Subject: [PATCH 057/131] Fix --- check_process | 1 - scripts/install | 16 ++++++++-------- scripts/upgrade | 17 ++++++++--------- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/check_process b/check_process index f10ca2f..8466b7b 100644 --- a/check_process +++ b/check_process @@ -14,6 +14,5 @@ upgrade=1 backup_restore=1 multi_instance=1 - port_already_use=1 change_url=1 ;;; Upgrade options diff --git a/scripts/install b/scripts/install index 077d7fe..eaa8fef 100644 --- a/scripts/install +++ b/scripts/install @@ -132,14 +132,14 @@ else ynh_replace_string --match_string="__URL__" --replace_string="$domain${path_url%/}" --target_file="$final_path/custom/conf/app.ini" fi -ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__KEY__" --replace_string="$(ynh_string_random)" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__KEY__" --replace_string="$(ynh_string_random)" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" if [[ "$is_public" = '1' ]] then diff --git a/scripts/upgrade b/scripts/upgrade index 75b7251..d5566f3 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -99,14 +99,14 @@ else ynh_replace_string --match_string="__URL__" --replace_string="$domain${path_url%/}" --target_file="$final_path/custom/conf/app.ini" fi -ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__KEY__" --replace_string="$(ynh_string_random)" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__KEY__" --replace_string="$(ynh_string_random)" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" if [[ "$is_public" = '1' ]] then @@ -115,7 +115,6 @@ else ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="true" --target_file="$final_path/custom/conf/app.ini" fi - ynh_add_config --template="../conf/ldap.conf" --destination="$final_path/custom/conf/auth.d/ldap.conf" ynh_store_file_checksum "$final_path/custom/conf/app.ini" From 88d70db2dfca6469bedd2f697f8f8b4f26dc886b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 14 Aug 2021 23:09:55 +0200 Subject: [PATCH 058/131] fix --- scripts/install | 2 +- scripts/upgrade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index eaa8fef..3c4ffe7 100644 --- a/scripts/install +++ b/scripts/install @@ -57,7 +57,7 @@ ynh_app_setting_set --app=$app --key=path --value=$path_url #================================================= # FIND AND OPEN A PORT #================================================= -ynh_script_progression --message="Configuring firewall..." --weight=1 +ynh_script_progression --message="Finding an available port..." --weight=1 # Find an available port port=$(ynh_find_port --port=6000) diff --git a/scripts/upgrade b/scripts/upgrade index d5566f3..6f1aba4 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -74,7 +74,7 @@ ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app #================================================= # Clean template to fix issue : https://github.com/gogits/gogs/issues/4585 -ynh_secure_remove "/opt/$app/templates" +ynh_secure_remove --file="/opt/$app/templates" #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE From 4b2f7ab0dc4d66c541847dd8fcd1c4c7a6f46ab1 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 14 Aug 2021 23:15:18 +0200 Subject: [PATCH 059/131] Update install --- scripts/install | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index 3c4ffe7..c2d959d 100644 --- a/scripts/install +++ b/scripts/install @@ -91,6 +91,10 @@ ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir=$final_path --source_id="$architecture" +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + #================================================= # CREAT DIRECTORIES #================================================= @@ -169,10 +173,8 @@ ynh_add_nginx_config # SECURE FILES AND DIRECTORIES #================================================= -chown -R $app: "$final_path" chown -R $app: "/home/$app" chown -R $app: "/var/log/$app" -#chmod u=rwX,g=rX,o= "$final_path" chmod u=rwX,g=rX,o= "/home/$app" chmod u=rwX,g=rX,o= "/var/log/$app" From 61dd2fed3c9281d7b7704b1acce2e28e64e2c9d0 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 14 Aug 2021 23:17:26 +0200 Subject: [PATCH 060/131] Fix --- scripts/restore | 20 ++++++++++++-------- scripts/upgrade | 6 ++++-- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/scripts/restore b/scripts/restore index b699b72..ff9ef4a 100644 --- a/scripts/restore +++ b/scripts/restore @@ -53,6 +53,14 @@ ynh_script_progression --message="Restoring the NGINX configuration..." ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" +#================================================= +# RECREATE THE DEDICATED USER +#================================================= +ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 + +# Create the dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir="$final_path" + #================================================= # RESTORE THE APP MAIN DIR #================================================= @@ -60,13 +68,9 @@ ynh_script_progression --message="Restoring $app main directory..." --weight=10 ynh_restore_file --origin_path="$final_path" -#================================================= -# RECREATE THE DEDICATED USER -#================================================= -ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 - -# Create the dedicated user (if not existing) -ynh_system_user_create --username=$app +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" #================================================= # RESTORE THE MYSQL DATABASE @@ -97,7 +101,7 @@ yunohost service add $app --description="Lightweight Git forge" --log="/var/log/ #================================================= ynh_script_progression --message="Starting a systemd service..." --weight=3 -ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" --line_match="HTTP Server listening" +ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" #================================================= # RESTORE THE LOGROTATE CONFIGURATION diff --git a/scripts/upgrade b/scripts/upgrade index 6f1aba4..0f31634 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -88,6 +88,10 @@ ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir=$final_path --source_id="$architecture" +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + ynh_backup_if_checksum_is_different "$final_path/custom/conf/app.ini" cp ../conf/app.ini "$final_path/custom/conf" @@ -140,10 +144,8 @@ ynh_add_nginx_config #================================================= # Set permissions to app files -chown -R $app:$app "$final_path" chown -R $app:$app "/home/$app" chown -R $app:$app "/var/log/$app" -chmod u=rwX,g=rX,o= "$final_path" chmod u=rwX,g=rX,o= "/home/$app" chmod u=rwX,g=rX,o= "/var/log/$app" From 9f455f999a5a645f0fc4faa6f341df0ab228a29a Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 6 Nov 2021 19:10:24 +0100 Subject: [PATCH 061/131] Fix --- conf/app.ini | 2 +- manifest.json | 6 ++---- scripts/backup | 12 ++++++------ scripts/install | 38 ++++++++++++++++++-------------------- scripts/remove | 3 ++- scripts/restore | 15 +++++++-------- scripts/upgrade | 43 +++++++++++++++++++++++-------------------- 7 files changed, 59 insertions(+), 60 deletions(-) diff --git a/conf/app.ini b/conf/app.ini index 7e6a99a..70cac47 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -163,7 +163,7 @@ DSA = 1024 DB_TYPE = mysql HOST = 127.0.0.1:3306 NAME = __DB_NAME__ -USER = __DB_NAME__ +USER = __DB_USER__ PASSWD = __DB_PWD__ ; For "postgres" only, either "disable", "require" or "verify-full" SSL_MODE = disable diff --git a/manifest.json b/manifest.json index db9ffaf..5bebb5d 100644 --- a/manifest.json +++ b/manifest.json @@ -29,8 +29,7 @@ "install" : [ { "name": "domain", - "type": "domain", - "example": "domain.org" + "type": "domain" }, { "name": "path", @@ -40,8 +39,7 @@ }, { "name": "admin", - "type": "user", - "example": "johndoe" + "type": "user" }, { "name": "is_public", diff --git a/scripts/backup b/scripts/backup index b9bc0ec..24f4cef 100644 --- a/scripts/backup +++ b/scripts/backup @@ -46,6 +46,12 @@ ynh_backup --src_path="/home/$app" ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" +#================================================= +# BACKUP LOGROTATE +#================================================= + +ynh_backup --src_path="/etc/logrotate.d/$app" + #================================================= # BACKUP SYSTEMD #================================================= @@ -58,12 +64,6 @@ ynh_backup --src_path="/etc/systemd/system/$app.service" ynh_backup --src_path="/var/log/$app" -#================================================= -# BACKUP LOGROTATE -#================================================= - -ynh_backup --src_path="/etc/logrotate.d/$app" - #================================================= # BACKUP THE MYSQL DATABASE #================================================= diff --git a/scripts/install b/scripts/install index c2d959d..9058155 100644 --- a/scripts/install +++ b/scripts/install @@ -96,22 +96,27 @@ chmod -R o-rwx "$final_path" chown -R $app:www-data "$final_path" #================================================= -# CREAT DIRECTORIES +# CREATE DATA DIRECTORY #================================================= +ynh_script_progression --message="Creating a data directory..." --weight=1 -mkdir -p "/home/$app" +datadir=/home/yunohost.app/$app +ynh_app_setting_set --app=$app --key=datadir --value=$datadir -DATADIR="/home/$app" +mkdir -p $datadir + +chmod 750 "$datadir" +chmod -R o-rwx "$datadir" +chown -R $app:www-data "$datadir" REPO_PATH="/home/$app/repositories" -DATA_PATH="/home/$app/data" +DATA_PATH="/home/yunohost.app/$app/data" # create needed directories mkdir -p "$final_path/data" mkdir -p "$final_path/custom/conf/auth.d" -mkdir -p "/home/$app/data/avatars" -mkdir -p "/home/$app/data/attachments" -mkdir -p "/var/log/$app" +mkdir -p "/home/yunohost.app/$app/data/avatars" +mkdir -p "/home/yunohost.app/$app/data/attachments" #================================================= # STANDARD MODIFICATIONS @@ -138,7 +143,8 @@ fi ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__KEY__" --replace_string="$(ynh_string_random)" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" @@ -170,13 +176,12 @@ ynh_add_nginx_config #================================================= # GENERIC FINALIZATION #================================================= -# SECURE FILES AND DIRECTORIES +# SETUP LOGROTATE #================================================= +ynh_script_progression --message="Configuring log rotation..." --weight=1 -chown -R $app: "/home/$app" -chown -R $app: "/var/log/$app" -chmod u=rwX,g=rX,o= "/home/$app" -chmod u=rwX,g=rX,o= "/var/log/$app" +# Use logrotate to manage application logfile(s) +ynh_use_logrotate #================================================= # INTEGRATE SERVICE IN YUNOHOST @@ -185,13 +190,6 @@ ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 yunohost service add $app --description="Lightweight Git forge" --log="/var/log/$app/$app.log" -#================================================= -# SETUP LOGROTATE -#================================================= -ynh_script_progression --message="Configuring log rotation..." --weight=1 - -ynh_use_logrotate - #================================================= # START SYSTEMD SERVICE #================================================= diff --git a/scripts/remove b/scripts/remove index a0bbe42..d729e03 100644 --- a/scripts/remove +++ b/scripts/remove @@ -21,6 +21,7 @@ port=$(ynh_app_setting_get --app=$app --key=port) db_name=$(ynh_app_setting_get --app=$app --key=db_name) db_user=$db_name final_path=$(ynh_app_setting_get --app=$app --key=final_path) +datadir=$(ynh_app_setting_get --app=$app --key=datadir) #================================================= # STANDARD REMOVE @@ -63,7 +64,7 @@ ynh_secure_remove --file="$final_path" # REMOVE VARIOUS FILES #================================================= -ynh_secure_remove --file="/home/$app" +ynh_secure_remove --file="$datadir" ynh_secure_remove --file="/var/log/$app" diff --git a/scripts/restore b/scripts/restore index ff9ef4a..df3061c 100644 --- a/scripts/restore +++ b/scripts/restore @@ -39,8 +39,6 @@ admin=$(ynh_app_setting_get --app=$app --key=admin) #================================================= ynh_script_progression --message="Validating restoration parameters..." --weight=2 -ynh_webpath_available --domain=$domain --path_url=$path_url \ - || ynh_die --message="Path not available: ${domain}${path_url}" test ! -d $final_path \ || ynh_die --message="There is already a directory: $final_path " @@ -89,6 +87,13 @@ ynh_script_progression --message="Restoring the systemd configuration..." --weig ynh_restore_file --origin_path="/etc/systemd/system/$app.service" systemctl enable $app.service --quiet +#================================================= +# RESTORE THE LOGROTATE CONFIGURATION +#================================================= +ynh_script_progression --message="Restoring the logrotate configuration..." --weight=1 + +ynh_restore_file --origin_path="/etc/logrotate.d/$app" + #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= @@ -103,12 +108,6 @@ ynh_script_progression --message="Starting a systemd service..." --weight=3 ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" -#================================================= -# RESTORE THE LOGROTATE CONFIGURATION -#================================================= - -ynh_restore_file --origin_path="/etc/logrotate.d/$app" - #================================================= # GENERIC FINALIZATION #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 0f31634..b50a68a 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -27,6 +27,8 @@ db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) admin=$(ynh_app_setting_get --app=$app --key=admin) port=$(ynh_app_setting_get --app=$app --key=port) architecture=$(ynh_detect_arch) +datadir=$(ynh_app_setting_get --app=$app --key=datadir) + #================================================= # CHECK VERSION @@ -34,18 +36,6 @@ architecture=$(ynh_detect_arch) upgrade_type=$(ynh_check_app_version_changed) -#================================================= -# ENSURE DOWNWARD COMPATIBILITY -#================================================= -ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 - -# Cleaning legacy permissions -if ynh_legacy_permissions_exists; then - ynh_legacy_permissions_delete_all - - ynh_app_setting_delete --app=$app --key=is_public -fi - #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= @@ -60,6 +50,18 @@ ynh_clean_setup () { # Exit if an error occurs during the execution of the script ynh_abort_if_errors +#================================================= +# ENSURE DOWNWARD COMPATIBILITY +#================================================= +ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 + +# Cleaning legacy permissions +if ynh_legacy_permissions_exists; then + ynh_legacy_permissions_delete_all + + ynh_app_setting_delete --app=$app --key=is_public +fi + #================================================= # STANDARD UPGRADE STEPS #================================================= @@ -82,7 +84,7 @@ ynh_secure_remove --file="/opt/$app/templates" ynh_script_progression --message="Setting up source files..." --weight=3 REPO_PATH="/home/$app/repositories" -DATA_PATH="/home/$app/data" +DATA_PATH="$datadir/data" ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src @@ -105,7 +107,8 @@ fi ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__KEY__" --replace_string="$(ynh_string_random)" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" @@ -140,14 +143,14 @@ ynh_script_progression --message="Upgrading NGINX web server configuration..." - ynh_add_nginx_config #================================================= -# SECURE FILES AND DIRECTORIES +# GENERIC FINALIZATION #================================================= +# SETUP LOGROTATE +#================================================= +ynh_script_progression --message="Configuring log rotation..." --weight=1 -# Set permissions to app files -chown -R $app:$app "/home/$app" -chown -R $app:$app "/var/log/$app" -chmod u=rwX,g=rX,o= "/home/$app" -chmod u=rwX,g=rX,o= "/var/log/$app" +# Use logrotate to manage application logfile(s) +ynh_use_logrotate #================================================= # INTEGRATE SERVICE IN YUNOHOST From 4b97838bb9d577143605cc8b0c6149956ec856d4 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 6 Nov 2021 23:42:14 +0100 Subject: [PATCH 062/131] Fix --- manifest.json | 2 +- scripts/install | 20 ++++++++------------ 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/manifest.json b/manifest.json index 5bebb5d..e951f15 100644 --- a/manifest.json +++ b/manifest.json @@ -23,7 +23,7 @@ "mysql" ], "requirements": { - "yunohost": ">= 4.2.4" + "yunohost": ">= 4.2.8" }, "arguments": { "install" : [ diff --git a/scripts/install b/scripts/install index 9058155..d98a247 100644 --- a/scripts/install +++ b/scripts/install @@ -13,9 +13,6 @@ source /usr/share/yunohost/helpers # MANAGE SCRIPT FAILURE #================================================= -ynh_clean_setup () { - ynh_clean_check_starting -} # Exit if an error occurs during the execution of the script ynh_abort_if_errors @@ -49,7 +46,7 @@ ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url 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=adminusername --value=$admin +ynh_app_setting_set --app=$app --key=admin --value=$admin ynh_app_setting_set --app=$app --key=path --value=$path_url #================================================= @@ -72,7 +69,6 @@ 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_mysql_setup_db --db_user=$db_user --db_name=$db_name -db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) #================================================= # CREATE DEDICATED USER @@ -109,7 +105,7 @@ chmod 750 "$datadir" chmod -R o-rwx "$datadir" chown -R $app:www-data "$datadir" -REPO_PATH="/home/$app/repositories" +REPO_PATH="/home/yunohost.app/$app/repositories" DATA_PATH="/home/yunohost.app/$app/data" # create needed directories @@ -203,13 +199,13 @@ ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$ap #================================================= ynh_script_progression --message="Configuring SSOwat..." --weight=1 -set_access_settings +#set_access_settings -# # Make app public if necessary or protect it -# if [ $is_public -eq 1 ] -# then -# ynh_permission_update --permission="main" --add="visitors" -# fi +# Make app public if necessary or protect it +if [ $is_public -eq 1 ] +then + ynh_permission_update --permission="main" --add="visitors" +fi #================================================= # RELOAD NGINX From 96154e08ba3f339cc62d85ac7ebf73747f46b839 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 6 Nov 2021 23:44:53 +0100 Subject: [PATCH 063/131] Fix --- scripts/restore | 4 ---- scripts/upgrade | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/scripts/restore b/scripts/restore index df3061c..05b4726 100644 --- a/scripts/restore +++ b/scripts/restore @@ -13,9 +13,6 @@ source /usr/share/yunohost/helpers # MANAGE SCRIPT FAILURE #================================================= -ynh_clean_setup () { - ynh_clean_check_starting -} # Exit if an error occurs during the execution of the script ynh_abort_if_errors @@ -31,7 +28,6 @@ path_url=$(ynh_app_setting_get --app=$app --key=path) final_path=$(ynh_app_setting_get --app=$app --key=final_path) db_name=$(ynh_app_setting_get --app=$app --key=db_name) db_user=$db_name -db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) admin=$(ynh_app_setting_get --app=$app --key=admin) #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index b50a68a..f226a6f 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -83,7 +83,7 @@ ynh_secure_remove --file="/opt/$app/templates" #================================================= ynh_script_progression --message="Setting up source files..." --weight=3 -REPO_PATH="/home/$app/repositories" +REPO_PATH="$datadir/repositories" DATA_PATH="$datadir/data" ynh_app_setting_set --app=$app --key=final_path --value=$final_path From 89b0788b7ba42c3fd30a2aa97ca7834b72d06640 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 6 Nov 2021 23:50:58 +0100 Subject: [PATCH 064/131] Update systemd.service --- conf/systemd.service | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/conf/systemd.service b/conf/systemd.service index cae79f0..81f88b7 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -3,18 +3,46 @@ Description=Gogs (Go Git Service) After=syslog.target network.target mysql.service slapd.service [Service] -# Modify these two values and uncomment them if you have repos -# with lots of files and get an HTTP error 500 because of that -### -#LimitMEMLOCK=infinity -#LimitNOFILE=65535 Type=simple User=__APP__ Group=__APP__ -WorkingDirectory=/home/__APP__ +WorkingDirectory=/home/yunohost.app/__APP__ ExecStart=__FINALPATH__/gogs web Restart=always -Environment=USER=__APP__ HOME=/home/__APP__ +Environment=USER=__APP__ HOME=/home/yunohost.app/__APP__ + +[Install] +WantedBy=multi-user.target + +# Sandboxing options to harden security +# Depending on specificities of your service/app, you may need to tweak these +# .. but this should be a good baseline +# Details for these options: https://www.freedesktop.org/software/systemd/man/systemd.exec.html +NoNewPrivileges=yes +PrivateTmp=yes +PrivateDevices=yes +RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 +RestrictNamespaces=yes +RestrictRealtime=yes +DevicePolicy=closed +ProtectSystem=full +ProtectControlGroups=yes +ProtectKernelModules=yes +ProtectKernelTunables=yes +LockPersonality=yes +SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap + +# Denying access to capabilities that should not be relevant for webapps +# Doc: https://man7.org/linux/man-pages/man7/capabilities.7.html +CapabilityBoundingSet=~CAP_RAWIO CAP_MKNOD +CapabilityBoundingSet=~CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE +CapabilityBoundingSet=~CAP_SYS_BOOT CAP_SYS_TIME CAP_SYS_MODULE CAP_SYS_PACCT +CapabilityBoundingSet=~CAP_LEASE CAP_LINUX_IMMUTABLE CAP_IPC_LOCK +CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_WAKE_ALARM +CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG +CapabilityBoundingSet=~CAP_MAC_ADMIN CAP_MAC_OVERRIDE +CapabilityBoundingSet=~CAP_NET_ADMIN CAP_NET_BROADCAST CAP_NET_RAW +CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SYSLOG [Install] WantedBy=multi-user.target From ff5ac5421c9c90fde93bf69433e8063fca7ac3bb Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 6 Nov 2021 23:52:38 +0100 Subject: [PATCH 065/131] Update nginx.conf --- conf/nginx.conf | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 5c003bb..f443e57 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -9,16 +9,10 @@ location __PATH__/ { proxy_pass http://127.0.0.1:__PORT__/; proxy_set_header Host $host; proxy_buffering off; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + fastcgi_param REMOTE_USER $remote_user; + client_max_body_size 200M; proxy_set_header X-Forwarded-Proto $scheme; - #wrewrite ^__PATH__/gogs/(.*) /$1 break; - #rewrite ^__PATH__/gogs$ /$1 break; - - #proxy_read_timeout 90; - client_max_body_size 200M; - # Include SSOWAT user panel. include conf.d/yunohost_panel.conf.inc; } From 55f899af0f18ae83a6a2e03ce8b81f36c8d2b7b7 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 6 Nov 2021 23:53:43 +0100 Subject: [PATCH 066/131] Update check_process --- check_process | 3 +++ 1 file changed, 3 insertions(+) diff --git a/check_process b/check_process index 8466b7b..e8e753c 100644 --- a/check_process +++ b/check_process @@ -12,7 +12,10 @@ setup_private=1 setup_public=1 upgrade=1 + #upgrade=1 from_commit=3 backup_restore=1 multi_instance=1 change_url=1 ;;; Upgrade options + ; commit=349992d4f3921e4e1adb37a0cace4a5a9eb67099 + name=First package version From 9e368ac107abba39edf91d028135e1679fe2ac74 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 7 Nov 2021 08:47:53 +0100 Subject: [PATCH 067/131] Update install --- scripts/install | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/install b/scripts/install index d98a247..4f85511 100644 --- a/scripts/install +++ b/scripts/install @@ -114,6 +114,7 @@ mkdir -p "$final_path/custom/conf/auth.d" mkdir -p "/home/yunohost.app/$app/data/avatars" mkdir -p "/home/yunohost.app/$app/data/attachments" + #================================================= # STANDARD MODIFICATIONS #================================================= @@ -179,6 +180,9 @@ ynh_script_progression --message="Configuring log rotation..." --weight=1 # Use logrotate to manage application logfile(s) ynh_use_logrotate +chown -R $app:$app "/var/log/$app" +chmod u=rwX,g=rX,o= "/var/log/$app" + #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= From f032c3ef67f466877e0b61b7966c2b9a2797858a Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 7 Nov 2021 08:58:19 +0100 Subject: [PATCH 068/131] fix --- scripts/restore | 3 +++ scripts/upgrade | 3 +++ 2 files changed, 6 insertions(+) diff --git a/scripts/restore b/scripts/restore index 05b4726..4693d7c 100644 --- a/scripts/restore +++ b/scripts/restore @@ -90,6 +90,9 @@ ynh_script_progression --message="Restoring the logrotate configuration..." --we ynh_restore_file --origin_path="/etc/logrotate.d/$app" +chown -R $app:$app "/var/log/$app" +chmod u=rwX,g=rX,o= "/var/log/$app" + #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index f226a6f..6d0adca 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -152,6 +152,9 @@ ynh_script_progression --message="Configuring log rotation..." --weight=1 # Use logrotate to manage application logfile(s) ynh_use_logrotate +chown -R $app:$app "/var/log/$app" +chmod u=rwX,g=rX,o= "/var/log/$app" + #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= From 2cab12d1613772621429d425b255df9dfccd5082 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 7 Nov 2021 09:17:22 +0100 Subject: [PATCH 069/131] Fix --- scripts/backup | 8 ++++++-- scripts/restore | 14 ++++++++++++++ scripts/upgrade | 1 - 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/scripts/backup b/scripts/backup index 24f4cef..dc499f5 100644 --- a/scripts/backup +++ b/scripts/backup @@ -25,6 +25,7 @@ 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) +datadir=$(ynh_app_setting_get --app=$app --key=datadir) #================================================= # DECLARE DATA AND CONF FILES TO BACKUP @@ -37,8 +38,11 @@ ynh_print_info --message="Declaring files to be backed up..." ynh_backup --src_path="$final_path" -# Copy the data files -ynh_backup --src_path="/home/$app" +#================================================= +# BACKUP THE DATA DIR +#================================================= + +ynh_backup --src_path="$datadir" --is_big #================================================= # BACKUP THE NGINX CONFIGURATION diff --git a/scripts/restore b/scripts/restore index 4693d7c..bee368f 100644 --- a/scripts/restore +++ b/scripts/restore @@ -29,6 +29,7 @@ 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 admin=$(ynh_app_setting_get --app=$app --key=admin) +datadir=$(ynh_app_setting_get --app=$app --key=datadir) #================================================= # CHECK IF THE APP CAN BE RESTORED @@ -66,6 +67,19 @@ chmod 750 "$final_path" chmod -R o-rwx "$final_path" chown -R $app:www-data "$final_path" +#================================================= +# RESTORE THE DATA DIRECTORY +#================================================= +ynh_script_progression --message="Restoring the data directory..." --weight=1 + +ynh_restore_file --origin_path="$datadir" --not_mandatory + +mkdir -p $datadir + +chmod 750 "$datadir" +chmod -R o-rwx "$datadir" +chown -R $app:www-data "$datadir" + #================================================= # RESTORE THE MYSQL DATABASE #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 6d0adca..b54a3ed 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -29,7 +29,6 @@ port=$(ynh_app_setting_get --app=$app --key=port) architecture=$(ynh_detect_arch) datadir=$(ynh_app_setting_get --app=$app --key=datadir) - #================================================= # CHECK VERSION #================================================= From 09f4e5819d3d403bea0a17e50264e0ce8aeeb4cc Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 7 Nov 2021 10:32:50 +0100 Subject: [PATCH 070/131] Fix --- check_process | 6 +++--- conf/systemd.service | 2 +- doc/DESCRIPTION.md | 0 doc/DISCLAIMER.md | 0 manifest.json | 7 +++++++ scripts/install | 15 +-------------- 6 files changed, 12 insertions(+), 18 deletions(-) create mode 100644 doc/DESCRIPTION.md create mode 100644 doc/DISCLAIMER.md diff --git a/check_process b/check_process index e8e753c..375685c 100644 --- a/check_process +++ b/check_process @@ -12,10 +12,10 @@ setup_private=1 setup_public=1 upgrade=1 - #upgrade=1 from_commit=3 + #upgrade=1 from_commit= backup_restore=1 multi_instance=1 change_url=1 ;;; Upgrade options - ; commit=349992d4f3921e4e1adb37a0cace4a5a9eb67099 - name=First package version + ; commit= + name= diff --git a/conf/systemd.service b/conf/systemd.service index 81f88b7..ea676ee 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -1,6 +1,6 @@ [Unit] Description=Gogs (Go Git Service) -After=syslog.target network.target mysql.service slapd.service +After=syslog.target network.target mysql.service slapd.service redis.service [Service] Type=simple diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md new file mode 100644 index 0000000..e69de29 diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md new file mode 100644 index 0000000..e69de29 diff --git a/manifest.json b/manifest.json index e951f15..3345c93 100644 --- a/manifest.json +++ b/manifest.json @@ -8,6 +8,13 @@ }, "version": "0.12.3~ynh1", "url": "http://gogs.io", + "upstream": { + "license": "MIT", + "website": "http://gogs.io", + "demo": "https://try.gogs.io/user/login", + "admindoc": "https://gogs.io/docs", + "code": "https://github.com/gogs/gogs" + }, "license": "MIT", "maintainer": { "name": "", diff --git a/scripts/install b/scripts/install index 4f85511..d5a4ad4 100644 --- a/scripts/install +++ b/scripts/install @@ -114,17 +114,6 @@ mkdir -p "$final_path/custom/conf/auth.d" mkdir -p "/home/yunohost.app/$app/data/avatars" mkdir -p "/home/yunohost.app/$app/data/attachments" - -#================================================= -# STANDARD MODIFICATIONS -#================================================= - -# # Add users -# # We can't use the official helper because we need to set the shell for the login -# test getent passwd "$app" &>/dev/null || \ -# useradd -d "/home/$app" --system --user-group "$app" --shell /bin/bash || \ -# ynh_die "Unable to create $app system account" - #================================================= # MODIFY A CONFIG FILE #================================================= @@ -201,9 +190,7 @@ ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$ap #================================================= # SETUP SSOWAT #================================================= -ynh_script_progression --message="Configuring SSOwat..." --weight=1 - -#set_access_settings +ynh_script_progression --message="Configuring permissions..." --weight=1 # Make app public if necessary or protect it if [ $is_public -eq 1 ] From 264726f099d1570de1048d4a474e4d6e738ec58c Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sun, 7 Nov 2021 09:32:58 +0000 Subject: [PATCH 071/131] Auto-update README --- README.md | 82 +++++++++++++--------------------------------------- README_fr.md | 39 +++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 62 deletions(-) create mode 100644 README_fr.md diff --git a/README.md b/README.md index da5a6b6..1271cf1 100644 --- a/README.md +++ b/README.md @@ -1,77 +1,33 @@ + + # Gogs for YunoHost [![Integration level](https://dash.yunohost.org/integration/gogs.svg)](https://dash.yunohost.org/appci/app/gogs) ![](https://ci-apps.yunohost.org/ci/badges/gogs.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/gogs.maintain.svg) -[![Install Gogs with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=gogs) +[![Install Gogs with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=gogs) -> *This package allows you to install Gogs quickly and simply on a YunoHost server. +*[Lire ce readme en français.](./README_fr.md)* + +> *This package allows you to install Gogs quickly and simply on a YunoHost server. If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* -> :warning: **Note that this package will not be longer be maintened by the actual maintener. -> The idea is to migrate to [gitea](https://github.com/YunoHost-Apps/gitea_ynh) which is more featured.** - ## Overview -Gogs is a self-hosted Git service written in Go. Alternative to Github. -**Shipped version:** 0.11.66 +Lightweight Git forge -## Screenshots +**Shipped version:** 0.12.3~ynh1 -![](https://gogs.io/img/screenshots/2.png) +**Demo:** https://try.gogs.io/user/login +## Documentation and resources -## Demo - -* [Official demo](https://try.gogs.io/user/login) - -For the old install you can migrate to gitea easly by juste upgrading your actuall gogs instance with the gitea source by this command: -``` -sudo yunohost app upgrade -u https://github.com/YunoHost-Apps/gitea_ynh gogs -``` -**Note that this command contains some risk of data lost. So it's important to make a backup of the app before the install.** -To make a backup you can use this command: -``` -sudo yunohost backup create --debug --apps gogs -``` - -For the new install just install gitea by this command: -``` -sudo yunohost app install -l Gitea https://github.com/YunoHost-Apps/gitea_ynh -``` - -## Notes on SSH usage -If you want to use Gogs with ssh and be able to pull/push with you ssh key, your SSH daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: - -```bash -PubkeyAuthentication yes -AuthorizedKeysFile %h/.ssh/authorized_keys -ChallengeResponseAuthentication no -PasswordAuthentication no -UsePAM no -``` - -You also need to add your public key to your Gogs profile. - -If you use SSH on another port than 22, you need to add theses lines to your SSH config in `~/.ssh/config`: - -```bash -Host domain.tld - port 2222 # change this with the port you use -``` - -Architecture: this package is compatible with amd64, i386 and arm. The package will try to detect it with the command uname -m and fail if it can't detect the architecture. If that happens please open an issue describing your hardware and the result of the command `uname -m`. - -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/gogs%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/gogs/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/gogs%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/gogs/) - - -## Links - - * Report a bug: https://github.com/YunoHost-Apps/gogs_ynh/issues - * App website: http://gogs.io - * Upstream app repository: https://github.com/gogs/gogs - * YunoHost website: https://yunohost.org/ - ---- +* Official app website: http://gogs.io +* Official admin documentation: https://gogs.io/docs +* Upstream app code repository: https://github.com/gogs/gogs +* YunoHost documentation for this app: https://yunohost.org/app_gogs +* Report a bug: https://github.com/YunoHost-Apps/gogs_ynh/issues ## Developer info @@ -83,3 +39,5 @@ sudo yunohost app install https://github.com/YunoHost-Apps/gogs_ynh/tree/testing or sudo yunohost app upgrade gogs -u https://github.com/YunoHost-Apps/gogs_ynh/tree/testing --debug ``` + +**More info regarding app packaging:** https://yunohost.org/packaging_apps \ No newline at end of file diff --git a/README_fr.md b/README_fr.md new file mode 100644 index 0000000..45a4359 --- /dev/null +++ b/README_fr.md @@ -0,0 +1,39 @@ +# Gogs pour YunoHost + +[![Niveau d'intégration](https://dash.yunohost.org/integration/gogs.svg)](https://dash.yunohost.org/appci/app/gogs) ![](https://ci-apps.yunohost.org/ci/badges/gogs.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/gogs.maintain.svg) +[![Installer Gogs avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=gogs) + +*[Read this readme in english.](./README.md)* +*[Lire ce readme en français.](./README_fr.md)* + +> *Ce package vous permet d'installer Gogs rapidement et simplement sur un serveur YunoHost. +Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour savoir comment l'installer et en profiter.* + +## Vue d'ensemble + +Forge Git légère + +**Version incluse :** 0.12.3~ynh1 + +**Démo :** https://try.gogs.io/user/login + +## Documentations et ressources + +* Site officiel de l'app : http://gogs.io +* Documentation officielle de l'admin : https://gogs.io/docs +* Dépôt de code officiel de l'app : https://github.com/gogs/gogs +* Documentation YunoHost pour cette app : https://yunohost.org/app_gogs +* Signaler un bug : https://github.com/YunoHost-Apps/gogs_ynh/issues + +## Informations pour les développeurs + +Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/gogs_ynh/tree/testing). + +Pour essayer la branche testing, procédez comme suit. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/gogs_ynh/tree/testing --debug +ou +sudo yunohost app upgrade gogs -u https://github.com/YunoHost-Apps/gogs_ynh/tree/testing --debug +``` + +**Plus d'infos sur le packaging d'applications :** https://yunohost.org/packaging_apps \ No newline at end of file From 31a7d2db2d574e90d4f8ee4de74a15a6b3f583f6 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 7 Nov 2021 10:33:42 +0100 Subject: [PATCH 072/131] Update restore --- scripts/restore | 3 --- 1 file changed, 3 deletions(-) diff --git a/scripts/restore b/scripts/restore index bee368f..e96e040 100644 --- a/scripts/restore +++ b/scripts/restore @@ -104,9 +104,6 @@ ynh_script_progression --message="Restoring the logrotate configuration..." --we ynh_restore_file --origin_path="/etc/logrotate.d/$app" -chown -R $app:$app "/var/log/$app" -chmod u=rwX,g=rX,o= "/var/log/$app" - #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= From 16fe33fca527b8dacd3b19b5e3c43b0435319827 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 7 Nov 2021 10:34:33 +0100 Subject: [PATCH 073/131] Update restore --- scripts/restore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/restore b/scripts/restore index e96e040..561b280 100644 --- a/scripts/restore +++ b/scripts/restore @@ -104,6 +104,10 @@ ynh_script_progression --message="Restoring the logrotate configuration..." --we ynh_restore_file --origin_path="/etc/logrotate.d/$app" +ynh_restore_file --origin_path="/var/log/$app" +chown -R $app:$app "/var/log/$app" +chmod u=rwX,g=rX,o= "/var/log/$app" + #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= From c528ef72758a7957bcd4a24c72e5f41777d4b11e Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 7 Nov 2021 10:35:21 +0100 Subject: [PATCH 074/131] Fix --- scripts/change_url | 2 +- scripts/install | 2 +- scripts/upgrade | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index e8c9218..9bcf390 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -145,7 +145,7 @@ ynh_store_file_checksum --file="$final_path/custom/conf/app.ini" #================================================= ynh_script_progression --message="Starting a systemd service..." --weight=2 -ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" +ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" #================================================= # RELOAD NGINX diff --git a/scripts/install b/scripts/install index d5a4ad4..cb8ceca 100644 --- a/scripts/install +++ b/scripts/install @@ -185,7 +185,7 @@ yunohost service add $app --description="Lightweight Git forge" --log="/var/log/ ynh_script_progression --message="Starting a systemd service..." --weight=3 # Start a systemd service -ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" +ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" #================================================= # SETUP SSOWAT diff --git a/scripts/upgrade b/scripts/upgrade index b54a3ed..19d38f2 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -167,7 +167,7 @@ yunohost service add $app --description="Lightweight Git forge" --log="/var/log/ ynh_script_progression --message="Starting a systemd service..." --weight=1 # Start a systemd service -ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" +ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" #================================================= # RELOAD NGINX From ef0d79ad8abe178b1cabcac8f5e199fbd70f3a18 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 7 Nov 2021 12:30:23 +0100 Subject: [PATCH 075/131] Fix --- conf/app.ini | 360 ++++----------------------------------------- scripts/change_url | 25 ++-- scripts/install | 4 +- scripts/upgrade | 52 +++---- 4 files changed, 69 insertions(+), 372 deletions(-) diff --git a/conf/app.ini b/conf/app.ini index 70cac47..e419893 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -1,353 +1,75 @@ -; App name that shows on every page title -APP_NAME = Gogs: Go Git Service -; The name of the system user that runs Gogs +;https://github.com/gogits/gogs/blob/master/conf/app.ini +APP_NAME = Gogs RUN_USER = __APP__ -; Either "dev", "prod" or "test" RUN_MODE = prod [server] -PROTOCOL = http DOMAIN = __DOMAIN__ -ROOT_URL = https://__URL__/ -HTTP_ADDR = 0.0.0.0 HTTP_PORT = __PORT__ -; Permission for unix socket -UNIX_SOCKET_PERMISSION = 666 -; Local (DMZ) URL for Gogs workers (such as SSH update) accessing web service. -; In most cases you do not need to change the default value. -; Alter it only if your SSH server node is not the same as HTTP node. -LOCAL_ROOT_URL = %(PROTOCOL)s://%(HTTP_ADDR)s:%(HTTP_PORT)s/ -; Disable SSH feature when not available -DISABLE_SSH = false -; Whether use builtin SSH server or not. -START_SSH_SERVER = false -; Domain name to be exposed in SSH clone URL -SSH_DOMAIN = %(DOMAIN)s -; Port number to be exposed in SSH clone URL -SSH_PORT = 22 -; Network interface builtin SSH server listens on -SSH_LISTEN_HOST = 0.0.0.0 -; Port number builtin SSH server listens on -SSH_LISTEN_PORT = %(SSH_PORT)s -; Root path of SSH directory, default is '~/.ssh', but you have to use '/home/git/.ssh'. -SSH_ROOT_PATH = -; Indicate whether to rewrite authorized_keys at start, ignored when use builtin SSH server -REWRITE_AUTHORIZED_KEYS_AT_START = false -; Choose the ciphers to support for SSH connections -SSH_SERVER_CIPHERS = aes128-ctr, aes192-ctr, aes256-ctr, aes128-gcm@openssh.com, arcfour256, arcfour128 -; Directory to create temporary files when test publick key using ssh-keygen, -; default is system temporary directory. -SSH_KEY_TEST_PATH = -; Path to ssh-keygen, default is 'ssh-keygen' and let shell find out which one to call. -SSH_KEYGEN_PATH = ssh-keygen -; Indicate whether to check minimum key size with corresponding type -MINIMUM_KEY_SIZE_CHECK = false -; Disable CDN even in "prod" mode +ROOT_URL = https://__URL__/ +HTTP_ADDR = 127.0.0.1 OFFLINE_MODE = false -DISABLE_ROUTER_LOG = false -; Generate steps: -; $ ./gogs cert -ca=true -duration=8760h0m0s -host=myhost.example.com -; -; Or from a .pfx file exported from the Windows certificate store (do -; not forget to export the private key): -; $ openssl pkcs12 -in cert.pfx -out cert.pem -nokeys -; $ openssl pkcs12 -in cert.pfx -out key.pem -nocerts -nodes -CERT_FILE = custom/https/cert.pem -KEY_FILE = custom/https/key.pem -; Allowed TLS version values: SSL30, TLS10, TLS11, TLS12 -TLS_MIN_VERSION = TLS10 - -; Upper level of template and static file path -; default is the path where Gogs is executed -STATIC_ROOT_PATH = -; Default path for App data +DISABLE_SSH = false +SSH_PORT = 22 APP_DATA_PATH = __DATA_PATH__ -; Application level GZIP support -ENABLE_GZIP = false -; Landing page for non-logged users, can be "home" or "explore" LANDING_PAGE = explore [repository] -; Root path for storing repositories's data, default is "~//gogs-repositories" ROOT = __REPOS_PATH__ -; The script type server supports, sometimes could be "sh" -SCRIPT_TYPE = bash -; Default ANSI charset for an unrecognized charset -ANSI_CHARSET = -; Force every new repository to be private FORCE_PRIVATE = false -; Global maximum creation limit of repository per user, -1 means no limit -MAX_CREATION_LIMIT = -1 -; Mirror sync queue length, increase if mirror syncing starts hanging -MIRROR_QUEUE_LENGTH = 1000 -; Patch test queue length, increase if pull request patch testing starts hanging -PULL_REQUEST_QUEUE_LENGTH = 1000 -; Preferred Licenses to place at the top of the list -; Name must match file name in conf/license or custom/conf/license -PREFERRED_LICENSES = Apache License 2.0,MIT License -; Disable ability to interact with repositories by HTTP protocol -DISABLE_HTTP_GIT = false -; Enable ability to migrate repository by local path -ENABLE_LOCAL_PATH_MIGRATION = false -; Concurrency is used to retrieve commits information. This variable define -; the maximum number of tasks that can be run at the same time. Usually, the -; value depend of how many CPUs (cores) you have. If the value is set to zero -; or under, GOGS will automatically detect the number of CPUs your system have -COMMITS_FETCH_CONCURRENCY = 0 -; Enable render mode for raw file -ENABLE_RAW_FILE_RENDER_MODE = false - -[repository.editor] -; List of file extensions that should have line wraps in the CodeMirror editor. -; Separate extensions with a comma. To line wrap files without extension, just put a comma -LINE_WRAP_EXTENSIONS = .txt,.md,.markdown,.mdown,.mkd, -; Valid file modes that have a preview API associated with them, such as api/v1/markdown. -; Separate values by commas. Preview tab in edit mode won't show if the file extension doesn't match -PREVIEWABLE_FILE_MODES = markdown - -[repository.upload] -; Enable repository file uploads. -ENABLED = true -; Path to temporarily store uploads (default path gets cleaned by Gogs in every start) -TEMP_PATH = data/tmp/uploads -; File types that are allowed to be uploaded, e.g. image/jpeg|image/png. Leave empty means allow any file type -ALLOWED_TYPES = -; Maximum size of each file in MB -FILE_MAX_SIZE = 3 -; Maximum number of files per upload -MAX_FILES = 5 - -; Attachment settings for releases -[release.attachment] -; Whether attachments are enabled. Defaults to `true` -ENABLED = true -; Path for attachments. Defaults to `data/attachments` -PATH = data/attachments -; One or more allowed types, e.g. image/jpeg|image/png -ALLOWED_TYPES = */* -; Max size of each file. Defaults to 32MB -MAX_SIZE = 32 -; Max number of files per upload. Defaults to 10 -MAX_FILES = 10 - -[markdown] -; Enable hard line break extension -ENABLE_HARD_LINE_BREAK = false -; List of custom URL-Schemes that are allowed as links when rendering Markdown -; for example git,magnet -CUSTOM_URL_SCHEMES = -; List of file extensions that should be rendered/edited as Markdown -; Separate extensions with a comma. To render files w/o extension as markdown, just put a comma -FILE_EXTENSIONS = .md,.markdown,.mdown,.mkd - -[smartypants] -ENABLED = false -FRACTIONS = true -DASHES = true -LATEX_DASHES = true -ANGLED_QUOTES = true - -[http] -; Value for Access-Control-Allow-Origin header, default is not to present -ACCESS_CONTROL_ALLOW_ORIGIN = - -; Define allowed algorithms and their minimum key length (use -1 to disable a type) -[ssh.minimum_key_sizes] -ED25519 = 256 -ECDSA = 256 -RSA = 2048 -DSA = 1024 [database] -; Either "mysql", "postgres" or "sqlite3", you can connect to TiDB with MySQL protocol DB_TYPE = mysql HOST = 127.0.0.1:3306 NAME = __DB_NAME__ USER = __DB_USER__ PASSWD = __DB_PWD__ -; For "postgres" only, either "disable", "require" or "verify-full" SSL_MODE = disable -; For "sqlite3" and "tidb", use absolute path when you start as service PATH = data/gogs.db -[admin] -; Disable regular (non-admin) users to create organizations -DISABLE_REGULAR_ORG_CREATION = false - [security] INSTALL_LOCK = true -; !!CHANGE THIS TO KEEP YOUR USER DATA SAFE!! SECRET_KEY = __KEY__ -; Auto-login remember days -LOGIN_REMEMBER_DAYS = 7 -COOKIE_USERNAME = gogs_awesome -COOKIE_REMEMBER_NAME = gogs_incredible -COOKIE_SECURE = false -; Reverse proxy authentication header name of user name REVERSE_PROXY_AUTHENTICATION_USER = REMOTE_USER -; Enable to set cookie to indicate user login status -ENABLE_LOGIN_STATUS_COOKIE = false -LOGIN_STATUS_COOKIE_NAME = login_status [service] -ACTIVE_CODE_LIVE_MINUTES = 180 -RESET_PASSWD_CODE_LIVE_MINUTES = 180 -; User need to confirm e-mail for registration REGISTER_EMAIL_CONFIRM = false -; Does not allow register and admin create account only -DISABLE_REGISTRATION = true -; User must sign in to view anything. -REQUIRE_SIGNIN_VIEW = __PRIVATE_MODE__ -; Mail notification -ENABLE_NOTIFY_MAIL = true -; More detail: https://github.com/gogits/gogs/issues/165 -ENABLE_REVERSE_PROXY_AUTHENTICATION = true -ENABLE_REVERSE_PROXY_AUTO_REGISTERATION = true -; Enable captcha validation for registration -ENABLE_CAPTCHA = false - -[webhook] -; Types are enabled for users to use, can be "gogs", "slack", "discord", "dingtalk" -TYPES = gogs, slack, discord, dingtalk -; Hook task queue length, increase if webhook shooting starts hanging -QUEUE_LENGTH = 1000 -; Deliver timeout in seconds -DELIVER_TIMEOUT = 15 -; Allow insecure certification -SKIP_TLS_VERIFY = false -; Number of history information in each page -PAGING_NUM = 10 +ENABLE_NOTIFY_MAIL = true +DISABLE_REGISTRATION = true +ENABLE_CAPTCHA = false +REQUIRE_SIGNIN_VIEW = false +ENABLE_REVERSE_PROXY_AUTHENTICATION = false +ENABLE_REVERSE_PROXY_AUTO_REGISTERATION = false [mailer] ENABLED = true -; Buffer length of channel, keep it as it is if you don't know what it is. -SEND_BUFFER_LEN = 100 -; Prefix prepended to the subject line -SUBJECT_PREFIX = `[%(APP_NAME)s] ` -; Mail server -; Gmail: smtp.gmail.com:587 -; QQ: smtp.qq.com:465 -; Note, if the port ends with "465", SMTPS will be used. Using STARTTLS on port 587 is recommended per RFC 6409. If the server supports STARTTLS it will always be used. HOST = 127.0.0.1:25 -; Disable HELO operation when hostname are different. -DISABLE_HELO = -; Custom hostname for HELO operation, default is from system. -HELO_HOSTNAME = -; Do not verify the certificate of the server. Only use this for self-signed certificates +FROM = "Gitea" SKIP_VERIFY = true -; Use client certificate -USE_CERTIFICATE = false -CERT_FILE = custom/mailer/cert.pem -KEY_FILE = custom/mailer/key.pem -; Mail from address, RFC 5322. This can be just an email address, or the `"Name" ` format -FROM = "Gogs" -; Mailer user name and password -USER = -PASSWD = -; Use text/plain as format of content -USE_PLAIN_TEXT = false - -[cache] -; Either "memory", "redis", or "memcache", default is "memory" -ADAPTER = memory -; For "memory" only, GC interval in seconds, default is 60 -INTERVAL = 60 -; For "redis" and "memcache", connection host address -; redis: network=tcp,addr=:6379,password=macaron,db=0,pool_size=100,idle_timeout=180 -; memcache: `127.0.0.1:11211` -HOST = [session] -; Either "memory", "file", or "redis", default is "memory" PROVIDER = memory -; Provider config options -; memory: not have any config yet -; file: session file path, e.g. `data/sessions` -; redis: network=tcp,addr=:6379,password=macaron,db=0,pool_size=100,idle_timeout=180 -; mysql: go-sql-driver/mysql dsn config string, e.g. `root:password@/session_table` -PROVIDER_CONFIG = data/sessions -; Session cookie name -COOKIE_NAME = i_like_gogits -; If you use session in https only, default is false -COOKIE_SECURE = false -; Enable set cookie, default is true -ENABLE_SET_COOKIE = true -; Session GC time interval, default is 3600 -GC_INTERVAL_TIME = 3600 -; Session life time, default is 86400 -SESSION_LIFE_TIME = 86400 -; Cookie name for CSRF -CSRF_COOKIE_NAME = _csrf [picture] -; Path to store user uploaded avatars AVATAR_UPLOAD_PATH = __DATA_PATH__/avatars -; Chinese users can choose "duoshuo" -; or a custom avatar source, like: http://cn.gravatar.com/avatar/ -GRAVATAR_SOURCE = gravatar -; This value will be forced to be true in offline mode. -DISABLE_GRAVATAR = false -; Federated avatar lookup uses DNS to discover avatar associated -; with emails, see https://www.libravatar.org -; This value will be forced to be false in offline mode or Gravatar is disbaled. -ENABLE_FEDERATED_AVATAR = false -; Attachment settings for issues -[attachment] -; Whether attachments are enabled. Defaults to `true` -ENABLED = true -; Path for attachments. Defaults to `data/attachments` -PATH = __DATA_PATH__/attachments -; One or more allowed types, e.g. image/jpeg|image/png -ALLOWED_TYPES = image/jpeg|image/png -; Max size of each file. Defaults to 4MB -MAX_SIZE = 4 -; Max number of files per upload. Defaults to 5 -MAX_FILES = 5 - -[time] -; Specifies the format for fully outputed dates. Defaults to RFC1123 -; Special supported values are ANSIC, UnixDate, RubyDate, RFC822, RFC822Z, RFC850, RFC1123, RFC1123Z, RFC3339, RFC3339Nano, Kitchen, Stamp, StampMilli, StampMicro and StampNano -; For more information about the format see http://golang.org/pkg/time/#pkg-constants -FORMAT = - -; General settings of loggers [log] +MODE = file +LEVEL = Info ROOT_PATH = /var/log/__APP__ -; Can be "console" and "file", default is "console" -; Use comma to separate multiple modes, e.g. "console, file" -MODE = file -; Buffer length of channel, keep it as it is if you don't know what it is. -BUFFER_LEN = 100 -; Either "Trace", "Info", "Warn", "Error", "Fatal", default is "Trace" -LEVEL = Warn -; For "console" mode only -[log.console] -; leave empty to inherit -LEVEL = +REDIRECT_MACARON_LOG= true +MACARON = file -; For "file" mode only -[log.file] -; leave empty to inherit -LEVEL = -; This enables automated log rotate (switch of following options) -LOG_ROTATE = true -; Segment log daily -DAILY_ROTATE = true -; Max size shift of single file, default is 28 means 1 << 28, 256MB -MAX_SIZE_SHIFT = 28 -; Max line number of single file -MAX_LINES = 1000000 -; Expired days of log file (delete after max days) -MAX_DAYS = 7 +ROUTER_LOG_LEVEL = Warn +ROUTER = file + +ENABLE_ACCESS_LOG = Warn +ACCESS = file + +ENABLE_XORM_LOG = Warn +XORM = file -; For "slack" mode only -[log.slack] -; leave empty to inherit -LEVEL = -; Webhook URL -URL = [log.discord] ; leave empty to inherit @@ -357,26 +79,6 @@ URL = ; Username displayed in webhook USERNAME = %(APP_NAME)s -[log.xorm] -; Enable file rotation -ROTATE = true -; Rotate every day -ROTATE_DAILY = true -; Rotate once file size excesses x MB -MAX_SIZE = 100 -; Maximum days to keep logger files -MAX_DAYS = 3 - -[cron] -; Enable running cron tasks periodically. -ENABLED = true -; Run cron tasks when Gogs starts. -RUN_AT_START = false - -; Update mirrors -[cron.update_mirrors] -SCHEDULE = @every 10m - ; Repository health check [cron.repo_health_check] SCHEDULE = @every 24h @@ -385,18 +87,6 @@ TIMEOUT = 60s ; see more on http://git-scm.com/docs/git-fsck/1.7.5 ARGS = -; Check repository statistics -[cron.check_repo_stats] -RUN_AT_START = true -SCHEDULE = @every 24h - -; Cleanup repository archives -[cron.repo_archive_cleanup] -RUN_AT_START = false -SCHEDULE = @every 24h -; Time duration to check if archive should be cleaned -OLDER_THAN = 24h - [git] ; Disables highlight of added and removed changes DISABLE_DIFF_HIGHLIGHT = false diff --git a/scripts/change_url b/scripts/change_url index 9bcf390..7be71d8 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -30,6 +30,10 @@ ynh_script_progression --message="Loading installation settings..." --weight=1 final_path=$(ynh_app_setting_get --app=$app --key=final_path) port=$(ynh_app_setting_get --app=$app --key=port) admin=$(ynh_app_setting_get --app=$app --key=admin) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$db_name +db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) +key=$(ynh_app_setting_get --app=$app --key=key) #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP @@ -105,8 +109,8 @@ fi #================================================= # SPECIFIC MODIFICATIONS #================================================= -REPO_PATH="/home/$app/repositories" -DATA_PATH="/home/$app/data" +REPO_PATH="/home/yunohost.app/$app/repositories" +DATA_PATH="/home/yunohost.app/$app/data" cp ../conf/app.ini "$final_path/custom/conf" cp ../conf/ldap.conf "$final_path/custom/conf/auth.d/ldap.conf" @@ -118,14 +122,15 @@ else ynh_replace_string --match_string="__URL__" --replace_string="$new_domain${new_path%/}" --target_file="$final_path/custom/conf/app.ini" fi -ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_PASSWORD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$new_domain" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__KEY__" --replace_string="$(ynh_string_random)" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DOMAIN__" --replace_string="$new_domain" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__KEY__" --replace_string="$key" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" if [[ "$is_public" = '1' ]] then diff --git a/scripts/install b/scripts/install index cb8ceca..79bdc35 100644 --- a/scripts/install +++ b/scripts/install @@ -26,6 +26,7 @@ path_url=$YNH_APP_ARG_PATH admin=$YNH_APP_ARG_ADMIN is_public=$YNH_APP_ARG_IS_PUBLIC architecture=$(ynh_detect_arch) +key=$(ynh_string_random) app=$YNH_APP_INSTANCE_NAME @@ -48,6 +49,7 @@ 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=admin --value=$admin ynh_app_setting_set --app=$app --key=path --value=$path_url +ynh_app_setting_set --app=$app --key=secret_key --value=$key #================================================= # STANDARD MODIFICATIONS @@ -132,7 +134,7 @@ ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --targ ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__KEY__" --replace_string="$(ynh_string_random)" --target_file="$final_path/custom/conf/app.ini" +ynh_replace_string --match_string="__KEY__" --replace_string="$key" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" diff --git a/scripts/upgrade b/scripts/upgrade index 19d38f2..1e42611 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -87,43 +87,43 @@ DATA_PATH="$datadir/data" ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src -ynh_setup_source --dest_dir=$final_path --source_id="$architecture" +ynh_setup_source --dest_dir=$final_path --source_id="$architecture" --keep="$final_path/custom/conf/app.ini $final_path/custom/conf/auth.d/ldap.conf" chmod 750 "$final_path" chmod -R o-rwx "$final_path" chown -R $app:www-data "$final_path" -ynh_backup_if_checksum_is_different "$final_path/custom/conf/app.ini" +#ynh_backup_if_checksum_is_different "$final_path/custom/conf/app.ini" -cp ../conf/app.ini "$final_path/custom/conf" +# cp ../conf/app.ini "$final_path/custom/conf" -if [ "$path_url" = "/" ] -then - ynh_replace_string --match_string="__URL__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" -else - ynh_replace_string --match_string="__URL__" --replace_string="$domain${path_url%/}" --target_file="$final_path/custom/conf/app.ini" -fi +# if [ "$path_url" = "/" ] +# then +# ynh_replace_string --match_string="__URL__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" +# else +# ynh_replace_string --match_string="__URL__" --replace_string="$domain${path_url%/}" --target_file="$final_path/custom/conf/app.ini" +# fi -ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__KEY__" --replace_string="$(ynh_string_random)" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" +# ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" +# ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" +# ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/custom/conf/app.ini" +# ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" +# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" +# ynh_replace_string --match_string="__KEY__" --replace_string="$(ynh_string_random)" --target_file="$final_path/custom/conf/app.ini" +# ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" +# ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" +# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" -if [[ "$is_public" = '1' ]] -then - ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="false" --target_file="$final_path/custom/conf/app.ini" -else - ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="true" --target_file="$final_path/custom/conf/app.ini" -fi +# if [[ "$is_public" = '1' ]] +# then +# ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="false" --target_file="$final_path/custom/conf/app.ini" +# else +# ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="true" --target_file="$final_path/custom/conf/app.ini" +# fi -ynh_add_config --template="../conf/ldap.conf" --destination="$final_path/custom/conf/auth.d/ldap.conf" +#ynh_add_config --template="../conf/ldap.conf" --destination="$final_path/custom/conf/auth.d/ldap.conf" -ynh_store_file_checksum "$final_path/custom/conf/app.ini" +#ynh_store_file_checksum "$final_path/custom/conf/app.ini" #================================================= # SETUP SYSTEMD From 3f294ab7c8d34e00611c7d0ae53e547b3f331a35 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 7 Nov 2021 12:38:44 +0100 Subject: [PATCH 076/131] Update app.ini --- conf/app.ini | 111 --------------------------------------------------- 1 file changed, 111 deletions(-) diff --git a/conf/app.ini b/conf/app.ini index e419893..dc80699 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -71,118 +71,7 @@ ENABLE_XORM_LOG = Warn XORM = file -[log.discord] -; leave empty to inherit -LEVEL = -; Webhook URL -URL = -; Username displayed in webhook -USERNAME = %(APP_NAME)s -; Repository health check -[cron.repo_health_check] -SCHEDULE = @every 24h -TIMEOUT = 60s -; Arguments for command 'git fsck', e.g. "--unreachable --tags" -; see more on http://git-scm.com/docs/git-fsck/1.7.5 -ARGS = - -[git] -; Disables highlight of added and removed changes -DISABLE_DIFF_HIGHLIGHT = false -; Max number of lines allowed of a single file in diff view -MAX_GIT_DIFF_LINES = 1000 -; Max number of characters of a line allowed in diff view -MAX_GIT_DIFF_LINE_CHARACTERS = 500 -; Max number of files shown in diff view -MAX_GIT_DIFF_FILES = 100 -; Arguments for command 'git gc', e.g. "--aggressive --auto" -; see more on http://git-scm.com/docs/git-gc/1.7.5 -GC_ARGS = - -; Operation timeout in seconds -[git.timeout] -MIGRATE = 600 -MIRROR = 300 -CLONE = 300 -PULL = 300 -GC = 60 - -[mirror] -; Default interval in hours between each check -DEFAULT_INTERVAL = 8 - -[api] -; Max number of items will response in a page -MAX_RESPONSE_ITEMS = 50 - -[ui] -; Number of repositories that are showed in one explore page -EXPLORE_PAGING_NUM = 20 -; Number of issues that are showed in one page -ISSUE_PAGING_NUM = 10 -; Number of maximum commits showed in one activity feed -FEED_MAX_COMMIT_NUM = 5 -; Value of "theme-color" meta tag, used by Android >= 5.0 -; An invalid color like "none" or "disable" will have the default style -; More info: https://developers.google.com/web/updates/2014/11/Support-for-theme-color-in-Chrome-39-for-Android -THEME_COLOR_META_TAG = `#ff5343` -; Max size in bytes of files to be displayed (default is 8MB) -MAX_DISPLAY_FILE_SIZE = 8388608 - -[ui.admin] -; Number of users that are showed in one page -USER_PAGING_NUM = 50 -; Number of repos that are showed in one page -REPO_PAGING_NUM = 50 -; Number of notices that are showed in one page -NOTICE_PAGING_NUM = 25 -; Number of organization that are showed in one page -ORG_PAGING_NUM = 50 - -[ui.user] -; Number of repos that are showed in one page -REPO_PAGING_NUM = 15 -; Number of news feeds that are showed in one page -NEWS_FEED_PAGING_NUM = 20 -; Number of commits that are showed in one page -COMMITS_PAGING_NUM = 30 - -[i18n] -LANGS = en-US,zh-CN,zh-HK,zh-TW,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT,fi-FI,tr-TR,cs-CZ,sr-SP,sv-SE,ko-KR,gl-ES,uk-UA,en-GB,hu-HU,sk-SK,id-ID,fa-IR,vi-VN -NAMES = English,简体中文,繁體中文(香港),繁體中文(臺灣),Deutsch,français,Nederlands,latviešu,русский,日本語,español,português do Brasil,polski,български,italiano,suomi,Türkçe,čeština,српски,svenska,한국어,galego,українська,English (United Kingdom),Magyar,Slovenčina,Indonesian,Persian,Vietnamese - -; Used for datetimepicker -[i18n.datelang] -en-US = en -zh-CN = zh -zh-HK = zh-TW -zh-TW = zh-TW -de-DE = de -fr-FR = fr -nl-NL = nl -lv-LV = lv -ru-RU = ru -ja-JP = ja -es-ES = es -pt-BR = pt-BR -pl-PL = pl -bg-BG = bg -it-IT = it -fi-FI = fi -tr-TR = tr -cs-CZ = cs-CZ -sr-SP = sr -sv-SE = sv -ko-KR = ko -gl-ES = gl -uk-UA = uk -en-GB = en-GB -hu-HU = hu -sk-SK = sk -id-ID = id -fa-IR = fa -vi-VN = vi ; Extension mapping to highlight class ; e.g. .toml=ini From 00a10200f5f9936a93005cecf093ca950a91817c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 7 Nov 2021 12:39:07 +0100 Subject: [PATCH 077/131] Update app.ini --- conf/app.ini | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/conf/app.ini b/conf/app.ini index dc80699..2ca5365 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -69,17 +69,3 @@ ACCESS = file ENABLE_XORM_LOG = Warn XORM = file - - - - -; Extension mapping to highlight class -; e.g. .toml=ini -[highlight.mapping] - -[other] -SHOW_FOOTER_BRANDING = false -; Show version information about Gogs and Go in the footer -SHOW_FOOTER_VERSION = true -; Show time of template execution in the footer -SHOW_FOOTER_TEMPLATE_LOAD_TIME = true From a64aea16973d501e0131b7958f332254d47b0469 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 7 Nov 2021 12:42:15 +0100 Subject: [PATCH 078/131] add screenshot --- .gitattributes | 17 ----------- .gitignore | 50 --------------------------------- doc/screenshots/screenshot.png | Bin 0 -> 70387 bytes 3 files changed, 67 deletions(-) delete mode 100644 .gitattributes delete mode 100644 .gitignore create mode 100644 doc/screenshots/screenshot.png diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index bdb0cab..0000000 --- a/.gitattributes +++ /dev/null @@ -1,17 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto - -# Custom for Visual Studio -*.cs diff=csharp - -# Standard to msysgit -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 30af0b5..0000000 --- a/.gitignore +++ /dev/null @@ -1,50 +0,0 @@ -# Windows image file caches -Thumbs.db -ehthumbs.db - -# Folder config file -Desktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msm -*.msp - -# Windows shortcuts -*.lnk - -# ========================= -# Operating System Files -# ========================= - -# OSX -# ========================= - -.DS_Store -.AppleDouble -.LSOverride - -# Thumbnails -._* - -# Files that might appear on external disk -.Spotlight-V100 -.Trashes - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -# From kateproject -.kateproject -.kateproject.d -.directory - -*.tar.gz diff --git a/doc/screenshots/screenshot.png b/doc/screenshots/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..dd5463355a14a5c76e360e1e474ef232196ad19c GIT binary patch literal 70387 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 literal 0 HcmV?d00001 From 95f8bc62d2f65faf9e2bf074ad8777724ac248da Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sun, 7 Nov 2021 11:42:20 +0000 Subject: [PATCH 079/131] Auto-update README --- README.md | 4 ++++ README_fr.md | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/README.md b/README.md index 1271cf1..3d9876a 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,10 @@ Lightweight Git forge **Demo:** https://try.gogs.io/user/login +## Screenshots + +![](./doc/screenshots/screenshot.png) + ## Documentation and resources * Official app website: http://gogs.io diff --git a/README_fr.md b/README_fr.md index 45a4359..90c2860 100644 --- a/README_fr.md +++ b/README_fr.md @@ -17,6 +17,10 @@ Forge Git légère **Démo :** https://try.gogs.io/user/login +## Captures d'écran + +![](./doc/screenshots/screenshot.png) + ## Documentations et ressources * Site officiel de l'app : http://gogs.io From bff9280ee39411f176ef8987bcb9d16ab72ccb4f Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 7 Nov 2021 12:47:35 +0100 Subject: [PATCH 080/131] Fix --- doc/DESCRIPTION.md | 1 + doc/DESCRIPTION_fr.md | 1 + 2 files changed, 2 insertions(+) create mode 100644 doc/DESCRIPTION_fr.md diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md index e69de29..9299456 100644 --- a/doc/DESCRIPTION.md +++ b/doc/DESCRIPTION.md @@ -0,0 +1 @@ +Gogs (Go Git Service) is a git-based multiplatform forge written in Go. Its particularity is that it is light and can run on an ARM card, which makes it suitable for self-hosting. Gogs has a web interface similar to that of GitHub. \ No newline at end of file diff --git a/doc/DESCRIPTION_fr.md b/doc/DESCRIPTION_fr.md new file mode 100644 index 0000000..9c5e9cb --- /dev/null +++ b/doc/DESCRIPTION_fr.md @@ -0,0 +1 @@ +Gogs (Go Git Service) est une forge multiplateforme basée sur git écrite en Go. Sa particularité est d’être léger et pouvant fonctionner sur carte ARM, ce qui fait qu’il est adapté à l’auto-hébergement. Gogs a une interface web similaire à celle de GitHub. \ No newline at end of file From 8162f5050974bc728b393e645b82dc03f30fed09 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sun, 7 Nov 2021 11:47:42 +0000 Subject: [PATCH 081/131] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3d9876a..63828d7 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in ## Overview -Lightweight Git forge +Gogs (Go Git Service) is a git-based multiplatform forge written in Go. Its particularity is that it is light and can run on an ARM card, which makes it suitable for self-hosting. Gogs has a web interface similar to that of GitHub. **Shipped version:** 0.12.3~ynh1 diff --git a/README_fr.md b/README_fr.md index 90c2860..40ae0d1 100644 --- a/README_fr.md +++ b/README_fr.md @@ -11,7 +11,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour ## Vue d'ensemble -Forge Git légère +Gogs (Go Git Service) est une forge multiplateforme basée sur git écrite en Go. Sa particularité est d’être léger et pouvant fonctionner sur carte ARM, ce qui fait qu’il est adapté à l’auto-hébergement. Gogs a une interface web similaire à celle de GitHub. **Version incluse :** 0.12.3~ynh1 From 7a8297a10a5b017f10fd5f257b3f98cc023902f0 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 7 Nov 2021 15:29:45 +0100 Subject: [PATCH 082/131] fix --- scripts/change_url | 1 + scripts/install | 1 + 2 files changed, 2 insertions(+) diff --git a/scripts/change_url b/scripts/change_url index 7be71d8..047b901 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -34,6 +34,7 @@ db_name=$(ynh_app_setting_get --app=$app --key=db_name) db_user=$db_name db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) key=$(ynh_app_setting_get --app=$app --key=key) +is_public=$(ynh_app_setting_get --app=$app --key=is_public) #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP diff --git a/scripts/install b/scripts/install index 79bdc35..542855e 100644 --- a/scripts/install +++ b/scripts/install @@ -50,6 +50,7 @@ ynh_app_setting_set --app=$app --key=domain --value=$domain ynh_app_setting_set --app=$app --key=admin --value=$admin ynh_app_setting_set --app=$app --key=path --value=$path_url ynh_app_setting_set --app=$app --key=secret_key --value=$key +ynh_app_setting_set --app=$app --key=is_public --value=$is_public #================================================= # STANDARD MODIFICATIONS From e0194b94964dde53daa3aedbfe227076298e2c94 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 7 Nov 2021 15:44:01 +0100 Subject: [PATCH 083/131] Update install --- scripts/install | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/install b/scripts/install index 542855e..cc4085a 100644 --- a/scripts/install +++ b/scripts/install @@ -108,14 +108,14 @@ chmod 750 "$datadir" chmod -R o-rwx "$datadir" chown -R $app:www-data "$datadir" -REPO_PATH="/home/yunohost.app/$app/repositories" -DATA_PATH="/home/yunohost.app/$app/data" +REPO_PATH="$datadir/repositories" +DATA_PATH="$datadir/data" # create needed directories mkdir -p "$final_path/data" mkdir -p "$final_path/custom/conf/auth.d" -mkdir -p "/home/yunohost.app/$app/data/avatars" -mkdir -p "/home/yunohost.app/$app/data/attachments" +mkdir -p "$datadir/data/avatars" +mkdir -p "$datadir/data/attachments" #================================================= # MODIFY A CONFIG FILE @@ -127,7 +127,7 @@ if [ "$path_url" = "/" ] then ynh_replace_string --match_string="__URL__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" else - ynh_replace_string --match_string="__URL__" --replace_string="$domain${path_url%/}" --target_file="$final_path/custom/conf/app.ini" + ynh_replace_string --match_string="__URL__" --replace_string="$domain${path_url}" --target_file="$final_path/custom/conf/app.ini" fi ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" From 8ef998c9cff8cecbb02d5c897d8ce9746346c6e4 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 7 Nov 2021 15:44:13 +0100 Subject: [PATCH 084/131] Update install --- scripts/install | 55 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/scripts/install b/scripts/install index cc4085a..ed3548e 100644 --- a/scripts/install +++ b/scripts/install @@ -121,35 +121,58 @@ mkdir -p "$datadir/data/attachments" # MODIFY A CONFIG FILE #================================================= -cp ../conf/app.ini "$final_path/custom/conf" if [ "$path_url" = "/" ] then - ynh_replace_string --match_string="__URL__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" + url="$domain" else - ynh_replace_string --match_string="__URL__" --replace_string="$domain${path_url}" --target_file="$final_path/custom/conf/app.ini" + url="$domain${path_url}" fi -ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__KEY__" --replace_string="$key" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" - if [[ "$is_public" = '1' ]] then - ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="false" --target_file="$final_path/custom/conf/app.ini" + private_mode="false" else - ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="true" --target_file="$final_path/custom/conf/app.ini" + private_mode="true" fi +ynh_add_config --template="../conf/app.ini" --destination="$final_path/custom/conf/app.ini" + +chmod 400 "$final_path/custom/conf/app.ini" +chown $app:$app "$final_path/custom/conf/app.ini" + + + + +# cp ../conf/app.ini "$final_path/custom/conf" + +# if [ "$path_url" = "/" ] +# then +# ynh_replace_string --match_string="__URL__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" +# else +# ynh_replace_string --match_string="__URL__" --replace_string="$domain${path_url}" --target_file="$final_path/custom/conf/app.ini" +# fi + +# ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" +# ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" +# ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" +# ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/custom/conf/app.ini" +# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" +# ynh_replace_string --match_string="__KEY__" --replace_string="$key" --target_file="$final_path/custom/conf/app.ini" +# ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" +# ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" +# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" + +# if [[ "$is_public" = '1' ]] +# then +# ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="false" --target_file="$final_path/custom/conf/app.ini" +# else +# ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="true" --target_file="$final_path/custom/conf/app.ini" +# fi + ynh_add_config --template="../conf/ldap.conf" --destination="$final_path/custom/conf/auth.d/ldap.conf" -ynh_store_file_checksum --file="$final_path/custom/conf/app.ini" +#ynh_store_file_checksum --file="$final_path/custom/conf/app.ini" # Configure init script ynh_add_systemd_config From 119ce3cee0dfe6872eb79411173db61440373a4b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 8 Nov 2021 21:09:13 +0100 Subject: [PATCH 085/131] Fix --- scripts/install | 4 ++-- scripts/upgrade | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/install b/scripts/install index ed3548e..e49b339 100644 --- a/scripts/install +++ b/scripts/install @@ -108,8 +108,8 @@ chmod 750 "$datadir" chmod -R o-rwx "$datadir" chown -R $app:www-data "$datadir" -REPO_PATH="$datadir/repositories" -DATA_PATH="$datadir/data" +repo_path="$datadir/repositories" +data_path="$datadir/data" # create needed directories mkdir -p "$final_path/data" diff --git a/scripts/upgrade b/scripts/upgrade index 1e42611..51f0df3 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -82,8 +82,8 @@ ynh_secure_remove --file="/opt/$app/templates" #================================================= ynh_script_progression --message="Setting up source files..." --weight=3 -REPO_PATH="$datadir/repositories" -DATA_PATH="$datadir/data" +repo_path="$datadir/repositories" +data_path="$datadir/data" ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src From 4bad3631e77a7dcdae42ed17df17a720d14c62a3 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 8 Nov 2021 21:22:23 +0100 Subject: [PATCH 086/131] Update app.ini --- conf/app.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.ini b/conf/app.ini index 2ca5365..93388be 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -11,11 +11,11 @@ HTTP_ADDR = 127.0.0.1 OFFLINE_MODE = false DISABLE_SSH = false SSH_PORT = 22 -APP_DATA_PATH = __DATA_PATH__ +APP_DATA_PATH = __DATADIR/data LANDING_PAGE = explore [repository] -ROOT = __REPOS_PATH__ +ROOT = __DATADIR__/repositories FORCE_PRIVATE = false [database] @@ -51,7 +51,7 @@ SKIP_VERIFY = true PROVIDER = memory [picture] -AVATAR_UPLOAD_PATH = __DATA_PATH__/avatars +AVATAR_UPLOAD_PATH = __DATADIR__/data/avatars [log] MODE = file From ed87f1ed25ea39f07312a1c432ff47d391578b76 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 8 Nov 2021 21:48:50 +0100 Subject: [PATCH 087/131] fix --- scripts/_common.sh | 103 +++++++-------------------------------------- scripts/install | 41 +----------------- scripts/restore | 2 +- scripts/upgrade | 32 -------------- 4 files changed, 18 insertions(+), 160 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index b04dd7b..f8db05b 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -1,5 +1,19 @@ +#!/bin/bash + #================================================= -# SET ALL CONSTANTS +# COMMON VARIABLES +#================================================= + +#================================================= +# PERSONAL HELPERS +#================================================= + +#================================================= +# EXPERIMENTAL HELPERS +#================================================= + +#================================================= +# FUTURE OFFICIAL HELPERS #================================================= # Detect the system architecture to download the right tarball @@ -23,89 +37,4 @@ ynh_detect_arch(){ #================================================= # DEFINE ALL COMMON FONCTIONS #================================================= - -create_dir() { - mkdir -p "$final_path/data" - mkdir -p "$final_path/custom/conf/auth.d" - mkdir -p "$DATA_PATH/avatars" - mkdir -p "$DATA_PATH/attachments" - mkdir -p "/var/log/$app" -} - -config_gogs() { - ynh_backup_if_checksum_is_different "$final_path/custom/conf/app.ini" - - cp ../conf/app.ini "$final_path/custom/conf" - - if [ "$path_url" = "/" ] - then - ynh_replace_string "__URL__" "$domain" "$final_path/custom/conf/app.ini" - else - ynh_replace_string "__URL__" "$domain${path_url%/}" "$final_path/custom/conf/app.ini" - fi - - ynh_replace_string "__REPOS_PATH__" "$REPO_PATH" "$final_path/custom/conf/app.ini" - ynh_replace_string "__DB_PWD__" "$db_pwd" "$final_path/custom/conf/app.ini" - ynh_replace_string "__DB_NAME__" "$db_name" "$final_path/custom/conf/app.ini" - ynh_replace_string "__DOMAIN__" "$domain" "$final_path/custom/conf/app.ini" - ynh_replace_string "__KEY__" "$key" "$final_path/custom/conf/app.ini" - ynh_replace_string "__DATA_PATH__" "$DATA_PATH" "$final_path/custom/conf/app.ini" - ynh_replace_string "__PORT__" $port "$final_path/custom/conf/app.ini" - ynh_replace_string "__APP__" $app "$final_path/custom/conf/app.ini" - - if [[ "$is_public" = '1' ]] - then - ynh_replace_string "__PRIVATE_MODE__" "false" "$final_path/custom/conf/app.ini" - else - ynh_replace_string "__PRIVATE_MODE__" "true" "$final_path/custom/conf/app.ini" - fi - - ynh_add_config --template="../conf/ldap.conf" --destination="$final_path/custom/conf/auth.d/ldap.conf" - - ynh_store_file_checksum "$final_path/custom/conf/app.ini" -} - -set_permission() { - chown -R $app:$app "$final_path" - chown -R $app:$app "/home/$app" - chown -R $app:$app "/var/log/$app" - chmod u=rwX,g=rX,o= "$final_path" - chmod u=rwX,g=rX,o= "/home/$app" - chmod u=rwX,g=rX,o= "/var/log/$app" -} - -set_access_settings() { - if [ $is_public -eq 1 ] - then - ynh_permission_update --permission="main" --add="visitors" - else - # For an access to the git server by https in private mode we need to allow the access to theses URL : - # - "DOMAIN/PATH/USER/REPOSITORY/info/refs" - # - "DOMAIN/PATH/USER/REPOSITORY/git-upload-pack" - # - "DOMAIN/PATH/USER/REPOSITORY/git-receive-pack" - - excaped_domain=${domain//'.'/'%.'} - excaped_domain=${excaped_domain//'-'/'%-'} - excaped_path=${path_url//'.'/'%.'} - excaped_path=${excaped_path//'-'/'%-'} - ynh_app_setting_set $app skipped_regex "$excaped_domain$excaped_path/[%w-.]*/[%w-.]*/git%-receive%-pack,$excaped_domain$excaped_path/[%w-.]*/[%w-.]*/git%-upload%-pack,$excaped_domain$excaped_path/[%w-.]*/[%w-.]*/info/refs" - fi -} - - -# Start or restart a service and follow its booting -# -# usage: ynh_check_starting "Line to match" [Log file] [Timeout] [Service name] -# -# | arg: Line to match - The line to find in the log to attest the service have finished to boot. -# | arg: Log file - The log file to watch -# | arg: Service name -# /var/log/$app/$app.log will be used if no other log is defined. -# | arg: Timeout - The maximum time to wait before ending the watching. Defaut 300 seconds. -ynh_check_starting () { - local line_to_match="$1" - local service_name="${4:-$app}" - local app_log="${2:-/var/log/$service_name/$service_name.log}" - local timeout=${3:-300} -} - \ No newline at end of file + \ No newline at end of file diff --git a/scripts/install b/scripts/install index e49b339..5adcd3c 100644 --- a/scripts/install +++ b/scripts/install @@ -121,19 +121,11 @@ mkdir -p "$datadir/data/attachments" # MODIFY A CONFIG FILE #================================================= - if [ "$path_url" = "/" ] then url="$domain" else - url="$domain${path_url}" -fi - -if [[ "$is_public" = '1' ]] -then - private_mode="false" -else - private_mode="true" + url="$domain${path_url%/}" fi ynh_add_config --template="../conf/app.ini" --destination="$final_path/custom/conf/app.ini" @@ -141,39 +133,8 @@ ynh_add_config --template="../conf/app.ini" --destination="$final_path/custom/co chmod 400 "$final_path/custom/conf/app.ini" chown $app:$app "$final_path/custom/conf/app.ini" - - - -# cp ../conf/app.ini "$final_path/custom/conf" - -# if [ "$path_url" = "/" ] -# then -# ynh_replace_string --match_string="__URL__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" -# else -# ynh_replace_string --match_string="__URL__" --replace_string="$domain${path_url}" --target_file="$final_path/custom/conf/app.ini" -# fi - -# ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" -# ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" -# ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" -# ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/custom/conf/app.ini" -# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" -# ynh_replace_string --match_string="__KEY__" --replace_string="$key" --target_file="$final_path/custom/conf/app.ini" -# ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" -# ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" -# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" - -# if [[ "$is_public" = '1' ]] -# then -# ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="false" --target_file="$final_path/custom/conf/app.ini" -# else -# ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="true" --target_file="$final_path/custom/conf/app.ini" -# fi - ynh_add_config --template="../conf/ldap.conf" --destination="$final_path/custom/conf/auth.d/ldap.conf" -#ynh_store_file_checksum --file="$final_path/custom/conf/app.ini" - # Configure init script ynh_add_systemd_config diff --git a/scripts/restore b/scripts/restore index 561b280..bf6b898 100644 --- a/scripts/restore +++ b/scripts/restore @@ -44,7 +44,7 @@ test ! -d $final_path \ #================================================= # RESTORE THE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Restoring the NGINX configuration..." +ynh_script_progression --message="Restoring the NGINX configuration..." --weight=1 ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" diff --git a/scripts/upgrade b/scripts/upgrade index 51f0df3..12041e4 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -93,38 +93,6 @@ chmod 750 "$final_path" chmod -R o-rwx "$final_path" chown -R $app:www-data "$final_path" -#ynh_backup_if_checksum_is_different "$final_path/custom/conf/app.ini" - -# cp ../conf/app.ini "$final_path/custom/conf" - -# if [ "$path_url" = "/" ] -# then -# ynh_replace_string --match_string="__URL__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" -# else -# ynh_replace_string --match_string="__URL__" --replace_string="$domain${path_url%/}" --target_file="$final_path/custom/conf/app.ini" -# fi - -# ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" -# ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" -# ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/custom/conf/app.ini" -# ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" -# ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/custom/conf/app.ini" -# ynh_replace_string --match_string="__KEY__" --replace_string="$(ynh_string_random)" --target_file="$final_path/custom/conf/app.ini" -# ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" -# ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" -# ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" - -# if [[ "$is_public" = '1' ]] -# then -# ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="false" --target_file="$final_path/custom/conf/app.ini" -# else -# ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="true" --target_file="$final_path/custom/conf/app.ini" -# fi - -#ynh_add_config --template="../conf/ldap.conf" --destination="$final_path/custom/conf/auth.d/ldap.conf" - -#ynh_store_file_checksum "$final_path/custom/conf/app.ini" - #================================================= # SETUP SYSTEMD #================================================= From bc6f1437e00b1766aed27270e59e353d30a4c55b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 8 Nov 2021 21:51:33 +0100 Subject: [PATCH 088/131] Update app.ini --- conf/app.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/app.ini b/conf/app.ini index 93388be..061c412 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -11,7 +11,7 @@ HTTP_ADDR = 127.0.0.1 OFFLINE_MODE = false DISABLE_SSH = false SSH_PORT = 22 -APP_DATA_PATH = __DATADIR/data +APP_DATA_PATH = __DATADIR__/data LANDING_PAGE = explore [repository] From f3d867640692d5dcf975e721c23c741dd6868c82 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 8 Nov 2021 21:58:32 +0100 Subject: [PATCH 089/131] Update _common.sh --- scripts/_common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index f8db05b..8b60cc4 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -28,7 +28,7 @@ ynh_detect_arch(){ elif [ -n "$(uname -m | grep arm)" ]; then architecture="armv7" else - ynh_die "Unable to detect your achitecture, please open a bug describing \ + ynh_die --message "Unable to detect your achitecture, please open a bug describing \ your hardware and the result of the command \"uname -m\"." 1 fi echo $architecture From c7a9841a987d807b9057bb0f4b1faa154947b0af Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 8 Nov 2021 22:06:26 +0100 Subject: [PATCH 090/131] fix --- scripts/_common.sh | 5 ----- scripts/upgrade | 5 +---- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 8b60cc4..bc051ba 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -33,8 +33,3 @@ ynh_detect_arch(){ fi echo $architecture } - -#================================================= -# DEFINE ALL COMMON FONCTIONS -#================================================= - \ No newline at end of file diff --git a/scripts/upgrade b/scripts/upgrade index 12041e4..0577d3c 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -75,16 +75,13 @@ ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app #================================================= # Clean template to fix issue : https://github.com/gogits/gogs/issues/4585 -ynh_secure_remove --file="/opt/$app/templates" +ynh_secure_remove --file="$final_path/templates" #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= ynh_script_progression --message="Setting up source files..." --weight=3 -repo_path="$datadir/repositories" -data_path="$datadir/data" - ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir=$final_path --source_id="$architecture" --keep="$final_path/custom/conf/app.ini $final_path/custom/conf/auth.d/ldap.conf" From 1d7286c34ac1e77179f6b3749e8b0b66a1ba2252 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 8 Nov 2021 22:07:44 +0100 Subject: [PATCH 091/131] Update install --- scripts/install | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/install b/scripts/install index 5adcd3c..e4cb228 100644 --- a/scripts/install +++ b/scripts/install @@ -50,7 +50,6 @@ ynh_app_setting_set --app=$app --key=domain --value=$domain ynh_app_setting_set --app=$app --key=admin --value=$admin ynh_app_setting_set --app=$app --key=path --value=$path_url ynh_app_setting_set --app=$app --key=secret_key --value=$key -ynh_app_setting_set --app=$app --key=is_public --value=$is_public #================================================= # STANDARD MODIFICATIONS From 795df0d2b1685bb6ee03dde67f8c0dca349162df Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 8 Nov 2021 22:52:42 +0100 Subject: [PATCH 092/131] Update remove --- scripts/remove | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/scripts/remove b/scripts/remove index d729e03..2a6e9d4 100644 --- a/scripts/remove +++ b/scripts/remove @@ -61,10 +61,15 @@ ynh_script_progression --message="Removing app main directory..." --weight=3 ynh_secure_remove --file="$final_path" #================================================= -# REMOVE VARIOUS FILES +# REMOVE DATA DIR #================================================= -ynh_secure_remove --file="$datadir" +# Remove the app data directory with the command `yunohost app remove gogs --purge` +if [ "${YNH_APP_PURGE:-0}" -eq 1 ] +then + ynh_script_progression --message="Removing $app data directory..." --weight=2 + ynh_secure_remove --file="$datadir" +fi ynh_secure_remove --file="/var/log/$app" From eb1dc82b7ea474005d313e4218923f5d3b02116a Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 8 Nov 2021 23:04:19 +0100 Subject: [PATCH 093/131] Update change_url --- scripts/change_url | 31 +++++++------------------------ 1 file changed, 7 insertions(+), 24 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index 047b901..6f57408 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -110,39 +110,22 @@ fi #================================================= # SPECIFIC MODIFICATIONS #================================================= -REPO_PATH="/home/yunohost.app/$app/repositories" -DATA_PATH="/home/yunohost.app/$app/data" - -cp ../conf/app.ini "$final_path/custom/conf" -cp ../conf/ldap.conf "$final_path/custom/conf/auth.d/ldap.conf" if [ "$path_url" = "/" ] then - ynh_replace_string --match_string="__URL__" --replace_string="$new_domain" --target_file="$final_path/custom/conf/app.ini" + url="$new_domain" else - ynh_replace_string --match_string="__URL__" --replace_string="$new_domain${new_path%/}" --target_file="$final_path/custom/conf/app.ini" + url="$new_domain${new_path%/}" fi -ynh_replace_string --match_string="__REPOS_PATH__" --replace_string="$REPO_PATH" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$new_domain" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__KEY__" --replace_string="$key" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__DATA_PATH__" --replace_string="$DATA_PATH" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/custom/conf/app.ini" +domain=$new_domain -if [[ "$is_public" = '1' ]] -then - ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="false" --target_file="$final_path/custom/conf/app.ini" -else - ynh_replace_string --match_string="__PRIVATE_MODE__" --replace_string="true" --target_file="$final_path/custom/conf/app.ini" -fi +ynh_add_config --template="../conf/app.ini" --destination="$final_path/custom/conf/app.ini" -ynh_replace_string --match_string="__ADMIN__" --replace_string="$admin" --target_file="$final_path/custom/conf/auth.d/ldap.conf" +chmod 400 "$final_path/custom/conf/app.ini" +chown $app:$app "$final_path/custom/conf/app.ini" -ynh_store_file_checksum --file="$final_path/custom/conf/app.ini" +ynh_add_config --template="../conf/ldap.conf" --destination="$final_path/custom/conf/auth.d/ldap.conf" #================================================= # GENERIC FINALISATION From 0b4c9bad4ad1cf54416e7d84b8a3dccda89b09db Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 8 Nov 2021 23:05:30 +0100 Subject: [PATCH 094/131] Update change_url --- scripts/change_url | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/change_url b/scripts/change_url index 6f57408..957d1d1 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -34,7 +34,6 @@ db_name=$(ynh_app_setting_get --app=$app --key=db_name) db_user=$db_name db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) key=$(ynh_app_setting_get --app=$app --key=key) -is_public=$(ynh_app_setting_get --app=$app --key=is_public) #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP From 66f021fe6b2654d0d4a03882a1c512408b8dbd90 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 9 Nov 2021 07:31:31 +0100 Subject: [PATCH 095/131] Update change_url --- scripts/change_url | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/change_url b/scripts/change_url index 957d1d1..3c3015d 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -34,6 +34,7 @@ db_name=$(ynh_app_setting_get --app=$app --key=db_name) db_user=$db_name db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) key=$(ynh_app_setting_get --app=$app --key=key) +datadir=$(ynh_app_setting_get --app=$app --key=datadir) #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP From 47598ffd1cb8f2f8304078dcc138ecdea628a102 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 21 Nov 2021 21:30:21 +0100 Subject: [PATCH 096/131] Remove http->https redirect in nginx conf, now handled by yunohost core --- conf/nginx.conf | 4 ---- 1 file changed, 4 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index f443e57..fe4b9f3 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,10 +1,6 @@ #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; location __PATH__/ { - # Force https - if ($scheme = http) { - rewrite ^ https://$server_name$request_uri? permanent; - } proxy_pass http://127.0.0.1:__PORT__/; proxy_set_header Host $host; From b0ec66d6984e2c7801e392d64d3fdec62eef9885 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 21 Nov 2021 21:38:18 +0100 Subject: [PATCH 097/131] Remove arch helper --- conf/{x86-64.src => amd64.src} | 0 conf/{armv7.src => armhf.src} | 0 conf/nginx.conf | 1 - manifest.json | 2 +- scripts/_common.sh | 18 ------------------ scripts/install | 4 ++-- scripts/upgrade | 2 +- 7 files changed, 4 insertions(+), 23 deletions(-) rename conf/{x86-64.src => amd64.src} (100%) rename conf/{armv7.src => armhf.src} (100%) diff --git a/conf/x86-64.src b/conf/amd64.src similarity index 100% rename from conf/x86-64.src rename to conf/amd64.src diff --git a/conf/armv7.src b/conf/armhf.src similarity index 100% rename from conf/armv7.src rename to conf/armhf.src diff --git a/conf/nginx.conf b/conf/nginx.conf index fe4b9f3..066093b 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,7 +1,6 @@ #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; location __PATH__/ { - proxy_pass http://127.0.0.1:__PORT__/; proxy_set_header Host $host; proxy_buffering off; diff --git a/manifest.json b/manifest.json index 3345c93..03cde0a 100644 --- a/manifest.json +++ b/manifest.json @@ -30,7 +30,7 @@ "mysql" ], "requirements": { - "yunohost": ">= 4.2.8" + "yunohost": ">= 4.3.0" }, "arguments": { "install" : [ diff --git a/scripts/_common.sh b/scripts/_common.sh index bc051ba..944a65e 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -15,21 +15,3 @@ #================================================= # FUTURE OFFICIAL HELPERS #================================================= - -# Detect the system architecture to download the right tarball -# NOTE: `uname -m` is more accurate and universal than `arch` -# See https://en.wikipedia.org/wiki/Uname -ynh_detect_arch(){ - local architecture - if [ -n "$(uname -m | grep 64)" ]; then - architecture="x86-64" - elif [ -n "$(uname -m | grep 86)" ]; then - architecture="i386" - elif [ -n "$(uname -m | grep arm)" ]; then - architecture="armv7" - else - ynh_die --message "Unable to detect your achitecture, please open a bug describing \ - your hardware and the result of the command \"uname -m\"." 1 - fi - echo $architecture -} diff --git a/scripts/install b/scripts/install index e4cb228..de268c9 100644 --- a/scripts/install +++ b/scripts/install @@ -25,7 +25,7 @@ domain=$YNH_APP_ARG_DOMAIN path_url=$YNH_APP_ARG_PATH admin=$YNH_APP_ARG_ADMIN is_public=$YNH_APP_ARG_IS_PUBLIC -architecture=$(ynh_detect_arch) +architecture=$YNH_ARCH key=$(ynh_string_random) app=$YNH_APP_INSTANCE_NAME @@ -49,7 +49,7 @@ 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=admin --value=$admin ynh_app_setting_set --app=$app --key=path --value=$path_url -ynh_app_setting_set --app=$app --key=secret_key --value=$key +ynh_app_setting_set --app=$app --key=key --value=$key #================================================= # STANDARD MODIFICATIONS diff --git a/scripts/upgrade b/scripts/upgrade index 0577d3c..d91fcf3 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -26,7 +26,7 @@ db_user=$db_name db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) admin=$(ynh_app_setting_get --app=$app --key=admin) port=$(ynh_app_setting_get --app=$app --key=port) -architecture=$(ynh_detect_arch) +architecture=$YNH_ARCH datadir=$(ynh_app_setting_get --app=$app --key=datadir) #================================================= From 8439765572a25bfd7b2f9e7b0e96a2436be42a7f Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 21 Nov 2021 21:56:04 +0100 Subject: [PATCH 098/131] Update DISCLAIMER.md --- doc/DISCLAIMER.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md index e69de29..8912b8b 100644 --- a/doc/DISCLAIMER.md +++ b/doc/DISCLAIMER.md @@ -0,0 +1,22 @@ +## Notes on SSH usage +If you want to use Gogs with ssh and be able to pull/push with you ssh key, your ssh daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: + +```bash +PubkeyAuthentication yes +AuthorizedKeysFile %h/.ssh/authorized_keys +ChallengeResponseAuthentication no +PasswordAuthentication no +UsePAM no +``` + +You also need to add your public key to your Gogs profile. + +If you use ssh on another port than 22, you need to add theses lines to your ssh config in `~/.ssh/config`: + +```bash +Host domain.tld + port 2222 # change this with the port you use +``` + +## Private Mode +Actually it's possible to access to the git repositories by the `git` command over http also in private mode installation. It's important to know that in this mode the repository could be ALSO getted if you don't set the repository as private in the repos settings. From 6a707fc6183704a7a9d372ca83aef0d19985a12d Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sun, 21 Nov 2021 20:56:13 +0000 Subject: [PATCH 099/131] Auto-update README --- README.md | 25 +++++++++++++++++++++++++ README_fr.md | 25 +++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/README.md b/README.md index 63828d7..1a84b5c 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,31 @@ Gogs (Go Git Service) is a git-based multiplatform forge written in Go. Its part ![](./doc/screenshots/screenshot.png) +## Disclaimers / important information + +## Notes on SSH usage +If you want to use Gogs with ssh and be able to pull/push with you ssh key, your ssh daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: + +```bash +PubkeyAuthentication yes +AuthorizedKeysFile %h/.ssh/authorized_keys +ChallengeResponseAuthentication no +PasswordAuthentication no +UsePAM no +``` + +You also need to add your public key to your Gogs profile. + +If you use ssh on another port than 22, you need to add theses lines to your ssh config in `~/.ssh/config`: + +```bash +Host domain.tld + port 2222 # change this with the port you use +``` + +## Private Mode +Actually it's possible to access to the git repositories by the `git` command over http also in private mode installation. It's important to know that in this mode the repository could be ALSO getted if you don't set the repository as private in the repos settings. + ## Documentation and resources * Official app website: http://gogs.io diff --git a/README_fr.md b/README_fr.md index 40ae0d1..794cf34 100644 --- a/README_fr.md +++ b/README_fr.md @@ -21,6 +21,31 @@ Gogs (Go Git Service) est une forge multiplateforme basée sur git écrite en Go ![](./doc/screenshots/screenshot.png) +## Avertissements / informations importantes + +## Notes on SSH usage +If you want to use Gogs with ssh and be able to pull/push with you ssh key, your ssh daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: + +```bash +PubkeyAuthentication yes +AuthorizedKeysFile %h/.ssh/authorized_keys +ChallengeResponseAuthentication no +PasswordAuthentication no +UsePAM no +``` + +You also need to add your public key to your Gogs profile. + +If you use ssh on another port than 22, you need to add theses lines to your ssh config in `~/.ssh/config`: + +```bash +Host domain.tld + port 2222 # change this with the port you use +``` + +## Private Mode +Actually it's possible to access to the git repositories by the `git` command over http also in private mode installation. It's important to know that in this mode the repository could be ALSO getted if you don't set the repository as private in the repos settings. + ## Documentations et ressources * Site officiel de l'app : http://gogs.io From 780481758ba4ae8c14e325a8b2bb42e73ad3f657 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 12:10:08 +0100 Subject: [PATCH 100/131] Fix --- conf/systemd.service | 4 ++-- scripts/change_url | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/systemd.service b/conf/systemd.service index ea676ee..f277cdc 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -6,10 +6,10 @@ After=syslog.target network.target mysql.service slapd.service redis.service Type=simple User=__APP__ Group=__APP__ -WorkingDirectory=/home/yunohost.app/__APP__ +WorkingDirectory=__DATADIR__ ExecStart=__FINALPATH__/gogs web Restart=always -Environment=USER=__APP__ HOME=/home/yunohost.app/__APP__ +Environment=USER=__APP__ HOME=__DATADIR__ [Install] WantedBy=multi-user.target diff --git a/scripts/change_url b/scripts/change_url index 3c3015d..0f6fe08 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -125,7 +125,7 @@ ynh_add_config --template="../conf/app.ini" --destination="$final_path/custom/co chmod 400 "$final_path/custom/conf/app.ini" chown $app:$app "$final_path/custom/conf/app.ini" -ynh_add_config --template="../conf/ldap.conf" --destination="$final_path/custom/conf/auth.d/ldap.conf" +#ynh_add_config --template="../conf/ldap.conf" --destination="$final_path/custom/conf/auth.d/ldap.conf" #================================================= # GENERIC FINALISATION From 8aa1b259aa7923325e16a2de2c96f0f53b56f3ef Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 12:12:06 +0100 Subject: [PATCH 101/131] Fix --- scripts/change_url | 2 -- scripts/restore | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index 0f6fe08..5d83785 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -125,8 +125,6 @@ ynh_add_config --template="../conf/app.ini" --destination="$final_path/custom/co chmod 400 "$final_path/custom/conf/app.ini" chown $app:$app "$final_path/custom/conf/app.ini" -#ynh_add_config --template="../conf/ldap.conf" --destination="$final_path/custom/conf/auth.d/ldap.conf" - #================================================= # GENERIC FINALISATION #================================================= diff --git a/scripts/restore b/scripts/restore index bf6b898..05ea48d 100644 --- a/scripts/restore +++ b/scripts/restore @@ -36,8 +36,7 @@ datadir=$(ynh_app_setting_get --app=$app --key=datadir) #================================================= ynh_script_progression --message="Validating restoration parameters..." --weight=2 -test ! -d $final_path \ - || ynh_die --message="There is already a directory: $final_path " +test ! -d $final_path || ynh_die --message="There is already a directory: $final_path " #================================================= # STANDARD RESTORATION STEPS From 14d4cf874d1f5d5bffeccddd935ec178ce3f3cb1 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 12:24:51 +0100 Subject: [PATCH 102/131] Fix --- conf/app.ini | 2 +- conf/nginx.conf | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/conf/app.ini b/conf/app.ini index 061c412..1a37330 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -6,7 +6,7 @@ RUN_MODE = prod [server] DOMAIN = __DOMAIN__ HTTP_PORT = __PORT__ -ROOT_URL = https://__URL__/ +EXTERNAL_URL = https://__URL__/ HTTP_ADDR = 127.0.0.1 OFFLINE_MODE = false DISABLE_SSH = false diff --git a/conf/nginx.conf b/conf/nginx.conf index 066093b..6d21f56 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,12 +1,11 @@ #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; location __PATH__/ { - - proxy_pass http://127.0.0.1:__PORT__/; - proxy_set_header Host $host; - proxy_buffering off; - fastcgi_param REMOTE_USER $remote_user; - client_max_body_size 200M; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://localhost:__PORT__/; + proxy_set_header Host $host; + proxy_buffering off; + fastcgi_param REMOTE_USER $remote_user; + client_max_body_size 200M; + proxy_set_header X-Real-IP $remote_addr; # Include SSOWAT user panel. include conf.d/yunohost_panel.conf.inc; From 0980cdc30ccd4c5323b585fc2c39f9b330c23972 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 12:33:53 +0100 Subject: [PATCH 103/131] Fix --- doc/DESCRIPTION.md | 18 +++++++++++++++++- doc/DESCRIPTION_fr.md | 2 +- doc/DISCLAIMER.md | 6 ++++-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md index 9299456..671b82e 100644 --- a/doc/DESCRIPTION.md +++ b/doc/DESCRIPTION.md @@ -1 +1,17 @@ -Gogs (Go Git Service) is a git-based multiplatform forge written in Go. Its particularity is that it is light and can run on an ARM card, which makes it suitable for self-hosting. Gogs has a web interface similar to that of GitHub. \ No newline at end of file +Gogs (Go Git Service) is a git-based multiplatform forge written in Go. Its particularity is that it is light and can run on an ARM card, which makes it suitable for self-hosting. Gogs has a web interface similar to that of GitHub. + + +### Features + +- User dashboard, user profile and activity timeline. +- Access repositories via SSH, HTTP and HTTPS protocols. +- User, organization and repository management. +- Repository and organization webhooks, including Slack, Discord and Dingtalk. +- Repository Git hooks, deploy keys and Git LFS. +- Repository issues, pull requests, wiki, protected branches and collaboration. +- Migrate and mirror repositories with wiki from other code hosts. +- Web editor for quick editing repository files and wiki. +- Jupyter Notebook and PDF rendering. +- Authentication via SMTP, LDAP, reverse proxy, GitHub.com and GitHub Enterprise with 2FA. +- Customize HTML templates, static files and many others. +- Rich database backend, including PostgreSQL, MySQL, SQLite3 and TiDB. diff --git a/doc/DESCRIPTION_fr.md b/doc/DESCRIPTION_fr.md index 9c5e9cb..2e694fe 100644 --- a/doc/DESCRIPTION_fr.md +++ b/doc/DESCRIPTION_fr.md @@ -1 +1 @@ -Gogs (Go Git Service) est une forge multiplateforme basée sur git écrite en Go. Sa particularité est d’être léger et pouvant fonctionner sur carte ARM, ce qui fait qu’il est adapté à l’auto-hébergement. Gogs a une interface web similaire à celle de GitHub. \ No newline at end of file +Gogs (Go Git Service) est une forge multiplateforme basée sur git écrite en Go. Sa particularité est d’être léger et pouvant fonctionner sur carte ARM, ce qui fait qu’il est adapté à l’auto-hébergement. Gogs a une interface web similaire à celle de GitHub. diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md index 8912b8b..044c1b0 100644 --- a/doc/DISCLAIMER.md +++ b/doc/DISCLAIMER.md @@ -1,5 +1,6 @@ ## Notes on SSH usage -If you want to use Gogs with ssh and be able to pull/push with you ssh key, your ssh daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: + +If you want to use Gogs with SSH and be able to pull/push with you ssh key, your SSH daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: ```bash PubkeyAuthentication yes @@ -19,4 +20,5 @@ Host domain.tld ``` ## Private Mode -Actually it's possible to access to the git repositories by the `git` command over http also in private mode installation. It's important to know that in this mode the repository could be ALSO getted if you don't set the repository as private in the repos settings. + +Actually it's possible to access to the Git repositories by the `git` command over http also in private mode installation. It's important to know that in this mode the repository could be ALSO getted if you don't set the repository as private in the repos settings. From c75994b5c43be7df9f78c8382e318554b231c427 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Fri, 26 Nov 2021 11:34:01 +0000 Subject: [PATCH 104/131] Auto-update README --- README.md | 25 ++++++++++++++++++++++--- README_fr.md | 9 ++++++--- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1a84b5c..4691c1b 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,24 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in ## Overview -Gogs (Go Git Service) is a git-based multiplatform forge written in Go. Its particularity is that it is light and can run on an ARM card, which makes it suitable for self-hosting. Gogs has a web interface similar to that of GitHub. +Gogs (Go Git Service) is a git-based multiplatform forge written in Go. Its particularity is that it is light and can run on an ARM card, which makes it suitable for self-hosting. Gogs has a web interface similar to that of GitHub. + + +### Features + +- User dashboard, user profile and activity timeline. +- Access repositories via SSH, HTTP and HTTPS protocols. +- User, organization and repository management. +- Repository and organization webhooks, including Slack, Discord and Dingtalk. +- Repository Git hooks, deploy keys and Git LFS. +- Repository issues, pull requests, wiki, protected branches and collaboration. +- Migrate and mirror repositories with wiki from other code hosts. +- Web editor for quick editing repository files and wiki. +- Jupyter Notebook and PDF rendering. +- Authentication via SMTP, LDAP, reverse proxy, GitHub.com and GitHub Enterprise with 2FA. +- Customize HTML templates, static files and many others. +- Rich database backend, including PostgreSQL, MySQL, SQLite3 and TiDB. + **Shipped version:** 0.12.3~ynh1 @@ -28,7 +45,8 @@ Gogs (Go Git Service) is a git-based multiplatform forge written in Go. Its part ## Disclaimers / important information ## Notes on SSH usage -If you want to use Gogs with ssh and be able to pull/push with you ssh key, your ssh daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: + +If you want to use Gogs with SSH and be able to pull/push with you ssh key, your SSH daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: ```bash PubkeyAuthentication yes @@ -48,7 +66,8 @@ Host domain.tld ``` ## Private Mode -Actually it's possible to access to the git repositories by the `git` command over http also in private mode installation. It's important to know that in this mode the repository could be ALSO getted if you don't set the repository as private in the repos settings. + +Actually it's possible to access to the Git repositories by the `git` command over http also in private mode installation. It's important to know that in this mode the repository could be ALSO getted if you don't set the repository as private in the repos settings. ## Documentation and resources diff --git a/README_fr.md b/README_fr.md index 794cf34..9af087f 100644 --- a/README_fr.md +++ b/README_fr.md @@ -11,7 +11,8 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour ## Vue d'ensemble -Gogs (Go Git Service) est une forge multiplateforme basée sur git écrite en Go. Sa particularité est d’être léger et pouvant fonctionner sur carte ARM, ce qui fait qu’il est adapté à l’auto-hébergement. Gogs a une interface web similaire à celle de GitHub. +Gogs (Go Git Service) est une forge multiplateforme basée sur git écrite en Go. Sa particularité est d’être léger et pouvant fonctionner sur carte ARM, ce qui fait qu’il est adapté à l’auto-hébergement. Gogs a une interface web similaire à celle de GitHub. + **Version incluse :** 0.12.3~ynh1 @@ -24,7 +25,8 @@ Gogs (Go Git Service) est une forge multiplateforme basée sur git écrite en Go ## Avertissements / informations importantes ## Notes on SSH usage -If you want to use Gogs with ssh and be able to pull/push with you ssh key, your ssh daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: + +If you want to use Gogs with SSH and be able to pull/push with you ssh key, your SSH daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: ```bash PubkeyAuthentication yes @@ -44,7 +46,8 @@ Host domain.tld ``` ## Private Mode -Actually it's possible to access to the git repositories by the `git` command over http also in private mode installation. It's important to know that in this mode the repository could be ALSO getted if you don't set the repository as private in the repos settings. + +Actually it's possible to access to the Git repositories by the `git` command over http also in private mode installation. It's important to know that in this mode the repository could be ALSO getted if you don't set the repository as private in the repos settings. ## Documentations et ressources From 6d7c9e623d296c30088ba68f970ad7d7b31ef615 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 12:58:39 +0100 Subject: [PATCH 105/131] Update change_url --- scripts/change_url | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/change_url b/scripts/change_url index 5d83785..da7c4f7 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -35,6 +35,7 @@ db_user=$db_name db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) key=$(ynh_app_setting_get --app=$app --key=key) datadir=$(ynh_app_setting_get --app=$app --key=datadir) +path_url=$(ynh_app_setting_get --app=$app --key=path) #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP From 5a76379cbc727ce47fe8756d161418b0c73949bf Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 13:46:16 +0100 Subject: [PATCH 106/131] Update ldap.conf --- conf/ldap.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/ldap.conf b/conf/ldap.conf index 52ea4a3..d9449f6 100644 --- a/conf/ldap.conf +++ b/conf/ldap.conf @@ -2,7 +2,7 @@ # id = 1 type = ldap_bind_dn -name = Yunohost LDAP +name = YunoHost LDAP is_activated = true [config] From 6983ebd5241b9f4601dc4ba17167419a75f776a2 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 13:59:30 +0100 Subject: [PATCH 107/131] Update app.ini --- conf/app.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/app.ini b/conf/app.ini index 1a37330..eee21d7 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -44,7 +44,7 @@ ENABLE_REVERSE_PROXY_AUTO_REGISTERATION = false [mailer] ENABLED = true HOST = 127.0.0.1:25 -FROM = "Gitea" +FROM = "Gogs" SKIP_VERIFY = true [session] From d38f97b1670e7920b9b050926d8d14efee6a8027 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 14:16:27 +0100 Subject: [PATCH 108/131] Update app.ini --- conf/app.ini | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/conf/app.ini b/conf/app.ini index eee21d7..90cdfc3 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -1,31 +1,35 @@ ;https://github.com/gogits/gogs/blob/master/conf/app.ini -APP_NAME = Gogs +BRAND_NAME = Gogs RUN_USER = __APP__ RUN_MODE = prod [server] +EXTERNAL_URL = https://__URL__/ DOMAIN = __DOMAIN__ HTTP_PORT = __PORT__ -EXTERNAL_URL = https://__URL__/ HTTP_ADDR = 127.0.0.1 OFFLINE_MODE = false DISABLE_SSH = false SSH_PORT = 22 APP_DATA_PATH = __DATADIR__/data LANDING_PAGE = explore +CERT_FILE = /etc/yunohost/certs/__DOMAIN__/crt.pem +KEY_FILE = /etc/yunohost/certs/__DOMAIN__/key.pem [repository] ROOT = __DATADIR__/repositories FORCE_PRIVATE = false +[repository.editor] +LINE_WRAP_EXTENSIONS = .txt,.md,.markdown,.mdown,.mkd +PREVIEWABLE_FILE_MODES = markdown + [database] DB_TYPE = mysql HOST = 127.0.0.1:3306 NAME = __DB_NAME__ USER = __DB_USER__ PASSWD = __DB_PWD__ -SSL_MODE = disable -PATH = data/gogs.db [security] INSTALL_LOCK = true @@ -41,7 +45,7 @@ REQUIRE_SIGNIN_VIEW = false ENABLE_REVERSE_PROXY_AUTHENTICATION = false ENABLE_REVERSE_PROXY_AUTO_REGISTERATION = false -[mailer] +[email] ENABLED = true HOST = 127.0.0.1:25 FROM = "Gogs" From 39f7c2a7328f1a63ae7fa7dcf032d196d61c072f Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 15:13:19 +0100 Subject: [PATCH 109/131] Update app.ini --- conf/app.ini | 564 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 542 insertions(+), 22 deletions(-) diff --git a/conf/app.ini b/conf/app.ini index 90cdfc3..2d1d897 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -1,75 +1,595 @@ ;https://github.com/gogits/gogs/blob/master/conf/app.ini +<<<<<<< Updated upstream BRAND_NAME = Gogs +======= + +; The brand name of the application, can be your company or team name. +BRAND_NAME = Gogs +; The system user who should be running the applications. It has no effect on Windows, +; otherwise, it should match the value of $USER environment variable. +>>>>>>> Stashed changes RUN_USER = __APP__ +; The running mode of the application, can be either "dev", "prod" or "test". RUN_MODE = prod [server] +<<<<<<< Updated upstream EXTERNAL_URL = https://__URL__/ DOMAIN = __DOMAIN__ HTTP_PORT = __PORT__ +======= +; The public-facing URL for the application. +EXTERNAL_URL = https://__URL__/ +; The public-facing domain name for the application. +DOMAIN = __DOMAIN__ +; The protocol that is used to serve direct traffic to the application. +; Currently supports "http", "https", "fcgi" and "unix". +PROTOCOL = http +; The address to be listened by the application. +>>>>>>> Stashed changes HTTP_ADDR = 127.0.0.1 +; The port number to be listened by the application. +HTTP_PORT = __PORT__ +; Generate steps: +; $ ./gogs cert -ca=true -duration=8760h0m0s -host=myhost.example.com +; +; Or from a .pfx file exported from the Windows certificate store (do +; not forget to export the private key): +; $ openssl pkcs12 -in cert.pfx -out cert.pem -nokeys +; $ openssl pkcs12 -in cert.pfx -out key.pem -nocerts -nodes +CERT_FILE = custom/https/cert.pem +KEY_FILE = custom/https/key.pem +; The minimum allowed TLS version, currently supports "TLS10", "TLS11", "TLS12", and "TLS13". +TLS_MIN_VERSION = TLS12 +; File permission when serve traffic via Unix domain socket. +UNIX_SOCKET_PERMISSION = 666 +; Local (DMZ) URL for workers (e.g. SSH update) accessing web service. +; In most cases you do not need to change the default value. +; Alter it only if your SSH server node is not the same as HTTP node. +LOCAL_ROOT_URL = %(PROTOCOL)s://%(HTTP_ADDR)s:%(HTTP_PORT)s/ + +; Whether to disable using CDN for static files regardless. OFFLINE_MODE = false +; Whether to disable logging in router. +DISABLE_ROUTER_LOG = true +; Whether to enable application level GZIP compression. +ENABLE_GZIP = false + +; The path for storing application specific data. +APP_DATA_PATH = __DATADIR__/data +; Whether to enable to load assets (i.e. "conf", "templates", "public") from disk instead of embedded bindata. +LOAD_ASSETS_FROM_DISK = false + +; The landing page URL for anonymous users, the value should not include +; subpath that is handled by the reverse proxy. +LANDING_URL = / + +; Whether to disable SSH access to the application entirely. DISABLE_SSH = false +; The domain name to be exposed in SSH clone URL. +SSH_DOMAIN = %(DOMAIN)s +; The port number to be exposed in SSH clone URL. SSH_PORT = 22 +<<<<<<< Updated upstream APP_DATA_PATH = __DATADIR__/data LANDING_PAGE = explore CERT_FILE = /etc/yunohost/certs/__DOMAIN__/crt.pem KEY_FILE = /etc/yunohost/certs/__DOMAIN__/key.pem +======= +; The path of SSH root directory, default is "$HOME/.ssh". +SSH_ROOT_PATH = +; The path to ssh-keygen, default is "ssh-keygen" and let shell find out which one to call. +SSH_KEYGEN_PATH = ssh-keygen +; The directory to create temporary files when test a public key using ssh-keygen, +; default is the system temporary directory. +SSH_KEY_TEST_PATH = +; Whether to check minimum public key size with corresponding type. +MINIMUM_KEY_SIZE_CHECK = false +; Whether to rewrite "~/.ssh/authorized_keys" file at start, ignored when use builtin SSH server. +REWRITE_AUTHORIZED_KEYS_AT_START = false +; Whether to start a builtin SSH server. +START_SSH_SERVER = false +; The network interface for builtin SSH server to listen on. +SSH_LISTEN_HOST = 0.0.0.0 +; The port number for builtin SSH server to listen on. +SSH_LISTEN_PORT = %(SSH_PORT)s +; The list of accepted ciphers for connections to builtin SSH server. +SSH_SERVER_CIPHERS = aes128-ctr, aes192-ctr, aes256-ctr, aes128-gcm@openssh.com, arcfour256, arcfour128 +; The list of accepted MACs for connections to builtin SSH server. +SSH_SERVER_MACS = hmac-sha2-256-etm@openssh.com, hmac-sha2-256, hmac-sha1 + +; Define allowed algorithms and their minimum key length (use -1 to disable a type). +[ssh.minimum_key_sizes] +ED25519 = 256 +ECDSA = 256 +RSA = 2048 +DSA = 1024 +>>>>>>> Stashed changes [repository] +; The root path for storing managed repositories, default is "~/gogs-repositories" ROOT = __DATADIR__/repositories +; The script type server supports, sometimes could be "sh". +SCRIPT_TYPE = bash +; Default ANSI charset for an unrecognized charset. +ANSI_CHARSET = +; Whether to force every new repository to be private. FORCE_PRIVATE = false +; The global limit of number of repositories a user can create, -1 means no limit. +MAX_CREATION_LIMIT = -1 +; Preferred Licenses to place at the top of the list. +; Name must match file name in "conf/license" or "custom/conf/license". +PREFERRED_LICENSES = Apache License 2.0, MIT License +; Whether to disable Git interaction with repositories via HTTP/HTTPS protocol. +DISABLE_HTTP_GIT = false +; Whether to enable ability to migrate repository by server local path. +ENABLE_LOCAL_PATH_MIGRATION = false +; Whether to enable render mode for raw file. There are potential security risks. +ENABLE_RAW_FILE_RENDER_MODE = false +; The maximum number of goroutines that can be run at the same time for a single +; fetch request. Usually, the value depend of how many CPU (cores) you have. If +; the value is non-positive, it matches the number of CPUs available to the application. +COMMITS_FETCH_CONCURRENCY = 0 + +[repository.editor] +; List of file extensions that should have line wraps in the CodeMirror editor. +; Separate extensions with a comma. +LINE_WRAP_EXTENSIONS = .txt,.md,.markdown,.mdown,.mkd +; Valid file modes that have a preview API associated with them, such as "/api/v1/markdown". +; Separate values by commas. Preview tab in edit mode won't show if the file extension doesn't match. +PREVIEWABLE_FILE_MODES = markdown + +[repository.upload] +; Whether to enable repository file uploads. +ENABLED = true +; The path to temporarily store uploads (content under this path gets wiped out on every start). +TEMP_PATH = __DATADIR__/data/tmp/uploads +; File types that are allowed to be uploaded, e.g. "image/jpeg|image/png". Leave empty to allow any file type. +ALLOWED_TYPES = +; The maximum size of each file in MB. +FILE_MAX_SIZE = 3 +; The maximum number of files per upload. +MAX_FILES = 5 [repository.editor] LINE_WRAP_EXTENSIONS = .txt,.md,.markdown,.mdown,.mkd PREVIEWABLE_FILE_MODES = markdown [database] -DB_TYPE = mysql +; The database backend, either "postgres", "mysql" "sqlite3" or "mssql". +; You can connect to TiDB with MySQL protocol. +TYPE = mysql HOST = 127.0.0.1:3306 NAME = __DB_NAME__ USER = __DB_USER__ +<<<<<<< Updated upstream PASSWD = __DB_PWD__ +======= +PASSWORD = __DB_PWD__ +; For "postgres" only, either "disable", "require" or "verify-full". +SSL_MODE = disable +; For "sqlite3" only, make sure to use absolute path. +PATH = data/gogs.db +; The maximum open connections of the pool. +MAX_OPEN_CONNS = 30 +; The maximum idle connections of the pool. +MAX_IDLE_CONNS = 30 +>>>>>>> Stashed changes [security] +; Whether to show the install page, set this to "true" to bypass it. INSTALL_LOCK = true +; The secret to encrypt cookie values, 2FA code, etc. +; !!CHANGE THIS TO KEEP YOUR USER DATA SAFE!! SECRET_KEY = __KEY__ -REVERSE_PROXY_AUTHENTICATION_USER = REMOTE_USER - -[service] -REGISTER_EMAIL_CONFIRM = false -ENABLE_NOTIFY_MAIL = true -DISABLE_REGISTRATION = true -ENABLE_CAPTCHA = false -REQUIRE_SIGNIN_VIEW = false -ENABLE_REVERSE_PROXY_AUTHENTICATION = false -ENABLE_REVERSE_PROXY_AUTO_REGISTERATION = false +; The days remembered for auto-login. +LOGIN_REMEMBER_DAYS = 7 +; The cookie name to store auto-login information. +COOKIE_REMEMBER_NAME = gogs_incredible +; The cookie name to store logged in username. +COOKIE_USERNAME = gogs_awesome +; Whether to set secure cookie. +COOKIE_SECURE = false +; Whether to set cookie to indicate user login status. +ENABLE_LOGIN_STATUS_COOKIE = false +; The cookie name to store user login status. +LOGIN_STATUS_COOKIE_NAME = login_status [email] +<<<<<<< Updated upstream +======= +; Whether to enable the email service. +>>>>>>> Stashed changes ENABLED = true +; The prefix prepended to the subject line. +SUBJECT_PREFIX = `[%(BRAND_NAME)s] ` +; The SMTP server with its port, e.g. smtp.mailgun.org:587, smtp.gmail.com:587, smtp.qq.com:465 +; If the port ends is "465", SMTPS will be used. Using STARTTLS on port 587 is recommended per RFC 6409. +; If the server supports STARTTLS it will always be used. HOST = 127.0.0.1:25 +<<<<<<< Updated upstream FROM = "Gogs" +======= +; The email from address (RFC 5322). This can be just an email address, or the `"Name" ` format. +FROM = "Gogs" +; The login user. +USER = +; The login password. +PASSWORD = + +; Whether to disable HELO operation when the hostname is different. +DISABLE_HELO = +; The custom hostname for HELO operation, default is from system. +HELO_HOSTNAME = + +; Whether to skip verifying the certificate of the server. Only use this for self-signed certificates. +>>>>>>> Stashed changes SKIP_VERIFY = true +; Whether to use client certificates. +USE_CERTIFICATE = false +CERT_FILE = custom/email/cert.pem +KEY_FILE = custom/email/key.pem + +; Whether to use "text/plain" as content format. +USE_PLAIN_TEXT = false +; Whether to attach a plaintext alternative to the MIME message while sending HTML emails. +; It is used to support older mail clients and make spam filters happier. +ADD_PLAIN_TEXT_ALT = false + +[auth] +; The valid duration of activate code in minutes. +ACTIVATE_CODE_LIVES = 180 +; The valid duration of reset password code in minutes. +RESET_PASSWORD_CODE_LIVES = 180 +; Whether to require email confirmation for adding new email addresses. +; Enable this option will also require user to confirm the email for registration. +REQUIRE_EMAIL_CONFIRMATION = false +; Whether to disallow anonymous users visiting the site. +REQUIRE_SIGNIN_VIEW = false +; Whether to disable self-registration. When disabled, accounts would have to be created by admins. +DISABLE_REGISTRATION = true +; Whether to enable captcha validation for registration +ENABLE_REGISTRATION_CAPTCHA = true + +; Whether to enable reverse proxy authentication via HTTP header. +ENABLE_REVERSE_PROXY_AUTHENTICATION = false +; Whether to automatically create new users for reverse proxy authentication. +ENABLE_REVERSE_PROXY_AUTO_REGISTRATION = false +; The HTTP header used as username for reverse proxy authentication. +REVERSE_PROXY_AUTHENTICATION_HEADER = X-WEBAUTH-USER + + +[user] +; Whether to enable email notifications for users. +ENABLE_EMAIL_NOTIFICATION = false [session] +; The session provider, either "memory", "file", or "redis". PROVIDER = memory +; The configuration for respective provider: +; - memory: does not need any config yet +; - file: session file path, e.g. `data/sessions` +; - redis: network=tcp,addr=:6379,password=macaron,db=0,pool_size=100,idle_timeout=180 +PROVIDER_CONFIG = data/sessions +; The cookie name to store the session identifier. +COOKIE_NAME = i_like_gogs +; Whether to set cookie in HTTPS only. +COOKIE_SECURE = false +; The GC interval in seconds for session data. +GC_INTERVAL = 3600 +; The maximum life time in seconds for a session. +MAX_LIFE_TIME = 86400 +; The cookie name for CSRF token. +CSRF_COOKIE_NAME = _csrf + +[cache] +; The cache adapter, either "memory", "redis", or "memcache". +ADAPTER = memory +; For "memory" only, GC interval in seconds. +INTERVAL = 60 +; For "redis" and "memcache", connection host address: +; - redis: network=tcp,addr=:6379,password=macaron,db=0,pool_size=100,idle_timeout=180 +; - memcache: `127.0.0.1:11211` +HOST = + +[http] +; The value for "Access-Control-Allow-Origin" header, default is not to present. +ACCESS_CONTROL_ALLOW_ORIGIN = + +[lfs] +; The storage backend for uploading new objects. +STORAGE = local +; The root path to store LFS objects on local file system. +OBJECTS_PATH = data/lfs-objects + +[attachment] +; Whether to enabled upload attachments in general. +ENABLED = true +; The path to store attachments on the file system. +PATH = data/attachments +; File types that are allowed to be uploaded, e.g. "image/jpeg|image/png". Leave empty to allow any file type. +ALLOWED_TYPES = image/jpeg|image/png +; The maximum size of each file in MB. +MAX_SIZE = 4 +; The maximum number of files per upload. +MAX_FILES = 5 + +[release.attachment] +; Whether to enabled upload attachments for releases. +ENABLED = true +; File types that are allowed to be uploaded, e.g. "image/jpeg|image/png". Leave empty to allow any file type. +ALLOWED_TYPES = */* +; The maximum size of each file in MB. +MAX_SIZE = 32 +; The maximum number of files per upload. +MAX_FILES = 10 + +[time] +; Specifies the format for fully outputed dates. +; Values should be one of the following: +; ANSIC, UnixDate, RubyDate, RFC822, RFC822Z, RFC850, RFC1123, RFC1123Z, RFC3339, RFC3339Nano, Kitchen, Stamp, StampMilli, StampMicro and StampNano. +; For more information about the format see http://golang.org/pkg/time/#pkg-constants. +FORMAT = RFC1123 [picture] +; The path to store user avatars on the file system. AVATAR_UPLOAD_PATH = __DATADIR__/data/avatars +; The path to store repository avatars on the file system. +REPOSITORY_AVATAR_UPLOAD_PATH = __DATADIR__/data/repo-avatars +; Chinese users can use a custom avatar source, such as http://cn.gravatar.com/avatar/. +GRAVATAR_SOURCE = gravatar +; Whether to disable Gravatar, this value will be forced to be true in offline mode. +DISABLE_GRAVATAR = false +; Whether to enable federated avatar lookup uses DNS to discover avatar associated +; with emails, see https://www.libravatar.org for details. +; This value will be forced to be false in offline mode or when Gravatar is disabled. +ENABLE_FEDERATED_AVATAR = false +[markdown] +; Whether to enable hard line break extension. +ENABLE_HARD_LINE_BREAK = false +; The list of custom URL schemes that are allowed as links when rendering Markdown. +; For example, "git" (for "git://") and "magnet" (for "magnet://"). +CUSTOM_URL_SCHEMES = +; The list of file extensions that should be rendered/edited as Markdown. +; Separate extensions with a comma. To render files with no extension as markdown, just put a comma. +FILE_EXTENSIONS = .md,.markdown,.mdown,.mkd + +[smartypants] +; Whether to enable the Smartypants extension. +ENABLED = false +FRACTIONS = true +DASHES = true +LATEX_DASHES = true +ANGLED_QUOTES = true + +[admin] +; Whether to disable regular (non-admin) users to create organizations. +DISABLE_REGULAR_ORG_CREATION = false + +[webhook] +; The list of enabled types for users to use, can be "gogs", "slack", "discord", "dingtalk". +TYPES = gogs, slack, discord, dingtalk +; Deliver timeout in seconds. +DELIVER_TIMEOUT = 15 +; Whether to allow insecure certification. +SKIP_TLS_VERIFY = false +; The number of history information in each page. +PAGING_NUM = 10 + +; General settings of loggers. [log] -MODE = file -LEVEL = Info -ROOT_PATH = /var/log/__APP__ +; The root path for all log files, default is "log/" subdirectory. +ROOT_PATH =/var/log/__APP__ +; Can be "console", "file", "slack" and "discord". +; Use comma to separate multiple modes, e.g. "console, file" +MODE = file +; Buffer length of channel, keep it as it is if you don't know what it is. +BUFFER_LEN = 100 +; Either "Trace", "Info", "Warn", "Error", "Fatal", default is "Trace" +LEVEL = Warn -REDIRECT_MACARON_LOG= true -MACARON = file +; For "console" mode only +[log.console] +; Comment out to inherit +; LEVEL = -ROUTER_LOG_LEVEL = Warn -ROUTER = file +; For "file" mode only +[log.file] +; Comment out to inherit +; LEVEL = +; Whether to enable automated log rotate (switch of following options). +LOG_ROTATE = true +; Whether to segment log files daily. +DAILY_ROTATE = true +; The maximum size shift of single file, default is 28 means 1 << 28 = 256MB. +MAX_SIZE_SHIFT = 28 +; The maximum number of lines of single file. +MAX_LINES = 1000000 +; The expired days of log file (delete after max days). +MAX_DAYS = 7 -ENABLE_ACCESS_LOG = Warn -ACCESS = file +; For "slack" mode only +[log.slack] +; Comment out to inherit +; LEVEL = +; Webhook URL +URL = -ENABLE_XORM_LOG = Warn -XORM = file +[log.discord] +; Comment out to inherit +; LEVEL = +; Webhook URL +URL = +; The username to be displayed in notification. +USERNAME = %(BRAND_NAME)s + +[log.xorm] +; Enable file rotation +ROTATE = true +; Rotate every day +ROTATE_DAILY = true +; Rotate once file size excesses x MB +MAX_SIZE = 100 +; Maximum days to keep logger files +MAX_DAYS = 3 + +[log.gorm] +; Whether to enable file rotation. +ROTATE = true +; Whether to rotate file every day. +ROTATE_DAILY = true +; The maximum file size in MB before next rotate. +MAX_SIZE = 100 +; The maximum days to keep files. +MAX_DAYS = 3 + +[cron] +; Enable running cron tasks periodically. +ENABLED = true +; Run cron tasks when Gogs starts. +RUN_AT_START = false + +[cron.update_mirrors] +; Defines how often the mirror syncer checks if any mirror needs to be synchronized (based on the mirror update interval). +SCHEDULE = @every 10m + +; Repository health check +[cron.repo_health_check] +SCHEDULE = @every 24h +TIMEOUT = 60s +; Arguments for command 'git fsck', e.g. "--unreachable --tags" +; see more on http://git-scm.com/docs/git-fsck/1.7.5 +ARGS = + +; Check repository statistics +[cron.check_repo_stats] +RUN_AT_START = true +SCHEDULE = @every 24h + +; Cleanup repository archives +[cron.repo_archive_cleanup] +RUN_AT_START = false +SCHEDULE = @every 24h +; Time duration to check if archive should be cleaned +OLDER_THAN = 24h + +[git] +; Disables highlight of added and removed changes +DISABLE_DIFF_HIGHLIGHT = false +; Max number of files shown in diff view +MAX_GIT_DIFF_FILES = 100 +; Max number of lines allowed of a single file in diff view +MAX_GIT_DIFF_LINES = 1000 +; Max number of characters of a line allowed in diff view +MAX_GIT_DIFF_LINE_CHARACTERS = 2000 +; Arguments for command 'git gc', e.g. "--aggressive --auto" +; see more on http://git-scm.com/docs/git-gc/1.7.5 +GC_ARGS = + +; Operation timeout in seconds +[git.timeout] +MIGRATE = 600 +MIRROR = 300 +CLONE = 300 +PULL = 300 +DIFF = 60 +GC = 60 + +[mirror] +; Defines the default interval (in hours) until the next sync for a mirror (after a successful mirror sync). +; It can be overridden individually for each mirror repository in the settings. +DEFAULT_INTERVAL = 8 + +[api] +; Max number of items will response in a page +MAX_RESPONSE_ITEMS = 50 + +[ui] +; Number of repositories that are showed in one explore page +EXPLORE_PAGING_NUM = 20 +; Number of issues that are showed in one page +ISSUE_PAGING_NUM = 10 +; Number of maximum commits showed in one activity feed +FEED_MAX_COMMIT_NUM = 5 +; Value of "theme-color" meta tag, used by Android >= 5.0 +; An invalid color like "none" or "disable" will have the default style +; More info: https://developers.google.com/web/updates/2014/11/Support-for-theme-color-in-Chrome-39-for-Android +THEME_COLOR_META_TAG = `#ff5343` +; Max size in bytes of files to be displayed (default is 8MB) +MAX_DISPLAY_FILE_SIZE = 8388608 + +[ui.admin] +; Number of users that are showed in one page +USER_PAGING_NUM = 50 +; Number of repos that are showed in one page +REPO_PAGING_NUM = 50 +; Number of notices that are showed in one page +NOTICE_PAGING_NUM = 25 +; Number of organization that are showed in one page +ORG_PAGING_NUM = 50 + +[ui.user] +; Number of repos that are showed in one page +REPO_PAGING_NUM = 15 +; Number of news feeds that are showed in one page +NEWS_FEED_PAGING_NUM = 20 +; Number of commits that are showed in one page +COMMITS_PAGING_NUM = 30 + +[prometheus] +; Whether to enable Prometheus metrics. +ENABLED = false +; Whether to enable HTTP Basic Authentication to protect metrics data. +ENABLE_BASIC_AUTH = false +; The username for HTTP Basic Authentication. +BASIC_AUTH_USERNAME = +; The password for HTTP Basic Authentication. +BASIC_AUTH_PASSWORD = + +; Extension mapping to highlight class +; e.g. .toml=ini +[highlight.mapping] + +[i18n] +LANGS = en-US,zh-CN,zh-HK,zh-TW,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT,fi-FI,tr-TR,cs-CZ,sr-SP,sv-SE,ko-KR,gl-ES,uk-UA,en-GB,hu-HU,sk-SK,id-ID,fa-IR,vi-VN,pt-PT, mn-MN +NAMES = English,简体中文,繁體中文(香港),繁體中文(臺灣),Deutsch,français,Nederlands,latviešu,русский,日本語,español,português do Brasil,polski,български,italiano,suomi,Türkçe,čeština,српски,svenska,한국어,galego,українська,English (United Kingdom),Magyar,Slovenčina,Indonesian,Persian,Vietnamese,Português,Монгол + +; Used for datetimepicker +[i18n.datelang] +en-US = en +zh-CN = zh +zh-HK = zh-TW +zh-TW = zh-TW +de-DE = de +fr-FR = fr +nl-NL = nl +lv-LV = lv +ru-RU = ru +ja-JP = ja +es-ES = es +pt-BR = pt-BR +pl-PL = pl +bg-BG = bg +it-IT = it +fi-FI = fi +tr-TR = tr +cs-CZ = cs-CZ +sr-SP = sr +sv-SE = sv +ko-KR = ko +gl-ES = gl +uk-UA = uk +en-GB = en-GB +hu-HU = hu +sk-SK = sk +id-ID = id +fa-IR = fa +vi-VN = vi +pt-PT = pt +mn-MN = mn + +[other] +SHOW_FOOTER_BRANDING = false +; Show time of template execution in the footer +SHOW_FOOTER_TEMPLATE_LOAD_TIME = true From e0a8e7af55ff54b6d6b9ad22b82e245e4ddb8b18 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 15:18:35 +0100 Subject: [PATCH 110/131] Update app.ini --- conf/app.ini | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/conf/app.ini b/conf/app.ini index 2d1d897..7e4069c 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -1,23 +1,14 @@ ;https://github.com/gogits/gogs/blob/master/conf/app.ini -<<<<<<< Updated upstream -BRAND_NAME = Gogs -======= ; The brand name of the application, can be your company or team name. BRAND_NAME = Gogs ; The system user who should be running the applications. It has no effect on Windows, ; otherwise, it should match the value of $USER environment variable. ->>>>>>> Stashed changes RUN_USER = __APP__ ; The running mode of the application, can be either "dev", "prod" or "test". RUN_MODE = prod [server] -<<<<<<< Updated upstream -EXTERNAL_URL = https://__URL__/ -DOMAIN = __DOMAIN__ -HTTP_PORT = __PORT__ -======= ; The public-facing URL for the application. EXTERNAL_URL = https://__URL__/ ; The public-facing domain name for the application. @@ -26,7 +17,6 @@ DOMAIN = __DOMAIN__ ; Currently supports "http", "https", "fcgi" and "unix". PROTOCOL = http ; The address to be listened by the application. ->>>>>>> Stashed changes HTTP_ADDR = 127.0.0.1 ; The port number to be listened by the application. HTTP_PORT = __PORT__ @@ -70,12 +60,6 @@ DISABLE_SSH = false SSH_DOMAIN = %(DOMAIN)s ; The port number to be exposed in SSH clone URL. SSH_PORT = 22 -<<<<<<< Updated upstream -APP_DATA_PATH = __DATADIR__/data -LANDING_PAGE = explore -CERT_FILE = /etc/yunohost/certs/__DOMAIN__/crt.pem -KEY_FILE = /etc/yunohost/certs/__DOMAIN__/key.pem -======= ; The path of SSH root directory, default is "$HOME/.ssh". SSH_ROOT_PATH = ; The path to ssh-keygen, default is "ssh-keygen" and let shell find out which one to call. @@ -104,7 +88,6 @@ ED25519 = 256 ECDSA = 256 RSA = 2048 DSA = 1024 ->>>>>>> Stashed changes [repository] ; The root path for storing managed repositories, default is "~/gogs-repositories" @@ -162,9 +145,6 @@ TYPE = mysql HOST = 127.0.0.1:3306 NAME = __DB_NAME__ USER = __DB_USER__ -<<<<<<< Updated upstream -PASSWD = __DB_PWD__ -======= PASSWORD = __DB_PWD__ ; For "postgres" only, either "disable", "require" or "verify-full". SSL_MODE = disable @@ -174,7 +154,6 @@ PATH = data/gogs.db MAX_OPEN_CONNS = 30 ; The maximum idle connections of the pool. MAX_IDLE_CONNS = 30 ->>>>>>> Stashed changes [security] ; Whether to show the install page, set this to "true" to bypass it. @@ -196,10 +175,7 @@ ENABLE_LOGIN_STATUS_COOKIE = false LOGIN_STATUS_COOKIE_NAME = login_status [email] -<<<<<<< Updated upstream -======= ; Whether to enable the email service. ->>>>>>> Stashed changes ENABLED = true ; The prefix prepended to the subject line. SUBJECT_PREFIX = `[%(BRAND_NAME)s] ` @@ -207,9 +183,6 @@ SUBJECT_PREFIX = `[%(BRAND_NAME)s] ` ; If the port ends is "465", SMTPS will be used. Using STARTTLS on port 587 is recommended per RFC 6409. ; If the server supports STARTTLS it will always be used. HOST = 127.0.0.1:25 -<<<<<<< Updated upstream -FROM = "Gogs" -======= ; The email from address (RFC 5322). This can be just an email address, or the `"Name" ` format. FROM = "Gogs" ; The login user. @@ -223,7 +196,6 @@ DISABLE_HELO = HELO_HOSTNAME = ; Whether to skip verifying the certificate of the server. Only use this for self-signed certificates. ->>>>>>> Stashed changes SKIP_VERIFY = true ; Whether to use client certificates. USE_CERTIFICATE = false @@ -258,7 +230,6 @@ ENABLE_REVERSE_PROXY_AUTO_REGISTRATION = false ; The HTTP header used as username for reverse proxy authentication. REVERSE_PROXY_AUTHENTICATION_HEADER = X-WEBAUTH-USER - [user] ; Whether to enable email notifications for users. ENABLE_EMAIL_NOTIFICATION = false From 5aecc06dfc1ceaf714ac9b8715d6c14ec8fcf685 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 15:24:10 +0100 Subject: [PATCH 111/131] Update app.ini --- conf/app.ini | 38 -------------------------------------- 1 file changed, 38 deletions(-) diff --git a/conf/app.ini b/conf/app.ini index 7e4069c..6b0912f 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -522,44 +522,6 @@ BASIC_AUTH_PASSWORD = ; e.g. .toml=ini [highlight.mapping] -[i18n] -LANGS = en-US,zh-CN,zh-HK,zh-TW,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT,fi-FI,tr-TR,cs-CZ,sr-SP,sv-SE,ko-KR,gl-ES,uk-UA,en-GB,hu-HU,sk-SK,id-ID,fa-IR,vi-VN,pt-PT, mn-MN -NAMES = English,简体中文,繁體中文(香港),繁體中文(臺灣),Deutsch,français,Nederlands,latviešu,русский,日本語,español,português do Brasil,polski,български,italiano,suomi,Türkçe,čeština,српски,svenska,한국어,galego,українська,English (United Kingdom),Magyar,Slovenčina,Indonesian,Persian,Vietnamese,Português,Монгол - -; Used for datetimepicker -[i18n.datelang] -en-US = en -zh-CN = zh -zh-HK = zh-TW -zh-TW = zh-TW -de-DE = de -fr-FR = fr -nl-NL = nl -lv-LV = lv -ru-RU = ru -ja-JP = ja -es-ES = es -pt-BR = pt-BR -pl-PL = pl -bg-BG = bg -it-IT = it -fi-FI = fi -tr-TR = tr -cs-CZ = cs-CZ -sr-SP = sr -sv-SE = sv -ko-KR = ko -gl-ES = gl -uk-UA = uk -en-GB = en-GB -hu-HU = hu -sk-SK = sk -id-ID = id -fa-IR = fa -vi-VN = vi -pt-PT = pt -mn-MN = mn - [other] SHOW_FOOTER_BRANDING = false ; Show time of template execution in the footer From ac54a9aecd57044b174b014beeba28b14db5b555 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 15:31:28 +0100 Subject: [PATCH 112/131] Update app.ini --- conf/app.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/app.ini b/conf/app.ini index 6b0912f..40ec0e3 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -15,7 +15,7 @@ EXTERNAL_URL = https://__URL__/ DOMAIN = __DOMAIN__ ; The protocol that is used to serve direct traffic to the application. ; Currently supports "http", "https", "fcgi" and "unix". -PROTOCOL = http +PROTOCOL = https ; The address to be listened by the application. HTTP_ADDR = 127.0.0.1 ; The port number to be listened by the application. @@ -52,7 +52,7 @@ LOAD_ASSETS_FROM_DISK = false ; The landing page URL for anonymous users, the value should not include ; subpath that is handled by the reverse proxy. -LANDING_URL = / +LANDING_URL = explore ; Whether to disable SSH access to the application entirely. DISABLE_SSH = false From d68e905a95bf5d34fa376f24a4a4f03256260096 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 15:32:23 +0100 Subject: [PATCH 113/131] Update app.ini --- conf/app.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/app.ini b/conf/app.ini index 40ec0e3..99303cf 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -277,7 +277,7 @@ OBJECTS_PATH = data/lfs-objects ; Whether to enabled upload attachments in general. ENABLED = true ; The path to store attachments on the file system. -PATH = data/attachments +PATH = __DATADIR__/data/attachments ; File types that are allowed to be uploaded, e.g. "image/jpeg|image/png". Leave empty to allow any file type. ALLOWED_TYPES = image/jpeg|image/png ; The maximum size of each file in MB. From 36847dd8b111e1ea4b75f609b62e2481784dd804 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 15:34:06 +0100 Subject: [PATCH 114/131] Update app.ini --- conf/app.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/app.ini b/conf/app.ini index 99303cf..39006db 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -271,7 +271,7 @@ ACCESS_CONTROL_ALLOW_ORIGIN = ; The storage backend for uploading new objects. STORAGE = local ; The root path to store LFS objects on local file system. -OBJECTS_PATH = data/lfs-objects +OBJECTS_PATH = __DATADIR__/data/lfs-objects [attachment] ; Whether to enabled upload attachments in general. From aee0ebee0cadc726e48941bf9d84179dce588e4f Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 15:36:57 +0100 Subject: [PATCH 115/131] Update app.ini --- conf/app.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/app.ini b/conf/app.ini index 39006db..4019c83 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -27,8 +27,8 @@ HTTP_PORT = __PORT__ ; not forget to export the private key): ; $ openssl pkcs12 -in cert.pfx -out cert.pem -nokeys ; $ openssl pkcs12 -in cert.pfx -out key.pem -nocerts -nodes -CERT_FILE = custom/https/cert.pem -KEY_FILE = custom/https/key.pem +CERT_FILE = /etc/yunohost/certs/__DOMAIN__/crt.pem +KEY_FILE = /etc/yunohost/certs/__DOMAIN__/key.pem ; The minimum allowed TLS version, currently supports "TLS10", "TLS11", "TLS12", and "TLS13". TLS_MIN_VERSION = TLS12 ; File permission when serve traffic via Unix domain socket. From ebce2ad04acfeef5a5194d556edc355d0664187d Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 15:38:07 +0100 Subject: [PATCH 116/131] Update app.ini --- conf/app.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.ini b/conf/app.ini index 4019c83..9ad9df8 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -15,7 +15,7 @@ EXTERNAL_URL = https://__URL__/ DOMAIN = __DOMAIN__ ; The protocol that is used to serve direct traffic to the application. ; Currently supports "http", "https", "fcgi" and "unix". -PROTOCOL = https +PROTOCOL = http ; The address to be listened by the application. HTTP_ADDR = 127.0.0.1 ; The port number to be listened by the application. @@ -27,8 +27,8 @@ HTTP_PORT = __PORT__ ; not forget to export the private key): ; $ openssl pkcs12 -in cert.pfx -out cert.pem -nokeys ; $ openssl pkcs12 -in cert.pfx -out key.pem -nocerts -nodes -CERT_FILE = /etc/yunohost/certs/__DOMAIN__/crt.pem -KEY_FILE = /etc/yunohost/certs/__DOMAIN__/key.pem +CERT_FILE = custom/https/cert.pem +KEY_FILE = custom/https/key.pem ; The minimum allowed TLS version, currently supports "TLS10", "TLS11", "TLS12", and "TLS13". TLS_MIN_VERSION = TLS12 ; File permission when serve traffic via Unix domain socket. From ae28d4d0c2d0c79cb57e51bec63ea7169a65ddb9 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 15:41:58 +0100 Subject: [PATCH 117/131] Update app.ini --- conf/app.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/app.ini b/conf/app.ini index 9ad9df8..9cf2d55 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -52,7 +52,7 @@ LOAD_ASSETS_FROM_DISK = false ; The landing page URL for anonymous users, the value should not include ; subpath that is handled by the reverse proxy. -LANDING_URL = explore +LANDING_URL = / ; Whether to disable SSH access to the application entirely. DISABLE_SSH = false From cc10af5c86d9669766c965ad963643ed1079da4e Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 15:49:51 +0100 Subject: [PATCH 118/131] Update app.ini --- conf/app.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/app.ini b/conf/app.ini index 9cf2d55..9ad9df8 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -52,7 +52,7 @@ LOAD_ASSETS_FROM_DISK = false ; The landing page URL for anonymous users, the value should not include ; subpath that is handled by the reverse proxy. -LANDING_URL = / +LANDING_URL = explore ; Whether to disable SSH access to the application entirely. DISABLE_SSH = false From 2a06126df0adacb6da77aba639ae4f4fc7a85d8a Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 15:52:43 +0100 Subject: [PATCH 119/131] Update app.ini --- conf/app.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/app.ini b/conf/app.ini index 9ad9df8..128719d 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -52,7 +52,7 @@ LOAD_ASSETS_FROM_DISK = false ; The landing page URL for anonymous users, the value should not include ; subpath that is handled by the reverse proxy. -LANDING_URL = explore +LANDING_URL = /explore ; Whether to disable SSH access to the application entirely. DISABLE_SSH = false From 2860c9a608924c438eb65e578d4ecf45183f307a Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 16:03:32 +0100 Subject: [PATCH 120/131] Update app.ini --- conf/app.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/app.ini b/conf/app.ini index 061c412..1a37330 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -6,7 +6,7 @@ RUN_MODE = prod [server] DOMAIN = __DOMAIN__ HTTP_PORT = __PORT__ -ROOT_URL = https://__URL__/ +EXTERNAL_URL = https://__URL__/ HTTP_ADDR = 127.0.0.1 OFFLINE_MODE = false DISABLE_SSH = false From 7446766082e4164e67a83e5083cac96516e64f9b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 16:04:15 +0100 Subject: [PATCH 121/131] Update app.ini --- conf/app.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/app.ini b/conf/app.ini index 1a37330..a8c1f00 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -23,7 +23,7 @@ DB_TYPE = mysql HOST = 127.0.0.1:3306 NAME = __DB_NAME__ USER = __DB_USER__ -PASSWD = __DB_PWD__ +PASSWORD = __DB_PWD__ SSL_MODE = disable PATH = data/gogs.db From 8fc715fbf438412d33d53cc53a405e86c40e696b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 16:20:10 +0100 Subject: [PATCH 122/131] Update app.ini --- conf/app.ini | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/conf/app.ini b/conf/app.ini index 128719d..c4bec87 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -134,10 +134,6 @@ FILE_MAX_SIZE = 3 ; The maximum number of files per upload. MAX_FILES = 5 -[repository.editor] -LINE_WRAP_EXTENSIONS = .txt,.md,.markdown,.mdown,.mkd -PREVIEWABLE_FILE_MODES = markdown - [database] ; The database backend, either "postgres", "mysql" "sqlite3" or "mssql". ; You can connect to TiDB with MySQL protocol. @@ -186,7 +182,7 @@ HOST = 127.0.0.1:25 ; The email from address (RFC 5322). This can be just an email address, or the `"Name" ` format. FROM = "Gogs" ; The login user. -USER = +USER = "Gogs" ; The login password. PASSWORD = From 74b7b55444af1cf96452e136d646a133064e3036 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 16:39:24 +0100 Subject: [PATCH 123/131] Update ldap.conf --- conf/ldap.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/ldap.conf b/conf/ldap.conf index 52ea4a3..d9449f6 100644 --- a/conf/ldap.conf +++ b/conf/ldap.conf @@ -2,7 +2,7 @@ # id = 1 type = ldap_bind_dn -name = Yunohost LDAP +name = YunoHost LDAP is_activated = true [config] From ae229db026afb1c32344ff51203450f5724fb5e4 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 16:46:39 +0100 Subject: [PATCH 124/131] Update install --- scripts/install | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/install b/scripts/install index de268c9..a44f234 100644 --- a/scripts/install +++ b/scripts/install @@ -103,10 +103,6 @@ ynh_app_setting_set --app=$app --key=datadir --value=$datadir mkdir -p $datadir -chmod 750 "$datadir" -chmod -R o-rwx "$datadir" -chown -R $app:www-data "$datadir" - repo_path="$datadir/repositories" data_path="$datadir/data" @@ -116,6 +112,10 @@ mkdir -p "$final_path/custom/conf/auth.d" mkdir -p "$datadir/data/avatars" mkdir -p "$datadir/data/attachments" +chmod 750 "$datadir" +chmod -R o-rwx "$datadir" +chown -R $app:www-data "$datadir" + #================================================= # MODIFY A CONFIG FILE #================================================= From 16b1a537d96a26b12c16c77b02738b7666a4d2bb Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 16:50:13 +0100 Subject: [PATCH 125/131] Update install --- scripts/install | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/scripts/install b/scripts/install index a44f234..14a969f 100644 --- a/scripts/install +++ b/scripts/install @@ -103,12 +103,9 @@ ynh_app_setting_set --app=$app --key=datadir --value=$datadir mkdir -p $datadir -repo_path="$datadir/repositories" -data_path="$datadir/data" - # create needed directories -mkdir -p "$final_path/data" mkdir -p "$final_path/custom/conf/auth.d" +mkdir -p "$datadir/data/repositories" mkdir -p "$datadir/data/avatars" mkdir -p "$datadir/data/attachments" From 5aa6695aa4ca6e3d537d6e06e12a516fa0a59177 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 17:31:20 +0100 Subject: [PATCH 126/131] Update manifest.json --- manifest.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index 03cde0a..fd78503 100644 --- a/manifest.json +++ b/manifest.json @@ -3,8 +3,8 @@ "id": "gogs", "packaging_format": 1, "description": { - "en": "Lightweight Git forge", - "fr": "Forge Git légère" + "en": "Lightweight self-hosted Git forge", + "fr": "Forge Git légère auto-hébergé" }, "version": "0.12.3~ynh1", "url": "http://gogs.io", @@ -51,6 +51,10 @@ { "name": "is_public", "type": "boolean", + "help": { + "en": "If enabled, Gogs will be accessible by people who do not have an account. This can be changed later via the webadmin.", + "fr": "Si cette case est cochée, Gogs sera accessible aux personnes n’ayant pas de compte. Vous pourrez changer ceci plus tard via la webadmin." + }, "default": true } ] From 6e19ca7c6d2d45087448b4b87a931762044eb0e1 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 18:17:29 +0100 Subject: [PATCH 127/131] Add language --- .github/workflows/updater.sh | 135 +++++++++++++++++++++++++++++++++++ conf/app.ini | 36 ++++++++++ 2 files changed, 171 insertions(+) create mode 100755 .github/workflows/updater.sh diff --git a/.github/workflows/updater.sh b/.github/workflows/updater.sh new file mode 100755 index 0000000..1db46d5 --- /dev/null +++ b/.github/workflows/updater.sh @@ -0,0 +1,135 @@ +#!/bin/bash + +#================================================= +# PACKAGE UPDATING HELPER +#================================================= + +# This script is meant to be run by GitHub Actions +# The YunoHost-Apps organisation offers a template Action to run this script periodically +# Since each app is different, maintainers can adapt its contents so as to perform +# automatic actions when a new upstream release is detected. + +# Remove this exit command when you are ready to run this Action +#exit 1 + +#================================================= +# FETCHING LATEST RELEASE AND ITS ASSETS +#================================================= + +# Fetching information +current_version=$(cat manifest.json | jq -j '.version|split("~")[0]') +repo=$(cat manifest.json | jq -j '.upstream.code|split("https://github.com/")[1]') +# Some jq magic is needed, because the latest upstream release is not always the latest version (e.g. security patches for older versions) +version=$(curl --silent "https://api.github.com/repos/$repo/releases" | jq -r '.[] | select( .prerelease != true ) | .tag_name' | sort -V | tail -1) +assets=($(curl --silent "https://api.github.com/repos/$repo/releases" | jq -r '[ .[] | select(.tag_name=="'$version'").assets[].browser_download_url ] | join(" ") | @sh' | tr -d "'")) + +# Later down the script, we assume the version has only digits and dots +# Sometimes the release name starts with a "v", so let's filter it out. +# You may need more tweaks here if the upstream repository has different naming conventions. +if [[ ${version:0:1} == "v" || ${version:0:1} == "V" ]]; then + version=${version:1} +fi + +# Setting up the environment variables +echo "Current version: $current_version" +echo "Latest release from upstream: $version" +echo "VERSION=$version" >> $GITHUB_ENV +# For the time being, let's assume the script will fail +echo "PROCEED=false" >> $GITHUB_ENV + +# Proceed only if the retrieved version is greater than the current one +if ! dpkg --compare-versions "$current_version" "lt" "$version" ; then + echo "::warning ::No new version available" + exit 0 +# Proceed only if a PR for this new version does not already exist +elif git ls-remote -q --exit-code --heads https://github.com/$GITHUB_REPOSITORY.git ci-auto-update-v$version ; then + echo "::warning ::A branch already exists for this update" + exit 0 +fi + +# Each release can hold multiple assets (e.g. binaries for different architectures, source code, etc.) +echo "${#assets[@]} available asset(s)" + +#================================================= +# UPDATE SOURCE FILES +#================================================= + +# Here we use the $assets variable to get the resources published in the upstream release. +# Here is an example for Grav, it has to be adapted in accordance with how the upstream releases look like. + +# Let's loop over the array of assets URLs +for asset_url in ${assets[@]}; do + +echo "Handling asset at $asset_url" + +# Assign the asset to a source file in conf/ directory +# Here we base the source file name upon a unique keyword in the assets url (admin vs. update) +# Leave $src empty to ignore the asset +case $asset_url in + *"gogs_"*"_linux_amd64.zip") + src="amd64" + ;; + *"gogs_"*"_linux_armv7.zip") + src="armhf" + ;; + *"gogs_"*"_linux_386.zip") + src="i386" + ;; +esac + +# If $src is not empty, let's process the asset +if [ ! -z "$src" ]; then + +# Create the temporary directory +tempdir="$(mktemp -d)" + +# Download sources and calculate checksum +filename=${asset_url##*/} +curl --silent -4 -L $asset_url -o "$tempdir/$filename" +checksum=$(sha256sum "$tempdir/$filename" | head -c 64) + +# Delete temporary directory +rm -rf $tempdir + +# Get extension +if [[ $filename == *.tar.gz ]]; then + extension=tar.gz +else + extension=${filename##*.} +fi + +# Rewrite source file +cat < conf/$src.src +SOURCE_URL=$asset_url +SOURCE_SUM=$checksum +SOURCE_SUM_PRG=sha256sum +SOURCE_FORMAT=$extension +SOURCE_IN_SUBDIR=true +EOT +echo "... conf/$src.src updated" + +else +echo "... asset ignored" +fi + +done + +#================================================= +# SPECIFIC UPDATE STEPS +#================================================= + +# Any action on the app's source code can be done. +# The GitHub Action workflow takes care of committing all changes after this script ends. + +#================================================= +# GENERIC FINALIZATION +#================================================= + +# Replace new version in manifest +echo "$(jq -s --indent 4 ".[] | .version = \"$version~ynh1\"" manifest.json)" > manifest.json + +# No need to update the README, yunohost-bot takes care of it + +# The Action will proceed only if the PROCEED environment variable is set to true +echo "PROCEED=true" >> $GITHUB_ENV +exit 0 diff --git a/conf/app.ini b/conf/app.ini index c4bec87..d463579 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -518,6 +518,42 @@ BASIC_AUTH_PASSWORD = ; e.g. .toml=ini [highlight.mapping] +[i18n] +LANGS = en-US,zh-CN,zh-HK,zh-TW,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT,fi-FI,tr-TR,cs-CZ,sr-SP,sv-SE,ko-KR,gl-ES,uk-UA,en-GB,hu-HU,sk-SK,id-ID,fa-IR,vi-VN +NAMES = English,简体中文,繁體中文(香港),繁體中文(臺灣),Deutsch,français,Nederlands,latviešu,русский,日本語,español,português do Brasil,polski,български,italiano,suomi,Türkçe,čeština,српски,svenska,한국어,galego,українська,English (United Kingdom),Magyar,Slovenčina,Indonesian,Persian,Vietnamese + +; Used for datetimepicker +[i18n.datelang] +en-US = en +zh-CN = zh +zh-HK = zh-TW +zh-TW = zh-TW +de-DE = de +fr-FR = fr +nl-NL = nl +lv-LV = lv +ru-RU = ru +ja-JP = ja +es-ES = es +pt-BR = pt-BR +pl-PL = pl +bg-BG = bg +it-IT = it +fi-FI = fi +tr-TR = tr +cs-CZ = cs-CZ +sr-SP = sr +sv-SE = sv +ko-KR = ko +gl-ES = gl +uk-UA = uk +en-GB = en-GB +hu-HU = hu +sk-SK = sk +id-ID = id +fa-IR = fa +vi-VN = vi + [other] SHOW_FOOTER_BRANDING = false ; Show time of template execution in the footer From 7c09c196c25ae18b638a3811780fa18f458fa297 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 18:29:58 +0100 Subject: [PATCH 128/131] Update app.ini --- conf/app.ini | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/conf/app.ini b/conf/app.ini index d463579..b50dd07 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -519,8 +519,8 @@ BASIC_AUTH_PASSWORD = [highlight.mapping] [i18n] -LANGS = en-US,zh-CN,zh-HK,zh-TW,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT,fi-FI,tr-TR,cs-CZ,sr-SP,sv-SE,ko-KR,gl-ES,uk-UA,en-GB,hu-HU,sk-SK,id-ID,fa-IR,vi-VN -NAMES = English,简体中文,繁體中文(香港),繁體中文(臺灣),Deutsch,français,Nederlands,latviešu,русский,日本語,español,português do Brasil,polski,български,italiano,suomi,Türkçe,čeština,српски,svenska,한국어,galego,українська,English (United Kingdom),Magyar,Slovenčina,Indonesian,Persian,Vietnamese +LANGS = en-US,zh-CN,zh-HK,zh-TW,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT,fi-FI,tr-TR,cs-CZ,sr-SP,sv-SE,ko-KR,gl-ES,uk-UA,en-GB,hu-HU,sk-SK,id-ID,fa-IR,vi-VN,pt-PT +NAMES = English,简体中文,繁體中文(香港),繁體中文(臺灣),Deutsch,français,Nederlands,latviešu,русский,日本語,español,português do Brasil,polski,български,italiano,suomi,Türkçe,čeština,српски,svenska,한국어,galego,українська,English (United Kingdom),Magyar,Slovenčina,Indonesian,Persian,Vietnamese,português ; Used for datetimepicker [i18n.datelang] @@ -553,6 +553,7 @@ sk-SK = sk id-ID = id fa-IR = fa vi-VN = vi +pt-PT = pt [other] SHOW_FOOTER_BRANDING = false From 479664108a8d296cc1c429af6792c85b6c75ee88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 26 Nov 2021 18:36:28 +0100 Subject: [PATCH 129/131] Create updater.yml --- .github/workflows/updater.yml | 49 +++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/updater.yml diff --git a/.github/workflows/updater.yml b/.github/workflows/updater.yml new file mode 100644 index 0000000..fb72ba0 --- /dev/null +++ b/.github/workflows/updater.yml @@ -0,0 +1,49 @@ +# This workflow allows GitHub Actions to automagically update your app whenever a new upstream release is detected. +# You need to enable Actions in your repository settings, and fetch this Action from the YunoHost-Apps organization. +# This file should be enough by itself, but feel free to tune it to your needs. +# It calls updater.sh, which is where you should put the app-specific update steps. +name: Check for new upstream releases +on: + # Allow to manually trigger the workflow + workflow_dispatch: + # Run it every day at 6:00 UTC + schedule: + - cron: '0 6 * * *' +jobs: + updater: + runs-on: ubuntu-latest + steps: + - name: Fetch the source code + uses: actions/checkout@v2 + with: + token: ${{ secrets.GITHUB_TOKEN }} + - name: Run the updater script + id: run_updater + run: | + # Setting up Git user + git config --global user.name 'yunohost-bot' + git config --global user.email 'yunohost-bot@users.noreply.github.com' + # Run the updater script + /bin/bash .github/workflows/updater.sh + - name: Commit changes + id: commit + if: ${{ env.PROCEED == 'true' }} + run: | + git commit -am "Upgrade to v$VERSION" + - name: Create Pull Request + id: cpr + if: ${{ env.PROCEED == 'true' }} + uses: peter-evans/create-pull-request@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: Update to version ${{ env.VERSION }} + committer: 'yunohost-bot ' + author: 'yunohost-bot ' + signoff: false + base: testing + branch: ci-auto-update-v${{ env.VERSION }} + delete-branch: true + title: 'Upgrade to version ${{ env.VERSION }}' + body: | + Upgrade to v${{ env.VERSION }} + draft: false From ab70f774c72ec2690089c50e18a7d40c018d706c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 26 Nov 2021 22:12:48 +0100 Subject: [PATCH 130/131] Fix --- doc/DESCRIPTION.md | 5 +---- doc/DISCLAIMER.md | 6 +++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md index 671b82e..506ba45 100644 --- a/doc/DESCRIPTION.md +++ b/doc/DESCRIPTION.md @@ -1,10 +1,8 @@ Gogs (Go Git Service) is a git-based multiplatform forge written in Go. Its particularity is that it is light and can run on an ARM card, which makes it suitable for self-hosting. Gogs has a web interface similar to that of GitHub. - ### Features - User dashboard, user profile and activity timeline. -- Access repositories via SSH, HTTP and HTTPS protocols. - User, organization and repository management. - Repository and organization webhooks, including Slack, Discord and Dingtalk. - Repository Git hooks, deploy keys and Git LFS. @@ -12,6 +10,5 @@ Gogs (Go Git Service) is a git-based multiplatform forge written in Go. Its part - Migrate and mirror repositories with wiki from other code hosts. - Web editor for quick editing repository files and wiki. - Jupyter Notebook and PDF rendering. -- Authentication via SMTP, LDAP, reverse proxy, GitHub.com and GitHub Enterprise with 2FA. +- Authentication via SMTP, LDAP. - Customize HTML templates, static files and many others. -- Rich database backend, including PostgreSQL, MySQL, SQLite3 and TiDB. diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md index 044c1b0..1efaaab 100644 --- a/doc/DISCLAIMER.md +++ b/doc/DISCLAIMER.md @@ -1,6 +1,6 @@ ## Notes on SSH usage -If you want to use Gogs with SSH and be able to pull/push with you ssh key, your SSH daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: +If you want to use Gogs with SSH and be able to pull/push with you SSH key, your SSH daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: ```bash PubkeyAuthentication yes @@ -12,7 +12,7 @@ UsePAM no You also need to add your public key to your Gogs profile. -If you use ssh on another port than 22, you need to add theses lines to your ssh config in `~/.ssh/config`: +If you use SSH on another port than 22, you need to add theses lines to your ssh config in `~/.ssh/config`: ```bash Host domain.tld @@ -21,4 +21,4 @@ Host domain.tld ## Private Mode -Actually it's possible to access to the Git repositories by the `git` command over http also in private mode installation. It's important to know that in this mode the repository could be ALSO getted if you don't set the repository as private in the repos settings. +Actually it's possible to access to the Git repositories by the `git` command over HTTP also in private mode installation. It's important to know that in this mode the repository could be ALSO getted if you don't set the repository as private in the repos settings. From d9078f567c6f6bc3ace28563afb219272d528706 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Fri, 26 Nov 2021 21:12:55 +0000 Subject: [PATCH 131/131] Auto-update README --- README.md | 11 ++++------- README_fr.md | 6 +++--- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 4691c1b..3536a1d 100644 --- a/README.md +++ b/README.md @@ -17,11 +17,9 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Gogs (Go Git Service) is a git-based multiplatform forge written in Go. Its particularity is that it is light and can run on an ARM card, which makes it suitable for self-hosting. Gogs has a web interface similar to that of GitHub. - ### Features - User dashboard, user profile and activity timeline. -- Access repositories via SSH, HTTP and HTTPS protocols. - User, organization and repository management. - Repository and organization webhooks, including Slack, Discord and Dingtalk. - Repository Git hooks, deploy keys and Git LFS. @@ -29,9 +27,8 @@ Gogs (Go Git Service) is a git-based multiplatform forge written in Go. Its part - Migrate and mirror repositories with wiki from other code hosts. - Web editor for quick editing repository files and wiki. - Jupyter Notebook and PDF rendering. -- Authentication via SMTP, LDAP, reverse proxy, GitHub.com and GitHub Enterprise with 2FA. +- Authentication via SMTP, LDAP. - Customize HTML templates, static files and many others. -- Rich database backend, including PostgreSQL, MySQL, SQLite3 and TiDB. **Shipped version:** 0.12.3~ynh1 @@ -46,7 +43,7 @@ Gogs (Go Git Service) is a git-based multiplatform forge written in Go. Its part ## Notes on SSH usage -If you want to use Gogs with SSH and be able to pull/push with you ssh key, your SSH daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: +If you want to use Gogs with SSH and be able to pull/push with you SSH key, your SSH daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: ```bash PubkeyAuthentication yes @@ -58,7 +55,7 @@ UsePAM no You also need to add your public key to your Gogs profile. -If you use ssh on another port than 22, you need to add theses lines to your ssh config in `~/.ssh/config`: +If you use SSH on another port than 22, you need to add theses lines to your ssh config in `~/.ssh/config`: ```bash Host domain.tld @@ -67,7 +64,7 @@ Host domain.tld ## Private Mode -Actually it's possible to access to the Git repositories by the `git` command over http also in private mode installation. It's important to know that in this mode the repository could be ALSO getted if you don't set the repository as private in the repos settings. +Actually it's possible to access to the Git repositories by the `git` command over HTTP also in private mode installation. It's important to know that in this mode the repository could be ALSO getted if you don't set the repository as private in the repos settings. ## Documentation and resources diff --git a/README_fr.md b/README_fr.md index 9af087f..f08b41b 100644 --- a/README_fr.md +++ b/README_fr.md @@ -26,7 +26,7 @@ Gogs (Go Git Service) est une forge multiplateforme basée sur git écrite en Go ## Notes on SSH usage -If you want to use Gogs with SSH and be able to pull/push with you ssh key, your SSH daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: +If you want to use Gogs with SSH and be able to pull/push with you SSH key, your SSH daemon must be properly configured to use private/public keys. Here is a sample configuration of `/etc/ssh/sshd_config` that works with Gogs: ```bash PubkeyAuthentication yes @@ -38,7 +38,7 @@ UsePAM no You also need to add your public key to your Gogs profile. -If you use ssh on another port than 22, you need to add theses lines to your ssh config in `~/.ssh/config`: +If you use SSH on another port than 22, you need to add theses lines to your ssh config in `~/.ssh/config`: ```bash Host domain.tld @@ -47,7 +47,7 @@ Host domain.tld ## Private Mode -Actually it's possible to access to the Git repositories by the `git` command over http also in private mode installation. It's important to know that in this mode the repository could be ALSO getted if you don't set the repository as private in the repos settings. +Actually it's possible to access to the Git repositories by the `git` command over HTTP also in private mode installation. It's important to know that in this mode the repository could be ALSO getted if you don't set the repository as private in the repos settings. ## Documentations et ressources