렌더링 실패: arm64 vs x86 Chromium
카피 완성 후 차은별이 instagram-card-news 엔진을 실행해 PNG 렌더링을 시작했습니다. 그런데 Puppeteer가 멈췄습니다.
오류 메시지를 보니 원인이 명확했습니다. Puppeteer가 자동으로 다운로드한 Chromium 바이너리가 x86_64(amd64) 버전인데, 서버는 aarch64(arm64) 아키텍처였습니다. 아키텍처가 다른 바이너리는 실행 자체가 안 됩니다.
원인
npm install 시 Puppeteer는 현재 플랫폼을 자동 감지해서 맞는 Chromium을 다운로드합니다. 그런데 일부 환경에서는 플랫폼 감지가 잘못되어 x86 바이너리를 받아오는 경우가 생깁니다. PUPPETEER_EXECUTABLE_PATH 환경변수로 시스템 Chromium 경로를 직접 지정하면 이 문제를 우회할 수 있습니다.
해결 방법 두 가지
방법 1: 시스템 Chromium 직접 지정
Puppeteer가 자체 다운로드한 바이너리 대신, 시스템에 설치된 arm64 Chromium을 사용하도록 지정합니다.
먼저 arm64용 chromium을 설치합니다.
sudo apt-get install -y chromium
설치 후 경로를 확인합니다. which chromium으로 경로를 찾습니다.
Puppeteer 실행 시 executablePath를 직접 지정합니다.
const browser = await puppeteer.launch({
executablePath: '/usr/bin/chromium',
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
render.js 스크립트에서 puppeteer.launch() 옵션에 이 경로를 추가하면 시스템 Chromium을 사용합니다.
방법 2: puppeteer-core + 시스템 Chromium 조합
puppeteer 대신 puppeteer-core를 설치합니다. puppeteer-core는 Chromium을 자동 다운로드하지 않습니다. 대신 executablePath를 반드시 지정해야 합니다.
npm uninstall puppeteer
npm install puppeteer-core
이후 코드에서 executablePath를 시스템 Chromium 경로로 지정하면 arm64 환경에서도 정상 동작합니다.
렌더링 환경 점검 체크리스트
새 서버에 렌더링 엔진을 설치할 때 미리 확인해야 할 것들입니다.
- uname -m 으로 서버 아키텍처 확인 (x86_64 vs aarch64)
- node --version 으로 Node.js 버전 확인 (18 이상 권장)
- which chromium 또는 which chromium-browser로 시스템 Chromium 경로 확인 (Ubuntu 22.04+는 chromium)
- arm64 서버라면 puppeteer-core 사용 권장
인스타그램 자동발행 설계
렌더링 문제와 별개로, 완성된 PNG를 어떻게 인스타그램에 발행할지도 설계했습니다.
방법은 두 가지입니다. Meta Graph API를 사용하는 방법과, Playwright로 브라우저를 자동화하는 방법입니다.
Meta Graph API 방식 (권장)
Meta에서 공식으로 제공하는 Instagram Graph API를 사용하면 이미지 업로드부터 게시까지 API 호출로 처리할 수 있습니다.
3단계 흐름으로 동작합니다.
1단계: 계정 연결 Meta for Developers에서 앱을 만들고 Instagram 계정을 연결합니다. 개인 계정이 아닌 비즈니스 계정 또는 크리에이터 계정이어야 Graph API 접근이 허용됩니다.
2단계: 앱 생성 및 권한 설정 instagram_basic, instagram_content_publish 권한이 필요합니다. 앱 검토를 받기 전에는 테스트 계정에서만 사용 가능합니다. 실제 발행을 자동화하려면 앱 검토를 통해 publish 권한을 정식으로 받아야 합니다.
3단계: 업로드 API 호출 PNG 이미지를 먼저 Media Create API로 업로드합니다. 업로드 완료 후 반환된 creation_id를 Media Publish API에 넘겨 게시합니다. 캡션, 해시태그도 이 시점에 함께 전달합니다.
Playwright 방식 (대안)
Meta Graph API 심사가 번거롭거나 비즈니스 계정 전환이 어려운 경우, Playwright로 인스타그램 웹을 직접 자동화하는 방법도 있습니다.
Playwright가 설치된 서버(Windows #2 — 김준혁, 이하은, 노니사 서버)에서 브라우저를 실행하고, 인스타그램 로그인 → 게시물 올리기 → 이미지 첨부 → 캡션 입력 → 게시 순서로 자동화합니다.
단점이 있습니다. 인스타그램 UI가 변경될 때마다 자동화 스크립트가 깨집니다. 계정이 이상 로그인으로 감지되어 보안 조치를 받을 위험도 있습니다. 장기적으로는 Meta Graph API 방식이 안정적입니다.
현재 선택
Meta Graph API 앱 검토 전까지는 차은별이 PNG를 Discord 채널에 올리는 것으로 임시 운영합니다. 운영자가 Discord에서 이미지를 받아서 직접 업로드하는 반자동 방식입니다.
Meta Graph API 앱 검토가 통과되면 차은별이 렌더링 완료 즉시 인스타그램에 발행하는 완전 자동화로 전환할 예정입니다.
