#!/bin/bash # ======================================== # AI Recruitment Site - SAAC Deployment Script # ======================================== # This script deploys your recruitment site to StartAnAiCompany infrastructure # via apps.startanaicompany.com # # IMPORTANT: Copy this file to deploy-to-apps.sh and customize it # DO NOT commit deploy-to-apps.sh to git (it's in .gitignore) # # Prerequisites: # 1. Register for API key at: https://apps.startanaicompany.com/api/v1/register # 2. Set SAAC_API_KEY environment variable # 3. Set GITEA_API_TOKEN environment variable (required for setup mode) # 4. Customize your .env file with company information # # Modes: # ./deploy-to-apps.sh # Auto-detect (setup or update) # ./deploy-to-apps.sh --setup # Force new deployment # ./deploy-to-apps.sh --update # Force update existing # ./deploy-to-apps.sh --status # Check deployment status set -e # Exit on error # Configuration DEPLOYMENT_UUID_FILE=".deployment-uuid" DEPLOYMENT_INFO_FILE="deployment-info.txt" SAAC_API="https://apps.startanaicompany.com/api/v1" GITEA_API="https://git.startanaicompany.com/api/v1" # Parse command line arguments MODE="auto" if [ "$1" == "--setup" ]; then MODE="setup" elif [ "$1" == "--update" ]; then MODE="update" elif [ "$1" == "--status" ]; then MODE="status" elif [ -n "$1" ]; then echo "❌ Unknown option: $1" echo "" echo "Usage:" echo " $0 # Auto-detect mode" echo " $0 --setup # Force new deployment" echo " $0 --update # Force update existing" echo " $0 --status # Check deployment status" exit 1 fi # Auto-detect mode based on .deployment-uuid existence if [ "$MODE" == "auto" ]; then if [ -f "$DEPLOYMENT_UUID_FILE" ]; then MODE="update" else MODE="setup" fi fi # Load environment variables from .env if [ ! -f .env ]; then echo "❌ Error: .env file not found. Copy .env.example to .env and customize it." exit 1 fi source .env # Check required environment variables if [ -z "$SAAC_API_KEY" ]; then echo "❌ Error: SAAC_API_KEY environment variable not set" echo "" echo "To get your API key:" echo "1. Register at: curl -X POST https://apps.startanaicompany.com/api/v1/users/register \\" echo " -H 'Content-Type: application/json' \\" echo " -d '{\"email\":\"your@email.com\",\"gitea_username\":\"${GITEA_USERNAME}\"}'" echo "" echo "2. Save the returned API key" echo "3. Export it: export SAAC_API_KEY='your_api_key_here'" echo "" exit 1 fi # GITEA_API_TOKEN only required for setup mode (webhook creation) if [ "$MODE" == "setup" ] && [ -z "$GITEA_API_TOKEN" ]; then echo "❌ Error: GITEA_API_TOKEN environment variable not set" echo "" echo "GITEA_API_TOKEN is required for setup mode to:" echo " - Set up automatic deployment webhooks" echo "" echo "To get your Gitea API token:" echo "1. Go to https://git.startanaicompany.com" echo "2. Click your profile → Settings → Applications" echo "3. Generate New Token (grant 'repo' permissions)" echo "4. Export it: export GITEA_API_TOKEN='your_token_here'" echo "" exit 1 fi # Check required .env variables if [ -z "$COMPANY_NAME" ]; then echo "❌ Error: COMPANY_NAME not set in .env" exit 1 fi if [ -z "$SUBDOMAIN" ]; then echo "❌ Error: SUBDOMAIN not set in .env" exit 1 fi if [ "$MODE" == "setup" ]; then if [ -z "$GITEA_USERNAME" ]; then echo "❌ Error: GITEA_USERNAME not set in .env" exit 1 fi if [ -z "$GITEA_REPO_NAME" ]; then echo "❌ Error: GITEA_REPO_NAME not set in .env" exit 1 fi fi # Repository URL (SSH format required by Coolify for private repos) REPO_URL="git@git.startanaicompany.com:${GITEA_USERNAME}/${GITEA_REPO_NAME}.git" # Domain (e.g., annarecruit.startanaicompany.com or johnrecruit.startanaicompany.com) FULL_DOMAIN="${SUBDOMAIN}recruit.startanaicompany.com" # ======================================== # MODE: STATUS # ======================================== if [ "$MODE" == "status" ]; then echo "=========================================" echo " Deployment Status" echo "=========================================" echo "" # Check if deployment UUID exists if [ ! -f "$DEPLOYMENT_UUID_FILE" ]; then echo "❌ No deployment found" echo " Run './deploy-to-apps.sh --setup' to create a new deployment" exit 1 fi APP_UUID=$(cat "$DEPLOYMENT_UUID_FILE") echo "📦 Fetching status for application: $APP_UUID" echo "" # Get application details STATUS_RESPONSE=$(curl -s -X GET "${SAAC_API}/applications/${APP_UUID}" \ -H "X-API-Key: ${SAAC_API_KEY}") # Check for errors if echo "$STATUS_RESPONSE" | grep -q "error"; then echo "❌ Failed to fetch status:" echo "$STATUS_RESPONSE" | jq '.' 2>/dev/null || echo "$STATUS_RESPONSE" exit 1 fi # Display formatted status echo "Application UUID: $APP_UUID" echo "Name: $(echo "$STATUS_RESPONSE" | jq -r '.app_name')" echo "Domain: $(echo "$STATUS_RESPONSE" | jq -r '.domain')" echo "Status: $(echo "$STATUS_RESPONSE" | jq -r '.status')" echo "Repository: $(echo "$STATUS_RESPONSE" | jq -r '.git_repo')" echo "Branch: $(echo "$STATUS_RESPONSE" | jq -r '.git_branch')" echo "Created: $(echo "$STATUS_RESPONSE" | jq -r '.created_at')" echo "" echo "🔍 View logs:" echo " curl -H \"X-API-Key: \$SAAC_API_KEY\" \\" echo " ${SAAC_API}/applications/${APP_UUID}/logs" echo "" exit 0 fi # ======================================== # MODE: UPDATE # ======================================== if [ "$MODE" == "update" ]; then echo "=========================================" echo " AI Recruitment Site Deployment" echo "=========================================" echo "📝 Mode: UPDATE (existing deployment)" echo "" # Check if deployment UUID exists if [ ! -f "$DEPLOYMENT_UUID_FILE" ]; then echo "❌ No deployment found (.deployment-uuid file missing)" echo " Run './deploy-to-apps.sh --setup' to create a new deployment" exit 1 fi APP_UUID=$(cat "$DEPLOYMENT_UUID_FILE") echo "📦 Configuration:" echo " Application UUID: $APP_UUID" echo " Company: $COMPANY_NAME" echo " Domain: https://$FULL_DOMAIN" echo "" # Verify application still exists echo "🔍 Verifying application exists..." VERIFY_RESPONSE=$(curl -s -X GET "${SAAC_API}/applications/${APP_UUID}" \ -H "X-API-Key: ${SAAC_API_KEY}") if echo "$VERIFY_RESPONSE" | grep -q "error"; then echo "❌ Application not found or access denied" echo " The application may have been deleted or UUID is invalid" echo " Run './deploy-to-apps.sh --setup' to create a new deployment" exit 1 fi echo "✅ Application verified" echo "" # Update environment variables echo "🔄 Updating environment variables..." UPDATE_RESPONSE=$(curl -s -X PATCH "${SAAC_API}/applications/${APP_UUID}/env" \ -H "X-API-Key: ${SAAC_API_KEY}" \ -H "Content-Type: application/json" \ -d "{ \"variables\": { \"COMPANY_NAME\": \"${COMPANY_NAME}\", \"COMPANY_TAGLINE\": \"${COMPANY_TAGLINE}\", \"COMPANY_DESCRIPTION\": \"${COMPANY_DESCRIPTION}\", \"PRIMARY_COLOR\": \"${PRIMARY_COLOR}\", \"ACCENT_COLOR\": \"${ACCENT_COLOR}\", \"DARK_COLOR\": \"${DARK_COLOR}\", \"CONTACT_EMAIL\": \"${CONTACT_EMAIL}\", \"CONTACT_PHONE\": \"${CONTACT_PHONE}\", \"CONTACT_ADDRESS\": \"${CONTACT_ADDRESS}\" } }") # Check for errors if echo "$UPDATE_RESPONSE" | grep -q "error"; then echo "❌ Failed to update environment variables:" echo "$UPDATE_RESPONSE" | jq '.' 2>/dev/null || echo "$UPDATE_RESPONSE" exit 1 fi echo "✅ Environment variables updated" echo "" # Trigger redeployment echo "🚀 Triggering redeployment..." DEPLOY_RESPONSE=$(curl -s -X POST "${SAAC_API}/applications/${APP_UUID}/deploy" \ -H "X-API-Key: ${SAAC_API_KEY}") # Check for errors if echo "$DEPLOY_RESPONSE" | grep -q "error"; then echo "❌ Failed to trigger deployment:" echo "$DEPLOY_RESPONSE" | jq '.' 2>/dev/null || echo "$DEPLOY_RESPONSE" exit 1 fi echo "✅ Deployment triggered" echo "" # Update deployment info file cat > "$DEPLOYMENT_INFO_FILE" </dev/null || echo "$APP_RESPONSE" exit 1 fi # Extract application details APP_UUID=$(echo "$APP_RESPONSE" | jq -r '.application_uuid' 2>/dev/null) DOMAIN=$(echo "$APP_RESPONSE" | jq -r '.domain' 2>/dev/null) WEBHOOK_URL=$(echo "$APP_RESPONSE" | jq -r '.webhook_url' 2>/dev/null) if [ "$APP_UUID" == "null" ] || [ -z "$APP_UUID" ]; then echo "❌ Failed to create application" echo "Response: $APP_RESPONSE" exit 1 fi echo "✅ Application created!" echo " Application UUID: $APP_UUID" echo " Domain: $DOMAIN" echo "" # Save UUID to file echo "$APP_UUID" > "$DEPLOYMENT_UUID_FILE" echo "💾 UUID saved to $DEPLOYMENT_UUID_FILE" echo "" # Configure webhook for automatic deployments echo "🪝 Setting up deployment webhook..." WEBHOOK_RESPONSE=$(curl -s -X POST "${GITEA_API}/repos/${GITEA_USERNAME}/${GITEA_REPO_NAME}/hooks" \ -H "Authorization: token ${GITEA_API_TOKEN}" \ -H "Content-Type: application/json" \ -d "{ \"type\": \"gitea\", \"config\": { \"url\": \"${WEBHOOK_URL}\", \"content_type\": \"json\", \"http_method\": \"GET\" }, \"events\": [\"push\"], \"authorization_header\": \"Bearer ${SAAC_API_KEY}\", \"active\": true }") WEBHOOK_ID=$(echo "$WEBHOOK_RESPONSE" | jq -r '.id' 2>/dev/null) if [ "$WEBHOOK_ID" == "null" ] || [ -z "$WEBHOOK_ID" ]; then echo "⚠️ Warning: Failed to create Gitea webhook (may already exist)" else echo "✅ Webhook configured for automatic deployments" fi echo "" # Save deployment info cat > "$DEPLOYMENT_INFO_FILE" <