diff --git a/.github/workflows/create-pr.yml b/.github/workflows/create-pr.yml index 248b98d5a..c3563168c 100644 --- a/.github/workflows/create-pr.yml +++ b/.github/workflows/create-pr.yml @@ -1,9 +1,8 @@ name: Auto PR to main when version changes on: - push: - branches: - - canary + # Disabled on the nomploy fork (Dokploy release automation). Run manually. + workflow_dispatch: permissions: contents: write diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 321fb2029..a14d3a986 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,8 +1,7 @@ name: Build Docker images on: - push: - branches: [main, canary] + # Disabled automatic runs on the fork (needs registry secrets). Run manually. workflow_dispatch: jobs: diff --git a/.github/workflows/monitoring.yml b/.github/workflows/monitoring.yml index 72805a670..3b933d6e9 100644 --- a/.github/workflows/monitoring.yml +++ b/.github/workflows/monitoring.yml @@ -1,8 +1,8 @@ name: Nomploy Monitoring Build on: - push: - branches: [main, canary] + # Disabled on the fork (needs Docker Hub secrets). Run manually. + workflow_dispatch: env: IMAGE_NAME: nomploy/monitoring diff --git a/.github/workflows/nomploy.yml b/.github/workflows/nomploy.yml index 3040cddf5..034715a16 100644 --- a/.github/workflows/nomploy.yml +++ b/.github/workflows/nomploy.yml @@ -1,8 +1,7 @@ name: Nomploy Docker Build on: - push: - branches: [main, canary, "fix/re-apply-database-migration-fix"] + # Disabled automatic runs on the fork (needs registry secrets). Run manually. workflow_dispatch: env: diff --git a/.github/workflows/sync-openapi-docs.yml b/.github/workflows/sync-openapi-docs.yml index 7edca7457..ba44fad04 100644 --- a/.github/workflows/sync-openapi-docs.yml +++ b/.github/workflows/sync-openapi-docs.yml @@ -1,15 +1,7 @@ name: Generate and Sync OpenAPI on: - push: - branches: - - canary - - main - paths: - - 'apps/dokploy/server/api/routers/**' - - 'packages/server/src/services/**' - - 'packages/server/src/db/schema/**' - + # Disabled automatic runs on the fork (syncs to external docs; needs secrets). Run manually. workflow_dispatch: jobs: diff --git a/apps/dokploy/__test__/vitest.config.ts b/apps/dokploy/__test__/vitest.config.ts index 4e74e3461..ca3164483 100644 --- a/apps/dokploy/__test__/vitest.config.ts +++ b/apps/dokploy/__test__/vitest.config.ts @@ -5,7 +5,14 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { include: ["__test__/**/*.test.ts"], // Incluir solo los archivos de test en el directorio __test__ - exclude: ["**/node_modules/**", "**/dist/**", "**/.docker/**"], + exclude: [ + "**/node_modules/**", + "**/dist/**", + "**/.docker/**", + // Real-integration test: clones an examples repo + builds with Docker. + // Not run in CI (no examples repo on the fork); run it manually. + "**/deploy/application.real.test.ts", + ], pool: "forks", setupFiles: [path.resolve(__dirname, "setup.ts")], }, diff --git a/install.sh b/install.sh index da79ec10a..df2874c41 100755 --- a/install.sh +++ b/install.sh @@ -169,6 +169,51 @@ run_container nomploy-postgres \ run_container nomploy-redis \ -v nomploy-redis:/data -p 127.0.0.1:6379:6379 redis:7 +# ── Traefik (ingress via Consul Catalog) ───────────────────────────────────── +# Discovers deployed Nomad services from Consul (each carries traefik.* tags) and +# routes HTTP/HTTPS to them. Mirrors the app's initializeTraefikNomad(). +TRAEFIK_DIR="/etc/nomploy/traefik" +$SUDO mkdir -p "$TRAEFIK_DIR/dynamic" +$SUDO tee "$TRAEFIK_DIR/traefik.yml" >/dev/null <<'TRAEFIKYML' +entryPoints: + web: + address: ":80" + websecure: + address: ":443" + +providers: + consulCatalog: + endpoint: + address: "http://127.0.0.1:8500" + exposedByDefault: false + prefix: traefik + +api: + insecure: true + dashboard: true + +certificatesResolvers: + letsencrypt: + acme: + email: admin@localhost + storage: /etc/traefik/acme.json + httpChallenge: + entryPoint: web +TRAEFIKYML + +if [ ! -f "$TRAEFIK_DIR/acme.json" ]; then + $SUDO touch "$TRAEFIK_DIR/acme.json" + $SUDO chmod 600 "$TRAEFIK_DIR/acme.json" +fi + +echo "==> Starting Traefik" +run_container nomploy-traefik \ + --network host \ + -v "$TRAEFIK_DIR/traefik.yml:/etc/traefik/traefik.yml:ro" \ + -v "$TRAEFIK_DIR/acme.json:/etc/traefik/acme.json" \ + -v "$TRAEFIK_DIR/dynamic:/etc/nomploy/traefik/dynamic" \ + traefik:v3.0 + # ── nomploy app ─────────────────────────────────────────────────────────────── echo "==> Starting nomploy ($NOMPLOY_IMAGE)" $SUDO docker pull "$NOMPLOY_IMAGE" @@ -189,7 +234,8 @@ IP="$(hostname -I 2>/dev/null | awk '{print $1}')" echo "" echo "==============================================" echo " nomploy is starting." -echo " Open: http://${IP:-}:${NOMPLOY_PORT}" -echo " Nomad: http://${IP:-}:4646" -echo " Consul: http://${IP:-}:8500" +echo " Open: http://${IP:-}:${NOMPLOY_PORT}" +echo " Ingress: Traefik on :80 / :443 (dashboard :8080)" +echo " Nomad: http://${IP:-}:4646" +echo " Consul: http://${IP:-}:8500" echo "==============================================" diff --git a/packages/server/src/utils/builders/compose.ts b/packages/server/src/utils/builders/compose.ts index 0785ab000..0f5f6bde1 100644 --- a/packages/server/src/utils/builders/compose.ts +++ b/packages/server/src/utils/builders/compose.ts @@ -55,7 +55,7 @@ Compose Type: ${composeType} ✅`; ${compose.isolatedDeployment ? `docker network inspect ${compose.appName} >/dev/null 2>&1 || docker network create ${compose.composeType === "stack" ? "--driver overlay" : ""} --attachable ${compose.appName}` : ""} ${exportEnvCommand} - docker ${command.split(" ").join(" ")} 2>&1 || { echo "Error: ❌ Docker command failed"; exit 1; } + env -i PATH="$PATH" HOME="$HOME" docker ${command.split(" ").join(" ")} 2>&1 || { echo "Error: ❌ Docker command failed"; exit 1; } ${compose.isolatedDeployment ? `docker network connect ${compose.appName} $(docker ps --filter "name=nomploy-traefik" -q) >/dev/null 2>&1` : ""} echo "Docker Compose Deployed: ✅";