371 lines
11 KiB
Bash
371 lines
11 KiB
Bash
#!/bin/bash
|
|
#
|
|
# MyFSIO Installation Script
|
|
# This script sets up MyFSIO for production use on Linux systems.
|
|
#
|
|
# Usage:
|
|
# ./install.sh [OPTIONS]
|
|
#
|
|
# Options:
|
|
# --install-dir DIR Installation directory (default: /opt/myfsio)
|
|
# --data-dir DIR Data directory (default: /var/lib/myfsio)
|
|
# --log-dir DIR Log directory (default: /var/log/myfsio)
|
|
# --user USER System user to run as (default: myfsio)
|
|
# --port PORT API port (default: 5000)
|
|
# --ui-port PORT UI port (default: 5100)
|
|
# --api-url URL Public API URL (for presigned URLs behind proxy)
|
|
# --no-systemd Skip systemd service creation
|
|
# --binary PATH Path to myfsio binary (will download if not provided)
|
|
# -y, --yes Skip confirmation prompts
|
|
#
|
|
|
|
set -e
|
|
|
|
INSTALL_DIR="/opt/myfsio"
|
|
DATA_DIR="/var/lib/myfsio"
|
|
LOG_DIR="/var/log/myfsio"
|
|
SERVICE_USER="myfsio"
|
|
API_PORT="5000"
|
|
UI_PORT="5100"
|
|
API_URL=""
|
|
SKIP_SYSTEMD=false
|
|
BINARY_PATH=""
|
|
AUTO_YES=false
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--install-dir)
|
|
INSTALL_DIR="$2"
|
|
shift 2
|
|
;;
|
|
--data-dir)
|
|
DATA_DIR="$2"
|
|
shift 2
|
|
;;
|
|
--log-dir)
|
|
LOG_DIR="$2"
|
|
shift 2
|
|
;;
|
|
--user)
|
|
SERVICE_USER="$2"
|
|
shift 2
|
|
;;
|
|
--port)
|
|
API_PORT="$2"
|
|
shift 2
|
|
;;
|
|
--ui-port)
|
|
UI_PORT="$2"
|
|
shift 2
|
|
;;
|
|
--api-url)
|
|
API_URL="$2"
|
|
shift 2
|
|
;;
|
|
--no-systemd)
|
|
SKIP_SYSTEMD=true
|
|
shift
|
|
;;
|
|
--binary)
|
|
BINARY_PATH="$2"
|
|
shift 2
|
|
;;
|
|
-y|--yes)
|
|
AUTO_YES=true
|
|
shift
|
|
;;
|
|
-h|--help)
|
|
head -30 "$0" | tail -25
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
echo ""
|
|
echo "============================================================"
|
|
echo " MyFSIO Installation Script"
|
|
echo " S3-Compatible Object Storage"
|
|
echo "============================================================"
|
|
echo ""
|
|
echo "Documentation: https://go.jzwsite.com/myfsio"
|
|
echo ""
|
|
|
|
if [[ $EUID -ne 0 ]]; then
|
|
echo "Error: This script must be run as root (use sudo)"
|
|
exit 1
|
|
fi
|
|
|
|
echo "------------------------------------------------------------"
|
|
echo "STEP 1: Review Installation Configuration"
|
|
echo "------------------------------------------------------------"
|
|
echo ""
|
|
echo " Install directory: $INSTALL_DIR"
|
|
echo " Data directory: $DATA_DIR"
|
|
echo " Log directory: $LOG_DIR"
|
|
echo " Service user: $SERVICE_USER"
|
|
echo " API port: $API_PORT"
|
|
echo " UI port: $UI_PORT"
|
|
if [[ -n "$API_URL" ]]; then
|
|
echo " Public API URL: $API_URL"
|
|
fi
|
|
if [[ -n "$BINARY_PATH" ]]; then
|
|
echo " Binary path: $BINARY_PATH"
|
|
fi
|
|
echo ""
|
|
|
|
if [[ "$AUTO_YES" != true ]]; then
|
|
read -p "Do you want to proceed with these settings? [y/N] " -n 1 -r
|
|
echo
|
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
echo "Installation cancelled."
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
echo "------------------------------------------------------------"
|
|
echo "STEP 2: Creating System User"
|
|
echo "------------------------------------------------------------"
|
|
echo ""
|
|
if id "$SERVICE_USER" &>/dev/null; then
|
|
echo " [OK] User '$SERVICE_USER' already exists"
|
|
else
|
|
useradd --system --no-create-home --shell /usr/sbin/nologin "$SERVICE_USER"
|
|
echo " [OK] Created user '$SERVICE_USER'"
|
|
fi
|
|
|
|
echo ""
|
|
echo "------------------------------------------------------------"
|
|
echo "STEP 3: Creating Directories"
|
|
echo "------------------------------------------------------------"
|
|
echo ""
|
|
mkdir -p "$INSTALL_DIR"
|
|
echo " [OK] Created $INSTALL_DIR"
|
|
mkdir -p "$DATA_DIR"
|
|
echo " [OK] Created $DATA_DIR"
|
|
mkdir -p "$LOG_DIR"
|
|
echo " [OK] Created $LOG_DIR"
|
|
|
|
echo ""
|
|
echo "------------------------------------------------------------"
|
|
echo "STEP 4: Installing Binary"
|
|
echo "------------------------------------------------------------"
|
|
echo ""
|
|
if [[ -n "$BINARY_PATH" ]]; then
|
|
if [[ -f "$BINARY_PATH" ]]; then
|
|
cp "$BINARY_PATH" "$INSTALL_DIR/myfsio"
|
|
echo " [OK] Copied binary from $BINARY_PATH"
|
|
else
|
|
echo " [ERROR] Binary not found at $BINARY_PATH"
|
|
exit 1
|
|
fi
|
|
elif [[ -f "./myfsio" ]]; then
|
|
cp "./myfsio" "$INSTALL_DIR/myfsio"
|
|
echo " [OK] Copied binary from ./myfsio"
|
|
else
|
|
echo " [ERROR] No binary provided."
|
|
echo " Use --binary PATH or place 'myfsio' in current directory"
|
|
exit 1
|
|
fi
|
|
chmod +x "$INSTALL_DIR/myfsio"
|
|
echo " [OK] Set executable permissions"
|
|
|
|
echo ""
|
|
echo "------------------------------------------------------------"
|
|
echo "STEP 5: Generating Secret Key"
|
|
echo "------------------------------------------------------------"
|
|
echo ""
|
|
SECRET_KEY=$(openssl rand -base64 32)
|
|
echo " [OK] Generated secure SECRET_KEY"
|
|
|
|
echo ""
|
|
echo "------------------------------------------------------------"
|
|
echo "STEP 6: Creating Configuration File"
|
|
echo "------------------------------------------------------------"
|
|
echo ""
|
|
cat > "$INSTALL_DIR/myfsio.env" << EOF
|
|
# MyFSIO Configuration
|
|
# Generated by install.sh on $(date)
|
|
# Documentation: https://go.jzwsite.com/myfsio
|
|
|
|
# Storage paths
|
|
STORAGE_ROOT=$DATA_DIR
|
|
LOG_DIR=$LOG_DIR
|
|
|
|
# Network
|
|
APP_HOST=0.0.0.0
|
|
APP_PORT=$API_PORT
|
|
|
|
# Security - CHANGE IN PRODUCTION
|
|
SECRET_KEY=$SECRET_KEY
|
|
CORS_ORIGINS=*
|
|
|
|
# Public URL (set this if behind a reverse proxy)
|
|
$(if [[ -n "$API_URL" ]]; then echo "API_BASE_URL=$API_URL"; else echo "# API_BASE_URL=https://s3.example.com"; fi)
|
|
|
|
# Logging
|
|
LOG_LEVEL=INFO
|
|
LOG_TO_FILE=true
|
|
|
|
# Rate limiting
|
|
RATE_LIMIT_DEFAULT=200 per minute
|
|
|
|
# Optional: Encryption (uncomment to enable)
|
|
# ENCRYPTION_ENABLED=true
|
|
# KMS_ENABLED=true
|
|
EOF
|
|
chmod 600 "$INSTALL_DIR/myfsio.env"
|
|
echo " [OK] Created $INSTALL_DIR/myfsio.env"
|
|
|
|
echo ""
|
|
echo "------------------------------------------------------------"
|
|
echo "STEP 7: Setting Permissions"
|
|
echo "------------------------------------------------------------"
|
|
echo ""
|
|
chown -R "$SERVICE_USER:$SERVICE_USER" "$INSTALL_DIR"
|
|
echo " [OK] Set ownership for $INSTALL_DIR"
|
|
chown -R "$SERVICE_USER:$SERVICE_USER" "$DATA_DIR"
|
|
echo " [OK] Set ownership for $DATA_DIR"
|
|
chown -R "$SERVICE_USER:$SERVICE_USER" "$LOG_DIR"
|
|
echo " [OK] Set ownership for $LOG_DIR"
|
|
|
|
if [[ "$SKIP_SYSTEMD" != true ]]; then
|
|
echo ""
|
|
echo "------------------------------------------------------------"
|
|
echo "STEP 8: Creating Systemd Service"
|
|
echo "------------------------------------------------------------"
|
|
echo ""
|
|
cat > /etc/systemd/system/myfsio.service << EOF
|
|
[Unit]
|
|
Description=MyFSIO S3-Compatible Storage
|
|
Documentation=https://go.jzwsite.com/myfsio
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=$SERVICE_USER
|
|
Group=$SERVICE_USER
|
|
WorkingDirectory=$INSTALL_DIR
|
|
EnvironmentFile=$INSTALL_DIR/myfsio.env
|
|
ExecStart=$INSTALL_DIR/myfsio
|
|
Restart=on-failure
|
|
RestartSec=5
|
|
|
|
# Security hardening
|
|
NoNewPrivileges=true
|
|
ProtectSystem=strict
|
|
ProtectHome=true
|
|
ReadWritePaths=$DATA_DIR $LOG_DIR
|
|
PrivateTmp=true
|
|
|
|
# Resource limits (adjust as needed)
|
|
# LimitNOFILE=65535
|
|
# MemoryMax=2G
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
systemctl daemon-reload
|
|
echo " [OK] Created /etc/systemd/system/myfsio.service"
|
|
echo " [OK] Reloaded systemd daemon"
|
|
else
|
|
echo ""
|
|
echo "------------------------------------------------------------"
|
|
echo "STEP 8: Skipping Systemd Service (--no-systemd flag used)"
|
|
echo "------------------------------------------------------------"
|
|
fi
|
|
|
|
echo ""
|
|
echo "============================================================"
|
|
echo " Installation Complete!"
|
|
echo "============================================================"
|
|
echo ""
|
|
|
|
if [[ "$SKIP_SYSTEMD" != true ]]; then
|
|
echo "------------------------------------------------------------"
|
|
echo "STEP 9: Start the Service"
|
|
echo "------------------------------------------------------------"
|
|
echo ""
|
|
|
|
if [[ "$AUTO_YES" != true ]]; then
|
|
read -p "Would you like to start MyFSIO now? [Y/n] " -n 1 -r
|
|
echo
|
|
START_SERVICE=true
|
|
if [[ $REPLY =~ ^[Nn]$ ]]; then
|
|
START_SERVICE=false
|
|
fi
|
|
else
|
|
START_SERVICE=true
|
|
fi
|
|
|
|
if [[ "$START_SERVICE" == true ]]; then
|
|
echo " Starting MyFSIO service..."
|
|
systemctl start myfsio
|
|
echo " [OK] Service started"
|
|
echo ""
|
|
|
|
read -p "Would you like to enable MyFSIO to start on boot? [Y/n] " -n 1 -r
|
|
echo
|
|
if [[ ! $REPLY =~ ^[Nn]$ ]]; then
|
|
systemctl enable myfsio
|
|
echo " [OK] Service enabled on boot"
|
|
fi
|
|
echo ""
|
|
|
|
sleep 2
|
|
echo " Service Status:"
|
|
echo " ---------------"
|
|
if systemctl is-active --quiet myfsio; then
|
|
echo " [OK] MyFSIO is running"
|
|
else
|
|
echo " [WARNING] MyFSIO may not have started correctly"
|
|
echo " Check logs with: journalctl -u myfsio -f"
|
|
fi
|
|
else
|
|
echo " [SKIPPED] Service not started"
|
|
echo ""
|
|
echo " To start manually, run:"
|
|
echo " sudo systemctl start myfsio"
|
|
echo ""
|
|
echo " To enable on boot, run:"
|
|
echo " sudo systemctl enable myfsio"
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
echo "============================================================"
|
|
echo " Summary"
|
|
echo "============================================================"
|
|
echo ""
|
|
echo "Access Points:"
|
|
echo " API: http://$(hostname -I 2>/dev/null | awk '{print $1}' || echo "localhost"):$API_PORT"
|
|
echo " UI: http://$(hostname -I 2>/dev/null | awk '{print $1}' || echo "localhost"):$UI_PORT/ui"
|
|
echo ""
|
|
echo "Default Credentials:"
|
|
echo " Username: localadmin"
|
|
echo " Password: localadmin"
|
|
echo " [!] WARNING: Change these immediately after first login!"
|
|
echo ""
|
|
echo "Configuration Files:"
|
|
echo " Environment: $INSTALL_DIR/myfsio.env"
|
|
echo " IAM Users: $DATA_DIR/.myfsio.sys/config/iam.json"
|
|
echo " Bucket Policies: $DATA_DIR/.myfsio.sys/config/bucket_policies.json"
|
|
echo ""
|
|
echo "Useful Commands:"
|
|
echo " Check status: sudo systemctl status myfsio"
|
|
echo " View logs: sudo journalctl -u myfsio -f"
|
|
echo " Restart: sudo systemctl restart myfsio"
|
|
echo " Stop: sudo systemctl stop myfsio"
|
|
echo ""
|
|
echo "Documentation: https://go.jzwsite.com/myfsio"
|
|
echo ""
|
|
echo "============================================================"
|
|
echo " Thank you for installing MyFSIO!"
|
|
echo "============================================================"
|
|
echo ""
|