# Mycelium Cloud - Nginx Static Site Example A complete, standalone example for deploying a static website using Nginx on Mycelium Cloud Kubernetes cluster. ## 📁 What This Contains This directory contains everything you need to deploy a static website: - **nginx-static.md** - This guide - **nginx-static-deployment.yaml** - Nginx deployment with custom content - **nginx-static-service.yaml** - Service configuration - **default-index.html** - Default website content (used to create ConfigMap) ## 🚀 Quick Start (2 minutes) ```bash # 1. Deploy the application kubectl apply -f nginx-static-deployment.yaml # 2. Create ConfigMap with default content kubectl create configmap nginx-static-content --from-file=index.html=default-index.html # 3. Create the service kubectl apply -f nginx-static-service.yaml # 3. Access your static site via port-forward **Option 1: Simple (Recommended)** ```bash # Keep terminal open, see connection logs (Ctrl+C to stop) kubectl port-forward service/nginx-static-service 8080:80 ``` **Option 2: Advanced (Background)** ```bash # Start in background nohup kubectl port-forward service/nginx-static-service 8080:80 > /dev/null 2>&1 & # Kill when done lsof -ti:8080 | xargs kill -9 ``` # 4. Visit http://localhost:8080 curl http://localhost:8080 ``` **Expected Result:** You'll see a custom static website served by Nginx. ## 📋 What You'll Learn - ✅ Nginx container deployment - ✅ Static content serving - ✅ ConfigMap usage for custom HTML - ✅ Service creation and networking - ✅ Port-forwarding for external access (Mycelium Cloud method) - ✅ Basic nginx configuration patterns ## 🏗️ Architecture This example demonstrates: ``` ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ User │ │ Port-Forward │ │ Nginx │ │ (Browser) │────│ localhost:8080 │────│ Pod │ │ │ │ │ │ :80 │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ ┌───────────────┐ │ ConfigMap │ │ (HTML/CSS) │ └───────────────┘ ``` **Components:** - **Nginx Pod**: Serves static content from /usr/share/nginx/html - **ConfigMap**: Stores custom HTML, CSS, and other static files - **Service**: LoadBalancer exposing the nginx pod - **Port-Forward**: Mycelium Cloud method for external access ## 📊 Resource Details ```bash # Expected output kubectl get pods NAME READY STATUS RESTARTS AGE nginx-static-xxxxxx-xxxxx 1/1 Running 0 2m kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) nginx-static-service LoadBalancer 10.43.xx.x 10.20.x.x,10.20.x.x 80:xxxxx/TCP ``` ## 🔧 Customization Guide ### Change the Content Create a custom ConfigMap with your content: ```bash # Create your custom HTML file cat << EOF > custom-index.html My Custom Site

Welcome to My Static Site

This site is running on Mycelium Cloud!

Current time: $(date)

EOF # Create ConfigMap with custom content kubectl create configmap nginx-static-content \ --from-file=index.html=custom-index.html # Update deployment to use the new ConfigMap kubectl apply -f nginx-static-deployment.yaml ``` ### Add More Static Files Create additional ConfigMaps for CSS, JavaScript, or images: ```bash # Add a stylesheet cat << EOF > custom.css body { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } h1 { text-align: center; margin-top: 100px; } ``` ```bash # Create ConfigMap with multiple files kubectl create configmap nginx-static-content \ --from-file=index.html=custom-index.html \ --from-file=styles.css=custom.css ``` ## 🚪 Access Methods ### Method 1: Port-Forward (Recommended for Mycelium Cloud) **Option 1: Simple (Recommended)** ```bash # Keep terminal open, see connection logs (Ctrl+C to stop) kubectl port-forward service/nginx-static-service 8080:80 # Access via browser or curl curl http://localhost:8080 ``` **Option 2: Advanced (Background)** ```bash # Start in background nohup kubectl port-forward service/nginx-static-service 8080:80 > /dev/null 2>&1 & # Access via browser or curl curl http://localhost:8080 ``` **Why this works in Mycelium Cloud:** - LoadBalancer external IPs are internal cluster addresses - Port-forward creates local tunnel to cluster service - Reliable and consistent access method ### Method 2: LoadBalancer (For Reference) Note: In Mycelium Cloud, LoadBalancer external IPs (like 10.20.x.x) are internal cluster IPs and not externally accessible. Use port-forward for external access. ## 🗑️ Resource Cleanup ```bash # Remove all resources kubectl delete -f nginx-static-deployment.yaml -f nginx-static-service.yaml # Remove the ConfigMap kubectl delete configmap nginx-static-content # Verify cleanup kubectl get all -l app=nginx-static # Should return nothing ``` ## 🔍 Troubleshooting ### Pod Won't Start ```bash # Check pod status kubectl get pods -l app=nginx-static # Check pod logs kubectl logs deployment/nginx-static # Check pod events kubectl describe pod -l app=nginx-static ``` ### Site Not Loading ```bash # Check service endpoints kubectl get endpoints nginx-static-service # Check if port-forward is working kubectl port-forward service/nginx-static-service 8081:80 & curl -v http://localhost:8081 ``` ### Custom Content Not Showing ```bash # Verify ConfigMap content kubectl get configmap nginx-static-content -o yaml # Check if files are mounted correctly kubectl exec -it deployment/nginx-static -- ls -la /usr/share/nginx/html/ # Reload nginx to pick up changes kubectl exec -it deployment/nginx-static -- nginx -s reload ``` ### Port Forward Fails ```bash # Check if port is in use lsof -i :8080 # Try different port kubectl port-forward service/nginx-static-service 8082:80 curl http://localhost:8082 ``` ## 📚 More Examples This is currently one of the complete examples. Future examples will include: - **python-flask/** - Python web applications - **redis-cache/** - In-memory data caching - **postgresql/** - Persistent database services - **wordpress/** - Multi-container CMS deployment - **nodejs-api/** - Modern JavaScript applications - **jenkins-cicd/** - Infrastructure automation - **nextcloud/** - Enterprise file sharing ## 💡 Pro Tips 1. **Start Simple**: Begin with foreground port-forward (`kubectl port-forward`) 2. **Background Optional**: Use `nohup` only when you need persistent port-forwards 3. **Port Management**: Use `lsof -ti:PORT` to find and kill processes 4. **Resource Monitoring**: `kubectl get pods -o wide` shows pod distribution 5. **Quick Testing**: `curl -s http://localhost:8080` to verify nginx is working 6. **Nginx Logs**: `kubectl logs deployment/nginx-static` for debugging 7. **Config Updates**: Update ConfigMap then reload nginx: `kubectl exec deployment/nginx-static -- nginx -s reload` ## 🎉 Success Indicators You'll know everything is working when: - ✅ `kubectl get pods` shows nginx-static pod in "Running" status - ✅ `kubectl get svc` shows nginx-static-service created - ✅ `curl http://localhost:8080` returns your custom HTML content - ✅ `kubectl logs deployment/nginx-static` shows nginx access logs ## 🏆 Next Steps After completing this example, you can: 1. **Customize Content**: Replace with your own static site 2. **Add More Examples**: Try the Python Flask API example 3. **Scale Up**: Learn about load balancing with multiple replicas 4. **Add Persistence**: Learn about persistent volumes for file storage --- ## 📞 Getting Help - **Troubleshooting**: Check the troubleshooting section above - **Mycelium Cloud Docs**: See main repository README - **Kubectl Help**: `kubectl get pods --help` for command reference - **Support**: Contact Mycelium Cloud support team For more help, visit our [documentation](../../README.md) or contact support.