22set -euo pipefail
33
44echo " ========================================"
5- echo " FixOps Setup Wizard "
5+ echo " FixOps One-Click Setup "
66echo " ========================================"
77echo " "
88
@@ -11,166 +11,84 @@ YELLOW='\033[1;33m'
1111RED=' \033[0;31m'
1212NC=' \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-
3114generate_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"
4826if [[ -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} "
5529fi
5630
5731echo " " > " $ENV_FILE "
5832chmod 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 "
6836echo " 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
16374fi
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+
16585echo " "
16686echo " ========================================="
167- echo -e " ${GREEN} ✅ Configuration Complete !${NC} "
87+ echo -e " ${GREEN} ✅ Environment is ready !${NC} "
16888echo " ========================================="
16989echo " "
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 "
17693echo " "
94+ echo " You can now access the services defined in $COMPOSE_FILE ."
0 commit comments