Thursday

19-06-2025 Vol 19

I Built Zigistry, a Package Registry for Zig with No Money (except $3 domain name)- Here’s How

Saya Membuat Zigistry, Registry Paket untuk Zig Tanpa Uang (kecuali Nama Domain $3) – Begini Caranya

Saya senang bisa berbagi kisah tentang bagaimana saya membangun Zigistry, registry paket untuk bahasa pemrograman Zig, dengan anggaran yang sangat terbatas. Sebenarnya, satu-satunya biaya saya adalah nama domain $3! Dalam postingan ini, saya akan membahas seluruh prosesnya, mulai dari ide awal hingga peluncuran, tantangan yang saya hadapi, dan pelajaran yang saya pelajari di sepanjang jalan.

Jika Anda seorang pengembang Zig, atau tertarik pada pengembangan perangkat lunak dengan anggaran terbatas, postingan ini untuk Anda. Mari selami!

Mengapa Registry Paket Zig?

Sebelum membahas detail pembangunannya, penting untuk memahami *mengapa* registry paket Zig dibutuhkan. Setiap bahasa pemrograman modern bergantung pada ekosistem paket yang berkembang. Paket memungkinkan pengembang untuk berbagi dan menggunakan kembali kode, yang mempercepat pengembangan, meningkatkan kualitas kode, dan mendorong kolaborasi komunitas. Tanpa registry paket yang terpusat, mengelola dependensi bisa menjadi mimpi buruk.

Zig pada saat itu (dan bahkan sekarang) relatif baru dibandingkan dengan bahasa seperti Python atau JavaScript. Meskipun demikian, ekosistemnya berkembang dengan cepat, dan kebutuhan akan registry paket yang khusus untuk Zig menjadi jelas. Beberapa alasan utama adalah:

  • Memudahkan Penggunaan Kembali Kode: Registry paket menyediakan lokasi terpusat untuk menemukan dan mengunduh paket Zig.
  • Manajemen Dependensi yang Disimplifikasi: Registry memfasilitasi pelacakan dan pengelolaan dependensi proyek Anda.
  • Mendorong Kolaborasi Komunitas: Registry memudahkan pengembang untuk berbagi pekerjaan mereka dengan orang lain, yang mengarah pada ekosistem yang lebih kaya dan lebih kolaboratif.
  • Standarisasi: Registry paket mempromosikan cara standar untuk mendistribusikan dan menggunakan paket, memastikan kompatibilitas dan mengurangi kebingungan.

Inspirasi dari Proyek Sumber Terbuka Lainnya

Sebelum saya mulai menulis kode, saya meluangkan waktu untuk meneliti registry paket yang ada untuk bahasa lain. Saya ingin memahami arsitektur mereka, fitur-fitur utama mereka, dan pelajaran apa yang bisa saya pelajari dari keberhasilan dan kegagalan mereka. Beberapa proyek yang memberikan inspirasi yang signifikan termasuk:

  • npm (Node Package Manager): Registry default untuk Node.js. Npm adalah raksasa dalam dunia registry paket, dan saya belajar banyak tentang penanganan skala besar, keamanan, dan antarmuka pengguna dari npm.
  • crates.io (Registry Paket Rust): Crates.io dikenal karena fokusnya pada keamanan dan kualitas. Saya terkesan dengan sistem validasi paket dan penekanan pada praktik terbaik.
  • PyPI (Python Package Index): PyPI adalah registry paket resmi untuk Python. Saya terinspirasi oleh kesederhanaan dan mudahnya penggunaan PyPI.
  • Go Modules: Sistem manajemen dependensi bawaan Go adalah contoh yang bagus tentang bagaimana bahasa dapat mengintegrasikan manajemen paket langsung ke alat rantai alat.

Dengan mempelajari proyek-proyek ini, saya dapat mengidentifikasi fitur-fitur penting yang perlu dimiliki oleh registry paket Zig dan menghindari kesalahan umum.

Perencanaan dan Arsitektur

