From 159fd4fe4701188cd8b51bdb0c931f0ad24a15a8 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 14 Jul 2021 18:44:40 +0200 Subject: [PATCH 1/9] Add templates --- check_process | 11 +- doc/DISCLAIMER.md | 0 doc/DISCLAIMER_fr.md | 0 doc/screenshots/screenshot_starlight.jpg | Bin 0 -> 78762 bytes install | 341 ----------------------- manifest.json | 26 +- scripts/backup | 1 - scripts/install | 64 +++-- scripts/remove | 4 +- scripts/restore | 44 +-- scripts/upgrade | 60 ++-- 11 files changed, 90 insertions(+), 461 deletions(-) create mode 100644 doc/DISCLAIMER.md create mode 100644 doc/DISCLAIMER_fr.md create mode 100644 doc/screenshots/screenshot_starlight.jpg delete mode 100755 install diff --git a/check_process b/check_process index b4b9c4d..fc9c03d 100644 --- a/check_process +++ b/check_process @@ -1,13 +1,8 @@ -# See here for more information -# https://github.com/YunoHost/package_check#syntax-check_process-file - -# Move this file from check_process.default to check_process when you have filled it. - ;; Test complet ; Manifest - domain="domain.tld" (DOMAIN) - admin="john" (USER) - password="pass" + domain="domain.tld" + admin="john" + password="password" ; Checks pkg_linter=1 setup_sub_dir=0 diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md new file mode 100644 index 0000000..e69de29 diff --git a/doc/DISCLAIMER_fr.md b/doc/DISCLAIMER_fr.md new file mode 100644 index 0000000..e69de29 diff --git a/doc/screenshots/screenshot_starlight.jpg b/doc/screenshots/screenshot_starlight.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52cfd6e270abf00bca38d907248bd7f715885400 GIT binary patch literal 78762 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 W{{VuJKu{nop`W8ORc@<(AOG2z;BEQ< literal 0 HcmV?d00001 diff --git a/install b/install deleted file mode 100755 index 54d43ad..0000000 --- a/install +++ /dev/null @@ -1,341 +0,0 @@ -#!/bin/bash - -#================================================= -# GENERIC START -#================================================= -# IMPORT GENERIC HELPERS -#================================================= - -source _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 - -#================================================= -# RETRIEVE ARGUMENTS FROM THE MANIFEST -#================================================= - -domain=$YNH_APP_ARG_DOMAIN -path_url=$YNH_APP_ARG_PATH -admin=$YNH_APP_ARG_ADMIN -is_public=$YNH_APP_ARG_IS_PUBLIC -language=$YNH_APP_ARG_LANGUAGE -password=$YNH_APP_ARG_PASSWORD - -### If it's a multi-instance app, meaning it can be installed several times independently -### The id of the app as stated in the manifest is available as $YNH_APP_ID -### The instance number is available as $YNH_APP_INSTANCE_NUMBER (equals "1", "2"...) -### The app instance name is available as $YNH_APP_INSTANCE_NAME -### - the first time the app is installed, YNH_APP_INSTANCE_NAME = ynhexample -### - the second time the app is installed, YNH_APP_INSTANCE_NAME = ynhexample__2 -### - ynhexample__{N} for the subsequent installations, with N=3,4... -### The app instance name is probably what interests you most, since this is -### guaranteed to be unique. This is a good unique identifier to define installation path, -### db names... -app=$YNH_APP_INSTANCE_NAME - -#================================================= -# CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS -#================================================= -### About --weight and --time -### ynh_script_progression will show to your final users the progression of each scripts. -### In order to do that, --weight will represent the relative time of execution compared to the other steps in the script. -### --time is a packager option, it will show you the execution time since the previous call. -### This option should be removed before releasing your app. -### Use the execution time, given by --time, to estimate the weight of a step. -### A common way to do it is to set a weight equal to the execution time in second +1. -### The execution time is given for the duration since the previous call. So the weight should be applied to this previous call. -ynh_script_progression --message="Validating installation parameters..." --time --weight=1 - -### If the app uses NGINX as web server (written in HTML/PHP in most cases), the final path should be "/var/www/$app". -### If the app provides an internal web server (or uses another application server such as uWSGI), the final path should be "/opt/yunohost/$app" -final_path=/var/www/$app -test ! -e "$final_path" || ynh_die --message="This path already contains a folder" - -# Register (book) web path -ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url - -#================================================= -# STORE SETTINGS FROM MANIFEST -#================================================= -ynh_script_progression --message="Storing installation settings..." --weight=1 - -ynh_app_setting_set --app=$app --key=domain --value=$domain -ynh_app_setting_set --app=$app --key=path --value=$path_url -ynh_app_setting_set --app=$app --key=admin --value=$admin -ynh_app_setting_set --app=$app --key=language --value=$language - -#================================================= -# STANDARD MODIFICATIONS -#================================================= -# FIND AND OPEN A PORT -#================================================= -ynh_script_progression --message="Finding an available port..." --weight=1 - -### Use these lines if you have to open a port for the application -### `ynh_find_port` will find the first available port starting from the given port. -### If you're not using these lines: -### - Remove the section "CLOSE A PORT" in the remove script - -# Find an available port -port=$(ynh_find_port --port=7156) -ynh_app_setting_set --app=$app --key=port --value=$port - -#================================================= -# INSTALL DEPENDENCIES -#================================================= -ynh_script_progression --message="Installing dependencies..." --weight=1 - -ynh_install_app_dependencies $pkg_dependencies - -#================================================= -# DOWNLOAD, CHECK AND UNPACK SOURCE -#================================================= -ynh_script_progression --message="Setting up source files..." --time --weight=1 - -### `ynh_setup_source` is used to install an app from a zip or tar.gz file, -### downloaded from an upstream source, like a git repository. -### `ynh_setup_source` use the file conf/app.src - -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" - -#================================================= -# NGINX CONFIGURATION -#================================================= -ynh_script_progression --message="Configuring NGINX web server..." --time --weight=1 - -### `ynh_add_nginx_config` will use the file conf/nginx.conf - -# Create a dedicated NGINX config -ynh_add_nginx_config - -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Configuring system user..." --time --weight=1 - -# Create a system user -ynh_system_user_create --username=$app - -#================================================= -# PHP-FPM CONFIGURATION -#================================================= -ynh_script_progression --message="Configuring PHP-FPM..." --time --weight=1 - -### `ynh_add_fpm_config` is used to set up a PHP config. -### You can remove it if your app doesn't use PHP. -### `ynh_add_fpm_config` will use the files conf/php-fpm.conf -### If you're not using these lines: -### - You can remove these files in conf/. -### - Remove the section "BACKUP THE PHP-FPM CONFIGURATION" in the backup script -### - Remove also the section "REMOVE PHP-FPM CONFIGURATION" in the remove script -### - As well as the section "RESTORE THE PHP-FPM CONFIGURATION" in the restore script -### with the reload at the end of the script. -### - And the section "PHP-FPM CONFIGURATION" in the upgrade script - -# Create a dedicated PHP-FPM config -ynh_add_fpm_config - -#================================================= -# SPECIFIC SETUP -#================================================= -# ... -#================================================= - -#================================================= -# SETUP SYSTEMD -#================================================= -ynh_script_progression --message="Configuring a systemd service..." --time --weight=1 - -### `ynh_systemd_config` is used to configure a systemd script for an app. -### It can be used for apps that use sysvinit (with adaptation) or systemd. -### Have a look at the app to be sure this app needs a systemd script. -### `ynh_systemd_config` will use the file conf/systemd.service -### If you're not using these lines: -### - You can remove those files in conf/. -### - Remove the section "BACKUP SYSTEMD" in the backup script -### - Remove also the section "STOP AND REMOVE SERVICE" in the remove script -### - As well as the section "RESTORE SYSTEMD" in the restore script -### - And the section "SETUP SYSTEMD" in the upgrade script - -# Create a dedicated systemd config -ynh_add_systemd_config - -#================================================= -# SETUP APPLICATION WITH CURL -#================================================= - -### Use these lines only if the app installation needs to be finalized through -### web forms. We generally don't want to ask the final user, -### so we're going to use curl to automatically fill the fields and submit the -### forms. - -# Set right permissions for curl install -chown -R $app: $final_path - -# Set the app as temporarily public for curl call -ynh_script_progression --message="Configuring SSOwat..." --time --weight=1 -# Making the app public for curl -ynh_permission_update --permission="main" --add="visitors" -# Reload SSOwat config -yunohost app ssowatconf - -# Reload NGINX -ynh_systemd_action --service_name=nginx --action=reload - -# Installation with curl -ynh_script_progression --message="Finalizing installation..." --time --weight=1 -ynh_local_curl "/INSTALL_PATH" "key1=value1" "key2=value2" "key3=value3" - -# Remove the public access -ynh_permission_update --permission="main" --remove="visitors" - -#================================================= -# MODIFY A CONFIG FILE -#================================================= - -### `ynh_replace_string` is used to replace a string in a file. -### (It's compatible with sed regular expressions syntax) - -ynh_replace_string --match_string="match_string" --replace_string="replace_string" --target_file="$final_path/CONFIG_FILE" - -#================================================= -# STORE THE CONFIG FILE CHECKSUM -#================================================= - -### `ynh_store_file_checksum` is used to store the checksum of a file. -### That way, during the upgrade script, by using `ynh_backup_if_checksum_is_different`, -### you can make a backup of this file before modifying it again if the admin had modified it. - -# Calculate and store the config file checksum into the app settings -ynh_store_file_checksum --file="$final_path/CONFIG_FILE" - -#================================================= -# GENERIC FINALIZATION -#================================================= -# SECURE FILES AND DIRECTORIES -#================================================= - -### For security reason, any app should set the permissions to root: before anything else. -### Then, if write authorization is needed, any access should be given only to directories -### that really need such authorization. - -# Set permissions to app files -chown -R root: $final_path - -#================================================= -# SETUP LOGROTATE -#================================================= -ynh_script_progression --message="Configuring log rotation..." --time --weight=1 - -### `ynh_use_logrotate` is used to configure a logrotate configuration for the logs of this app. -### Use this helper only if there is effectively a log file for this app. -### If you're not using this helper: -### - Remove the section "BACKUP LOGROTATE" in the backup script -### - Remove also the section "REMOVE LOGROTATE CONFIGURATION" in the remove script -### - As well as the section "RESTORE THE LOGROTATE CONFIGURATION" in the restore script -### - And the section "SETUP LOGROTATE" in the upgrade script - -# Use logrotate to manage application logfile(s) -ynh_use_logrotate - -#================================================= -# INTEGRATE SERVICE IN YUNOHOST -#================================================= -ynh_script_progression --message="Integrating service in YunoHost..." --time --weight=1 - -### `yunohost service add` integrates a service in YunoHost. It then gets -### displayed in the admin interface and through the others `yunohost service` commands. -### (N.B.: this line only makes sense if the app adds a service to the system!) -### If you're not using these lines: -### - You can remove these files in conf/. -### - Remove the section "REMOVE SERVICE INTEGRATION IN YUNOHOST" in the remove script -### - As well as the section "INTEGRATE SERVICE IN YUNOHOST" in the restore script -### - And the section "INTEGRATE SERVICE IN YUNOHOST" in the upgrade script - -yunohost service add $app --description="A short description of the app" --log="/var/log/$app/$app.log" - -### Additional options starting with 3.8: -### -### --needs_exposed_ports "$port" a list of ports that needs to be publicly exposed -### which will then be checked by YunoHost's diagnosis system -### (N.B. DO NOT USE THIS is the port is only internal!!!) -### -### --test_status "some command" a custom command to check the status of the service -### (only relevant if 'systemctl status' doesn't do a good job) -### -### --test_conf "some command" some command similar to "nginx -t" that validates the conf of the service -### -### Re-calling 'yunohost service add' during the upgrade script is the right way -### to proceed if you later realize that you need to enable some flags that -### weren't enabled on old installs (be careful it'll override the existing -### service though so you should re-provide all relevant flags when doing so) - -#================================================= -# START SYSTEMD SERVICE -#================================================= -ynh_script_progression --message="Starting a systemd service..." --time --weight=1 - -### `ynh_systemd_action` is used to start a systemd service for an app. -### Only needed if you have configure a systemd service -### If you're not using these lines: -### - Remove the section "STOP SYSTEMD SERVICE" and "START SYSTEMD SERVICE" in the backup script -### - As well as the section "START SYSTEMD SERVICE" in the restore script -### - As well as the section"STOP SYSTEMD SERVICE" and "START SYSTEMD SERVICE" in the upgrade script -### - And the section "STOP SYSTEMD SERVICE" and "START SYSTEMD SERVICE" in the change_url script - -# Start a systemd service -ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" - -#================================================= -# SETUP FAIL2BAN -#================================================= -ynh_script_progression --message="Configuring Fail2Ban..." --time --weight=1 - -# Create a dedicated Fail2Ban config -ynh_add_fail2ban_config --logpath="/var/log/nginx/${domain}-error.log" --failregex="Regex to match into the log for a failed login" - -#================================================= -# SETUP SSOWAT -#================================================= -ynh_script_progression --message="Configuring permissions..." --time --weight=1 - -# Make app public if necessary -if [ $is_public -eq 1 ] -then - # Everyone can access the app. - # The "main" permission is automatically created before the install script. - ynh_permission_update --permission="main" --add="visitors" -fi - -# Only the admin can access the admin panel of the app (if the app has an admin panel) -ynh_permission_create --permission="admin" --url="/admin" --allowed=$admin - -# Everyone can access to the api part -# We don't want to display the tile in the sso so we put --show_tile="false" -# And we don't want that the YunoHost Admin can remove visitors group to this permission, so we put --protected="true" -ynh_permission_create --permission="api" --url "/api" --allowed="visitors" --show_tile="false" --protected="true" - -#================================================= -# 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="Installation of $app completed" --time --last diff --git a/manifest.json b/manifest.json index d020319..902943a 100644 --- a/manifest.json +++ b/manifest.json @@ -3,16 +3,22 @@ "id": "epicyon", "packaging_format": 1, "description": { - "en": "ActivityPub server implementing S2S and C2S protocols" + "en": "Federated social network server", + "fr": "Serveur de réseau social fédéré" }, - "version": "1.03.2021~ynh1", + "version": "1.03.2021~ynh2", "url": "https://epicyon.net/", + "upstream": { + "license": "AGPL-1.0-or-later", + "website": "https://epicyon.net", + "code": "hhttps://gitlab.com/bashrc2/epicyon/" + }, "license": "AGPL-1.0-or-later", "maintainer": { "name": "Anmol Sharma" }, "requirements": { - "yunohost": ">= 4.1.3" + "yunohost": ">= 4.2.4" }, "multi_instance": true, "services": [ @@ -23,29 +29,17 @@ { "name": "domain", "type": "domain", - "ask": { - "en": "Choose a domain name for Epicyon", - "fr": "Choisissez un nom de domaine pour Epicyon" - }, "example": "example.com" }, { "name": "admin", "type": "user", - "ask": { - "en": "Choose an admin user", - "fr": "Choisissez l'administrateur" - }, "example": "johndoe" }, { "name": "password", "type": "password", - "ask": { - "en": "Set the administrator password", - "fr": "Définissez le mot de passe administrateur" - }, - "example": "epicyonH@$Str()/\/gP@$$\/\/()rd" + "example": "Choose a password" } ] } diff --git a/scripts/backup b/scripts/backup index 76bb040..b87ffa5 100755 --- a/scripts/backup +++ b/scripts/backup @@ -50,7 +50,6 @@ ynh_backup --src_path="$public_path" ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" - #================================================= # BACKUP SYSTEMD #================================================= diff --git a/scripts/install b/scripts/install index 46358fa..77c62cd 100755 --- a/scripts/install +++ b/scripts/install @@ -35,9 +35,7 @@ app=$YNH_APP_INSTANCE_NAME #================================================= # CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS #================================================= - -ynh_script_progression --message="Validating installation parameters..." --weight=1 - +ynh_script_progression --message="Validating installation parameters..." --weight=1 final_path=/opt/yunohost/$app public_path=/var/www/$app @@ -50,7 +48,7 @@ ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url #================================================= # STORE SETTINGS FROM MANIFEST #================================================= -ynh_script_progression --message="Storing installation settings..." --weight=1 +ynh_script_progression --message="Storing installation settings..." --weight=1 ynh_app_setting_set --app=$app --key=domain --value=$domain ynh_app_setting_set --app=$app --key=path --value=$path_url @@ -61,7 +59,7 @@ ynh_app_setting_set --app=$app --key=admin --value=$admin #================================================= # FIND AND OPEN A PORT #================================================= -ynh_script_progression --message="Finding an available port..." --weight=1 +ynh_script_progression --message="Finding an available port..." --weight=1 # Find an available port port=$(ynh_find_port --port=7156) @@ -70,10 +68,18 @@ ynh_app_setting_set --app=$app --key=port --value=$port #================================================= # INSTALL DEPENDENCIES #================================================= -ynh_script_progression --message="Installing dependencies..." --weight=1 +ynh_script_progression --message="Installing dependencies..." --weight=1 ynh_install_app_dependencies $pkg_dependencies +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Configuring system user..." --weight=1 + +# Create a system user +ynh_system_user_create --username=$app --home_dir="$final_path" + #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= @@ -81,12 +87,23 @@ ynh_script_progression --message="Setting up source files..." --weight=1 ynh_app_setting_set --app=$app --key=final_path --value=$final_path ynh_app_setting_set --app=$app --key=public_path --value=$public_path + # Clone repo, create public path and link accounts git clone https://gitlab.com/bashrc2/epicyon $final_path + mkdir $public_path mkdir -p $final_path/accounts/newsmirror ln -s $final_path/accounts/newsmirror $public_path/newsmirror + +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + +chmod 750 $public_path +chmod -R o-rwx $public_path +chown -R $app:www-data $public_path + #================================================= # NGINX CONFIGURATION #================================================= @@ -94,59 +111,40 @@ ynh_script_progression --message="Configuring NGINX web server..." --weight=1 ynh_add_nginx_config -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Configuring system user..." --weight=1 - -# Create a system user -ynh_system_user_create --username=$app - #================================================= # SETUP SYSTEMD #================================================= ynh_script_progression --message="Configuring a systemd service..." --weight=1 -ynh_add_systemd_config --service="$app" --template="systemd.service" --others_var="port domain" +ynh_add_systemd_config #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= -ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 +ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 -yunohost service add $app --description="ActivityPub compliant server " --log="/var/log/$app/$app.log" +yunohost service add $app --description="Federated social network server" --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=1 # Start a systemd service ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" - #================================================= # SPECIFIC SETUP #================================================= +ynh_script_progression --message="Create admin user" --weight=1 # Create admin -ynh_script_progression --message="Create admin user" --weight=1 -python3 $final_path/epicyon.py --addaccount $admin --password $password --domain $domain - -#================================================= -# GENERIC FINALIZATION -#================================================= -# SECURE FILES AND DIRECTORIES -#================================================= - -# Set permissions to app files -chown -R $app: $final_path -chown -R $app: $public_path +python3 $final_path/epicyon.py --addaccount=$admin --password=$password --domain=$domain #================================================= # SETUP SSOWAT #================================================= -ynh_script_progression --message="Configuring permissions..." --weight=1 +ynh_script_progression --message="Configuring permissions..." --weight=1 ynh_permission_update --permission="main" --add="visitors" @@ -155,7 +153,7 @@ ynh_permission_url --permission="main" --auth_header="false" #================================================= # 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 diff --git a/scripts/remove b/scripts/remove index 1a7b89c..1882ded 100755 --- a/scripts/remove +++ b/scripts/remove @@ -81,7 +81,7 @@ ynh_secure_remove --file="/var/log/$app/" #================================================= # REMOVE DEDICATED USER #================================================= -ynh_script_progression --message="Removing the dedicated system user..." --weight=1 +ynh_script_progression --message="Removing the dedicated system user..." --weight=1 # Delete a system user ynh_system_user_delete --username=$app @@ -90,4 +90,4 @@ ynh_system_user_delete --username=$app # END OF SCRIPT #================================================= -ynh_script_progression --message="Removal of $app completed" --last +ynh_script_progression --message="Removal of $app completed" --last diff --git a/scripts/restore b/scripts/restore index 3493fec..89a5f5e 100755 --- a/scripts/restore +++ b/scripts/restore @@ -51,37 +51,39 @@ test ! -d $final_path \ ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" -#================================================= -# RESTORE THE APP MAIN DIR -#================================================= -ynh_script_progression --message="Restoring the app main directory..." --weight=1 - -ynh_restore_file --origin_path="$final_path" -ynh_restore_file --origin_path="$public_path" -ln -s $final_path/accounts/newsmirror $public_path/newsmirror - #================================================= # RECREATE THE DEDICATED USER #================================================= -ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 +ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 # Create the dedicated user (if not existing) -ynh_system_user_create --username=$app +ynh_system_user_create --username=$app --home_dir="$final_path" #================================================= -# RESTORE USER RIGHTS +# RESTORE THE APP MAIN DIR #================================================= +ynh_script_progression --message="Restoring the app main directory..." --weight=1 -# Restore permissions on app files -chown -R $app: $final_path +ynh_restore_file --origin_path="$final_path" +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + +ynh_restore_file --origin_path="$public_path" + +chmod 750 $public_path +chmod -R o-rwx $public_path +chown -R $app:www-data $public_path + +ln -s $final_path/accounts/newsmirror $public_path/newsmirror #================================================= # SPECIFIC RESTORATION #================================================= # REINSTALL DEPENDENCIES #================================================= -ynh_script_progression --message="Reinstalling dependencies..." --weight=1 +ynh_script_progression --message="Reinstalling dependencies..." --weight=1 # Define and install dependencies ynh_install_app_dependencies $pkg_dependencies @@ -97,9 +99,9 @@ systemctl enable $app.service --quiet #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= -ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 +ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 -yunohost service add $app --description="ActivityPub compliant server" --log="/var/log/$app/$app.log" +yunohost service add $app --description="Federated social network server" --log="/var/log/$app/$app.log" #================================================= # START SYSTEMD SERVICE @@ -108,14 +110,12 @@ ynh_script_progression --message="Starting a systemd service..." --weight=1 ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" - #================================================= # GENERIC FINALIZATION #================================================= -# RELOAD NGINX AND PHP-FPM +# 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 @@ -123,4 +123,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Restoration completed for $app" --last +ynh_script_progression --message="Restoration completed for $app" --last diff --git a/scripts/upgrade b/scripts/upgrade index 05e1fce..d5b7df8 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -47,10 +47,18 @@ ynh_abort_if_errors #================================================= # STOP SYSTEMD SERVICE #================================================= -ynh_script_progression --message="Stopping a systemd service..." --weight=1 +ynh_script_progression --message="Stopping a systemd service..." --weight=1 ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log" +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 + +# Create a dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir="$final_path" + #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= @@ -65,10 +73,15 @@ then popd fi +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" +chown -R $app: $public_path + #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=1 +ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=1 # Create a dedicated NGINX config ynh_add_nginx_config @@ -76,44 +89,24 @@ ynh_add_nginx_config #================================================= # UPGRADE DEPENDENCIES #================================================= -ynh_script_progression --message="Upgrading dependencies..." --weight=1 +ynh_script_progression --message="Upgrading dependencies..." --weight=1 ynh_install_app_dependencies $pkg_dependencies -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 - -# Create a dedicated user (if not existing) -ynh_system_user_create --username=$app - - #================================================= # SETUP SYSTEMD #================================================= -ynh_script_progression --message="Upgrading systemd configuration..." --weight=1 +ynh_script_progression --message="Upgrading systemd configuration..." --weight=1 # Create a dedicated systemd config -ynh_add_systemd_config --service="$app" --template="systemd.service" --others_var="port domain" - - -#================================================= -# GENERIC FINALIZATION -#================================================= -# SECURE FILES AND DIRECTORIES -#================================================= - -# Set permissions on app files -chown -R $app: $final_path -chown -R $app: $public_path +ynh_add_systemd_config #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= -ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 +ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 -yunohost service add $app --description="A short description of the app" --log="/var/log/$app/$app.log" +yunohost service add $app --description="Federated social network server" --log="/var/log/$app/$app.log" #================================================= # START SYSTEMD SERVICE @@ -122,19 +115,10 @@ ynh_script_progression --message="Starting a systemd service..." --weight=1 ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" -#================================================= -# SETUP SSOWAT -#================================================= -ynh_script_progression --message="Configuring permissions..." --weight=1 - -ynh_permission_update --permission="main" --add="visitors" - -ynh_permission_url --permission="main" --auth_header="false" - #================================================= # 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 @@ -142,4 +126,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Upgrade of $app completed" --last +ynh_script_progression --message="Upgrade of $app completed" --last From 8c0965c7fdf5eba9580444e0af1b888758b606f9 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Wed, 14 Jul 2021 16:44:45 +0000 Subject: [PATCH 2/9] Auto-update README --- README.md | 65 ++++++++++++++++++++-------------------------------- README_fr.md | 42 +++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 40 deletions(-) create mode 100644 README_fr.md diff --git a/README.md b/README.md index a22ec86..a0ac869 100644 --- a/README.md +++ b/README.md @@ -1,61 +1,46 @@ + +# epicyon for YunoHost -# Epicyon app for YunoHost +[![Integration level](https://dash.yunohost.org/integration/epicyon.svg)](https://dash.yunohost.org/appci/app/epicyon) ![](https://ci-apps.yunohost.org/ci/badges/epicyon.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/epicyon.maintain.svg) +[![Install epicyon with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=epicyon) -[![Integration level](https://dash.yunohost.org/integration/epicyon.svg)](https://dash.yunohost.org/appci/app/epicyon) ![](https://ci-apps.yunohost.org/ci/badges/epicyon.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/epicyon.maintain.svg) +*[Lire ce readme en français.](./README_fr.md)* -[![Install Epicyon with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=epicyon) - -> *This package allows you to install Epicyon quickly and simply on a YunoHost server. +> *This package allows you to install epicyon 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 -ActivityPub server implementing S2S and C2S protocols, suitable for single board computers. Includes features such as moderation tools, post expiry, content warnings, and image descriptions -**Shipped version:** 01.03.2021 +Federated social network server + +**Shipped version:** 1.03.2021~ynh2 + + ## Screenshots -![](https://user-content.gitlab-static.net/930ea132a7a3a86dbc20782644a54e80a646d5f3/68747470733a2f2f65706963796f6e2e6e65742f696d672f73637265656e73686f745f6c696768742e6a7067) +![](./doc/screenshots/screenshot_starlight.jpg) -![](https://user-content.gitlab-static.net/3e7464f70018b45c4664ec28a98f3b39ea2258f8/68747470733a2f2f65706963796f6e2e6e65742f696d672f73637265656e73686f745f737461726c696768742e6a7067) +## Documentation and resources -![](https://user-content.gitlab-static.net/3a2f50083b88e221883ae2d70ddf86a4d79ef466/68747470733a2f2f65706963796f6e2e6e65742f696d672f73637265656e73686f745f6c6f67696e2e6a7067) - - -## YunoHost specific features - -#### Multi-user support - -Are LDAP and HTTP auth supported? NO -Can the app be used by multiple users? Yes - -#### Supported architectures - -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/epicyon%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/epicyon/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/epicyon%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/epicyon/) - - -**More info on the documentation page:** -https://yunohost.org/packaging_apps - -## Links - - * Report a bug: https://github.com/YunoHost-Apps/epicyon/issues - * App website: https://epicyon.net/ - * Upstream app repository: https://gitlab.com/bashrc2/epicyon/ - * YunoHost website: https://yunohost.org/ - ---- +* Official app website: https://epicyon.net +* Upstream app code repository: hhttps://gitlab.com/bashrc2/epicyon/ +* YunoHost documentation for this app: https://yunohost.org/app_epicyon +* Report a bug: https://github.com/YunoHost-Apps/epicyon_ynh/issues ## Developer info -**Only if you want to use a testing branch for coding, instead of merging directly into master.** -Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/epicyon/tree/testing). +Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/epicyon_ynh/tree/testing). To try the testing branch, please proceed like that. ``` -sudo yunohost app install https://github.com/YunoHost-Apps/epicyon/tree/testing --debug +sudo yunohost app install https://github.com/YunoHost-Apps/epicyon_ynh/tree/testing --debug or -sudo yunohost app upgrade epicyon -u https://github.com/YunoHost-Apps/epicyon/tree/testing --debug +sudo yunohost app upgrade epicyon -u https://github.com/YunoHost-Apps/epicyon_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..4b55446 --- /dev/null +++ b/README_fr.md @@ -0,0 +1,42 @@ +# epicyon pour YunoHost + +[![Niveau d'intégration](https://dash.yunohost.org/integration/epicyon.svg)](https://dash.yunohost.org/appci/app/epicyon) ![](https://ci-apps.yunohost.org/ci/badges/epicyon.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/epicyon.maintain.svg) +[![Installer epicyon avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=epicyon) + +*[Read this readme in english.](./README.md)* +*[Lire ce readme en français.](./README_fr.md)* + +> *Ce package vous permet d'installer epicyon 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 + +Serveur de réseau social fédéré + +**Version incluse :** 1.03.2021~ynh2 + + + +## Captures d'écran + +![](./doc/screenshots/screenshot_starlight.jpg) + +## Documentations et ressources + +* Site officiel de l'app : https://epicyon.net +* Dépôt de code officiel de l'app : hhttps://gitlab.com/bashrc2/epicyon/ +* Documentation YunoHost pour cette app : https://yunohost.org/app_epicyon +* Signaler un bug : https://github.com/YunoHost-Apps/epicyon_ynh/issues + +## Informations pour les développeurs + +Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/epicyon_ynh/tree/testing). + +Pour essayer la branche testing, procédez comme suit. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/epicyon_ynh/tree/testing --debug +ou +sudo yunohost app upgrade epicyon -u https://github.com/YunoHost-Apps/epicyon_ynh/tree/testing --debug +``` + +**Plus d'infos sur le packaging d'applications :** https://yunohost.org/packaging_apps \ No newline at end of file From be138b6456b0fca81211508856d51291f29c30d8 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 14 Jul 2021 18:51:23 +0200 Subject: [PATCH 3/9] Fix --- conf/nginx.conf | 91 +++++++++++++++++++++++--------------------- conf/systemd.service | 6 ++- 2 files changed, 53 insertions(+), 44 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 000a937..0d1fe19 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,51 +1,56 @@ #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; location __PATH__/ { -# Force usage of https -if ($scheme = http) { - rewrite ^ https://$server_name$request_uri? permanent; -} -proxy_http_version 1.1; -client_max_body_size 31M; -proxy_set_header Upgrade $http_upgrade; -proxy_set_header Connection "upgrade"; -proxy_set_header Host $http_host; -proxy_set_header X-Real-IP $remote_addr; -proxy_set_header X-Forward-For $proxy_add_x_forwarded_for; -proxy_set_header X-Forward-Proto http; -proxy_set_header X-Nginx-Proxy true; -expires epoch; -proxy_no_cache 1; -proxy_temp_file_write_size 64k; -proxy_connect_timeout 10080s; -proxy_send_timeout 10080; -proxy_read_timeout 10080; -proxy_buffer_size 64k; -proxy_buffers 16 32k; -proxy_busy_buffers_size 64k; -proxy_redirect off; -proxy_request_buffering on; -proxy_buffering on; -#proxy_cache my_cache; -#proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; + # Force usage of https + if ($scheme = http) { + rewrite ^ https://$server_name$request_uri? permanent; + } + + proxy_pass http://localhost:__PORT__; + proxy_http_version 1.1; + client_max_body_size 31M; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forward-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forward-Proto http; + proxy_set_header X-Nginx-Proxy true; + expires epoch; + proxy_no_cache 1; + proxy_temp_file_write_size 64k; + proxy_connect_timeout 10080s; + proxy_send_timeout 10080; + proxy_read_timeout 10080; + proxy_buffer_size 64k; + proxy_buffers 16 32k; + proxy_busy_buffers_size 64k; + proxy_redirect off; + proxy_request_buffering on; + proxy_buffering on; + #proxy_cache my_cache; + #proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; + location ~ ^/(icons|images|media|emoji)/(.*)/(.*).(png|jpg|gif|webp|mp3|ogv|ogg|mp4) { -expires 7d; -proxy_pass http://localhost:__PORT__; -} + expires 7d; + proxy_pass http://localhost:__PORT__; + } + location ~ ^/icons/(.*)/(like|repeat|calendar)(.*).(png|jpg|gif|webp|mp3|ogv|ogg|mp4) { -expires epoch; -proxy_no_cache 1; -proxy_pass http://localhost:__PORT__; -} + expires epoch; + proxy_no_cache 1; + proxy_pass http://localhost:__PORT__; + } + location ~ ^/icons/(like|repeat|calendar)(.*).(png|jpg|gif|webp|mp3|ogv|ogg|mp4) { -expires epoch; -proxy_no_cache 1; -proxy_pass http://localhost:__PORT__; -} + expires epoch; + proxy_no_cache 1; + proxy_pass http://localhost:__PORT__; + } + location ~ ^/users/(.*)/(image|banner).(png|jpg|gif|webp|mp3|ogv|ogg|mp4) { -expires epoch; -proxy_no_cache 1; -proxy_pass http://localhost:__PORT__; -} -proxy_pass http://localhost:__PORT__; + expires epoch; + proxy_no_cache 1; + proxy_pass http://localhost:__PORT__; + } } diff --git a/conf/systemd.service b/conf/systemd.service index 64056ab..c21d97c 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -1,3 +1,7 @@ +[Unit] +Description=Epicyon: Federated social network server +After=network.target + [Service] Type=simple User=__APP__ @@ -11,4 +15,4 @@ StandardError=/var/log/__APP__/__APP__.log CPUQuota=80% [Install] -WantedBy=multi-user.target \ No newline at end of file +WantedBy=multi-user.target From 5cbb515a053e5e288ec6263eb27bd134d74185bd Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 14 Jul 2021 18:52:51 +0200 Subject: [PATCH 4/9] Create change_url --- scripts/change_url | 128 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 scripts/change_url diff --git a/scripts/change_url b/scripts/change_url new file mode 100644 index 0000000..f6bb280 --- /dev/null +++ b/scripts/change_url @@ -0,0 +1,128 @@ +#!/bin/bash + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# RETRIEVE ARGUMENTS +#================================================= + +old_domain=$YNH_APP_OLD_DOMAIN +old_path=$YNH_APP_OLD_PATH + +new_domain=$YNH_APP_NEW_DOMAIN +new_path=$YNH_APP_NEW_PATH + +app=$YNH_APP_INSTANCE_NAME + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 + +# Needed for helper "ynh_add_nginx_config" +final_path=$(ynh_app_setting_get --app=$app --key=final_path) + +# 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 CHANGE URL THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --weight=1 + +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + # Remove the new domain config file, the remove script won't do it as it doesn't know yet its location. + ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" + + # Restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# CHECK WHICH PARTS SHOULD BE CHANGED +#================================================= + +change_domain=0 +if [ "$old_domain" != "$new_domain" ] +then + change_domain=1 +fi + +change_path=0 +if [ "$old_path" != "$new_path" ] +then + change_path=1 +fi + +#================================================= +# STANDARD MODIFICATIONS +#================================================= +# STOP SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Stopping a systemd service..." --weight=1 + +ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log" + +#================================================= +# MODIFY URL IN NGINX CONF +#================================================= +ynh_script_progression --message="Updating NGINX web server configuration..." --weight=1 + +nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf + +# Change the path in the NGINX config file +if [ $change_path -eq 1 ] +then + # Make a backup of the original NGINX config file if modified + ynh_backup_if_checksum_is_different --file="$nginx_conf_path" + # Set global variables for NGINX helper + domain="$old_domain" + path_url="$new_path" + # Create a dedicated NGINX config + ynh_add_nginx_config +fi + +# Change the domain for NGINX +if [ $change_domain -eq 1 ] +then + # Delete file checksum for the old conf file location + ynh_delete_file_checksum --file="$nginx_conf_path" + mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf + # Store file checksum for the new config file location + ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" +fi + +#================================================= +# GENERIC FINALISATION +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a systemd service..." --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..." --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Change of URL completed for $app" --last From e04fd56d072f3f8c5deccb8cde7f9f6f6ccb9ac5 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 14 Jul 2021 19:14:11 +0200 Subject: [PATCH 5/9] Update install --- scripts/install | 3 --- 1 file changed, 3 deletions(-) diff --git a/scripts/install b/scripts/install index 77c62cd..a751ece 100755 --- a/scripts/install +++ b/scripts/install @@ -95,13 +95,10 @@ mkdir $public_path mkdir -p $final_path/accounts/newsmirror ln -s $final_path/accounts/newsmirror $public_path/newsmirror - chmod 750 "$final_path" -chmod -R o-rwx "$final_path" chown -R $app:www-data "$final_path" chmod 750 $public_path -chmod -R o-rwx $public_path chown -R $app:www-data $public_path #================================================= From b0dd7841497cfb654fe69a2c0f8b31a25359dfd3 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 14 Jul 2021 19:14:26 +0200 Subject: [PATCH 6/9] Update install --- scripts/install | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index a751ece..71aaa64 100755 --- a/scripts/install +++ b/scripts/install @@ -96,10 +96,10 @@ mkdir -p $final_path/accounts/newsmirror ln -s $final_path/accounts/newsmirror $public_path/newsmirror chmod 750 "$final_path" -chown -R $app:www-data "$final_path" +chown -R $app: "$final_path" chmod 750 $public_path -chown -R $app:www-data $public_path +chown -R $app: $public_path #================================================= # NGINX CONFIGURATION From a63dc28e1d43e0ae2e13940402047d46f6bb1dab Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 14 Jul 2021 19:22:55 +0200 Subject: [PATCH 7/9] Update install --- scripts/install | 3 --- 1 file changed, 3 deletions(-) diff --git a/scripts/install b/scripts/install index 71aaa64..edd8669 100755 --- a/scripts/install +++ b/scripts/install @@ -95,10 +95,7 @@ mkdir $public_path mkdir -p $final_path/accounts/newsmirror ln -s $final_path/accounts/newsmirror $public_path/newsmirror -chmod 750 "$final_path" chown -R $app: "$final_path" - -chmod 750 $public_path chown -R $app: $public_path #================================================= From 67d788f216d8a8eb46da58b9d888e4f08b39c95d Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 14 Jul 2021 19:27:34 +0200 Subject: [PATCH 8/9] Update install --- scripts/install | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index edd8669..77c62cd 100755 --- a/scripts/install +++ b/scripts/install @@ -95,8 +95,14 @@ mkdir $public_path mkdir -p $final_path/accounts/newsmirror ln -s $final_path/accounts/newsmirror $public_path/newsmirror -chown -R $app: "$final_path" -chown -R $app: $public_path + +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + +chmod 750 $public_path +chmod -R o-rwx $public_path +chown -R $app:www-data $public_path #================================================= # NGINX CONFIGURATION From e05844e437fa733e9ff29ded7acc981dc4454d13 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 14 Jul 2021 23:06:29 +0200 Subject: [PATCH 9/9] Update remove --- scripts/remove | 9 --------- 1 file changed, 9 deletions(-) diff --git a/scripts/remove b/scripts/remove index 1882ded..3c88041 100755 --- a/scripts/remove +++ b/scripts/remove @@ -67,15 +67,6 @@ ynh_script_progression --message="Removing NGINX web server configuration..." -- # Remove the dedicated NGINX config ynh_remove_nginx_config -#================================================= -# SPECIFIC REMOVE -#================================================= -# REMOVE VARIOUS FILES -#================================================= - -# Remove the log files -ynh_secure_remove --file="/var/log/$app/" - #================================================= # GENERIC FINALIZATION #=================================================