Dokumentasi pengembang
Bahasa Indonesia

Menjalankan server

Administrasi dan pengaturan

Halaman admin, pengiriman kode pendaftaran (SMS dan email), nilai pengaturan server, pencadangan, dan keamanan โ€” referensi untuk operator.

Server dilengkapi halaman admin yang dibuka lewat peramban. Di sana Anda melihat status server, menentukan cara pengiriman kode pendaftaran dan masuk, serta mengelola pengguna dan bot. Dokumen ini adalah referensi yang merangkum halaman admin dan nilai pengaturan server di satu tempat. Jika Anda perlu memasang server terlebih dahulu, lihat Instalasi server.

Tampilan halaman admin berbahasa Korea. Karena itu, saat dokumen ini menyebut tab, tombol, atau pengaturan, label Koreanya dicantumkan di dalam kurung agar mudah ditemukan.

Membuka halaman admin

Halaman admin berada di /admin/ pada port HTTP admin (8080 dalam susunan produksi) dan hanya terbuka di server itu sendiri (127.0.0.1). Operator masuk lewat tunnel SSH.

# di komputer Anda (biarkan tetap berjalan)
ssh -N -L 8080:127.0.0.1:8080 <pengguna>@<server>
# peramban: http://localhost:8080/admin/

# token (di server)
sudo cat /srv/pabal/pabal_server/data/admin-token

Masukkan token, lalu tekan Buka (์—ด๊ธฐ). Peramban mengingat token itu, dan Anda bisa menghapusnya dengan Hapus token (ํ† ํฐ ์ง€์šฐ๊ธฐ) di kanan atas. Jika ingin menentukan token sendiri, berikan TELEGRAM_ADMIN_TOKEN (minimal 16 karakter) โ€” dengan begitu berkas token tidak ditulis.

Isi setiap tab

TabIsiDiperbarui
Dasbor (๋Œ€์‹œ๋ณด๋“œ)Orang, sesi, dan koneksi yang sedang tersambung; jumlah orang, bot, grup, pesan, foto, dan berkas; waktu aktif, port, dan DB; JVM; pemeriksaan status. Jika nomor uji menyala, muncul pita peringatan5 detik
Kode pendaftaran (๊ฐ€์ž… ์ฝ”๋“œ)Kode yang sedang menunggu (nomor, cara pengiriman, status pengiriman, kode, sisa waktu, jumlah salah input) dan catatan terbaru. Salin atau batalkan kode3 detik
Pengguna (์‚ฌ์šฉ์ž)Semua akun โ€” nomor telepon, email login (bisa diedit), status tersambung, jumlah perangkat yang masuk, jumlah pesan. Keluar dari semua perangkat (๋ชจ๋“  ๊ธฐ๊ธฐ ๋กœ๊ทธ์•„์›ƒ), Blokir nomor (๋ฒˆํ˜ธ ์ฐจ๋‹จ), Hapus akun (๊ณ„์ • ์‚ญ์ œ, dengan catatan cara memastikan orangnya โ€” akun yang dihapus hanya meninggalkan id dan catatan itu)10 detik
Bot (๋ด‡)Bot yang dibuat dengan BotFather โ€” pembuatnya, menu perintah, cara tersambung (MTProto ยท polling HTTP ยท alamat webhook dan alasan kegagalannya), jumlah update yang menunggu10 detik
Suara (์Œ์„ฑ)Bot suara โ€” status gateway, relay, dan kebijakan, sakelar darurat, peluncuran publik, izin transkrip, panggilan yang berlangsung dan menutupnya, izin dan penangguhan bot, penguji, batas (di bawah)5 detik
Laporan (์‹ ๊ณ )Yang masuk lewat "Laporkan" di aplikasi โ€” salinan isi pada saat dilaporkan (tetap bisa dibaca meski pengirimnya sudah menghapusnya). Hapus (di kedua sisi percakapan; untuk grup, dari semua anggota), Tangguhkan akun (keluar dari semua perangkat, tidak bisa masuk atau mendaftar lagi), daftar akun yang ditangguhkan. Nomor akun yang dihapus saat masih ditangguhkan tidak bisa mendaftar lagi selama 1 tahun sejak dihapus (bawaan) โ€” perpanjang saat menangguhkan, atau nanti lewat Blokir pendaftaran (์žฌ๊ฐ€์ž… ๋ง‰๊ธฐ) di daftar: sampai tanggal berakhir yang lebih lambat (yang berlaku adalah yang lebih lambat antara satu tahun itu dan tanggal tersebut โ€” tidak pernah diperpendek) atau tanpa batas waktu (API admin: POST /admin/api/reports/<id>/suspend {"userId": โ€ฆ, "blockSignupUntil": "2028-01-01"} atau "blockSignupForever": true; untuk mengubahnya nanti, POST /admin/api/suspensions/<id>/block-signup, badan kosong kembali ke bawaan). Laporan yang sudah ditangani juga bisa dilihat. Laporan yang sudah ditangani dihapus, termasuk salinannya, 3 tahun setelah hari penanganannya (kartunya menampilkan tanggal itu); jika sengketa, penyelidikan, atau gugatan dimulai, Simpan (๋ณด์กด) menahannya sampai dilepas (API admin: POST /admin/api/reports/<id>/hold, dan /release untuk melepas)10 detik
Pusat bantuan (๊ณ ๊ฐ์„ผํ„ฐ)Percakapan yang masuk ke @PabalSupport. Pilih percakapan lalu balas; balasan dikirim ke percakapan itu atas nama bot pusat bantuan10 detik
Pengaturan (์„ค์ •)Aturan pendaftaran dan masuk, akun peninjauan toko aplikasi, SMS, email (SMTP), pemblokiran nomor telepon, informasi operator yang dimuat di situs webDisimpan manual
Nama pengguna yang dicadangkan (์˜ˆ์•ฝ ์•„์ด๋””)Nama pengguna yang diblokir agar tidak bisa diambil siapa pun โ€” pencarian, penambahan, unduh daftar (.txt), nama yang diblokir server secara bawaan. Mencadangkan nama yang sudah dipakai orang tidak merebutnyaSekali saat dibuka
Penyimpanan (์ €์žฅ์†Œ)Direktori data dan alamat DB (kata sandi disembunyikan), jumlah dan ukuran foto serta berkas, jumlah stream penyimpanan per jenis10 detik

Tindakan berbahaya (keluar, blokir, pembatalan kode) baru dijalankan jika ditekan dua kali.

Kode pendaftaran dan masuk

Saat seseorang memasukkan nomor telepon di aplikasi, server membuat kode dan mengirimkannya dengan cara yang dipilih di tab Pengaturan (์„ค์ •).

Cara pengirimanTujuan kodeLayar aplikasi
Halaman admin (๊ด€๋ฆฌ ํ™”๋ฉด)Tab Kode pendaftaran (๊ฐ€์ž… ์ฝ”๋“œ). Operator menyalinnya dan memberitahukannya langsungNomor โ†’ "Kode telah dikirim" โ†’ kode (jika nomornya baru, nama)
SMSPesan teks lewat salah satu dari Twilio ยท Solapi ยท webhookSama dengan halaman admin
Email (์ด๋ฉ”์ผ)Email lewat SMTPNomor โ†’ masukkan email โ†’ "Kode telah dikirim ke email" โ†’ kode
  • Dengan cara email, pendaftaran baru boleh memakai alamat apa saja, dan alamat itu menjadi email login akun tersebut. Akun yang sudah ada hanya menerima kode di email login yang terdaftar โ€” ini mencegah orang masuk dengan memasukkan alamatnya sendiri untuk nomor milik orang lain. Akun lama yang tidak punya email login akan dikirimi lewat SMS (jika sudah diatur) atau lewat halaman admin sebagai gantinya. Email login bisa diisikan di tab Pengguna (์‚ฌ์šฉ์ž).
  • Pengiriman berlangsung di latar belakang, sehingga aplikasi langsung beralih ke layar kode. Hasil pengiriman (berhasil atau gagal beserta alasannya) muncul di tab Kode pendaftaran.
  • Pendaftaran (memasukkan nama) hanya bisa dilakukan setelah kode dimasukkan dengan benar. Kode yang salah hanya diterima sebanyak batas yang diizinkan; setelah itu, kode yang benar pun ditolak.
  • Ganti nomor akun (Pengaturan โ†’ nomor telepon di aplikasi) tertutup secara bawaan, dan aplikasi menampilkan galat. Dengan Izinkan ganti nomor menyala, kode dikirim ke nomor baru hanya lewat SMS, apa pun metode pengirimannya (tab Kode pendaftaran tidak menampilkannya, meski tampilan kode menyala โ€” orang yang menerimanya di sana belum tentu pemilik nomor itu), dengan teksnya sendiri, teks ganti nomor di pengaturan SMS (๋ฒˆํ˜ธ ๋ฐ”๊พธ๊ธฐ ๋ฌธ๊ตฌ; bawaan [ํŒŒ๋ฐœ] ๋ฒˆํ˜ธ ๋ฐ”๊พธ๊ธฐ ํ™•์ธ ์ฝ”๋“œ: {code}). Jeda kirim ulang dan batas harian berlaku untuk nomor baru dan untuk akun; nomor yang diblokir atau ditangguhkan, serta nomor yang dipakai akun lain, ditolak saat kode diminta dan sekali lagi saat akun pindah. Kode hanya cocok untuk akun dan nomor itu, dan hanya dipakai sekali; kode masuk orang lain yang menunggu nomor itu dibiarkan apa adanya. Setelah pindah, nomor lama tidak bisa lagi masuk ke akun itu.

Pengaturan โ€” pendaftaran dan masuk

ButirArtiBawaan
Izinkan pendaftaran baru (์ƒˆ ๊ฐ€์ž… ํ—ˆ์šฉ)Jika dimatikan, hanya akun yang sudah ada yang bisa masuk. Nomor baru ditolak sebagai "nomor tidak valid"Nyala
Cara pengiriman kode (์ฝ”๋“œ ์ „๋‹ฌ ๋ฐฉ์‹)Halaman admin (๊ด€๋ฆฌ ํ™”๋ฉด) / SMS / Email (์ด๋ฉ”์ผ)Halaman admin
Tampilkan kode di halaman admin (๊ด€๋ฆฌ ํ™”๋ฉด์— ์ฝ”๋“œ ํ‘œ์‹œ)Tetap menampilkan kode di tab Kode pendaftaran meskipun memakai cara SMS atau email (untuk berjaga-jaga jika pengiriman gagal)Nyala
Nomor uji (ํ…Œ์ŠคํŠธ ๋ฒˆํ˜ธ (+99966โ€ฆ))Sesuai server (์„œ๋ฒ„ ์„ค์ •๋Œ€๋กœ) / Nyalakan (์ผœ๊ธฐ) / Matikan (๋„๊ธฐ). Matikan di produksiSesuai server
Jumlah digit kode (์ฝ”๋“œ ์ž๋ฆฟ์ˆ˜) ยท masa berlaku (์ฝ”๋“œ ์œ ํšจ ์‹œ๊ฐ„)5โ€“6 digit ยท 1โ€“60 menit5 digit ยท 5 menit
Jeda permintaan ulang (์žฌ์š”์ฒญ ๊ฐ„๊ฒฉ) ยท maksimum per hari (๋ฒˆํ˜ธ๋‹น ํ•˜๋ฃจ ์ตœ๋Œ€ ์š”์ฒญ)Detik sampai nomor yang sama bisa menerima kode lagi (0โ€“3600) ยท jumlah maksimum dalam 24 jam (1โ€“1000)60 detik ยท 10 kali
Batas salah input (ํ‹€๋ฆฐ ์ž…๋ ฅ ํ—ˆ์šฉ ํšŸ์ˆ˜)Jika terlampaui, kode itu dikunci (1โ€“20)5 kali
Izinkan ganti nomor (๋ฒˆํ˜ธ ๋ฐ”๊พธ๊ธฐ ํ—ˆ์šฉ)Akun yang sudah masuk bisa pindah ke nomor lain lewat "Ganti nomor" di aplikasi. Hanya bisa dinyalakan setelah SMS diaturMati

