Repository: appsmithorg/appsmith
Pull request #40642: fix: allow running as non-root
Author: login: wyattwalter
Labels: name: Bug
description: Something isn't working
name: Production
name: Community Reported
description: issues reported by community members
name: Needs Triaging
description: Needs attention from maintainers to triage
name: Stale
name: K8s
description: Kubernetes related issues
name: DevOps Pod
description: Issues related to devops
name: Medium
description: Issues that frustrate users due to poor UX
Created: 2025-05-12T15:17:22Z | Merged: 2025-05-28T16:49:49Z

## Description

Allows the Appsmith container to run as a non-root user, specified at runtime through either docker-compose or Kubernetes pod security context. I didn't specify the user in the `Dockerfile` because environments like OpenShift choose a user at runtime, so it can't be known at build time.

This needs to be followed by an update to docs and changes in the Helm chart to finish it off, but that has a separate release cycle and this needs to go ahead of that.

Ideally we would run as non-root by default, but since there's data persisted on the filesystem automatically transitioning the default is impossible without a lot of pain. This moves us in that direction and enables it in the future if we go down that path.

Required to fix https://github.com/appsmithorg/appsmith/issues/38787

## Automation

/ok-to-test tags=""

### :mag: Cypress test results
<!-- This is an auto-generated comment: Cypress test results  -->
> [!WARNING]
> Tests have not run on the HEAD 50ba745c5bb7709c60ce5194437f921f1a95c980 yet
> <hr>Thu, 15 May 2025 15:56:31 UTC
<!-- end of auto-generated comment: Cypress test results  -->


## Communication
Should the DevRel and Marketing teams inform users about this change?
- [ ] Yes
- [x] No


<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **New Features**
  - Added support for user identity emulation when running as a non-root user, improving compatibility in certain deployment environments.
  - Prevented embedded database initialization when running as a non-root user to ensure proper operation.

- **Chores**
  - Installed additional system packages to the base image for enhanced functionality.
  - Optimized image size by consolidating and improving cleanup steps during the build process.
  - Updated base image and refined installation commands for improved build consistency.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/deploy/docker/base.dockerfile b/deploy/docker/base.dockerfile
index ea1050d7336e..33a452eb67de 100644
--- a/deploy/docker/base.dockerfile
+++ b/deploy/docker/base.dockerfile
@@ -21,6 +21,8 @@ RUN set -o xtrace \
     supervisor curl nfs-common gnupg \
     gettext \
     ca-certificates \
+    libnss-wrapper \
+    git \
   # Install MongoDB v6, Redis, PostgreSQL v14
   && curl -fsSL https://www.mongodb.org/static/pgp/server-6.0.asc | gpg --dearmor -o /usr/share/keyrings/mongodb-server-6.0.gpg \
   && echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-6.0.list \
@@ -28,7 +30,16 @@ RUN set -o xtrace \
   && curl --silent --show-error --location https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \
   && apt update \
   && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends --yes mongodb-org redis postgresql-14 \
-  && apt-get clean
+  && find /etc/redis -type d -exec chmod o+rx {} + -o -type f -exec chmod o+r {} + \
+  && apt-get clean \
+  && rm -rf \
+    /root/.cache \
+    /root/.npm \
+    /usr/local/share/doc \
+    /usr/share/doc \
+    /usr/share/man \
+    /var/lib/apt/lists/* \
+    /tmp/*
 
 ENV PATH="/usr/lib/postgresql/14/bin:${PATH}"
 
@@ -65,23 +76,20 @@ RUN set -o xtrace \
   && mkdir -p /opt/caddy \
   && version="$(curl --write-out '%{redirect_url}' 'https://github.com/caddyserver/caddy/releases/latest' | sed 's,.*/v,,')" \
   && curl --location "https://github.com/caddyserver/caddy/releases/download/v$version/caddy_${version}_linux_$(uname -m | sed 's/x86_64/amd64/; s/aarch64/arm64/').tar.gz" \
-  | tar -xz -C /opt/caddy
-
-RUN mv /opt/caddy/caddy /opt/caddy/caddy_vanilla
+    | tar -xz -C /opt/caddy && \
+  mv /opt/caddy/caddy /opt/caddy/caddy_vanilla
 
 COPY --from=caddybuilder /usr/bin/caddy /opt/caddy/caddy
 
