From 46267b93fa6b7ce5cebdf60b7afc5a1afa98ec65 Mon Sep 17 00:00:00 2001 From: Sanjeevi Subramani Date: Sat, 14 Feb 2026 14:53:01 +0530 Subject: [PATCH 1/2] feat: add support for external PostgreSQL and Redis services Add environment variable support for connecting to external PostgreSQL and Redis instances instead of the built-in Docker Swarm services. This enables deploying Dokploy on Kubernetes and other container orchestrators where running Docker Swarm services for infrastructure isn't possible. Changes: - Skip built-in Postgres/Redis Docker Swarm service creation when external services are configured (DATABASE_URL pointing to external host, or REDIS_URL/REDIS_HOST set) - Add REDIS_URL support for full connection string with auth, TLS, port - Add REDIS_PORT and REDIS_PASSWORD individual env var support - Prevent runtime env vars (DATABASE_URL, REDIS_URL, POSTGRES_* etc) from being hardcoded at build time by esbuild - Update backup/restore to work with external PostgreSQL via pg_dump/ pg_restore using PGPASSWORD env var - Guard cleanRedis/reloadRedis admin operations when using external Redis - Export isExternalDatabase() and isExternalRedis() helpers from constants - Update .env.example and .env.production.example with documentation Closes #2611 --- Dockerfile | 4 + apps/dokploy/.env.example | 23 +++ apps/dokploy/.env.production.example | 12 +- apps/dokploy/esbuild.config.ts | 16 +- apps/dokploy/server/api/routers/settings.ts | 10 ++ .../dokploy/server/queues/redis-connection.ts | 41 +++++- packages/server/src/db/constants.ts | 57 +++++++- packages/server/src/setup/postgres-setup.ts | 5 + packages/server/src/setup/redis-setup.ts | 5 + .../server/src/utils/backups/web-server.ts | 66 +++++---- .../server/src/utils/restore/web-server.ts | 138 ++++++++++++------ 11 files changed, 294 insertions(+), 83 deletions(-) diff --git a/Dockerfile b/Dockerfile index 262862ca63..a796f396c7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,6 +17,10 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile # Deploy only the dokploy app ENV NODE_ENV=production +# Build-time only: use localhost to prevent slow DNS timeouts during Next.js static generation. +# These are NOT baked into the bundle (excluded in esbuild.config.ts) and do NOT persist to the final image stage. +ENV DATABASE_URL="postgres://dokploy:build@127.0.0.1:5432/dokploy" +ENV REDIS_HOST="127.0.0.1" RUN pnpm --filter=@dokploy/server build RUN pnpm --filter=./apps/dokploy run build diff --git a/apps/dokploy/.env.example b/apps/dokploy/.env.example index 8f801196e7..0ddcc2b662 100644 --- a/apps/dokploy/.env.example +++ b/apps/dokploy/.env.example @@ -1,3 +1,26 @@ DATABASE_URL="postgres://dokploy:amukds4wi9001583845717ad2@localhost:5432/dokploy" PORT=3000 NODE_ENV=development + +# --- External PostgreSQL (optional) --- +# Set DATABASE_URL to point to your external PostgreSQL instance. +# When it points to a host other than 'dokploy-postgres', the built-in +# Docker Swarm Postgres service will NOT be created during setup. +# DATABASE_URL="postgres://user:password@your-postgres-host:5432/dokploy" + +# Alternative: use Docker Secrets for the password +# POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password +# POSTGRES_USER=dokploy +# POSTGRES_DB=dokploy +# POSTGRES_HOST=your-postgres-host +# POSTGRES_PORT=5432 + +# --- External Redis (optional) --- +# Set REDIS_URL to point to your external Redis instance. +# When set, the built-in Docker Swarm Redis service will NOT be created. +# REDIS_URL="redis://:password@your-redis-host:6379" + +# Or configure individual Redis params: +# REDIS_HOST=your-redis-host +# REDIS_PORT=6379 +# REDIS_PASSWORD=your-redis-password diff --git a/apps/dokploy/.env.production.example b/apps/dokploy/.env.production.example index 560faf9e6b..c6e0caff57 100644 --- a/apps/dokploy/.env.production.example +++ b/apps/dokploy/.env.production.example @@ -1,2 +1,12 @@ PORT=3000 -NODE_ENV=production \ No newline at end of file +NODE_ENV=production + +# --- External PostgreSQL (optional) --- +# DATABASE_URL="postgres://user:password@your-postgres-host:5432/dokploy" +# POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password + +# --- External Redis (optional) --- +# REDIS_URL="redis://:password@your-redis-host:6379" +# REDIS_HOST=your-redis-host +# REDIS_PORT=6379 +# REDIS_PASSWORD=your-redis-password \ No newline at end of file diff --git a/apps/dokploy/esbuild.config.ts b/apps/dokploy/esbuild.config.ts index 615b2bdc01..22112599af 100644 --- a/apps/dokploy/esbuild.config.ts +++ b/apps/dokploy/esbuild.config.ts @@ -5,10 +5,22 @@ const result = dotenv.config({ path: ".env.production" }); function prepareDefine(config: DotenvParseOutput | undefined) { const define = {}; + // These environment variables must resolve at runtime, not build time + const runtimeEnvVars = new Set([ + "DATABASE_URL", + "REDIS_URL", + "REDIS_HOST", + "REDIS_PORT", + "REDIS_PASSWORD", + "POSTGRES_PASSWORD_FILE", + "POSTGRES_USER", + "POSTGRES_DB", + "POSTGRES_HOST", + "POSTGRES_PORT", + ]); // @ts-ignore for (const [key, value] of Object.entries(config)) { - // Skip DATABASE_URL to allow runtime environment variable override - if (key === "DATABASE_URL") { + if (runtimeEnvVars.has(key)) { continue; } // @ts-ignore diff --git a/apps/dokploy/server/api/routers/settings.ts b/apps/dokploy/server/api/routers/settings.ts index bb7269fa7d..9fd00132f3 100644 --- a/apps/dokploy/server/api/routers/settings.ts +++ b/apps/dokploy/server/api/routers/settings.ts @@ -18,6 +18,7 @@ import { getUpdateData, getWebServerSettings, IS_CLOUD, + isExternalRedis, parseRawConfig, paths, prepareEnvironmentVariables, @@ -96,6 +97,10 @@ export const settingsRouter = createTRPCRouter({ return true; } + if (isExternalRedis()) { + throw new Error("Cannot flush external Redis from Dokploy. Please use your Redis provider's management tools."); + } + const { stdout: containerId } = await execAsync( `docker ps --filter "name=dokploy-redis" --filter "status=running" -q | head -n 1`, ); @@ -113,6 +118,11 @@ export const settingsRouter = createTRPCRouter({ if (IS_CLOUD) { return true; } + + if (isExternalRedis()) { + throw new Error("Cannot reload external Redis from Dokploy. Please use your Redis provider's management tools."); + } + await reloadDockerResource("dokploy-redis"); return true; diff --git a/apps/dokploy/server/queues/redis-connection.ts b/apps/dokploy/server/queues/redis-connection.ts index 520ce46187..79f40b5614 100644 --- a/apps/dokploy/server/queues/redis-connection.ts +++ b/apps/dokploy/server/queues/redis-connection.ts @@ -1,8 +1,41 @@ import type { ConnectionOptions } from "bullmq"; -export const redisConfig: ConnectionOptions = { - host: +function buildRedisConfig(): ConnectionOptions { + const redisUrl = process.env.REDIS_URL; + if (redisUrl) { + try { + const url = new URL(redisUrl); + return { + host: url.hostname, + port: Number(url.port) || 6379, + ...(url.password && { password: decodeURIComponent(url.password) }), + ...(url.username && + url.username !== "" && { + username: decodeURIComponent(url.username), + }), + ...(url.protocol === "rediss:" && { tls: {} }), + }; + } catch { + console.error( + "[redis-connection] Invalid REDIS_URL, falling back to defaults", + ); + } + } + + const host = process.env.NODE_ENV === "production" ? process.env.REDIS_HOST || "dokploy-redis" - : "127.0.0.1", -}; + : "127.0.0.1"; + + const port = Number(process.env.REDIS_PORT) || 6379; + + return { + host, + port, + ...(process.env.REDIS_PASSWORD && { + password: process.env.REDIS_PASSWORD, + }), + }; +} + +export const redisConfig: ConnectionOptions = buildRedisConfig(); diff --git a/packages/server/src/db/constants.ts b/packages/server/src/db/constants.ts index c4396726e8..1c4a4eccbc 100644 --- a/packages/server/src/db/constants.ts +++ b/packages/server/src/db/constants.ts @@ -18,7 +18,6 @@ function readSecret(path: string): string { } export let dbUrl: string; if (DATABASE_URL) { - // Compatibilidad legacy / overrides dbUrl = DATABASE_URL; } else if (POSTGRES_PASSWORD_FILE) { const password = readSecret(POSTGRES_PASSWORD_FILE); @@ -45,3 +44,59 @@ if (DATABASE_URL) { "postgres://dokploy:amukds4wi9001583845717ad2@localhost:5432/dokploy"; } } + +const INTERNAL_DB_HOSTS = new Set(["dokploy-postgres", "localhost", "127.0.0.1"]); + +/** + * Returns true when Dokploy is configured to use an external PostgreSQL + * instance (not the built-in Docker Swarm service or localhost dev). + */ +export const isExternalDatabase = (): boolean => { + try { + const url = new URL(dbUrl); + return !INTERNAL_DB_HOSTS.has(url.hostname); + } catch { + return false; + } +}; + +/** + * Returns true when Dokploy is configured to use an external Redis + * instance (not the built-in Docker Swarm service). + */ +export const isExternalRedis = (): boolean => { + return !!(process.env.REDIS_URL || (process.env.REDIS_HOST && process.env.REDIS_HOST !== "dokploy-redis")); +}; + +export interface PostgresCredentials { + user: string; + database: string; + host: string; + port: string; + password: string; +} + +/** + * Parses PostgreSQL credentials from the resolved database URL. + * Shared by backup and restore code paths. + */ +export const getPostgresCredentials = (): PostgresCredentials => { + try { + const url = new URL(dbUrl); + return { + user: decodeURIComponent(url.username) || POSTGRES_USER || "dokploy", + database: url.pathname.replace(/^\//, "") || POSTGRES_DB || "dokploy", + host: url.hostname, + port: url.port || "5432", + password: decodeURIComponent(url.password), + }; + } catch { + return { + user: POSTGRES_USER || "dokploy", + database: POSTGRES_DB || "dokploy", + host: "dokploy-postgres", + port: "5432", + password: "", + }; + } +}; diff --git a/packages/server/src/setup/postgres-setup.ts b/packages/server/src/setup/postgres-setup.ts index 377a849528..7a93a9c135 100644 --- a/packages/server/src/setup/postgres-setup.ts +++ b/packages/server/src/setup/postgres-setup.ts @@ -1,7 +1,12 @@ import type { CreateServiceOptions } from "dockerode"; import { docker } from "../constants"; +import { isExternalDatabase } from "../db/constants"; import { pullImage } from "../utils/docker/utils"; export const initializePostgres = async () => { + if (isExternalDatabase()) { + console.log("Using external PostgreSQL — skipping built-in Postgres service ✅"); + return; + } const imageName = "postgres:16"; const containerName = "dokploy-postgres"; const settings: CreateServiceOptions = { diff --git a/packages/server/src/setup/redis-setup.ts b/packages/server/src/setup/redis-setup.ts index 894b3427de..719798887a 100644 --- a/packages/server/src/setup/redis-setup.ts +++ b/packages/server/src/setup/redis-setup.ts @@ -1,8 +1,13 @@ import type { CreateServiceOptions } from "dockerode"; import { docker } from "../constants"; +import { isExternalRedis } from "../db/constants"; import { pullImage } from "../utils/docker/utils"; export const initializeRedis = async () => { + if (isExternalRedis()) { + console.log("Using external Redis — skipping built-in Redis service ✅"); + return; + } const imageName = "redis:7"; const containerName = "dokploy-redis"; diff --git a/packages/server/src/utils/backups/web-server.ts b/packages/server/src/utils/backups/web-server.ts index 4d13ae31ae..cb9a34b9c4 100644 --- a/packages/server/src/utils/backups/web-server.ts +++ b/packages/server/src/utils/backups/web-server.ts @@ -3,12 +3,14 @@ import { mkdtemp, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { IS_CLOUD, paths } from "@dokploy/server/constants"; +import { getPostgresCredentials, isExternalDatabase } from "@dokploy/server/db/constants"; import type { BackupSchedule } from "@dokploy/server/services/backup"; import { createDeploymentBackup, updateDeploymentStatus, } from "@dokploy/server/services/deployment"; import { findDestinationById } from "@dokploy/server/services/destination"; +import { quote } from "shell-quote"; import { execAsync } from "../process/execAsync"; import { getS3Credentials, normalizeS3Path } from "./utils"; @@ -36,35 +38,45 @@ export const runWebServerBackup = async (backup: BackupSchedule) => { try { await execAsync(`mkdir -p ${tempDir}/filesystem`); - // First get the container ID - const { stdout: containerId } = await execAsync( - `docker ps --filter "name=dokploy-postgres" --filter "status=running" -q | head -n 1`, - ); - - if (!containerId) { - writeStream.write("Dokploy postgres container not found❌\n"); - writeStream.end(); - throw new Error("Dokploy postgres container not found"); + const creds = getPostgresCredentials(); + + if (isExternalDatabase()) { + // External database: use pg_dump directly against the remote host + writeStream.write(`Running external database dump\n`); + await execAsync( + `pg_dump -v -Fc -h ${quote([creds.host])} -p ${quote([creds.port])} -U ${quote([creds.user])} -d ${quote([creds.database])} -f ${quote([`${tempDir}/database.sql`])}`, + { env: { ...process.env, PGPASSWORD: creds.password } }, + ); + } else { + // Built-in Docker Swarm postgres: exec into the container + const { stdout: containerId } = await execAsync( + `docker ps --filter "name=dokploy-postgres" --filter "status=running" -q | head -n 1`, + ); + + if (!containerId) { + writeStream.write("Dokploy postgres container not found❌\n"); + writeStream.end(); + throw new Error("Dokploy postgres container not found"); + } + + writeStream.write(`Dokploy postgres container ID: ${containerId}\n`); + + const postgresContainerId = containerId.trim(); + + const dumpCommand = `docker exec ${quote([postgresContainerId])} pg_dump -v -Fc -U ${quote([creds.user])} -d ${quote([creds.database])} -f /tmp/database.sql`; + writeStream.write(`Running dump command: ${dumpCommand}\n`); + await execAsync(dumpCommand); + + const copyCommand = `docker cp ${quote([postgresContainerId])}:/tmp/database.sql ${quote([`${tempDir}/database.sql`])}`; + writeStream.write(`Copying database dump: ${copyCommand}\n`); + await execAsync(copyCommand); + + const cleanupCommand = `docker exec ${quote([postgresContainerId])} rm -f /tmp/database.sql`; + writeStream.write(`Cleaning up temp file: ${cleanupCommand}\n`); + await execAsync(cleanupCommand); } - writeStream.write(`Dokploy postgres container ID: ${containerId}\n`); - - const postgresContainerId = containerId.trim(); - - // First dump the database inside the container - const dumpCommand = `docker exec ${postgresContainerId} pg_dump -v -Fc -U dokploy -d dokploy -f /tmp/database.sql`; - writeStream.write(`Running dump command: ${dumpCommand}\n`); - await execAsync(dumpCommand); - - // Then copy the file from the container to host - const copyCommand = `docker cp ${postgresContainerId}:/tmp/database.sql ${tempDir}/database.sql`; - writeStream.write(`Copying database dump: ${copyCommand}\n`); - await execAsync(copyCommand); - - // Clean up the temp file in the container - const cleanupCommand = `docker exec ${postgresContainerId} rm -f /tmp/database.sql`; - writeStream.write(`Cleaning up temp file: ${cleanupCommand}\n`); - await execAsync(cleanupCommand); + writeStream.write("Database dump complete\n"); await execAsync( `rsync -a --ignore-errors ${BASE_PATH}/ ${tempDir}/filesystem/`, diff --git a/packages/server/src/utils/restore/web-server.ts b/packages/server/src/utils/restore/web-server.ts index 683a1898ae..1c7202dc45 100644 --- a/packages/server/src/utils/restore/web-server.ts +++ b/packages/server/src/utils/restore/web-server.ts @@ -2,10 +2,22 @@ import { mkdtemp } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { IS_CLOUD, paths } from "@dokploy/server/constants"; +import { getPostgresCredentials, isExternalDatabase } from "@dokploy/server/db/constants"; import type { Destination } from "@dokploy/server/services/destination"; +import { quote } from "shell-quote"; import { getS3Credentials } from "../backups/utils"; import { execAsync } from "../process/execAsync"; +/** Escape a value for use inside a SQL single-quoted string literal. */ +function escapeSqlLiteral(value: string): string { + return value.replace(/'/g, "''"); +} + +/** Escape a value for use as a SQL identifier (double-quoted). */ +function escapeSqlIdentifier(value: string): string { + return `"${value.replace(/"/g, '""')}"`; +} + export const restoreWebServerBackup = async ( destination: Destination, backupFile: string, @@ -83,56 +95,86 @@ export const restoreWebServerBackup = async ( throw new Error("Database file not found after extraction"); } - const { stdout: postgresContainer } = await execAsync( - `docker ps --filter "name=dokploy-postgres" --filter "status=running" -q | head -n 1`, - ); - - if (!postgresContainer) { - throw new Error("Dokploy Postgres container not found"); + const creds = getPostgresCredentials(); + + const safeDb = escapeSqlIdentifier(creds.database); + const safeLiteral = escapeSqlLiteral(creds.database); + + if (isExternalDatabase()) { + // External database: use psql/pg_restore directly against the remote host + const pgEnv = { ...process.env, PGPASSWORD: creds.password }; + + emit("Disconnecting all users from external database..."); + await execAsync( + `psql -h ${quote([creds.host])} -p ${quote([creds.port])} -U ${quote([creds.user])} postgres -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '${safeLiteral}' AND pid <> pg_backend_pid();"`, + { env: pgEnv }, + ); + + emit("Dropping existing database..."); + await execAsync( + `psql -h ${quote([creds.host])} -p ${quote([creds.port])} -U ${quote([creds.user])} postgres -c "DROP DATABASE IF EXISTS ${safeDb};"`, + { env: pgEnv }, + ); + + emit("Creating fresh database..."); + await execAsync( + `psql -h ${quote([creds.host])} -p ${quote([creds.port])} -U ${quote([creds.user])} postgres -c "CREATE DATABASE ${safeDb};"`, + { env: pgEnv }, + ); + + emit("Running database restore..."); + await execAsync( + `pg_restore -v -h ${quote([creds.host])} -p ${quote([creds.port])} -U ${quote([creds.user])} -d ${quote([creds.database])} ${quote([`${tempDir}/database.sql`])}`, + { env: pgEnv }, + ); + } else { + // Built-in Docker Swarm postgres: exec into the container + const { stdout: postgresContainer } = await execAsync( + `docker ps --filter "name=dokploy-postgres" --filter "status=running" -q | head -n 1`, + ); + + if (!postgresContainer) { + throw new Error("Dokploy Postgres container not found"); + } + + const postgresContainerId = postgresContainer.trim(); + + emit("Disconnecting all users from database..."); + await execAsync( + `docker exec ${quote([postgresContainerId])} psql -U ${quote([creds.user])} postgres -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '${safeLiteral}' AND pid <> pg_backend_pid();"`, + ); + + emit("Dropping existing database..."); + await execAsync( + `docker exec ${quote([postgresContainerId])} psql -U ${quote([creds.user])} postgres -c "DROP DATABASE IF EXISTS ${safeDb};"`, + ); + + emit("Creating fresh database..."); + await execAsync( + `docker exec ${quote([postgresContainerId])} psql -U ${quote([creds.user])} postgres -c "CREATE DATABASE ${safeDb};"`, + ); + + emit("Copying backup file into container..."); + await execAsync( + `docker cp ${quote([`${tempDir}/database.sql`])} ${quote([`${postgresContainerId}:/tmp/database.sql`])}`, + ); + + emit("Verifying file in container..."); + await execAsync( + `docker exec ${quote([postgresContainerId])} ls -l /tmp/database.sql`, + ); + + emit("Running database restore..."); + await execAsync( + `docker exec ${quote([postgresContainerId])} pg_restore -v -U ${quote([creds.user])} -d ${quote([creds.database])} /tmp/database.sql`, + ); + + emit("Cleaning up container temp file..."); + await execAsync( + `docker exec ${quote([postgresContainerId])} rm /tmp/database.sql`, + ); } - const postgresContainerId = postgresContainer.trim(); - - // Drop and recreate database - emit("Disconnecting all users from database..."); - await execAsync( - `docker exec ${postgresContainerId} psql -U dokploy postgres -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'dokploy' AND pid <> pg_backend_pid();"`, - ); - - emit("Dropping existing database..."); - await execAsync( - `docker exec ${postgresContainerId} psql -U dokploy postgres -c "DROP DATABASE IF EXISTS dokploy;"`, - ); - - emit("Creating fresh database..."); - await execAsync( - `docker exec ${postgresContainerId} psql -U dokploy postgres -c "CREATE DATABASE dokploy;"`, - ); - - // Copy the backup file into the container - emit("Copying backup file into container..."); - await execAsync( - `docker cp ${tempDir}/database.sql ${postgresContainerId}:/tmp/database.sql`, - ); - - // Verify file in container - emit("Verifying file in container..."); - await execAsync( - `docker exec ${postgresContainerId} ls -l /tmp/database.sql`, - ); - - // Restore from the copied file - emit("Running database restore..."); - await execAsync( - `docker exec ${postgresContainerId} pg_restore -v -U dokploy -d dokploy /tmp/database.sql`, - ); - - // Cleanup the temporary file in the container - emit("Cleaning up container temp file..."); - await execAsync( - `docker exec ${postgresContainerId} rm /tmp/database.sql`, - ); - emit("Restore completed successfully!"); } finally { // Cleanup From 684004b9bca9074ea08f6bb006465c4353652781 Mon Sep 17 00:00:00 2001 From: Sanjeevi Subramani Date: Wed, 11 Mar 2026 17:22:36 +0530 Subject: [PATCH 2/2] chore: upgrade GitHub Actions to Node.js 24-compatible versions Update workflow action references to latest major versions to resolve Node.js 20 deprecation warnings. Co-Authored-By: Claude Opus 4.6 --- .github/workflows/create-pr.yml | 2 +- .github/workflows/deploy.yml | 6 +++--- .github/workflows/dokploy.yml | 8 ++++---- .github/workflows/format.yml | 2 +- .github/workflows/monitoring.yml | 6 +++--- .github/workflows/pull-request.yml | 4 ++-- .github/workflows/sync-openapi-docs.yml | 4 ++-- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/create-pr.yml b/.github/workflows/create-pr.yml index 248b98d5a7..a0bfe97309 100644 --- a/.github/workflows/create-pr.yml +++ b/.github/workflows/create-pr.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 3ed957b723..366f9800ef 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -11,7 +11,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v6 - name: Log in to Docker Hub uses: docker/login-action@v2 @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v6 - name: Log in to Docker Hub uses: docker/login-action@v2 @@ -61,7 +61,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v6 - name: Log in to Docker Hub uses: docker/login-action@v2 diff --git a/.github/workflows/dokploy.yml b/.github/workflows/dokploy.yml index 529cd8f7fa..93b381f7c9 100644 --- a/.github/workflows/dokploy.yml +++ b/.github/workflows/dokploy.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -53,7 +53,7 @@ jobs: runs-on: ubuntu-24.04-arm steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -96,7 +96,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -140,7 +140,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index cfddad7b2f..5a917e4339 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup biomeJs uses: biomejs/setup-biome@v2 diff --git a/.github/workflows/monitoring.yml b/.github/workflows/monitoring.yml index 378b019d42..bf74abbebd 100644 --- a/.github/workflows/monitoring.yml +++ b/.github/workflows/monitoring.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -47,7 +47,7 @@ jobs: runs-on: ubuntu-24.04-arm steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -84,7 +84,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index bfdc8c48ba..8cbf6bb8a9 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -14,9 +14,9 @@ jobs: matrix: job: [build, test, typecheck] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - uses: pnpm/action-setup@v4 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: node-version: 20.16.0 cache: "pnpm" diff --git a/.github/workflows/sync-openapi-docs.yml b/.github/workflows/sync-openapi-docs.yml index ddc51355a2..593e673949 100644 --- a/.github/workflows/sync-openapi-docs.yml +++ b/.github/workflows/sync-openapi-docs.yml @@ -18,11 +18,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Dokploy repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: token: ${{ secrets.GITHUB_TOKEN }} - uses: pnpm/action-setup@v4 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: node-version: 20.16.0 cache: "pnpm"