Tự triển khai Vikunja trên Docker: Giải pháp thay thế Todoist hiện đại và riêng tư

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

Cái giá đắt của các công cụ năng suất ‘Miễn phí’

Quản lý dự án không nên giống như một công việc làm thêm chỉ để giữ mọi thứ ngăn nắp. Tôi đã dành nhiều năm loay hoay với Todoist cho các việc vặt hàng ngày, Trello cho các dự án cá nhân và Jira cho các lỗi kỹ thuật. Dù chúng hoạt động tốt, cuối cùng tôi cũng vấp phải rào cản: dữ liệu bị mắc kẹt trong các hệ thống đóng, và các tính năng thiết yếu như biểu đồ Gantt bị khóa sau các gói đăng ký 10$/tháng. Nếu bạn đã mệt mỏi với việc phải trả phí hàng tháng và muốn toàn quyền kiểm soát dữ liệu dự án, đã đến lúc mang các tác vụ của bạn về “nhà”.

Các nền tảng SaaS ưu tiên doanh thu định kỳ hơn là quyền làm chủ của người dùng. Đối với những người đam mê HomeLab, giải pháp thay thế đã quá rõ ràng: tự triển khai (self-hosting). Vikunja là giải pháp mà tôi cuối cùng đã chọn. Đây là một công cụ mã nguồn mở mạnh mẽ, gọn nhẹ, xử lý tốt các bảng Kanban, bảng dữ liệu cấu trúc và biểu đồ Gantt phức tạp mà không gặp chút khó khăn nào. Nó mang lại sự bóng bẩy của một ứng dụng thương mại với tính riêng tư của một cơ sở dữ liệu cục bộ.

Bắt đầu nhanh: Triển khai trong 5 phút

Hãy mở terminal lên. Nếu bạn đã có sẵn Docker và Docker Compose, bạn có thể triển khai một instance Vikunja đầy đủ nhanh hơn cả thời gian pha một ấm cà phê. Chúng ta sẽ sử dụng cấu trúc ba container để tách biệt cơ sở dữ liệu, logic và giao diện.

Đầu tiên, hãy tạo một thư mục dự án riêng:

mkdir vikunja && cd vikunja
nano docker-compose.yml

Sao chép cấu hình này vào tệp của bạn. Lưu ý: Tôi đã cập nhật VIKUNJA_API_URL để đảm bảo nó hoạt động khi bạn truy cập từ các thiết bị khác trong mạng nội bộ.

services:
  db:
    image: postgres:14-alpine
    restart: always
    environment:
      POSTGRES_USER: vikunja
      POSTGRES_PASSWORD: HayThayMatKhauBaoMatNay
      POSTGRES_DB: vikunja
    volumes:
      - ./db:/var/lib/postgresql/data

  api:
    image: vikunja/api
    restart: always
    environment:
      VIKUNJA_DATABASE_HOST: db
      VIKUNJA_DATABASE_PASSWORD: HayThayMatKhauBaoMatNay
      VIKUNJA_DATABASE_TYPE: postgres
      VIKUNJA_DATABASE_USER: vikunja
      VIKUNJA_DATABASE_NAME: vikunja
      # Tạo một chuỗi ngẫu nhiên cho secret bên dưới
      VIKUNJA_SERVICE_JWTSECRET: "sh4red-secret-k3y-change-me"
    volumes:
      - ./files:/app/vikunja/files
    depends_on:
      - db

  frontend:
    image: vikunja/frontend
    restart: always
    ports:
      - 8080:80
    environment:
      # Thay 'your-server-ip' bằng IP máy chủ thực tế của bạn (ví dụ: 192.168.1.50)
      VIKUNJA_API_URL: http://your-server-ip:8080/api/v1
    depends_on:
      - api

Sau khi lưu, hãy khởi chạy stack:

docker compose up -d

Truy cập http://your-server-ip:8080 trên trình duyệt. Bạn sẽ thấy màn hình chào mừng sạch sẽ của Vikunja. Nhấp vào “Register” để tạo tài khoản admin chính và bắt đầu xây dựng danh sách công việc đầu tiên của bạn.

Tại sao kiến trúc này lại quan trọng

