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
| Tab | Isi | Diperbarui |
|---|---|---|
| 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 peringatan | 5 detik |
| Kode pendaftaran (๊ฐ์ ์ฝ๋) | Kode yang sedang menunggu (nomor, cara pengiriman, status pengiriman, kode, sisa waktu, jumlah salah input) dan catatan terbaru. Salin atau batalkan kode | 3 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 menunggu | 10 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 bantuan | 10 detik |
| Pengaturan (์ค์ ) | Aturan pendaftaran dan masuk, akun peninjauan toko aplikasi, SMS, email (SMTP), pemblokiran nomor telepon, informasi operator yang dimuat di situs web | Disimpan 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 merebutnya | Sekali saat dibuka |
| Penyimpanan (์ ์ฅ์) | Direktori data dan alamat DB (kata sandi disembunyikan), jumlah dan ukuran foto serta berkas, jumlah stream penyimpanan per jenis | 10 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 pengiriman | Tujuan kode | Layar aplikasi |
|---|---|---|
| Halaman admin (๊ด๋ฆฌ ํ๋ฉด) | Tab Kode pendaftaran (๊ฐ์ ์ฝ๋). Operator menyalinnya dan memberitahukannya langsung | Nomor โ "Kode telah dikirim" โ kode (jika nomornya baru, nama) |
| SMS | Pesan teks lewat salah satu dari Twilio ยท Solapi ยท webhook | Sama dengan halaman admin |
| Email (์ด๋ฉ์ผ) | Email lewat SMTP | Nomor โ 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
| Butir | Arti | Bawaan |
|---|---|---|
| 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 produksi | Sesuai server |
| Jumlah digit kode (์ฝ๋ ์๋ฆฟ์) ยท masa berlaku (์ฝ๋ ์ ํจ ์๊ฐ) | 5โ6 digit ยท 1โ60 menit | 5 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 diatur | Mati |
Pengaturan โ SMS
| Penyedia | Nilai yang diisi | Catatan |
|---|---|---|
| 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 |
| Twilio | Account SID, Auth Token, nomor pengirim (๋ฐ์ ๋ฒํธ) atau Messaging Service SID | Seluruh dunia, termasuk nomor luar negeri |
| Solapi (dahulu CoolSMS) | API Key, API Secret, nomor pengirim | SMS 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)
| Layanan | Server ยท port ยท keamanan | Nama pengguna ยท kata sandi |
|---|---|---|
| Gmail | smtp.gmail.com ยท 587 ยท STARTTLS | Alamat Gmail ยท sandi aplikasi (Akun Google โ Keamanan โ Verifikasi 2 Langkah โ Sandi aplikasi) |
| Naver | smtp.naver.com ยท 587 ยท STARTTLS | ID ยท kata sandi (aktifkan penggunaan POP3/SMTP di pengaturan email Naver) |
| Relay email internal | Alamat 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.
| Bagian | Yang terlihat dan yang bisa dilakukan |
|---|---|
| Angka di bagian atas | Panggilan 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) |
| Status | Link 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 darurat | Hentikan 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 publik | Sebelum 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 |
| Gateway | Untuk 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 sendiri | Mengizinkan 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 berlangsung | ID panggilan, bot, penelepon (nama dan id), status, berjalan/maksimum, gateway, jumlah kueri tool yang terbuka. Akhiri (๋๊ธฐ) (dijalankan setelah ditekan dua kali) |
| Bot suara | Bot 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 bot | Teks 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 |
| Penguji | Dengan 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 |
| Batas | Tabel 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 bot | Sakelar 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.
| Batas | Bawaan | Rentang |
|---|---|---|
| Maksimum satu panggilan (detik) | 600 | 60โ3600, sampai pengaturan server TELEGRAM_VOICE_MAX_SECONDS |
| Panggilan bersamaan satu bot | 2 | 1โ100, sampai pengaturan server TELEGRAM_VOICE_BOT_CONCURRENCY |
| Jumlah panggilan per jam satu orang | 20 | 1โ200 |
| Menit panggilan per hari satu orang | 60 | 1โ600 |
| Menit panggilan per hari satu bot | 60 | 1โ6000 |
| Menit panggilan per hari satu pemilik bot | 120 | 1โ6000 |
| Menit panggilan per hari seluruh server | 300 | 1โ100000 |
| Panggilan terpendek yang diterima (detik) | 60 | 30โ300 โ jika sisa waktu kurang dari ini, tidak diterima |
| Batasan akun baru (hari) | 7 | 0โ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, bawaanAsia/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
/metricspada port admin (nama yang diawalivoice.di JSON, danvoice_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.
| Variabel | Arti | Nilai di compose produksi |
|---|---|---|
TELEGRAM_PORT | Port MTProto | MTPROTO_PORT (8443) |
TELEGRAM_HOST | Alamat yang didengarkan MTProto | 0.0.0.0 |
TELEGRAM_PUBLIC_HOST | Alamat server yang diberitahukan ke aplikasi (help.getConfig) | PUBLIC_IP |
TELEGRAM_WEB_PORT | Port situs web, dokumentasi, Bot API, dan halaman admin | 8080 |
TELEGRAM_WEB_HOST | Alamat yang didengarkan port itu. Bawaan 127.0.0.1 | 0.0.0.0 (di dalam kontainer; di host hanya dibuka di 127.0.0.1) |
TELEGRAM_PUBLIC_URL | Alamat situs web. Dipakai untuk tautan (me_url_prefix), tautan undangan, contoh di dokumentasi, dan gambar pratinjau | https://DOMAIN/ |
TELEGRAM_DATA_DIR | Lokasi foto, berkas, admin-token, dan operations.json | /app/data |
TELEGRAM_RSA_KEY | Path kunci privat RSA server (dibuat di awal jika belum ada; kunci publiknya .pub) | /app/keys/private.pem |
TELEGRAM_DC_ID | Nomor 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 dimulai | DC_ID (2) |
TELEGRAM_DB_TYPE | memory ยท h2 ยท postgresql | postgresql |
TELEGRAM_DB_URL, TELEGRAM_DB_USERNAME, TELEGRAM_DB_PASSWORD | Koneksi JDBC | jdbc:postgresql://pabal-postgres:5432/pabal, pabal, POSTGRES_PASSWORD |
TELEGRAM_DB_MAX_POOL_SIZE | Jumlah koneksi DB | 20 |
TELEGRAM_ADMIN_TOKEN | Token halaman admin (jika kosong, dibuat di data/admin-token) | ADMIN_TOKEN |
TELEGRAM_MAX_FILE_SIZE | Berkas terbesar yang boleh dikirim (2GBยท512MBยทjumlah byte). Potongannya ditulis ke disk begitu tiba, jadi yang membatasi adalah disk, bukan memori | MAX_FILE_SIZE (2GB) |
TELEGRAM_TEST_NUMBERS | Nomor uji +99966โฆ. Khusus pengembangan | false |
TELEGRAM_WEBHOOK_ALLOW_LOCAL | Mengizinkan webhook bot memakai http:// dan alamat internal. Khusus pengembangan | (tidak diatur = false) |
TELEGRAM_FCM_CREDENTIALS | Path berkas kunci akun layanan Firebase untuk push Android. Jika kosong, push mati (Instalasi server โ langkah 10) | FCM_CREDENTIALS (kosong) |
TELEGRAM_FCM_PROJECT_ID | Hanya jika mengirim ke project Firebase selain project_id di berkas kunci | FCM_PROJECT_ID (kosong) |
TELEGRAM_PUSH_PREVIEWS | Jika false, notifikasi push hanya menampilkan pengirim tanpa isi pesan | PUSH_PREVIEWS (true) |
TELEGRAM_TURN_HOST, TELEGRAM_TURN_PORT, TELEGRAM_TURN_SECRET | Relay 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_BUILD | Push 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_HOUR | Gambar 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_OPTS | Opsi 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.
| Variabel | Bawaan | Arti |
|---|---|---|
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_PORT | 127.0.0.1, 8095 | Tempat 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_SECONDS | 600 | Panggilan terpanjang yang diizinkan server ini (60โ3600) |
TELEGRAM_VOICE_BOT_CONCURRENCY | 2 | Batas atas panggilan bersamaan satu bot (operator dan pemilik bot hanya bisa menurunkannya) |
TELEGRAM_VOICE_TIME_ZONE | Asia/Seoul | Acuan batas harian dan bulanan |
TELEGRAM_VOICE_TESTERS | โ | Daftar id pengguna penguji (digabung dengan daftar di halaman admin). * hanya untuk server uji |
TELEGRAM_VOICE_RECIPIENTS | google.vertex.gemini-live@us-central1 | Penerima yang disebutkan di layar konfirmasi aplikasi. Harus sama dengan milik gateway agar panggilan diteruskan |
TELEGRAM_VOICE_MIN_BUILD_DESKTOP, _ANDROID, _IOS, _WATCHOS | 1, 62151, 5, 1 | Build 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_VERSION | 1 | Versi layar konfirmasi terendah yang diterima |
TELEGRAM_VOICE_TOOL_RESULT_BYTES | 16384 | Ukuran 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_VERSION | 2, 1 | Versi 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, _IOS | 0 (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_VERSION | 2 | Versi 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, 30 | Alamat 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, _WATCHOS | 0 (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_SECONDS | 86400 | Berapa 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
| Berkas | Isi | Izin |
|---|---|---|
keys/private.pem | Kunci privat RSA server. Jangan pernah dikeluarkan dari server | 600 |
keys/private.pem.pub | Kunci 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 baru | 600 |
data/admin-token | Token halaman admin | 600 |
data/operations.json | Nilai 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 gateway | 400 |
/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 cadangan | 600 (folder 700) |
data/media/ | Foto dan berkas asli | โ |
Tabel events PostgreSQL | Akun, 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/metricsdengan 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).