SSD Nodes Learn 🎉 VPS từ $4.99/tháng
Hướng dẫn Matt ConnorBởi Matt Connor

So sánh Planka, Vikunja, Focalboard, Wekan, Kanboard

So sánh 5 công cụ thay Trello tự host theo RAM idle, database, SSO, import Trello và tình trạng maintenance để chọn đúng cho VPS của bạn.

Nên chọn giải pháp thay thế Trello tự host nào?

Có 3 giải pháp thay thế Trello tự host đáng dùng: Planka nếu bạn muốn giao diện board giống Trello và cần file import của Trello, Vikunja khi team cần single sign-on và nhiều tính năng hơn một board, và Kanboard khi VPS (virtual private server) có dung lượng nhỏ. Không nên bắt đầu dự án mới với Focalboard. Standalone server của nó chưa có bản release nào trong 783 ngày, và README hiện yêu cầu có maintainer.

Wekan là công cụ thứ 5 trong số 5 công cụ ở đây. Nó hoạt động tốt, nhưng dùng bộ nhớ nhiều gấp vài lần mọi công cụ khác. Mọi phiên bản, giấy phép và ngày tháng dưới đây đều được kiểm tra vào ngày 5 tháng 8 năm 2026.

Mỗi công cụ board cần bao nhiêu RAM?

ChartTypical idle memory per stack in MB, Docker on Ubuntu 24.04
The data behind this chart
[
  {
    "tool": "Planka + Postgres",
    "idle_memory_mb": 280
  },
  {
    "tool": "Vikunja + SQLite",
    "idle_memory_mb": 110
  },
  {
    "tool": "Focalboard + SQLite",
    "idle_memory_mb": 120
  },
  {
    "tool": "Wekan + FerretDB",
    "idle_memory_mb": 750
  },
  {
    "tool": "Kanboard + SQLite",
    "idle_memory_mb": 70
  }
]

Đó là mức sử dụng khi idle điển hình của một bản cài mới, khi chưa có ai sử dụng. Đây là loại số liệu mà docker stats báo cáo một phút sau khi stack khởi động. Dùng chúng để ước tính cấu hình gói dịch vụ, sau đó tự đo trên hệ thống của bạn. Xu hướng quan trọng hơn số megabyte chính xác.

Kanboard là mức thấp nhất, ở 70 MB, vì nó dùng PHP với SQLite. Không có tiến trình ứng dụng chạy lâu giữ các board trong memory, nên container gần như không dùng gì khi idle giữa các request. Vikunja là một binary Go duy nhất, ở 110 MB. SQLite là database mặc định, nên toàn bộ stack chỉ cần một container. Planka cần 280 MB vì luôn gồm 2 container: một Node server và PostgreSQL. Planka không có tùy chọn SQLite, nên không thể bỏ qua database này.

Wekan ở mức 750 MB vì nó là một ứng dụng Meteor. Meteor giữ một lớp live query trong memory của Node và đẩy mọi thay đổi trên board đến từng browser đang mở qua WebSocket. Vì vậy, memory tăng theo số người đang kết nối thay vì giữ ổn định. Trên VPS 1 GB, Wekan khởi động được nhưng sẽ chết ngay khi một vài người mở board lớn. Dấu hiệu là container biến mất rồi khởi động lại với exit code 137. docker compose ps hiển thị tình trạng này dưới dạng restart loop. Xác nhận trên host bằng dmesg -T | grep -i "out of memory", vì kernel out-of-memory killer không báo cho ứng dụng biết điều gì.

Dependency của database quyết định một nửa công việc backup, nên tóm tắt ở đây, mỗi công cụ một dòng. Planka yêu cầu PostgreSQL. Vikunja mặc định dùng SQLite và cũng hỗ trợ PostgreSQL cùng MySQL hoặc MariaDB. Kanboard mặc định dùng SQLite và cũng hỗ trợ MySQL, MariaDB và PostgreSQL. Tài liệu của Kanboard khuyến nghị PostgreSQL và cảnh báo không dùng SQLite trên NFS (network file system). Focalboard mặc định dùng SQLite. Wekan hỗ trợ MongoDB wire protocol. File Compose mặc định của Wekan hiện cung cấp FerretDB v1 với SQLite backend tích hợp thay cho MongoDB server thật. Nếu cần MongoDB, có một file Compose riêng cho MongoDB 7.

Dự án nào trong số này vẫn được duy trì?

ChartAge of the newest stable release in days, checked 5 August 2026
The data behind this chart
[
  {
    "tool": "Planka 2.1.1",
    "release_age": 109
  },
  {
    "tool": "Vikunja 2.5.0",
    "release_age": 1
  },
  {
    "tool": "Focalboard 8.0.0",
    "release_age": 783
  },
  {
    "tool": "Wekan 10.67",
    "release_age": 1
  },
  {
    "tool": "Kanboard 1.2.53",
    "release_age": 12
  }
]

Focalboard là trường hợp khác biệt, với 783 ngày. Bản release độc lập gần nhất của dự án là v8.0.0, phát hành vào tháng 6 năm 2024. Mattermost đã chuyển việc phát triển board vào một plugin trong repository riêng, và README của bản độc lập cho biết repository hiện không được duy trì. Đây là câu trả lời “không” rõ ràng duy nhất trong so sánh này. Các dự án còn lại đều có những điểm đánh đổi.

109 ngày của Planka là mức lành mạnh đối với một dự án phát hành vài bản mỗi năm. Version 2.1.1 được phát hành vào tháng 4 năm 2026. Kanboard phát hành v1.2.53 trước thời điểm kiểm tra 12 ngày, còn 2 bản release trước đó được phát hành vào tháng 3 và tháng 4 năm 2026.

Vikunja và Wekan đều phát hành trong vòng 1 ngày trước thời điểm kiểm tra, nhưng bạn nên diễn giải 2 thông tin này khác nhau. Vikunja gắn tag v2.5.0 cho một minor release thông thường. Wekan gắn các tag v10.65, v10.66 và v10.67 trong cùng ngày, đúng với cadence thông thường của dự án. Tần suất release cao không có nghĩa là target ổn định. Khi dùng Wekan, bạn chọn theo dõi một version number thay đổi nhanh, vì vậy hãy pin tag và đọc release notes trước mỗi lần bump.

Bạn nhận được gì ngoài một board?

Hầu hết bài so sánh chỉ dừng ở câu “trông giống Trello”. Tiêu chí này quan trọng hơn RAM, vì board không phù hợp với mọi thứ có deadline.

  • Planka chỉ là một công cụ board: project, board, list, card, label, checklist, comment và attachment. Tính đến tháng 8 năm 2026, các chế độ xem calendar và map là tính năng Pro.
  • Vikunja cung cấp 4 chế độ xem cho cùng một tập task: List, Kanban, Table và Gantt. Một task chỉ tồn tại một lần. Bạn chuyển chế độ xem thay vì tạo bản sao.
  • Kanboard cung cấp board với giới hạn work-in-progress, subtask, attachment, comment, action tự động và một query language nhỏ để lọc. Trang chủ của sản phẩm ghi rằng “Số lượng tính năng được cố ý giới hạn”, đây là mô tả khá chính xác.
  • Wekan cung cấp board với swimlane, cùng checklist, custom field, REST (representational state transfer) API và webhook.
  • Focalboard cung cấp các chế độ xem board, table và calendar trên cùng một tập card. Sản phẩm này được liệt kê để đầy đủ thông tin.

Nếu điều bạn thực sự cần là một wiki có gắn thêm tính năng theo dõi task, thì đây là phép so sánh không phù hợp. BookStack, Wiki.js và Outline trình bày nhóm sản phẩm đó, còn các lựa chọn Notion self-hosted tập trung vào workspace all-in-one.

Truy cập nhiều người dùng và single sign-on

Planka hỗ trợ OpenID Connect trong bản Community miễn phí. File Compose chính thức chứa sẵn các thiết lập ở dạng comment, trong đó có OIDC_ISSUER, OIDC_CLIENT_IDOIDC_CLIENT_SECRET, nên bạn chỉ cần bỏ comment thay vì nâng cấp. Vai trò guest dành cho người ngoài tổ chức là tính năng Pro.

Vikunja hỗ trợ OpenID Connect với nhiều provider cùng lúc. Đặt VIKUNJA_AUTH_OPENID_ENABLED=true, sau đó thêm một block biến VIKUNJA_AUTH_OPENID_PROVIDERS_<ID>_* cho mỗi provider. Vikunja cũng có team và chức năng chia sẻ theo từng project. Đây mới là những gì một tổ chức 20 người thực sự cần.

Wekan hỗ trợ LDAP (lightweight directory access protocol), OAuth2, OIDC và SAML. Kanboard tích hợp sẵn LDAP và có plugin OAuth2 generic cho các trường hợp còn lại, cùng với role và group theo từng project. Server standalone của Focalboard hoàn toàn không có single sign-on. Đây là lý do thứ hai để không chọn sản phẩm này.

