And why we replaced n8n with Laravel along the way
우리가 내부 자동화 플랫폼을 구축하기 시작했을 때, 우리는 올바른 스택을 갖췄다고 생각했습니다. 워크플로 오케스트레이션을 위한 n8n, Ansible 플레이북 실행을 위한 Semaphore UI, 그리고 호스팅 운영을 완전히 자동화하는 방법에 대한 비전이 있었습니다. 몇 달이 지나자, 거미줄이라고밖에 표현할 수 없는 것을 바라보고 있었고, 처음부터 다시 시작해야 한다는 것을 알게 되었습니다.
저는 네덜란드에 본사를 둔 매니지드 호스팅 회사인 Savvii의 CTO입니다. 우리는 PHP 기반 웹사이트(전자상거래, WordPress 및 유사한 워크로드)를 전문으로 하며, 소규모 고객, 리셀러, 에이전시라는 세 가지 고객 영역에 서비스를 제공합니다. 각 영역은 서로 다른 니즈, 서로 다른 규모, 그리고 서로 다른 기대치를 가지고 있습니다.
에이전시 영역에서 우리는 가장 큰 압박을 느꼈습니다. 에이전시는 정교한 고객이지만, 그들의 내부 팀은 종종 기술 인력과 비기술 인력이 혼합되어 있습니다. 그들에게는 GUI가 필요합니다. 명령줄에서만 살 수는 없습니다. 그리고 더 많은 에이전시를 온보딩할수록 더욱 분명해졌습니다. 우리에게는 실제 자동화로 뒷받침되는 제대로 된 컨트롤 패널이 필요했습니다.
Ansible Tower와 유사한 도구들도 우리의 검토 대상에 있었지만, 설정이 너무 복잡하거나, 문서가 일관성이 없거나, 성능 및 데이터 주권 관련 우려가 있었습니다. 우리는 셀프 호스팅이 가능하고, 번거로움 없이 업그레이드할 수 있으며, 일주일간의 교육 없이도 지원 팀에 넘겨줄 수 있는 것을 원했습니다.
우리는 무언가에 전념하기 전에 전체 비교를 진행했습니다. 두 가지 요소가 후보군을 빠르게 좁혔습니다.
데이터 주권. 상태나 자격 증명을 제3자 클라우드에 저장하는 도구는 안 됩니다. 셀프 호스팅은 타협할 수 없는 조건이었습니다.
비엔지니어를 위한 UX. 1차 지원 팀은 시스템 관리자가 아니라 뛰어난 커뮤니케이터입니다. 우리가 무엇을 선택하든 모든 사건을 DevOps에 에스컬레이션하지 않고도 탐색할 수 있어야 했습니다. 우리가 평가한 도구는 다음과 같습니다.
| 기준 | Semaphore UI | n8n | AWX / Tower | Rundeck |
|---|---|---|---|---|
| 기본적으로 셀프 호스팅 | 예 — 단일 바이너리 / 익숙한 배포 | 예 — 셀프 호스팅 에디션 | 예 (AWX) / 혼합 (AAP 클라우드 옵션) | 예 |
| 1차 지원 UX | 명확한 작업 & 인벤토리 | 작성자에게는 좋음, 운영 인계에는 약함 | 무거운 RBAC 개념, 지원 팀에게는 가파름 | 작업 중심, 더 가파른 Ansible 사용성 |
| Ansible 인벤토리 & 실행 UX | 프로젝트 & 템플릿 중심으로 구성 | Ansible 컨트롤 플레인이 아님 | 네이티브이지만 복잡한 업그레이드 경로 | 가능하지만 Ansible 우선이 아님 |
| 커스텀 미들웨어용 API | 일관된 작업 & 프로젝트 API | 광범위함, 다른 운영 모델 | Tower API 표면이 버전마다 다름 | 성숙한 작업 API, 다른 기본 요소 |
| 업그레이드 & 운영 부담 | 실제로 마찰이 적은 업그레이드 | 워크플로 난립 여부에 따라 다름 | 종종 무거움 (K8s / 번들 의존성) | 보통, JVM 풋프린트 |
Semaphore UI는 두 가지 측면 모두에서 승리했습니다. 설치는 간단했습니다. 업그레이드는 수월했습니다. UI는 비엔지니어도 무슨 일이 일어나고 있는지 이해할 수 있을 만큼 깔끔했습니다. 기존 Ansible 인벤토리를 연결하는 것은 거의 마찰이 없었습니다. 도움이 필요했던 유일한 지점은 인벤토리를 연결하는 것이었고, 그것도 지원을 통해 빠르게 해결되었습니다. Semaphore의 문서는 탄탄했고, 그것이 우리에게 확신을 주었습니다.
초기 아키텍처는 HostBill(빌링), Semaphore UI, 그리고 CMDB 사이의 오케스트레이션 계층으로 n8n을 사용했습니다. 서류상으로는 깔끔해 보였습니다. 로우코드, 시각적이며, 유지 관리에 개발자가 필요하지 않았습니다.
n8n의 시각적 인터페이스는 단순한 선형 흐름에는 훌륭합니다. 하지만 조건문, 오류 처리, 다단계 콜백, 상태 관리가 그림에 들어오는 순간, 전체 조망이 사라졌습니다. 깔끔한 다이어그램으로 시작했던 것이 초현실주의 회로 기판으로 변했습니다.
안전한 상태 저장 부재
우리가 사용하던 버전에서는 단계 간의 중간 상태를 안전하게 저장할 방법이 없었습니다.
보안 우려
로그에서 비밀번호 마스킹이 신뢰할 수 없었습니다. Ansible 콜백에 생성된 자격 증명이 포함될 때 이는 심각한 우려 사항입니다.
취약한 콜백
n8n, Semaphore, CMDB 간의 콜백 처리에는 과도한 왕복이 필요했고, 이로 인해 흐름이 취약해졌습니다.
우리는 n8n을 Laravel 애플리케이션으로 교체했습니다. 이것은 노코드 도구가 아니라 우리 팀이 완전히 소유하고 이해하는 제대로 된 미들웨어입니다.
보안 모델
모든 서버에는 Semaphore SSH 키가 실제로 무엇을 할 수 있는지 제한하는 authorized_keys 파일이 있습니다. authorized_keys의 command 지시어를 사용하여, Semaphore가 실행할 수 있는 명령을 정확히 정의합니다. 초기 설정 이후, Semaphore는 또한 root 액세스를 잃습니다. 사용자 계정에만 연결할 수 있습니다.
이는 무언가가 손상되었을 경우 피해 범위를 크게 제한합니다.
우리가 시작했던 에이전시 영역은 이 아키텍처를 통해 약 600대의 서버를 운영합니다. 세 가지 영역 전체에 걸친 총 규모는 결국 3,000대에서 4,000대의 서버가 될 것이며, 우리는 플랫폼을 점진적으로 출시하고 있습니다.
다음 차례는 서버 업데이트를 위한 Semaphore의 스케줄러입니다. 현재는 외부 도구로 처리하고 있지만, 스케줄러가 구동하는 Ansible로 옮겨가고 있습니다.
지원 팀의 독립성
지원 팀은 모든 사건마다 DevOps를 끌어들이지 않고도 Semaphore를 독립적으로 사용할 수 있습니다.
실시간 알림
Slack 통합은 플레이북이 실패할 때 엔지니어링 팀에 즉각적인 알림을 제공합니다.
깔끔한 템플릿
API를 통해 변수를 전달함으로써 적은 수의 템플릿을 유지하여 난립을 방지했습니다.
정확한 CMDB
CMDB는 자동으로 정확하게 유지됩니다. 더 이상 수동 유지 관리가 필요 없습니다.
우리가 다르게 했을 가장 큰 한 가지는 다음과 같습니다. 자동화 코드를 한 줄이라도 작성하기 전에 아키텍처 설계에 더 많은 시간을 쓰는 것입니다. 우리는 어떤 흐름이 확장될지, 어떤 흐름이 실패를 우아하게 처리할지 충분히 신중하게 생각하지 않았기 때문에 여러 번 처음부터 다시 시작했습니다.
아키텍처 우선
자동화 코드를 한 줄이라도 작성하기 전에 아키텍처 설계에 더 많은 시간을 쓰십시오. 어떤 흐름이 확장되고 실패를 우아하게 처리할지 신중하게 생각하십시오.
기능만이 아니라 UX로 평가하라
지원 팀이 새벽 2시에 시니어 엔지니어를 부르지 않고는 사용할 수 없다면, 그것은 잘못된 도구입니다.
데이터 주권은 중요하다
프로덕션에 들어가기 전에 자격 증명과 상태가 어디에 있는지 파악하십시오.
좋은 문서는 신호다
도구의 문서가 엉망이라면, 그 도구도 아마 엉망일 것입니다.
Start with OSS, upgrade to Pro when your team grows. Enterprise support and SLA are available — including for hosting providers running thousands of servers.