Activepieces Docker 설치 가이드: 오픈소스 Zapier 대안 노코드 자동화 플랫폼




Activepieces는 Zapier와 Make의 오픈소스 대안으로, 노코드 방식으로 다양한 앱과 서비스를 연결하여 워크플로우를 자동화할 수 있는 플랫폼입니다. Y Combinator 출신 스타트업이 개발했으며, MIT 라이선스로 완전한 오픈소스이면서도 직관적인 UI로 비개발자도 쉽게 사용할 수 있습니다. 이 가이드에서는 Docker를 활용하여 Activepieces를 셀프호스팅하는 다양한 방법을 소개합니다.

Activepieces란?

Activepieces는 2022년 Y Combinator에서 시작된 오픈소스 비즈니스 자동화 플랫폼입니다. Zapier, Make(Integromat)와 같은 상용 자동화 도구의 셀프호스팅 대안으로, GitHub에서 20,000개 이상의 스타를 받으며 빠르게 성장하고 있습니다.

왜 Activepieces인가?

특징ActivepiecesZapiern8n
라이선스MIT (완전 오픈소스)상용Fair Code (제한적)
셀프호스팅✅ 무제한✅ 제한 있음
가격무료 (셀프호스팅)$19.99+/월Fair Code 제한
UI 난이도쉬움 (G2: 9.1)쉬움어려움 (G2: 7.7)
통합 수330+ Pieces8,000+400+
AI 네이티브✅ Agent Builder제한적플러그인

주요 기능

💖 직관적인 노코드 빌더

  • 드래그 앤 드롭 방식의 워크플로우 빌더
  • 비개발자도 쉽게 사용 가능한 스텝 기반 인터페이스
  • 실시간 테스트 및 디버깅 지원

🔌 330+ 통합(Pieces)

  • Google Workspace, Slack, Discord, OpenAI 등 주요 서비스 지원
  • HubSpot, Salesforce, Stripe 등 비즈니스 앱 연동
  • 60% 이상이 커뮤니티 기여로 지속 확장 중

🤖 AI-First 설계

  • OpenAI, Claude, Gemini 등 LLM 네이티브 통합
  • AI Agent Builder로 자율 워크플로우 구축
  • MCP(Model Context Protocol) 지원으로 Claude Desktop, Cursor 연동

🏢 엔터프라이즈 기능

  • 팀 협업 및 역할 기반 접근 제어
  • 플로우 버전 관리
  • 화이트라벨 옵션 (SaaS 임베딩)

💡 Human in the Loop

  • 승인 대기 및 지연 실행
  • 폼 인터페이스와 채팅 인터페이스 지원
  • 자동 재시도 및 롤백

n8n vs Activepieces 비교

항목Activepiecesn8n
학습 곡선낮음 (초보자 친화적)높음 (개발자 중심)
UI/UX스텝 기반, 깔끔함노드 기반, 복잡함
라이선스MIT (제한 없음)Fair Code (상업적 제한)
설치 용이성Docker 몇 줄로 완료추가 설정 필요
성능일반 워크플로우 적합대용량 처리 우수
클라우드 가격$1/1000 태스크€20+/월 (실행 제한)
커뮤니티빠르게 성장 (14K+ stars)성숙함 (100K+ stars)

선택 가이드:

  • Activepieces: 비개발자, 빠른 시작, 비용 효율성 중시
  • n8n: 개발자, 복잡한 로직, 대규모 처리 필요

사전 요구사항

  • Docker 및 Docker Compose 설치
  • 최소 2GB RAM (권장 4GB)
  • 도메인 및 SSL 인증서 (프로덕션 환경)
  • 웹훅 수신을 위한 공개 URL

Docker Compose 설치 방법

방법 1: 기본 설치 (PostgreSQL + Redis)

프로젝트 디렉토리를 생성합니다:

mkdir activepieces && cd activepieces

docker-compose.yml 파일을 생성합니다:

version: '3.8'

services:
  activepieces:
    image: activepieces/activepieces:latest
    container_name: activepieces
    restart: unless-stopped
    ports:
      - "8080:80"
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    env_file:
      - .env
    volumes:
      - ./cache:/usr/src/app/cache
    networks:
      - activepieces

  postgres:
    image: postgres:17-alpine
    container_name: activepieces-postgres
    restart: unless-stopped
    environment:
      POSTGRES_DB: ${AP_POSTGRES_DATABASE}
      POSTGRES_USER: ${AP_POSTGRES_USERNAME}
      POSTGRES_PASSWORD: ${AP_POSTGRES_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${AP_POSTGRES_USERNAME} -d ${AP_POSTGRES_DATABASE}"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - activepieces

  redis:
    image: redis:7-alpine
    container_name: activepieces-redis
    restart: unless-stopped
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - activepieces

volumes:
  postgres_data:
  redis_data:

networks:
  activepieces:
    driver: bridge

.env 파일을 생성합니다:

# 환경 설정
AP_ENVIRONMENT=prod
AP_FRONTEND_URL=http://localhost:8080

# PostgreSQL 설정
AP_POSTGRES_DATABASE=activepieces
AP_POSTGRES_HOST=postgres
AP_POSTGRES_PORT=5432
AP_POSTGRES_USERNAME=activepieces
AP_POSTGRES_PASSWORD=your_secure_password_here

# Redis 설정
AP_REDIS_HOST=redis
AP_REDIS_PORT=6379

# 보안 키 (필수 - 랜덤 생성)
AP_ENCRYPTION_KEY=your_32_char_encryption_key_here
AP_JWT_SECRET=your_64_char_jwt_secret_here

# 실행 모드
AP_EXECUTION_MODE=UNSANDBOXED

# 기타 설정
AP_TELEMETRY_ENABLED=false
AP_SIGN_UP_ENABLED=true
AP_WEBHOOK_TIMEOUT_SECONDS=30
AP_TRIGGER_DEFAULT_POLL_INTERVAL=5

보안 키를 생성합니다:

# Encryption Key (32자)
openssl rand -hex 16

# JWT Secret (64자)
openssl rand -hex 32

실행합니다:

docker compose up -d

방법 2: SMTP 메일 설정 포함

version: '3.8'

services:
  activepieces:
    image: activepieces/activepieces:latest
    container_name: activepieces
    restart: unless-stopped
    ports:
      - "8080:80"
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    environment:
      # 기본 설정
      AP_ENVIRONMENT: prod
      AP_FRONTEND_URL: ${AP_FRONTEND_URL}
      AP_ENCRYPTION_KEY: ${AP_ENCRYPTION_KEY}
      AP_JWT_SECRET: ${AP_JWT_SECRET}
      
      # 데이터베이스
      AP_POSTGRES_DATABASE: ${AP_POSTGRES_DATABASE}
      AP_POSTGRES_HOST: postgres
      AP_POSTGRES_PORT: 5432
      AP_POSTGRES_USERNAME: ${AP_POSTGRES_USERNAME}
      AP_POSTGRES_PASSWORD: ${AP_POSTGRES_PASSWORD}
      
      # Redis
      AP_REDIS_HOST: redis
      AP_REDIS_PORT: 6379
      
      # 실행 모드
      AP_EXECUTION_MODE: UNSANDBOXED
      
      # SMTP 설정
      AP_SMTP_HOST: ${AP_SMTP_HOST}
      AP_SMTP_PORT: ${AP_SMTP_PORT}
      AP_SMTP_USERNAME: ${AP_SMTP_USERNAME}
      AP_SMTP_PASSWORD: ${AP_SMTP_PASSWORD}
      AP_SMTP_SENDER_EMAIL: ${AP_SMTP_SENDER_EMAIL}
      AP_SMTP_USE_SSL: "true"
    volumes:
      - ./cache:/usr/src/app/cache
    networks:
      - activepieces

  postgres:
    image: postgres:17-alpine
    container_name: activepieces-postgres
    restart: unless-stopped
    environment:
      POSTGRES_DB: ${AP_POSTGRES_DATABASE}
      POSTGRES_USER: ${AP_POSTGRES_USERNAME}
      POSTGRES_PASSWORD: ${AP_POSTGRES_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - activepieces

  redis:
    image: redis:7-alpine
    container_name: activepieces-redis
    restart: unless-stopped
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - activepieces

volumes:
  postgres_data:
  redis_data:

networks:
  activepieces:
    driver: bridge

.env 파일 (SMTP 포함):

# 기본 설정
AP_FRONTEND_URL=https://automation.yourdomain.com
AP_ENCRYPTION_KEY=your_32_char_encryption_key
AP_JWT_SECRET=your_64_char_jwt_secret

# PostgreSQL
AP_POSTGRES_DATABASE=activepieces
AP_POSTGRES_USERNAME=activepieces
AP_POSTGRES_PASSWORD=secure_db_password

# SMTP (Gmail 예시)
AP_SMTP_HOST=smtp.gmail.com
AP_SMTP_PORT=587
AP_SMTP_USERNAME=your_email@gmail.com
AP_SMTP_PASSWORD=your_app_password
AP_SMTP_SENDER_EMAIL=noreply@yourdomain.com

방법 3: 로깅 및 헬스체크 강화

version: '3.8'

services:
  activepieces:
    image: activepieces/activepieces:latest
    container_name: activepieces
    restart: unless-stopped
    ports:
      - "8080:80"
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    env_file:
      - .env
    volumes:
      - ./cache:/usr/src/app/cache
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://localhost:80/api/v1/health || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
    networks:
      - activepieces

  postgres:
    image: postgres:17-alpine
    container_name: activepieces-postgres
    restart: unless-stopped
    environment:
      POSTGRES_DB: ${AP_POSTGRES_DATABASE}
      POSTGRES_USER: ${AP_POSTGRES_USERNAME}
      POSTGRES_PASSWORD: ${AP_POSTGRES_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${AP_POSTGRES_USERNAME} -d ${AP_POSTGRES_DATABASE}"]
      interval: 10s
      timeout: 5s
      retries: 5
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
    networks:
      - activepieces

  redis:
    image: redis:7-alpine
    container_name: activepieces-redis
    restart: unless-stopped
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
    networks:
      - activepieces

volumes:
  postgres_data:
  redis_data:

networks:
  activepieces:
    driver: bridge

환경 변수 설정

필수 환경 변수

변수명설명예시
AP_FRONTEND_URL외부 접근 URL (웹훅 필수)https://automation.example.com
AP_ENCRYPTION_KEY데이터 암호화 키 (32자)openssl rand -hex 16
AP_JWT_SECRETJWT 토큰 시크릿 (64자)openssl rand -hex 32
AP_POSTGRES_*PostgreSQL 연결 정보
AP_REDIS_*Redis 연결 정보

실행 모드 (AP_EXECUTION_MODE)

모드설명사용 사례
UNSANDBOXED샌드박스 없음, 최고 성능개인/신뢰 환경
SANDBOXED프로세스 격리, 보안 강화다중 사용자 환경

선택적 환경 변수

# 회원가입 비활성화 (초기 설정 후)
AP_SIGN_UP_ENABLED=false

# 텔레메트리 비활성화
AP_TELEMETRY_ENABLED=false

# 워크플로우 타임아웃
AP_FLOW_TIMEOUT_SECONDS=600

# 웹훅 타임아웃
AP_WEBHOOK_TIMEOUT_SECONDS=30

# 기본 폴링 간격 (분)
AP_TRIGGER_DEFAULT_POLL_INTERVAL=5

# 템플릿 소스
AP_TEMPLATES_SOURCE_URL=https://cloud.activepieces.com/api/v1/flow-templates

Traefik 리버스 프록시 연동

version: '3.8'

services:
  activepieces:
    image: activepieces/activepieces:latest
    container_name: activepieces
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    env_file:
      - .env
    volumes:
      - ./cache:/usr/src/app/cache
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    labels:
      - "traefik.enable=true"
      # HTTP 라우터
      - "traefik.http.routers.activepieces.rule=Host(`automation.yourdomain.com`)"
      - "traefik.http.routers.activepieces.entrypoints=websecure"
      - "traefik.http.routers.activepieces.tls=true"
      - "traefik.http.routers.activepieces.tls.certresolver=letsencrypt"
      # 서비스 설정
      - "traefik.http.services.activepieces.loadbalancer.server.port=80"
    networks:
      - activepieces
      - traefik

  postgres:
    image: postgres:17-alpine
    container_name: activepieces-postgres
    restart: unless-stopped
    environment:
      POSTGRES_DB: ${AP_POSTGRES_DATABASE}
      POSTGRES_USER: ${AP_POSTGRES_USERNAME}
      POSTGRES_PASSWORD: ${AP_POSTGRES_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - activepieces

  redis:
    image: redis:7-alpine
    container_name: activepieces-redis
    restart: unless-stopped
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - activepieces

volumes:
  postgres_data:
  redis_data:

networks:
  activepieces:
    driver: bridge
  traefik:
    external: true

.env 파일:

AP_ENVIRONMENT=prod
AP_FRONTEND_URL=https://automation.yourdomain.com

AP_POSTGRES_DATABASE=activepieces
AP_POSTGRES_HOST=postgres
AP_POSTGRES_PORT=5432
AP_POSTGRES_USERNAME=activepieces
AP_POSTGRES_PASSWORD=your_secure_password

AP_REDIS_HOST=redis
AP_REDIS_PORT=6379

AP_ENCRYPTION_KEY=your_32_char_key
AP_JWT_SECRET=your_64_char_secret

AP_EXECUTION_MODE=UNSANDBOXED
AP_TELEMETRY_ENABLED=false
AP_SIGN_UP_ENABLED=true

Nginx 리버스 프록시 연동

Docker Compose (Nginx 포함)

version: '3.8'

services:
  activepieces:
    image: activepieces/activepieces:latest
    container_name: activepieces
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    env_file:
      - .env
    volumes:
      - ./cache:/usr/src/app/cache
    networks:
      - activepieces

  postgres:
    image: postgres:17-alpine
    container_name: activepieces-postgres
    restart: unless-stopped
    environment:
      POSTGRES_DB: ${AP_POSTGRES_DATABASE}
      POSTGRES_USER: ${AP_POSTGRES_USERNAME}
      POSTGRES_PASSWORD: ${AP_POSTGRES_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - activepieces

  redis:
    image: redis:7-alpine
    container_name: activepieces-redis
    restart: unless-stopped
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - activepieces

  nginx:
    image: nginx:alpine
    container_name: activepieces-nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
      - ./ssl:/etc/nginx/ssl:ro
    depends_on:
      - activepieces
    networks:
      - activepieces

volumes:
  postgres_data:
  redis_data:

networks:
  activepieces:
    driver: bridge

Nginx 설정 파일 (nginx.conf)

upstream activepieces {
    server activepieces:80;
}

server {
    listen 80;
    server_name automation.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name automation.yourdomain.com;

    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    client_max_body_size 100M;

    location / {
        proxy_pass http://activepieces;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 86400;
    }
}

경량 설치 (PGLite 모드)

개인 사용이나 테스트용으로 외부 데이터베이스 없이 실행할 수 있습니다:

version: '3.8'

services:
  activepieces:
    image: activepieces/activepieces:latest
    container_name: activepieces
    restart: unless-stopped
    ports:
      - "8080:80"
    environment:
      AP_ENVIRONMENT: prod
      AP_FRONTEND_URL: http://localhost:8080
      AP_DB_TYPE: PGLITE
      AP_REDIS_TYPE: MEMORY
      AP_ENCRYPTION_KEY: your_32_char_encryption_key
      AP_JWT_SECRET: your_64_char_jwt_secret
      AP_EXECUTION_MODE: UNSANDBOXED
      AP_TELEMETRY_ENABLED: "false"
    volumes:
      - activepieces_data:/root/.activepieces

volumes:
  activepieces_data:

⚠️ 주의: PGLite 모드는 단일 인스턴스 전용입니다. 프로덕션 환경에서는 PostgreSQL + Redis 구성을 권장합니다.


업그레이드 및 백업

버전 업그레이드

# 최신 이미지 풀
docker compose pull

# 컨테이너 재시작
docker compose down
docker compose up -d

# 로그 확인
docker compose logs -f activepieces

자동 업그레이드 스크립트

#!/bin/bash
cd /opt/activepieces
git pull origin main 2>/dev/null || true
docker compose pull
docker compose down
docker compose up -d
echo "Activepieces 업그레이드 완료: $(date)"

데이터베이스 백업

# PostgreSQL 백업
docker exec activepieces-postgres pg_dump -U activepieces activepieces > backup_$(date +%Y%m%d).sql

# 복원
docker exec -i activepieces-postgres psql -U activepieces activepieces < backup_20250305.sql

전체 데이터 백업

# 볼륨 백업
docker run --rm \
  -v activepieces_postgres_data:/data \
  -v $(pwd)/backups:/backup \
  alpine tar czf /backup/postgres_$(date +%Y%m%d).tar.gz /data

docker run --rm \
  -v activepieces_redis_data:/data \
  -v $(pwd)/backups:/backup \
  alpine tar czf /backup/redis_$(date +%Y%m%d).tar.gz /data

문제 해결

502 Bad Gateway

데이터베이스 마이그레이션 중일 수 있습니다:

# 로그 확인
docker logs activepieces

# 서비스 상태 확인
docker compose ps

웹훅이 작동하지 않음

  1. AP_FRONTEND_URL이 외부에서 접근 가능한지 확인
  2. 방화벽에서 포트가 열려 있는지 확인
  3. 로컬 환경에서는 ngrok 사용:
ngrok http 8080
# ngrok URL을 AP_FRONTEND_URL로 설정

데이터베이스 연결 오류

# PostgreSQL 상태 확인
docker exec activepieces-postgres pg_isready

# 환경 변수 확인
docker exec activepieces env | grep AP_POSTGRES

메모리 부족

docker-compose.yml에 리소스 제한 추가:

services:
  activepieces:
    deploy:
      resources:
        limits:
          memory: 2G
        reservations:
          memory: 1G

로그 확인

# 전체 로그
docker compose logs -f

# 특정 서비스 로그
docker compose logs -f activepieces

# 최근 100줄
docker compose logs --tail=100 activepieces

사용 사례

1. 리드 자동화

  • HubSpot/Salesforce 새 연락처 → Slack 알림
  • 웹사이트 폼 제출 → CRM 자동 등록

2. 마케팅 자동화

  • RSS 새 글 → 소셜 미디어 자동 포스팅
  • 뉴스레터 구독자 → MailChimp 동기화

3. 운영 자동화

  • PDF 업로드 → AI 요약 → 팀 리뷰 전송
  • 서버 알림 → Discord/Slack 통합

4. AI 워크플로우

  • OpenAI로 컨텐츠 생성 → 블로그 자동 발행
  • 고객 문의 → AI 분류 → 담당자 할당

도구 비교

기능Activepiecesn8nZapierMake
오픈소스✅ MIT⚠️ Fair Code
셀프호스팅
무료 플랜무제한 (셀프)제한적100태스크/월1000작업/월
UI 난이도쉬움어려움쉬움중간
AI 네이티브플러그인제한적제한적
통합 수330+400+8000+1500+
한국어 지원커뮤니티일부

결론

Activepieces는 Zapier의 강력한 오픈소스 대안으로, 다음과 같은 경우에 특히 적합합니다:

  • 비용 절감: 셀프호스팅으로 월 구독료 없이 무제한 자동화
  • 데이터 프라이버시: 민감한 데이터를 외부 서버에 보내지 않음
  • 비개발자 팀: n8n보다 쉬운 학습 곡선
  • AI 워크플로우: 네이티브 LLM 통합 및 Agent Builder
  • 확장성: TypeScript 기반 커스텀 Piece 개발 가능

MIT 라이선스의 완전한 오픈소스로, 상업적 제한 없이 자유롭게 사용할 수 있습니다. Docker를 활용한 간편한 설치와 직관적인 UI로 지금 바로 자동화를 시작해보세요!


참고 링크




댓글 남기기