# Botu açık tut

Botunu kendi bilgisayarında başlattığında, ekranı indirdiğin, bilgisayarı uyku moduna aldığın ya da internetin kesildiği an program durur ve botun çevrimdışı olur. Botun günün her saati yanıt vermesini istiyorsan onu hiç kapanmayan küçük bir Linux sanal sunucuda (**VPS**) çalıştırırsın.

## Bir Linux VPS seçmek

Belirli bir barındırma şirketine ihtiyacın yok; herhangi bir standart Linux sanal sunucu sağlayıcısı işini görür. Seçerken şu ölçütlere bak:

- **İşletim sistemi:** Güncel bir Ubuntu LTS ya da Debian kararlı sürümü en sade kurulumu sunar.
- **Bellek ve işlemci:** Metin, komut ve buton kullanan normal bir bot için **1 vCPU ve 512 MB – 1 GB RAM** fazlasıyla yeterlidir. Ses kanalında `ffmpeg` ile ses çözen bir bot çalıştıracaksan en az **1–2 GB RAM** seç.
- **Ağ:** Dışarıya `443` portundan HTTPS ve WebSocket (`wss://noluyo.net`) çıkışı açık olmalıdır. Etkileşimleri [HTTP ile teslim](https://noluyo.net/gelistirici/http-teslim.md) modunda almayacaksan sunucuna dışarıdan port açman bile gerekmez; gateway bağlantısını bot içeriden kendisi başlatır.

### Ücretsiz katmanların sınırı

Bazı bulut platformları "ücretsiz web servisi" sunar ama gelen HTTP isteği olmadığında konteyneri 15 dakika sonra uyutur. **Uyuyan servis gateway botları için uygun değildir:** WebSocket bağlantısı kesilir, bot çevrimdışı düşer ve uyanıp tekrar bağlanana dek sunucudaki mesajları kaçırır (üstelik sürekli baştan `identify` yaparsa günlük 1000 oturum hakkını da eritir). Yalnızca gerçek anlamda kesintisiz çalışan bir sanal makine kullan ya da etkileşimlerini [HTTP ile teslim](https://noluyo.net/gelistirici/http-teslim.md) moduna taşı.

## 1. Sunucuya SSH ile bağlan ve ayrı kullanıcı aç

Sunucu sağlayıcının verdiği IP adresiyle kendi bilgisayarının terminalinden bağlan:

```bash
ssh root@203.0.113.10
```

Botu `root` yetkisiyle çalıştırma. Yalnızca bota ait kısıtlı bir sistem kullanıcısı ve klasör oluştur, ayrıca Node.js 22+ veya Python 3.11+ paketlerini kur:

```bash
adduser --system --group --home /opt/noluyo-bot botuser
apt update && apt install -y git curl python3 python3-venv python3-pip
```

*(Ses botu çalıştıracaksan aynı komuta `ffmpeg` paketini de ekle.)*

## 2. Dosyaları sunucuya aktar (`.env` hariç)

Kodunu Git deposunda tutuyorsan (`.env` dosyasının `.gitignore` içinde olduğundan emin olarak!) sunucuya çek; Git kullanmıyorsan kendi bilgisayarından `scp` ile yalnız kod dosyalarını kopyala:

```bash tab=Git
sudo -u botuser git clone https://ornek-git-adresin/ilk-botum.git /opt/noluyo-bot/app
cd /opt/noluyo-bot/app
sudo -u botuser npm ci --omit=dev
```

```bash tab=scp
# Kendi bilgisayarının terminalinden çalıştır (.env dosyasını kopyalama):
scp package.json package-lock.json bot.mjs root@203.0.113.10:/tmp/
# Sonra sunucuda:
mkdir -p /opt/noluyo-bot/app
mv /tmp/package.json /tmp/package-lock.json /tmp/bot.mjs /opt/noluyo-bot/app/
chown -R botuser:botuser /opt/noluyo-bot/app
cd /opt/noluyo-bot/app && sudo -u botuser npm ci --omit=dev
```

Python kullanıyorsan `/opt/noluyo-bot/app` içinde `sudo -u botuser python3 -m venv .venv` ve `sudo -u botuser .venv/bin/pip install -r requirements.txt` çalıştır.

## 3. Sunucuda `.env` dosyasını oluştur ve kilitle

Token'ı sunucuda doğrudan `/opt/noluyo-bot/app/.env` içine yaz ve dosya izinlerini yalnız `botuser` okuyabilecek şekilde (`chmod 600`) kilitle:

```bash
nano /opt/noluyo-bot/app/.env
```

İçine `BOT_TOKEN=...` satırını yapıştırıp kaydet (`Ctrl + O`, `Enter`, `Ctrl + X`), ardından izinleri sıkılaştır:

```bash
chown botuser:botuser /opt/noluyo-bot/app/.env
chmod 600 /opt/noluyo-bot/app/.env
```

`chmod 600` sayesinde aynı sunucudaki başka kullanıcılar `.env` dosyasını okuyamaz.

## 4. `systemd` servisi ile arka planda çalıştır

Botu SSH penceresinin içinde düz `node bot.mjs` ile bırakırsan SSH bağlantın koptuğunda süreç kapanır. Linux'un yerleşik `systemd` yöneticisi ise botu arka planda başlatır, sunucu yeniden başlarsa kendiliğinden açar ve beklenmeyen bir hatada birkaç saniye bekleyip yeniden kaldırır.

`/etc/systemd/system/noluyo-bot.service` dosyasını oluştur:

```ini title=/etc/systemd/system/noluyo-bot.service
[Unit]
Description=N'oluyo Bot
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=botuser
Group=botuser
WorkingDirectory=/opt/noluyo-bot/app
EnvironmentFile=/opt/noluyo-bot/app/.env
ExecStart=/usr/bin/node /opt/noluyo-bot/app/bot.mjs
Restart=on-failure
RestartSec=10
NoNewPrivileges=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target
```

> **Not:** Python kullanıyorsan `ExecStart` satırını `/opt/noluyo-bot/app/.venv/bin/python /opt/noluyo-bot/app/bot.py` olarak değiştir. Node'u farklı bir yola kurduysan `which node` çıktısındaki tam yolu yaz. `RestartSec=10` önemlidir: hata anında saniyede yüzlerce kez bağlanmaya çalışıp `4008` veya IP engeli yemeni önler; `4004` ve `4014` gibi kalıcı yapılandırma hatalarında ise resmi SDK çıkış kodunu kontrol etmen için net log basar.

Servisi etkinleştir ve başlat:

```bash
systemctl daemon-reload
systemctl enable --now noluyo-bot
```

## 5. Durumu ve canlı logları izlemek

Botun çalışıp çalışmadığını ve `console.log` / hata çıktılarını görmek için:

```bash
# Anlık durum (active (running) görmelisin)
systemctl status noluyo-bot

# Canlı akan loglar (çıkmak için Ctrl + C)
journalctl -u noluyo-bot -f

# Son 100 log satırı
journalctl -u noluyo-bot -n 100 --no-pager
```

## 6. Güncellemek, yeniden başlatmak ve durdurmak

Kodunda değişiklik yaptığında sunucuda yeni kodu çekip servisi yeniden başlatman yeterlidir:

```bash
cd /opt/noluyo-bot/app
sudo -u botuser git pull
sudo -u botuser npm ci --omit=dev
systemctl restart noluyo-bot
```

> **Uyarı:** Aynı token ile çalışan botu **hem kendi bilgisayarında hem sunucuda aynı anda açık bırakma.** İki kopya aynı shard için birbirini `4011` (`TOO_MANY_SESSIONS`) koduyla düşürür ya da aynı mesaja iki kez yanıt verir. Kendi bilgisayarında deneme yaparken ya sunucudaki servisi `systemctl stop noluyo-bot` ile geçici olarak durdur ya da denemelerin için portaldan ayrı bir test uygulaması aç.

## Bu sayfayı yapay zekaya verirsen

> **İpucu:** Yapay zekadan sunucu kurulumu isterken `.env` dosyasını `chmod 600` ile korumasını, `systemd` biriminde `root` yerine kısıtlı kullanıcı ve `RestartSec=10` kullanmasını ve geliştirme makinesiyle sunucuda aynı token'ı aynı anda çalıştırmamasını iste.

## Sırada ne var

- [Güvenlik](https://noluyo.net/gelistirici/guvenlik.md): token sızıntılarını önlemek, izinleri en azda tutmak ve imza doğrulamak
- [Sık hatalar](https://noluyo.net/gelistirici/sik-hatalar.md): `4011`, `4014`, `4004` ve bağlantı sorunlarını teşhis etmek
- [Doğrulama](https://noluyo.net/gelistirici/dogrulama.md): botun 100 sunucuya yaklaştığında doğrulama başvurusu yapmak
