* update cf worker hostname
* set remote_url cookie from param
* ephemeral backends v1
* nit
* Run queue server
* ntis
* timeout
* better db process management
* commit hash and worktree
* nit use map
* nit
* err handling
* Revert "err handling"
This reverts commit 19de00c0c0.
* nits
* auto cleanup
* Ephemeral backend command action
* remove checkout
* checkout ee repo
* nits
* process.env.GIT_EE_DEPLOY_KEY_FILE
* resumeURLs logic
* nit
* use windmill flow for ephemeral backend action
* fixes
* new token
* worktree pools
* Delete GH secret on cleanup
* linux deploy
* nit
* nit
* unhandled promises
* nit
* fix docker bridge IP on linux
* pass cf_frontend_url to wmill flow
* git fetch
* release worktree when binary started
* send error
* logger
* logging
* logging 2
* delete log files periodically
* redirect to raw app with logs
* CORS
* MANAGER_AUTH_TOKEN
* Check organization membership
* nit
* bwrap
* nit
* return timeoutAt in resumeUrl
* nit
* Change password
* nit remove https
168 lines
5.7 KiB
Bash
Executable File
168 lines
5.7 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m' # No Color
|
|
|
|
echo "🎛️ Windmill Ephemeral Backend Manager - Installation Script"
|
|
echo "=========================================================="
|
|
echo ""
|
|
|
|
# Check if running as root
|
|
if [ "$EUID" -ne 0 ]; then
|
|
echo -e "${RED}❌ This script must be run as root (use sudo)${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# Get the actual user who ran sudo (if applicable)
|
|
ACTUAL_USER="${SUDO_USER:-$(whoami)}"
|
|
|
|
# Configuration
|
|
SERVICE_USER="sandbox"
|
|
SERVICE_NAME="windmill-ephemeral-manager"
|
|
REPO_DIR="/home/$SERVICE_USER/ephemeral-backend/windmill"
|
|
ENV_DIR="/etc/$SERVICE_NAME"
|
|
ENV_FILE="$ENV_DIR/.env"
|
|
|
|
echo "📋 Configuration:"
|
|
echo " Service user: $SERVICE_USER"
|
|
echo " Repository directory: $REPO_DIR"
|
|
echo " Environment file: $ENV_FILE"
|
|
echo ""
|
|
|
|
# Check if sandbox user exists
|
|
if ! id "$SERVICE_USER" &>/dev/null; then
|
|
echo -e "${RED}❌ User '$SERVICE_USER' does not exist${NC}"
|
|
echo " Create the user first: sudo adduser --system --group $SERVICE_USER"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if repository directory exists
|
|
if [ ! -d "$REPO_DIR" ]; then
|
|
echo -e "${RED}❌ Repository directory does not exist: $REPO_DIR${NC}"
|
|
echo " Clone the repository first as user $SERVICE_USER"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if bun is installed for the service user
|
|
if ! sudo -u "$SERVICE_USER" bash -c "command -v bun" &>/dev/null; then
|
|
echo -e "${RED}❌ Bun is not installed for user $SERVICE_USER${NC}"
|
|
echo " Install bun: curl -fsSL https://bun.sh/install | bash"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if bubblewrap is installed
|
|
if ! command -v bwrap &>/dev/null; then
|
|
echo -e "${YELLOW}⚠️ bubblewrap is not installed${NC}"
|
|
echo " Installing bubblewrap..."
|
|
apt-get update -qq
|
|
apt-get install -y -qq bubblewrap
|
|
echo -e "${GREEN}✓ bubblewrap installed${NC}"
|
|
fi
|
|
|
|
# Check if cloudflared is installed
|
|
if ! command -v cloudflared &>/dev/null; then
|
|
echo -e "${YELLOW}⚠️ cloudflared is not installed${NC}"
|
|
echo " Installing cloudflared..."
|
|
|
|
# Detect architecture
|
|
ARCH=$(uname -m)
|
|
if [ "$ARCH" = "x86_64" ]; then
|
|
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
|
|
dpkg -i cloudflared-linux-amd64.deb
|
|
rm cloudflared-linux-amd64.deb
|
|
elif [ "$ARCH" = "aarch64" ]; then
|
|
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64.deb
|
|
dpkg -i cloudflared-linux-arm64.deb
|
|
rm cloudflared-linux-arm64.deb
|
|
else
|
|
echo -e "${RED}❌ Unsupported architecture: $ARCH${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
echo -e "${GREEN}✓ cloudflared installed${NC}"
|
|
fi
|
|
|
|
# Check if docker is installed and service user has access
|
|
if ! command -v docker &>/dev/null; then
|
|
echo -e "${RED}❌ Docker is not installed${NC}"
|
|
echo " Install docker: https://docs.docker.com/engine/install/"
|
|
exit 1
|
|
fi
|
|
|
|
if ! sudo -u "$SERVICE_USER" docker ps &>/dev/null; then
|
|
echo -e "${YELLOW}⚠️ User $SERVICE_USER cannot access Docker${NC}"
|
|
echo " Adding $SERVICE_USER to docker group..."
|
|
usermod -aG docker "$SERVICE_USER"
|
|
echo -e "${GREEN}✓ User added to docker group (may require logout/login)${NC}"
|
|
fi
|
|
|
|
# Create environment directory
|
|
echo ""
|
|
echo "📁 Setting up environment..."
|
|
mkdir -p "$ENV_DIR"
|
|
chmod 755 "$ENV_DIR"
|
|
|
|
# Copy or create environment file
|
|
if [ ! -f "$ENV_FILE" ]; then
|
|
if [ -f "$REPO_DIR/ephemeral-backends/.env.template" ]; then
|
|
cp "$REPO_DIR/ephemeral-backends/.env.template" "$ENV_FILE"
|
|
echo -e "${YELLOW}⚠️ Environment file created from template: $ENV_FILE${NC}"
|
|
echo " ${RED}IMPORTANT: Edit this file and fill in the required values!${NC}"
|
|
else
|
|
echo -e "${RED}❌ Template file not found: $REPO_DIR/ephemeral-backends/.env.template${NC}"
|
|
exit 1
|
|
fi
|
|
else
|
|
echo -e "${GREEN}✓ Environment file already exists: $ENV_FILE${NC}"
|
|
fi
|
|
|
|
chmod 600 "$ENV_FILE"
|
|
|
|
# Install systemd service
|
|
echo ""
|
|
echo "🔧 Installing systemd service..."
|
|
cp "$REPO_DIR/ephemeral-backends/windmill-ephemeral-manager.service" "/etc/systemd/system/$SERVICE_NAME.service"
|
|
chmod 644 "/etc/systemd/system/$SERVICE_NAME.service"
|
|
echo -e "${GREEN}✓ Service file installed${NC}"
|
|
|
|
# Reload systemd
|
|
echo ""
|
|
echo "🔄 Reloading systemd..."
|
|
systemctl daemon-reload
|
|
echo -e "${GREEN}✓ Systemd reloaded${NC}"
|
|
|
|
# Enable service
|
|
echo ""
|
|
echo "✅ Enabling service..."
|
|
systemctl enable "$SERVICE_NAME.service"
|
|
echo -e "${GREEN}✓ Service enabled (will start on boot)${NC}"
|
|
|
|
echo ""
|
|
echo "=========================================================="
|
|
echo -e "${GREEN}✅ Installation complete!${NC}"
|
|
echo ""
|
|
echo "📝 Next steps:"
|
|
echo " 1. Edit the environment file: sudo nano $ENV_FILE"
|
|
echo " 2. Fill in the required values:"
|
|
echo " - MANAGER_AUTH_TOKEN (generate with: openssl rand -hex 32)"
|
|
echo " - GITHUB_TOKEN (GitHub personal access token)"
|
|
echo " - GIT_EE_DEPLOY_KEY_FILE (path to SSH deploy key)"
|
|
echo " 3. Ensure the SSH deploy key exists and is readable by $SERVICE_USER"
|
|
echo " 4. Add MANAGER_AUTH_TOKEN to GitHub repository secrets"
|
|
echo " 5. Start the service: sudo systemctl start $SERVICE_NAME"
|
|
echo " 6. Check status: sudo systemctl status $SERVICE_NAME"
|
|
echo " 7. View logs: sudo journalctl -u $SERVICE_NAME -f"
|
|
echo ""
|
|
echo "🔍 Useful commands:"
|
|
echo " sudo systemctl start $SERVICE_NAME # Start the service"
|
|
echo " sudo systemctl stop $SERVICE_NAME # Stop the service"
|
|
echo " sudo systemctl restart $SERVICE_NAME # Restart the service"
|
|
echo " sudo systemctl status $SERVICE_NAME # Check service status"
|
|
echo " sudo journalctl -u $SERVICE_NAME -f # Follow logs"
|
|
echo " sudo journalctl -u $SERVICE_NAME -n 100 # Last 100 log lines"
|
|
echo ""
|