-# Clean up
-RUN rm -rf \
-  /root/.cache \
-  /root/.npm \
-  /usr/local/share/doc \
-  /usr/share/doc \
-  /usr/share/man \
-  /var/lib/apt/lists/* \
-  /tmp/*
-
 VOLUME [ "/appsmith-stacks" ]
 
 ENV TMP="/tmp/appsmith"
 ENV WWW_PATH="$TMP/www"
+
+# libnss_wrapper.so is written to an architecture-specific directory, so we symlink to it in a common location to make it easier to activate
+ENV NSS_WRAPPER_SYMLINK=/usr/local/lib/libnss_wrapper.so
+RUN NSS_WRAPPER_LIB=$(find /usr/lib -name libnss_wrapper.so -type f 2>/dev/null | head -n1) && \
+    ln -sf "$NSS_WRAPPER_LIB" $NSS_WRAPPER_SYMLINK
+# these env vars need to be set for NSS Wrapper to work but don't matter until LD_PRELOAD is set which is optionally done at runtime
+ENV NSS_WRAPPER_PASSWD="${TMP}/passwd"
+ENV NSS_WRAPPER_GROUP="${TMP}/group"
diff --git a/deploy/docker/fs/opt/appsmith/entrypoint.sh b/deploy/docker/fs/opt/appsmith/entrypoint.sh
index 77ab4cd5de8a..8b41b8a06dba 100644
--- a/deploy/docker/fs/opt/appsmith/entrypoint.sh
+++ b/deploy/docker/fs/opt/appsmith/entrypoint.sh
@@ -5,8 +5,6 @@ source pg-utils.sh
 
 set -e
 
-tlog "Running as: $(id)"
-
 stacks_path=/appsmith-stacks
 
 export APPSMITH_PG_DATABASE="appsmith"
@@ -15,6 +13,23 @@ export MONGODB_TMP_KEY_PATH="$TMP/mongodb-key"  # export for use in supervisor p
 
 mkdir -pv "$SUPERVISORD_CONF_TARGET" "$WWW_PATH"
 
+if [ "$(id -u)" != "0" ]; then
+    # if user is non-root setup nss_wrapper
+    # If this is a container restart, the files may already exist and we want them to remain read-only
+    if [[ ! -f /tmp/appsmith/passwd ]]; then
+        echo "appsmith:x:$(id -u):$(id -g):Appsmith:/opt/appsmith:/bin/bash" > /tmp/appsmith/passwd
+        chmod 444 /tmp/appsmith/passwd
+    fi
+    if [[ ! -f /tmp/appsmith/group ]]; then
+        echo "appsmith:x:$(id -g):" > /tmp/appsmith/group
+        chmod 444 /tmp/appsmith/group
+    fi
+    # NSS_WRAPPER_PASSWD, NSS_WRAPPER_GROUP, and NSS_WRAPPER_SYMLINK are set in Dockerfile
+    export LD_PRELOAD="$NSS_WRAPPER_SYMLINK"
+fi
+
+tlog "Running as: $(id)"
+
 setup_proxy_variables() {
   export NO_PROXY="${NO_PROXY-localhost,127.0.0.1}"
 
@@ -429,6 +444,11 @@ check_redis_compatible_page_size() {
 init_postgres() {
   # Initialize embedded postgres by default; set APPSMITH_ENABLE_EMBEDDED_DB to 0, to use existing cloud postgres mockdb instance
   if [[ ${APPSMITH_ENABLE_EMBEDDED_DB: -1} != 0 ]]; then
+    if [[ "$(id -u)" != "0" ]]; then
+      tlog "== When running as a non-root user embedded PostgreSQL cannot be used. Please use an external PostgreSQL instance instead." >&2
+      exit 1
+    fi
+
     tlog "Checking initialized local postgres"
     POSTGRES_DB_PATH="$stacks_path/data/postgres/main"
 


Reviews:
user: login: wyattwalter
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-14T17:16:48Z
user: login: wyattwalter
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-14T17:16:59Z
user: login: wyattwalter
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-14T17:22:27Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>♻️ Duplicate comments (1)</summary><blockquote>

<details>
<summary>deploy/docker/base.dockerfile (1)</summary><blockquote>

`25-25`: **Include `git` in base image for consistency**  
This aligns with the root Dockerfile change.

</blockquote></details>

</blockquote></details>

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>deploy/docker/fs/opt/appsmith/entrypoint.sh (1)</summary><blockquote>

`16-23`: **Initialize NSS wrapper for non-root users**  
The setup block correctly generates temporary passwd/group files. For consistency, consider using the `$TMP` variable instead of hardcoding `/tmp/appsmith`.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: .coderabbit.yaml**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 74b7afee10bacf5ecdeab615b93629da9db835b3 and 7bff585353a1b4d2dafccdc8136a0db8ff5b5a36.

</details>

<details>
<summary>📒 Files selected for processing (3)</summary>

* `Dockerfile` (1 hunks)
* `deploy/docker/base.dockerfile` (2 hunks)
* `deploy/docker/fs/opt/appsmith/entrypoint.sh` (1 hunks)

</details>

<details>
<summary>🔇 Additional comments (6)</summary><blockquote>

<details>
<summary>deploy/docker/base.dockerfile (4)</summary>

`24-24`: **Add `libnss-wrapper` for non-root user support**  
This package is necessary to enable NSS wrapper emulation at runtime.

---

`33-42`: **Consolidated cleanup after package installation**  
Removing apt caches, docs, man pages, and temporary files effectively reduces image size.

---

`88-91`: **Create symlink for `libnss_wrapper.so`**  
Linking the architecture-specific library to a stable path simplifies LD_PRELOAD activation.

---

`92-94`: **Export NSS wrapper environment variables**  
Setting `NSS_WRAPPER_PASSWD` and `NSS_WRAPPER_GROUP` prepares the container for optional runtime emulation.

</details>
<details>
<summary>deploy/docker/fs/opt/appsmith/entrypoint.sh (1)</summary>

`25-25`: **Retain user identity log placement**  
Moving the `tlog "Running as: $(id)"` call after the NSS wrapper setup improves clarity.

</details>
<details>
<summary>Dockerfile (1)</summary>

`16-17`: **Refactor `apt-get install` formatting for readability**  
Moving `apt-get install -y git` to its own indented line aligns with best practices and has no functional impact.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-14T19:29:03Z
user: login: wyattwalter
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-15T15:57:23Z

Review comments:
diff_hunk: @@ -21,14 +21,32 @@ RUN set -o xtrace \
     supervisor curl nfs-common gnupg \
     gettext \
     ca-certificates \
+    libnss-wrapper \
+    git \
path: deploy/docker/base.dockerfile
user: login: wyattwalter
body: Moving git here from the Dockerfile at the root. Once this is in the master branch we can delete the install there.
created_at: 2025-05-14T17:16:48Z
author_association: CONTRIBUTOR
diff_hunk: @@ -21,14 +21,32 @@ RUN set -o xtrace \
     supervisor curl nfs-common gnupg \
     gettext \
     ca-certificates \
+    libnss-wrapper \
path: deploy/docker/base.dockerfile
user: login: wyattwalter
body: This package is new.
created_at: 2025-05-14T17:16:59Z
author_association: CONTRIBUTOR
diff_hunk: @@ -65,22 +83,11 @@ RUN set -o xtrace \
   && mkdir -p /opt/caddy \
   && version="$(curl --write-out '%{redirect_url}' 'https://github.com/caddyserver/caddy/releases/latest' | sed 's,.*/v,,')" \
   && curl --location "https://github.com/caddyserver/caddy/releases/download/v$version/caddy_${version}_linux_$(uname -m | sed 's/x86_64/amd64/; s/aarch64/arm64/').tar.gz" \
-  | tar -xz -C /opt/caddy
-
-RUN mv /opt/caddy/caddy /opt/caddy/caddy_vanilla
+    | tar -xz -C /opt/caddy && \
+  mv /opt/caddy/caddy /opt/caddy/caddy_vanilla
 
 COPY --from=caddybuilder /usr/bin/caddy /opt/caddy/caddy
 
