Activepieces는 Zapier와 Make의 오픈소스 대안으로, 노코드 방식으로 다양한 앱과 서비스를 연결하여 워크플로우를 자동화할 수 있는 플랫폼입니다. Y Combinator 출신 스타트업이 개발했으며, MIT 라이선스로 완전한 오픈소스이면서도 직관적인 UI로 비개발자도 쉽게 사용할 수 있습니다. 이 가이드에서는 Docker를 활용하여 Activepieces를 셀프호스팅하는 다양한 방법을 소개합니다.
Activepieces란?
Activepieces는 2022년 Y Combinator에서 시작된 오픈소스 비즈니스 자동화 플랫폼입니다. Zapier, Make(Integromat)와 같은 상용 자동화 도구의 셀프호스팅 대안으로, GitHub에서 20,000개 이상의 스타를 받으며 빠르게 성장하고 있습니다.
왜 Activepieces인가?
| 특징 | Activepieces | Zapier | n8n |
|---|---|---|---|
| 라이선스 | MIT (완전 오픈소스) | 상용 | Fair Code (제한적) |
| 셀프호스팅 | ✅ 무제한 | ❌ | ✅ 제한 있음 |
| 가격 | 무료 (셀프호스팅) | $19.99+/월 | Fair Code 제한 |
| UI 난이도 | 쉬움 (G2: 9.1) | 쉬움 | 어려움 (G2: 7.7) |
| 통합 수 | 330+ Pieces | 8,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 비교
| 항목 | Activepieces | n8n |
|---|---|---|
| 학습 곡선 | 낮음 (초보자 친화적) | 높음 (개발자 중심) |
| 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_SECRET | JWT 토큰 시크릿 (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
웹훅이 작동하지 않음
AP_FRONTEND_URL이 외부에서 접근 가능한지 확인- 방화벽에서 포트가 열려 있는지 확인
- 로컬 환경에서는 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 분류 → 담당자 할당
도구 비교
| 기능 | Activepieces | n8n | Zapier | Make |
|---|---|---|---|---|
| 오픈소스 | ✅ MIT | ⚠️ Fair Code | ❌ | ❌ |
| 셀프호스팅 | ✅ | ✅ | ❌ | ❌ |
| 무료 플랜 | 무제한 (셀프) | 제한적 | 100태스크/월 | 1000작업/월 |
| UI 난이도 | 쉬움 | 어려움 | 쉬움 | 중간 |
| AI 네이티브 | ✅ | 플러그인 | 제한적 | 제한적 |
| 통합 수 | 330+ | 400+ | 8000+ | 1500+ |
| 한국어 지원 | 커뮤니티 | 일부 | ✅ | ✅ |
결론
Activepieces는 Zapier의 강력한 오픈소스 대안으로, 다음과 같은 경우에 특히 적합합니다:
- 비용 절감: 셀프호스팅으로 월 구독료 없이 무제한 자동화
- 데이터 프라이버시: 민감한 데이터를 외부 서버에 보내지 않음
- 비개발자 팀: n8n보다 쉬운 학습 곡선
- AI 워크플로우: 네이티브 LLM 통합 및 Agent Builder
- 확장성: TypeScript 기반 커스텀 Piece 개발 가능
MIT 라이선스의 완전한 오픈소스로, 상업적 제한 없이 자유롭게 사용할 수 있습니다. Docker를 활용한 간편한 설치와 직관적인 UI로 지금 바로 자동화를 시작해보세요!