2 điểm bởi GN⁺ 2025-12-31 | 1 bình luận | Chia sẻ qua WhatsApp
  • FediMeteodịch vụ thông tin thời tiết toàn cầu khởi đầu từ một FreeBSD VPS giá 4 euro, tự động đăng thời tiết của từng thành phố thông qua Fediverse
  • Mỗi quốc gia được tách riêng và quản lý bằng FreeBSD jail, sử dụng phần mềm snacOpen-Meteo API để lấy dữ liệu rồi đăng ở định dạng Markdown
  • Hệ thống tự động cập nhật mỗi 6 giờ, hỗ trợ 39 jail, 2937 thành phố thuộc 38 quốc gia, và đã tăng lên hơn 7700 người theo dõi
  • Dự án từng gặp nhiều vấn đề vận hành như rò rỉ API key, lỗi tính toán tọa độ, vấn đề dịch ngôn ngữ, nhưng đã được ổn định nhờ cải thiện bộ nhớ đệm và hỗ trợ đa ngôn ngữ
  • Đây được đánh giá là một ví dụ cho thấy ngay cả với hạ tầng chi phí thấp vẫn có thể xây dựng dịch vụ toàn cầu hiệu quả và tự chủ

Tổng quan dự án

  • FediMeteo là dịch vụ thông báo thời tiết tự động dựa trên Fediverse bắt đầu từ sở thích cá nhân
    • Người tạo ra nó bắt đầu từ mong muốn được xem trực tiếp thời tiết của thành phố mình trên timeline
    • Dịch vụ tạo tài khoản theo từng thành phố (bot) để định kỳ đăng thời tiết của từng nơi
  • FreeBSD được chọn làm hệ điều hành, và jail được tách theo từng quốc gia để dễ quản lý và tăng cường bảo mật
  • Thử nghiệm ban đầu được thực hiện trên một VPS tại Đức, và hiện đang vận hành trên VPS 4 euro ở Milan, Ý

Nguyên tắc thiết kế

  • Tách instance theo từng quốc gia để tăng khả năng quản lý và bảo mật, đồng thời có thể di chuyển riêng lẻ khi cần
  • Nguồn dữ liệu được chọn giữa wttr.in và Open-Meteo, ưu tiên tính thân thiện với mã nguồn mở và độ tin cậy
  • Tăng cường khả năng tiếp cận: ngôn ngữ bản địa, tương thích với trình duyệt văn bản, dùng emoji, không phụ thuộc JavaScript
  • Tuân theo triết lý Unix, duy trì cấu trúc trong đó các thành phần nhỏ phối hợp với nhau
  • Chọn snac làm phần mềm cốt lõi nhờ hỗ trợ ActivityPub, tạo RSS, tiêu thụ ít tài nguyên và biên dịch nhanh

Triển khai kỹ thuật

  • Mỗi jail hoạt động độc lập, với script Python lấy dữ liệu cho từng thành phố rồi chuyển sang Markdown
    • Tính toán tọa độ bằng geopy rồi gọi Open-Meteo API
    • Gửi bài đăng bằng lệnh note của snac, không cần tự quản lý API key bên ngoài
  • Script post.sh duyệt qua toàn bộ thành phố để tự động tạo và đăng bài
    • cron chạy mỗi 6 giờ, trạng thái được theo dõi bằng Uptime-Kuma
  • Tên thành phố được quản lý bằng tệp (cities.txt), khi thêm thành phố mới sẽ tự động được phản ánh

Tăng trưởng và phản hồi

  • Ban đầu thử nghiệm chủ yếu ở Ý, sau đó mở rộng sang các nước châu Âu
  • Sau khi FediFollows giới thiệu dự án, lượng người theo dõi tăng mạnh và yêu cầu từ người dùng ở nhiều nước cũng gia tăng
  • Đã bổ sung hỗ trợ đa ngôn ngữ, biểu đạt bằng emoji, và chức năng đăng không công khai (unlisted)
  • Các tính năng tiếp tục được cải thiện nhờ phản hồi nhanh từ cộng đồng lập trình viên

Mở rộng và thách thức kỹ thuật

  • Khi mở rộng toàn cầu, nhiều vấn đề phát sinh như chuyển đổi đơn vị (Celsius/Fahrenheit), chênh lệch múi giờ, phân biệt các thành phố trùng tên
  • Khi mở sang Mỹ và Canada, dự án thêm hơn 1200 thành phố và dùng dấu phân cách __ để phân biệt theo bang/tỉnh
  • Sau khi vượt quá giới hạn của Open-Meteo API miễn phí, dự án đã được cấp API key chuyên dụng
  • Nhờ hiệu quả của FreeBSD và snac, một VPS duy nhất vẫn có thể vận hành nhiều quốc gia

