DEV Community

Cover image for Deploying Activepieces – Open-Source Business Automation Platform
Sanskriti Harmukh for Vultr

Posted on with Aashish Chaurasiya • Originally published at docs.vultr.com

Deploying Activepieces – Open-Source Business Automation Platform

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
Enter fullscreen mode Exit fullscreen mode
  • cache — cached pieces + execution data
  • letsencrypt — TLS certs
  • postgres / redis — persistent DB/queue data

Generate keys:

$ openssl rand -hex 16
$ openssl rand -hex 32
Enter fullscreen mode Exit fullscreen mode

Environment file:

$ nano .env
Enter fullscreen mode Exit fullscreen mode
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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode
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:
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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):

  1. Sign up — first name, last name, email, password.
  2. 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 WebhookTest TriggerGenerate Sample DataSend in the dialog. Confirm Tested Successfully with a captured request under Result #1.

3. Action: + below the trigger → Sub FlowsReturn Response. Set Response Type to JSON, body:

{
  "message": "Workflow executed successfully"
}
Enter fullscreen mode Exit fullscreen mode

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)