Skip to content

feat(activepieces): standalone self-host stack + Git Sync flows-as-code (Phase 1) - #2233

Merged
POWERFULMOVES merged 1 commit into
mainfrom
feat/activepieces-selfhost
Jul 26, 2026
Merged

POWERFULMOVES merged 1 commit into
mainfrom
feat/activepieces-selfhost

Conversation

@POWERFULMOVES

@POWERFULMOVES POWERFULMOVES commented Jul 26, 2026

Copy link
Copy Markdown
Owner

Phase 1 of ActivePieces integration — a low-code automation companion to the n8n fabric. Standalone, opt-in stack (runs on demand, not in the main fleet compose).

What

  • pmoves/activepieces/docker-compose.yml — app + worker + postgres (pgvector) + redis (ghcr.io/activepieces/activepieces:0.86.3), hardened: no-new-privileges, healthchecks, named volumes, UI bound to 127.0.0.1:8087 (front via mesh, per privacy rule), secrets via :?-guarded env substitution.
  • env.activepieces.example — non-secret defaults + secret placeholders (AP_ENCRYPTION_KEY, AP_JWT_SECRET, AP_POSTGRES_PASSWORD, AP_LICENSE_KEY) emitted via the PMOVES secrets pipeline.
  • flows/ — Git Sync target (flows-as-code), mirrors pmoves/n8n/flows.
  • README.md — bring-up, Git Sync connection to the hosted (cataclysmstudios@gmail.com) account, CE export→commit→import fallback, secrets table.

Connection model

Git Sync — both the ActivePieces Cloud project and this self-host point at pmoves/activepieces/flows/, so flows become versioned flows-as-code (needs AP_EDITION=ee + license; CE fallback documented). Represented on the LinkedIn persona profile alongside the 34 n8n flows.

Verify

docker compose config validated (with dummy secrets).

Next (tracked)

Phase 2 — promote to a first-class service in the main fleet docker-compose.yml (tier + profile + overlay regen).

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added a self-hosted ActivePieces deployment with app, worker, PostgreSQL, and Redis services.
    • Added configurable local UI access, persistent storage, health checks, and security settings.
    • Added environment configuration templates for ports, database settings, editions, and required secrets.
  • Documentation

    • Added setup, startup, Git Sync, secrets, and workflow management guidance.
    • Documented Enterprise Git Sync and Community flow export/import options.

Phase 1 of ActivePieces integration (low-code automation companion to the n8n
fabric). Opt-in standalone compose so it runs on demand, not baked into the main
fleet compose (Phase 2 = first-class main-compose service, tracked).

- pmoves/activepieces/docker-compose.yml: app + worker + postgres(pgvector) +
  redis (ghcr.io/activepieces/activepieces:0.86.3), hardened (no-new-privileges,
  healthchecks, named volumes, 127.0.0.1-bound UI :8087), secrets via :?-guarded
  env substitution.
- env.activepieces.example: non-secret defaults + secret placeholders (emit via
  the PMOVES secrets pipeline, never hand-written).
- flows/: Git Sync target (flows-as-code), mirrors pmoves/n8n/flows.
- README.md: bring-up, Git Sync connection to the hosted (cataclysmstudios@gmail.com)
  account (AP_EDITION=ee), CE export→commit→import fallback, secrets table.

compose config validated. Connection model = Git Sync (both cloud + self-host →
pmoves/activepieces/flows); represented on the LinkedIn profile alongside n8n.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@github-actions github-actions Bot added the docs Documentation label Jul 26, 2026
@coderabbitai

coderabbitai Bot commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds an opt-in ActivePieces self-hosting stack with Compose services for the app, worker, Postgres, and Redis. It also adds environment defaults and documents operational setup, secrets, edition-specific Git Sync, and flow export locations.

Changes

ActivePieces self-hosting

Layer / File(s) Summary
Runtime configuration and application services
pmoves/activepieces/env.activepieces.example, pmoves/activepieces/docker-compose.yml
Defines environment defaults and configures the ActivePieces app and worker with database, Redis, edition, frontend, encryption, and JWT settings.
Persistent service dependencies
pmoves/activepieces/docker-compose.yml
Adds healthchecked Postgres and Redis services, persistent volumes, a shared network, and container security options.
Operations and flow synchronization documentation
pmoves/activepieces/README.md, pmoves/activepieces/flows/README.md
Documents lifecycle commands, local UI access, secret provisioning, Git Sync configuration, and the flows-as-code directory.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Operator
  participant Compose
  participant ActivePiecesApp
  participant ActivePiecesWorker
  participant Postgres
  participant Redis
  Operator->>Compose: Load environment file and start stack
  Compose->>Postgres: Start and check database health
  Compose->>Redis: Start and check Redis health
  Compose->>ActivePiecesApp: Start application
  ActivePiecesApp->>Postgres: Connect to configured database
  ActivePiecesApp->>Redis: Connect to configured Redis
  Compose->>ActivePiecesWorker: Start worker after dependencies
  ActivePiecesWorker->>Redis: Connect for job processing
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: a standalone ActivePieces self-host stack with Git Sync flows-as-code.
Description check ✅ Passed The description follows the template with Summary, Testing, Required Checks, Follow-up Tasks, and Reviewer Notes sections.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/activepieces-selfhost

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 786f2663c5

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +15 to +18
cd pmoves/activepieces
cp env.activepieces.example env.activepieces # then hydrate the SECRET values
# secrets (AP_ENCRYPTION_KEY, AP_JWT_SECRET, AP_POSTGRES_PASSWORD, AP_LICENSE_KEY)
# come from the PMOVES secrets pipeline — do NOT hand-write real values.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Ignore the populated ActivePieces environment file

Following this bring-up step creates pmoves/activepieces/env.activepieces and then places the encryption key, JWT secret, database password, and possibly license key in it, but that filename is not covered by either repository .gitignore (a repo-root git status reports it as untracked). Consequently, an ordinary git add pmoves/activepieces can commit all four secrets; rename it to an already-ignored .env.* form or explicitly ignore this runtime file.

AGENTS.md reference: AGENTS.md:L86-L90

Useful? React with 👍 / 👎.

Comment on lines +52 to +54
Add these to the secrets manifest and emit via `secrets-rotate`; the compose
reads them from `env.activepieces` (which the pipeline hydrates). See
`.claude/context/credentials-workflow.md`.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Materialize the env file before invoking Compose

On a fresh checkout, the documented secrets path cannot hydrate this file: the shipped CHIT manifest contains neither these AP_* labels nor an env.activepieces target, while secrets-rotate writes pmoves/env.shared and the manifest-declared tier files only. Thus the copied template retains commented-out required variables and Compose aborts at the ${AP_ENCRYPTION_KEY:?}, ${AP_JWT_SECRET:?}, and ${AP_POSTGRES_PASSWORD:?} guards unless the operator manually copies secrets, contrary to the instructions; add the manifest targets/generation step or consume an existing generated env file.

AGENTS.md reference: AGENTS.md:L92-L97

Useful? React with 👍 / 👎.

Comment on lines +27 to +28
ports:
- "${AP_BIND:-127.0.0.1}:${AP_APP_PORT:-8087}:80"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Select an unused default host port

When the normal PMOVES stack is running, the up target starts hi-rag-gateway-v2-gpu, whose host binding already defaults to 127.0.0.1:8087 in pmoves/docker-compose.yml; this new app claims the same address and port. As a result, whichever stack starts second cannot bind, so the documented ActivePieces companion cannot coexist with the core stack without an undocumented port override; choose a free registered default and keep AP_FRONTEND_URL aligned with it.

AGENTS.md reference: pmoves/AGENTS.md:L48-L48

