Skip to content

Commit 0280bf9

Browse files
authored
Merge pull request #182 from DevOpsMadDog/codex/update-setup-script-for-seamless-deployment
Make setup wizard fully automated for docker
2 parents ebcef77 + 1350020 commit 0280bf9

1 file changed

Lines changed: 58 additions & 140 deletions

File tree

scripts/setup-wizard.sh

Lines changed: 58 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
set -euo pipefail
33

44
echo "========================================"
5-
echo " FixOps Setup Wizard"
5+
echo " FixOps One-Click Setup"
66
echo "========================================"
77
echo ""
88

@@ -11,166 +11,84 @@ YELLOW='\033[1;33m'
1111
RED='\033[0;31m'
1212
NC='\033[0m'
1313

14-
prompt_with_default() {
15-
local prompt="$1"
16-
local default="$2"
17-
local value
18-
read -p "$prompt [$default]: " value
19-
echo "${value:-$default}"
20-
}
21-
22-
prompt_yes_no() {
23-
local prompt="$1"
24-
local default="$2"
25-
local value
26-
read -p "$prompt (y/n) [$default]: " value
27-
value="${value:-$default}"
28-
[[ "$value" =~ ^[Yy] ]] && echo "true" || echo "false"
29-
}
30-
3114
generate_secret() {
3215
python3 -c "import secrets; print(secrets.token_urlsafe(32))"
3316
}
3417

35-
echo "This wizard will help you set up FixOps for your environment."
36-
echo ""
18+
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
19+
ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}"
20+
DEPLOYMENT_MODE="${DEPLOYMENT_MODE:-docker}"
21+
COMPOSE_FILE="${COMPOSE_FILE:-docker-compose.demo.yml}"
3722

38-
echo "1. Select Deployment Mode"
39-
echo " - demo: Quick local testing with minimal setup"
40-
echo " - docker: Local Docker Compose deployment"
41-
echo " - aws: AWS EKS production deployment"
42-
echo " - gcp: GCP GKE production deployment"
43-
echo " - azure: Azure AKS production deployment"
44-
echo ""
45-
DEPLOYMENT_MODE=$(prompt_with_default "Deployment mode" "demo")
23+
echo "This script bootstraps a ready-to-run FixOps environment without prompts."
24+
echo "Existing configuration will be replaced with fresh, self-contained defaults."
4625

47-
ENV_FILE=".env"
4826
if [[ -f "$ENV_FILE" ]]; then
49-
echo -e "${YELLOW}Warning: $ENV_FILE already exists${NC}"
50-
OVERWRITE=$(prompt_yes_no "Overwrite existing .env file?" "n")
51-
if [[ "$OVERWRITE" != "true" ]]; then
52-
echo "Keeping existing .env file. Exiting."
53-
exit 0
54-
fi
27+
cp "$ENV_FILE" "${ENV_FILE}.bak"
28+
echo -e "${YELLOW}Existing $ENV_FILE backed up to ${ENV_FILE}.bak${NC}"
5529
fi
5630

5731
echo "" > "$ENV_FILE"
5832
chmod 600 "$ENV_FILE"
5933

60-
echo ""
61-
echo "2. Core Configuration"
62-
API_TOKEN=$(prompt_with_default "API Token (or leave blank to generate)" "")
63-
if [[ -z "$API_TOKEN" ]]; then
64-
API_TOKEN=$(generate_secret)
65-
echo -e "${GREEN}Generated secure API token${NC}"
66-
fi
67-
echo "FIXOPS_API_TOKEN=$API_TOKEN" >> "$ENV_FILE"
34+
echo "" | tee -a "$ENV_FILE" >/dev/null
35+
echo "# Generated by scripts/setup-wizard.sh" >> "$ENV_FILE"
6836
echo "FIXOPS_ENVIRONMENT=$DEPLOYMENT_MODE" >> "$ENV_FILE"
6937

70-
echo ""
71-
echo "3. LLM Provider Configuration"
72-
echo " FixOps uses multi-LLM consensus by default for better decisions."
73-
echo " You can enable single-LLM mode by providing only one API key,"
74-
echo " or run in deterministic mode without any API keys."
75-
echo ""
38+
API_TOKEN="${FIXOPS_API_TOKEN:-$(generate_secret)}"
39+
echo "FIXOPS_API_TOKEN=$API_TOKEN" >> "$ENV_FILE"
7640

77-
USE_LLMS=$(prompt_yes_no "Configure LLM providers?" "y")
78-
if [[ "$USE_LLMS" == "true" ]]; then
79-
echo "" >> "$ENV_FILE"
80-
echo "# LLM Provider Configuration" >> "$ENV_FILE"
81-
82-
ENABLE_OPENAI=$(prompt_yes_no "Enable OpenAI GPT?" "y")
83-
echo "FIXOPS_ENABLE_OPENAI=$ENABLE_OPENAI" >> "$ENV_FILE"
84-
if [[ "$ENABLE_OPENAI" == "true" ]]; then
85-
OPENAI_KEY=$(prompt_with_default "OpenAI API Key (optional)" "")
86-
[[ -n "$OPENAI_KEY" ]] && echo "OPENAI_API_KEY=$OPENAI_KEY" >> "$ENV_FILE"
87-
fi
88-
89-
ENABLE_ANTHROPIC=$(prompt_yes_no "Enable Anthropic Claude?" "y")
90-
echo "FIXOPS_ENABLE_ANTHROPIC=$ENABLE_ANTHROPIC" >> "$ENV_FILE"
91-
if [[ "$ENABLE_ANTHROPIC" == "true" ]]; then
92-
ANTHROPIC_KEY=$(prompt_with_default "Anthropic API Key (optional)" "")
93-
[[ -n "$ANTHROPIC_KEY" ]] && echo "ANTHROPIC_API_KEY=$ANTHROPIC_KEY" >> "$ENV_FILE"
94-
fi
95-
96-
ENABLE_GEMINI=$(prompt_yes_no "Enable Google Gemini?" "y")
97-
echo "FIXOPS_ENABLE_GEMINI=$ENABLE_GEMINI" >> "$ENV_FILE"
98-
if [[ "$ENABLE_GEMINI" == "true" ]]; then
99-
GEMINI_KEY=$(prompt_with_default "Google API Key (optional)" "")
100-
[[ -n "$GEMINI_KEY" ]] && echo "GOOGLE_API_KEY=$GEMINI_KEY" >> "$ENV_FILE"
101-
fi
102-
103-
ENABLE_SENTINEL=$(prompt_yes_no "Enable Sentinel?" "y")
104-
echo "FIXOPS_ENABLE_SENTINEL=$ENABLE_SENTINEL" >> "$ENV_FILE"
105-
if [[ "$ENABLE_SENTINEL" == "true" ]]; then
106-
SENTINEL_KEY=$(prompt_with_default "Sentinel API Key (optional)" "")
107-
[[ -n "$SENTINEL_KEY" ]] && echo "SENTINEL_API_KEY=$SENTINEL_KEY" >> "$ENV_FILE"
108-
fi
109-
else
110-
echo "" >> "$ENV_FILE"
111-
echo "# LLM Provider Configuration - Deterministic Mode" >> "$ENV_FILE"
112-
echo "FIXOPS_ENABLE_OPENAI=false" >> "$ENV_FILE"
113-
echo "FIXOPS_ENABLE_ANTHROPIC=false" >> "$ENV_FILE"
114-
echo "FIXOPS_ENABLE_GEMINI=false" >> "$ENV_FILE"
115-
echo "FIXOPS_ENABLE_SENTINEL=false" >> "$ENV_FILE"
116-
fi
41+
echo "" >> "$ENV_FILE"
42+
echo "# Deterministic LLM configuration (can be overridden with real keys)" >> "$ENV_FILE"
43+
echo "FIXOPS_ENABLE_OPENAI=${FIXOPS_ENABLE_OPENAI:-false}" >> "$ENV_FILE"
44+
echo "FIXOPS_ENABLE_ANTHROPIC=${FIXOPS_ENABLE_ANTHROPIC:-false}" >> "$ENV_FILE"
45+
echo "FIXOPS_ENABLE_GEMINI=${FIXOPS_ENABLE_GEMINI:-false}" >> "$ENV_FILE"
46+
echo "FIXOPS_ENABLE_SENTINEL=${FIXOPS_ENABLE_SENTINEL:-false}" >> "$ENV_FILE"
47+
[[ -n "${OPENAI_API_KEY:-}" ]] && echo "OPENAI_API_KEY=$OPENAI_API_KEY" >> "$ENV_FILE"
48+
[[ -n "${ANTHROPIC_API_KEY:-}" ]] && echo "ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY" >> "$ENV_FILE"
49+
[[ -n "${GOOGLE_API_KEY:-}" ]] && echo "GOOGLE_API_KEY=$GOOGLE_API_KEY" >> "$ENV_FILE"
50+
[[ -n "${SENTINEL_API_KEY:-}" ]] && echo "SENTINEL_API_KEY=$SENTINEL_API_KEY" >> "$ENV_FILE"
11751