Pengaturan โ€” SMS

PenyediaNilai yang diisiCatatan
Webhook (์›นํ›…)Alamat webhook (์›นํ›… ์ฃผ์†Œ) penerima (https://โ€ฆ), header Authorization (opsional)Server mengirim POST {"phone":"+8210โ€ฆ","code":"12345","text":"โ€ฆ"}. Berhasil jika 2xx. Untuk menyambungkan ke server SMS Anda sendiri atau layanan lain
TwilioAccount SID, Auth Token, nomor pengirim (๋ฐœ์‹  ๋ฒˆํ˜ธ) atau Messaging Service SIDSeluruh dunia, termasuk nomor luar negeri
Solapi (dahulu CoolSMS)API Key, API Secret, nomor pengirimSMS domestik Korea. Nomor pengirim harus nomor yang sudah didaftarkan sebelumnya di Solapi. Nomor +82 dikirim dalam format 010โ€ฆ

Di dalam teks pesan Anda bisa memasukkan {code} (kode) dan {minutes} (masa berlaku). Nilai bawaan: [ํŒŒ๋ฐœ] ์ธ์ฆ ์ฝ”๋“œ: {code} (artinya "[Pabal] Kode verifikasi: {code}"). Setelah menyimpan, periksa dengan Kirim uji (ํ…Œ์ŠคํŠธ ๋ฐœ์†ก).

Pengaturan โ€” email (SMTP)

LayananServer ยท port ยท keamananNama pengguna ยท kata sandi
Gmailsmtp.gmail.com ยท 587 ยท STARTTLSAlamat Gmail ยท sandi aplikasi (Akun Google โ†’ Keamanan โ†’ Verifikasi 2 Langkah โ†’ Sandi aplikasi)
Naversmtp.naver.com ยท 587 ยท STARTTLSID ยท kata sandi (aktifkan penggunaan POP3/SMTP di pengaturan email Naver)
Relay email internalAlamat relay ยท 25 ยท tidak ada (์—†์Œ)Kosongkan

Alamat pengirim (๋ณด๋‚ด๋Š” ์ฃผ์†Œ) harus alamat yang boleh dipakai mengirim oleh akun SMTP tersebut. Subjek (์ œ๋ชฉ) dan isi (๋ณธ๋ฌธ) juga bisa memakai {code} dan {minutes}.

Mengelola pengguna

  • Keluar dari semua perangkat (๋ชจ๋“  ๊ธฐ๊ธฐ ๋กœ๊ทธ์•„์›ƒ): memutus semua status masuk (auth key) akun tersebut. Dipakai untuk pengguna yang kehilangan perangkatnya.
  • Blokir nomor (๋ฒˆํ˜ธ ์ฐจ๋‹จ): nomor itu tidak bisa menerima kode, dan akun dengan nomor itu langsung dikeluarkan dari semua perangkat. Sama dengan daftar Blokir nomor telepon (์ „ํ™”๋ฒˆํ˜ธ ์ฐจ๋‹จ) di tab Pengaturan (์„ค์ •).
  • Email login (๋กœ๊ทธ์ธ ์ด๋ฉ”์ผ): diperlukan agar akun yang sudah ada bisa masuk lewat email saat memakai cara email.
  • Hapus akun (๊ณ„์ • ์‚ญ์ œ): untuk pengguna yang meminta akunnya dihapus, setelah dipastikan bahwa itu memang pemilik akun. Penghapusannya sama persis dengan penghapusan akun di aplikasi dan tidak bisa dibatalkan. Baru dijalankan setelah ID atau nomor telepon akun diketik ulang dan catatan tentang dari mana permintaan datang serta cara memastikan identitasnya ditulis. Catatan disimpan bersama ID dan tanggal (nomor telepon, alamat email, serta nama dan nama pengguna akun itu dihapus darinya). Untuk permintaan lewat email yang tidak datang dari email login akun, kirim kode verifikasi lewat SMS ke nomor akun itu dari jendela yang sama, lalu masukkan kode yang dikirim balik oleh peminta lewat email. Bot dan akun milik server sendiri tidak bisa dihapus di sini.
  • @BotFather adalah bot di dalam server, jadi tidak bisa dikeluarkan dari perangkat mana pun.

Mengelola bot

Di tab Bot (๋ด‡) Anda bisa melihat cara tersambung setiap bot โ€” apakah tersambung lewat MTProto, apakah memanggil getUpdates lewat HTTP dalam 1 menit terakhir, serta apa alamat webhook-nya dan apakah sedang gagal (beserta alasannya). Jika jumlah update yang menunggu terus bertambah, program bot sedang berhenti atau webhook-nya sedang gagal. Penghapusan bot dan penerbitan ulang token dilakukan oleh pembuat bot di @BotFather.

Tab Suara

Di sinilah bot suara dioperasikan (bot yang panggilannya dari aplikasi dijawab oleh model suara AI, lihat Bot suara). Tab ini tetap tampil meskipun suara belum menyala di server, dan kolom status memberi tahu apa yang masih kurang. Cara menyalakannya ada di Instalasi server โ€” Bot suara. Diperbarui setiap 5 detik.

BagianYang terlihat dan yang bisa dilakukan
Angka di bagian atasPanggilan yang sedang berlangsung ยท waktu terpakai hari ini (batas harian server, waktu yang dicadangkan panggilan yang berlangsung) ยท gateway yang tersambung ยท bot yang suaranya menyala (bot yang diizinkan) ยท penguji (sudah dibuka untuk umum atau belum)
StatusLink gateway (alamatnya, atau "Mati โ€” tidak ada rahasia link" (๊บผ์ง (๋งํฌ ๋น„๋ฐ€ ์—†์Œ))), relay panggilan (TURN; jika tidak ada, "Semua panggilan bot berbunyi sibuk" (๋ชจ๋“  ๋ด‡ ํ†ตํ™”๊ฐ€ ํ†ตํ™” ์ค‘)), apakah kebijakan privasi punya bagian bot-calls (jika tidak, "Tidak ada bot yang menerima telepon" (์–ด๋–ค ๋ด‡๋„ ๋ฐ›์ง€ ์•Š์Œ)), persetujuan yang menunggu, serta jumlah telepon yang diakhiri dengan nada sibuk, per alasan (misalnya ์›Œ์น˜๊ฐ€ ๋ชป ๊ฑฐ๋Š” ๋ชจ๋“œ โ€” "mode yang tidak bisa ditelepon jam tangan": panggilan dari Apple Watch ke bot yang memakai tool, MCP, kunci sendiri, mode stream, atau transkrip pemilik bot, WATCH_NOT_YET)
Sakelar daruratHentikan semua panggilan suara (๋ชจ๋“  ์Œ์„ฑ ํ†ตํ™” ๋ฉˆ์ถ”๊ธฐ): begitu ditekan, semua panggilan bot yang sedang berlangsung di server ini berakhir, panggilan baru tidak diterima, dan tidak ada bot yang menampilkan tombol panggil. Setelah itu disimpan, sehingga tetap berlaku meskipun server dimulai ulang (jika penyimpanan gagal, muncul peringatan). Dibuka kembali dengan Buka lagi panggilan suara (์Œ์„ฑ ํ†ตํ™” ๋‹ค์‹œ ์—ด๊ธฐ)
Peluncuran publikSebelum dibuka untuk umum, hanya penguji di bawah yang bisa menelepon bot suara. Untuk membukanya bagi semua orang, ketik persis ๊ณต๊ฐœํ•ฉ๋‹ˆ๋‹ค ("Saya buka untuk umum") di kolomnya lalu tekan Buka untuk semua (๋ชจ๋‘์—๊ฒŒ ๊ณต๊ฐœ) (ditolak jika kunci penerima server, TELEGRAM_VOICE_RECIPIENTS, bernilai โ€ฆ@unset yang belum menentukan wilayah pemrosesan โ€” rilis dulu build aplikasi yang mencantumkan wilayahnya). Dikembalikan dengan Kembali ke penguji saja (์‹œํ—˜์ž๋งŒ์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ). Menyelesaikan telaah hukum dan jawaban tertulis penyedia (Google) sebelum membuka untuk umum adalah keputusan operator โ€” kode tidak mencegahnya
GatewayUntuk setiap gateway yang tersambung: id, panggilan yang ditangani/kapasitas, tujuan pengiriman audio (google.vertex.gemini-live@us-central1, dan sebagainya), fitur (toolsยทbyokยทtranscriptsยทstream โ€ฆ), mesin, boot
Transkrip ยท kunci sendiriMengizinkan transkrip: ketik ๋Œ€ํ™” ๊ธฐ๋ก์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค ("Saya mengizinkan transkrip") di kolomnya lalu tekan Izinkan transkrip (๋Œ€ํ™” ๊ธฐ๋ก ํ—ˆ์šฉ). Jangan izinkan sebelum telaah hukum. Jika dimatikan, langsung mati, dan teks percakapan yang belum diambil oleh panggilan yang berlangsung maupun oleh bot juga dibuang. Simpan percakapan yang dipilih penelepon tidak bergantung pada izin ini dan tidak punya sakelar di halaman admin โ€” yang menyalakannya adalah bagian bot-calls-keep-text di kebijakan privasi (Instalasi server โ€” Simpan percakapan). Kunci sendiri: apakah diterima dan alasannya jika tidak, id kunci induk, jumlah bot yang punya kunci (kuncinya sendiri tidak pernah ditampilkan)
Panggilan yang berlangsungID panggilan, bot, penelepon (nama dan id), status, berjalan/maksimum, gateway, jumlah kueri tool yang terbuka. Akhiri (๋Š๊ธฐ) (dijalankan setelah ditekan dua kali)
Bot suaraBot yang boleh memakai suara: Hanya bot yang diizinkan (ํ—ˆ์šฉํ•œ ๋ด‡๋งŒ) (bawaan) atau Semua bot yang dibuat dengan @BotFather (@BotFather ๋กœ ๋งŒ๋“  ๋ชจ๋“  ๋ด‡). Izinkan (ํ—ˆ์šฉ) dengan id atau @nama pengguna bot. Tabel: bot, pembuat, status (menyala atau mati, apakah bisa menerima telepon beserta alasannya, ditangguhkan, alamat tujuan audio dalam mode stream, tool beserta jumlah jawaban, error, dan waktu habis), suara dan bahasa, batas, panggilan hari ini. Yang bisa dilakukan: Izinkan (ํ—ˆ์šฉ)ยทBatalkan izin (ํ—ˆ์šฉ ์ทจ์†Œ), Periksa dan izinkan lagi (ํ™•์ธํ•˜๊ณ  ๋‹ค์‹œ ํ—ˆ์šฉ), Tangguhkan (๋ฉˆ์ถ”๊ธฐ) (alasan wajib, 200 karakter, terlihat oleh pemilik bot, panggilan yang berlangsung berakhir)ยทBuka lagi (๋‹ค์‹œ ์—ด๊ธฐ), Lihat pengaturan (์„ค์ • ๋ณด๊ธฐ)
Melihat pengaturan botTeks asli instruksi dan salam pembuka (untuk ditelaah), definisi tool dan waktu jawab per tool (p50ยทp95), tujuan kueri tool, versi aturan yang disetujui, pemeriksaan peniruan identitas yang diterapkan atau dikecualikan, perubahan terbaru, serta per bulan: panggilan, menit, panggilan tak terjawab dan ditolak
PengujiDengan id atau @nama pengguna orangnya (boleh dengan atau tanpa @, huruf besar-kecil tidak dibedakan): Jadikan penguji (์‹œํ—˜์ž๋กœ ๋„ฃ๊ธฐ)ยทKeluarkan (๋นผ๊ธฐ) (tidak bisa untuk bot dan akun milik server sendiri). Orang yang dimasukkan lewat pengaturan server TELEGRAM_VOICE_TESTERS ditandai "Server" (์„œ๋ฒ„) dan tidak bisa dikeluarkan di sini
BatasTabel di bawah + Nama tambahan untuk pemeriksaan peniruan identitas (์‚ฌ์นญ ๊ฒ€์‚ฌ์— ๋”ํ•  ์ด๋ฆ„) (satu per baris). Saat disimpan, halaman memberi tahu bot mana yang kini tidak bisa menerima telepon lagi
Panggilan dari botSakelar umum: ketik persis ๋ด‡์ด ๊ฑฐ๋Š” ์ „ํ™”๋ฅผ ์ผญ๋‹ˆ๋‹ค di kotak lalu nyalakan โ€” hanya setelah tinjauan hukum (ditolak selama callme.legal_review pada layar izin belum done; pengecualian untuk server pengembangan dan uji adalah TELEGRAM_VOICE_CALLME_UNREVIEWED). Jika dimatikan, permintaan baru langsung mendapat 503. Negara (bawaan 82, 999 hanya di server uji), batas (server produksi tidak pernah menyimpannya lebih longgar daripada batas bawah), tabel bot yang dinyalakan pemiliknya (status tinjauan, pembekuan token, penghentian otomatis, permintaan hari ini), dan rincian bot (nama, @nama pengguna, foto, instruksi, salam pembuka, tool, suara, bahasa, mode, tujuan, nama pemilik, dan outboundReviewHash-nya) dengan IzinkanยทTarik izin, Cabut penghentian otomatis, dan jumlah penolakan per tahap penilaian

Mengizinkan berarti menelaah. Dalam mode "Hanya bot yang diizinkan", mengizinkan bot berarti mengizinkan instruksi, salam pembuka, dan tool-nya saat itu (dalam mode stream, alamat stream-nya). Jika pemilik bot mengubah salah satunya, tabel bot menampilkan "Instruksi atau salam pembuka berubah โ€” periksa dan izinkan lagi agar bot menerima telepon" (์ง€์‹œ๋ฌธยท์ธ์‚ฌ๋ง์ด ๋ฐ”๋€œ โ€” ํ™•์ธํ•˜๊ณ  ๋‹ค์‹œ ํ—ˆ์šฉํ•ด์•ผ ์ „ํ™”๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค), dan bot itu tidak menerima telepon sampai Anda menekan Periksa dan izinkan lagi (ํ™•์ธํ•˜๊ณ  ๋‹ค์‹œ ํ—ˆ์šฉ). Hal yang sama berlaku untuk bot yang bahasanya bukan bahasa Korea atau Inggris, bahkan dalam mode "Semua bot yang dibuat dengan @BotFather" โ€” karena pemeriksaan aturan otomatis saat pengaturan disimpan hanya membaca bahasa Korea dan Inggris. Untuk bot seperti itu, tabel bot menampilkan "Bot yang bahasanya bukan bahasa Korea atau Inggris (tidak terbaca oleh pemeriksaan aturan otomatis): bacalah instruksi dan salam pembukanya โ€” periksa dan izinkan lagi agar bot menerima telepon" (ํ•œ๊ตญ์–ดยท์˜์–ด๊ฐ€ ์•„๋‹Œ ๋ด‡ (์ž๋™ ๊ทœ์น™ ๊ฒ€์‚ฌ๊ฐ€ ์ฝ์ง€ ๋ชปํ•จ): ์ง€์‹œ๋ฌธยท์ธ์‚ฌ๋ง์„ ์ฝ์–ด ์ฃผ์„ธ์š” โ€” ํ™•์ธํ•˜๊ณ  ๋‹ค์‹œ ํ—ˆ์šฉํ•ด์•ผ ์ „ํ™”๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค), jadi mintalah orang yang bisa membaca bahasa itu untuk membaca instruksi dan salam pembukanya lalu mengizinkannya.

BatasBawaanRentang
Maksimum satu panggilan (detik)60060โ€“3600, sampai pengaturan server TELEGRAM_VOICE_MAX_SECONDS
Panggilan bersamaan satu bot21โ€“100, sampai pengaturan server TELEGRAM_VOICE_BOT_CONCURRENCY
Jumlah panggilan per jam satu orang201โ€“200
Menit panggilan per hari satu orang601โ€“600
Menit panggilan per hari satu bot601โ€“6000
Menit panggilan per hari satu pemilik bot1201โ€“6000
Menit panggilan per hari seluruh server3001โ€“100000
Panggilan terpendek yang diterima (detik)6030โ€“300 โ€” jika sisa waktu kurang dari ini, tidak diterima
Batasan akun baru (hari)70โ€“90 (0 = mati) โ€” kecuali penguji, dan orang yang pernah dikirimi pesan oleh bot lebih dari sehari sebelumnya
  • Satu hari mengikuti zona waktu server (TELEGRAM_VOICE_TIME_ZONE, bawaan Asia/Seoul). Saat panggilan diterima, durasi maksimumnya ditetapkan dalam sisa waktu hari itu dan dicadangkan di semua batas; setelah selesai, hanya detik yang sebenarnya menurut jam server yang ditagihkan. Panggilan yang diterima dengan kunci sendiri milik pemilik bot hanya memakai batas penelepon.
  • Pemilik bot hanya bisa mengatur durasi satu panggilan (bawaan 300 detik) dan panggilan bersamaan bot miliknya di dalam batas ini.
  • Semua tindakan (sakelar darurat, peluncuran publik, izin, penangguhan, penutupan telepon, batas, โ€ฆ) tercatat di log aktivitas tab Kode pendaftaran (๊ฐ€์ž… ์ฝ”๋“œ) dengan awalan ์Œ์„ฑ: โ€ฆ ("Suara: โ€ฆ").
  • Angka kualitas panggilan suara (waktu sampai suara pertama, waktu sampai berhenti saat disela, waktu jawab tool, dan sebagainya) tidak ada di tab ini, melainkan hanya di /metrics pada port admin (nama yang diawali voice. di JSON, dan voice_ di format Prometheus /metrics?format=prometheus). Isinya hanya total โ€” tanpa orang, bot, maupun ucapan.

Hal yang sama bisa dilakukan lewat API admin (semuanya dengan Authorization: Bearer <token>): GET /admin/api/voice, GET /admin/api/voice/bots/<id>, dan lewat POST: voice/kill {"on": true}, voice/launch {"launched": true, "confirm": "โ€ฆ"}, voice/transcripts {"allowed": true, "confirm": "โ€ฆ"}, voice/testersยทvoice/testers/remove {"userId": โ€ฆ}, voice/gate {"botGate": "ALLOWLIST"}, voice/bots/allowยทvoice/bots/disallow {"botId": โ€ฆ}, voice/bots/<id>/suspend {"reason": "โ€ฆ"}ยทโ€ฆ/liftยทโ€ฆ/name-exempt, voice/calls/<id>/end; batasnya lewat /admin/api/settings/voice. Panggilan dari bot: voice/outbound {"on": true, "confirm": "โ€ฆ"}, voice/outbound/settings {"countries": [โ€ฆ], "limits": {โ€ฆ}}, GET /admin/api/voice/outbound/bots/<id>, voice/outbound/bots/allow {"botId": โ€ฆ, "expect": "<outboundReviewHash>"}ยทvoice/outbound/bots/disallow, voice/outbound/bots/<id>/lift.

Variabel lingkungan

Server membaca berkas pengaturan (server-config.json) lalu menimpanya dengan variabel lingkungan. Berkas compose produksi sudah menetapkan nilai-nilai di bawah, jadi biasanya Anda cukup mengubah .env.

VariabelArtiNilai di compose produksi
TELEGRAM_PORTPort MTProtoMTPROTO_PORT (8443)
TELEGRAM_HOSTAlamat yang didengarkan MTProto0.0.0.0
TELEGRAM_PUBLIC_HOSTAlamat server yang diberitahukan ke aplikasi (help.getConfig)PUBLIC_IP
TELEGRAM_WEB_PORTPort situs web, dokumentasi, Bot API, dan halaman admin8080
TELEGRAM_WEB_HOSTAlamat yang didengarkan port itu. Bawaan 127.0.0.10.0.0.0 (di dalam kontainer; di host hanya dibuka di 127.0.0.1)
TELEGRAM_PUBLIC_URLAlamat situs web. Dipakai untuk tautan (me_url_prefix), tautan undangan, contoh di dokumentasi, dan gambar pratinjauhttps://DOMAIN/
TELEGRAM_DATA_DIRLokasi foto, berkas, admin-token, dan operations.json/app/data
TELEGRAM_RSA_KEYPath kunci privat RSA server (dibuat di awal jika belum ada; kunci publiknya .pub)/app/keys/private.pem
TELEGRAM_DC_IDNomor DC server ini. Harus sama dengan DC yang dipakai aplikasi sebagai rumahnya (2 untuk semua aplikasi Telegram) โ€” jika berbeda, unduhan foto dan berkas tidak pernah dimulaiDC_ID (2)
TELEGRAM_DB_TYPEmemory ยท h2 ยท postgresqlpostgresql
TELEGRAM_DB_URL, TELEGRAM_DB_USERNAME, TELEGRAM_DB_PASSWORDKoneksi JDBCjdbc:postgresql://pabal-postgres:5432/pabal, pabal, POSTGRES_PASSWORD
TELEGRAM_DB_MAX_POOL_SIZEJumlah koneksi DB20
TELEGRAM_ADMIN_TOKENToken halaman admin (jika kosong, dibuat di data/admin-token)ADMIN_TOKEN
TELEGRAM_MAX_FILE_SIZEBerkas terbesar yang boleh dikirim (2GBยท512MBยทjumlah byte). Potongannya ditulis ke disk begitu tiba, jadi yang membatasi adalah disk, bukan memoriMAX_FILE_SIZE (2GB)
TELEGRAM_TEST_NUMBERSNomor uji +99966โ€ฆ. Khusus pengembanganfalse
TELEGRAM_WEBHOOK_ALLOW_LOCALMengizinkan webhook bot memakai http:// dan alamat internal. Khusus pengembangan(tidak diatur = false)
TELEGRAM_FCM_CREDENTIALSPath berkas kunci akun layanan Firebase untuk push Android. Jika kosong, push mati (Instalasi server โ€” langkah 10)FCM_CREDENTIALS (kosong)
TELEGRAM_FCM_PROJECT_IDHanya jika mengirim ke project Firebase selain project_id di berkas kunciFCM_PROJECT_ID (kosong)
TELEGRAM_PUSH_PREVIEWSJika false, notifikasi push hanya menampilkan pengirim tanpa isi pesanPUSH_PREVIEWS (true)
TELEGRAM_TURN_HOST, TELEGRAM_TURN_PORT, TELEGRAM_TURN_SECRETRelay panggilan (TURN) โ€” tempat dua aplikasi di jaringan berbeda bertemu. Tanpa rahasia, hanya ada sambungan langsung (Instalasi server โ€” Relay panggilan)TURN_HOST (kosong: DOMAIN), TURN_PORT (3478), TURN_SECRET (kosong)
TELEGRAM_APNS_KEY, TELEGRAM_APNS_KEY_ID, TELEGRAM_APNS_TEAM_ID, TELEGRAM_APNS_TOPIC, TELEGRAM_APNS_MIN_BUILD, TELEGRAM_APNS_VOIP_MIN_BUILDPush iPhone (APNs) โ€” jalur berkas kunci, ID kunci (kosong: diambil dari nama berkas), tim yang menandatangani aplikasi, bundle ID, build terendah yang dikirimi, dan build pertama yang mendapat layar panggilan CallKit. Tanpa kunci, push iPhone mati (Instalasi server โ€” langkah 11)APNS_* (tanpa kunci, kosong โ€” dari nama berkas, 4Z8R468M2D, me.pabal.ios, 4, kosong)
TELEGRAM_STATIC_MAPS_KEY, TELEGRAM_STATIC_MAPS_PER_DAY, TELEGRAM_STATIC_MAPS_PER_USER_HOURGambar peta di pesan lokasi โ€” kunci Google Maps Static API, jumlah gambar baru yang diambil per hari, dan jumlah yang boleh dipicu satu orang per jam. Tanpa kunci, gambar peta mati (Instalasi server โ€” Gambar peta)STATIC_MAPS_* (tanpa kunci, 300, 120)
JAVA_OPTSOpsi JVM (memori)Nilai di .env

Variabel lingkungan โ€” bot suara

Di produksi, berkas tambahan deploy/docker-compose.voice.yml mengisi sebagian di antaranya dari nilai .env โ€” link, relay, zona waktu, batas, penguji, dan build minimum; sisanya ditambahkan per fitur setelah ditinjau sendiri (Instalasi server โ€” Bot suara). Pengaturan VOICE_* untuk gateway (pabal-voice) ada di voice/README.md di repositori.

VariabelBawaanArti
TELEGRAM_VOICE_LINK_SECRET_FILEโ€”Rahasia link 32 byte (64 digit hex), sama dengan milik gateway. Jika tidak ada atau salah, suara mati
TELEGRAM_VOICE_LINK_HOST, TELEGRAM_VOICE_LINK_PORT127.0.0.1, 8095Tempat link mendengarkan. Jika bukan loopback, perlu TELEGRAM_VOICE_LINK_ANY_ADDRESS=true, dan alamat publik selalu ditolak
TELEGRAM_VOICE_LINK_ANY_ADDRESSโ€”Pernyataan bahwa "jaringan ini hanya dipakai server dan gateway"
TELEGRAM_VOICE_TURN_HOST, TELEGRAM_VOICE_TURN_PORTโ€”Alamat relay yang diberikan ke gateway (alamat LAN server). Diabaikan jika loopback
TELEGRAM_VOICE_MAX_SECONDS600Panggilan terpanjang yang diizinkan server ini (60โ€“3600)
TELEGRAM_VOICE_BOT_CONCURRENCY2Batas atas panggilan bersamaan satu bot (operator dan pemilik bot hanya bisa menurunkannya)
TELEGRAM_VOICE_TIME_ZONEAsia/SeoulAcuan batas harian dan bulanan
TELEGRAM_VOICE_TESTERSโ€”Daftar id pengguna penguji (digabung dengan daftar di halaman admin). * hanya untuk server uji
TELEGRAM_VOICE_RECIPIENTSgoogle.vertex.gemini-live@us-central1Penerima yang disebutkan di layar konfirmasi aplikasi. Harus sama dengan milik gateway agar panggilan diteruskan
TELEGRAM_VOICE_MIN_BUILD_DESKTOP, _ANDROID, _IOS, _WATCHOS1, 62151, 5, 1Build aplikasi pertama yang benar-benar memuat layar konfirmasi (untuk desktop, angka setelah tag pabal-bc). Jika penerima berubah, rilis build baru lalu naikkan nilainya. Untuk desktop, naikkan menjadi 2 saat pertama kali menyetujui layar konfirmasi dalam bahasa selain Korea dan Inggris
TELEGRAM_VOICE_MIN_SHEET_VERSION1Versi layar konfirmasi terendah yang diterima
TELEGRAM_VOICE_TOOL_RESULT_BYTES16384Ukuran maksimum jawaban tool (1024โ€“16384)
TELEGRAM_VOICE_KEYS_MASTER_FILE, TELEGRAM_VOICE_KEYS_PREVIOUS_MASTER_FILEโ€”Kunci induk yang membungkus kunci sendiri dan rahasia stream, serta kunci lama saat penggantian. Di folder 700, di luar cadangan
TELEGRAM_VOICE_OWN_KEYS_APPS_READYโ€”Isi true hanya setelah aplikasi menampilkan layar konfirmasi (versi 2) untuk bot berkunci sendiri. Sebelum itu, kunci sendiri tidak diterima
TELEGRAM_VOICE_OWN_KEY_MIN_SHEET_VERSION, TELEGRAM_VOICE_TRANSCRIPT_MIN_SHEET_VERSION2, 1Versi layar konfirmasi yang diperlukan untuk panggilan berkunci sendiri dan pengumuman transkrip (server produksi tidak menurunkan versi kunci sendiri di bawah 2)
TELEGRAM_VOICE_STREAM_MIN_BUILD_DESKTOP, _ANDROID, _IOS0 (tidak ada)Build aplikasi pertama yang memuat layar konfirmasi mode stream. Jika 0, tidak ada yang bisa menelepon bot mode stream
TELEGRAM_VOICE_STREAM_MIN_SHEET_VERSION2Versi layar konfirmasi mode stream
TELEGRAM_VOICE_STREAM_DENY_ADDRESSESโ€”Alamat milik deployment ini yang tidak boleh dijangkau alamat stream (host publik dan host situs ditambahkan otomatis)
TELEGRAM_WATCH_API_PORT, _HOST, _ANY_ADDRESS, TELEGRAM_WATCH_AUDIO_URL, TELEGRAM_WATCH_ALLOW_PLAIN, TELEGRAM_WATCH_SESSION_DAYS, TELEGRAM_WATCH_AUTH_PER_MINUTEโ€”, 127.0.0.1, โ€”, โ€”, โ€”, 7, 30Alamat API Apple Watch dan pintu masuk audio (Instalasi server โ€” pintu masuk Apple Watch). ALLOW_PLAIN khusus pengembangan
TELEGRAM_VOICE_EVIDENCE_KEY_DIRโ€”Folder kunci untuk catatan izin panggilan dari bot (bukti HMAC). 700, di luar folder yang dicadangkan. Dibuat dan diganti dengan scripts/voice-evidence-key.py. Tanpanya tidak ada yang bisa menyalakan izin. Dengan Docker Compose, variabel yang hanya ada di .env tidak sampai ke server โ€” saat menyalakan panggilan dari bot, tambahkan ke pabal-server di deploy/docker-compose.voice.yml, pada environment (path di dalam kontainer) dan volumes (folder di host)
TELEGRAM_VOICE_OUTBOUND_MIN_BUILD_DESKTOP, _ANDROID, _IOS, _WATCHOS0 (tidak ada)Versi aplikasi pertama dengan layar izin. Versi yang lebih lama tidak bisa menyalakan izin dan panggilan dari bot tidak membunyikannya. 0 berarti platform itu tidak punya
TELEGRAM_VOICE_CALLME_DEVICE_AGE_SECONDS86400Berapa lama setelah masuk sebuah perangkat boleh menyalakan izin (detik). Hanya server uji yang bisa mengubahnya (server produksi memberi peringatan dan mengabaikannya)
TELEGRAM_VOICE_KEEP_TEXT_UNREVIEWEDโ€”Menampilkan di jam tangan teks kotak centang Simpan percakapan yang belum ditinjau secara hukum. Khusus server uji internal
TELEGRAM_MCP_*, TELEGRAM_MCP_APPS_READYโ€”Komponen MCP (ditambahkan oleh deploy/docker-compose.mcp.yml). TELEGRAM_MCP_EGRESS_OWN_ADDRESSES (alamat publik Pabal) tetap dipakai meski tanpa MCP, agar permintaan webhook dan tool tidak menuju Pabal sendiri
TELEGRAM_VOICE_BOTS, TELEGRAM_VOICE_NOTICE_CHECK=off, TELEGRAM_VOICE_STREAM_ALLOW_PRIVATEโ€”Khusus server uji (hanya saat TELEGRAM_TEST_NUMBERS=true): mengizinkan bot yang terdaftar (id atau @nama, * untuk semua bot) ยท melewati pemeriksaan bagian hukum ยท alamat privat sebagai alamat stream
TELEGRAM_VOICE_CALLME_UNREVIEWED, TELEGRAM_VOICE_DEV_ECHO_OUTBOUND, TELEGRAM_VOICE_TEST_DIAL, TELEGRAM_VOICE_TEST_DIAL_USERSโ€”Khusus server uji dan pengembangan: sakelar panggilan dari bot boleh dinyalakan sebelum tinjauan hukum (server pengembangan dan uji) ยท gateway gema melakukan panggilan bot (server pengembangan, TELEGRAM_TEST_MODE) ยท panggilan uji API admin dan akun yang boleh dibunyikannya (sampai 20 selain nomor uji +99966, server uji). Server produksi memberi peringatan dan mengabaikannya

Berkas data

BerkasIsiIzin
keys/private.pemKunci privat RSA server. Jangan pernah dikeluarkan dari server600
keys/private.pem.pubKunci publik. Dipakai untuk build aplikasi dan /docs/server-key.pemโ€”
keys/firebase-service-account.json(Opsional) Kunci rahasia Firebase untuk push Android. Jika bocor, hapus di konsol Firebase lalu unduh yang baru600
data/admin-tokenToken halaman admin600
data/operations.jsonNilai dari tab Pengaturan (์„ค์ •) โ€” aturan pendaftaran, nilai rahasia SMS dan SMTP, nomor yang diblokir, serta pengaturan tab Suara (sakelar darurat, peluncuran publik, penguji, bot yang diizinkan, batas)600
keys/voice-link.secret(Bot suara) Rahasia link, sama dengan milik gateway400
/etc/pabal/voice/voice-master.key(Bot suara) Kunci induk yang membungkus kunci sendiri milik pemilik bot dan rahasia stream. Di luar folder data, jangan dimasukkan ke cadangan600 (folder 700)
data/media/Foto dan berkas asliโ€”
Tabel events PostgreSQLAkun, obrolan, pesan, status masuk, bot, pengaturan webhook โ€” catatan semua perubahanโ€”

Catatan keamanan

  • Jangan buka port admin langsung ke internet. Caddy dalam susunan produksi memblokir jalur administrasi seperti /admin, /health, dan /metrics dengan 404.
  • Semua permintaan data admin memerlukan Authorization: Bearer <token>, dan halaman dari situs lain tidak bisa membacanya.
  • Nilai rahasia SMS dan SMTP hanya ada di operations.json; halaman dan API hanya memberi tahu "Tersimpan" (์ €์žฅ๋จ). Jika kolom nilai rahasia dibiarkan kosong saat menyimpan, nilai lama tetap dipakai.
  • Token dan nilai rahasia tidak dicetak ke log, dan nomor telepon di log disamarkan. Alamat Bot API (yang memuat token) juga tidak dicatat ke log.
  • Token perangkat untuk notifikasi push hanya tercatat di log sebagai sidik jari, sedangkan isi berkas kunci Firebase dan isi notifikasi tidak tercatat di log.
  • Auth key tersimpan di DB, jadi siapa pun yang bisa mengakses DB dapat mendekripsi lalu lintas pengguna. Jaga DB dan cadangannya seketat kunci RSA.

Keterbatasan

  • Kode yang sedang menunggu dan catatan terbaru ada di memori, jadi hilang saat server dimulai ulang (cukup minta lagi dari aplikasi).
  • Pengiriman sungguhan oleh penyedia SMS harus diperiksa dengan akun masing-masing penyedia. Server menyusun permintaan sesuai dokumentasi setiap penyedia.
  • Yang belum ada: penghapusan paksa bot, melihat isi pesan, melihat log, grafik, dan statistik notifikasi push (push diperiksa lewat log server).