diff --git a/ct/alpine-garage.sh b/ct/alpine-garage.sh new file mode 100644 index 000000000..ecf981770 --- /dev/null +++ b/ct/alpine-garage.sh @@ -0,0 +1,65 @@ +#!/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 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://alpinelinux.org/ + +APP="Alpine-Garage" +var_tags="${var_tags:-alpine;object-storage}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-512}" +var_disk="${var_disk:-3}" +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 index f07efc473..a43859bb7 100644 --- a/ct/garage.sh +++ b/ct/garage.sh @@ -6,10 +6,10 @@ source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxV # Source: https://garagehq.deuxfleurs.fr/ APP="Garage" -var_tags="${var_tags:-}" -var_cpu="${var_cpu:-4}" -var_ram="${var_ram:-8192}" -var_disk="${var_disk:-20}" +var_tags="${var_tags:-object-storage}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-512}" +var_disk="${var_disk:-3}" var_os="${var_os:-debian}" var_version="${var_version:-13}" var_unprivileged="${var_unprivileged:-1}" @@ -23,14 +23,34 @@ function update_script() { header_info check_container_storage check_container_resources - if [[ ! -d /var ]]; then + if [[ ! -f /usr/local/bin/garage ]]; then msg_error "No ${APP} Installation Found!" exit fi - msg_info "Updating $APP LXC" - $STD apt-get update - $STD apt-get -y upgrade - msg_ok "Updated $APP LXC" + 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 } @@ -38,5 +58,8 @@ start build_container description -msg_ok "Completed Successfully!" -msg_custom "🚀" "${GN}" "${APP} setup has been successfully initialized!" +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..d7a407392 --- /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": 512, + "hdd": 3, + "os": "debian", + "version": "13" + } + }, + { + "type": "alpine", + "script": "ct/alpine-garage.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 3, + "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 index 5138656a8..c82f3e03c 100644 --- a/install/alpine-garage-install.sh +++ b/install/alpine-garage-install.sh @@ -13,86 +13,72 @@ setting_up_container network_check update_os -msg_info "Preparing directories" -mkdir -p /var/lib/garage/meta /var/lib/garage/data /var/lib/garage/snapshots -msg_ok "Prepared directories" - -msg_info "Setup Garage packages" -$STD apk add --no-cache garage garage-openrc openssl -msg_ok "Setup Garage packages" - -# msg_info "Generating RPC secret" -# if [[ ! -s /etc/garage.rpc_secret ]]; then -# openssl rand -hex 32 | tr -d '\n' >/etc/garage.rpc_secret -# chmod 600 /etc/garage.rpc_secret -# fi -# msg_ok "Generated RPC secret" - -# msg_info "Generating tokens" -# if [[ ! -s /etc/garage.tokens.env ]]; then -# ADMIN_TOKEN="$(openssl rand -base64 32)" -# METRICS_TOKEN="$(openssl rand -base64 32)" -# cat >/etc/garage.tokens.env </etc/garage.toml <~/garage.creds +echo $GITEA_RELEASE >>~/.garage +cat </etc/garage.toml metadata_dir = "/var/lib/garage/meta" data_dir = "/var/lib/garage/data" -metadata_snapshots_dir = "/var/lib/garage/snapshots" - -db_engine = "lmdb" -metadata_fsync = true -data_fsync = false -metadata_auto_snapshot_interval = "6h" +db_engine = "sqlite" +replication_factor = 1 rpc_bind_addr = "0.0.0.0:3901" rpc_public_addr = "127.0.0.1:3901" -allow_world_readable_secrets = false +rpc_secret = "${RPC_SECRET}" [s3_api] -api_bind_addr = "0.0.0.0:3900" 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" -add_host_to_metrics = true +index = "index.html" + +[k2v_api] +api_bind_addr = "0.0.0.0:3904" [admin] api_bind_addr = "0.0.0.0:3903" -metrics_require_token = false +admin_token = "${ADMIN_TOKEN}" +metrics_token = "${METRICS_TOKEN}" EOF -fi -msg_ok "Wrote config" +msg_ok "Configured Garage" -msg_info "Enable + start service" +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 || $STD rc-service garage start -$STD rc-service garage status || true +$STD rc-service garage restart || rc-service garage start msg_ok "Service active" -msg_info "Setup Node" -garage node id -NODE_ID=$(garage node id | cut -d@ -f1) -garage layout assign $NODE_ID --capacity 1T -garage layout apply -garage status -msg_ok "Node setup" - motd_ssh customize diff --git a/install/garage-install.sh b/install/garage-install.sh index 06dc470e9..b8f1a39ec 100644 --- a/install/garage-install.sh +++ b/install/garage-install.sh @@ -29,6 +29,7 @@ METRICS_TOKEN=$(openssl rand -base64 32) 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"