Activepieces is an open-source, no-code business automation platform including a visual flow builder for connecting apps and automating repetitive tasks (lead management, marketing automation, internal ops). This guide deploys it via Docker Compose with PostgreSQL, Redis, and Traefik-managed TLS, then builds and tests a webhook-triggered flow.
Prerequisites: a Linux server (2 vCPU / 4GB RAM minimum), Docker + Docker Compose, a domain A record (e.g.
active.example.com).
Set Up the Project
$ mkdir -p ~/activepieces/{cache,letsencrypt,postgres,redis}
$ cd ~/activepieces
-
cache— cached pieces + execution data -
letsencrypt— TLS certs -
postgres/redis— persistent DB/queue data
Generate keys:
$ openssl rand -hex 16
$ openssl rand -hex 32
Environment file:
$ nano .env
DOMAIN=active.example.com
LETSENCRYPT_EMAIL=admin@example.com
AP_ENVIRONMENT=prod
AP_FRONTEND_URL=https://active.example.com
AP_ENCRYPTION_KEY=PASTE_YOUR_32_CHARACTER_STRING_HERE
AP_JWT_SECRET=PASTE_YOUR_64_CHARACTER_STRING_HERE
AP_POSTGRES_DATABASE=activepieces
AP_POSTGRES_USERNAME=postgres
AP_POSTGRES_PASSWORD=CREATE_A_STRONG_PASSWORD_HERE
AP_POSTGRES_HOST=postgres
AP_POSTGRES_PORT=5432
AP_REDIS_HOST=redis
AP_REDIS_PORT=6379
Replace domain, email, the two generated keys (16-char → AP_ENCRYPTION_KEY, 32-char → AP_JWT_SECRET), and the DB password. AP_POSTGRES_HOST/AP_REDIS_HOST match the Compose service names below so containers can reach each other.
Deploy with Docker Compose
$ nano docker-compose.yml
services:
traefik:
image: "traefik:v3.7.0"
container_name: "traefik"
restart: unless-stopped
command:
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.web.http.redirections.entrypoint.to=websecure"
- "--entrypoints.web.http.redirections.entrypoint.scheme=https"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.myresolver.acme.tlschallenge=true"
- "--certificatesresolvers.myresolver.acme.email=${LETSENCRYPT_EMAIL}"
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
volumes:
- "./letsencrypt:/letsencrypt"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
networks:
activepieces:
aliases:
- "${DOMAIN}"
app:
image: ghcr.io/activepieces/activepieces:0.83.0
container_name: activepieces-app
restart: unless-stopped
depends_on:
- postgres
- redis
env_file: .env
environment:
- AP_CONTAINER_TYPE=WORKER_AND_APP
volumes:
- ./cache:/usr/src/app/cache
labels:
- "traefik.enable=true"
- "traefik.http.routers.activepieces.rule=Host(`${DOMAIN}`)"
- "traefik.http.routers.activepieces.entrypoints=websecure"
- "traefik.http.routers.activepieces.tls.certresolver=myresolver"
- "traefik.http.services.activepieces.loadbalancer.server.port=80"
networks:
- activepieces
postgres:
image: 'pgvector/pgvector:0.8.0-pg14'
container_name: postgres
restart: unless-stopped
env_file: .env
environment:
- 'POSTGRES_DB=${AP_POSTGRES_DATABASE}'
- 'POSTGRES_PASSWORD=${AP_POSTGRES_PASSWORD}'
- 'POSTGRES_USER=${AP_POSTGRES_USERNAME}'
volumes:
- ./postgres:/var/lib/postgresql/data
networks:
- activepieces
redis:
image: 'redis:7.2'
container_name: redis
restart: unless-stopped
volumes:
- './redis:/data'
networks:
- activepieces
networks:
activepieces:
postgres uses the pgvector extension for workflow/user/execution data; redis runs the job queue; app is the web UI + API. The aliases entry on traefik resolves DOMAIN to Traefik's internal address — without it, requests from app back to its own public URL fail, since most cloud networks don't route a server's public IP back to itself.
$ docker compose up -d
$ docker compose ps
$ docker compose logs app
Look for a line confirming the app bound to your configured domain.
First-Run Setup
Visit https://active.example.com (padlock confirms Traefik got a cert):
- Sign up — first name, last name, email, password.
- Set a Platform Name (e.g.
My Automation Platform) to create your workspace.
Build a Test Flow
1. Start from scratch under Build a Flow.
2. Trigger: search Webhook, pick Catch Webhook → Test Trigger → Generate Sample Data → Send in the dialog. Confirm Tested Successfully with a captured request under Result #1.
3. Action: + below the trigger → Sub Flows → Return Response. Set Response Type to JSON, body:
{
"message": "Workflow executed successfully"
}
4. Publish, then Test Flow. Hover the Catch Webhook block, click trigger to simulate an incoming request. Both steps should show Succeeded with execution times.
Next Steps
Activepieces is running with persistent PostgreSQL/Redis and automatic HTTPS. From here:
- Connect real app integrations instead of the test webhook
- Build custom pieces for internal tools not covered by the built-in connectors
- Invite team members and set up shared workflow permissions
For the full guide, visit the original article on Vultr Docs.
Top comments (0)