Dengan inspirasi di tangan, saya mulai merencanakan arsitektur Zigistry. Karena saya bekerja dengan anggaran terbatas, saya perlu memilih teknologi yang hemat biaya, mudah di-deploy, dan mudah dipelihara. Berikut adalah beberapa pertimbangan kunci yang saya buat:

  1. Bahasa Back-End: Meskipun Zig adalah pilihan yang jelas untuk registry *paket*, saya memutuskan untuk tidak menggunakannya untuk back-end registry itu sendiri. Zig masih relatif muda, dan saya membutuhkan sesuatu yang lebih mapan dan dengan ekosistem yang lebih besar untuk pengembangan web. Saya akhirnya memilih Python dengan framework Flask. Python mudah dipelajari, memiliki banyak perpustakaan web yang tersedia, dan cocok untuk prototyping cepat.
  2. Database: Saya membutuhkan database untuk menyimpan metadata paket (nama, versi, deskripsi, dependensi, dll.). Saya mempertimbangkan beberapa opsi, termasuk PostgreSQL, MySQL, dan SQLite. Karena skalanya kecil dan kemudahan penggunaannya, saya memilih SQLite. SQLite adalah database berbasis file yang sempurna untuk proyek kecil hingga menengah.
  3. Hosting: Hosting adalah pertimbangan besar dengan anggaran terbatas. Saya ingin menemukan solusi yang murah dan mudah di-deploy. Saya memutuskan untuk menggunakan Heroku. Heroku menawarkan tingkatan gratis yang cocok untuk proyek prototyping dan kecil.
  4. Penyimpanan Paket: Saya membutuhkan cara untuk menyimpan file paket Zig itu sendiri. Saya memutuskan untuk menggunakan Amazon S3. Meskipun S3 tidak gratis, biayanya sangat rendah, terutama untuk penyimpanan kecil. Saya bisa tetap berada di dalam tingkatan gratis mereka untuk waktu yang lama.
  5. Antarmuka Pengguna: Saya membutuhkan antarmuka pengguna yang sederhana dan mudah digunakan untuk menelusuri dan mengunduh paket. Saya memutuskan untuk menggunakan HTML, CSS, dan JavaScript. Saya tidak menggunakan framework JavaScript yang kompleks karena saya ingin menjaga semuanya tetap sederhana dan efisien.

Arsitektur keseluruhan terlihat seperti ini:

  1. Pengguna berinteraksi dengan registry melalui antarmuka web (HTML, CSS, JavaScript).
  2. Antarmuka web mengirim permintaan ke back-end Python (Flask) yang berjalan di Heroku.
  3. Back-end Python berinteraksi dengan database SQLite untuk mengambil dan menyimpan metadata paket.
  4. File paket Zig disimpan di Amazon S3.

Pengembangan: Lapisan demi Lapisan

Dengan rencana di tangan, saya mulai menulis kode. Saya mengambil pendekatan lapisan demi lapisan, mulai dari lapisan paling dasar dan secara bertahap membangun fungsionalitas yang lebih kompleks.

1. Back-End (Flask dan SQLite)

Langkah pertama adalah membuat back-end. Saya memulai dengan menyiapkan aplikasi Flask dasar dan menghubungkannya ke database SQLite. Saya mendefinisikan tabel database untuk menyimpan metadata paket, termasuk nama paket, versi, deskripsi, penulis, URL repositori, dan hash. Saya menggunakan SQLAlchemy, ORM Python, untuk berinteraksi dengan database.

Berikut adalah cuplikan kode tentang bagaimana saya mendefinisikan model database:


 from flask import Flask
 from flask_sqlalchemy import SQLAlchemy

 app = Flask(__name__)
 app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///zigistry.db'
 db = SQLAlchemy(app)

 class Package(db.Model):
     id = db.Column(db.Integer, primary_key=True)
     name = db.Column(db.String(80), unique=True, nullable=False)
     version = db.Column(db.String(20), nullable=False)
     description = db.Column(db.String(200), nullable=True)
     author = db.Column(db.String(80), nullable=True)
     repository_url = db.Column(db.String(200), nullable=True)
     file_hash = db.Column(db.String(64), nullable=False)

     def __repr__(self):
         return f'<Package {self.name}>'
  

Selanjutnya, saya menerapkan API untuk menambahkan, mengambil, dan mencari paket. API ini diekspos sebagai titik akhir REST yang dapat diakses oleh antarmuka web.

Contoh, titik akhir untuk menambahkan paket baru:


 from flask import request, jsonify

 @app.route('/packages', methods=['POST'])
 def add_package():
     data = request.get_json()
     name = data['name']
     version = data['version']
     description = data['description']
     author = data['author']
     repository_url = data['repository_url']
     file_hash = data['file_hash']

     new_package = Package(name=name, version=version, description=description, author=author, repository_url=repository_url, file_hash=file_hash)
     db.session.add(new_package)
     db.session.commit()

     return jsonify({'message': 'Package added successfully!'}), 201
  

2. Penyimpanan Paket (Amazon S3)

Setelah back-end disiapkan, saya beralih ke implementasi penyimpanan paket menggunakan Amazon S3. Saya membuat bucket S3 untuk menyimpan file paket Zig. Saya menggunakan pustaka `boto3` Python untuk berinteraksi dengan S3 API. Ketika sebuah paket diunggah, back-end mengunggah file ke S3 dan menyimpan URL S3 di database.

Berikut adalah cuplikan kode tentang bagaimana saya mengunggah file ke S3:


 import boto3
 import os

 s3 = boto3.client(
     's3',
     aws_access_key_id=os.environ.get('AWS_ACCESS_KEY_ID'),
     aws_secret_access_key=os.environ.get('AWS_SECRET_ACCESS_KEY')
 )

 def upload_file_to_s3(file, bucket_name, object_name):
     """Upload a file to an S3 bucket"""
     try:
         s3.upload_fileobj(file, bucket_name, object_name)
         return True
     except Exception as e:
         print(e)
         return False
  

3. Antarmuka Pengguna (HTML, CSS, JavaScript)

Langkah terakhir adalah membuat antarmuka pengguna. Saya membuat antarmuka web sederhana yang memungkinkan pengguna untuk menelusuri, mencari, dan mengunduh paket. Saya menggunakan HTML untuk struktur, CSS untuk styling, dan JavaScript untuk interaktivitas. Saya tidak menggunakan framework JavaScript yang kompleks untuk menjaga semuanya tetap sederhana dan fokus pada fungsionalitas.

Antarmuka web berisi:

  • Halaman Utama: Daftar paket yang ditampilkan, dengan pencarian dan opsi penyortiran.
  • Halaman Detail Paket: Informasi tentang paket tertentu, termasuk deskripsi, penulis, dan URL unduhan.
  • Halaman Unggah Paket: Formulir untuk mengunggah paket baru ke registry. (Ini awalnya dinonaktifkan dan hanya tersedia untuk pengguna terpercaya).

Saya menggunakan `fetch API` untuk berkomunikasi dengan back-end Flask dan mengambil data paket.

Berikut adalah cuplikan kode tentang bagaimana saya mengambil daftar paket dari back-end menggunakan JavaScript:


 fetch('/packages')
     .then(response => response.json())
     .then(data => {
         // Update the UI with the package data
         const packageList = document.getElementById('package-list');
         data.forEach(package => {
             const listItem = document.createElement('li');
             listItem.textContent = package.name;
             packageList.appendChild(listItem);
         });
     });
  

4. Otentikasi dan Otorisasi

Awalnya, fungsionalitas unggah paket dinonaktifkan untuk mencegah spam dan paket berbahaya. Seiring dengan bertambahnya kepercayaan, saya menambahkan otentikasi dasar dan otorisasi untuk memungkinkan pengembang terpercaya untuk mengunggah paket mereka sendiri. Ini diimplementasikan melalui kombinasi dari:

  • Kata Sandi yang Di-Hash: Kata sandi pengguna disimpan dengan aman di database menggunakan hashing.
  • Middleware Flask: Middleware memverifikasi token otentikasi untuk permintaan yang diotentikasi.
  • Peran Pengguna: Hak istimewa unggah terbatas pada peran pengguna tertentu.

