[Open Source] #153 - Donetick: Hệ thống quản lý việc nhà thông minh với kiến trúc Modular Monolith, Go 1.24 và cơ chế Dependency Injection từ Uber fx
Trong mảng ứng dụng quản lý tác vụ (Task Management), bài toán khó nhất không nằm ở việc tạo danh sách, mà là lập lịch thông minh cho các công việc lặp lại và điều phối người làm trong một nhóm (gia đình, câu lạc bộ). Donetick ra đời như một giải pháp tự vận hành (self-hosted) mạnh mẽ, thay thế cho các ứng dụng trả phí, mang lại khả năng kiểm soát dữ liệu tuyệt đối và hiệu suất vượt trội nhờ sức mạnh của ngôn ngữ Go.
Dưới góc độ kỹ thuật, Donetick là một Case Study mẫu mực về việc ứng dụng Uber fx để quản lý vòng đời ứng dụng và kỹ thuật Adaptive Scheduling để tối ưu hóa lịch trình dựa trên hành vi người dùng.
Github: https://github.com/donetick/donetick
🛠️ 1. Nền tảng công nghệ: Hiệu năng cực đại và Type-safe
Donetick sử dụng những công nghệ tiên tiến nhất trong hệ sinh thái Golang để đảm bảo hệ thống vừa nhẹ vừa có khả năng mở rộng:
- Backend Core (Go 1.24): Tận dụng các cải tiến mới nhất về hiệu năng runtime và bộ dọn rác (GC) của Go 1.24.
- DI Orchestration (Uber fx): Thay vì khởi tạo các dependency thủ công gây rối rắm (spaghetti code), Donetick sử dụng Uber fx. Đây là một framework Dependency Injection mạnh mẽ, giúp tự động hóa việc kết nối Database, Repository và Services, đồng thời quản lý các giai đoạn Start/Stop của ứng dụng một cách nguyên tử.
- Web Engine (Gin Gonic): Đảm nhiệm vai trò điều phối API với tốc độ xử lý hàng triệu request mỗi giây và mức chiếm dụng bộ nhớ cực thấp.
- Database & ORM (GORM): Cung cấp lớp trừu tượng hóa dữ liệu hoàn hảo, hỗ trợ linh hoạt từ SQLite cho người dùng cá nhân đến PostgreSQL/MySQL cho các tổ chức lớn.
- Real-time Layer: Hỗ trợ song song WebSockets và SSE, đảm bảo mọi thay đổi về trạng thái công việc được đẩy ngay lập tức tới tất cả các thành viên trong nhóm.
🏗️ 2. Trụ cột kiến trúc: Modular Monolith và Clean Architecture
Kiến trúc của Donetick được thiết kế để dễ dàng bảo trì và kiểm thử (Testability):
- Modular Monolith: Hệ thống được chia thành các package độc lập (
internal/auth,internal/chore,internal/circle). Mỗi module tự quản lý logic riêng nhưng vẫn nằm chung trong một binary duy nhất, giúp việc triển khai (Deployment) cực kỳ đơn giản. - Repository Pattern: Tách biệt hoàn toàn logic truy vấn dữ liệu khỏi logic nghiệp vụ. Điều này cho phép thay đổi hệ quản trị cơ sở dữ liệu mà không cần sửa đổi bất kỳ dòng code xử lý công việc nào.
- Advanced Scheduling Logic: Trái tim của hệ thống nằm ở bộ máy lập lịch. Nó không chỉ hỗ trợ các kiểu lặp lại đơn giản mà còn xử lý được các logic phức tạp như "Ngày làm việc cuối cùng của tháng" hoặc "Thứ Hai đầu tiên sau mỗi 2 tuần".
🔄 3. Workflow: Vòng đời hoàn thành một tác vụ lặp lại (Sequence Diagram)
Sơ đồ mô tả quy trình từ khi người dùng đánh dấu hoàn thành đến khi lịch trình tiếp theo được thiết lập:

⚡ 4. Các kỹ thuật "Pro-level" trong mã nguồn
- Adaptive Scheduling Algorithm: Một kỹ thuật tinh tế giúp gợi ý ngày đến hạn tiếp theo dựa trên lịch sử. Nếu người dùng thường xuyên hoàn thành muộn 2 ngày so với dự kiến, hệ thống có thể tự động điều chỉnh lịch trình tiếp theo để phù hợp với nhịp độ thực tế.
- MFA Lifecycle Management: Tích hợp xác thực đa yếu tố (TOTP) với quy trình quản lý session nghiêm ngặt. Khi bật MFA, hệ thống sử dụng một JWT trung gian (Pre-auth token) chỉ có quyền truy cập endpoint xác thực mã OTP trước khi cấp Access Token chính thức.
- Assignee Rotation Strategies: Hỗ trợ các thuật toán gán việc tự động: Round-robin (Xoay vòng), Random (Ngẫu nhiên), và Load-balance (Gán cho người đang có ít việc nhất trong nhóm).
- Security Guard Middleware: Một tính năng bảo mật chủ động. Khi khởi động, hệ thống tự động kiểm tra độ phức tạp của mã bí mật JWT (Secret Key) và các biến môi trường nhạy cảm. Nếu không đạt chuẩn bảo mật, ứng dụng sẽ từ chối khởi chạy để ngăn ngừa rủi ro bị tấn công brute-force.
⚖️ 5. So sánh chiến lược
| Tiêu chí | Donetick | Todoist / TickTick | Home Assistant Chores |
|---|---|---|---|
| Quyền sở hữu dữ liệu | Tuyệt đối (Self-host) | Phụ thuộc nhà cung cấp | Tuyệt đối |
| Chi phí | Miễn phí (Mã nguồn mở) | Thuê bao hàng tháng | Miễn phí |
| Độ phức tạp lập lịch | Rất cao (Chuyên biệt) | Trung bình | Thấp (Cần script thủ công) |
| Xác thực | MFA / OIDC / OAuth2 | OAuth2 | Local Auth |
| Hiệu năng | Cực cao (Golang) | Phụ thuộc mạng/SaaS | Phụ thuộc phần cứng NAS |
✅ Kết luận: Tại sao Donetick là mẫu hình lý tưởng cho ứng dụng Go?
Donetick chứng minh rằng ngay cả với một bài toán quen thuộc như "To-do list", việc áp dụng những kiến trúc chuẩn mực (Uber fx, Clean Architecture) có thể tạo ra một sản phẩm có độ tin cậy và hiệu năng vượt xa mong đợi. Đây là dự án tham khảo tuyệt vời cho bất kỳ ai muốn học cách tổ chức mã nguồn Go một cách chuyên nghiệp.
Đối với các kỹ sư Backend, nghiên cứu Donetick mang lại giá trị về:
- Kỹ thuật quản lý Dependency Injection trong Go.
- Cách xây dựng hệ thống Real-time Sync hiệu quả.
- Tư duy thiết kế Hệ thống lập lịch (Scheduling) có khả năng tùy biến cao.
All rights reserved