diff --git a/ct/headers/wallabag b/ct/headers/wallabag deleted file mode 100644 index dab1ff5cc..000000000 --- a/ct/headers/wallabag +++ /dev/null @@ -1,6 +0,0 @@ - _ __ ____ __ -| | / /___ _/ / /___ _/ /_ ____ _____ _ -| | /| / / __ `/ / / __ `/ __ \/ __ `/ __ `/ -| |/ |/ / /_/ / / / /_/ / /_/ / /_/ / /_/ / -|__/|__/\__,_/_/_/\__,_/_.___/\__,_/\__, / - /____/ diff --git a/ct/heimdall-dashboard.sh b/ct/heimdall-dashboard.sh new file mode 100644 index 000000000..c4fc9349a --- /dev/null +++ b/ct/heimdall-dashboard.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://heimdall.site/ + +APP="Heimdall-Dashboard" +var_tags="${var_tags:-dashboard}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-512}" +var_disk="${var_disk:-2}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/Heimdall ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "Heimdall" "linuxserver/Heimdall"; then + msg_info "Stopping Service" + systemctl stop heimdall + sleep 1 + msg_ok "Stopped Service" + + msg_info "Backing up Data" + cp -R /opt/Heimdall/database database-backup + cp -R /opt/Heimdall/public public-backup + sleep 1 + msg_ok "Backed up Data" + + setup_composer + fetch_and_deploy_gh_release "Heimdall" "linuxserver/Heimdall" "tarball" + + msg_info "Updating Heimdall-Dashboard" + cd /opt/Heimdall + export COMPOSER_ALLOW_SUPERUSER=1 + $STD composer dump-autoload + msg_ok "Updated Heimdall-Dashboard" + + msg_info "Restoring Data" + cd ~ + cp -R database-backup/* /opt/Heimdall/database + cp -R public-backup/* /opt/Heimdall/public + sleep 1 + msg_ok "Restored Data" + + msg_info "Cleaning Up" + rm -rf {public-backup,database-backup} + sleep 1 + msg_ok "Cleaned Up" + + msg_info "Starting Service" + systemctl start heimdall.service + sleep 2 + msg_ok "Started Service" + msg_ok "Updated successfully!" + fi + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7990${CL}" diff --git a/ct/homarr.sh b/ct/homarr.sh index 77b176331..5b69526a0 100644 --- a/ct/homarr.sh +++ b/ct/homarr.sh @@ -7,8 +7,8 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV APP="homarr" var_tags="${var_tags:-arr;dashboard}" -var_cpu="${var_cpu:-3}" -var_ram="${var_ram:-6144}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-1024}" var_disk="${var_disk:-8}" var_os="${var_os:-debian}" var_version="${var_version:-13}" @@ -36,11 +36,12 @@ function update_script() { msg_ok "Services Stopped" - if ! grep -q '^REDIS_IS_EXTERNAL=' /opt/homarr/.env; then + if ! { grep -q '^REDIS_IS_EXTERNAL=' /opt/homarr/.env 2>/dev/null || grep -q '^REDIS_IS_EXTERNAL=' /opt/homarr.env 2>/dev/null; }; then msg_info "Fixing old structure" $STD apt install -y musl-dev ln -s /usr/lib/x86_64-linux-musl/libc.so /lib/libc.musl-x86_64.so.1 - echo "REDIS_IS_EXTERNAL='true'" >> /opt/homarr/.env + cp /opt/homarr/.env /opt/homarr.env + echo "REDIS_IS_EXTERNAL='true'" >> /opt/homarr.env sed -i 's|^ExecStart=.*|ExecStart=/opt/homarr/run.sh|' /etc/systemd/system/homarr.service sed -i 's|^EnvironmentFile=.*|EnvironmentFile=-/opt/homarr.env|' /etc/systemd/system/homarr.service chown -R redis:redis /appdata/redis @@ -52,7 +53,6 @@ ReadWritePaths=-/appdata/redis -/var/lib/redis -/var/log/redis -/var/run/redis - EOF # TODO: change in json systemctl daemon-reload - cp /opt/homarr/.env /opt/homarr.env rm /opt/run_homarr.sh msg_ok "Fixed old structure" fi @@ -64,18 +64,14 @@ EOF NODE_VERSION=$(curl -s https://raw.githubusercontent.com/homarr-labs/homarr/dev/package.json | jq -r '.engines.node | split(">=")[1] | split(".")[0]') setup_nodejs + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "homarr" "homarr-labs/homarr" "prebuild" "latest" "/opt/homarr" "build-amd64.tar.gz" - rm -rf /opt/homarr - fetch_and_deploy_gh_release "homarr" "homarr-labs/homarr" - - msg_info "Updating Homarr to v${RELEASE}" + msg_info "Updating Homarr" cp /opt/homarr/redis.conf /etc/redis/redis.conf rm /etc/nginx/nginx.conf mkdir -p /etc/nginx/templates cp /opt/homarr/nginx.conf /etc/nginx/templates/nginx.conf - echo $'#!/bin/bash\ncd /opt/homarr/apps/cli && node ./cli.cjs "$@"' >/usr/bin/homarr - chmod +x /usr/bin/homarr - msg_ok "Updated ${APP}" + msg_ok "Updated Homarr" msg_info "Starting Services" chmod +x /opt/homarr/run.sh diff --git a/ct/invoiceninja.sh b/ct/invoiceninja.sh deleted file mode 100644 index b043df78a..000000000 --- a/ct/invoiceninja.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -# Copyright (c) 2021-2025 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://invoiceninja.com/ - -APP="InvoiceNinja" -var_tags="${var_tags:-invoicing;business}" -var_cpu="${var_cpu:-2}" -var_ram="${var_ram:-2048}" -var_disk="${var_disk:-8}" -var_os="${var_os:-debian}" -var_version="${var_version:-13}" -var_unprivileged="${var_unprivileged:-1}" - -header_info "$APP" -variables -color -catch_errors - -function update_script() { - header_info - check_container_storage - check_container_resources - - if [[ ! -d /opt/invoiceninja ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if check_for_gh_release "invoiceninja" "invoiceninja/invoiceninja"; then - msg_info "Stopping Services" - systemctl stop supervisor nginx php8.4-fpm - msg_ok "Stopped Services" - - msg_info "Creating Backup" - mkdir -p /tmp/invoiceninja_backup - cp /opt/invoiceninja/.env /tmp/invoiceninja_backup/ - cp -r /opt/invoiceninja/storage /tmp/invoiceninja_backup/ 2>/dev/null || true - cp -r /opt/invoiceninja/public/storage /tmp/invoiceninja_backup/public_storage 2>/dev/null || true - msg_ok "Created Backup" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "invoiceninja" "invoiceninja/invoiceninja" "prebuild" "latest" "/opt/invoiceninja" "invoiceninja.tar.gz" - - msg_info "Restoring Data" - cp /tmp/invoiceninja_backup/.env /opt/invoiceninja/ - cp -r /tmp/invoiceninja_backup/storage/* /opt/invoiceninja/storage/ 2>/dev/null || true - cp -r /tmp/invoiceninja_backup/public_storage/* /opt/invoiceninja/public/storage/ 2>/dev/null || true - rm -rf /tmp/invoiceninja_backup - msg_ok "Restored Data" - - msg_info "Running Migrations" - cd /opt/invoiceninja - $STD php artisan migrate --force - $STD php artisan config:clear - $STD php artisan cache:clear - $STD php artisan optimize - chown -R www-data:www-data /opt/invoiceninja - chmod -R 755 /opt/invoiceninja/storage - msg_ok "Ran Migrations" - - msg_info "Starting Services" - systemctl start php8.4-fpm nginx supervisor - msg_ok "Started Services" - - msg_ok "Updated Successfully" - fi - exit -} - -start -build_container -description - -msg_ok "Completed Successfully!\n" -echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Access it using the following URL:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080/setup${CL}" diff --git a/ct/nextexplorer.sh b/ct/nextexplorer.sh new file mode 100644 index 000000000..323867052 --- /dev/null +++ b/ct/nextexplorer.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: vhsdream +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/vikramsoni2/nextExplorer + +APP="nextExplorer" +var_tags="${var_tags:-files;documents}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-3072}" +var_disk="${var_disk:-8}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/nextExplorer ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + NODE_VERSION="24" setup_nodejs + + if check_for_gh_release "nextExplorer" "vikramsoni2/nextExplorer"; then + msg_info "Stopping nextExplorer" + $STD systemctl stop nextexplorer + msg_ok "Stopped nextExplorer" + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "nextExplorer" "vikramsoni2/nextExplorer" "tarball" "latest" "/opt/nextExplorer" + + msg_info "Updating nextExplorer" + APP_DIR="/opt/nextExplorer/app" + mkdir -p "$APP_DIR" + cd /opt/nextExplorer/backend + export NODE_ENV=production + $STD npm ci + cd /opt/nextExplorer/frontend + unset NODE_ENV + export NODE_ENV=development + $STD npm ci + $STD npm run build -- --sourcemap false + unset NODE_ENV + cd /opt/nextExplorer/ + mv backend/{node_modules,src,package.json} "$APP_DIR" + mv frontend/dist/ "$APP_DIR"/src/public + chown -R explorer:explorer "$APP_DIR" /etc/nextExplorer + msg_ok "Updated nextExplorer" + + msg_info "Starting nextExplorer" + $STD systemctl start nextexplorer + msg_ok "Started nextExplorer" + msg_ok "Updated successfully!" + fi + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/ct/opencloud.sh b/ct/opencloud.sh index 1a47f5293..78aadba47 100644 --- a/ct/opencloud.sh +++ b/ct/opencloud.sh @@ -40,7 +40,7 @@ function update_script() { $STD apt-get dist-upgrade msg_ok "Updated packages" - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "opencloud" "opencloud-eu/opencloud" "singlefile" "${RELEASE}" "/usr/bin" "opencloud-.*linux-amd64" + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "opencloud" "opencloud-eu/opencloud" "singlefile" "${RELEASE}" "/usr/bin" "opencloud-*-linux-amd64" msg_info "Starting services" systemctl start opencloud opencloud-wopi diff --git a/ct/wallabag.sh b/ct/wallabag.sh deleted file mode 100644 index 2fc8b6a3f..000000000 --- a/ct/wallabag.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func) -# Copyright (c) 2021-2025 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://wallabag.org/ - -APP="Wallabag" -var_tags="${var_tags:-productivity;read-it-later}" -var_cpu="${var_cpu:-2}" -var_ram="${var_ram:-2048}" -var_disk="${var_disk:-6}" -var_os="${var_os:-debian}" -var_version="${var_version:-13}" -var_unprivileged="${var_unprivileged:-1}" - -header_info "$APP" -variables -color -catch_errors - -function update_script() { - header_info - check_container_storage - check_container_resources - - if [[ ! -d /opt/wallabag ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if check_for_gh_release "wallabag" "wallabag/wallabag"; then - msg_info "Stopping Services" - systemctl stop nginx php8.3-fpm - msg_ok "Stopped Services" - - msg_info "Creating Backup" - cp /opt/wallabag/app/config/parameters.yml /tmp/wallabag_parameters.yml.bak - msg_ok "Created Backup" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wallabag" "wallabag/wallabag" "prebuild" "latest" "/opt/wallabag" "wallabag-*.tar.gz" - - msg_info "Restoring Configuration" - cp /tmp/wallabag_parameters.yml.bak /opt/wallabag/app/config/parameters.yml - rm -f /tmp/wallabag_parameters.yml.bak - msg_ok "Restored Configuration" - - msg_info "Running Migrations" - cd /opt/wallabag - $STD php bin/console cache:clear --env=prod - $STD php bin/console doctrine:migrations:migrate --env=prod --no-interaction - chown -R www-data:www-data /opt/wallabag - chmod -R 755 /opt/wallabag/var - chmod -R 755 /opt/wallabag/web/assets - msg_ok "Ran Migrations" - - msg_info "Starting Services" - systemctl start php8.3-fpm nginx - msg_ok "Started Services" - msg_ok "Updated successfully!" - fi - exit -} - -start -build_container -description - -msg_ok "Completed Successfully!\n" -echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Access it using the following URL:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8000${CL}" diff --git a/frontend/public/json/adguardhome-sync.json b/frontend/public/json/adguardhome-sync.json deleted file mode 100644 index 155bdf884..000000000 --- a/frontend/public/json/adguardhome-sync.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "name": "AdGuardHome-Sync", - "slug": "adguardhome-sync", - "categories": [ - 9 - ], - "date_created": "2025-12-08", - "type": "addon", - "updateable": true, - "privileged": false, - "interface_port": 8080, - "documentation": "https://github.com/bakito/adguardhome-sync", - "website": "https://github.com/bakito/adguardhome-sync", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/adguard-home.webp", - "config_path": "/opt/adguardhome-sync/adguardhome-sync.yaml", - "description": "Synchronize AdGuardHome config to one or multiple replica instances. Syncs General Settings, Filters, Rewrites, Services, Clients, DNS Config, DHCP Config and Theme.", - "install_methods": [ - { - "type": "default", - "script": "tools/addon/adguardhome-sync.sh", - "resources": { - "cpu": null, - "ram": null, - "hdd": null, - "os": null, - "version": null - } - }, - { - "type": "alpine", - "script": "tools/addon/adguardhome-sync.sh", - "resources": { - "cpu": null, - "ram": null, - "hdd": null, - "os": null, - "version": null - } - } - ], - "default_credentials": { - "username": null, - "password": null - }, - "notes": [ - { - "text": "Edit /opt/adguardhome-sync/adguardhome-sync.yaml to configure your AdGuardHome instances", - "type": "info" - }, - { - "text": "Origin = Primary instance, Replicas = Instances to sync to", - "type": "info" - }, - { - "text": "Update with: update_adguardhome-sync", - "type": "info" - } - ] -} diff --git a/frontend/public/json/invoiceninja.json b/frontend/public/json/invoiceninja.json deleted file mode 100644 index 10c178e93..000000000 --- a/frontend/public/json/invoiceninja.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "InvoiceNinja", - "slug": "invoiceninja", - "categories": [ - 3 - ], - "date_created": "2025-12-09", - "type": "ct", - "updateable": true, - "privileged": false, - "interface_port": 8080, - "documentation": "https://invoiceninja.github.io/selfhost.html", - "config_path": "/opt/invoiceninja/.env", - "website": "https://invoiceninja.com/", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/invoice-ninja.webp", - "description": "Invoice Ninja is a free, open-source invoicing, quotes, expenses and time-tracking application for freelancers and businesses. Features include recurring invoices, online payments, client portal, and multi-company support.", - "install_methods": [ - { - "type": "default", - "script": "ct/invoiceninja.sh", - "resources": { - "cpu": 2, - "ram": 2048, - "hdd": 8, - "os": "Debian", - "version": "13" - } - } - ], - "default_credentials": { - "username": null, - "password": null - }, - "notes": [ - { - "text": "First visit http://IP:8080/setup to complete the initial configuration", - "type": "info" - }, - { - "text": "Database credentials are stored in ~/invoiceninja.creds", - "type": "info" - }, - { - "text": "Configure SMTP settings in /opt/invoiceninja/.env for email functionality", - "type": "warning" - } - ] -} diff --git a/frontend/public/json/nextexplorer.json b/frontend/public/json/nextexplorer.json new file mode 100644 index 000000000..caa88b336 --- /dev/null +++ b/frontend/public/json/nextexplorer.json @@ -0,0 +1,37 @@ +{ + "name": "nextExplorer", + "slug": "nextexplorer", + "categories": [ + 11, + 12 + ], + "date_created": "2025-12-11", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://explorer.nxz.ai", + "website": "https://github.com/vikramsoni2/nextExplorer", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/nextexplorer.webp", + "config_path": "/etc/nextExplorer/.env", + "description": "", + "install_methods": [ + { + "type": "default", + "script": "ct/nextexplorer.sh", + "resources": { + "cpu": 2, + "ram": 3072, + "hdd": 8, + "os": "Debian", + "version": "13" + } + } + ], + "notes": [ + { + "text": "Bind mount your volume(s) in the `/mnt` directory", + "type": "info" + } + ] +} diff --git a/frontend/public/json/wallabag.json b/frontend/public/json/wallabag.json deleted file mode 100644 index c7ead0b69..000000000 --- a/frontend/public/json/wallabag.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "Wallabag", - "slug": "wallabag", - "categories": [ - 12 - ], - "date_created": "2025-12-09", - "type": "ct", - "updateable": true, - "privileged": false, - "config_path": "/opt/wallabag/app/config/parameters.yml", - "interface_port": 8000, - "documentation": "https://doc.wallabag.org/", - "website": "https://wallabag.org/", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/wallabag.webp", - "description": "Wallabag is a self-hosted read-it-later application. Save web articles to read them later, offline, in a clean and distraction-free interface. Features tagging, full-text search, and browser/mobile app integrations.", - "install_methods": [ - { - "type": "default", - "script": "ct/wallabag.sh", - "resources": { - "cpu": 2, - "ram": 2048, - "hdd": 6, - "os": "Debian", - "version": "13" - } - } - ], - "default_credentials": { - "username": null, - "password": null - }, - "notes": [ - { - "text": "Database credentials are stored in ~/wallabag.creds", - "type": "info" - } - ] -} diff --git a/install/heimdall-dashboard-install.sh b/install/heimdall-dashboard-install.sh new file mode 100644 index 000000000..9346ea4fd --- /dev/null +++ b/install/heimdall-dashboard-install.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://heimdall.site/ + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt install -y apt-transport-https +msg_ok "Installed Dependencies" + +PHP_VERSION="8.4" PHP_MODULE="bz2,sqlite3" PHP_FPM="YES" setup_php +setup_composer +fetch_and_deploy_gh_release "Heimdall" "linuxserver/Heimdall" "tarball" + +msg_info "Setting up Heimdall-Dashboard" +cd /opt/Heimdall +cp .env.example .env +$STD php artisan key:generate +msg_ok "Setup Heimdall-Dashboard" + +msg_info "Creating Service" +cat </etc/systemd/system/heimdall.service +[Unit] +Description=Heimdall +After=network.target + +[Service] +Restart=always +RestartSec=5 +Type=simple +User=root +WorkingDirectory=/opt/Heimdall +ExecStart=/usr/bin/php artisan serve --port 7990 --host 0.0.0.0 +TimeoutStopSec=30 + +[Install] +WantedBy=multi-user.target" +EOF +systemctl enable -q --now heimdall +cd /opt/Heimdall +export COMPOSER_ALLOW_SUPERUSER=1 +$STD composer dump-autoload +systemctl restart heimdall.service +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc diff --git a/install/homarr-install.sh b/install/homarr-install.sh index 06159c7aa..990b8be94 100644 --- a/install/homarr-install.sh +++ b/install/homarr-install.sh @@ -24,11 +24,10 @@ msg_ok "Installed Dependencies" NODE_VERSION=$(curl -s https://raw.githubusercontent.com/homarr-labs/homarr/dev/package.json | jq -r '.engines.node | split(">=")[1] | split(".")[0]') setup_nodejs -fetch_and_deploy_gh_release "homarr" "homarr-labs/homarr" +fetch_and_deploy_gh_release "homarr" "homarr-labs/homarr" "prebuild" "latest" "/opt/homarr" "build-amd64.tar.gz" -msg_info "Installing Homarr (Patience)" +msg_info "Installing Homarr" ln -s /usr/lib/x86_64-linux-musl/libc.so /lib/libc.musl-x86_64.so.1 -cd /opt mkdir -p /opt/homarr_db touch /opt/homarr_db/db.sqlite SECRET_ENCRYPTION_KEY="$(openssl rand -hex 32)" @@ -46,8 +45,9 @@ EOF msg_ok "Installed Homarr" msg_info "Copying config files" +mkdir -p /appdata/redis chown -R redis:redis /appdata/redis -chmod 755 /appdata/redis +chmod 744 /appdata/redis cp /opt/homarr/redis.conf /etc/redis/redis.conf rm /etc/nginx/nginx.conf mkdir -p /etc/nginx/templates diff --git a/install/invoiceninja-install.sh b/install/invoiceninja-install.sh deleted file mode 100644 index 38ac180d4..000000000 --- a/install/invoiceninja-install.sh +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2025 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://invoiceninja.com/ - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -msg_info "Installing Dependencies" -$STD apt install -y \ - nginx \ - supervisor -msg_ok "Installed Dependencies" - -setup_mariadb -MARIADB_DB_NAME="invoiceninja" MARIADB_DB_USER="invoiceninja" setup_mariadb_db -PHP_VERSION="8.4" PHP_FPM="YES" PHP_MODULE="bcmath,curl,gd,gmp,imagick,intl,mbstring,mysql,soap,xml,zip" setup_php -import_local_ip -fetch_and_deploy_gh_release "invoiceninja" "invoiceninja/invoiceninja" "prebuild" "latest" "/opt/invoiceninja" "invoiceninja.tar.gz" - -msg_info "Configuring InvoiceNinja" -cd /opt/invoiceninja -APP_KEY=$(php artisan key:generate --show) -cat </opt/invoiceninja/.env -APP_NAME="Invoice Ninja" -APP_ENV=production -APP_KEY=${APP_KEY} -APP_DEBUG=false -APP_URL=http://${LOCAL_IP}:8080 - -DB_CONNECTION=mysql -DB_HOST=127.0.0.1 -DB_PORT=3306 -DB_DATABASE=${MARIADB_DB_NAME} -DB_USERNAME=${MARIADB_DB_USER} -DB_PASSWORD=${MARIADB_DB_PASS} - -MULTI_DB_ENABLED=false -DEMO_MODE=false - -BROADCAST_DRIVER=log -LOG_CHANNEL=stack -CACHE_DRIVER=file -QUEUE_CONNECTION=database -SESSION_DRIVER=file -SESSION_LIFETIME=120 - -MAIL_MAILER=log -MAIL_HOST=null -MAIL_PORT=null -MAIL_USERNAME=null -MAIL_PASSWORD=null -MAIL_ENCRYPTION=null -MAIL_FROM_ADDRESS="noreply@localhost" -MAIL_FROM_NAME="Invoice Ninja" - -REQUIRE_HTTPS=false -NINJA_ENVIRONMENT=selfhost -PDF_GENERATOR=snappdf - -TRUSTED_PROXIES=* -INTERNAL_QUEUE_ENABLED=false -EOF - -mkdir -p /opt/invoiceninja/bootstrap/cache -mkdir -p /opt/invoiceninja/storage/{app/public,framework/{cache/data,sessions,views},logs} -chown -R www-data:www-data /opt/invoiceninja -chmod -R 775 /opt/invoiceninja/storage /opt/invoiceninja/bootstrap/cache -msg_ok "Configured InvoiceNinja" - -msg_info "Setting up Database" -cd /opt/invoiceninja -$STD php artisan config:clear -$STD php artisan cache:clear -$STD php artisan route:clear -$STD php artisan view:clear -$STD php artisan migrate --force -$STD php artisan db:seed --force -$STD php artisan optimize -msg_ok "Set up Database" - -msg_info "Configuring Nginx" -cat <<'EOF' >/etc/nginx/sites-available/invoiceninja -server { - listen 8080; - server_name _; - root /opt/invoiceninja/public; - index index.php; - - client_max_body_size 50M; - charset utf-8; - - gzip on; - gzip_types application/javascript application/x-javascript text/javascript text/plain application/xml application/json; - gzip_proxied no-cache no-store private expired auth; - gzip_min_length 1000; - - location / { - try_files $uri $uri/ /index.php?$query_string; - } - - location = /index.php { - fastcgi_pass unix:/run/php/php8.4-fpm.sock; - fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; - include fastcgi_params; - fastcgi_read_timeout 300; - } - - location ~ \.php$ { - return 403; - } - - location ~ /\.ht { - deny all; - } - - error_log /var/log/nginx/invoiceninja_error.log; - access_log /var/log/nginx/invoiceninja_access.log; -} -EOF - -ln -sf /etc/nginx/sites-available/invoiceninja /etc/nginx/sites-enabled/ -rm -f /etc/nginx/sites-enabled/default -$STD systemctl reload nginx -msg_ok "Configured Nginx" - -msg_info "Setting up Queue Worker" -cat <<'EOF' >/etc/supervisor/conf.d/invoiceninja-worker.conf -[program:invoiceninja-worker] -process_name=%(program_name)s_%(process_num)02d -command=php /opt/invoiceninja/artisan queue:work --sleep=3 --tries=3 --max-time=3600 -autostart=true -autorestart=true -stopasgroup=true -killasgroup=true -user=www-data -numprocs=2 -redirect_stderr=true -stdout_logfile=/var/log/invoiceninja-worker.log -stopwaitsecs=3600 -EOF - -touch /var/log/invoiceninja-worker.log -chown www-data:www-data /var/log/invoiceninja-worker.log -$STD supervisorctl reread -$STD supervisorctl update -msg_ok "Set up Queue Worker" - -msg_info "Setting up Cron" -cat <<'EOF' >/etc/cron.d/invoiceninja -* * * * * www-data cd /opt/invoiceninja && php artisan schedule:run >> /dev/null 2>&1 -EOF -msg_ok "Set up Cron" - -msg_info "Enabling Services" -systemctl enable -q --now php8.4-fpm nginx supervisor -msg_ok "Enabled Services" - -motd_ssh -customize -cleanup_lxc diff --git a/install/nextexplorer-install.sh b/install/nextexplorer-install.sh new file mode 100644 index 000000000..a1f15a7d7 --- /dev/null +++ b/install/nextexplorer-install.sh @@ -0,0 +1,141 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: vhsdream +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/vikramsoni2/nextExplorer + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt install -y \ + ripgrep \ + imagemagick \ + ffmpeg +msg_ok "Installed Dependencies" + +NODE_VERSION="24" setup_nodejs + +fetch_and_deploy_gh_release "nextExplorer" "vikramsoni2/nextExplorer" "tarball" "latest" "/opt/nextExplorer" + +msg_info "Building nextExplorer" +APP_DIR="/opt/nextExplorer/app" +LOCAL_IP="$(hostname -I | awk '{print $1}')" +mkdir -p "$APP_DIR" +mkdir -p /etc/nextExplorer +cd /opt/nextExplorer/backend +export NODE_ENV=production +$STD npm ci +unset NODE_ENV + +cd /opt/nextExplorer/frontend +export NODE_ENV=development +$STD npm ci +$STD npm run build -- --sourcemap false +unset NODE_ENV + +cd /opt/nextExplorer +mv backend/{node_modules,src,package.json} "$APP_DIR" +mv frontend/dist/ "$APP_DIR"/src/public +msg_ok "Built nextExplorer" + +msg_info "Configuring nextExplorer" +SECRET=$(openssl rand -hex 32) +cat </etc/nextExplorer/.env +NODE_ENV=production +PORT=3000 + +VOLUME_ROOT=/mnt +CONFIG_DIR=/etc/nextExplorer +CACHE_DIR=/etc/nextExplorer/cache +# USER_ROOT= + +PUBLIC_URL=${LOCAL_IP}:3000 +# TRUST_PROXY= +# CORS_ORIGINS= + +LOG_LEVEL=info +DEBUG=false +ENABLE_HTTP_LOGGING=false + +AUTH_ENABLED=true +AUTH_MODE=both +SESSION_SECRET="${SECRET}" +# AUTH_MAX_FAILED= +# AUTH_LOCK_MINUTES= + +# OIDC_ENABLED= +# OIDC_ISSUER= +# OIDC_AUTHORIZATION_URL= +# OIDC_TOKEN_URL= +# OIDC_USERINFO_URL= +# OIDC_CLIENT_ID= +# OIDC_CLIENT_SECRET= +# OIDC_CALLBACK_URL= +# OIDC_SCOPES= + +# SEARCH_DEEP= +# SEARCH_RIPGREP= +# SEARCH_MAX_FILESIZE= + +# ONLYOFFICE_URL= +# ONLYOFFICE_SECRET= +# ONLYOFFICE_LANG= +# ONLYOFFICE_FORCE_SAVE= +# ONLYOFFICE_FILE_EXTENSIONS= + +SHOW_VOLUME_USAGE=true +# USER_DIR_ENABLED= +# SKIP_HOME= + +# EDITOR_EXTENSIONS= + +# FFMPEG_PATH= +# FFPROBE_PATH= + +FAVORITES_DEFAULT_ICON=outline.StarIcon + +SHARES_ENABLED=true +# SHARES_TOKEN_LENGTH=10 +# SHARES_MAX_PER_USER=100 +# SHARES_DEFAULT_EXPIRY_DAYS=30 +# SHARES_GUEST_SESSION_HOURS=24 +# SHARES_ALLOW_PASSWORD=true +# SHARES_ALLOW_ANONYMOUS=true +EOF +chmod 600 /etc/nextExplorer/.env +$STD useradd -U -s /bin/bash -m -d /home/explorer explorer +chown -R explorer:explorer "$APP_DIR" /etc/nextExplorer +msg_ok "Configured nextExplorer" + +msg_info "Creating nextExplorer Service" +cat </etc/systemd/system/nextexplorer.service +[Unit] +Description=nextExplorer Service +After=network.target + +[Service] +Type=simple +WorkingDirectory=/opt/nextExplorer/app +EnvironmentFile=/etc/nextExplorer/.env +ExecStart=/usr/bin/node ./src/app.js +Restart=always +RestartSec=5 +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target +EOF +$STD systemctl enable -q --now nextexplorer +msg_ok "Created nextExplorer Service" + +motd_ssh +customize +cleanup_lxc diff --git a/install/opencloud-install.sh b/install/opencloud-install.sh index ddc3ccee7..92b4e55c8 100644 --- a/install/opencloud-install.sh +++ b/install/opencloud-install.sh @@ -45,6 +45,12 @@ EOF $STD apt-get update $STD apt-get install -y coolwsd code-brand systemctl stop coolwsd +mkdir -p /etc/systemd/system/coolwsd.service.d +cat </etc/systemd/system/coolwsd.service.d/override.conf +[Unit] +Before=opencloud-wopi.service +EOF +systemctl daemon-reload COOLPASS="$(openssl rand -base64 36)" $STD sudo -u cool coolconfig set-admin-password --user=admin --password="$COOLPASS" echo "$COOLPASS" >~/.coolpass @@ -59,8 +65,8 @@ CONFIG_DIR="/etc/opencloud" ENV_FILE="${CONFIG_DIR}/opencloud.env" mkdir -p "$DATA_DIR" "$CONFIG_DIR"/assets/apps -curl -fsSL https://raw.githubusercontent.com/opencloud-eu/opencloud/refs/heads/main/devtools/deployments/opencloud_full/config/opencloud/csp.yaml -o "$CONFIG_DIR"/csp.yaml -curl -fsSL https://raw.githubusercontent.com/opencloud-eu/opencloud/refs/heads/main/devtools/deployments/opencloud_full/config/opencloud/proxy.yaml -o "$CONFIG_DIR"/proxy.yaml.bak +curl -fsSL https://raw.githubusercontent.com/opencloud-eu/opencloud-compose/refs/heads/main/config/opencloud/csp.yaml -o "$CONFIG_DIR"/csp.yaml +curl -fsSL https://raw.githubusercontent.com/opencloud-eu/opencloud-compose/refs/heads/main/config/opencloud/proxy.yaml -o "$CONFIG_DIR"/proxy.yaml.bak cat <"$ENV_FILE" OC_URL=https://${OC_HOST} @@ -69,12 +75,13 @@ IDM_CREATE_DEMO_USERS=false OC_LOG_LEVEL=warning OC_CONFIG_DIR=${CONFIG_DIR} OC_BASE_DATA_PATH=${DATA_DIR} +STORAGE_SYSTEM_OC_ROOT=${DATA_DIR}/storage/metadata -# Proxy +## Proxy PROXY_TLS=false PROXY_CSP_CONFIG_FILE_LOCATION=${CONFIG_DIR}/csp.yaml -# Collaboration - requires VALID TLS +## Collaboration - requires VALID TLS COLLABORA_DOMAIN=${COLLABORA_HOST} COLLABORATION_APP_NAME="CollaboraOnline" COLLABORATION_APP_PRODUCT="Collabora" @@ -84,53 +91,53 @@ COLLABORATION_HTTP_ADDR=0.0.0.0:9300 COLLABORATION_WOPI_SRC=https://${WOPI_HOST} COLLABORATION_JWT_SECRET= -# Applications +## Applications WEB_ASSET_APPS_PATH=${CONFIG_DIR}/assets/apps -# Notifications - Email settings +## Notifications - Email settings # NOTIFICATIONS_SMTP_HOST= # NOTIFICATIONS_SMTP_PORT= # NOTIFICATIONS_SMTP_SENDER= # NOTIFICATIONS_SMTP_USERNAME= # NOTIFICATIONS_SMTP_PASSWORD= # NOTIFICATIONS_SMTP_AUTHENTICATION=login -# Encryption method. Possible values are 'starttls', 'ssltls' and 'none' +## Encryption method. Possible values are 'starttls', 'ssltls' and 'none' # NOTIFICATIONS_SMTP_ENCRYPTION=starttls -# Allow insecure connections. Defaults to false. +## Allow insecure connections. Defaults to false. # NOTIFICATIONS_SMTP_INSECURE=false -# Start additional services at runtime -# Examples: notifications, antivirus etc. -# Do not uncomment unless configured above. +## Start additional services at runtime +## Examples: notifications, antivirus etc. +## Do not uncomment unless configured above. # OC_ADD_RUN_SERVICES="notifications" -# OpenID - via web browser -# -# uncomment for OpenID in general - works for Authelia +## OpenID - via web browser +## uncomment for OpenID in general # OC_EXCLUDE_RUN_SERVICES=idp # OC_OIDC_ISSUER= +# IDP_DOMAIN= # PROXY_OIDC_ACCESS_TOKEN_VERIFY_METHOD=none # PROXY_OIDC_REWRITE_WELLKNOWN=true # PROXY_USER_OIDC_CLAIM=preferred_username # PROXY_USER_CS3_CLAIM=username -# automatically create accounts +## automatically create accounts # PROXY_AUTOPROVISION_ACCOUNTS=true # WEB_OIDC_SCOPE=openid profile email groups # GRAPH_ASSIGN_DEFAULT_USER_ROLE=false # -# uncomment below if using PocketID +## uncomment below if using PocketID # WEB_OIDC_CLIENT_ID= # WEB_OIDC_METADATA_URL=/.well-known/openid-configuration -# Full Text Search - Apache Tika -# Requires a separate install of Tika - see https://community-scripts.github.io/ProxmoxVE/scripts?id=apache-tika +## Full Text Search - Apache Tika +## Requires a separate install of Tika - see https://community-scripts.github.io/ProxmoxVE/scripts?id=apache-tika # SEARCH_EXTRACTOR_TYPE=tika # FRONTEND_FULL_TEXT_SEARCH_ENABLED=true # SEARCH_EXTRACTOR_TIKA_TIKA_URL= -# External storage test - currently not working +## External storage test - Only NFS v4.2+ is supported +## User files # STORAGE_USERS_POSIX_ROOT= -# STORAGE_USERS_ID_CACHE_STORE=nats-js-kv EOF cat </etc/systemd/system/opencloud.service @@ -153,14 +160,15 @@ EOF cat </etc/systemd/system/opencloud-wopi.service [Unit] Description=OpenCloud WOPI Server -Requires=coolwsd.service -After=network.target opencloud.service coolwsd.service +Wants=coolwsd.service +After=opencloud.service coolwsd.service [Service] Type=simple User=opencloud Group=opencloud EnvironmentFile=${ENV_FILE} +ExecStartPre=/bin/sleep 10 ExecStart=/usr/bin/opencloud collaboration server Restart=always KillSignal=SIGKILL diff --git a/install/wallabag-install.sh b/install/wallabag-install.sh deleted file mode 100644 index f9723df97..000000000 --- a/install/wallabag-install.sh +++ /dev/null @@ -1,150 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2025 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://wallabag.org/ - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -msg_info "Installing Dependencies" -$STD apt install -y \ - nginx \ - redis-server \ - imagemagick -msg_ok "Installed Dependencies" - -import_local_ip -setup_mariadb -MARIADB_DB_NAME="wallabag" MARIADB_DB_USER="wallabag" setup_mariadb_db -PHP_VERSION="8.3" PHP_FPM="YES" PHP_MODULE="bcmath,bz2,curl,gd,imagick,intl,mbstring,mysql,redis,tidy,xml,zip" setup_php -setup_composer -NODE_VERSION="22" setup_nodejs - -fetch_and_deploy_gh_release "wallabag" "wallabag/wallabag" "prebuild" "latest" "/opt/wallabag" "wallabag-*.tar.gz" - -msg_info "Configuring Wallabag" -cd /opt/wallabag -SECRET_KEY="$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32)" -cat </opt/wallabag/app/config/parameters.yml -parameters: - database_driver: pdo_mysql - database_host: 127.0.0.1 - database_port: 3306 - database_name: ${MARIADB_DB_NAME} - database_user: ${MARIADB_DB_USER} - database_password: ${MARIADB_DB_PASS} - database_path: null - database_table_prefix: wallabag_ - database_socket: null - database_charset: utf8mb4 - - domain_name: http://${LOCAL_IP}:8000 - server_name: Wallabag - - mailer_dsn: null - - locale: en - - secret: ${SECRET_KEY} - - twofactor_auth: false - twofactor_sender: no-reply@wallabag.org - - fosuser_registration: true - fosuser_confirmation: false - - fos_oauth_server_access_token_lifetime: 3600 - fos_oauth_server_refresh_token_lifetime: 1209600 - - from_email: no-reply@wallabag.org - - rss_limit: 50 - - rabbitmq_host: localhost - rabbitmq_port: 5672 - rabbitmq_user: guest - rabbitmq_password: guest - rabbitmq_prefetch_count: 10 - - redis_scheme: tcp - redis_host: localhost - redis_port: 6379 - redis_path: null - redis_password: null - - sentry_dsn: null -EOF -chown -R www-data:www-data /opt/wallabag -msg_ok "Configured Wallabag" - -msg_info "Installing Wallabag (Patience)" -export COMPOSER_ALLOW_SUPERUSER=1 -export SYMFONY_ENV=prod -cd /opt/wallabag -$STD php bin/console wallabag:install --env=prod --no-interaction -$STD php bin/console cache:clear --env=prod -chown -R www-data:www-data /opt/wallabag -chmod -R 755 /opt/wallabag/var -chmod -R 755 /opt/wallabag/web/assets -msg_ok "Installed Wallabag" - -msg_info "Configuring Nginx" -cat <<'EOF' >/etc/nginx/sites-available/wallabag -server { - listen 8000; - server_name _; - root /opt/wallabag/web; - - add_header X-Frame-Options "SAMEORIGIN"; - add_header X-Content-Type-Options "nosniff"; - - index app.php; - charset utf-8; - - location / { - try_files $uri /app.php$is_args$args; - } - - location ~ ^/app\.php(/|$) { - fastcgi_pass unix:/run/php/php8.3-fpm.sock; - fastcgi_split_path_info ^(.+\.php)(/.*)$; - include fastcgi_params; - fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; - fastcgi_param DOCUMENT_ROOT $realpath_root; - internal; - } - - location ~ \.php$ { - return 404; - } - - location ~ /\.(?!well-known).* { - deny all; - } - - error_log /var/log/nginx/wallabag_error.log; - access_log /var/log/nginx/wallabag_access.log; -} -EOF - -ln -sf /etc/nginx/sites-available/wallabag /etc/nginx/sites-enabled/ -rm -f /etc/nginx/sites-enabled/default -$STD systemctl reload nginx -msg_ok "Configured Nginx" - -msg_info "Enabling Services" -systemctl enable -q --now redis-server -systemctl enable -q --now php8.3-fpm -systemctl enable -q --now nginx -msg_ok "Enabled Services" - -motd_ssh -customize -cleanup_lxc diff --git a/tools/addon/adguardhome-sync.sh b/tools/addon/adguardhome-sync.sh deleted file mode 100644 index f724303db..000000000 --- a/tools/addon/adguardhome-sync.sh +++ /dev/null @@ -1,342 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2025 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://github.com/bakito/adguardhome-sync - -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/core.func) -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/tools.func) -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/error_handler.func) - -# Enable error handling -set -Eeuo pipefail -trap 'error_handler' ERR - -# ============================================================================== -# CONFIGURATION -# ============================================================================== -APP="AdGuardHome-Sync" -APP_TYPE="addon" -INSTALL_PATH="/opt/adguardhome-sync" -CONFIG_PATH="/opt/adguardhome-sync/adguardhome-sync.yaml" -DEFAULT_PORT=8080 - -# Initialize all core functions (colors, formatting, icons, STD mode) -load_functions - -# ============================================================================== -# HEADER -# ============================================================================== -function header_info { - clear - cat <<"EOF" - ___ __ ____ __ _____ - / | ____/ /___ ___ ______ __________/ / / / /___ ____ ___ ___ / ___/__ ______ _____ - / /| |/ __ / __ `/ / / / __ `/ ___/ __ / /_/ / __ \/ __ `__ \/ _ \ \__ \/ / / / __ \/ ___/ - / ___ / /_/ / /_/ / /_/ / /_/ / / / /_/ / __ / /_/ / / / / / / __/ ___/ / /_/ / / / / /__ -/_/ |_\__,_/\__, /\__,_/\__,_/_/ \__,_/_/ /_/\____/_/ /_/ /_/\___/ /____/\__, /_/ /_/\___/ - /____/ /____/ -EOF -} - -# ============================================================================== -# HELPER FUNCTIONS -# ============================================================================== -get_ip() { - hostname -I 2>/dev/null | awk '{print $1}' || echo "127.0.0.1" -} - -# ============================================================================== -# OS DETECTION -# ============================================================================== -if [[ -f "/etc/alpine-release" ]]; then - OS="Alpine" - SERVICE_PATH="/etc/init.d/adguardhome-sync" -elif [[ -f "/etc/debian_version" ]]; then - OS="Debian" - SERVICE_PATH="/etc/systemd/system/adguardhome-sync.service" -else - msg_error "Unsupported OS detected. Exiting." - exit 1 -fi - -# ============================================================================== -# UNINSTALL -# ============================================================================== -function uninstall() { - msg_info "Uninstalling ${APP}" - if [[ "$OS" == "Alpine" ]]; then - rc-service adguardhome-sync stop &>/dev/null || true - rc-update del adguardhome-sync &>/dev/null || true - rm -f "$SERVICE_PATH" - else - systemctl disable --now adguardhome-sync.service &>/dev/null || true - rm -f "$SERVICE_PATH" - fi - rm -rf "$INSTALL_PATH" - rm -f "/usr/local/bin/update_adguardhome-sync" - rm -f "$HOME/.adguardhome-sync" - msg_ok "${APP} has been uninstalled" -} - -# ============================================================================== -# UPDATE -# ============================================================================== -function update() { - if check_for_gh_release "adguardhome-sync" "bakito/adguardhome-sync"; then - msg_info "Stopping service" - if [[ "$OS" == "Alpine" ]]; then - rc-service adguardhome-sync stop &>/dev/null || true - else - systemctl stop adguardhome-sync.service &>/dev/null || true - fi - msg_ok "Stopped service" - - msg_info "Backing up configuration" - cp "$CONFIG_PATH" /tmp/adguardhome-sync.yaml.bak 2>/dev/null || true - msg_ok "Backed up configuration" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "adguardhome-sync" "bakito/adguardhome-sync" "prebuild" "latest" "$INSTALL_PATH" "adguardhome-sync_*_linux_amd64.tar.gz" - - msg_info "Restoring configuration" - cp /tmp/adguardhome-sync.yaml.bak "$CONFIG_PATH" 2>/dev/null || true - rm -f /tmp/adguardhome-sync.yaml.bak - msg_ok "Restored configuration" - - msg_info "Starting service" - if [[ "$OS" == "Alpine" ]]; then - rc-service adguardhome-sync start - else - systemctl start adguardhome-sync.service - fi - msg_ok "Started service" - msg_ok "Updated successfully" - exit - fi -} - -# ============================================================================== -# INSTALL -# ============================================================================== -function install() { - local ip - ip=$(get_ip) - - fetch_and_deploy_gh_release "adguardhome-sync" "bakito/adguardhome-sync" "prebuild" "latest" "$INSTALL_PATH" "adguardhome-sync_*_linux_amd64.tar.gz" - - # Gather configuration from user - echo "" - echo -e "${TAB}Enter details for your AdGuard Home instances." - echo -e "${TAB}The Origin is your primary instance, Replica will sync from it." - echo "" - - # Origin instance - echo -e "${YW}── Origin (Primary) Instance ──${CL}" - local origin_url origin_user origin_pass - read -rp " Origin URL (e.g., http://192.168.1.1): " origin_url - origin_url="${origin_url:-http://192.168.1.1}" - # Add http:// if no protocol specified - [[ ! "$origin_url" =~ ^https?:// ]] && origin_url="http://${origin_url}" - read -rp " Origin Username [admin]: " origin_user - origin_user="${origin_user:-admin}" - read -rsp " Origin Password: " origin_pass - echo "" - origin_pass="${origin_pass:-changeme}" - - # Replica instance - echo "" - echo -e "${YW}── Replica Instance ──${CL}" - local replica_url replica_user replica_pass - read -rp " Replica URL (e.g., http://192.168.1.2): " replica_url - replica_url="${replica_url:-http://192.168.1.2}" - # Add http:// if no protocol specified - [[ ! "$replica_url" =~ ^https?:// ]] && replica_url="http://${replica_url}" - read -rp " Replica Username [admin]: " replica_user - replica_user="${replica_user:-admin}" - read -rsp " Replica Password: " replica_pass - echo "" - replica_pass="${replica_pass:-changeme}" - echo "" - - msg_info "Creating configuration" - cat <"$CONFIG_PATH" -# AdGuardHome-Sync Configuration -# Documentation: https://github.com/bakito/adguardhome-sync - -# Cron expression for sync interval (e.g., every 2 hours: "0 */2 * * *") -cron: "0 */2 * * *" - -# Run sync on startup -runOnStart: true - -# Continue sync on errors -continueOnError: false - -# Origin AdGuardHome instance (primary) -origin: - url: "${origin_url}" - username: "${origin_user}" - password: "${origin_pass}" - insecureSkipVerify: false - -# Replica instances (one or more) -replicas: - - url: "${replica_url}" - username: "${replica_user}" - password: "${replica_pass}" - insecureSkipVerify: false - # Add more replicas as needed: - # - url: "http://192.168.1.3" - # username: "admin" - # password: "changeme" - -# API settings (web UI) -api: - port: ${DEFAULT_PORT} - darkMode: true - metrics: - enabled: false - -# Sync features (all enabled by default) -features: - dns: - accessLists: true - serverConfig: true - rewrites: true - dhcp: - serverConfig: true - staticLeases: true - generalSettings: true - queryLogConfig: true - statsConfig: true - clientSettings: true - services: true - filters: true - theme: true -EOF - chmod 600 "$CONFIG_PATH" - msg_ok "Created configuration" - - msg_info "Creating service" - if [[ "$OS" == "Alpine" ]]; then - cat <"$SERVICE_PATH" -#!/sbin/openrc-run - -name="adguardhome-sync" -description="AdGuardHome Sync" -command="${INSTALL_PATH}/adguardhome-sync" -command_args="run --config ${CONFIG_PATH}" -command_background=true -pidfile="/run/\${RC_SVCNAME}.pid" -output_log="/var/log/adguardhome-sync.log" -error_log="/var/log/adguardhome-sync.log" - -depend() { - need net - after firewall -} -EOF - chmod +x "$SERVICE_PATH" - rc-update add adguardhome-sync default - rc-service adguardhome-sync start - else - cat <"$SERVICE_PATH" -[Unit] -Description=AdGuardHome Sync -After=network.target - -[Service] -Type=simple -ExecStart=${INSTALL_PATH}/adguardhome-sync run --config ${CONFIG_PATH} -Restart=always -RestartSec=10 - -[Install] -WantedBy=multi-user.target -EOF - systemctl daemon-reload - systemctl enable --now adguardhome-sync &>/dev/null - fi - msg_ok "Created and started service" - - # Create update script - msg_info "Creating update script" - cat <<'UPDATEEOF' >/usr/local/bin/update_adguardhome-sync -#!/usr/bin/env bash -# AdGuardHome-Sync Update Script -type=update bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/tools/addon/adguardhome-sync.sh)" -UPDATEEOF - chmod +x /usr/local/bin/update_adguardhome-sync - msg_ok "Created update script (/usr/local/bin/update_adguardhome-sync)" - - echo "" - msg_ok "${APP} installed successfully" - msg_ok "Web UI: ${BL}http://${ip}:${DEFAULT_PORT}${CL}" - msg_ok "Config: ${BL}${CONFIG_PATH}${CL}" - echo "" - msg_warn "Edit the config file to add your AdGuardHome instances!" - msg_warn " Origin: Your primary AdGuardHome instance" - msg_warn " Replicas: One or more replica instances to sync to" -} - -# ============================================================================== -# MAIN -# ============================================================================== - -# Handle type=update (called from update script) -if [[ "${type:-}" == "update" ]]; then - header_info - if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/adguardhome-sync" ]]; then - update - else - msg_error "${APP} is not installed. Nothing to update." - exit 1 - fi - exit 0 -fi - -header_info - -IP=$(get_ip) - -# Check if already installed -if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/adguardhome-sync" ]]; then - msg_warn "${APP} is already installed." - echo "" - - echo -n "${TAB}Uninstall ${APP}? (y/N): " - read -r uninstall_prompt - if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then - uninstall - exit 0 - fi - - echo -n "${TAB}Update ${APP}? (y/N): " - read -r update_prompt - if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then - update - exit 0 - fi - - msg_warn "No action selected. Exiting." - exit 0 -fi - -# Fresh installation -msg_warn "${APP} is not installed." -echo "" -echo -e "${TAB}${INFO} This will install:" -echo -e "${TAB} - AdGuardHome-Sync (Go binary)" -echo -e "${TAB} - Systemd/OpenRC service" -echo -e "${TAB} - Web UI on port ${DEFAULT_PORT}" -echo "" - -echo -n "${TAB}Install ${APP}? (y/N): " -read -r install_prompt -if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then - install -else - msg_warn "Installation cancelled. Exiting." - exit 0 -fi