-# Clean up
-RUN rm -rf \
-  /root/.cache \
-  /root/.npm \
-  /usr/local/share/doc \
-  /usr/share/doc \
-  /usr/share/man \
-  /var/lib/apt/lists/* \
-  /tmp/*
path: deploy/docker/base.dockerfile
user: login: wyattwalter
body: Moved these up to cleanup some wasted space in the layers.
created_at: 2025-05-14T17:22:27Z
author_association: CONTRIBUTOR
diff_hunk: @@ -65,23 +76,20 @@ RUN set -o xtrace \
   && mkdir -p /opt/caddy \
   && version="$(curl --write-out '%{redirect_url}' 'https://github.com/caddyserver/caddy/releases/latest' | sed 's,.*/v,,')" \
   && curl --location "https://github.com/caddyserver/caddy/releases/download/v$version/caddy_${version}_linux_$(uname -m | sed 's/x86_64/amd64/; s/aarch64/arm64/').tar.gz" \
-  | tar -xz -C /opt/caddy
-
-RUN mv /opt/caddy/caddy /opt/caddy/caddy_vanilla
+    | tar -xz -C /opt/caddy && \
+  mv /opt/caddy/caddy /opt/caddy/caddy_vanilla
path: deploy/docker/base.dockerfile
user: login: wyattwalter
body: This removed an extra layer, removing ~50MB from the image.
created_at: 2025-05-15T15:57:23Z
author_association: CONTRIBUTOR

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-05-12T15:17:30Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough

The changes update Docker build and entrypoint scripts to improve package installation, image cleanup, and user identity handling. The base Dockerfile now installs additional packages, consolidates cleanup steps, and sets up NSS Wrapper for non-root user support. The entrypoint script configures NSS Wrapper when running as a non-root user and prevents embedded Postgres initialization in non-root mode.

## Changes

| Files/Paths                                | Change Summary                                                                                                                        |
|--------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|
| Dockerfile                                 | Reformatted the `apt-get install` command for improved readability; logic remains unchanged.                                          |
| deploy/docker/base.dockerfile               | Added `libnss-wrapper` and `git` installation, consolidated cleanup steps, adjusted permissions on Redis config, set up NSS Wrapper symlink and environment variables. |
| deploy/docker/fs/opt/appsmith/entrypoint.sh | Added logic to configure NSS Wrapper for non-root users, moved and updated UID logging, introduced `fail_if_non_root()` to block embedded Postgres init for non-root users. |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant Entrypoint Script
    participant NSS Wrapper

    User->>Entrypoint Script: Start container
    Entrypoint Script->>Entrypoint Script: Check if running as non-root
    alt Non-root user
        Entrypoint Script->>NSS Wrapper: Create temp passwd/group files with current UID/GID
        Entrypoint Script->>Entrypoint Script: Export LD_PRELOAD with NSS Wrapper symlink
    end
    Entrypoint Script->>Entrypoint Script: Log current UID
    Entrypoint Script->>Entrypoint Script: If init_postgres, call fail_if_non_root to prevent embedded DB init
    Entrypoint Script->>User: Continue application startup
```

## Possibly related PRs

- #40058: Updates the base image version and upgrades database versions and key management in the same Dockerfile; both modify the base image and package setup but focus on different aspects.

## Suggested labels

`skip-changelog`

## Suggested reviewers

- sharat87  
- nidhi-nair

## Poem

> In Docker’s halls, new packages arrive,  
> With cleanup so thorough, the images thrive.  
> NSS Wrapper stands ready for users not root,  
> Ensuring the entrypoint’s logic stays astute.  
> With tidy commands and a symlink in tow,  
> The container’s identity is ready to go!  
> 🐳✨

<!-- walkthrough_end -->

<!-- announcements_start -->

> [!NOTE]
> <details>
> <summary>⚡️ AI Code Reviews for VS Code, Cursor, Windsurf</summary>
> 
> CodeRabbit now has a plugin for VS Code, Cursor and Windsurf. This brings AI code reviews directly in the code editor. Each commit is reviewed immediately, finding bugs before the PR is raised. Seamless context handoff to your AI code agent ensures that you can easily incorporate review feedback.
> Learn more [here](http://coderabbit.ai/ide).
> 
> </details>

---

> [!NOTE]
> <details>
> <summary>⚡️ Faster reviews with caching</summary>
> 
> CodeRabbit now supports caching for code and dependencies, helping speed up reviews. This means quicker feedback, reduced wait times, and a smoother review experience overall. Cached data is encrypted and stored securely. This feature will be automatically enabled for all accounts on May 16th. To opt out, configure `Review - Disable Cache` at either the organization or repository level. If you prefer to disable all data retention across your organization, simply turn off the `Data Retention` setting under your Organization Settings.
> Enjoy the performance boost—your workflow just got faster.
> 
> </details>

<!-- announcements_end -->

---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: .coderabbit.yaml**
**Review profile: CHILL**
**Plan: Pro (Legacy)**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between c0b3db2026549b845b6c0c646f7103b7025062b2 and 0616138fef7d88156f7c792676cd004fd19d1a36.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `deploy/docker/fs/opt/appsmith/entrypoint.sh` (2 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* deploy/docker/fs/opt/appsmith/entrypoint.sh

</details>

</details>
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=appsmithorg/appsmith&utm_content=40642):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: CONTRIBUTOR
user: login: wyattwalter
created_at: 2025-05-12T15:19:56Z
body: /build-deploy-preview skip-tests=true
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-05-12T15:20:21Z
body: Deploying Your Preview: <https://github.com/appsmithorg/appsmith/actions/runs/14976096450>.
Workflow: `On demand build Docker image and deploy preview`.
skip-tests: `true`.
env: ``.
PR: 40642.
recreate: .
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-12T15:25:38Z
body: Deploy-Preview-URL: https://ce-40642.dp.appsmith.com
author_association: NONE
user: login: wyattwalter
created_at: 2025-05-12T15:52:59Z
body: /build-deploy-preview skip-tests=true
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-05-12T15:53:24Z
body: Deploying Your Preview: <https://github.com/appsmithorg/appsmith/actions/runs/14976813608>.
Workflow: `On demand build Docker image and deploy preview`.
skip-tests: `true`.
env: ``.
PR: 40642.
recreate: .
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-12T15:58:37Z
body: Deploy-Preview-URL: https://ce-40642.dp.appsmith.com
author_association: NONE
user: login: wyattwalter
created_at: 2025-05-12T19:05:34Z
body: /build-deploy-preview skip-tests=true
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-05-12T19:06:00Z
body: Deploying Your Preview: <https://github.com/appsmithorg/appsmith/actions/runs/14980450347>.
Workflow: `On demand build Docker image and deploy preview`.
skip-tests: `true`.
env: ``.
PR: 40642.
recreate: .
author_association: NONE
user: login: wyattwalter
created_at: 2025-05-12T19:08:41Z
body: /build-deploy-preview skip-tests=true
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-05-12T19:09:04Z
body: Deploying Your Preview: <https://github.com/appsmithorg/appsmith/actions/runs/14980505949>.
Workflow: `On demand build Docker image and deploy preview`.
skip-tests: `true`.
env: ``.
PR: 40642.
recreate: .
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-12T19:16:48Z
body: Deploy-Preview-URL: https://ce-40642.dp.appsmith.com
author_association: NONE
user: login: wyattwalter
created_at: 2025-05-12T19:25:31Z
body: /build-deploy-preview skip-tests=true
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-05-12T19:25:55Z
body: Deploying Your Preview: <https://github.com/appsmithorg/appsmith/actions/runs/14980819023>.
Workflow: `On demand build Docker image and deploy preview`.
skip-tests: `true`.
env: ``.
PR: 40642.
recreate: .
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-12T19:32:15Z
body: Deploy-Preview-URL: https://ce-40642.dp.appsmith.com
author_association: NONE
user: login: wyattwalter
created_at: 2025-05-12T20:29:36Z
body: /build-deploy-preview skip-tests=true
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-05-12T20:29:57Z
body: Deploying Your Preview: <https://github.com/appsmithorg/appsmith/actions/runs/14981979160>.
Workflow: `On demand build Docker image and deploy preview`.
skip-tests: `true`.
env: ``.
PR: 40642.
recreate: .
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-12T20:36:25Z
body: Deploy-Preview-URL: https://ce-40642.dp.appsmith.com
author_association: NONE
user: login: wyattwalter
created_at: 2025-05-13T19:33:58Z
body: /build-deploy-preview skip-tests=true
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-05-13T19:34:19Z
body: Deploying Your Preview: <https://github.com/appsmithorg/appsmith/actions/runs/15005175710>.
Workflow: `On demand build Docker image and deploy preview`.
skip-tests: `true`.
env: ``.
PR: 40642.
recreate: .
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-13T19:50:47Z
body: Deploy-Preview-URL: https://ce-40642.dp.appsmith.com
author_association: NONE
user: login: wyattwalter
created_at: 2025-05-13T21:32:17Z
body: /build-deploy-preview skip-tests=true
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-05-13T21:32:37Z
body: Deploying Your Preview: <https://github.com/appsmithorg/appsmith/actions/runs/15007173454>.
Workflow: `On demand build Docker image and deploy preview`.
skip-tests: `true`.
env: ``.
PR: 40642.
recreate: .
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-13T21:39:38Z
body: Deploy-Preview-URL: https://ce-40642.dp.appsmith.com
author_association: NONE
user: login: wyattwalter
created_at: 2025-05-14T16:26:48Z
body: /build-deploy-preview skip-tests=true
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-05-14T16:27:13Z
body: Deploying Your Preview: <https://github.com/appsmithorg/appsmith/actions/runs/15026031823>.
Workflow: `On demand build Docker image and deploy preview`.
skip-tests: `true`.
env: ``.
PR: 40642.
recreate: .
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-14T16:33:52Z
body: Deploy-Preview-URL: https://ce-40642.dp.appsmith.com
author_association: NONE
user: login: wyattwalter
created_at: 2025-05-14T17:23:51Z
body: /build-deploy-preview skip-tests=true
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-05-14T17:24:14Z
body: Deploying Your Preview: <https://github.com/appsmithorg/appsmith/actions/runs/15027103609>.
Workflow: `On demand build Docker image and deploy preview`.
skip-tests: `true`.
env: ``.
PR: 40642.
recreate: .
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-14T17:31:05Z
body: Deploy-Preview-URL: https://ce-40642.dp.appsmith.com
author_association: NONE
user: login: wyattwalter
created_at: 2025-05-14T19:08:08Z
body: /build-deploy-preview skip-tests=true
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-05-14T19:08:32Z
body: Deploying Your Preview: <https://github.com/appsmithorg/appsmith/actions/runs/15029011790>.
Workflow: `On demand build Docker image and deploy preview`.
skip-tests: `true`.
env: ``.
PR: 40642.
recreate: .
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-14T19:14:10Z
body: Deploy-Preview-URL: https://ce-40642.dp.appsmith.com
author_association: NONE
user: login: wyattwalter
created_at: 2025-05-14T21:30:23Z
body: /build-deploy-preview skip-tests=true
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-05-14T21:31:04Z
body: Deploying Your Preview: <https://github.com/appsmithorg/appsmith/actions/runs/15031515817>.
Workflow: `On demand build Docker image and deploy preview`.
skip-tests: `true`.
env: ``.
PR: 40642.
recreate: .
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-14T21:37:59Z
body: Deploy-Preview-URL: https://ce-40642.dp.appsmith.com
author_association: NONE
user: login: wyattwalter
created_at: 2025-05-14T21:49:00Z
body: /build-deploy-preview skip-tests=true
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-05-14T21:49:22Z
body: Deploying Your Preview: <https://github.com/appsmithorg/appsmith/actions/runs/15031794549>.
Workflow: `On demand build Docker image and deploy preview`.
skip-tests: `true`.
env: ``.
PR: 40642.
recreate: .
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-14T21:54:48Z
body: Deploy-Preview-URL: https://ce-40642.dp.appsmith.com
author_association: NONE
user: login: wyattwalter
created_at: 2025-05-15T15:08:54Z
body: /build-deploy-preview skip-tests=true
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-05-15T15:09:21Z
body: Deploying Your Preview: <https://github.com/appsmithorg/appsmith/actions/runs/15048572151>.
Workflow: `On demand build Docker image and deploy preview`.
skip-tests: `true`.
env: ``.
PR: 40642.
recreate: .
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-15T15:15:34Z
body: Deploy-Preview-URL: https://ce-40642.dp.appsmith.com
author_association: NONE
user: login: wyattwalter
created_at: 2025-05-15T15:24:13Z
body: /build-deploy-preview skip-tests=true
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-05-15T15:24:40Z
body: Deploying Your Preview: <https://github.com/appsmithorg/appsmith/actions/runs/15048924049>.
Workflow: `On demand build Docker image and deploy preview`.
skip-tests: `true`.
env: ``.
PR: 40642.
recreate: .
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-15T15:31:03Z
body: Deploy-Preview-URL: https://ce-40642.dp.appsmith.com
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-22T16:40:14Z
body: This PR has not seen activitiy for a while. It will be closed in 7 days unless further activity is detected.
author_association: NONE