Các sản phẩm này đều có thể kết hợp với identity provider Authentik do bạn tự vận hành. Đây thường là lựa chọn tốt hơn so với việc cấp cho 20 người một password riêng cho từng app.

Bạn có thể import các board Trello không?

Planka có quy trình đơn giản nhất. Export board từ Trello dưới dạng JSON, tạo một board trong Planka, nhấp vào Import rồi chọn Trello. Đọc các giới hạn trước, vì đây là những giới hạn thực tế: users và attachments không được import, mỗi card chỉ import được một checklist, và JSON export mặc định của Trello dừng ở 1,000 actions nhưng không cảnh báo rằng dữ liệu đã bị cắt. Tự kiểm tra file trước khi tin tưởng kết quả.

Vikunja import thông qua OAuth flow của Trello, trong Settings rồi đến "Import from other services". Bạn phải enable từng migrator trong config trước khi icon tương ứng xuất hiện, và VIKUNJA_SERVICE_PUBLICURL phải chính xác, vì OAuth redirect diễn ra trong browser của bạn chứ không phải từ server. Vikunja cũng import được dữ liệu từ Todoist, Microsoft To Do, TickTick và Wekan.

Wekan nhận JSON của board Trello được dán vào form import. Kanboard không có Trello importer tích hợp sẵn. Đây là lý do chính để bỏ qua Kanboard nếu bạn cần chuyển nhiều năm dữ liệu Trello.

Trải nghiệm trên thiết bị di động như thế nào?

Vikunja là sản phẩm duy nhất trong 5 sản phẩm có mobile app chính thức. Bản build cho Android và iOS được phát hành cùng mỗi release. Repository của app tự mô tả là alpha, vì vậy hãy xem app như công cụ đi kèm cho web interface, không phải cách truy cập chính. Planka không có app chính thức từ dự án, nhưng web interface của nó responsive và có các client bên thứ ba. Wekan và Kanboard chỉ có web interface. Interface của Kanboard rõ ràng được thiết kế cho màn hình desktop.

Câu hỏi về giấy phép và lý do Planka khác biệt

Planka không còn là open source, và đây là điểm mà phần lớn các bài so sánh bỏ qua. Ban đầu, dự án dùng giấy phép MIT, chuyển sang AGPL-3.0 vào năm 2023, rồi từ dòng 2.0 phát hành theo PLANKA Community License, một giấy phép fair-code do PLANKA Software GmbH nắm giữ. GitHub hiển thị giấy phép là "Other" vì giấy phép này chưa được OSI phê duyệt. Bạn được phép tự host cho người dùng của mình miễn phí, bao gồm mục đích cá nhân, nội bộ, phi lợi nhuận và giáo dục. Việc bán lại quyền truy cập hoặc vận hành Planka dưới dạng dịch vụ cho các công ty khác cần có giấy phép thương mại.

Đối với hai người, đây là một thỏa thuận hợp lý. Đối với một công ty, bạn nên đọc kỹ điều khoản trước khi công việc của hai mươi người được đưa vào đó. Bốn lựa chọn còn lại đều là open source thông thường: Vikunja dùng AGPL-3.0, Wekan và Kanboard dùng MIT, còn Focalboard kết hợp Apache 2.0 và AGPL-3.0.

Các file Compose cố định phiên bản cho 2 lựa chọn

Cố định image tag. latest có nghĩa là lần docker compose pull tiếp theo có thể đưa bạn lên một major version khác. Các major version sẽ chạy database migration mà bạn không thể dễ dàng hoàn tác. Cả 2 file bên dưới đều là file upstream, với tag được cố định ở một bản release cụ thể.

Vikunja dùng SQLite, 1 container:

services:
  vikunja:
    image: vikunja/vikunja:2.5.0
    restart: unless-stopped
    environment:
      VIKUNJA_SERVICE_PUBLICURL: https://tasks.example.com
      VIKUNJA_SERVICE_SECRET: replace-with-a-long-random-string
      VIKUNJA_SERVICE_TIMEZONE: Europe/Berlin
      VIKUNJA_DATABASE_TYPE: sqlite
      VIKUNJA_DATABASE_PATH: /app/vikunja/files/vikunja.db
    ports:
      - "127.0.0.1:3456:3456"
    volumes:
      - ./files:/app/vikunja/files

Trước tiên, tạo data directory với owner phù hợp. Container chạy bằng UID 1000 nên không thể ghi vào directory thuộc root:

mkdir -p files && sudo chown 1000 files
docker compose up -d
docker compose ps
curl -sf http://127.0.0.1:3456/api/v1/info

Một stack hoạt động bình thường sẽ hiển thị service ở trạng thái running. Info endpoint trả về JSON có trường version. Nếu endpoint này trả về lỗi connection refused, container đã bị thoát. docker compose logs vikunja cho biết nguyên nhân. Lỗi quyền trên database file là nguyên nhân thường gặp.

Planka dùng PostgreSQL, 2 container:

services:
  planka:
    image: ghcr.io/plankanban/planka:2.1.1
    restart: unless-stopped
    volumes:
      - data:/app/data
    ports:
      - "127.0.0.1:3000:1337"
    environment:
      - BASE_URL=https://boards.example.com
      - DATABASE_URL=postgresql://postgres@postgres/planka
      - SECRET_KEY=replace-with-openssl-rand-hex-64
    depends_on:
      postgres:
        condition: service_healthy

  postgres:
    image: postgres:16-alpine
    restart: unless-stopped
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=planka
      - POSTGRES_HOST_AUTH_METHOD=trust
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres -d planka"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  data:
  db-data:

POSTGRES_HOST_AUTH_METHOD=trust có nghĩa là PostgreSQL chấp nhận mọi connection mà không cần password. Cấu hình này chỉ an toàn vì database port không được publish ra host. Do đó, thành phần duy nhất có thể truy cập database là container còn lại trên cùng Compose network. Không thêm entry ports: vào postgres service.

Không stack nào trong 2 stack này nên kết nối trực tiếp với Internet. Cả 2 đều bind vào 127.0.0.1, vì vậy hãy đặt reverse proxy phía trước và thực hiện TLS termination (transport layer security) tại đó. Đặt Traefik phía trước nhiều ứng dụng Compose là cách thường dùng khi bạn host nhiều hơn 1 ứng dụng. Hướng dẫn cơ bản về Docker Compose giải thích các phần trong những file này mà trang này không đề cập.

Board của bạn là một database, vì vậy hãy backup

Một board tool có thể âm thầm fail. Không ai nhận ra bản backup bị thiếu cho đến khi một volume biến mất; file SQLite bị hỏng vẫn có thể mở bình thường rồi chỉ báo lỗi database disk image is malformed tuần sau.

Không bao giờ copy file SQLite đang được sử dụng bằng cp. Bản copy có thể ghi lại đúng lúc một thao tác ghi đang diễn ra. Khi đó archive trông vẫn đầy đủ nhưng sau khi restore lại bị thiếu row. Hãy stop service trong vài giây cần để copy:

docker compose stop vikunja
tar czf vikunja-$(date +%F).tgz files
docker compose start vikunja

Với Planka, hãy dump PostgreSQL thay vì copy data directory của một cluster đang chạy. Đồng thời lấy volume uploads riêng, vì attachment không nằm trong database:

docker compose exec -T postgres pg_dump -U postgres -Fc planka > planka-db.dump
docker volume ls
docker run --rm -v planka_data:/data -v "$PWD":/backup alpine \
  tar czf /backup/planka-files.tgz -C /data .

docker volume ls in ra tên volume thực tế. Tên này là tên Compose project của bạn theo sau bởi _data. Nếu truyền vào một tên không tồn tại, Docker sẽ tạo volume rỗng và tạo archive hợp lệ nhưng không có dữ liệu, không báo lỗi. Vì vậy, hãy kiểm tra kích thước file sau đó.

Tiếp theo, hãy restore một lần vào scratch stack trên cùng máy chủ và mở một card mà bạn còn nhớ. Một bản backup chưa từng được restore chỉ là phỏng đoán. Hãy gửi archive ra khỏi server nữa, vì bản copy lưu trên VPS mà bạn đang bảo vệ không phải là backup. backup restic từ VPS trình bày phần này.

Hai khuyến nghị

Hai người dùng trên một VPS 2 GB: chạy Planka. Giao diện và cách hoạt động của Planka gần với Trello nhất. Chức năng import từ Trello dùng một file có thể kéo thả vào. Mức sử dụng bộ nhớ khi idle là 280 MB, nên phần lớn 2 GB vẫn còn trống cho reverse proxy và các dịch vụ khác bạn host. Community License cho phép một team nội bộ gồm hai người sử dụng miễn phí. Nếu không muốn phụ thuộc vào source-available licence, hãy dùng Vikunja trên SQLite. Mức sử dụng bộ nhớ của Vikunja là 110 MB, phù hợp với cùng máy đó.

