Files
tyto/scripts/install.sh
vikingowl a9347db989 fix: update repository URLs to somegit.dev
- Update clone URL in README quick start
- Update install script URLs to Gitea raw format
- Update TYTO_REPO to use somegit.dev domain
- Update systemd service documentation URL

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-28 09:04:16 +01:00

319 lines
7.6 KiB
Bash
Executable File

#!/bin/bash
#
# Tyto System Monitor - Installation Script
#
# Usage:
# curl -fsSL https://somegit.dev/vikingowl/tyto/raw/branch/main/scripts/install.sh | bash
# or
# wget -qO- https://somegit.dev/vikingowl/tyto/raw/branch/main/scripts/install.sh | bash
#
# Environment Variables:
# TYTO_MODE - Installation mode: standalone (default), server, agent
# TYTO_VERSION - Version to install (default: latest)
# TYTO_INSTALL_DIR - Installation directory (default: /opt/tyto)
# TYTO_DATA_DIR - Data directory (default: /var/lib/tyto)
# TYTO_USER - System user for tyto (default: tyto)
#
set -euo pipefail
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Default values
TYTO_MODE="${TYTO_MODE:-standalone}"
TYTO_VERSION="${TYTO_VERSION:-latest}"
TYTO_INSTALL_DIR="${TYTO_INSTALL_DIR:-/opt/tyto}"
TYTO_DATA_DIR="${TYTO_DATA_DIR:-/var/lib/tyto}"
TYTO_USER="${TYTO_USER:-tyto}"
TYTO_REPO="somegit.dev/vikingowl/tyto"
# Logging functions
log_info() { echo -e "${BLUE}[INFO]${NC} $*"; }
log_success() { echo -e "${GREEN}[OK]${NC} $*"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
log_error() { echo -e "${RED}[ERROR]${NC} $*" >&2; }
# Check if running as root
check_root() {
if [[ $EUID -ne 0 ]]; then
log_error "This script must be run as root (use sudo)"
exit 1
fi
}
# Detect OS and architecture
detect_platform() {
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m)
case "$ARCH" in
x86_64|amd64) ARCH="amd64" ;;
aarch64|arm64) ARCH="arm64" ;;
armv7l|armhf) ARCH="arm" ;;
*) log_error "Unsupported architecture: $ARCH"; exit 1 ;;
esac
case "$OS" in
linux) OS="linux" ;;
darwin) OS="darwin" ;;
*) log_error "Unsupported operating system: $OS"; exit 1 ;;
esac
log_info "Detected platform: ${OS}/${ARCH}"
}
# Check dependencies
check_dependencies() {
local deps=("curl" "tar")
local missing=()
for dep in "${deps[@]}"; do
if ! command -v "$dep" &>/dev/null; then
missing+=("$dep")
fi
done
if [[ ${#missing[@]} -gt 0 ]]; then
log_error "Missing dependencies: ${missing[*]}"
log_info "Please install them and try again"
exit 1
fi
}
# Create system user
create_user() {
if id "$TYTO_USER" &>/dev/null; then
log_info "User $TYTO_USER already exists"
else
log_info "Creating user $TYTO_USER..."
useradd --system --no-create-home --shell /sbin/nologin "$TYTO_USER"
log_success "User created"
fi
}
# Create directories
create_directories() {
log_info "Creating directories..."
mkdir -p "$TYTO_INSTALL_DIR"/{bin,etc,logs}
mkdir -p "$TYTO_DATA_DIR"/{db,certs}
chown -R "$TYTO_USER:$TYTO_USER" "$TYTO_DATA_DIR"
chmod 700 "$TYTO_DATA_DIR/certs"
log_success "Directories created"
}
# Download and install binary
install_binary() {
local binary_name="tyto"
local download_url
if [[ "$TYTO_VERSION" == "latest" ]]; then
download_url="https://${TYTO_REPO}/releases/latest/download/tyto-${OS}-${ARCH}.tar.gz"
else
download_url="https://${TYTO_REPO}/releases/download/${TYTO_VERSION}/tyto-${OS}-${ARCH}.tar.gz"
fi
log_info "Downloading Tyto from $download_url..."
local tmp_dir
tmp_dir=$(mktemp -d)
trap "rm -rf $tmp_dir" EXIT
if ! curl -fsSL "$download_url" -o "$tmp_dir/tyto.tar.gz"; then
log_error "Failed to download Tyto"
exit 1
fi
tar -xzf "$tmp_dir/tyto.tar.gz" -C "$tmp_dir"
mv "$tmp_dir/tyto" "$TYTO_INSTALL_DIR/bin/"
chmod +x "$TYTO_INSTALL_DIR/bin/tyto"
# Create symlink
ln -sf "$TYTO_INSTALL_DIR/bin/tyto" /usr/local/bin/tyto
log_success "Binary installed to $TYTO_INSTALL_DIR/bin/tyto"
}
# Create configuration file
create_config() {
local config_file="$TYTO_INSTALL_DIR/etc/config.yaml"
if [[ -f "$config_file" ]]; then
log_warn "Config file already exists, backing up..."
cp "$config_file" "${config_file}.bak"
fi
log_info "Creating configuration for mode: $TYTO_MODE"
cat > "$config_file" << EOF
# Tyto System Monitor Configuration
# Generated by install script
mode: $TYTO_MODE
http:
port: 8080
host: "0.0.0.0"
refresh_rate: 5
# Database (for server mode)
database:
type: sqlite
path: $TYTO_DATA_DIR/db/tyto.db
# Server settings (for multi-device)
server:
grpc_port: 9849
tls:
enabled: false
# ca_cert: $TYTO_DATA_DIR/certs/ca.crt
# server_cert: $TYTO_DATA_DIR/certs/server.crt
# server_key: $TYTO_DATA_DIR/certs/server.key
# Log settings
logging:
level: info
format: text
# Alerts
alerts:
enabled: true
thresholds:
cpu: 90
memory: 85
disk: 90
EOF
chown "$TYTO_USER:$TYTO_USER" "$config_file"
chmod 640 "$config_file"
log_success "Configuration created"
}
# Create systemd service
create_systemd_service() {
local service_file="/etc/systemd/system/tyto.service"
log_info "Creating systemd service..."
cat > "$service_file" << EOF
[Unit]
Description=Tyto System Monitor
Documentation=https://somegit.dev/vikingowl/tyto
After=network.target
[Service]
Type=simple
User=$TYTO_USER
Group=$TYTO_USER
ExecStart=$TYTO_INSTALL_DIR/bin/tyto --config $TYTO_INSTALL_DIR/etc/config.yaml
Restart=always
RestartSec=5
StandardOutput=append:$TYTO_INSTALL_DIR/logs/tyto.log
StandardError=append:$TYTO_INSTALL_DIR/logs/tyto.log
# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
ReadWritePaths=$TYTO_DATA_DIR $TYTO_INSTALL_DIR/logs
ReadOnlyPaths=/proc /sys
# Resource limits
MemoryMax=256M
CPUQuota=50%
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
log_success "Systemd service created"
}
# Enable and start service
start_service() {
log_info "Enabling and starting Tyto..."
systemctl enable tyto
systemctl start tyto
sleep 2
if systemctl is-active --quiet tyto; then
log_success "Tyto is running!"
else
log_error "Tyto failed to start. Check logs: journalctl -u tyto"
exit 1
fi
}
# Print installation summary
print_summary() {
local ip
ip=$(hostname -I | awk '{print $1}')
echo ""
echo "=========================================="
echo -e "${GREEN}Tyto installation complete!${NC}"
echo "=========================================="
echo ""
echo "Installation Details:"
echo " Mode: $TYTO_MODE"
echo " Binary: $TYTO_INSTALL_DIR/bin/tyto"
echo " Config: $TYTO_INSTALL_DIR/etc/config.yaml"
echo " Data: $TYTO_DATA_DIR"
echo " Logs: $TYTO_INSTALL_DIR/logs/"
echo ""
echo "Service Commands:"
echo " Status: systemctl status tyto"
echo " Logs: journalctl -u tyto -f"
echo " Restart: systemctl restart tyto"
echo " Stop: systemctl stop tyto"
echo ""
echo "Access Dashboard:"
echo " http://${ip}:8080"
echo ""
}
# Main installation flow
main() {
echo ""
echo " _____ _ "
echo " |_ _| | | "
echo " | |_ _| |_ ___ "
echo " | | | | | __/ _ \\"
echo " | | |_| | || (_) |"
echo " |_|\__, |\__\___/"
echo " __/ | "
echo " |___/ "
echo ""
echo "Tyto System Monitor - Installation Script"
echo "=========================================="
echo ""
check_root
detect_platform
check_dependencies
create_user
create_directories
install_binary
create_config
create_systemd_service
start_service
print_summary
}
main "$@"