118-
echo ""
119-
echo "4. External Integrations (Optional)"
120-
CONFIGURE_INTEGRATIONS=$(prompt_yes_no "Configure Jira/Confluence/Slack?" "n")
121-
if [[ "$CONFIGURE_INTEGRATIONS" == "true" ]]; then
122-
echo "" >> "$ENV_FILE"
123-
echo "# Integration Tokens" >> "$ENV_FILE"
124-
125-
JIRA_TOKEN=$(prompt_with_default "Jira Token (optional)" "")
126-
[[ -n "$JIRA_TOKEN" ]] && echo "FIXOPS_JIRA_TOKEN=$JIRA_TOKEN" >> "$ENV_FILE"
127-
128-
CONFLUENCE_TOKEN=$(prompt_with_default "Confluence Token (optional)" "")
129-
[[ -n "$CONFLUENCE_TOKEN" ]] && echo "FIXOPS_CONFLUENCE_TOKEN=$CONFLUENCE_TOKEN" >> "$ENV_FILE"
130-
131-
SLACK_WEBHOOK=$(prompt_with_default "Slack Webhook URL (optional)" "")
132-
[[ -n "$SLACK_WEBHOOK" ]] && echo "FIXOPS_SLACK_WEBHOOK_URL=$SLACK_WEBHOOK" >> "$ENV_FILE"
133-
fi
52+
echo "" >> "$ENV_FILE"
53+
echo "# Self-contained service secrets" >> "$ENV_FILE"
54+
echo "MONGO_USERNAME=${MONGO_USERNAME:-fixops}" >> "$ENV_FILE"
55+
echo "MONGO_PASSWORD=${MONGO_PASSWORD:-$(generate_secret)}" >> "$ENV_FILE"
56+
echo "REDIS_PASSWORD=${REDIS_PASSWORD:-$(generate_secret)}" >> "$ENV_FILE"
57+
echo "SECRET_KEY=${SECRET_KEY:-$(generate_secret)}" >> "$ENV_FILE"
58+
59+
echo "" >> "$ENV_FILE"
60+
echo "# Optional integrations (empty by default for offline use)" >> "$ENV_FILE"
61+
echo "FIXOPS_JIRA_TOKEN=${FIXOPS_JIRA_TOKEN:-}" >> "$ENV_FILE"
62+
echo "FIXOPS_CONFLUENCE_TOKEN=${FIXOPS_CONFLUENCE_TOKEN:-}" >> "$ENV_FILE"
63+
echo "FIXOPS_SLACK_WEBHOOK_URL=${FIXOPS_SLACK_WEBHOOK_URL:-}" >> "$ENV_FILE"
64+
65+
echo "" >> "$ENV_FILE"
66+
echo "# Docker compose defaults" >> "$ENV_FILE"
67+
echo "COMPOSE_FILE=$COMPOSE_FILE" >> "$ENV_FILE"
13468

135-
if [[ "$DEPLOYMENT_MODE" != "demo" ]]; then
136-
echo ""
137-
echo "5. Database Configuration"
138-
echo "" >> "$ENV_FILE"
139-
echo "# Database Configuration" >> "$ENV_FILE"
140-
141-
MONGO_USER=$(prompt_with_default "MongoDB Username" "fixops")
142-
MONGO_PASS=$(prompt_with_default "MongoDB Password (or leave blank to generate)" "")
143-
if [[ -z "$MONGO_PASS" ]]; then
144-
MONGO_PASS=$(generate_secret)
145-
echo -e "${GREEN}Generated MongoDB password${NC}"
146-
fi
147-
echo "MONGO_USERNAME=$MONGO_USER" >> "$ENV_FILE"
148-
echo "MONGO_PASSWORD=$MONGO_PASS" >> "$ENV_FILE"
149-
150-
REDIS_PASS=$(prompt_with_default "Redis Password (or leave blank to generate)" "")
151-
if [[ -z "$REDIS_PASS" ]]; then
152-
REDIS_PASS=$(generate_secret)
153-
echo -e "${GREEN}Generated Redis password${NC}"
154-
fi
155-
echo "REDIS_PASSWORD=$REDIS_PASS" >> "$ENV_FILE"
156-
157-
SECRET_KEY=$(prompt_with_default "Application Secret Key (or leave blank to generate)" "")
158-
if [[ -z "$SECRET_KEY" ]]; then
159-
SECRET_KEY=$(generate_secret)
160-
echo -e "${GREEN}Generated application secret key${NC}"
161-
fi
162-
echo "SECRET_KEY=$SECRET_KEY" >> "$ENV_FILE"
69+
echo "📄 Wrote non-interactive defaults to $ENV_FILE"
70+
71+
if ! command -v docker &> /dev/null; then
72+
echo -e "${RED}❌ Docker is required to continue. Please install Docker and rerun.${NC}"
73+
exit 1
16374
fi
16475

76+
echo "🧰 Installing Python dependencies into local virtualenv..."
77+
"$ROOT_DIR/scripts/bootstrap.sh"
78+
79+
echo "🐳 Building FixOps Docker image using $COMPOSE_FILE ..."
80+
docker compose -f "$ROOT_DIR/$COMPOSE_FILE" build
81+
82+
echo "🚀 Starting FixOps stack..."
83+
docker compose -f "$ROOT_DIR/$COMPOSE_FILE" up -d
84+
16585
echo ""
16686
echo "========================================="
167-
echo -e "${GREEN}Configuration Complete!${NC}"
87+
echo -e "${GREEN}Environment is ready!${NC}"
16888
echo "========================================="
16989
echo ""
170-
echo "Configuration saved to: $ENV_FILE"
171-
echo ""
172-
echo "Next steps:"
173-
echo " 1. Review and edit $ENV_FILE if needed"
174-
echo " 2. Run: ./scripts/bootstrap.sh"
175-
echo " 3. Start API: uvicorn apps.api.app:create_app --factory --reload"
90+
echo "- .env generated with safe defaults"
91+
echo "- Python dependencies pre-installed"
92+
echo "- Docker services running via $COMPOSE_FILE"
17693
echo ""
94+
echo "You can now access the services defined in $COMPOSE_FILE."

0 commit comments

Comments
 (0)