Tự host Penpot trên VPS ARM64: Hướng dẫn vượt qua các lỗi tương thích kiến trúc để chạy nền tảng thiết kế UI/UX riêng
Giới thiệu xu hướng tối ưu chi phí với VPS ARM64 và Penpot
Trong bối cảnh tối ưu hóa chi phí hạ tầng công nghệ, kiến trúc ARM64 (AArch64) đang trở thành một lựa chọn chiến lược cho các doanh nghiệp và đội ngũ phát triển. Các nhà cung cấp dịch vụ đám mây lớn như Oracle Cloud (với dòng Ampere A1), AWS (với Graviton), hay Hetzner đều đang cung cấp các dòng VPS ARM64 với hiệu năng vượt trội trên mỗi cấu hình và chi phí rẻ hơn đáng kể so với kiến trúc x86_64 truyền thống.
Song song đó, trong thế giới thiết kế UI/UX, Penpot nổi lên như một giải pháp thay thế mã nguồn mở hoàn hảo cho Figma. Penpot cho phép các doanh nghiệp tự chủ hoàn toàn về dữ liệu, bảo mật thông tin nội bộ thông qua việc tự host (self-host). Tuy nhiên, việc kết hợp Penpot và VPS ARM64 không phải lúc nào cũng suôn sẻ. Do Penpot được cấu thành từ nhiều dịch vụ thành phần (Frontend, Backend, Exporter, Redis, Postgres), một số image Docker cũ hoặc các công cụ phụ thuộc (dependencies) chưa được tối ưu hóa cho ARM64 sẽ gây ra các lỗi nghiêm trọng trong quá trình khởi chạy.
Bài viết này sẽ hướng dẫn bạn từng bước thiết lập Penpot trên VPS ARM64 và cách xử lý các lỗi tương thích kiến trúc phổ biến.
---Chuẩn bị môi trường hệ thống
Trước khi bắt đầu, hãy đảm bảo VPS ARM64 của bạn đã được cài đặt hệ điều hành Linux (khuyến nghị Ubuntu 22.04 LTS hoặc 24.04 LTS) và các công cụ core sau:
- Docker Engine: Phiên bản 20.10 trở lên.
- Docker Compose: Phiên bản V2 (lệnh
docker composethay vìdocker-composemã cũ).
Kiểm tra chính xác kiến trúc hệ thống bằng lệnh:
---
uname -m
Kết quả trả về phải là aarch64 hoặc arm64.
Cấu hình Docker Compose tối ưu cho ARM64
Mặc dù đội ngũ phát triển Penpot đã có những bước tiến lớn trong việc hỗ trợ đa kiến trúc (Multi-arch), file docker-compose.yaml mặc định tải từ trang chủ đôi khi vẫn kéo về các image hoặc cấu hình không tối ưu cho chip ARM. Đặc biệt, phân hệ Penpot Exporter (chịu trách nhiệm render PDF/SVG) và PostgreSQL cần được chú ý đặc biệt.
Dưới đây là file cấu hình mẫu đã được tinh chỉnh hoàn toàn tương thích với môi trường ARM64:
version: "3.5"
services:
penpot-postgres:
image: postgres:15-alpine
restart: always
stop_signal: SIGINT
environment:
- POSTGRES_INITDB_ARGS=--data-checksums
- POSTGRES_DB=penpot
- POSTGRES_USER=penpot
- POSTGRES_PASSWORD=your_secure_password
volumes:
- penpot_postgres_data:/var/lib/postgresql/data
penpot-redis:
image: redis:7-alpine
restart: always
penpot-backend:
image: penpotapp/backend:latest
restart: always
depends_on:
- penpot-postgres
- penpot-redis
volumes:
- penpot_assets:/opt/data
environment:
- PENPOT_DATABASE_URI=postgresql://penpot-postgres/penpot
- PENPOT_DATABASE_USERNAME=penpot
- PENPOT_DATABASE_PASSWORD=your_secure_password
- PENPOT_REDIS_URI=redis://penpot-redis/0
- PENPOT_SECRET_KEY=generate_a_random_string
penpot-frontend:
image: penpotapp/frontend:latest
restart: always
ports:
- "8080:80"
depends_on:
- penpot-backend
penpot-exporter:
image: penpotapp/exporter:latest
restart: always
environment:
- PENPOT_PUBLIC_URI=http://penpot-frontend
Lưu ý: Việc sử dụng các tag :latest hoặc phiên bản dựa trên alpine giúp Docker tự động nhận diện và tải về bản build (variant) dành riêng for ARM64.
Nhận diện và khắc phục các lỗi tương thích kiến trúc (Architecture Mismatch)
1. Lỗi "exec format error" tại Penpot Exporter
Đây là lỗi kinh điển khi chạy Docker trên ARM64. Khi bạn kiểm tra log bằng lệnh docker compose logs penpot-exporter, bạn có thể thấy thông báo lỗi hệ thống dạng:
standard_init_linux.go:228: exec user process caused "exec format error"
Nguyên nhân: Phân hệ Exporter của Penpot sử dụng một trình duyệt Chromium ẩn (headless) để xuất bản vẽ. Ở các phiên bản cũ, image của Exporter chỉ được build cho kiến trúc x86_64 (amd64). Khi chạy trên ARM64, nhân Linux không thể thực thi các chỉ thị mã máy này.
Giải pháp: Đảm bảo bạn đang sử dụng image chính thức từ penpotapp/exporter:latest. Kể từ các phiên bản gần đây, Penpot đã hỗ trợ build native mã nguồn cho ARM64. Nếu lỗi vẫn tiếp diễn, bạn cần ép Docker kéo đúng kiến trúc bằng cách thêm thuộc tính platform: linux/arm64 vào dưới service tương ứng trong file yaml.
2. Lỗi Khởi Chạy PostgreSQL trên một số dòng nhân Kernel cũ
Trên một số bản phân phối Linux cho chip ARM (ví dụ: một số bản build cũ của Oracle Linux), cơ chế quản lý bộ nhớ trang (page size) có thể khác biệt (64kb thay vì 4kb), dẫn đến việc PostgreSQL phiên bản Alpine không thể khởi chạy và crash liên tục.
Giải pháp: Nếu gặp hiện tượng container Postgres tự thoát mà không rõ lý do, hãy thay thế image: postgres:15-alpine bằng image chuẩn Debian: image: postgres:15. Bản build Debian có khả năng tương thích ngược và xử lý quản lý bộ nhớ trên kiến trúc ARM ổn định hơn trong môi trường ảo hóa.
3. Lỗi kết nối mạng nội bộ do cấu hình MTU
Trên các hạ tầng Cloud như AWS hay Oracle Cloud, các instance ARM64 thường cấu hình mạng với chỉ số MTU (Maximum Transmission Unit) là 9000 (Jumbo Frames). Tuy nhiên, mạng ảo của Docker mặc định là 1500. Sự lệch pha này khiến gói tin giữa các service Penpot (Backend & Frontend) bị rớt cấu trúc, dẫn đến lỗi giao diện không load được hoặc báo lỗi kết nối database 500 ngắt quãng.
Giải pháp: Định nghĩa lại cấu hình mạng ở cuối file docker-compose.yaml:
networks:
default:
driver: bridge
driver_opts:
com.docker.network.driver.mtu: "9000"---Các bước triển khai và kiểm tra vận hành
Sau khi đã hiệu chỉnh file cấu hình phù hợp với đặc thù kiến trúc ARM64, bạn tiến hành khởi chạy hệ thống theo các bước sau:
docker compose up -ddocker compose psdocker compose exec penpot-backend manage-profiles create-profileBằng việc tận dụng sức mạnh của chip ARM64, hệ thống Penpot tự host của doanh nghiệp bạn không chỉ vận hành mượt mà với độ trễ thấp nhờ băng thông RAM lớn của các dòng chip mới, mà còn tiết kiệm tới 40% - 60% chi phí thuê máy chủ hàng tháng so với kiến trúc x86 truyền thống. Đây là một bước đi chiến lược tối ưu để xây dựng một môi trường thiết kế UI/UX độc lập, bảo mật và hiệu quả kinh tế.
