Konsep Inti
Semua dokumen lain memakai istilah di halaman ini. Sepuluh menit di sini menghemat banyak kebingungan nanti.
Tenant
Section titled “Tenant”Batas isolasi data. Setiap tenant memiliki akun, perangkat, konten, dan job sendiri. Tidak ada query yang boleh melintasi batas tenant - ini aturan keamanan, bukan sekadar konvensi. Satu pengguna perorangan tetap satu tenant.
Akun (Social Account)
Section titled “Akun (Social Account)”Satu identitas di satu platform, misalnya satu channel YouTube atau satu profil TikTok. Satu tenant boleh punya banyak akun di platform yang sama.
Yang disimpan adalah kredensial terenkripsi (AES-GCM at-rest), bukan kata sandi mentah. Untuk platform jalur API resmi, yang tersimpan adalah token OAuth yang Anda izinkan.
Perangkat (Device) dan Agent
Section titled “Perangkat (Device) dan Agent”Perangkat adalah HP Android milik Anda yang terdaftar di sistem. Agent adalah aplikasi yang berjalan di perangkat itu.
Arah koneksinya penting dan sering disalahpahami:
HP Anda (agent) ──── outbound WebSocket ───▶ Server GoSosmed ◀─── tugas dikirim balik ───Agent yang menghubungi server, bukan sebaliknya. Konsekuensinya: tidak perlu IP publik, tidak perlu buka port, dan server tidak punya jalan masuk ke jaringan rumah Anda.
Inilah arti BYOD - Bring Your Own Device. Bandingkan dengan model device cloud yang menyewakan HP di data center sekitar $80 per perangkat per bulan, dengan kredensial Anda tersimpan di sana.
Konten (Content)
Section titled “Konten (Content)”Satu unit materi yang akan diterbitkan: caption, media, dan metadata. Konten bersifat netral platform - ia belum tahu akan terbit ke mana.
Penyesuaian per platform (misalnya judul khusus YouTube, atau caption lebih pendek untuk X) disimpan sebagai override, bukan sebagai konten terpisah. Satu sumber, banyak varian.
Satu konten ke satu akun di satu platform. Ini unit eksekusi terkecil, dan alasannya penting: kalau Anda menerbitkan satu konten ke enam platform, itu enam job independen. Instagram gagal tidak membatalkan YouTube.
State machine job:
queued ──▶ running ──▶ succeeded │ └──▶ failed ──▶ (retry terbatas)Setiap transisi tercatat beserta alasannya. Job yang gagal menyimpan error sebenarnya dari platform, bukan pesan generik.
Adapter dan tiga mode publikasi
Section titled “Adapter dan tiga mode publikasi”Adapter adalah implementasi cara berbicara dengan satu platform. Arsitekturnya mengikuti pola Ports & Adapters (Hexagonal): domain mendefinisikan port (kontrak), adapter mengimplementasikannya. Menambah platform baru berarti menulis adapter baru - tanpa menyentuh domain.
| Mode | Platform | Kenapa mode ini |
|---|---|---|
| API resmi | YouTube, Facebook, Instagram, Threads, Pinterest, X | Paling stabil - selalu dipilih kalau tersedia |
| Browser terkelola | TikTok | Tidak ada API publikasi publik yang memadai |
| Mobile-native (BYOD) | Shopee Video | Fungsinya hanya ada di aplikasi HP |
Detail per platform, termasuk status kematangan tiap jalur: Mode Publikasi & Platform.
Runner
Section titled “Runner”Proses terpisah yang menjalankan beban berat - browser headless, ffmpeg, atau ADB. Sengaja tidak disatukan ke API.
Alasannya prinsip “ringan di atas segalanya”: API harus tetap di bawah 80 MB RAM saat idle. Kalau browser dijalankan di dalam proses API, angka itu mustahil. Runner punya batas konkurensi eksplisit, sehingga beban puncak bisa diprediksi.
ADR (Architecture Decision Record)
Section titled “ADR (Architecture Decision Record)”Catatan satu keputusan teknis: konteksnya, pilihan yang dipertimbangkan, keputusannya, dan konsekuensinya - termasuk opsi yang ditolak dan alasannya.
Kumpulan ADR GoSosmed berada di repo privat dan tidak diterbitkan di situs publik ini. Keputusan yang memengaruhi Anda secara langsung tetap dijelaskan di sini - misalnya kenapa agent memakai Accessibility Service di Izin & Privasi, dan kenapa sebagian kode dibuka sementara sisanya tidak di Apa yang Publik & Apa yang Tidak.
Ringkasan hubungan antar-konsep
Section titled “Ringkasan hubungan antar-konsep”Tenant ├── Akun (identitas per platform, kredensial terenkripsi) ├── Perangkat (HP Anda + agent, koneksi outbound) └── Konten (netral platform) └── Job (konten × akun × platform) └── dieksekusi oleh Adapter └── via API resmi / Browser runner / Agent BYOD