mirror of
https://github.com/dokploy/dokploy.git
synced 2026-06-14 03:19:49 +00:00
a07106d649
* fix(migrate-auth-secret): exit cleanly when there are no 2FA records The empty-records branch of `main()` returned without calling `process.exit(0)`, leaving the Drizzle Postgres connection pool holding the event loop open. The `migrate-auth-secret` process then hangs indefinitely after printing "No 2FA records found, nothing to migrate." causing the upstream `0.29.3.sh` security migration script (which calls this via `docker exec`) to never reach its final `docker service update` step that mounts the new Docker Secret. Operators end up with the new secret created but the dokploy service still configured with the hardcoded `BETTER_AUTH_SECRET`, while believing the migration completed. Match the success branch a few lines below which already does `process.exit(0)`, and the pattern used in sibling scripts `reset-password.ts` and `reset-2fa.ts`. Closes #4392 * feat(compose): add import from base64 in create service dropdown Adds an "Import" option to the Create Service dropdown that lets users paste a base64-encoded compose export, preview the template (compose YAML, domains, envs, mounts) before confirming, and create the service only on confirm. Adds a `previewTemplate` tRPC procedure that processes the base64 without touching the DB, with server access validation via session. * [autofix.ci] apply automated fixes * Enhance version synchronization workflow to include SDK repository - Updated the GitHub Actions workflow to sync versioning across MCP, CLI, and SDK repositories. - Added steps to bump the version in the SDK repository and regenerate tools from the latest OpenAPI spec. - Improved commit message formatting to include source and release information for all repositories. - Ensured successful synchronization messages for each repository after the version update. * feat(deployment): add readLogs procedure to fetch deployment logs - Introduced a new `readLogs` procedure that allows users to retrieve logs for a specific deployment by providing the deployment ID and an optional tail parameter. - Implemented permission checks to ensure users have access to the requested logs. - Enhanced log retrieval for both cloud and non-cloud environments, utilizing appropriate commands based on the server context. Resolve https://github.com/Dokploy/mcp/issues/14 * feat(deployment): add server access validation for deployment actions - Implemented server access validation in deployment procedures to ensure users can only access deployments associated with their active organization. - Added checks to throw an UNAUTHORIZED error if a user attempts to access a deployment linked to a server outside their organization. This enhancement improves security and access control within the deployment management system. * feat(organization): prevent inviting users with owner role - Added validation to prevent users from being invited with the owner role in the organization and user routers. - Implemented TRPCError responses to ensure proper error handling when attempting to assign the owner role. This change enhances role management and security within the organization structure. https://github.com/Dokploy/dokploy/security/advisories/GHSA-fm9p-wmpw-gxjh * feat(user): implement session cleanup on user update - Added functionality to delete old sessions when a user updates their password, ensuring that only the current session remains active. - This change enhances security by preventing unauthorized access from previous sessions after a password change. Close here https://github.com/Dokploy/dokploy/security/advisories/GHSA-rr9m-w87g-46f3 * feat(settings): add copy button to server IP in web server settings (#4397) * fix: copy Dokploy server IP when clicking server badge (#4390) * fix: copy Dokploy server IP when clicking server badge When a service runs on the local Dokploy server (no remote server), clicking the server badge did nothing because `data.server` is null. Now falls back to the server IP from settings so the badge always copies an IP address. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(copy-ip): implement IP address copying functionality across database service components - Added the ability to copy the server IP address to the clipboard when clicking the server badge in various database service components (Libsql, MariaDB, MongoDB, MySQL, PostgreSQL, Redis). - Integrated the `copy-to-clipboard` library and `sonner` for user feedback upon successful copy action. - Ensured fallback to the server IP from settings when the service data is not available, enhancing user experience and functionality. --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: Mauricio Siu <siumauricio@icloud.com> * fix: responsive layout (#4391) Signed-off-by: Nahidujjaman Hridoy <hridoyboss12@gmail.com> * fix: automatically converting username to lowercase both in creation of register, and build for extra. (#4382) * fix: allow square brackets in zip path validation for Next.js dynamic routes (#4468) * fix: allow square brackets in zip drop path validation for Next.js dynamic routes ZIP uploads containing Next.js dynamic route files (e.g. app/api/[id]/route.ts, pages/[slug].tsx) were rejected by readValidDirectory because the path regex did not include square bracket characters. * [autofix.ci] apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * fix: prevent webhook deploy crash when commit data lacks modified files (#4470) shouldDeploy passed undefined/null entries from commit.modified straight into micromatch, which throws "Expected input to be a string" and fails every webhook deployment when watch paths are configured. Filter out non-string values before matching. * fix: add type="button" to TooltipTrigger in form components to prevent accidental submission (#4422) Co-authored-by: Maks Pikov <mixelburg@users.noreply.github.com> * fix: enable comment toggle shortcut in env variable editor (#4402) (#4473) * fix: add tls=true label for domains when certificateType is none (#4018) (#4474) * fix: add tls=true label for compose domains when certificateType is none (#4018) * test: cover tls=true label for certificateType none, require https * fix: scope tls fix to compose labels, leave traefik file config unchanged (#4018) * chore: update version to v0.29.5 in package.json --------- Signed-off-by: Nahidujjaman Hridoy <hridoyboss12@gmail.com> Co-authored-by: ngenohkevin <ngenohkevin19@gmail.com> Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Co-authored-by: Mauricio Siu <siumauricio@icloud.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Volodymyr Kravchuk <volodymyr.kravch@gmail.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: Nahidujjaman Hridoy <75487507+nhridoy@users.noreply.github.com> Co-authored-by: Francis <9560564+Baker@users.noreply.github.com> Co-authored-by: mixelburg <52622705+mixelburg@users.noreply.github.com> Co-authored-by: Maks Pikov <mixelburg@users.noreply.github.com>
242 lines
7.7 KiB
YAML
242 lines
7.7 KiB
YAML
name: Dokploy Docker Build
|
|
|
|
on:
|
|
push:
|
|
branches: [main, canary, "fix/re-apply-database-migration-fix"]
|
|
workflow_dispatch:
|
|
|
|
env:
|
|
IMAGE_NAME: dokploy/dokploy
|
|
|
|
jobs:
|
|
docker-amd:
|
|
runs-on: ubuntu-22.04
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v3
|
|
|
|
- name: Login to Docker Hub
|
|
uses: docker/login-action@v3
|
|
with:
|
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
|
|
- name: Set tag and version
|
|
id: meta
|
|
run: |
|
|
if [ "${{ github.ref }}" = "refs/heads/main" ]; then
|
|
TAG="latest"
|
|
VERSION=$(node -p "require('./apps/dokploy/package.json').version")
|
|
elif [ "${{ github.ref }}" = "refs/heads/canary" ]; then
|
|
TAG="canary"
|
|
else
|
|
TAG="feature"
|
|
fi
|
|
echo "tags=${IMAGE_NAME}:${TAG}-amd64" >> $GITHUB_OUTPUT
|
|
|
|
- name: Prepare env file
|
|
run: |
|
|
cp apps/dokploy/.env.production.example .env.production
|
|
cp apps/dokploy/.env.production.example apps/dokploy/.env.production
|
|
|
|
- name: Build and push
|
|
uses: docker/build-push-action@v5
|
|
with:
|
|
context: .
|
|
platforms: linux/amd64
|
|
push: true
|
|
tags: ${{ steps.meta.outputs.tags }}
|
|
docker-arm:
|
|
runs-on: ubuntu-24.04-arm
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v3
|
|
|
|
- name: Login to Docker Hub
|
|
uses: docker/login-action@v3
|
|
with:
|
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
|
|
- name: Set tag and version
|
|
id: meta
|
|
run: |
|
|
VERSION=$(node -p "require('./apps/dokploy/package.json').version")
|
|
if [ "${{ github.ref }}" = "refs/heads/main" ]; then
|
|
TAG="latest"
|
|
VERSION=$(node -p "require('./apps/dokploy/package.json').version")
|
|
elif [ "${{ github.ref }}" = "refs/heads/canary" ]; then
|
|
TAG="canary"
|
|
else
|
|
TAG="feature"
|
|
fi
|
|
echo "tags=${IMAGE_NAME}:${TAG}-arm64" >> $GITHUB_OUTPUT
|
|
|
|
- name: Prepare env file
|
|
run: |
|
|
cp apps/dokploy/.env.production.example .env.production
|
|
cp apps/dokploy/.env.production.example apps/dokploy/.env.production
|
|
|
|
- name: Build and push
|
|
uses: docker/build-push-action@v5
|
|
with:
|
|
context: .
|
|
platforms: linux/arm64
|
|
push: true
|
|
tags: ${{ steps.meta.outputs.tags }}
|
|
|
|
combine-manifests:
|
|
needs: [docker-amd, docker-arm]
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v3
|
|
|
|
- name: Login to Docker Hub
|
|
uses: docker/login-action@v3
|
|
with:
|
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
|
|
- name: Create and push manifests
|
|
run: |
|
|
if [ "${{ github.ref }}" = "refs/heads/main" ]; then
|
|
VERSION=$(node -p "require('./apps/dokploy/package.json').version")
|
|
TAG="latest"
|
|
|
|
docker buildx imagetools create -t ${IMAGE_NAME}:${TAG} \
|
|
${IMAGE_NAME}:${TAG}-amd64 \
|
|
${IMAGE_NAME}:${TAG}-arm64
|
|
|
|
docker buildx imagetools create -t ${IMAGE_NAME}:${VERSION} \
|
|
${IMAGE_NAME}:${TAG}-amd64 \
|
|
${IMAGE_NAME}:${TAG}-arm64
|
|
|
|
elif [ "${{ github.ref }}" = "refs/heads/canary" ]; then
|
|
TAG="canary"
|
|
docker buildx imagetools create -t ${IMAGE_NAME}:${TAG} \
|
|
${IMAGE_NAME}:${TAG}-amd64 \
|
|
${IMAGE_NAME}:${TAG}-arm64
|
|
|
|
else
|
|
TAG="feature"
|
|
docker buildx imagetools create -t ${IMAGE_NAME}:${TAG} \
|
|
${IMAGE_NAME}:${TAG}-amd64 \
|
|
${IMAGE_NAME}:${TAG}-arm64
|
|
fi
|
|
|
|
generate-release:
|
|
needs: [combine-manifests]
|
|
if: github.ref == 'refs/heads/main'
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
version: ${{ steps.get_version.outputs.version }}
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
- name: Get version
|
|
id: get_version
|
|
run: |
|
|
VERSION=$(node -p "require('./apps/dokploy/package.json').version")
|
|
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
|
|
|
- name: Create Release
|
|
uses: softprops/action-gh-release@v2
|
|
with:
|
|
tag_name: ${{ steps.get_version.outputs.version }}
|
|
name: ${{ steps.get_version.outputs.version }}
|
|
generate_release_notes: true
|
|
draft: false
|
|
prerelease: false
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
sync-version:
|
|
needs: [generate-release]
|
|
if: github.ref == 'refs/heads/main'
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Sync version to MCP repository
|
|
run: |
|
|
git clone https://x-access-token:${{ secrets.DOCS_SYNC_TOKEN }}@github.com/dokploy/mcp.git /tmp/mcp-repo
|
|
cd /tmp/mcp-repo
|
|
|
|
jq --arg v "${{ needs.generate-release.outputs.version }}" '.version = $v' package.json > package.json.tmp
|
|
mv package.json.tmp package.json
|
|
|
|
npm install -g pnpm
|
|
pnpm install
|
|
pnpm run fetch-openapi
|
|
pnpm run generate
|
|
|
|
git config user.name "Dokploy Bot"
|
|
git config user.email "bot@dokploy.com"
|
|
git add -A
|
|
git commit -m "chore: bump version to ${{ needs.generate-release.outputs.version }}" \
|
|
-m "Source: ${{ github.repository }}@${{ github.sha }}" \
|
|
--allow-empty
|
|
git push
|
|
|
|
echo "✅ MCP repo synced to version ${{ needs.generate-release.outputs.version }}"
|
|
|
|
- name: Sync version to CLI repository
|
|
run: |
|
|
git clone https://x-access-token:${{ secrets.DOCS_SYNC_TOKEN }}@github.com/dokploy/cli.git /tmp/cli-repo
|
|
cd /tmp/cli-repo
|
|
|
|
jq --arg v "${{ needs.generate-release.outputs.version }}" '.version = $v' package.json > package.json.tmp
|
|
mv package.json.tmp package.json
|
|
|
|
cp ${{ github.workspace }}/openapi.json ./openapi.json
|
|
npm install -g pnpm
|
|
pnpm install
|
|
pnpm run generate
|
|
|
|
git config user.name "Dokploy Bot"
|
|
git config user.email "bot@dokploy.com"
|
|
git add -A
|
|
git commit -m "chore: bump version to ${{ needs.generate-release.outputs.version }}" \
|
|
-m "Source: ${{ github.repository }}@${{ github.sha }}" \
|
|
--allow-empty
|
|
git push
|
|
|
|
echo "✅ CLI repo synced to version ${{ needs.generate-release.outputs.version }}"
|
|
|
|
- name: Sync version to SDK repository
|
|
run: |
|
|
git clone https://x-access-token:${{ secrets.DOCS_SYNC_TOKEN }}@github.com/dokploy/sdk.git /tmp/sdk-repo
|
|
cd /tmp/sdk-repo
|
|
|
|
jq --arg v "${{ needs.generate-release.outputs.version }}" '.version = $v' package.json > package.json.tmp
|
|
mv package.json.tmp package.json
|
|
|
|
cp ${{ github.workspace }}/openapi.json ./openapi.json
|
|
npm install -g pnpm
|
|
pnpm install
|
|
pnpm run generate
|
|
|
|
git config user.name "Dokploy Bot"
|
|
git config user.email "bot@dokploy.com"
|
|
git add -A
|
|
git commit -m "chore: bump version to ${{ needs.generate-release.outputs.version }}" \
|
|
-m "Source: ${{ github.repository }}@${{ github.sha }}" \
|
|
--allow-empty
|
|
git push
|
|
|
|
echo "✅ SDK repo synced to version ${{ needs.generate-release.outputs.version }}"
|