diff --git a/.gitignore b/.gitignore index cdc8b0c..75aa39f 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ node_modules/ # Build info *.tsbuildinfo +node_modules/.tmp/ # OS .DS_Store diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ca276c6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +# Build stage +FROM node:20-alpine AS builder + +WORKDIR /app + +COPY package*.json ./ +RUN npm ci + +COPY . . +RUN npm run build + +# Production stage +FROM nginx:alpine + +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..aeb9b66 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,19 @@ +services: + mission-control-ui: + build: + context: . + dockerfile: Dockerfile + container_name: mission-control-ui + restart: unless-stopped + labels: + - "traefik.enable=true" + - "traefik.http.routers.mission-control-ui.rule=Host(`mission-control.danielarroyo.cl`)" + - "traefik.http.routers.mission-control-ui.entrypoints=websecure" + - "traefik.http.routers.mission-control-ui.tls.certresolver=letsencrypt" + - "traefik.http.services.mission-control-ui.loadbalancer.server.port=80" + networks: + - traefik + +networks: + traefik: + external: true diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..379c917 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,23 @@ +server { + listen 80; + server_name localhost; + root /usr/share/nginx/html; + index index.html; + + # Serve static files + location / { + try_files $uri $uri/ /index.html; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + } + + # Don't cache index.html + location = /index.html { + expires -1; + add_header Cache-Control "no-store, no-cache, must-revalidate"; + } +} diff --git a/node_modules/.tmp/tsconfig.app.tsbuildinfo b/node_modules/.tmp/tsconfig.app.tsbuildinfo index 9549797..0af3b93 100644 --- a/node_modules/.tmp/tsconfig.app.tsbuildinfo +++ b/node_modules/.tmp/tsconfig.app.tsbuildinfo @@ -1 +1 @@ -{"root":["../../src/App.tsx","../../src/main.tsx","../../src/components/AgentDetailPanel.tsx","../../src/components/AgentNode.tsx","../../src/components/ConnectionsLayer.tsx","../../src/components/MissionControlDashboard.tsx","../../src/components/SearchAndFilters.tsx","../../src/components/StatusBar.tsx","../../src/components/Timeline.tsx","../../src/data/agents.ts","../../src/lib/utils.ts","../../src/types/agent.ts"],"version":"5.9.3"} \ No newline at end of file +{"root":["../../src/App.tsx","../../src/main.tsx","../../src/components/AgentDetailPanel.tsx","../../src/components/AgentNode.tsx","../../src/components/ConnectionsLayer.tsx","../../src/components/MissionControlDashboard.tsx","../../src/components/SearchAndFilters.tsx","../../src/components/StatusBar.tsx","../../src/components/Timeline.tsx","../../src/data/agents.ts","../../src/hooks/useOpenClaw.ts","../../src/lib/openclaw-api.ts","../../src/lib/utils.ts","../../src/types/agent.ts"],"version":"5.9.3"} \ No newline at end of file