diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 8b70c38..0db7922 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,5 +1,5 @@ { - "name": "GitpodFlix Dev Environment", + "name": "GitpodFlix Dev Environment - Kubernetes", "image": "mcr.microsoft.com/devcontainers/base:ubuntu", "features": { "ghcr.io/devcontainers/features/common-utils:2": { @@ -17,6 +17,11 @@ "ghcr.io/devcontainers/features/docker-in-docker:2": { "version": "latest", "moby": true + }, + "ghcr.io/devcontainers/features/kubectl-helm-minikube:1": { + "version": "latest", + "helm": "latest", + "minikube": "latest" } }, "forwardPorts": [ @@ -33,7 +38,8 @@ "mtxr.sqltools", "mtxr.sqltools-driver-sqlite", "mtxr.sqltools-driver-mysql", - "bradlc.vscode-tailwindcss" + "bradlc.vscode-tailwindcss", + "ms-kubernetes-tools.vscode-kubernetes-tools" ], "settings": { "editor.formatOnSave": true diff --git a/.devcontainer/setup.sh b/.devcontainer/setup.sh index a9770e1..d3686b4 100755 --- a/.devcontainer/setup.sh +++ b/.devcontainer/setup.sh @@ -3,7 +3,7 @@ # Exit on error set -e -echo "🚀 Starting development environment setup..." +echo "🚀 Starting Kubernetes development environment setup..." # Function to handle package installation install_package() { @@ -22,11 +22,10 @@ apt-get clean echo "🔄 Updating package lists..." apt-get update -# Install system dependencies one by one with error handling +# Install system dependencies echo "📦 Installing system dependencies..." -install_package "mariadb-client" -install_package "mariadb-server" install_package "postgresql-client" +install_package "net-tools" # Verify PostgreSQL client tools are installed if ! command -v pg_isready &> /dev/null; then @@ -34,20 +33,20 @@ if ! command -v pg_isready &> /dev/null; then exit 1 fi -# Start MariaDB service -echo "💾 Starting MariaDB service..." -if ! service mariadb status > /dev/null 2>&1; then - service mariadb start -else - echo "✅ MariaDB service is already running" +# Verify Kubernetes tools are available +echo "🔍 Verifying Kubernetes tools..." +if ! command -v kubectl &> /dev/null; then + echo "❌ kubectl not found" + exit 1 fi -# Verify MariaDB is running -if ! service mariadb status > /dev/null 2>&1; then - echo "❌ Failed to start MariaDB service" +if ! command -v minikube &> /dev/null; then + echo "❌ minikube not found" exit 1 fi +echo "✅ Kubernetes tools verified" + # Install global npm packages echo "📦 Installing global npm packages..." npm install -g nodemon @@ -69,4 +68,12 @@ if [ -d "/workspaces/gitpodflix-demo/backend/catalog" ]; then npm install fi -echo "✅ Setup completed successfully!" +# Make scripts executable +echo "🔧 Making scripts executable..." +chmod +x /workspaces/gitpodflix-demo/scripts/*.sh + +echo "✅ Kubernetes development environment setup completed successfully!" +echo "🎯 Next steps:" +echo " 1. Run 'Setup Minikube' task to initialize the cluster" +echo " 2. Run 'Start Port Forwards' task to access services" +echo " 3. Run 'Seed Database' task to populate with sample data" diff --git a/.gitpod/automations.yaml b/.gitpod/automations.yaml index fb8b176..34ab4a6 100644 --- a/.gitpod/automations.yaml +++ b/.gitpod/automations.yaml @@ -1,111 +1,225 @@ services: - postgres: - name: "PostgreSQL Database" - description: "PostgreSQL database for Gitpod Flix (Port: 5432)" + minikube: + name: "Minikube Cluster" + description: "Kubernetes cluster running all GitpodFlix services" triggeredBy: - postDevcontainerStart - postEnvironmentStart commands: start: | - # Force cleanup of any existing PostgreSQL containers - echo "Cleaning up any existing PostgreSQL containers..." - docker rm -f postgres 2>/dev/null || true - sleep 2 # Give Docker time to clean up - - echo "Starting PostgreSQL with Docker..." - docker run --rm \ - --name postgres \ - -e POSTGRES_USER=gitpod \ - -e POSTGRES_PASSWORD=gitpod \ - -e POSTGRES_DB=gitpodflix \ - -p 5432:5432 \ - -v postgres_data:/var/lib/postgresql/data \ - -v /workspaces/gitpodflix-demo/database/main/migrations:/docker-entrypoint-initdb.d \ - postgres:15 + echo "🚀 Starting Minikube cluster..." + + # Check if Minikube is already running + if minikube status | grep -q "Running"; then + echo "✅ Minikube is already running" + else + echo "Starting Minikube..." + minikube start --driver=docker --memory=4096 --cpus=2 --force + fi + + # Configure Docker environment + eval $(minikube docker-env) + + # Build images if they don't exist + if ! docker images | grep -q "catalog-service:latest"; then + echo "Building catalog service image..." + cd /workspaces/gitpodflix-demo/backend/catalog + docker build -t catalog-service:latest . + fi + + if ! docker images | grep -q "frontend:latest"; then + echo "Building frontend image..." + cd /workspaces/gitpodflix-demo/frontend + docker build -t frontend:latest . + fi + + cd /workspaces/gitpodflix-demo + + # Apply Kubernetes manifests + echo "Applying Kubernetes manifests..." + kubectl apply -f k8s/postgres.yaml + kubectl apply -f k8s/catalog-service.yaml + kubectl apply -f k8s/frontend.yaml + + # Wait for deployments + echo "Waiting for deployments to be ready..." + kubectl wait --for=condition=available --timeout=300s deployment/postgres || true + kubectl wait --for=condition=available --timeout=300s deployment/catalog-service || true + kubectl wait --for=condition=available --timeout=300s deployment/frontend || true ready: | - if docker exec postgres pg_isready -U gitpod; then - echo "PostgreSQL is ready and accepting connections" + # Check if all pods are running + if kubectl get pods | grep -E "(postgres|catalog-service|frontend)" | grep -v Running; then + echo "Some pods are not running yet" + exit 1 + else + echo "All services are running in Kubernetes" + exit 0 + fi + + stop: | + echo "Stopping Kubernetes services..." + kubectl delete -f k8s/ --ignore-not-found=true + echo "Stopping Minikube..." + minikube stop + + postgres-port-forward: + name: "PostgreSQL Port Forward" + description: "Port forward PostgreSQL service (Port: 5432)" + triggeredBy: + - manual + commands: + start: | + echo "Starting PostgreSQL port forward..." + kubectl port-forward service/postgres-service 5432:5432 & + echo $! > /tmp/postgres-port-forward.pid + sleep 2 + echo "PostgreSQL available at localhost:5432" + + ready: | + if netstat -tuln | grep -q ":5432"; then + echo "PostgreSQL port forward is active" exit 0 else - echo "PostgreSQL not ready" + echo "PostgreSQL port forward not active" exit 1 fi stop: | - echo "Stopping PostgreSQL container..." - docker stop postgres || true - echo "Removing PostgreSQL container..." - docker rm -f postgres || true - - catalog: - name: "Catalog Service" - description: "Movie catalog API service (Port: 3001)" + if [ -f /tmp/postgres-port-forward.pid ]; then + kill $(cat /tmp/postgres-port-forward.pid) 2>/dev/null || true + rm -f /tmp/postgres-port-forward.pid + fi + pkill -f "kubectl port-forward.*postgres" || true + + catalog-port-forward: + name: "Catalog Service Port Forward" + description: "Port forward Catalog API service (Port: 3001)" triggeredBy: - - postDevcontainerStart - - postEnvironmentStart + - manual commands: start: | - cd /workspaces/gitpodflix-demo/backend/catalog - PORT=3001 npx nodemon src/index.ts + echo "Starting Catalog service port forward..." + kubectl port-forward service/catalog-service 3001:3001 & + echo $! > /tmp/catalog-port-forward.pid + sleep 2 + echo "Catalog API available at localhost:3001" + ready: | - if curl -s http://localhost:3001/health > /dev/null; then - echo "Catalog service is ready" + if netstat -tuln | grep -q ":3001"; then + echo "Catalog port forward is active" exit 0 else - echo "Catalog service not ready" + echo "Catalog port forward not active" exit 1 fi + stop: | - pkill -f "node.*catalog" || true + if [ -f /tmp/catalog-port-forward.pid ]; then + kill $(cat /tmp/catalog-port-forward.pid) 2>/dev/null || true + rm -f /tmp/catalog-port-forward.pid + fi + pkill -f "kubectl port-forward.*catalog" || true - gitpod-flix: - name: "Gitpod Flix" - description: "Streaming platform frontend (Port: 3000)" + frontend-port-forward: + name: "Frontend Port Forward" + description: "Port forward Frontend service (Port: 3000)" triggeredBy: - - postDevcontainerStart - - postEnvironmentStart + - manual commands: start: | - cd /workspaces/gitpodflix-demo/frontend - - # Wait for vite to be available - echo "Waiting for vite to be available..." - for i in {1..30}; do - if command -v vite >/dev/null 2>&1 || [ -f "node_modules/.bin/vite" ]; then - echo "✓ vite is available" - break - fi - if [ $i -eq 30 ]; then - echo "✗ Timeout waiting for vite" - exit 1 - fi - echo "Waiting for vite... attempt $i/30" - sleep 2 - done - - PORT=3000 npm run dev + echo "Starting Frontend port forward..." + kubectl port-forward service/frontend-service 3000:3000 & + echo $! > /tmp/frontend-port-forward.pid + sleep 2 + echo "Frontend available at localhost:3000" + ready: | - if curl -s http://localhost:3000 > /dev/null; then - echo "Gitpod Flix is ready" + if netstat -tuln | grep -q ":3000"; then + echo "Frontend port forward is active" exit 0 else - echo "Gitpod Flix not ready" + echo "Frontend port forward not active" exit 1 fi + stop: | - pkill -f "node.*frontend" || true + if [ -f /tmp/frontend-port-forward.pid ]; then + kill $(cat /tmp/frontend-port-forward.pid) 2>/dev/null || true + rm -f /tmp/frontend-port-forward.pid + fi + pkill -f "kubectl port-forward.*frontend" || true tasks: + setupMinikube: + name: "Setup Minikube" + description: "Initialize Minikube cluster and deploy all services" + triggeredBy: + - manual + - postEnvironmentStart + command: | + /workspaces/gitpodflix-demo/scripts/setup-minikube.sh + + startPortForwards: + name: "Start Port Forwards" + description: "Start all port forwards for local access" + triggeredBy: + - manual + command: | + echo "Starting all port forwards..." + + # Start PostgreSQL port forward + kubectl port-forward service/postgres-service 5432:5432 & + echo $! > /tmp/postgres-port-forward.pid + + # Start Catalog service port forward + kubectl port-forward service/catalog-service 3001:3001 & + echo $! > /tmp/catalog-port-forward.pid + + # Start Frontend port forward + kubectl port-forward service/frontend-service 3000:3000 & + echo $! > /tmp/frontend-port-forward.pid + + sleep 3 + echo "✅ All port forwards started!" + echo "🌐 Frontend: http://localhost:3000" + echo "🔌 Catalog API: http://localhost:3001" + echo "🗄️ PostgreSQL: localhost:5432" + + stopPortForwards: + name: "Stop Port Forwards" + description: "Stop all port forwards" + triggeredBy: + - manual + command: | + echo "Stopping all port forwards..." + + # Stop all port forwards + for pid_file in /tmp/*-port-forward.pid; do + if [ -f "$pid_file" ]; then + kill $(cat "$pid_file") 2>/dev/null || true + rm -f "$pid_file" + fi + done + + pkill -f "kubectl port-forward" || true + echo "✅ All port forwards stopped" + seedDatabase: name: "Seed Database" description: "Seed the database with sample movies in a dramatic sequence" triggeredBy: - manual - - postEnvironmentStart command: | cd /workspaces/gitpodflix-demo/database/main + # Ensure PostgreSQL port forward is active + if ! netstat -tuln | grep -q ":5432"; then + echo "Starting PostgreSQL port forward..." + kubectl port-forward service/postgres-service 5432:5432 & + sleep 3 + fi + # Wait for PostgreSQL to be ready echo "Waiting for PostgreSQL to be ready..." for i in {1..30}; do @@ -122,7 +236,7 @@ tasks: done echo "Clearing existing data..." - PGPASSWORD=gitpod psql -h localhost -U gitpod -d gitpodflix -c "TRUNCATE TABLE movies;" + PGPASSWORD=gitpod psql -h localhost -U gitpod -d gitpodflix -c "TRUNCATE TABLE movies;" 2>/dev/null || true echo "Seeding trending movies..." PGPASSWORD=gitpod psql -h localhost -U gitpod -d gitpodflix -f seeds/01_seed_trending.sql @@ -147,8 +261,45 @@ tasks: - manual command: | cd /workspaces/gitpodflix-demo/database/main + + # Ensure PostgreSQL port forward is active + if ! netstat -tuln | grep -q ":5432"; then + echo "Starting PostgreSQL port forward..." + kubectl port-forward service/postgres-service 5432:5432 & + sleep 3 + fi + PGPASSWORD=gitpod psql -h localhost -U gitpod -d gitpodflix -c "TRUNCATE TABLE movies;" + showKubernetesStatus: + name: "Show Kubernetes Status" + description: "Display status of all Kubernetes resources" + triggeredBy: + - manual + command: | + echo "🔍 Kubernetes Cluster Status:" + echo "================================" + + echo "📊 Minikube Status:" + minikube status + echo "" + + echo "🏗️ Deployments:" + kubectl get deployments + echo "" + + echo "🔌 Services:" + kubectl get services + echo "" + + echo "📦 Pods:" + kubectl get pods + echo "" + + echo "💾 Persistent Volumes:" + kubectl get pv,pvc + echo "" + openDemoPorts: name: "Open Demo Ports" description: "Opens ports 3000 and 3001 for the demo" diff --git a/KUBERNETES.md b/KUBERNETES.md new file mode 100644 index 0000000..acd346e --- /dev/null +++ b/KUBERNETES.md @@ -0,0 +1,141 @@ +# GitpodFlix - Kubernetes Setup + +This repository has been converted to use Minikube and Kubernetes for running all services instead of direct Docker containers. + +## Architecture + +The application now runs on Kubernetes with the following components: + +- **PostgreSQL Database**: Runs as a Kubernetes deployment with persistent storage +- **Catalog Service**: Node.js/Express API service running in Kubernetes +- **Frontend**: React application served by Nginx, running in Kubernetes + +## Quick Start + +1. **Start the environment**: The Minikube cluster will automatically start when the environment loads +2. **Setup services**: Run the "Setup Minikube" task to initialize everything +3. **Start port forwards**: Run the "Start Port Forwards" task to access services locally +4. **Seed database**: Run the "Seed Database" task to populate with sample data + +## Manual Commands + +### Start Minikube and Deploy Services +```bash +./scripts/setup-minikube.sh +``` + +### Access Services Locally +```bash +# Frontend (React app) +kubectl port-forward service/frontend-service 3000:3000 + +# Catalog API +kubectl port-forward service/catalog-service 3001:3001 + +# PostgreSQL Database +kubectl port-forward service/postgres-service 5432:5432 +``` + +### Check Status +```bash +# Minikube status +minikube status + +# All Kubernetes resources +kubectl get all + +# Pod logs +kubectl logs deployment/postgres +kubectl logs deployment/catalog-service +kubectl logs deployment/frontend +``` + +### Rebuild and Redeploy +```bash +# Configure Docker to use Minikube's daemon +eval $(minikube docker-env) + +# Rebuild images +cd backend/catalog && docker build -t catalog-service:latest . +cd frontend && docker build -t frontend:latest . + +# Restart deployments to use new images +kubectl rollout restart deployment/catalog-service +kubectl rollout restart deployment/frontend +``` + +## Kubernetes Manifests + +- `k8s/postgres.yaml`: PostgreSQL database with persistent volume +- `k8s/catalog-service.yaml`: Backend API service +- `k8s/frontend.yaml`: Frontend React application + +## Automation Tasks + +The following automation tasks are available: + +### Services +- **Minikube Cluster**: Starts/stops the entire Kubernetes cluster +- **PostgreSQL Port Forward**: Port forwards PostgreSQL (manual trigger) +- **Catalog Service Port Forward**: Port forwards the API service (manual trigger) +- **Frontend Port Forward**: Port forwards the frontend (manual trigger) + +### Tasks +- **Setup Minikube**: Initialize cluster and deploy all services +- **Start Port Forwards**: Start all port forwards for local access +- **Stop Port Forwards**: Stop all port forwards +- **Seed Database**: Populate database with sample movies +- **Clear Database**: Remove all data from database +- **Show Kubernetes Status**: Display cluster and resource status +- **Open Demo Ports**: Configure Gitpod port forwarding + +## Development Workflow + +1. Make changes to your code +2. Rebuild the relevant Docker image: + ```bash + eval $(minikube docker-env) + cd backend/catalog && docker build -t catalog-service:latest . + # or + cd frontend && docker build -t frontend:latest . + ``` +3. Restart the deployment: + ```bash + kubectl rollout restart deployment/catalog-service + # or + kubectl rollout restart deployment/frontend + ``` + +## Troubleshooting + +### Services not starting +```bash +# Check pod status +kubectl get pods + +# Check pod logs +kubectl logs + +# Describe pod for events +kubectl describe pod +``` + +### Port forwards not working +```bash +# Stop all port forwards +pkill -f "kubectl port-forward" + +# Start specific port forward +kubectl port-forward service/frontend-service 3000:3000 +``` + +### Minikube issues +```bash +# Restart Minikube +minikube stop +minikube start --driver=docker --memory=4096 --cpus=2 + +# Reset Minikube (nuclear option) +minikube delete +minikube start --driver=docker --memory=4096 --cpus=2 +``` diff --git a/backend/catalog/Dockerfile b/backend/catalog/Dockerfile new file mode 100644 index 0000000..2b5cd9d --- /dev/null +++ b/backend/catalog/Dockerfile @@ -0,0 +1,12 @@ +FROM node:18-alpine + +WORKDIR /app + +COPY package*.json ./ +RUN npm ci --only=production + +COPY . . + +EXPOSE 3001 + +CMD ["npm", "start"] diff --git a/backend/catalog/src/index.ts b/backend/catalog/src/index.ts index 3d711b1..4ede270 100644 --- a/backend/catalog/src/index.ts +++ b/backend/catalog/src/index.ts @@ -64,4 +64,4 @@ app.post('/api/movies/clear', async (req, res) => { // Start server app.listen(port, () => { console.log(`Catalog service running on port ${port}`); -}); \ No newline at end of file +}); diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..41d6101 --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,18 @@ +FROM node:18-alpine as builder + +WORKDIR /app + +COPY package*.json ./ +RUN npm ci + +COPY . . +RUN npm run build + +FROM nginx:alpine + +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf + +EXPOSE 3000 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/frontend/nginx.conf b/frontend/nginx.conf new file mode 100644 index 0000000..767fee8 --- /dev/null +++ b/frontend/nginx.conf @@ -0,0 +1,27 @@ +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + server { + listen 3000; + server_name localhost; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + try_files $uri $uri/ /index.html; + } + + location /api/ { + proxy_pass http://catalog-service:3001/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + } +} diff --git a/k8s/catalog-service.yaml b/k8s/catalog-service.yaml new file mode 100644 index 0000000..7db75e0 --- /dev/null +++ b/k8s/catalog-service.yaml @@ -0,0 +1,77 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: catalog-config +data: + DB_HOST: postgres-service + DB_USER: gitpod + DB_PASSWORD: gitpod + DB_NAME: gitpodflix + DB_PORT: "5432" + PORT: "3001" +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: catalog-service + labels: + app: catalog-service +spec: + replicas: 1 + selector: + matchLabels: + app: catalog-service + template: + metadata: + labels: + app: catalog-service + spec: + containers: + - name: catalog-service + image: catalog-service:latest + imagePullPolicy: Never + ports: + - containerPort: 3001 + env: + - name: DB_HOST + valueFrom: + configMapKeyRef: + name: catalog-config + key: DB_HOST + - name: DB_USER + valueFrom: + configMapKeyRef: + name: catalog-config + key: DB_USER + - name: DB_PASSWORD + valueFrom: + configMapKeyRef: + name: catalog-config + key: DB_PASSWORD + - name: DB_NAME + valueFrom: + configMapKeyRef: + name: catalog-config + key: DB_NAME + - name: DB_PORT + valueFrom: + configMapKeyRef: + name: catalog-config + key: DB_PORT + - name: PORT + valueFrom: + configMapKeyRef: + name: catalog-config + key: PORT +--- +apiVersion: v1 +kind: Service +metadata: + name: catalog-service +spec: + selector: + app: catalog-service + ports: + - port: 3001 + targetPort: 3001 + type: ClusterIP diff --git a/k8s/frontend.yaml b/k8s/frontend.yaml new file mode 100644 index 0000000..16f08c9 --- /dev/null +++ b/k8s/frontend.yaml @@ -0,0 +1,34 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frontend + labels: + app: frontend +spec: + replicas: 1 + selector: + matchLabels: + app: frontend + template: + metadata: + labels: + app: frontend + spec: + containers: + - name: frontend + image: frontend:latest + imagePullPolicy: Never + ports: + - containerPort: 3000 +--- +apiVersion: v1 +kind: Service +metadata: + name: frontend-service +spec: + selector: + app: frontend + ports: + - port: 3000 + targetPort: 3000 + type: ClusterIP diff --git a/k8s/postgres.yaml b/k8s/postgres.yaml new file mode 100644 index 0000000..17406af --- /dev/null +++ b/k8s/postgres.yaml @@ -0,0 +1,93 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + name: postgres-pv +spec: + capacity: + storage: 1Gi + accessModes: + - ReadWriteOnce + hostPath: + path: /tmp/postgres-data +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: postgres-pvc +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: postgres-config +data: + POSTGRES_USER: gitpod + POSTGRES_PASSWORD: gitpod + POSTGRES_DB: gitpodflix +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: postgres + labels: + app: postgres +spec: + replicas: 1 + selector: + matchLabels: + app: postgres + template: + metadata: + labels: + app: postgres + spec: + containers: + - name: postgres + image: postgres:15 + ports: + - containerPort: 5432 + env: + - name: POSTGRES_USER + valueFrom: + configMapKeyRef: + name: postgres-config + key: POSTGRES_USER + - name: POSTGRES_PASSWORD + valueFrom: + configMapKeyRef: + name: postgres-config + key: POSTGRES_PASSWORD + - name: POSTGRES_DB + valueFrom: + configMapKeyRef: + name: postgres-config + key: POSTGRES_DB + volumeMounts: + - name: postgres-storage + mountPath: /var/lib/postgresql/data + - name: init-scripts + mountPath: /docker-entrypoint-initdb.d + volumes: + - name: postgres-storage + persistentVolumeClaim: + claimName: postgres-pvc + - name: init-scripts + hostPath: + path: /workspaces/gitpodflix-demo/database/main/migrations +--- +apiVersion: v1 +kind: Service +metadata: + name: postgres-service +spec: + selector: + app: postgres + ports: + - port: 5432 + targetPort: 5432 + type: ClusterIP diff --git a/scripts/setup-minikube.sh b/scripts/setup-minikube.sh new file mode 100755 index 0000000..493d0e1 --- /dev/null +++ b/scripts/setup-minikube.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +set -e + +echo "🚀 Setting up Minikube for GitpodFlix..." + +# Start Minikube +echo "Starting Minikube..." +minikube start --driver=docker --memory=4096 --cpus=2 --force + +# Configure Docker to use Minikube's Docker daemon +echo "Configuring Docker environment..." +eval $(minikube docker-env) + +# Build Docker images +echo "Building Docker images..." + +echo "Building catalog service..." +cd /workspaces/gitpodflix-demo/backend/catalog +docker build -t catalog-service:latest . + +echo "Building frontend..." +cd /workspaces/gitpodflix-demo/frontend +docker build -t frontend:latest . + +cd /workspaces/gitpodflix-demo + +# Apply Kubernetes manifests +echo "Applying Kubernetes manifests..." +kubectl apply -f k8s/postgres.yaml +kubectl apply -f k8s/catalog-service.yaml +kubectl apply -f k8s/frontend.yaml + +# Wait for deployments to be ready +echo "Waiting for deployments to be ready..." +kubectl wait --for=condition=available --timeout=300s deployment/postgres +kubectl wait --for=condition=available --timeout=300s deployment/catalog-service +kubectl wait --for=condition=available --timeout=300s deployment/frontend + +echo "✅ Minikube setup complete!" +echo "🔗 Use 'kubectl port-forward' to access services:" +echo " Frontend: kubectl port-forward service/frontend-service 3000:3000" +echo " Catalog API: kubectl port-forward service/catalog-service 3001:3001" +echo " PostgreSQL: kubectl port-forward service/postgres-service 5432:5432"