Hai mươi người trong một tổ chức: chạy Vikunja trên PostgreSQL. Ở quy mô này, bạn cần OpenID Connect thay vì hai mươi mật khẩu local. Bạn cần teams và tính năng chia sẻ theo từng project. Nhiều công việc cũng không phù hợp với board, nên các chế độ xem List, Table và Gantt không còn chỉ là phần bổ sung. AGPL-3.0 cũng loại bỏ vấn đề licence khi số người dùng tăng. Hãy dùng PostgreSQL thay vì SQLite, đặt Vikunja phía sau reverse proxy và lưu bản dump hằng ngày ở một nơi khác với server đó.

Nếu máy có dưới 1 GB RAM thì không lựa chọn nào ở trên phù hợp. Hãy dùng Kanboard với mức sử dụng bộ nhớ 70 MB, chấp nhận việc phải nhập lại các card Trello, rồi dùng phần bộ nhớ tiết kiệm được cho một dịch vụ khác trong danh sách tự host nên cân nhắc cho năm 2026. Hướng dẫn cài đặt chi tiết cho công cụ bạn chọn nên nằm trong một guide riêng. Trang này chỉ giúp bạn chọn công cụ.

FAQ

Bản thay thế Trello tự host nào dùng ít RAM nhất?

Kanboard dùng khoảng 70 MB khi idle, vì đây là ứng dụng PHP dùng SQLite và không giữ dữ liệu trong memory giữa các request. Vikunja đứng tiếp theo với khoảng 110 MB dưới dạng một Go binary duy nhất. Wekan là ứng dụng nặng nhất, khoảng 750 MB, vì Meteor giữ một lớp live query trong memory của Node cho mỗi trình duyệt đang kết nối. Hãy tự đo bằng docker stats sau khi stack đã idle, vì đây chỉ là các con số điển hình và không phải mức đảm bảo.

Tôi có thể import board Trello vào công cụ tự host không?

Planka và Wekan đều nhận trực tiếp file JSON export của board Trello. Vikunja import thông qua OAuth flow của Trello, và phải bật migrator trong config trước khi migrator xuất hiện trong interface. Kanboard không có importer tích hợp sẵn. Có 2 giới hạn cần tính đến: Planka không import user hoặc attachment và chỉ xử lý được 1 checklist cho mỗi card; JSON export mặc định của Trello dừng ở 1,000 action mà không cảnh báo rằng dữ liệu đã bị cắt bớt.

Focalboard còn là lựa chọn tốt trong 2026 không?

Không. Bản release standalone cuối cùng, v8.0.0, được phát hành vào tháng 6 năm 2024, tức 783 ngày trước thời điểm so sánh này được kiểm tra vào ngày 5 tháng 8 năm 2026. README cho biết repository hiện không còn được maintain. Mattermost chỉ tiếp tục phát triển board dưới dạng plugin trong một repository riêng, nên phần server mà bạn sẽ tự host mới là phần đã dừng phát triển. Thay vào đó, hãy chọn Planka hoặc Vikunja.

Planka còn là open source không?

Không theo định nghĩa của OSI. Planka từng dùng MIT, chuyển sang AGPL-3.0 vào năm 2023 và được phát hành theo PLANKA Community License từ version 2.0 trở đi. Tự host được miễn phí cho mục đích cá nhân, nội bộ, phi lợi nhuận và giáo dục. Việc bán lại quyền truy cập hoặc chạy Planka như một service cho bên thứ ba cần commercial licence. Calendar view, guest role và recurring card nằm sau gói Pro. Nếu bắt buộc phải dùng licence được OSI phê duyệt, Vikunja dùng AGPL-3.0 còn Kanboard dùng MIT.

Tôi có cần PostgreSQL không, hay SQLite là đủ?

Vikunja, Kanboard và Focalboard mặc định dùng SQLite. SQLite phù hợp với một nhóm nhỏ người dùng trên một server. Planka yêu cầu PostgreSQL và không cung cấp tùy chọn SQLite. Hãy chuyển sang PostgreSQL khi có nhiều người cùng ghi dữ liệu, vì SQLite tuần tự hóa các thao tác ghi và instance bận sẽ bắt đầu trả về database is locked. Cũng không được đặt file SQLite trên network share: tài liệu Kanboard cảnh báo không dùng SQLite trên NFS chính vì lý do này.

#kanban#project-management#planka#vikunja#tự lưu trữ#Docker