Hiểu được lý do đằng sau cách thiết lập là điều phân biệt giữa một người chơi hệ phong trào và một chuyên gia. Vikunja sử dụng kiến trúc tách biệt (decoupled): API (phần logic), Frontend (giao diện) và Database (lưu trữ). Đây không chỉ là thuật ngữ kỹ thuật; nó có nghĩa là nếu bạn muốn thay đổi giao diện web bằng một CLI tùy chỉnh hoặc ứng dụng di động, phần lõi vẫn được giữ nguyên.

Tại sao phải tách biệt chúng? Bởi vì Frontend là một ứng dụng tĩnh được thực thi bởi trình duyệt của bạn. Đây là lý do tại sao VIKUNJA_API_URL lại cực kỳ quan trọng. Nếu bạn để nó là ‘localhost’, trình duyệt sẽ cố gắng tìm API trên máy tính cá nhân của bạn thay vì trên máy chủ. Nếu sau này bạn đưa nó ra sau một reverse proxy như Nginx Proxy Manager, bạn chỉ cần cập nhật URL này thành tên miền của mình.

Tăng tốc hiệu suất với Redis

Khi danh sách ‘HomeLab Upgrades’ của tôi đạt tới 1.200 mục, giao diện bắt đầu có cảm giác hơi chậm. Việc thêm Redis làm lớp đệm (cache) đã giúp thời gian tải bảng điều khiển của tôi giảm từ 1,5 giây xuống dưới 200ms. Chỉ cần thêm dịch vụ Redis vào tệp YAML của bạn và trỏ API tới đó bằng cách sử dụng VIKUNJA_CACHE_TYPE: redis.

Bảo mật và Thông báo

Một trình quản lý công việc mà không nhắc nhở bạn thì chỉ là một “nghĩa địa kỹ thuật số”. Để gửi lời nhắc qua email, bạn cần một kết nối SMTP. Nếu bạn sử dụng tài khoản Gmail có bảo mật 2 lớp (2FA), bạn sẽ cần Mật khẩu ứng dụng gồm 16 ký tự. Hãy thêm thông tin đăng nhập SMTP của bạn vào các biến môi trường API để đảm bảo bạn không bao giờ lỡ hạn chót nữa.

Hãy khóa máy chủ của bạn sau khi đội ngũ đã tham gia đầy đủ. Việc mở đăng ký tự do là thỏi nam châm thu hút bot. Bằng cách đặt VIKUNJA_SERVICE_ENABLEREGISTRATION: "false", bạn đảm bảo HomeLab của mình vẫn là một thánh địa riêng tư.

Mẹo quy trình làm việc thực tế

Công cụ chỉ tốt khi bạn có thói quen sử dụng tốt. Đây là cách tôi thực sự sử dụng Vikunja mỗi ngày:

  • Quy tắc 2 phút: Tôi sử dụng danh mục ‘Incoming’ cho mọi ý tưởng chợt nảy ra. Nếu việc đó mất ít hơn 2 phút, tôi sẽ làm ngay lập tức. Nếu không, nó sẽ được ấn định ngày hết hạn.
  • Trực quan hóa tiến độ: Sử dụng Kanban cho các dự án đang hoạt động như ‘Di chuyển máy chủ’. Việc nhìn thấy các tác vụ chuyển từ ‘Đang kiểm thử’ sang ‘Hoàn thành’ mang lại cảm giác thỏa mãn về tâm lý mà một dấu tích đơn giản không thể so sánh được.
  • Đồng bộ mọi nơi: Tải ứng dụng di động từ F-Droid. Nó kết nối trực tiếp với API tự triển khai của bạn, mang lại sự tiện lợi tương đương Todoist mà không phải đánh đổi quyền riêng tư đám mây.
  • Di chuyển dễ dàng: Tôi đã chuyển 45 dự án đang hoạt động từ Todoist chỉ trong chưa đầy ba phút bằng công cụ nhập (importer) có sẵn. Nó thậm chí còn giữ nguyên các nhãn ưu tiên và các ngày lặp lại.

Tự triển khai Vikunja lấp đầy khoảng trống giữa sự ‘quá đơn giản’ và ‘nỗi ác mộng của doanh nghiệp’. Nó nhanh, riêng tư và mở rộng theo tham vọng của bạn. Đừng thuê công cụ năng suất nữa, hãy sở hữu nó.

Share: