Planet Ubuntu-ID adalah agregator blog anggota komunitas Ubuntu Indonesia. Saya dulu memelihara repositorinya, ubuntu-id/planet, dan commit terakhir di sana bertanggal Februari 2020. Awal November 2026 saya ingin menghidupkannya lagi. Domain planet.ubuntu-id.org waktu itu sudah tidak resolve di DNS, dan kodenya tidak bisa dijalankan.
Poin Penting
- Planet Venus, mesin lama Planet Ubuntu-ID, berbasis Python 2 dan tidak punya commit baru sejak 2017. Saya menggantinya dengan satu skrip Python 3,
build.py.- Hasilnya situs statis, jadi cukup di Cloudflare tanpa server sendiri. Isinya diperbarui tiap 6 jam lewat Deploy Hook yang dipanggil GitHub Actions.
- Dari 73 feed lama, 35 yang masih bisa diambil. Satu feed ternyata sudah berisi iklan judi slot.
Kenapa kode lama tidak bisa dipakai
README lama menyuruh memasang python-libxslt1, python-genshi, dan sejenisnya, lalu menjalankan python planet.py. Semuanya Python 2. Mesinnya, Planet Venus, tidak punya commit baru sejak Maret 2017 (riwayat cabang dev); cabang master berhenti pada Februari 2011. Daripada menghidupkan Python 2 di mesin baru, saya menulis ulang pembangunnya dengan feedparser dan Jinja2. config.ini tetap dipakai apa adanya, dan template tema Ubuntu hanya berpindah dari format htmltmpl ke Jinja2, jadi tampilannya sama.
build.py membaca config.ini, mengambil semua feed secara paralel, mengambil maksimal 5 entri per feed dan 20 entri untuk halaman utama, lalu menulis index.html, rss20.xml, dan opml.xml ke folder public/.
feedparser.parse(url) (feedparser 6.0.14) macet saat menyambung ke beberapa host blogspot, padahal curl dan urllib lancar di mesin yang sama. Jalan keluarnya, unduh feed sendiri dengan timeout eksplisit, lalu serahkan isinya ke feedparser:
AGENT = "PlanetUbuntuID/2.0 (+https://github.com/ubuntu-id/planet)"
req = urllib.request.Request(url, headers={"User-Agent": AGENT})
with urllib.request.urlopen(req, timeout=15) as r:
d = feedparser.parse(r.read(), response_headers={"content-location": r.geturl()})
Feed yang gagal dilewati dan dicatat di stderr, jadi satu blog yang mati tidak menggagalkan seluruh build.
Membersihkan daftar feed
Pada 6 November 2026 saya mengambil ke-73 feed di config.ini satu per satu lewat build.py. Saat pemeriksaan pertama, 38 dari 73 gagal diambil. Satu di antaranya blog saya sendiri, yang domainnya sudah pindah, jadi alamat feed-nya saya ganti dan sekarang berhasil. Itu menyisakan 37 yang gagal. Satu feed lain berhasil diambil tetapi kini berisi iklan judi slot, jadi saya keluarkan dari config.ini. Hasil akhirnya, dari 73 feed: 35 berhasil, 37 gagal, 1 dikeluarkan.
| Hasil | Jumlah feed |
|---|---|
| Berhasil diambil | 35 |
| Domain tidak resolve (DNS) | 14 |
| Bukan feed XML yang valid | 7 |
| HTTP 404, 410, atau 503 | 7 |
| Timeout | 6 |
| Server tidak terjangkau | 2 |
| Respons tanpa Content-Type atau feed kosong | 1 |
| Dikeluarkan karena iklan judi slot | 1 |
| Total | 73 |
Feed yang error tidak saya hapus. Ini data komunitas, dan sebagian mungkin hanya timeout sementara. Setiap bagiannya saya komentari lengkap dengan alasannya:
# ERROR (cek 2026-11-06): domain tidak resolve (DNS)
# [http://feeds.fajran.web.id/all/feed.xml]
# name = Fajran Iman Rusadi
Dari 35 feed yang aktif, hanya 2 yang punya tulisan sejak 2025. Sisanya, 33 feed, terakhir menulis antara 2009 dan 2024, jadi isi Planet Ubuntu-ID saat ini didominasi tulisan lama. Umur feed saya hitung dari tanggal entri terbaru di tiap feed.
Deploy ke Cloudflare
Karena hasilnya statis, saya pakai static assets di Cloudflare Workers. Satu file wrangler.jsonc cukup untuk menunjuk folder yang diunggah:
{
"name": "planet-ubuntu-id",
"compatibility_date": "2026-11-06",
"assets": { "directory": "./public" }
}
Pengaturan build-nya: pip install -r requirements.txt && python build.py sebagai build command, npx wrangler deploy sebagai deploy command, dan Python 3.13 lewat file .python-version (versi bawaan lingkungan build Workers bisa diganti dengan cara itu). Nama project hanya boleh huruf kecil, angka, dan tanda hubung, jadi spasi di nama awal saya harus diganti.
Build pertama gagal dalam 11 detik, saat master belum berisi build.py. Setelah pull request #1 di-merge, build berikutnya lolos.
Kalau Anda lebih suka menjalankan server sendiri daripada memakai Cloudflare, hasil public/ bisa disajikan nginx biasa. Atur TLS-nya dengan panduan A+ di SSL Labs untuk nginx.
Situs statis tidak ikut berubah saat blog anggota memposting sesuatu. Karena itu pull request #2 menambah workflow GitHub Actions yang memanggil Deploy Hook Cloudflare tiap 6 jam. URL hook-nya disimpan sebagai secret repositori, tidak pernah masuk ke kode. Run manual pertamanya sukses.
Pendaftaran anggota baru
Alur lama lewat tiket Launchpad saya ganti dengan pull request yang mengubah config.ini. Template PR meminta:
- nama lengkap dan profil Launchpad,
- alamat feed,
- pernyataan bahwa pemohon sudah menandatangani Ubuntu Code of Conduct.
Pernyataan itu tetap diperiksa manual lewat profil Launchpad sebelum PR di-merge. Selain itu, CI di setiap PR memeriksa sintaks, menjalankan build, dan memastikan rss20.xml serta opml.xml valid.
Planet Ubuntu-ID sekarang hidup lagi di planet.ubuntu-id.org, dan kodenya terbuka di GitHub. Kalau Anda punya blog tentang Ubuntu atau Linux dan sudah menandatangani Ubuntu Code of Conduct, silakan kirim pull request.
Penulis: Mahyuddin Susanto, penulis blog ini dan mantan pemelihara repositori Planet Ubuntu-ID (tentang penulis, kontak). Foto sampul oleh Cong Long Vu di Unsplash. Tulisan ini dibantu oleh AI.