Files
Alphaeus Mote be6d358086 Initial Commit
2025-11-19 08:09:34 -05:00

176 lines
4.7 KiB
Bash

#!/bin/bash
# Depl0y Setup Script
# This script sets up Depl0y on a fresh server
set -e
echo "========================================="
echo " Depl0y Installation Script"
echo "========================================="
echo ""
# Check if running as root
if [ "$EUID" -ne 0 ]; then
echo "Please run as root (use sudo)"
exit 1
fi
# Detect OS
if [ -f /etc/os-release ]; then
. /etc/os-release
OS=$ID
VERSION=$VERSION_ID
else
echo "Cannot detect OS. Exiting."
exit 1
fi
echo "Detected OS: $OS $VERSION"
echo ""
# Install Docker and Docker Compose
echo "Installing Docker and Docker Compose..."
if ! command -v docker &> /dev/null; then
curl -fsSL https://get.docker.com | sh
systemctl enable docker
systemctl start docker
echo "Docker installed successfully"
else
echo "Docker is already installed"
fi
if ! command -v docker-compose &> /dev/null; then
curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
echo "Docker Compose installed successfully"
else
echo "Docker Compose is already installed"
fi
echo ""
# Generate secrets
echo "Generating secure secrets..."
if [ ! -f .env ]; then
cp .env.example .env
# Generate SECRET_KEY (64 character random string)
SECRET_KEY=$(openssl rand -hex 32)
sed -i "s|SECRET_KEY=.*|SECRET_KEY=$SECRET_KEY|" .env
# Generate ENCRYPTION_KEY (Fernet key)
ENCRYPTION_KEY=$(python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" 2>/dev/null || openssl rand -base64 32)
sed -i "s|ENCRYPTION_KEY=.*|ENCRYPTION_KEY=$ENCRYPTION_KEY|" .env
# Generate database passwords
MYSQL_ROOT_PASSWORD=$(openssl rand -hex 16)
MYSQL_PASSWORD=$(openssl rand -hex 16)
sed -i "s|MYSQL_ROOT_PASSWORD=.*|MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD|" .env
sed -i "s|MYSQL_PASSWORD=.*|MYSQL_PASSWORD=$MYSQL_PASSWORD|" .env
echo ".env file created with secure random secrets"
else
echo ".env file already exists, skipping secret generation"
fi
echo ""
# Create necessary directories
echo "Creating directories..."
mkdir -p /var/lib/depl0y/{isos,cloud-init,ssh_keys}
mkdir -p /var/log/depl0y
chmod 755 /var/lib/depl0y
chmod 755 /var/log/depl0y
echo ""
# Build and start containers
echo "Building and starting Docker containers..."
docker-compose up -d --build
echo ""
echo "Waiting for services to start..."
sleep 10
# Run database migrations
echo "Running database migrations..."
docker-compose exec -T backend alembic upgrade head || echo "Note: Alembic migrations may need to be configured"
# Create default admin user
echo ""
echo "Creating default admin user..."
read -p "Enter admin username (default: admin): " ADMIN_USER
ADMIN_USER=${ADMIN_USER:-admin}
read -p "Enter admin email: " ADMIN_EMAIL
while [ -z "$ADMIN_EMAIL" ]; do
echo "Email cannot be empty"
read -p "Enter admin email: " ADMIN_EMAIL
done
read -sp "Enter admin password: " ADMIN_PASSWORD
echo ""
while [ ${#ADMIN_PASSWORD} -lt 8 ]; do
echo "Password must be at least 8 characters"
read -sp "Enter admin password: " ADMIN_PASSWORD
echo ""
done
# Create admin user via Python script
docker-compose exec -T backend python3 << EOF
from app.core.database import SessionLocal
from app.models import User, UserRole
from app.core.security import get_password_hash
db = SessionLocal()
try:
# Check if user exists
existing_user = db.query(User).filter(User.username == "$ADMIN_USER").first()
if existing_user:
print("User '$ADMIN_USER' already exists")
else:
# Create admin user
admin = User(
username="$ADMIN_USER",
email="$ADMIN_EMAIL",
hashed_password=get_password_hash("$ADMIN_PASSWORD"),
role=UserRole.ADMIN,
is_active=True
)
db.add(admin)
db.commit()
print("Admin user created successfully")
except Exception as e:
print(f"Error creating admin user: {e}")
finally:
db.close()
EOF
echo ""
echo "========================================="
echo " Installation Complete!"
echo "========================================="
echo ""
echo "Depl0y is now running!"
echo ""
echo "Access the web interface at: http://$(hostname -I | awk '{print $1}')"
echo ""
echo "Default credentials:"
echo " Username: $ADMIN_USER"
echo " Password: (the one you just entered)"
echo ""
echo "Important: Change the default admin password after first login!"
echo ""
echo "To view logs:"
echo " docker-compose logs -f"
echo ""
echo "To stop Depl0y:"
echo " docker-compose down"
echo ""
echo "To start Depl0y:"
echo " docker-compose up -d"
echo ""
echo "========================================="