Quay lại danh sách
Tin tức công nghệ

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

3 tháng 6, 2026

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 compose thay vì docker-compose mã 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:

  • Khởi động toàn bộ cụm dịch vụ: docker compose up -d
  • Theo dõi quá trình khởi tạo để đảm bảo không có service nào bị crash vòng lặp: docker compose ps
  • Tạo tài khoản quản trị đầu tiên (do hệ thống tự host không bật đăng ký tự do mặc định để bảo mật):
    docker compose exec penpot-backend manage-profiles create-profile
  • Bằ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ế.

    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 | DPTCloud