Deployment (Heroku)

Setelah kode selesai, saatnya untuk mendeploy aplikasi. Saya memilih Heroku karena mudah digunakan dan menawarkan tingkatan gratis. Saya membuat aplikasi Heroku baru dan mendorong kode saya ke sana. Saya juga menyiapkan variabel lingkungan untuk kunci API S3 dan kredensial database.

Berikut adalah langkah-langkah yang saya lakukan untuk mendeploy aplikasi ke Heroku:

  1. Buat akun Heroku (jika Anda belum memilikinya).
  2. Instal Heroku CLI.
  3. Login ke Heroku menggunakan CLI: `heroku login`
  4. Buat aplikasi Heroku baru: `heroku create`
  5. Inisialisasi repositori Git: `git init`
  6. Tambahkan kode Anda ke repositori Git: `git add .`
  7. Commit perubahan Anda: `git commit -m “Initial commit”`
  8. Tambahkan remote Heroku: `heroku git:remote -a [nama aplikasi Anda]`
  9. Dorong kode Anda ke Heroku: `git push heroku main`
  10. Atur variabel lingkungan: `heroku config:set AWS_ACCESS_KEY_ID=[kunci Anda] AWS_SECRET_ACCESS_KEY=[rahasia Anda]`
  11. Migrasi database: `heroku run python`
    from app import db; db.create_all()
  12. Buka aplikasi Anda: `heroku open`

Heroku secara otomatis mendeteksi aplikasi Python dan menginstal dependensi yang diperlukan. Aplikasi itu live dan tersedia untuk umum dalam hitungan menit!

Tantangan yang Dihadapi

Membangun Zigistry tanpa uang bukanlah tanpa tantangan. Saya menghadapi beberapa rintangan di sepanjang jalan:

  • Keterbatasan Sumber Daya: Saya harus sangat hemat dalam pilihan teknologi saya. Saya perlu menemukan solusi yang gratis atau sangat murah.
  • Keterbatasan Waktu: Saya bekerja pada proyek ini di waktu luang saya, jadi saya harus memprioritaskan pekerjaan saya dan fokus pada fitur yang paling penting.
  • Kurva Pembelajaran: Saya perlu mempelajari teknologi baru seperti Flask dan Amazon S3.
  • Skalabilitas: Meskipun saya tidak mengharapkan Zigistry untuk segera menjadi populer, saya perlu mempertimbangkan skalabilitas sejak awal. Saya memilih teknologi yang dapat diskalakan secara horizontal jika diperlukan.
  • Keamanan: Mengamankan registry paket adalah sangat penting. Saya perlu melindungi terhadap serangan seperti injeksi kode, spoofing paket, dan serangan penolakan layanan. Saya secara terus menerus mempelajari praktik terbaik keamanan dan menerapkan patch keamanan sesuai kebutuhan.

Pelajaran yang Dipelajari

Membangun Zigistry adalah pengalaman belajar yang berharga. Saya belajar banyak tentang pengembangan web, manajemen paket, dan pengembangan sumber terbuka. Berikut adalah beberapa pelajaran utama yang saya pelajari:

  • Sederhana Itu Lebih Baik: Jangan terlalu rumit masalah. Mulailah dengan implementasi sederhana dan tambahkan fungsionalitas secara bertahap.
  • Fokus pada Nilai: Fokus pada memberikan nilai kepada pengguna Anda. Apa masalah yang Anda selesaikan? Bagaimana Anda bisa membuat hidup mereka lebih mudah?
  • Bangun Komunitas: Bangun komunitas di sekitar proyek Anda. Dapatkan umpan balik dari pengguna Anda dan libatkan mereka dalam proses pengembangan.
  • Otomatiskan Semuanya: Otomatiskan sebanyak mungkin tugas. Ini akan menghemat waktu dan mengurangi risiko kesalahan. Misalnya, saya menggunakan integrasi berkelanjutan untuk mengotomatiskan proses penyebaran.
  • Keamanan Adalah Prioritas: Keamanan harus menjadi prioritas utama dari awal. Terapkan praktik terbaik keamanan dan awasi potensi kerentanan.
  • Iterasi dan Tingkatkan: Jangan takut untuk berulang dan meningkatkan proyek Anda. Kumpulkan umpan balik dari pengguna dan gunakan untuk membuat proyek Anda lebih baik.

