Chấm dứt nỗi ám ảnh loạn tab: Tự triển khai Wallabag trên Docker làm thư viện ‘đọc sau’ riêng tư

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

Nghĩa địa của những Favicon chưa đọc

Hãy mở trình duyệt của bạn ngay bây giờ. Nếu bạn thấy một hàng dài hơn 40 favicon nhỏ xíu chẳng thể đọc nổi—một ‘kho báu số’ gồm các bài hướng dẫn mà bạn tự hứa sẽ ‘đọc sau’—thì bạn đang bị khủng hoảng tab rồi đấy. Bạn bắt gặp một bài viết chuyên sâu về định tuyến BGP hoặc một manifest Kubernetes phức tạp ngay khi đang bận triển khai hệ thống. Bạn không thể đọc nó ngay, nên tab đó cứ thế nằm lại. Chẳng mấy chốc, 32GB RAM của bạn bắt đầu gào thét khi Chrome ‘ngốn’ sạch 4GB chỉ để duy trì những trang web ‘thiết yếu’ đó.

Đa số chúng ta cố gắng giải quyết việc này bằng cách quăng link vào Slack, Telegram hoặc bookmark truyền thống. Nhưng cách này hiếm khi hiệu quả. Đến khi bạn thực sự có thời gian để đọc, trang web thường đã sập, nội dung bị khóa sau một bức tường phí 12 USD/tháng, hoặc trang đó đầy rẫy video tự chạy khiến bạn không thể tập trung vào code. Bạn cần kiểm soát nội dung thực tế, chứ không phải một đường link mong manh.

Vấn đề của việc chỉ lưu liên kết

Bookmark thông thường chỉ là các con trỏ dẫn tới máy chủ của người khác. Theo dữ liệu từ Internet Archive, khoảng 25% các link chuyên sâu sẽ biến mất trong vòng một thập kỷ. Nếu nguồn bị xóa, bookmark của bạn sẽ trở thành ngõ cụt. Mặc dù các công cụ SaaS như Pocket hay Instapaper có lưu bộ nhớ đệm (cache) trang web, nhưng chúng có ba rào cản lớn đối với dân kỹ thuật.

Thứ nhất là sự đánh đổi về quyền riêng tư. Các nền tảng này theo dõi chính xác những gì bạn nghiên cứu, đây là một rủi ro khi bạn đang kiểm tra các lỗi bảo mật nội bộ. Thứ hai, các tính năng quan trọng như tìm kiếm toàn văn (full-text search) thường bị khóa sau gói trả phí 50 USD/năm.

Nếu bạn đã có sẵn HomeLab, đó là một sự lãng phí tiền bạc. Cuối cùng, các trình phân tích ‘độ dễ đọc’ thương mại thường làm hỏng các khối mã (code blocks). Chúng xóa sạch thụt đầu dòng và làm mất tính năng làm nổi bật cú pháp (syntax highlighting), biến một đoạn script Python sạch đẹp thành một mớ văn bản thô không thể đọc nổi.

Bức tranh về các giải pháp Self-hosted

Một vài lựa chọn mã nguồn mở đang chiếm ưu thế trong các cuộc thảo luận cộng đồng:

  • Shiori: Một trình quản lý gọn nhẹ viết bằng Go. Nó cực kỳ nhanh nhưng đôi khi thất bại khi phân tích các trang tài liệu phức tạp sử dụng React.
  • Linkding: Hoàn hảo cho việc gắn thẻ (tagging) tốc độ cao và quản lý liên kết, tuy nhiên nó thiếu chế độ đọc ‘không xao nhãng’ bản địa.
  • Wallabag: Tiêu chuẩn vàng cho việc lưu trữ chuyên nghiệp. Nó hỗ trợ nhiều người dùng, cung cấp API mạnh mẽ và đồng bộ hoàn hảo với các thiết bị đọc sách điện tử như Kindle hoặc Kobo.

Wallabag là lựa chọn hợp lý cho quy trình làm việc chuyên nghiệp. Nó không chỉ lưu lại liên kết; nó trích xuất văn bản bài viết, hình ảnh và định dạng vào một cơ sở dữ liệu nội bộ, có thể tìm kiếm được và thuộc sở hữu của bạn mãi mãi.

Kế hoạch triển khai: Cài đặt với Docker

Chạy Wallabag qua Docker là cách hợp lý nhất để quản lý các phụ thuộc PHP và extension cơ sở dữ liệu của nó. Để hệ thống sẵn sàng cho môi trường thực tế (production), chúng ta sẽ không dùng một container đơn lẻ mong manh. Chúng ta sẽ triển khai một stack sử dụng Docker Compose, bao gồm MariaDB để lưu trữ và Redis để làm bộ nhớ đệm. Cấu hình này vẫn hoạt động mượt mà ngay cả khi bạn đã lưu hơn 5.000 bài báo kỹ thuật.

1. Tổ chức hệ thống tệp

Hãy tạo một thư mục riêng cho stack của bạn. Việc tổ chức bài bản sẽ giúp việc sao lưu hàng tuần trở nên dễ dàng hơn nhiều.

mkdir -p ~/homelab/wallabag && cd ~/homelab/wallabag
mkdir -p images db_data redis_data

2. Cấu hình Docker Compose Stack

Chúng ta sẽ sử dụng image chính thức của Wallabag. Tôi đã dùng MariaDB trong cấu hình này nhiều năm; nó rất ổn định và chỉ mất chưa đầy 30 giây để dump dữ liệu sao lưu. Hãy thay your-ip-or-domain bằng địa chỉ máy chủ thực tế của bạn.

version: '3.8'
services:
  wallabag:
    image: wallabag/wallabag
    container_name: wallabag
    environment:
      - MYSQL_ROOT_PASSWORD=vault_secure_password
      - SYMFONY__ENV__DATABASE_DRIVER=pdo_mysql
      - SYMFONY__ENV__DATABASE_HOST=db
      - SYMFONY__ENV__DATABASE_PORT=3306
      - SYMFONY__ENV__DATABASE_NAME=wallabag
      - SYMFONY__ENV__DATABASE_USER=wallabag
      - SYMFONY__ENV__DATABASE_PASSWORD=wallabag_pass
      - SYMFONY__ENV__DOMAIN_NAME=http://192.168.1.50:8080
      - SYMFONY__ENV__REDIS_HOST=redis
      - SYMFONY__ENV__FOSUSER_REGISTRATION=false
    ports:
      - "8080:80"
    volumes:
      - ./images:/var/www/wallabag/web/assets/images
    depends_on:
      - db
      - redis

  db:
    image: mariadb
    container_name: wallabag_db
    environment:
      - MYSQL_ROOT_PASSWORD=vault_secure_password
      - MYSQL_DATABASE=wallabag
      - MYSQL_USER=wallabag
      - MYSQL_PASSWORD=wallabag_pass
    volumes:
      - ./db_data:/var/lib/mysql

  redis:
    image: redis:alpine
    container_name: wallabag_redis
    volumes:
      - ./redis_data:/data

3. Kích hoạt

Khởi chạy stack ở chế độ chạy ngầm (detached mode). Hãy đợi khoảng 60 giây trong lần chạy đầu tiên; Wallabag cần di trú (migrate) sơ đồ cơ sở dữ liệu và thiết lập các thư mục nội bộ.

docker-compose up -d

Theo dõi log khởi tạo để đảm bảo mọi thứ kết nối chính xác:

docker logs -f wallabag

Khi log đã ổn định, hãy truy cập trình duyệt tới địa chỉ http://your-server-ip:8080. Sử dụng thông tin đăng nhập mặc định wallabag / wallabag. Hãy thay đổi chúng ngay lập tức trong phần cài đặt hồ sơ.

Tinh chỉnh quy trình làm việc

Một cơ sở dữ liệu trống rỗng thì chẳng có ích gì. Để thực sự thay thế được Pocket, bạn cần giảm bớt các thao tác rườm rà khi lưu nội dung.

Cầu nối trình duyệt

Hãy cài đặt tiện ích mở rộng (extension) Wallabag cho Chrome hoặc Firefox. Nó cho phép bạn lưu bài viết chỉ với một cú nhấp chuột. Trong cấu hình extension, hãy liên kết với URL của bạn và tạo một API token từ phần ‘Developer’ của giao diện Wallabag. Nó hoạt động y hệt các giải pháp thương mại nhưng giữ dữ liệu của bạn nằm ở nội bộ.

Đồng bộ di động và ngoại tuyến

Các ứng dụng trên Android và iOS rất tuyệt vời. Chúng tải xuống toàn bộ văn bản và hình ảnh để đọc ngoại tuyến. Đây là cứu cánh trong những chuyến bay hoặc khi đi làm với sóng 5G chập chờn. Vì bạn tự host backend, tốc độ đồng bộ chỉ bị giới hạn bởi tốc độ tải lên của mạng nhà bạn.

Chuyển đổi cho thiết bị E-Ink

Những bài viết nghiên cứu kiến trúc dài dằng dặc thật khó chịu khi đọc trên màn hình 27 inch. Wallabag tạo ra các luồng RSS tùy chỉnh cho danh sách chưa đọc của bạn. Bạn có thể sử dụng các công cụ như ‘P2K’ (Push to Kindle) để tự động gửi các bài báo đã lưu vào máy đọc sách mỗi sáng. Điều này biến việc nghiên cứu kỹ thuật khô khan thành một trải nghiệm đọc sách thoải mái, không gây mỏi mắt.

Bảo trì dài hạn

Việc duy trì Wallabag rất nhẹ nhàng. Vì nó đã được container hóa, việc cập nhật chỉ tốn hai câu lệnh: docker-compose pulldocker-compose up -d. Hãy thiết lập một cron job đơn giản để rsync thư mục ./db_data mỗi tuần một lần lên NAS hoặc lưu trữ đám mây. Cuối cùng, bạn sẽ có một thư viện vĩnh viễn, có thể tìm kiếm được cho mọi đột phá kỹ thuật mà bạn tìm thấy. Không link chết. Không quảng cáo. Chỉ có kiến thức của bạn, dưới sự kiểm soát của bạn.

Share: