apiVersion: apps/v1
kind: Deployment
metadata:
  name: docusaurus
  namespace: docusaurus
  labels:
    app: docusaurus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: docusaurus
  template:
    metadata:
      labels:
        app: docusaurus
      annotations:
        docusaurus/source-hash: "2024-12-30-v1"
    spec:
      initContainers:
      - name: build-docusaurus
        image: node:18-alpine
        workingDir: /workspace
        command:
        - sh
        - -c
        - |
          apk add --no-cache git
          echo "Cloning repository..."
          git clone https://github.com/Mayne0213/applications.git /tmp/repo
          cd /tmp/repo/docusaurus/asset
          echo "Installing dependencies..."
          npm install --legacy-peer-deps
          echo "Building Docusaurus site..."
          npm run build
          echo "Copying build output..."
          cp -r build/. /build/
          echo "Build complete!"
        volumeMounts:
        - name: build-output
          mountPath: /build
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80
          name: http
        volumeMounts:
        - name: build-output
          mountPath: /usr/share/nginx/html
        - name: nginx-config
          mountPath: /etc/nginx/conf.d/default.conf
          subPath: default.conf
        resources:
          requests:
            cpu: 50m
            memory: 64Mi
          limits:
            memory: 128Mi
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 10
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5
      volumes:
      - name: build-output
        emptyDir: {}
      - name: nginx-config
        configMap:
          name: nginx-config
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
  namespace: docusaurus
data:
  default.conf: |
    server {
        listen 80;
        server_name _;
        root /usr/share/nginx/html;
        index index.html;

        # Enable gzip compression
        gzip on;
        gzip_vary on;
        gzip_min_length 1024;
        gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml+rss application/javascript application/json;

        # Redirect root to intro page
        location = / {
            return 301 /intro/;
        }

        # SPA fallback
        location / {
            try_files $uri $uri/ /intro/index.html;
        }

        # Cache static assets
        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
            expires 1y;
            add_header Cache-Control "public, immutable";
        }

        # Security headers
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-Content-Type-Options "nosniff" always;
        add_header X-XSS-Protection "1; mode=block" always;
    }