Hiệu năng hệ thống và hạ tầng

  • Cấu hình VPS: FreeBSD 14.3-RELEASE, quản lý jail bằng BastilleBSD
    • Tổng cộng 39 jail, chụp ZFS snapshot mỗi 15 phút, sao lưu ngoài mỗi giờ
    • RAM sử dụng 501MB, tăng nhẹ trong lúc cập nhật
  • Tải CPU trung bình dưới 10%, nhưng có thể tăng lên 70~75% khi cập nhật quy mô lớn
  • Instance tại Mỹ đăng bài cách nhau 5 giây giữa các thành phố, toàn bộ quá trình mất khoảng 2 tiếng rưỡi

Các ví dụ xử lý sự cố

  • Rò rỉ API key: bị lộ do mã debug, đã được sửa ngay và cấp key mới
  • Lỗi geopy: khi phản hồi từ Nominatim thất bại, vấn đề được giải quyết bằng cách đưa vào bộ nhớ đệm tọa độ
  • Vấn đề ngôn ngữ: đã sửa lỗi thiếu bản dịch đa ngôn ngữ và chọn sai ngôn ngữ địa phương

Trạng thái hiện tại (tính đến tháng 12 năm 2025)

  • Quốc gia được hỗ trợ: 38 quốc gia, số thành phố 2937
  • Số người theo dõi trên Fediverse hơn 7707, số người đăng ký RSS không thể ước tính
  • Bao gồm các thành phố lớn ở châu Âu, Bắc Mỹ, châu Á và châu Đại Dương
  • Hệ thống đang vận hành ổn định và vẫn còn khả năng mở rộng thêm quốc gia

Kết luận

  • FediMeteo chứng minh rằng vẫn có thể xây dựng dịch vụ toàn cầu trên hạ tầng chi phí thấp
  • Đây là ví dụ cho thấy giá trị của chủ quyền dữ liệu, cấu trúc đơn giảnhợp tác mã nguồn mở
  • Người tạo dự án nhấn mạnh rằng thông qua dự án này, thời tiết đã trở thành một phương tiện xã hội kết nối con người

1 bình luận

 
GN⁺ 2025-12-31
Ý kiến trên Hacker News
  • Thật sự rất vui khi thấy những dự án nhỏ như thế này phát triển thành công
    Tôi có cảm giác FreeBSD ít thành phần thừa và độ trễ thấp hơn so với các bản phân phối Linux
    Tôi đã thiết lập một VM FreeBSD giá 4 USD/tháng trên Vultr (1GB RAM, 1vCPU), và ngay cả khi chạy Caddy thì mức dùng RAM cũng chỉ khoảng 12%
    Với VM 4GB RAM, 4vCPU thì có vẻ có thể xử lý được khá nhiều lưu lượng
    Tôi muốn làm blog cá nhân thành một webapp dạng văn bản phong cách BBS retro — kiểu server đa luồng Nim + sqlite, chạy trên FreeBSD chỉ với một file nhị phân 4MB, không container hay thư viện JS
    Bài viết này khiến tôi càng vững tin hơn trên con đường chuyển sang FreeBSD

    • Linux thì còn tùy vào bản phân phối và cấu hình
      Hôm nay tôi thử với mkosi(https://github.com/systemd/mkosi), theo chuẩn cài đặt tối thiểu thì Fedora 43 dùng khoảng 130MiB RAM, còn Debian khoảng 100MiB
      Tôi nhớ lần trước khi cài FreeBSD tối thiểu thì cũng tương tự, hoặc dùng hơi nhiều hơn một chút tùy cấu hình ZFS
    • Tôi nhớ là 20 năm trước Linux dùng tài nguyên chỉ bằng một nửa bây giờ
      Có lẽ một phần nguyên nhân là do chuyển sang x64
      Thật thú vị khi cùng một công việc mà giờ lại dùng RAM gấp đôi, nhưng bù lại thì giờ gần như có thể dùng RAM không giới hạn
    • Cũng có những bản phân phối nhẹ như Alpine
      Ngay cả đăng nhập SSH cũng nhanh hơn Ubuntu rất nhiều, và trình quản lý gói apk cũng cực kỳ nhanh
    • Các tiện ích BSD dễ đọc để hiểu cách chúng hoạt động bên trong hơn nhiều so với tiện ích GNU
      Về mô hình giấy phép thì tôi thích phía GNU hơn, nhưng bản thân code thì tôi thích phong cách BSD hơn
    • Nếu là “retro BBS-like web app”, tôi hơi tò mò là bạn đang nói đến BBS quay số ngày xưa, hay là kiểu diễn đàn/bảng tin
      Nếu là kiểu sau thì có thể tham khảo FlaskBB
  • Tôi cũng đang làm một hệ thống dự báo lướt sóng cá nhân tương tự bằng open-meteo
    Nó chỉ xử lý một khu vực, nhưng cũng dễ mở rộng
    Tôi kết hợp dữ liệu biển của open-meteo với dự báo thời tiết ngắn hạn và dài hạn, rồi dùng LLM để chuyển dữ liệu định lượng thành mô tả định tính
    Về cơ bản là tự động hóa việc tôi vốn làm trong đầu
    Nếu ai có ý tưởng gì thì rất mong được góp ý
    https://surfrash.xyz/

    • Tuyệt đấy. Có vẻ sẽ hữu ích cho bất kỳ bãi biển nào
      Tôi thích giao diện thiên về diễn giải thay vì một bức tường dữ liệu
      Cũng xin đề nghị thêm khu vực Manly(NSW, Australia)
  • Đọc rất thú vị
    Giá mà hồi trẻ tôi quan tâm đến *BSD nhiều hơn; giờ tôi đã quá quen với Linux nên khó đổi hẳn
    Có vẻ ZFS và tính năng jail đã giúp việc quản trị trở nên trơn tru
    Tôi dùng podman, nhưng trên Linux thì vẫn chưa thử ZFS
    Tôi định làm một kho lưu trữ cá nhân nên muốn tận dụng deduplication của ZFS

    • Tôi cũng nghĩ vậy
      Tôi đang cố giảm bớt những stack phức tạp kiểu Docker, và dù có systemd, khái niệm jail hay sandbox vẫn khá hấp dẫn
      Tôi thích các công cụ hoạt động tốt chỉ với cấu hình mặc định
  • Cấu hình của “VPS 4 euro” này thật đáng ngạc nhiên
    Ví dụ, VPS rẻ nhất của Hetzner là 2 vCPU, 4GB RAM, 40GB NVMe SSD, nhưng không có kết nối 1Gb/s
    Loại rẻ nhất tôi tìm thấy là Contabo

    • LowEndBox là một trang nổi tiếng chuyên tổng hợp thông tin về các VPS kiểu này
    • Netcup VPS 500 G11s cũng đáng để tham khảo
    • Cần cẩn thận khi so sánh hiệu năng vCPU giữa các nhà cung cấp VPS
      Máy chủ giá rẻ thường dùng phần cứng đời cũ hoặc bị chia sẻ quá mức
      4 vCPU có thể còn chậm hơn 2 vCPU trên máy chủ đời mới
      Tuy vậy, nếu là ứng dụng chủ yếu cần RAM thì đây vẫn có thể là lựa chọn tốt
    • Oracle Cloud cung cấp miễn phí 4 oCPU(ARM), 24GB RAM, 200GB NVMe SSD, băng thông 4Gb/s
      Có người nói là khó giành được instance, nhưng tôi đã dùng ổn hơn 2 năm rồi
      Tài khoản miễn phí có thể bị đóng, nên chuyển sang trả phí sẽ an toàn hơn
    • Trước đây tôi từng dùng VPS buyvm giá 5 USD/năm (256MB RAM), và nó khá hữu ích cho các mục đích đơn giản
  • Thật hay khi thấy ai đó tự xây một dự án đơn giản mà không cần đến hạ tầng khổng lồ như Kubernetes, AWS hay DynamoDB

  • Bản thân Hacker News cũng chạy trên một máy chủ FreeBSD 4 lõi
    Liên kết liên quan

    • Thực ra là cấu trúc 2 gói CPU × 4 lõi × 2 luồng, tổng cộng 16 luồng
    • Dù vậy thì vẫn là lõi chuyên dụng, không chia sẻ với tenant khác
  • Tôi cũng mua một máy chủ có cấu hình tương tự với giá khoảng 5 USD
    Nó có 400~500GB dung lượng lưu trữ, và tôi bắt đầu bằng chương trình khuyến mãi 8 USD trong 3 tháng
    Sau đó sẽ chuyển sang 5 USD/tháng, nhưng niềm vui và cảm giác đắm mình khi tự vận hành VPS là rất lớn
    OVH có giá rẻ và lợi thế là chính sách egress không giới hạn
    Upcloud cũng có đội hỗ trợ rất tốt
    Tôi cũng nghe mẹo là nếu cần hỗ trợ từ OVH thì nên hỏi qua Twitter hoặc Discord
    Bản thân quá trình tối ưu, so sánh giá máy chủ và chất lượng hỗ trợ cũng đã rất thú vị

  • Tôi từng nghĩ đến ý tưởng mua domain “freeofcharge.org” rồi cung cấp qua subdomain những dịch vụ miễn phí có thể chứa gọn trong RAM
    Ý tưởng là tập hợp các dịch vụ hữu ích có thể vận hành với chi phí dưới 10 USD/tháng

  • Tôi cũng muốn làm một công cụ tương tự để chuyển các cảnh báo thời tiết cho một khu vực cụ thể sang dạng HTML/Markdown dễ đọc hơn
    Không phải cho fediverse, chỉ đơn giản là để có thông báo thời tiết dễ tiếp cận hơn

  • Về ý kiến “cần cung cấp dự báo bằng ngôn ngữ địa phương”,
    tôi nghĩ rằng việc ghi đè ngôn ngữ mặc định của trình duyệt là không cần thiết, vì cũng có nhiều người dùng không biết ngôn ngữ địa phương

    • Mục tiêu của dự án không phải hỗ trợ đa ngôn ngữ mà là truyền đạt trực tiếp bản dự báo cho người dùng
      Thay vào đó, nó cung cấp cách biểu đạt trực quan bằng emoji để giảm rào cản ngôn ngữ