Useful? React with 👍 / 👎.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@pmoves/activepieces/docker-compose.yml`:
- Line 109: Update the Redis server command in the docker-compose service to
enable append-only file persistence alongside the existing RDB snapshot
settings, preserving the current warning log level and standalone Redis
configuration.
- Around line 14-16: Update the ActivePieces service definitions in the Compose
file to assign the app and worker services to the workers profile, and
PostgreSQL and Redis to both data and workers profiles. Change the documented
startup command to include --profile workers so it brings up the intended full
stack while respecting profile scoping.

In `@pmoves/activepieces/env.activepieces.example`:
- Line 13: Set AP_EXECUTION_MODE to SANDBOX_CODE_ONLY in
pmoves/activepieces/env.activepieces.example:13 and update both compose fallback
values in pmoves/activepieces/docker-compose.yml:36 and :72 accordingly.
Document or enforce any production worker constraints required for compatibility
with sandboxed execution.

In `@pmoves/activepieces/README.md`:
- Line 9: Remove the cloud-account email from both committed documents: update
pmoves/activepieces/README.md lines 9-9 and pmoves/activepieces/flows/README.md
lines 4-4 to use the same non-identifying role alias or placeholder.
- Around line 8-10: Update the README’s Edition entry to identify the default
deployment as ActivePieces Community Edition, remove the claim that the entire
stack is MIT open-source, and note that setting AP_EDITION=ee enables Enterprise
features subject to ActivePieces commercial licensing.
- Around line 29-36: Update the Git Sync guidance in
pmoves/activepieces/README.md (lines 29-36) and
pmoves/activepieces/flows/README.md (lines 3-6) to describe the flows directory
as a repository artifact target, not a live mirror. Document the required
Environments setup, SSH repository and branch configuration, and explicit
Project Releases pushes for published flows; remove claims of continuous
push/pull or automatic two-way synchronization, keeping both files consistent.
- Around line 22-23: Update the Bring-up/UI documentation in README.md to add a
brief note explaining that AP_FRONTEND_URL must be set to the externally
reachable mesh/Tailscale frontend URL for SaaS trigger webhooks, while the local
UI remains bound to 127.0.0.1:8087 by default.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 08ba53a4-d295-480e-bbab-62bbe9f32365

📥 Commits

Reviewing files that changed from the base of the PR and between 26d7487 and 786f266.

📒 Files selected for processing (4)
  • pmoves/activepieces/README.md
  • pmoves/activepieces/docker-compose.yml
  • pmoves/activepieces/env.activepieces.example
  • pmoves/activepieces/flows/README.md

Comment on lines +14 to +16
# Bring up: docker compose --env-file env.activepieces -p pmoves-activepieces up -d
# (seed env.activepieces from env.activepieces.example first; generate the
# secret values via the PMOVES secrets pipeline, never by hand.)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== locate relevant docs/files =="
git ls-files | rg 'pmoves/(docs/(ROADMAP|NEXT_STEPS|LOCAL_CI_CHECKS)\.md|activepieces/docker-compose\.yml|.*\.example$)' || true

echo
echo "== docs guidance =="
for f in pmoves/docs/PMOVES.AI\ PLANS/ROADMAP.md pmoves/docs/NEXT_STEPS.md pmoves/docs/LOCAL_CI_CHECKS.md; do
  if [ -f "$f" ]; then
    echo "--- $f ---"
    sed -n '1,220p' "$f" | sed -n '/PROFILE\|Compose profile\|profile\|data\|workers\|activepieces/d;p' | head -80 || true
  fi
done

echo
echo "== compose file profile/usages =="
python3 - <<'PY'
from pathlib import Path
import re, yaml
p=Path('pmoves/activepieces/docker-compose.yml')
text=p.read_text()
print(text)
print('--- summary ---')
print('profiles lines:', [lineno for lineno,line in enumerate(text.splitlines(),1) if re.search(r'\bprofiles\s*:', line)])
print('data lines:', [lineno for lineno,line in enumerate(text.splitlines(),1) if re.search(r'\bdata\b', line)])
print('workers lines:', [lineno for lineno,line in enumerate(text.splitlines(),1) if re.search(r'\bworkers\b', line)])
try:
    dc=yaml.safe_load(text)
    for svc, cfg in dc.get('services',{}).items():
        print(f"{svc} profiles={cfg.get('profiles')}")
except Exception as e:
    print('yaml parse failed:', e)
PY

echo
echo "== references to data/profiles/activepieces compose =="
rg -n "profiles|data|workers|pmoves-activepieces|docker compose|compose --profile" pmoves -S || true

echo
echo "== Docker Compose profile dependency behavior docs snippet via local text only if present? =="
# No local docs maybe, but we need deterministic local verifier if Compose is available and repo is not run.
if command -v docker >/dev/null 2>&1 && docker compose version >/dev/null 2>&1; then
  tmp="$(mktemp -d)"
  cat > "$tmp/docker-compose.profile.yaml" <<'YML'
services:
  app:
    image: alpine
    profiles: ["workers"]
    depends_on:
      db:
        condition: service_healthy
  db:
    image: alpine
  workers:
    image: alpine
    profiles: ["workers"]
YML
  echo "docker compose --profile workers config --services:"
  docker compose -f "$tmp/docker-compose.profile.yaml" --profile workers config --services || true
  echo "docker compose --profile workers config includes dependencies?:"
  docker compose -f "$tmp/docker-compose.profile.yaml" --profile workers config --services --no-interpolate 2>&1 || true
  rm -rf "$tmp"
else
  echo "docker compose not available"
fi

Repository: POWERFULMOVES/PMOVES.AI

Length of output: 50380


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== target compose file =="
if [ -f pmoves/activepieces/docker-compose.yml ]; then
  cat -n pmoves/activepieces/docker-compose.yml
else
  echo "missing pmoves/activepieces/docker-compose.yml"
fi

echo
echo "== activepieces compose-specific references =="
rg -n "activepieces|pmoves-activepieces|\bprofiles:\b|data|workers" pmoves/activepieces pmoves/docs/LOCAL_CI_CHECKS.md pmoves/Makefile -S || true

echo
echo "== docker compose profile availability =="
if command -v docker >/dev/null 2>&1; then
  docker compose version 2>&1 || true
  tmp="$(mktemp -d)"
  cat > "$tmp/docker-compose.profile.yaml" <<'YML'
services:
  app:
    image: alpine:3.21
    profiles: ["workers"]
    depends_on:
      db:
        condition: service_healthy
  db:
    image: alpine:3.21
  workers-only:
    image: alpine:3.21
    profiles: ["workers"]
YML
  echo "docker compose --profile workers config services:"
  docker compose -f "$tmp/docker-compose.profile.yaml" --profile workers config --services || true
  echo "docker compose config (no profile) services containing profile constraints:"
  docker compose -f "$tmp/docker-compose.profile.yaml" config --services || true
  rm -rf "$tmp"
else
  echo "docker not available"
fi

echo
echo "== relevant code guideline snippets =="
sed -n '1,80p' pmoves/docs/LOCAL_CI_CHECKS.md 2>/dev/null || true
sed -n '1,80p' pmoves/Makefile 2>/dev/null || true

Repository: POWERFULMOVES/PMOVES.AI

Length of output: 33080


🌐 Web query:

Docker Compose profiles enabled profile dependencies depend on services not matching profiles documentation

💡 Result:

In Docker Compose, services assigned a profiles attribute are only enabled when that specific profile is active [1][2]. When you use depends_on to link services, Docker Compose does not automatically enable or pull in dependency services if they are gated behind a profile that is not currently enabled [1][3]. Key points regarding this behavior include: Dependency Validation: If a service depends on another service, and that dependency is assigned a profile, the dependency must be enabled either by explicitly activating its profile (via --profile or COMPOSE_PROFILES) or by ensuring the dependency is "always enabled" (i.e., it has no profiles attribute) [1][4][5]. If a dependency is missing or its profile is not active, Docker Compose will return an error stating that the service is not enabled [1][6][3]. Targeting Services Directly: When you explicitly run a specific service on the command line (e.g., docker compose up <service_name>), Docker Compose automatically enables that service's profiles and pulls in its direct dependencies [1][4]. However, this "auto-enabling" behavior is limited; it does not recursively resolve or enable profiles for nested dependencies [6][7]. If a service depends on another service, and that second service depends on a third, all services in that chain must either share a profile, be profile-free, or have their profiles explicitly enabled to avoid errors [6][7]. Best Practices: To maintain a stable configuration, it is generally recommended to keep core infrastructure dependencies (like databases or shared networks) profile-free so they are always enabled [2][8]. For optional features or debugging tools, ensure that all services within a dependency chain share the same profile, or explicitly activate the necessary profiles in your environment variables or command-line arguments [6][4][5]. For further details, refer to the official Docker documentation on service profiles and dependency resolution [1][2].

Citations:


Wire this ActivePieces stack to Compose profiles.

The documented startup still starts every service, so add profiles to the ActivePieces stack—e.g. workers for app/worker and both data + workers for PostgreSQL/Redis—and invoke the full stack with --profile workers so the documented command respects the scoping guideline.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pmoves/activepieces/docker-compose.yml` around lines 14 - 16, Update the
ActivePieces service definitions in the Compose file to assign the app and
worker services to the workers profile, and PostgreSQL and Redis to both data
and workers profiles. Change the documented startup command to include --profile
workers so it brings up the intended full stack while respecting profile
scoping.

Source: Coding guidelines

activepieces-redis:
image: redis:7.0.7
restart: unless-stopped
command: ["redis-server", "--save", "60", "1", "--loglevel", "warning"]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== target file excerpt =="
sed -n '90,120p' pmoves/activepieces/docker-compose.yml || true

echo
echo "== related env/queue config searches =="
rg -n "AP_QUEUE_MODE|QUEUE_MODE|REDIS|redis|appendonly|appendfsync|--save" pmoves/activepieces -S || true

echo
echo "== roadmap/next steps/README/docs references if any =="
for f in pmoves/docs/PMOVES.AI PLANS/ROADMAP.md pm_moves/docs/NEXT_STEPS.md pmoves/docs/LOCAL_CI_CHECKS.md 2>/dev/null; do
  : # placeholder
done
for f in docs/PMOVES.AI\ PLANS/ROADMAP.md docs/NEXT_STEPS.md docs/LOCAL_CI_CHECKS.md 2>/dev/null; do
  if [ -f "$f" ]; then echo "-- $f --"; sed -n '1,80p' "$f"; fi
done
if [ -f "pmoves/docs/PMOVES.AI PLANS/ROADMAP.md" ]; then echo "-- ROADMAP excerpt --"; sed -n '1,120p' "pmoves/docs/PMOVES.AI PLANS/ROADMAP.md"; fi
if [ -f "pmoves/docs/NEXT_STEPS.md" ]; then echo "-- NEXT_STEPS excerpt --"; sed -n '1,120p' "pmoves/docs/NEXT_STEPS.md"; fi

Repository: POWERFULMOVES/PMOVES.AI

Length of output: 2580


🌐 Web query:

ActivePieces AP_QUEUE_MODE REDIS redis durable queue documentation

💡 Result:

The environment variable AP_QUEUE_MODE is deprecated and has been replaced by AP_REDIS_TYPE [1][2]. You should no longer use AP_QUEUE_MODE to configure Redis settings [1][2]. To configure Redis as your durable queue, you should use the following approach documented in the current Activepieces configuration references [3][4]: 1. Use AP_REDIS_TYPE: Set this variable to define the type of Redis deployment. Supported values typically include MEMORY (for in-process/non-durable), STANDALONE (default), or SENTINEL [3]. 2. Configure Connection Details: Provide the connection information using AP_REDIS_URL (which overrides other settings) or by specifying individual variables such as AP_REDIS_HOST, AP_REDIS_PORT, AP_REDIS_USER, and AP_REDIS_PASSWORD [3]. 3. Ensure Durability: Activepieces relies on BullMQ via Redis to manage its job queue [3][5]. Because jobs are queued in Redis, its durability depends on your configuration [6][7]. To prevent job loss: - Use a managed Redis service or ensure your self-hosted Redis instance has persistence enabled (e.g., AOF with everysec) [6][7]. - Note that while Postgres handles long-term state (flow definitions, run logs), Redis acts as the transient queue [5][6]. If Redis loses its dataset, queued jobs that have not yet been picked up by a worker may be lost [7]. For further details, refer to the official Activepieces environment variables reference [3].

Citations:


Enable append-only persistence for the Redis queue.

With AP_QUEUE_MODE=REDIS, ActivePieces stores workflow jobs in Redis. The current --save 60 1 only creates periodic RDB snapshots, so queued jobs added after the last snapshot can be lost on an unclean restart. Add AOF persistence for the standalone Redis stack.

Proposed durability fix
-    command: ["redis-server", "--save", "60", "1", "--loglevel", "warning"]
+    command:
+      ["redis-server", "--appendonly", "yes", "--appendfsync", "everysec",
+       "--save", "60", "1", "--loglevel", "warning"]
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
command: ["redis-server", "--save", "60", "1", "--loglevel", "warning"]
command:
["redis-server", "--appendonly", "yes", "--appendfsync", "everysec",
"--save", "60", "1", "--loglevel", "warning"]
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pmoves/activepieces/docker-compose.yml` at line 109, Update the Redis server
command in the docker-compose service to enable append-only file persistence
alongside the existing RDB snapshot settings, preserving the current warning log
level and standalone Redis configuration.

AP_BIND=127.0.0.1
AP_APP_PORT=8087
AP_FRONTEND_URL=http://localhost:8087
AP_EXECUTION_MODE=UNSANDBOXED

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Candidate files =="
fd -a '^(ROADMAP|NEXT_STEPS|LOCAL_CI_CHECKS|STARTER_PR_BODY|docker-compose|env\.activepieces\.example)\.md$|^docker-compose\.yml$|^env\.activepieces\.example$' . | sed 's#^\./##'

echo
echo "== ActivePieces files =="
fd -a '^(docker-compose\.yml|env\.activepieces\.example)$' . | sed 's#^\./##'

echo
echo "== env.activepieces.example =="
if [ -f pmoves/activepieces/env.activepieces.example ]; then
  cat -n pmoves/activepieces/env.activepieces.example
fi

echo
echo "== relevant docker-compose sections =="
if [ -f pmoves/activepieces/docker-compose.yml ]; then
  nl -ba pmoves/activepieces/docker-compose.yml | sed -n '1,110p'
fi

echo
echo "== references to AP_EXECUTION_MODE and sandbox =="
rg -n "AP_EXECUTION_MODE|UNSANDBOXED|SANDBOX_CODE_ONLY|sandbox" pmoves/activepieces README.md .github docs 2>/dev/null || true

echo
echo "== activepieces docs links around execution mode? =="
rg -n "AP_EXECUTION_MODE|SANDBOX_CODE_ONLY|UNSANDBOXED" README.md pmoves 2>/dev/null || true

Repository: POWERFULMOVES/PMOVES.AI

Length of output: 3212


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== docker-compose relevant sections =="
awk '{printf "%6d\t%s\n", NR, $0}' pmoves/activepieces/docker-compose.yml | sed -n '1,110p'

echo
echo "== roadmap/next steps activepieces references =="
for f in pmoves/docs/PMOVES.AI\ PLANS/ROADMAP.md pmoves/docs/NEXT_STEPS.md pmoves/docs/ROADMAP.md pmoves/docs/LOCAL_CI_CHECKS.md pmoves/activepieces/README.md; do
  if [ -f "$f" ]; then
    echo "-- $f --"
    rg -n "activepieces|ActivePieces|AP_EXECUTION_MODE|SANDBOX_CODE_ONLY|UNSANDBOXED|local ci|pr testing|PR Testing" "$f" || true
  fi
done

echo
echo "== all repository references =="
rg -n "AP_EXECUTION_MODE|UNSANDBOXED|SANDBOX_CODE_ONLY|activepieces" .

Repository: POWERFULMOVES/PMOVES.AI

Length of output: 12083


🌐 Web query:

ActivePieces deployment AP_EXECUTION_MODE SANDBOX_CODE_ONLY UN-sanboxed environment variables

💡 Result:

In Activepieces, AP_EXECUTION_MODE controls the sandboxing strategy for user-defined code (such as Code steps or piece actions) [1][2]. When you set AP_EXECUTION_MODE to SANDBOX_CODE_ONLY, Activepieces uses V8 isolation (specifically isolated-vm) to secure code execution [1]. This mode is designed for enterprise and multi-tenant environments because it allows the code to run within an unprivileged container, meaning it does not require privileged Docker or Kubernetes capabilities (like CAP_SYS_ADMIN) [1][3]. In this mode, each Code step is wrapped in a fresh V8 context that restricts access to require, the filesystem, and npm modules, providing a secure, lightweight, and fast execution environment [1][3]. For a production deployment using SANDBOX_CODE_ONLY, the recommended configuration typically includes [4][5]: - AP_EXECUTION_MODE=SANDBOX_CODE_ONLY - AP_WORKER_CONCURRENCY=1 (This ensures that only one flow executes per worker, providing stronger isolation of the container's filesystem and memory) [4][6]. - AP_REUSE_SANDBOX=true (This allows sandboxes to remain warm across jobs for improved performance) [1][4]. Note that SANDBOX_CODE_ONLY is not compatible with certain setups, such as Worker Groups, where SANDBOX_PROCESS is required instead [4][5]. If you need to expose specific environment variables to the sandboxed code, you can use the AP_SANDBOX_PROPAGATED_ENV_VARS variable, though it is generally recommended to include configuration within authentication objects for better instance-to-instance consistency [2][7].

Citations:


🌐 Web query:

ActivePieces AP_EXECUTION_MODE default UNSANDBOXED documentation

💡 Result:

In Activepieces, AP_EXECUTION_MODE is an environment variable that determines the sandbox strategy used for executing flow code [1][2]. The default value for this variable is UNSANDBOXED [2][3]. When AP_EXECUTION_MODE is set to UNSANDBOXED: - Security: This mode is not secure for multi-tenant deployments because it does not provide isolation between flows [4]. - Performance: It is fast and lightweight, as it avoids the overhead of kernel-level or V8-based sandboxing [4]. - Functionality: It supports the use of NPM packages in Code pieces [4]. - Requirements: It does not require the Docker container to be privileged [4]. Because UNSANDBOXED mode lacks isolation, the documentation strongly recommends using other modes (such as SANDBOX_CODE_ONLY for V8 isolation or SANDBOX_PROCESS for kernel-level isolation) in production environments to ensure flows cannot access each other's memory, files, or environment [1][5]. The choice of execution mode is considered the most important security decision for self-hosted, multi-tenant Activepieces deployments [1][6].

Citations:


Use sandboxed execution as the ActivePieces default. env.activepieces.example, activepieces-app, and activepieces-worker all fall back to UNSANDBOXED, so copied/local environments can run user flow code without ActivePieces’ V8/process isolation. Set the template and both compose fallbacks to SANDBOX_CODE_ONLY, and document/ensure any production worker constraints compatible with that mode.

📍 Affects 2 files
  • pmoves/activepieces/env.activepieces.example#L13-L13 (this comment)
  • pmoves/activepieces/docker-compose.yml#L36-L36
  • pmoves/activepieces/docker-compose.yml#L72-L72
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pmoves/activepieces/env.activepieces.example` at line 13, Set
AP_EXECUTION_MODE to SANDBOX_CODE_ONLY in
pmoves/activepieces/env.activepieces.example:13 and update both compose fallback
values in pmoves/activepieces/docker-compose.yml:36 and :72 accordingly.
Document or enforce any production worker constraints required for compatibility
with sandboxed execution.

Comment on lines +8 to +10
- **Edition:** MIT open-source, self-hosted (`ghcr.io/activepieces/activepieces:0.86.3`).
- **Hosted account:** `cataclysmstudios@gmail.com` on ActivePieces Cloud.
- **Phase 1 (this):** standalone self-host. **Phase 2 (tracked):** integrate as a first-class service in the main fleet `docker-compose.yml`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf 'Repo files matching README.md:\n'
git ls-files | grep '\.md$' | rg 'activepieces|README' || true

printf '\nTarget README excerpt:\n'
if [ -f pmoves/activepieces/README.md ]; then
  nl -ba pmoves/activepieces/README.md | sed -n '1,80p'
else
  echo 'pmoves/activepieces/README.md not found'
fi

printf '\nSearch for ActivePieces AP_EDITION mentions:\n'
rg -n "AP_EDITION|activepieces|Git Sync|GitSync|activepieces/activepieces" -S . || true

Repository: POWERFULMOVES/PMOVES.AI

Length of output: 9607


🌐 Web query:

ActivePieces 0.86.3 license edition EE AP_EDITION community MIT

💡 Result:

Activepieces uses an open-core business model where the software is released under two distinct licenses based on the edition [1][2][3]. As of version 0.86.3, the licensing structure remains consistent with this model [1][4][5]: Community Edition (CE) The core functionality of Activepieces is released under the permissive MIT License [1][2][6]. This edition is open source and intended for users who self-host and do not require enterprise-specific administrative or security features [1][3][7]. Enterprise Edition (EE) Features located within the packages/ee and packages/server/api/src/app/ee directories are released under a proprietary Commercial License [1][8][9]. Using these enterprise features on a self-hosted instance requires a valid Activepieces Enterprise license [1][2][3]. These features are gated by "plan flags" managed via a license key system [10][2]. In summary, while the core Activepieces codebase is MIT-licensed, the enterprise-specific modules are proprietary and require a commercial subscription [1][3][7]. GitHub may report the overall repository license as "Other" because the repository contains both the MIT-licensed core and the commercially licensed enterprise packages [3].

Citations:


🌐 Web query:

ActivePieces AP_EDITION ee 0.86.3 license MIT

💡 Result:

ActivePieces uses a dual-licensing model and is not exclusively licensed under MIT [1][2]. The software repository is structured to differentiate between core functionality and enterprise features, governed by distinct license terms [3][1]: 1. Community Edition (CE): Code residing outside the 'packages/ee/' and 'packages/server/api/src/app/ee' directories is licensed under the MIT License [3]. This includes the core automation engine and standard community pieces [1][2]. 2. Enterprise Edition (EE): All content within 'packages/ee/' and 'packages/server/api/src/app/ee' is subject to a Commercial License, not the MIT License [3][1]. Use of these enterprise features in a self-hosted production environment requires a valid commercial license key [1][4][5]. The 'AP_EDITION' environment variable is used to determine which modules are loaded at runtime [2]. When set to 'ee', the application enables enterprise-specific features that require license validation [4][2]. As of version 0.86.3, the repository continues to maintain this separation, where the core remains MIT-licensed while enterprise-specific components remain under the commercial license [3][6][5].

Citations:


Clarify ActivePieces edition licensing.

Label the README as Community Edition by default and note that enabling AP_EDITION=ee uses Enterprise features governed by ActivePieces commercial licensing. Calling the stack “MIT open-source” conflicts with the optional EE path.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pmoves/activepieces/README.md` around lines 8 - 10, Update the README’s
Edition entry to identify the default deployment as ActivePieces Community
Edition, remove the claim that the entire stack is MIT open-source, and note
that setting AP_EDITION=ee enables Enterprise features subject to ActivePieces
commercial licensing.

[`flows/`](flows/) — the same convention as the 34 n8n flows.

- **Edition:** MIT open-source, self-hosted (`ghcr.io/activepieces/activepieces:0.86.3`).
- **Hosted account:** `cataclysmstudios@gmail.com` on ActivePieces Cloud.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win

Remove the cloud-account email from both committed documents.

  • pmoves/activepieces/README.md#L9-L9: replace the email with a role alias or placeholder.
  • pmoves/activepieces/flows/README.md#L4-L4: replace the repeated email with the same non-identifying label.
📍 Affects 2 files
  • pmoves/activepieces/README.md#L9-L9 (this comment)
  • pmoves/activepieces/flows/README.md#L4-L4
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pmoves/activepieces/README.md` at line 9, Remove the cloud-account email from
both committed documents: update pmoves/activepieces/README.md lines 9-9 and
pmoves/activepieces/flows/README.md lines 4-4 to use the same non-identifying
role alias or placeholder.

