diff --git a/.dockerflow-env-files.json b/.dockerflow-env-files.json index 0f883f5..e788fac 100644 --- a/.dockerflow-env-files.json +++ b/.dockerflow-env-files.json @@ -1,5 +1,6 @@ { "/home/jorge/git/fidelizacion/docker-compose.prod.yml": ".env.prod", "/home/jorge/git/fidelizacion/api/docker-compose.dev.yml": ".env", - "/home/jorge/git/ninjasagacw/docker-compose.infra.yml": ".env" + "/home/jorge/git/ninjasagacw/docker-compose.infra.yml": ".env", + "/home/jorge/git/alteonx-dockerflow/docker-compose.yml": ".env" } \ No newline at end of file diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..031b7a2 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +node_modules +dist +.git +.github +*.md +.env +.dockerflow-*.json diff --git a/.gitignore b/.gitignore index c6f2cf7..7787458 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,4 @@ node_modules/ dist/ *.log .env -.dockerflow-positions.json +.dockerflow-*.json diff --git a/CLAUDE.md b/CLAUDE.md index f33d577..4d88423 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -30,3 +30,11 @@ - `bun run dev` — desarrollo (servidor + cliente) - `bun run build` — build de produccion + +## i18n (Internacionalizacion) + +- Todo texto visible en la UI debe usar el sistema de traducciones (`useT()` hook de `src/client/i18n.tsx`) +- Al agregar texto nuevo, agregar la key en ambos diccionarios (en + es) en `i18n.tsx` +- Keys usan formato `seccion.descripcion` (ej. `"settings.save"`, `"actions.restart"`) +- Nunca hardcodear strings de UI directamente en JSX +- El idioma se persiste en `localStorage("df:lang")`, default `"en"` diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b6fbe87 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,38 @@ +# ── Stage 1: build frontend ── +FROM oven/bun:1 AS build + +WORKDIR /app + +COPY package.json bun.lock ./ +RUN bun install --frozen-lockfile + +COPY src/ src/ +COPY vite.config.ts tsconfig.json ./ + +RUN bun run build + +# ── Stage 2: runtime ── +FROM oven/bun:1-slim + +# Docker CLI needed for rebuild/remove via `docker compose` +RUN apt-get update \ + && apt-get install -y --no-install-recommends ca-certificates curl \ + && curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc \ + && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" > /etc/apt/sources.list.d/docker.list \ + && apt-get update \ + && apt-get install -y --no-install-recommends docker-ce-cli \ + && apt-get purge -y curl \ + && apt-get autoremove -y \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /app + +COPY --from=build /app/dist/ dist/ +COPY --from=build /app/src/server/ src/server/ +COPY --from=build /app/src/shared/ src/shared/ +COPY --from=build /app/node_modules/ node_modules/ +COPY --from=build /app/package.json package.json + +EXPOSE 9470 + +CMD ["bun", "run", "src/server/index.ts", "--all"] diff --git a/README.md b/README.md index aaa792e..38815ac 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,15 @@ bun run dev Abre `http://localhost:9420` (Vite dev con hot reload, proxea API al backend en puerto 9470). -### Produccion +### Produccion (Docker) + +```bash +docker compose up -d +``` + +Abre `http://localhost:9470`. + +### Produccion (manual) ```bash bun run build diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..578b4f9 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,20 @@ +services: + containerflow: + build: . + ports: + - "${EXTERNAL_PORT:-9470}:9470" + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - containerflow-data:/app/data + environment: + - DATA_DIR=/app/data + env_file: .env + restart: unless-stopped + deploy: + resources: + limits: + cpus: "0.15" + memory: 256M + +volumes: + containerflow-data: diff --git a/src/client/App.tsx b/src/client/App.tsx index c1b3392..e130578 100644 --- a/src/client/App.tsx +++ b/src/client/App.tsx @@ -15,6 +15,7 @@ import "@xyflow/react/dist/style.css"; import { ServiceNode } from "./nodes/ServiceNode"; import { GroupNode } from "./nodes/GroupNode"; import { useDocker } from "./hooks/useDocker"; +import { I18nProvider, useT } from "./i18n"; import { createStatsStore, StatsStoreContext } from "./hooks/useStatsStore"; import { buildLayout, computeEdges, NODE_WIDTH, NODE_HEIGHT, GROUP_PADDING, GROUP_HEADER } from "./engine/layout"; import { DetailPanel } from "./panels/DetailPanel"; @@ -64,12 +65,18 @@ export default function App() { }, []); if (needsAuth === null) return
; - if (needsAuth) returnDocker container events in real-time
+{t("monitoring.subtitle")}
No events yet. Events will appear here as containers start, stop, or restart.
+{t("monitoring.noEvents")}
Alert Rules
-Configure alerting rules for container events — coming soon
+{t("monitoring.alertRules")}
+{t("monitoring.alertRulesDesc")}
Application configuration
+{t("settings.subtitle")}
Multi-host management — coming soon
-Connect to remote Docker daemons and manage multiple hosts from a single dashboard.
+{t("settings.dockerHostsDesc")}
+{t("settings.dockerHostsDetail")}
Webhook & email notifications — coming soon
-Configure Slack, Discord, or email alerts for container events and health checks.