Skip to content

Commit 49c2824

Browse files
authored
Add Full-Stack Mega Manager script
This script provides a full-stack management tool for deploying applications using MongoDB Atlas, local Docker, and Azure. It includes options for full deployment, cleanup, and rebuilding the environment.
1 parent 4b7ad32 commit 49c2824

1 file changed

Lines changed: 258 additions & 0 deletions

File tree

scripts/fullstack_mega_manager.sh

Lines changed: 258 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,258 @@
1+
#!/bin/bash
2+
3+
# =========================================
4+
# Full-Stack Mega Manager
5+
# Menu + Fully Automated Mode
6+
# MongoDB Atlas + Local Docker + Azure
7+
# =========================================
8+
9+
¤ Option 1 – Full deployment: MongoDB + local + Azure
10+
11+
¤ Option 2 – Cleanup all cloud resources (Azure + MongoDB)
12+
13+
¤ Option 3 – Full rebuild (cleanup + redeploy)
14+
15+
¤ Option 4 – Exit
16+
17+
FULLSTACK_DIR="./fullstack-app"
18+
LOCAL_WAIT=5
19+
RESOURCE_GROUP="fullstack-rg"
20+
LOCATION="eastus"
21+
ACR_NAME="fullstackregistry$RANDOM"
22+
PLAN_NAME="fullstack-plan"
23+
BACKEND_APP="fullstack-backend"
24+
FRONTEND_APP="fullstack-frontend"
25+
26+
# MongoDB Atlas API keys
27+
ATLAS_PUBLIC_KEY="<YOUR_ATLAS_PUBLIC_KEY>"
28+
ATLAS_PRIVATE_KEY="<YOUR_ATLAS_PRIVATE_KEY>"
29+
ATLAS_PROJECT_ID="<YOUR_ATLAS_PROJECT_ID>"
30+
ATLAS_CLUSTER_NAME="FullStackCluster"
31+
DB_USERNAME="fullstackuser"
32+
33+
JWT_SECRET="your_jwt_secret_here"
34+
35+
# ---------------- Functions ----------------
36+
37+
# -------- MongoDB Provisioning --------
38+
provision_mongodb() {
39+
echo "☁️ Provisioning MongoDB Atlas cluster..."
40+
41+
CLUSTER_EXISTS=$(curl -s -u "$ATLAS_PUBLIC_KEY:$ATLAS_PRIVATE_KEY" \
42+
"https://cloud.mongodb.com/api/atlas/v1.0/groups/$ATLAS_PROJECT_ID/clusters/$ATLAS_CLUSTER_NAME" | jq -r '.name')
43+
44+
if [[ "$CLUSTER_EXISTS" != "$ATLAS_CLUSTER_NAME" ]]; then
45+
curl -s -u "$ATLAS_PUBLIC_KEY:$ATLAS_PRIVATE_KEY" \
46+
-X POST "https://cloud.mongodb.com/api/atlas/v1.0/groups/$ATLAS_PROJECT_ID/clusters" \
47+
-H "Content-Type: application/json" \
48+
-d "{
49+
\"name\": \"$ATLAS_CLUSTER_NAME\",
50+
\"providerSettings\": {\"providerName\": \"AWS\", \"instanceSizeName\": \"M0\", \"regionName\": \"US_EAST_1\"}
51+
}"
52+
echo "Cluster creation initiated."
53+
else
54+
echo "Cluster $ATLAS_CLUSTER_NAME already exists."
55+
fi
56+
57+
echo "⏳ Waiting for cluster to be ready..."
58+
STATUS=""
59+
while [[ "$STATUS" != "IDLE" ]]; do
60+
STATUS=$(curl -s -u "$ATLAS_PUBLIC_KEY:$ATLAS_PRIVATE_KEY" \
61+
"https://cloud.mongodb.com/api/atlas/v1.0/groups/$ATLAS_PROJECT_ID/clusters/$ATLAS_CLUSTER_NAME" | jq -r '.stateName')
62+
echo "Cluster status: $STATUS"
63+
if [[ "$STATUS" != "IDLE" ]]; then sleep 15; fi
64+
done
65+
echo "✅ Cluster is ready."
66+
67+
USER_EXISTS=$(curl -s -u "$ATLAS_PUBLIC_KEY:$ATLAS_PRIVATE_KEY" \
68+
"https://cloud.mongodb.com/api/atlas/v1.0/groups/$ATLAS_PROJECT_ID/databaseUsers?username=$DB_USERNAME" | jq -r '.[0].username')
69+
70+
if [[ "$USER_EXISTS" != "$DB_USERNAME" ]]; then
71+
curl -s -u "$ATLAS_PUBLIC_KEY:$ATLAS_PRIVATE_KEY" \
72+
-X POST "https://cloud.mongodb.com/api/atlas/v1.0/groups/$ATLAS_PROJECT_ID/databaseUsers" \
73+
-H "Content-Type: application/json" \
74+
-d "{
75+
\"databaseName\": \"admin\",
76+
\"username\": \"$DB_USERNAME\",
77+
\"password\": \"FullStackPass123\",
78+
\"roles\": [{\"roleName\": \"readWriteAnyDatabase\", \"databaseName\": \"admin\"}]
79+
}"
80+
echo "Database user created."
81+
else
82+
echo "Database user $DB_USERNAME already exists."
83+
fi
84+
85+
curl -s -u "$ATLAS_PUBLIC_KEY:$ATLAS_PRIVATE_KEY" \
86+
-X POST "https://cloud.mongodb.com/api/atlas/v1.0/groups/$ATLAS_PROJECT_ID/ipAccessList" \
87+
-H "Content-Type: application/json" \
88+
-d "[
89+
{\"ipAddress\": \"0.0.0.0/0\", \"comment\": \"Allow all\"}
90+
]"
91+
92+
MONGO_URI="mongodb+srv://$DB_USERNAME:FullStackPass123@$ATLAS_CLUSTER_NAME.mongodb.net/myFirstDatabase?retryWrites=true&w=majority"
93+
echo "✅ MongoDB Atlas ready: $MONGO_URI"
94+
}
95+
96+
# -------- Local Project --------
97+
generate_local() {
98+
echo "🚀 Generating local full-stack project..."
99+
mkdir -p $FULLSTACK_DIR/backend/models $FULLSTACK_DIR/backend/routes $FULLSTACK_DIR/backend/middleware
100+
mkdir -p $FULLSTACK_DIR/frontend/src
101+
echo "📦 Local project generated at $FULLSTACK_DIR"
102+
}
103+
104+
zip_local() {
105+
echo "📦 Creating ZIP archive..."
106+
zip -r fullstack-app.zip $FULLSTACK_DIR
107+
echo "✅ ZIP created: fullstack-app.zip"
108+
}
109+
110+
start_local() {
111+
echo "🐳 Starting local Docker containers..."
112+
docker-compose -f $FULLSTACK_DIR/docker-compose.yml up --build -d
113+
sleep $LOCAL_WAIT
114+
echo "✅ Local Docker running."
115+
}
116+
117+
stop_local() {
118+
echo "🛑 Stopping local Docker..."
119+
docker-compose -f $FULLSTACK_DIR/docker-compose.yml down
120+
echo "✅ Local Docker stopped."
121+
}
122+
123+
cleanup_local() {
124+
echo "🧹 Cleaning up local Docker images..."
125+
docker image prune -f
126+
echo "✅ Local cleanup done."
127+
}
128+
129+
# -------- Azure Deployment --------
130+
build_push_docker() {
131+
echo "🐳 Building and pushing Docker images to Azure Container Registry..."
132+
az login --only-show-errors
133+
az group create --name $RESOURCE_GROUP --location $LOCATION
134+
135+
if ! az acr show --name $ACR_NAME &> /dev/null; then
136+
az acr create --resource-group $RESOURCE_GROUP --name $ACR_NAME --sku Basic
137+
fi
138+
az acr login --name $ACR_NAME
139+
140+
FRONTEND_API_URL="https://$BACKEND_APP.azurewebsites.net/api"
141+
sed -i.bak "s|const API_URL = .*|const API_URL = '$FRONTEND_API_URL';|" $FULLSTACK_DIR/frontend/src/App.js
142+
143+
docker build -t backend $FULLSTACK_DIR/backend
144+
docker tag backend $ACR_NAME.azurecr.io/backend:latest
145+
docker push $ACR_NAME.azurecr.io/backend:latest
146+
147+
docker build -t frontend $FULLSTACK_DIR/frontend
148+
docker tag frontend $ACR_NAME.azurecr.io/frontend:latest
149+
docker push $ACR_NAME.azurecr.io/frontend:latest
150+
}
151+
152+
deploy_azure() {
153+
echo "☁️ Deploying backend & frontend to Azure..."
154+
if ! az appservice plan show --name $PLAN_NAME --resource-group $RESOURCE_GROUP &> /dev/null; then
155+
az appservice plan create --name $PLAN_NAME --resource-group $RESOURCE_GROUP --sku B1 --is-linux
156+
fi
157+
158+
# Backend
159+
if az webapp show --name $BACKEND_APP --resource-group $RESOURCE_GROUP &> /dev/null; then
160+
az webapp config container set --name $BACKEND_APP --resource-group $RESOURCE_GROUP --docker-custom-image-name $ACR_NAME.azurecr.io/backend:latest
161+
else
162+
az webapp create --resource-group $RESOURCE_GROUP --plan $PLAN_NAME --name $BACKEND_APP --deployment-container-image-name $ACR_NAME.azurecr.io/backend:latest
163+
fi
164+
az webapp config appsettings set --name $BACKEND_APP --resource-group $RESOURCE_GROUP --settings MONGO_URI=$MONGO_URI JWT_SECRET=$JWT_SECRET
165+
166+
# Frontend
167+
if az webapp show --name $FRONTEND_APP --resource-group $RESOURCE_GROUP &> /dev/null; then
168+
az webapp config container set --name $FRONTEND_APP --resource-group $RESOURCE_GROUP --docker-custom-image-name $ACR_NAME.azurecr.io/frontend:latest
169+
else
170+
az webapp create --resource-group $RESOURCE_GROUP --plan $PLAN_NAME --name $FRONTEND_APP --deployment-container-image-name $ACR_NAME.azurecr.io/frontend:latest
171+
fi
172+
173+
FRONTEND_URL="https://$FRONTEND_APP.azurewebsites.net"
174+
echo "✅ Azure deployment complete! Frontend URL: $FRONTEND_URL"
175+
176+
OS="$(uname)"
177+
if [[ "$OS" == "Linux" ]]; then xdg-open "$FRONTEND_URL"
178+
elif [[ "$OS" == "Darwin" ]]; then open "$FRONTEND_URL"
179+
elif [[ "$OS" == MINGW* || "$OS" == CYGWIN* || "$OS" == MSYS* ]]; then powershell.exe Start-Process "$FRONTEND_URL"
180+
else echo "Open your browser manually at $FRONTEND_URL"
181+
fi
182+
}
183+
184+
# -------- Cleanup --------
185+
cleanup_azure() {
186+
echo "☁️ Cleaning up Azure resources..."
187+
az login --only-show-errors
188+
az group delete --name $RESOURCE_GROUP --yes --no-wait
189+
echo "✅ Azure cleanup initiated."
190+
}
191+
192+
cleanup_mongodb() {
193+
echo "🗑️ Cleaning up MongoDB Atlas..."
194+
CLUSTER_EXISTS=$(curl -s -u "$ATLAS_PUBLIC_KEY:$ATLAS_PRIVATE_KEY" \
195+
"https://cloud.mongodb.com/api/atlas/v1.0/groups/$ATLAS_PROJECT_ID/clusters/$ATLAS_CLUSTER_NAME" | jq -r '.name')
196+
197+
if [[ "$CLUSTER_EXISTS" == "$ATLAS_CLUSTER_NAME" ]]; then
198+
curl -s -u "$ATLAS_PUBLIC_KEY:$ATLAS_PRIVATE_KEY" \
199+
-X DELETE "https://cloud.mongodb.com/api/atlas/v1.0/groups/$ATLAS_PROJECT_ID/clusters/$ATLAS_CLUSTER_NAME"
200+
echo "Cluster deletion initiated."
201+
fi
202+
203+
USER_EXISTS=$(curl -s -u "$ATLAS_PUBLIC_KEY:$ATLAS_PRIVATE_KEY" \
204+
"https://cloud.mongodb.com/api/atlas/v1.0/groups/$ATLAS_PROJECT_ID/databaseUsers?username=$DB_USERNAME" | jq -r '.[0].username')
205+
206+
if [[ "$USER_EXISTS" == "$DB_USERNAME" ]]; then
207+
curl -s -u "$ATLAS_PUBLIC_KEY:$ATLAS_PRIVATE_KEY" \
208+
-X DELETE "https://cloud.mongodb.com/api/atlas/v1.0/groups/$ATLAS_PROJECT_ID/databaseUsers/admin/$DB_USERNAME"
209+
echo "Database user deleted."
210+
fi
211+
212+
echo "✅ MongoDB Atlas cleanup initiated."
213+
}
214+
215+
# -------- Main Menu --------
216+
echo "==============================="
217+
echo " FULL-STACK MEGA MANAGER "
218+
echo "==============================="
219+
echo "1) Full Deployment (MongoDB + Local + Azure)"
220+
echo "2) Cleanup All (Azure + MongoDB)"
221+
echo "3) Full Rebuild (Cleanup + Deploy)"
222+
echo "4) Exit"
223+
read -p "Choose an option [1-4]: " choice
224+
225+
case $choice in
226+
1)
227+
provision_mongodb
228+
generate_local
229+
zip_local
230+
start_local
231+
build_push_docker
232+
deploy_azure
233+
stop_local
234+
cleanup_local
235+
;;
236+
2)
237+
cleanup_azure
238+
cleanup_mongodb
239+
;;
240+
3)
241+
cleanup_azure
242+
cleanup_mongodb
243+
provision_mongodb
244+
generate_local
245+
zip_local
246+
start_local
247+
build_push_docker
248+
deploy_azure
249+
stop_local
250+
cleanup_local
251+
;;
252+
4)
253+
exit 0
254+
;;
255+
*)
256+
echo "Invalid choice."
257+
;;
258+
esac

0 commit comments

Comments
 (0)