Comment on lines +22 to +23
UI: <http://localhost:8087> (bound to `127.0.0.1` by default — front it with the
mesh/Tailscale rather than publishing to the LAN, per the privacy-mesh rule).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== files =="
git ls-files | rg '(^pmoves/activepieces/README\.md$|pmoves/activepieces/docker-compose\.yml$|docs/ROADMAP\.md$|docs/NEXT_STEPS\.md$|\.claude/context/nats-subjects\.md$|\.claude/context/services-catalog\.md$)' || true

echo
echo "== README relevant =="
if [ -f pmoves/activepieces/README.md ]; then
  nl -ba pmoves/activepieces/README.md | sed -n '1,80p'
fi

echo
echo "== compose relevant =="
if [ -f pmoves/activepieces/docker-compose.yml ]; then
  nl -ba pmoves/activepieces/docker-compose.yml | sed -n '1,90p'
fi

echo
echo "== references to AP_FRONTEND_URL/frontends/webhooks in activepieces =="
rg -n "AP_FRONTEND_URL|FRONTEND_URL|webhook|localhost:8087|activepieces|8087" pmoves/activepieces README.md docs .claude 2>/dev/null || true

Repository: POWERFULMOVES/PMOVES.AI

Length of output: 507


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== README relevant =="
if [ -f pmoves/activepieces/README.md ]; then
  sed -n '1,120p' pmoves/activepieces/README.md
fi

echo
echo "== compose relevant =="
if [ -f pmoves/activepieces/docker-compose.yml ]; then
  sed -n '1,120p' pmoves/activepieces/docker-compose.yml
fi

echo
echo "== references to AP_FRONTEND_URL/frontends/webhooks in activepieces =="
python3 - <<'PY'
import pathlib, re
for p in ["pmoves/activepieces/README.md","pmoves/activepieces/docker-compose.yml","pmoves/docs/NEXT_STEPS.md","pmoves/docs/ROADMAP.md",".claude/context/services-catalog.md",".claude/context/nats-subjects.md"]:
    try:
        text=pathlib.Path(p).read_text()
    except Exception as e:
        print(f"{p}: cannot read ({e})")
        continue
    hits=[(i+1,line) for i,line in enumerate(text.splitlines()) if re.search(r'AP_FRONTEND_URL|FRONTEND_URL|webhook|localhost:8087|127\.0\.0\.1:8087|activepieces|8087',line,re.I)]
    if hits:
        print(f"--- {p} ---")
        for line_no,line in hits:
            print(f"{line_no}: {line}")
PY

Repository: POWERFULMOVES/PMOVES.AI

Length of output: 13824


🌐 Web query:

ActivePieces AP_FRONTEND_URL Docker Compose frontend URL webhook localhost documentation

💡 Result:

In ActivePieces, the AP_FRONTEND_URL environment variable is the critical setting that defines the public-facing URL of your instance [1][2]. This URL is used by the system to generate webhook endpoints and redirect URLs, meaning it must be accessible by third-party services for triggers and webhooks to function correctly [1][3][2]. When using Docker Compose on a local machine (localhost), the default configuration often fails to receive external webhooks because the service is not reachable from the internet [4][5]. To resolve this, you must set AP_FRONTEND_URL to a public address that points to your instance [1][6]. For local development or testing, you can use a tunneling service such as ngrok to expose your local service to the internet [4][6]. The typical process is: 1. Use ngrok to tunnel to your ActivePieces service port (typically 8080) [4][5]: ngrok http 8080 2. Copy the resulting public URL (e.g., https://your-tunnel-id.ngrok-free.app) provided by ngrok [4][6]. 3. Update your.env file or environment configuration for the ActivePieces service to set this URL [4][6]: AP_FRONTEND_URL=https://your-tunnel-id.ngrok-free.app After updating the variable, ensure your Docker Compose services are restarted to apply the changes [4][6]. In a production environment, you should replace this with your actual domain name (e.g., https://activepieces.yourdomain.com) [3][7].

Citations:


Document the externally reachable AP_FRONTEND_URL for webhooks.

docker-compose.yml defaults both app and worker to ${AP_FRONTEND_URL:-http://localhost:8087}, but SaaS trigger webhooks need an ingress URL reachable by external callers. Add a short note under Bring-up/UI to set AP_FRONTEND_URL to the mesh/Tailscale frontend URL and distinguish it from the local 127.0.0.1:8087 bind.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pmoves/activepieces/README.md` around lines 22 - 23, Update the Bring-up/UI
documentation in README.md to add a brief note explaining that AP_FRONTEND_URL
must be set to the externally reachable mesh/Tailscale frontend URL for SaaS
trigger webhooks, while the local UI remains bound to 127.0.0.1:8087 by default.

Comment on lines +29 to +36
Git Sync makes flows version-controlled and shared between the Cloud project and
this self-host — both point at `pmoves/activepieces/flows/`. **Git Sync is an
ActivePieces Enterprise feature** (set `AP_EDITION=ee` + `AP_LICENSE_KEY`).

**If your Cloud plan includes Git Sync:**
1. Cloud → Project Settings → **Git Sync** → connect this repo, branch, folder `pmoves/activepieces/flows`.
2. Self-host: set `AP_EDITION=ee` + `AP_LICENSE_KEY` in `env.activepieces`, then in its Project Settings → Git Sync → same repo/branch/folder.
3. Push/pull flows through git; both environments stay in sync and the flows are represented in the repo (and on the LinkedIn profile).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf 'Repository files matching activepieces READMEs:\n'
git ls-files | rg '(^|/)activepieces/README\.md$|(^|/)flows/README\.md$' || true

printf '\nActivePieces README sections:\n'
for f in pmoves/activepieces/README.md pmoves/activepieces/flows/README.md; do
  if [ -f "$f" ]; then
    echo "--- ${f} ---"
    nl -ba "$f" | sed -n '1,80p'
  else
    echo "missing: $f"
  fi
done

printf '\nSearch for Git Sync / project releases wording elsewhere:\n'
rg -n "Git Sync|project releases|Project Releases|Git artifact|flows-as-code|Mirrors pmoves" -S .

Repository: POWERFULMOVES/PMOVES.AI

Length of output: 385


🌐 Web query:

ActivePieces Git Sync documentation project releases repository push to repository

💡 Result:

Activepieces provides a Git Sync feature that allows users to manage version control for their projects, including flows, connections, and tables [1][2]. This functionality is part of the Project Releases system and requires the Environments feature to be enabled on your instance plan [1][3]. Key aspects of Git Sync and pushing to a repository include: Prerequisites - Feature Access: You must have the Environments feature enabled for your project [1][3]. Contact your instance administrator if this option is unavailable in Project Settings [1][3]. - Configuration: Before syncing, you must connect a Git repository. This involves configuring the remote URL (SSH format), branch, and providing an SSH private key [1][4][3]. Pushing to Repository Activepieces allows you to push content from your project to the connected Git repository using two primary methods: 1. Push Everything: You can push all published flows, connections, and tables at once. - Navigate to the releases page and click the Push Everything button [1][3][5]. - Provide a descriptive commit message to explain the changes [1][5]. - Confirm by clicking the Push button to send all published items to the repository [1][3]. 2. Pushing Individual Flows or Tables: It is also possible to push specific items without performing a bulk push. - Select the specific flows or tables you wish to push [5]. - Click the Push to Git option [6][5]. - Enter a commit message and confirm the action to send the selected items to your repository [6][5]. Note: Only published flows can be pushed to a Git repository [1][3][5]. For troubleshooting, ensure your SSH private key is correctly formatted and that the remote URL uses the SSH protocol [1][3].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

for f in pmoves/activepieces/README.md pmoves/activepieces/flows/README.md; do
  if [ -f "$f" ]; then
    echo "--- ${f} ---"
    awk '{printf "%7d\t%s\n", NR, $0}' "$f" | sed -n '1,80p'
  else
    echo "missing: $f"
  fi
done

printf '\nSearch for Git Sync / project releases wording elsewhere:\n'
rg -n "Git Sync|project releases|Project Releases|Git artifact|flows-as-code|Mirrors pmoves" -S . || true

Repository: POWERFULMOVES/PMOVES.AI

Length of output: 6432


Document Git Sync as Project Releases push behavior, not a live mirror.

Both files imply continuous push/pull or automatic “Mirrors pmoves/n8n/flows/” synchronization. ActivePieces Git Sync requires Environments, repository connection with SSH/branch selection, and explicit pushes only for published flows via project releases, not automatic two-way flow sync. Update pmoves/activepieces/README.md and pmoves/activepieces/flows/README.md to describe this repository artifact target and release-based workflow consistently.

📍 Affects 2 files
  • pmoves/activepieces/README.md#L29-L36 (this comment)
  • pmoves/activepieces/flows/README.md#L3-L6
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pmoves/activepieces/README.md` around lines 29 - 36, Update the Git Sync
guidance in pmoves/activepieces/README.md (lines 29-36) and
pmoves/activepieces/flows/README.md (lines 3-6) to describe the flows directory
as a repository artifact target, not a live mirror. Document the required
Environments setup, SSH repository and branch configuration, and explicit
Project Releases pushes for published flows; remove claims of continuous
push/pull or automatic two-way synchronization, keeping both files consistent.

@POWERFULMOVES
POWERFULMOVES merged commit f9b5961 into main Jul 26, 2026
41 checks passed
@POWERFULMOVES
POWERFULMOVES deleted the feat/activepieces-selfhost branch July 26, 2026 11:09
POWERFULMOVES added a commit that referenced this pull request Jul 26, 2026
…cker compose) (#2235)

Follow-up to #2233. The README documented raw 'docker compose up' for the
standalone ActivePieces stack, which bypasses the make-target/env-injection
convention and trips the pipeline guard. Fix:

- Makefile: add up-activepieces / down-activepieces / activepieces-health
  wrapping the standalone compose (own --env-file env.activepieces, project
  pmoves-activepieces) with a missing-env guard. Bring-up now goes through the
  Known Road, not raw docker.
- README: replace raw docker commands with 'make -C pmoves up-activepieces' etc.
- .gitignore: ignore pmoves/activepieces/env.activepieces so the instance
  secrets (self-managed openssl keys, seeded from .example) never land in the repo.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant