362 lines
10 KiB
Bash
362 lines
10 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
|
||
|
|
# Stack.Gallery Registry Installer Script
|
||
|
|
# Downloads and installs pre-compiled Stack.Gallery Registry binary from Gitea releases
|
||
|
|
#
|
||
|
|
# Usage:
|
||
|
|
# Direct piped installation (recommended):
|
||
|
|
# curl -sSL https://code.foss.global/stack.gallery/registry/raw/branch/main/install.sh | sudo bash
|
||
|
|
#
|
||
|
|
# With version specification:
|
||
|
|
# curl -sSL https://code.foss.global/stack.gallery/registry/raw/branch/main/install.sh | sudo bash -s -- --version v1.0.0
|
||
|
|
#
|
||
|
|
# Options:
|
||
|
|
# -h, --help Show this help message
|
||
|
|
# --version VERSION Install specific version (e.g., v1.0.0)
|
||
|
|
# --install-dir DIR Installation directory (default: /opt/stack-gallery-registry)
|
||
|
|
# --setup-service Install and enable systemd service
|
||
|
|
|
||
|
|
set -e
|
||
|
|
|
||
|
|
# Default values
|
||
|
|
SHOW_HELP=0
|
||
|
|
SPECIFIED_VERSION=""
|
||
|
|
INSTALL_DIR="/opt/stack-gallery-registry"
|
||
|
|
SETUP_SERVICE=0
|
||
|
|
GITEA_BASE_URL="https://code.foss.global"
|
||
|
|
GITEA_REPO="stack.gallery/registry"
|
||
|
|
BINARY_NAME="stack-gallery-registry"
|
||
|
|
SERVICE_NAME="stack-gallery-registry"
|
||
|
|
CONFIG_DIR="/etc/stack-gallery-registry"
|
||
|
|
|
||
|
|
# Parse command line arguments
|
||
|
|
while [[ $# -gt 0 ]]; do
|
||
|
|
case $1 in
|
||
|
|
-h|--help)
|
||
|
|
SHOW_HELP=1
|
||
|
|
shift
|
||
|
|
;;
|
||
|
|
--version)
|
||
|
|
SPECIFIED_VERSION="$2"
|
||
|
|
shift 2
|
||
|
|
;;
|
||
|
|
--install-dir)
|
||
|
|
INSTALL_DIR="$2"
|
||
|
|
shift 2
|
||
|
|
;;
|
||
|
|
--setup-service)
|
||
|
|
SETUP_SERVICE=1
|
||
|
|
shift
|
||
|
|
;;
|
||
|
|
*)
|
||
|
|
echo "Unknown option: $1"
|
||
|
|
echo "Use -h or --help for usage information"
|
||
|
|
exit 1
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
done
|
||
|
|
|
||
|
|
if [ $SHOW_HELP -eq 1 ]; then
|
||
|
|
echo "Stack.Gallery Registry Installer Script"
|
||
|
|
echo "Downloads and installs pre-compiled Stack.Gallery Registry binary"
|
||
|
|
echo ""
|
||
|
|
echo "Usage: $0 [options]"
|
||
|
|
echo ""
|
||
|
|
echo "Options:"
|
||
|
|
echo " -h, --help Show this help message"
|
||
|
|
echo " --version VERSION Install specific version (e.g., v1.0.0)"
|
||
|
|
echo " --install-dir DIR Installation directory (default: /opt/stack-gallery-registry)"
|
||
|
|
echo " --setup-service Install and enable systemd service"
|
||
|
|
echo ""
|
||
|
|
echo "Examples:"
|
||
|
|
echo " # Install latest version"
|
||
|
|
echo " curl -sSL https://code.foss.global/stack.gallery/registry/raw/branch/main/install.sh | sudo bash"
|
||
|
|
echo ""
|
||
|
|
echo " # Install specific version with systemd service"
|
||
|
|
echo " curl -sSL https://code.foss.global/stack.gallery/registry/raw/branch/main/install.sh | sudo bash -s -- --version v1.0.0 --setup-service"
|
||
|
|
exit 0
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Check if running as root
|
||
|
|
if [ "$EUID" -ne 0 ]; then
|
||
|
|
echo "Please run as root (sudo bash install.sh or pipe to sudo bash)"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Helper function to detect OS and architecture
|
||
|
|
detect_platform() {
|
||
|
|
local os=$(uname -s)
|
||
|
|
local arch=$(uname -m)
|
||
|
|
|
||
|
|
# Map OS
|
||
|
|
case "$os" in
|
||
|
|
Linux)
|
||
|
|
os_name="linux"
|
||
|
|
;;
|
||
|
|
Darwin)
|
||
|
|
os_name="macos"
|
||
|
|
;;
|
||
|
|
MINGW*|MSYS*|CYGWIN*)
|
||
|
|
os_name="windows"
|
||
|
|
;;
|
||
|
|
*)
|
||
|
|
echo "Error: Unsupported operating system: $os"
|
||
|
|
echo "Supported: Linux, macOS"
|
||
|
|
exit 1
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
|
||
|
|
# Map architecture
|
||
|
|
case "$arch" in
|
||
|
|
x86_64|amd64)
|
||
|
|
arch_name="x64"
|
||
|
|
;;
|
||
|
|
aarch64|arm64)
|
||
|
|
arch_name="arm64"
|
||
|
|
;;
|
||
|
|
*)
|
||
|
|
echo "Error: Unsupported architecture: $arch"
|
||
|
|
echo "Supported: x86_64/amd64 (x64), aarch64/arm64 (arm64)"
|
||
|
|
exit 1
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
|
||
|
|
# Construct binary name
|
||
|
|
echo "${BINARY_NAME}-${os_name}-${arch_name}"
|
||
|
|
}
|
||
|
|
|
||
|
|
# Get latest release version from Gitea API
|
||
|
|
get_latest_version() {
|
||
|
|
echo "Fetching latest release version from Gitea..." >&2
|
||
|
|
|
||
|
|
local api_url="${GITEA_BASE_URL}/api/v1/repos/${GITEA_REPO}/releases/latest"
|
||
|
|
local response=$(curl -sSL "$api_url" 2>/dev/null)
|
||
|
|
|
||
|
|
if [ $? -ne 0 ] || [ -z "$response" ]; then
|
||
|
|
echo "Error: Failed to fetch latest release information from Gitea API" >&2
|
||
|
|
echo "URL: $api_url" >&2
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Extract tag_name from JSON response
|
||
|
|
local version=$(echo "$response" | grep -o '"tag_name":"[^"]*"' | cut -d'"' -f4)
|
||
|
|
|
||
|
|
if [ -z "$version" ]; then
|
||
|
|
echo "Error: Could not determine latest version from API response" >&2
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "$version"
|
||
|
|
}
|
||
|
|
|
||
|
|
# Create systemd service file
|
||
|
|
create_service_file() {
|
||
|
|
cat > /etc/systemd/system/${SERVICE_NAME}.service << EOF
|
||
|
|
[Unit]
|
||
|
|
Description=Stack.Gallery Registry
|
||
|
|
Documentation=https://code.foss.global/stack.gallery/registry
|
||
|
|
After=network.target mongodb.service
|
||
|
|
|
||
|
|
[Service]
|
||
|
|
Type=simple
|
||
|
|
User=root
|
||
|
|
ExecStart=${INSTALL_DIR}/${BINARY_NAME} server
|
||
|
|
Restart=always
|
||
|
|
RestartSec=10
|
||
|
|
StandardOutput=journal
|
||
|
|
StandardError=journal
|
||
|
|
SyslogIdentifier=${SERVICE_NAME}
|
||
|
|
|
||
|
|
# Environment variables (customize these)
|
||
|
|
Environment=PORT=3000
|
||
|
|
Environment=HOST=0.0.0.0
|
||
|
|
# Environment=MONGODB_URL=mongodb://localhost:27017/stackgallery
|
||
|
|
# Environment=S3_ENDPOINT=http://localhost:9000
|
||
|
|
# Environment=S3_ACCESS_KEY=minioadmin
|
||
|
|
# Environment=S3_SECRET_KEY=minioadmin
|
||
|
|
# Environment=S3_BUCKET=registry
|
||
|
|
# Environment=JWT_SECRET=your-secret-here
|
||
|
|
|
||
|
|
WorkingDirectory=${INSTALL_DIR}
|
||
|
|
|
||
|
|
[Install]
|
||
|
|
WantedBy=multi-user.target
|
||
|
|
EOF
|
||
|
|
|
||
|
|
echo "Created systemd service file: /etc/systemd/system/${SERVICE_NAME}.service"
|
||
|
|
}
|
||
|
|
|
||
|
|
# Main installation process
|
||
|
|
echo "================================================"
|
||
|
|
echo " Stack.Gallery Registry Installation Script"
|
||
|
|
echo "================================================"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Detect platform
|
||
|
|
PLATFORM_BINARY=$(detect_platform)
|
||
|
|
echo "Detected platform: $PLATFORM_BINARY"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Determine version to install
|
||
|
|
if [ -n "$SPECIFIED_VERSION" ]; then
|
||
|
|
VERSION="$SPECIFIED_VERSION"
|
||
|
|
echo "Installing specified version: $VERSION"
|
||
|
|
else
|
||
|
|
VERSION=$(get_latest_version)
|
||
|
|
echo "Installing latest version: $VERSION"
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Construct download URL
|
||
|
|
DOWNLOAD_URL="${GITEA_BASE_URL}/${GITEA_REPO}/releases/download/${VERSION}/${PLATFORM_BINARY}"
|
||
|
|
echo "Download URL: $DOWNLOAD_URL"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Check if service is running and stop it
|
||
|
|
SERVICE_WAS_RUNNING=0
|
||
|
|
if systemctl is-enabled --quiet ${SERVICE_NAME} 2>/dev/null || systemctl is-active --quiet ${SERVICE_NAME} 2>/dev/null; then
|
||
|
|
SERVICE_WAS_RUNNING=1
|
||
|
|
if systemctl is-active --quiet ${SERVICE_NAME} 2>/dev/null; then
|
||
|
|
echo "Stopping ${SERVICE_NAME} service..."
|
||
|
|
systemctl stop ${SERVICE_NAME}
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Clean installation directory - ensure only binary exists
|
||
|
|
if [ -d "$INSTALL_DIR" ]; then
|
||
|
|
echo "Cleaning installation directory: $INSTALL_DIR"
|
||
|
|
rm -rf "$INSTALL_DIR"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Create fresh installation directory
|
||
|
|
echo "Creating installation directory: $INSTALL_DIR"
|
||
|
|
mkdir -p "$INSTALL_DIR"
|
||
|
|
|
||
|
|
# Create config directory if it doesn't exist
|
||
|
|
if [ ! -d "$CONFIG_DIR" ]; then
|
||
|
|
echo "Creating config directory: $CONFIG_DIR"
|
||
|
|
mkdir -p "$CONFIG_DIR"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Download binary
|
||
|
|
echo "Downloading Stack.Gallery Registry binary..."
|
||
|
|
TEMP_FILE="$INSTALL_DIR/${BINARY_NAME}.download"
|
||
|
|
curl -sSL "$DOWNLOAD_URL" -o "$TEMP_FILE"
|
||
|
|
|
||
|
|
if [ $? -ne 0 ]; then
|
||
|
|
echo "Error: Failed to download binary from $DOWNLOAD_URL"
|
||
|
|
echo ""
|
||
|
|
echo "Please check:"
|
||
|
|
echo " 1. Your internet connection"
|
||
|
|
echo " 2. The specified version exists: ${GITEA_BASE_URL}/${GITEA_REPO}/releases"
|
||
|
|
echo " 3. The platform binary is available for this release"
|
||
|
|
rm -f "$TEMP_FILE"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Check if download was successful (file exists and not empty)
|
||
|
|
if [ ! -s "$TEMP_FILE" ]; then
|
||
|
|
echo "Error: Downloaded file is empty or does not exist"
|
||
|
|
rm -f "$TEMP_FILE"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Move to final location
|
||
|
|
BINARY_PATH="$INSTALL_DIR/${BINARY_NAME}"
|
||
|
|
mv "$TEMP_FILE" "$BINARY_PATH"
|
||
|
|
|
||
|
|
if [ $? -ne 0 ] || [ ! -f "$BINARY_PATH" ]; then
|
||
|
|
echo "Error: Failed to move binary to $BINARY_PATH"
|
||
|
|
rm -f "$TEMP_FILE" 2>/dev/null
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Make executable
|
||
|
|
chmod +x "$BINARY_PATH"
|
||
|
|
|
||
|
|
if [ $? -ne 0 ]; then
|
||
|
|
echo "Error: Failed to make binary executable"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "Binary installed successfully to: $BINARY_PATH"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Check if /usr/local/bin is in PATH
|
||
|
|
if [[ ":$PATH:" == *":/usr/local/bin:"* ]]; then
|
||
|
|
BIN_DIR="/usr/local/bin"
|
||
|
|
else
|
||
|
|
BIN_DIR="/usr/bin"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Create symlink for global access
|
||
|
|
ln -sf "$BINARY_PATH" "$BIN_DIR/${BINARY_NAME}"
|
||
|
|
echo "Symlink created: $BIN_DIR/${BINARY_NAME} -> $BINARY_PATH"
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Setup systemd service if requested
|
||
|
|
if [ $SETUP_SERVICE -eq 1 ]; then
|
||
|
|
echo "Setting up systemd service..."
|
||
|
|
create_service_file
|
||
|
|
systemctl daemon-reload
|
||
|
|
systemctl enable ${SERVICE_NAME}
|
||
|
|
echo "Systemd service enabled: ${SERVICE_NAME}"
|
||
|
|
echo ""
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Restart service if it was running before update
|
||
|
|
if [ $SERVICE_WAS_RUNNING -eq 1 ]; then
|
||
|
|
echo "Restarting ${SERVICE_NAME} service..."
|
||
|
|
systemctl restart ${SERVICE_NAME}
|
||
|
|
echo "Service restarted successfully."
|
||
|
|
echo ""
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "================================================"
|
||
|
|
echo " Stack.Gallery Registry Installation Complete!"
|
||
|
|
echo "================================================"
|
||
|
|
echo ""
|
||
|
|
echo "Installation details:"
|
||
|
|
echo " Binary location: $BINARY_PATH"
|
||
|
|
echo " Symlink location: $BIN_DIR/${BINARY_NAME}"
|
||
|
|
echo " Config directory: $CONFIG_DIR"
|
||
|
|
echo " Version: $VERSION"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Check if configuration exists
|
||
|
|
if [ -f "${CONFIG_DIR}/config.json" ]; then
|
||
|
|
echo "Configuration: ${CONFIG_DIR}/config.json (preserved)"
|
||
|
|
echo ""
|
||
|
|
echo "Your existing configuration has been preserved."
|
||
|
|
if [ $SERVICE_WAS_RUNNING -eq 1 ]; then
|
||
|
|
echo "The service has been restarted with your current settings."
|
||
|
|
else
|
||
|
|
echo "Start the service with: sudo systemctl start ${SERVICE_NAME}"
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
echo "Get started:"
|
||
|
|
echo " ${BINARY_NAME} --help"
|
||
|
|
echo " ${BINARY_NAME} server # Start the registry server"
|
||
|
|
echo ""
|
||
|
|
echo "Configure environment variables:"
|
||
|
|
echo " - MONGODB_URL: MongoDB connection string"
|
||
|
|
echo " - S3_ENDPOINT: S3-compatible storage endpoint"
|
||
|
|
echo " - S3_ACCESS_KEY: S3 access key"
|
||
|
|
echo " - S3_SECRET_KEY: S3 secret key"
|
||
|
|
echo " - S3_BUCKET: S3 bucket name"
|
||
|
|
echo " - JWT_SECRET: Secret for JWT signing"
|
||
|
|
echo " - PORT: Server port (default: 3000)"
|
||
|
|
echo ""
|
||
|
|
if [ $SETUP_SERVICE -eq 1 ]; then
|
||
|
|
echo "Edit the service file to configure environment:"
|
||
|
|
echo " sudo nano /etc/systemd/system/${SERVICE_NAME}.service"
|
||
|
|
echo " sudo systemctl daemon-reload"
|
||
|
|
echo " sudo systemctl start ${SERVICE_NAME}"
|
||
|
|
else
|
||
|
|
echo "To setup as a systemd service, re-run with --setup-service:"
|
||
|
|
echo " curl -sSL ${GITEA_BASE_URL}/${GITEA_REPO}/raw/branch/main/install.sh | sudo bash -s -- --setup-service"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
echo ""
|