Artikel ini menjelaskan cara yang direkomendasikan untuk menjalankan beberapa instance TTMediaBot di Ubuntu 22.04 menggunakan arsitektur yang rapi dan mudah diskalakan.
Saya mengasumsikan saat melakukan instalasi ini, Kamu menggunakan user dengan akses sudo. Saya tidak mengambil risiko menggunakan root secara langsung karena terlalu kasar, jadi silakan sesuaikan dengan kebiasaan Kamu.
Key design:
- 1 source TTMediaBot bersama di
/opt - 1 Python virtual environment bersama
- 1 instalasi Deno global
- 1 user Linux untuk setiap bot
- Template systemd user service disimpan di
/opt - Optimasi PulseAudio per user untuk menurunkan beban CPU
System Layout
- Shared source:
/opt/TTMediaBot - Shared Python venv:
/opt/TTMediaBot/venv - systemd templates:
/opt/TTMediaBot/systemd/user - Per-user config:
~/TTMediaBot/config/config.json - Per-user PulseAudio:
~/.config/pulse/
STEP 1 – SYSTEM UPDATE AND DEPENDENCIES
Update sistem dan install paket yang dibutuhkan:
sudo apt update
sudo apt install -y pulseaudio libmpv-dev p7zip-full git curl nano python3-venv -y
Explanation: Paket-paket ini umumnya dibutuhkan untuk audio, ekstraksi file, dan Python environment.
STEP 2 – INSTALL DENO GLOBALLY (REQUIRED)
Hapus instalasi Deno per-user yang mungkin sudah ada agar tidak bentrok:
sudo rm -rf /home/*/.deno
sudo rm -rf /root/.deno
Note: Kamu perlu membersihkan .bashrc dan .profile setiap user secara manual jika sebelumnya menambahkan Deno ke PATH.
Install Deno:
curl -fsSL https://deno.land/install.sh | sh
Note: Saat ditanya untuk menambahkan Deno ke PATH, jangan ditambahkan. Kita akan memindahkannya secara manual.
Pindahkan binary Deno ke lokasi global:
sudo mv ~/.deno/bin/deno /usr/local/bin/deno
sudo chmod 755 /usr/local/bin/deno
sudo rm -rf ~/.deno
Verifikasi instalasi:
which deno
deno --version
Expected output: /usr/local/bin/deno
STEP 3 – CLONE TTMEDIABOT TO /opt
Clone repository ke direktori shared:
sudo git clone https://github.com/gumerov-amir/TTMediaBot.git /opt/TTMediaBot
Explanation: Direktori /opt memang ditujukan untuk aplikasi pihak ketiga yang dipakai bersama.
STEP 4 – REQUIRED SOURCE MODIFICATIONS (ONCE)
Lakukan edit berikut untuk memperbaiki dependency dan kompatibilitas. Langkah ini cukup dilakukan sekali untuk sistem.
4.1 Update Python dependencies
sudo nano /opt/TTMediaBot/requirements.txt
Temukan lalu hapus/ganti:
youtube-search-python
yt-dlp
Pastikan diganti menjadi:
py-yt-search
yt-dlp[default]
Explanation: youtube-search-python sudah deprecated. yt-dlp[default] mengaktifkan dukungan pemecahan challenge JavaScript melalui Deno.
4.2 Replace yt.py service implementation
sudo curl -L -o /opt/TTMediaBot/bot/services/yt.py "https://www.dropbox.com/scl/fi/znzgxe21yqp3fstu1td1o/yt.py?rlkey=h0lva6fo5l9ibtbrmkg19sogd&st=py9kexx5&dl=1"
Explanation: File yt.py ini versi update untuk memperbaiki masalah pencarian dan playback di yt-dlp terbaru.
4.3 Update TeamTalk SDK downloader
sudo nano /opt/TTMediaBot/tools/ttsdk_downloader.py
Cari baris versi (sekitar line 20–30):
version = [i for i in versions if "5.15" in i.text][-1].a.get("href")[0:-1]
Ubah "5.15" menjadi "5.19" (atau stable terbaru):
version = [i for i in versions if "5.19" in i.text][-1].a.get("href")[0:-1]
Explanation: TeamTalk SDK 5.15 sudah tidak tersedia.
4.4 Update TTMediaBot launcher (IMPORTANT)
Buat/Edit launcher script:
sudo nano /opt/TTMediaBot/TTMediaBot.sh
Paste isi berikut persis:
#!/bin/bash
PROGNAME=TTMediaBot.py
PROGDIR=$(dirname "$(readlink -f "$0")")
VENV_PYTHON="$PROGDIR/venv/bin/python"
export LD_LIBRARY_PATH="$PROGDIR/TeamTalk_DLL:$PROGDIR:$LD_LIBRARY_PATH"
exec "$VENV_PYTHON" "$PROGDIR/$PROGNAME" "$@"
Jadikan executable:
sudo chmod +x /opt/TTMediaBot/TTMediaBot.sh
Explanation: Semua user akan menjalankan TTMediaBot melalui Python virtual environment yang shared.
STEP 5 – CREATE SHARED PYTHON VIRTUAL ENVIRONMENT
IMPORTANT: Ini harus dilakukan sebagai root karena /opt dimiliki root.
sudo -i
cd /opt/TTMediaBot
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
Download TeamTalk SDK:
cd tools
python3 ttsdk_downloader.py
Keluar dari virtual environment dan sesi root:
deactivate
exit
(Kamu sekarang kembali ke prompt user normal)
STEP 6 – CREATE SHARED GROUP AND LOCK PERMISSIONS
Buat group untuk semua user bot:
sudo groupadd ttbotshare
Atur ownership dan permission:
sudo chown -R root:ttbotshare /opt/TTMediaBot
# Allow owner (root) full access, group (bots) read/execute access
sudo chmod -R 755 /opt/TTMediaBot
sudo chmod -R g+rX /opt/TTMediaBot
# Ensure the launcher is executable
sudo chmod 755 /opt/TTMediaBot/TTMediaBot.sh
Explanation: systemd user services tidak bisa mengeksekusi binary yang dimiliki user lain. Root ownership mencegah error seperti status=203/EXEC.
STEP 7 – PREPARE SYSTEMD USER SERVICE TEMPLATE
Edit file service yang sudah ada di repo:
sudo nano /opt/TTMediaBot/systemd/user/TTMediaBot.service
Pastikan isinya seperti berikut:
[Unit]
Description=TTMediaBot
Requires=pulseaudio.service
[Service]
Type=simple
WorkingDirectory=/opt/TTMediaBot
ExecStart=/opt/TTMediaBot/TTMediaBot.sh -c %h/TTMediaBot/config/config.json
Restart=on-failure
Environment=HOME=%h
Environment=XDG_CACHE_HOME=%h/.cache
Environment=XDG_CONFIG_HOME=%h/.config
Environment=XDG_DATA_HOME=%h/.local/share
[Install]
WantedBy=default.target
Explanation: File ini bertindak sebagai template reusable untuk semua user bot.
STEP 8 – ADD A NEW BOT USER
Ganti music1 sesuai username bot yang Kamu inginkan.
sudo adduser music1
# Add user to the shared group so they can read the code in /opt
sudo usermod -aG ttbotshare music1
# Enable lingering so systemd user services run at boot without login
sudo loginctl enable-linger music1
# 'terminate-user' ensures the user session is fully refreshed and lingering takes
sudo loginctl terminate-user music1
STEP 9 – LOGIN AS BOT USER
Switch ke user bot untuk menyiapkan konfigurasi lokal:
sudo -iu music1
STEP 10 – PULSEAUDIO CPU OPTIMIZATION (PER USER)
(Sebagai user music1)
mkdir -p ~/.config/pulse
cp /etc/pulse/default.pa ~/.config/pulse/default.pa
nano ~/.config/pulse/default.pa
Cari:
load-module module-udev-detect
Ubah menjadi:
load-module module-udev-detect tsched=0
Explanation: Ini signifikan menurunkan penggunaan CPU dan mencegah distorsi audio.
STEP 11 – COPY SYSTEMD TEMPLATE TO USER
(Sebagai user music1)
mkdir -p ~/.config/systemd
cp -r /opt/TTMediaBot/systemd/user ~/.config/systemd/
STEP 12 – CREATE USER CONFIGURATION
(Sebagai user music1)
mkdir -p ~/TTMediaBot/config
cp /opt/TTMediaBot/config_default.json ~/TTMediaBot/config/config.json
nano ~/TTMediaBot/config/config.json
Things to note when editing config:
- output dan input harus sama-sama null dan monitor null. Biasanya output di-set ke id 1, dan input ke id 5.
- cookiefile_path harus menunjuk ke file cookie Kamu. Contoh: jika file cookie ada di direktori yang sama dengan config, set seperti ini:
"cookiefile_path": "/home/music1/TTMediaBot/config/cookies.txt" - default service set ke
yt. Service lain sebaiknya dinonaktifkan kecuali Kamu memang menggunakannya dan sudah menyiapkan token.
Selanjutnya buatlah file cookies.txt di dalam directory ~/TTMediaBot/config.
nano ~/TTMediaBot/config/cookies.txt
Isilah file tersebut dengan format cookie yang sesuai dengan Netscape HTTP, baru save
Ubah perizinan file untuk config.json dan cookies.txt ke 600 agar user lain tidak dapat melihat hal-hal penting pada config dan cookie kamu:
chmod 600 /home/music1/TTMediaBot/config/config.json
chmod 600 /home/music1/TTMediaBot/config/cookies.txt
Ketik exit untuk logout dari music1 dan kembali ke user sudo.
STEP 13 – START SERVICES
Kelola service bot dari akun admin utama menggunakan syntax --machine.
1. Start PulseAudio untuk user:
sudo systemctl [email protected] --user enable pulseaudio
sudo systemctl [email protected] --user start pulseaudio
2. Start TTMediaBot untuk user:
sudo systemctl [email protected] --user enable TTMediaBot
sudo systemctl [email protected] --user start TTMediaBot
3. Lihat log:
sudo journalctl [email protected] --user -u TTMediaBot -f
Note: Jika Kamu ingin membuat multi-bot, ulangi langkah 8 sampai 13. Jangan mengubah apa pun di /opt/TTMediaBot. Biarkan seperti itu, karena yang Kamu perlukan berikutnya dimulai dari Step 8, kecuali jika Kamu memang ingin update komponen.