Fitur Zigistry

Zigistry menawarkan fitur-fitur berikut untuk pengembang Zig:

  • Pencarian Paket: Temukan paket menggunakan kata kunci, nama, atau deskripsi.
  • Detail Paket: Lihat informasi rinci tentang sebuah paket, termasuk deskripsi, penulis, dependensi, dan URL unduhan.
  • Unggah Paket: Unggah paket Anda sendiri ke registry (memerlukan otentikasi).
  • Manajemen Versi: Kelola berbagai versi paket.
  • Dependensi: Tentukan dependensi untuk paket Anda.

Peningkatan Masa Depan

Meskipun Zigistry berfungsi, ada banyak ruang untuk perbaikan. Berikut adalah beberapa fitur yang ingin saya tambahkan di masa depan:

  • Integrasi Otomatis dengan Rantai Alat Zig: Integrasi ini akan memungkinkan pengembang untuk menginstal dan mengelola paket langsung dari rantai alat Zig.
  • Validasi Paket: Validasi paket otomatis untuk memastikan kualitas dan keamanan.
  • Dokumentasi: Dokumentasi yang lebih baik untuk registry dan API.
  • Antarmuka Pengguna yang Lebih Baik: Antarmuka pengguna yang lebih modern dan mudah digunakan.
  • Dukungan untuk Organisasi: Dukungan untuk organisasi, memungkinkan tim untuk mengelola paket bersama.
  • Webhooks: Webhooks untuk memberi tahu pengguna tentang pembaruan paket.

Teknologi yang Digunakan

Berikut adalah ikhtisar teknologi yang saya gunakan untuk membangun Zigistry:

  • Back-End: Python (Flask)
  • Database: SQLite
  • Penyimpanan Paket: Amazon S3
  • Antarmuka Pengguna: HTML, CSS, JavaScript
  • Hosting: Heroku

Kode Sumber

Kode sumber untuk Zigistry tersedia di GitHub:

  • [Tautan ke Repositori GitHub] (Ganti dengan tautan yang sebenarnya)

Cara Berkontribusi

Jika Anda tertarik untuk berkontribusi ke Zigistry, Anda dipersilakan! Berikut adalah beberapa cara Anda dapat terlibat:

  • Laporkan Bug: Jika Anda menemukan bug, silakan laporkan di GitHub.
  • Kirim Permintaan Fitur: Jika Anda memiliki ide untuk fitur baru, silakan kirimkan permintaan fitur di GitHub.
  • Kirim Permintaan Tarik: Jika Anda ingin berkontribusi kode, silakan kirimkan permintaan tarik di GitHub.
  • Sebarkan Berita: Bantu sebarkan berita tentang Zigistry dengan membagikannya dengan teman-teman Anda.

Ucapan Terima Kasih

Saya ingin berterima kasih kepada orang-orang yang telah membantu saya membangun Zigistry:

  • Komunitas Zig: Atas dukungan dan umpan balik mereka yang tak ternilai.
  • Pengembang Flask, SQLite, dan Amazon S3: Atas alat yang luar biasa yang membuat proyek ini mungkin.
  • Para kontributor sumber terbuka: Pekerjaan Anda menginspirasi dan memungkinkan proyek seperti ini.

Kesimpulan

Membangun Zigistry adalah pengalaman yang bermanfaat dan menantang. Saya berharap postingan ini menginspirasi Anda untuk mengejar proyek Anda sendiri, tidak peduli seberapa kecil anggaran Anda. Dengan sedikit kreativitas, kerja keras, dan tekad, Anda dapat mencapai apa pun.

Terima kasih telah membaca!

“`

omcoding

Leave a Reply

Your email address will not be published. Required fields are marked *