From 3666f4981f78d6941aaf90986fe86d9f565e7522 Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Mon, 27 Oct 2025 14:53:20 +0100 Subject: [PATCH] Garage | Alpine-Garage (#8656) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 'Add new script' * add alpine-garage-install.sh * add alpine-garage.sh * Update alpine-garage.sh * Update garage-install.sh * Increase default RAM and disk for Garage containers Updated ct/garage.sh and ct/alpine-garage.sh to set higher default RAM (1024MB for Garage, 512MB for Alpine-Garage) and disk (5GB for both). Synced these resource changes in frontend/public/json/garage.json to ensure consistency in container setup defaults. * Apply suggestion from @tremor021 --------- Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> Co-authored-by: CanbiZ <47820557+MickLesk@users.noreply.github.com> Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com> --- ct/alpine-garage.sh | 63 ++++++++++++++++++++++++ ct/garage.sh | 64 ++++++++++++++++++++++++ frontend/public/json/garage.json | 59 ++++++++++++++++++++++ install/alpine-garage-install.sh | 84 ++++++++++++++++++++++++++++++++ install/garage-install.sh | 69 ++++++++++++++++++++++++++ 5 files changed, 339 insertions(+) create mode 100644 ct/alpine-garage.sh create mode 100644 ct/garage.sh create mode 100644 frontend/public/json/garage.json create mode 100644 install/alpine-garage-install.sh create mode 100644 install/garage-install.sh diff --git a/ct/alpine-garage.sh b/ct/alpine-garage.sh new file mode 100644 index 000000000..15b10c12a --- /dev/null +++ b/ct/alpine-garage.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://garagehq.deuxfleurs.fr/ + +APP="Alpine-Garage" +var_tags="${var_tags:-alpine;object-storage}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-512}" +var_disk="${var_disk:-5}" +var_os="${var_os:-alpine}" +var_version="${var_version:-3.22}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + if [[ ! -f /usr/local/bin/garage ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + GITEA_RELEASE=$(curl -fsSL https://api.github.com/repos/deuxfleurs-org/garage/tags | jq -r '.[0].name') + if [[ "${GITEA_RELEASE}" != "$(cat ~/.garage 2>/dev/null)" ]] || [[ ! -f ~/.garage ]]; then + msg_info "Stopping Service" + rc-service garage stop || true + msg_ok "Stopped Service" + + msg_info "Backing Up Data" + cp /usr/local/bin/garage /usr/local/bin/garage.old 2>/dev/null || true + cp /etc/garage.toml /etc/garage.toml.bak 2>/dev/null || true + msg_ok "Backed Up Data" + + msg_info "Updating Garage" + curl -fsSL "https://garagehq.deuxfleurs.fr/_releases/${GITEA_RELEASE}/x86_64-unknown-linux-musl/garage" -o /usr/local/bin/garage + chmod +x /usr/local/bin/garage + echo "${GITEA_RELEASE}" >~/.garage + msg_ok "Updated Garage" + + msg_info "Starting Service" + rc-service garage start || rc-service garage restart + msg_ok "Started Service" + msg_ok "Update Successfully!" + else + msg_ok "No update required. Garage is already at ${GITEA_RELEASE}" + 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}${CL}" diff --git a/ct/garage.sh b/ct/garage.sh new file mode 100644 index 000000000..551067fc7 --- /dev/null +++ b/ct/garage.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://garagehq.deuxfleurs.fr/ + +APP="Garage" +var_tags="${var_tags:-object-storage}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-1024}" +var_disk="${var_disk:-5}" +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 [[ ! -f /usr/local/bin/garage ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + GITEA_RELEASE=$(curl -fsSL https://api.github.com/repos/deuxfleurs-org/garage/tags | jq -r '.[0].name') + if [[ "${GITEA_RELEASE}" != "$(cat ~/.garage 2>/dev/null)" ]] || [[ ! -f ~/.garage ]]; then + msg_info "Stopping Service" + systemctl stop garage + msg_ok "Stopped Service" + + msg_info "Backing Up Data" + cp /usr/local/bin/garage /usr/local/bin/garage.old 2>/dev/null || true + cp /etc/garage.toml /etc/garage.toml.bak 2>/dev/null || true + msg_ok "Backed Up Data" + + msg_info "Updating Garage" + curl -fsSL "https://garagehq.deuxfleurs.fr/_releases/${GITEA_RELEASE}/x86_64-unknown-linux-musl/garage" -o /usr/local/bin/garage + chmod +x /usr/local/bin/garage + echo "${GITEA_RELEASE}" >~/.garage + msg_ok "Updated Garage" + + msg_info "Starting Service" + systemctl start garage + msg_ok "Started Service" + msg_ok "Update Successfully!" + else + msg_ok "No update required. Garage is already at ${GITEA_RELEASE}" + 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}${CL}" diff --git a/frontend/public/json/garage.json b/frontend/public/json/garage.json new file mode 100644 index 000000000..7290b1693 --- /dev/null +++ b/frontend/public/json/garage.json @@ -0,0 +1,59 @@ +{ + "name": "Garage", + "slug": "garage", + "categories": [ + 8 + ], + "date_created": "2025-10-27", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3900, + "documentation": "https://garagehq.deuxfleurs.fr/documentation/quick-start/", + "website": "https://garagehq.deuxfleurs.fr/", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/garage.webp", + "config_path": "/etc/garage.toml", + "description": "Garage is a lightweight, self-hosted, S3-compatible object storage service built for distributed environments. It is designed to be simple, efficient, and easy to deploy across multiple nodes.", + "install_methods": [ + { + "type": "default", + "script": "ct/garage.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 5, + "os": "debian", + "version": "13" + } + }, + { + "type": "alpine", + "script": "ct/alpine-garage.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 5, + "os": "alpine", + "version": "3.22" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "The Garage configuration file is located at `/etc/garage.toml`. You can edit RPC and API bindings, tokens, and data directories there.", + "type": "info" + }, + { + "text": "Admin API runs by default on port `3903`, S3 API on port `3900`, Web UI on `3902`. Adjust firewall rules accordingly.", + "type": "warning" + }, + { + "text": "To view your generated tokens and RPC secret, check `~/garage.creds` after installation.", + "type": "info" + } + ] +} diff --git a/install/alpine-garage-install.sh b/install/alpine-garage-install.sh new file mode 100644 index 000000000..c5497c2ba --- /dev/null +++ b/install/alpine-garage-install.sh @@ -0,0 +1,84 @@ +#!/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://garagehq.deuxfleurs.fr/ + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apk add --no-cache openssl +msg_ok "Installed Dependencies" + +GITEA_RELEASE=$(curl -s https://api.github.com/repos/deuxfleurs-org/garage/tags | jq -r '.[0].name') +curl -fsSL "https://garagehq.deuxfleurs.fr/_releases/${GITEA_RELEASE}/x86_64-unknown-linux-musl/garage" -o /usr/local/bin/garage +chmod +x /usr/local/bin/garage +mkdir -p /var/lib/garage/{data,meta,snapshots} +mkdir -p /etc/garage +RPC_SECRET=$(openssl rand -hex 64 | cut -c1-64) +ADMIN_TOKEN=$(openssl rand -base64 32) +METRICS_TOKEN=$(openssl rand -base64 32) +{ + echo "Garage Tokens and Secrets" + echo "RPC Secret: $RPC_SECRET" + echo "Admin Token: $ADMIN_TOKEN" + echo "Metrics Token: $METRICS_TOKEN" +} >~/garage.creds +echo $GITEA_RELEASE >>~/.garage +cat </etc/garage.toml +metadata_dir = "/var/lib/garage/meta" +data_dir = "/var/lib/garage/data" +db_engine = "sqlite" +replication_factor = 1 + +rpc_bind_addr = "0.0.0.0:3901" +rpc_public_addr = "127.0.0.1:3901" +rpc_secret = "${RPC_SECRET}" + +[s3_api] +s3_region = "garage" +api_bind_addr = "0.0.0.0:3900" +root_domain = ".s3.garage" + +[s3_web] +bind_addr = "0.0.0.0:3902" +root_domain = ".web.garage" +index = "index.html" + +[k2v_api] +api_bind_addr = "0.0.0.0:3904" + +[admin] +api_bind_addr = "0.0.0.0:3903" +admin_token = "${ADMIN_TOKEN}" +metrics_token = "${METRICS_TOKEN}" +EOF +msg_ok "Configured Garage" + +msg_info "Creating Service" +cat <<'EOF' >/etc/init.d/garage +#!/sbin/openrc-run +name="Garage Object Storage" +command="/usr/local/bin/garage" +command_args="server" +command_background="yes" +pidfile="/run/garage.pid" +depend() { + need net +} +EOF + +chmod +x /etc/init.d/garage +$STD rc-update add garage default +$STD rc-service garage restart || rc-service garage start +msg_ok "Service active" + +motd_ssh +customize diff --git a/install/garage-install.sh b/install/garage-install.sh new file mode 100644 index 000000000..dfb2e129a --- /dev/null +++ b/install/garage-install.sh @@ -0,0 +1,69 @@ +#!/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://garagehq.deuxfleurs.fr/ + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Setup Garage" +GITEA_RELEASE=$(curl -s https://api.github.com/repos/deuxfleurs-org/garage/tags | jq -r '.[0].name') +curl -fsSL "https://garagehq.deuxfleurs.fr/_releases/${GITEA_RELEASE}/x86_64-unknown-linux-musl/garage" -o /usr/local/bin/garage +chmod +x /usr/local/bin/garage +mkdir -p /var/lib/garage/{data,meta,snapshots} +mkdir -p /etc/garage +RPC_SECRET=$(openssl rand -hex 32) +ADMIN_TOKEN=$(openssl rand -base64 32) +METRICS_TOKEN=$(openssl rand -base64 32) +{ + echo "Garage Tokens and Secrets" + echo "RPC Secret: $RPC_SECRET" + echo "Admin Token: $ADMIN_TOKEN" + echo "Metrics Token: $METRICS_TOKEN" +} >>~/garage.creds +echo $GITEA_RELEASE >>~/.garage +cat </etc/garage.toml +metadata_dir = "/var/lib/garage/meta" +data_dir = "/var/lib/garage/data" +db_engine = "sqlite" +replication_factor = 1 + +rpc_bind_addr = "[::]:3901" +rpc_public_addr = "127.0.0.1:3901" +rpc_secret = "${RPC_SECRET}" + +[s3_api] +s3_region = "garage" +api_bind_addr = "[::]:3900" +root_domain = ".s3.garage.localhost" + +[s3_web] +bind_addr = "[::]:3902" +root_domain = ".web.garage.localhost" +index = "index.html" + +[k2v_api] +api_bind_addr = "[::]:3904" + +[admin] +api_bind_addr = "[::]:3903" +admin_token = "${ADMIN_TOKEN}" +metrics_token = "${METRICS_TOKEN}" +EOF +msg_ok "Set up Garage" + +motd_ssh +customize + +msg_info "Cleaning up" +$STD apt -y autoremove +$STD apt -y autoclean +$STD apt -y clean +msg_ok "Cleaned"