Files
gniza4cp/scripts/install.sh
shuki 8f42cc19c9 Use public IP for git clone in install script
Target servers won't have the gitea SSH alias, so use the direct
SSH URL with the public IP for remote installs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 06:17:06 +02:00

141 lines
5.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# gniza installer — from a local clone:
# bash scripts/install.sh
set -eo pipefail
INSTALL_DIR="/usr/local/gniza"
BIN_LINK="/usr/local/bin/gniza"
REPO_SSH="ssh://git@182.54.236.100:2222/shukivaknin/gniza.git"
TMPDIR_CLONE=""
if [[ $EUID -ne 0 ]]; then
echo "Error: install.sh must be run as root" >&2
exit 1
fi
# Determine source directory — local clone or fresh git clone
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-}")" 2>/dev/null && pwd)" || true
if [[ -n "${SCRIPT_DIR:-}" && -f "$SCRIPT_DIR/../bin/gniza" ]]; then
SOURCE_DIR="$(dirname "$SCRIPT_DIR")"
else
echo "Cloning gniza..."
TMPDIR_CLONE="$(mktemp -d)"
git clone --depth 1 "$REPO_SSH" "$TMPDIR_CLONE" 2>&1
SOURCE_DIR="$TMPDIR_CLONE"
fi
cleanup() { [[ -n "${TMPDIR_CLONE:-}" ]] && rm -rf "$TMPDIR_CLONE"; }
trap cleanup EXIT
echo "Installing gniza to $INSTALL_DIR..."
# Create install directory
mkdir -p "$INSTALL_DIR"
# Copy files
cp -r "$SOURCE_DIR/bin" "$INSTALL_DIR/"
cp -r "$SOURCE_DIR/lib" "$INSTALL_DIR/"
cp -r "$SOURCE_DIR/etc" "$INSTALL_DIR/"
cp "$SOURCE_DIR/scripts/uninstall.sh" "$INSTALL_DIR/uninstall.sh"
chmod +x "$INSTALL_DIR/uninstall.sh"
# Make bin executable
chmod +x "$INSTALL_DIR/bin/gniza"
# Create symlink
ln -sf "$INSTALL_DIR/bin/gniza" "$BIN_LINK"
# Create working directory
mkdir -p "$INSTALL_DIR/workdir"
# Create config directory structure with restrictive permissions
mkdir -p -m 700 /etc/gniza/remotes.d /etc/gniza/schedules.d
chmod 700 /etc/gniza
# Copy example configs if no config exists
if [[ ! -f /etc/gniza/gniza.conf ]]; then
cp "$INSTALL_DIR/etc/gniza.conf.example" /etc/gniza/gniza.conf.example
echo "Example config copied to /etc/gniza/gniza.conf.example"
fi
cp "$INSTALL_DIR/etc/remote.conf.example" /etc/gniza/remote.conf.example
cp "$INSTALL_DIR/etc/schedule.conf.example" /etc/gniza/schedule.conf.example
# Create log directory
mkdir -p /var/log/gniza
echo "gniza installed successfully!"
# ── WHM Plugin (if cPanel/WHM is present) ─────────────────────
WHM_CGI_DIR="/usr/local/cpanel/whostmgr/docroot/cgi"
if [[ -d "$WHM_CGI_DIR" ]]; then
echo "Installing WHM plugin..."
# Remove old assets cruft (node_modules, src) if upgrading
rm -rf "$WHM_CGI_DIR/gniza-whm/assets/node_modules" \
"$WHM_CGI_DIR/gniza-whm/assets/src" \
"$WHM_CGI_DIR/gniza-whm/assets/package.json" \
"$WHM_CGI_DIR/gniza-whm/assets/package-lock.json" 2>/dev/null || true
cp -r "$SOURCE_DIR/whm/gniza-whm" "$WHM_CGI_DIR/"
cp "$SOURCE_DIR/whm/gniza-whm.conf" "$WHM_CGI_DIR/gniza-whm/"
chmod +x "$WHM_CGI_DIR/gniza-whm/"*.cgi
# Remove build artifacts that shouldn't be on the server
rm -rf "$WHM_CGI_DIR/gniza-whm/assets/node_modules" \
"$WHM_CGI_DIR/gniza-whm/assets/src" \
"$WHM_CGI_DIR/gniza-whm/assets/package.json" \
"$WHM_CGI_DIR/gniza-whm/assets/package-lock.json" 2>/dev/null || true
/usr/local/cpanel/bin/register_appconfig "$WHM_CGI_DIR/gniza-whm/gniza-whm.conf"
echo "WHM plugin installed — access via WHM > Plugins > gniza Backup Manager"
else
echo "WHM not detected, skipping WHM plugin installation."
fi
# ── cPanel User Plugin (if cPanel is present) ────────────────
CPANEL_BASE="/usr/local/cpanel/base/frontend/jupiter"
ADMINBIN_DIR="/usr/local/cpanel/bin/admin/Gniza"
if [[ -d "$CPANEL_BASE" ]]; then
echo "Installing cPanel user plugin..."
# Copy CGI files + lib + assets
mkdir -p "$CPANEL_BASE/gniza/lib/GnizaCPanel" "$CPANEL_BASE/gniza/assets"
cp "$SOURCE_DIR/cpanel/gniza/index.live.cgi" "$CPANEL_BASE/gniza/"
cp "$SOURCE_DIR/cpanel/gniza/restore.live.cgi" "$CPANEL_BASE/gniza/"
chmod +x "$CPANEL_BASE/gniza/"*.cgi
cp "$SOURCE_DIR/cpanel/gniza/lib/GnizaCPanel/UI.pm" "$CPANEL_BASE/gniza/lib/GnizaCPanel/"
cp "$SOURCE_DIR/cpanel/gniza/assets/gniza-whm.css" "$CPANEL_BASE/gniza/assets/"
cp "$SOURCE_DIR/cpanel/gniza/assets/gniza-logo.svg" "$CPANEL_BASE/gniza/assets/"
cp "$SOURCE_DIR/cpanel/gniza/assets/gniza-cpanel-icon.png" "$CPANEL_BASE/gniza/assets/"
cp "$SOURCE_DIR/cpanel/gniza/install.json" "$CPANEL_BASE/gniza/"
# Install AdminBin module (runs as root)
mkdir -p "$ADMINBIN_DIR"
cp "$SOURCE_DIR/cpanel/admin/Gniza/Restore" "$ADMINBIN_DIR/"
cp "$SOURCE_DIR/cpanel/admin/Gniza/Restore.conf" "$ADMINBIN_DIR/"
chmod 0700 "$ADMINBIN_DIR/Restore"
chmod 0600 "$ADMINBIN_DIR/Restore.conf"
# Register plugin in cPanel interface (install_plugin expects a tar.gz archive
# containing install.json + the icon file referenced in it)
PLUGIN_TMPDIR="$(mktemp -d)"
mkdir -p "$PLUGIN_TMPDIR/gniza/assets"
cp "$SOURCE_DIR/cpanel/gniza/install.json" "$PLUGIN_TMPDIR/"
cp "$SOURCE_DIR/cpanel/gniza/assets/gniza-cpanel-icon.png" "$PLUGIN_TMPDIR/gniza/assets/"
tar -czf "$PLUGIN_TMPDIR/gniza-cpanel.tar.gz" -C "$PLUGIN_TMPDIR" install.json gniza/assets/gniza-cpanel-icon.png
/usr/local/cpanel/scripts/install_plugin "$PLUGIN_TMPDIR/gniza-cpanel.tar.gz" 2>/dev/null || true
rm -rf "$PLUGIN_TMPDIR"
# Rebuild icon sprites so the new icon appears in cPanel
/usr/local/cpanel/bin/rebuild_sprites 2>/dev/null || true
# Regenerate per-user sprites for all cPanel accounts
if [[ -f /etc/trueuserdomains ]]; then
while IFS=: read -r _ user; do
user="${user// /}"
[[ -n "$user" ]] && cpapi2 --user="$user" Branding gensprites 2>/dev/null || true
done < /etc/trueuserdomains
fi
echo "cPanel user plugin installed — users will see gniza Restore in Files section"
else
echo "cPanel not detected, skipping cPanel user plugin installation."
fi
echo ""
echo "Next steps:"
echo " 1. Run 'gniza init' to create your configuration"
echo " 2. Or copy /etc/gniza/gniza.conf.example to /etc/gniza/gniza.conf"
echo " 3. Run 'gniza status' to verify your setup"