Spaces:
Running on Zero
Running on Zero
File size: 3,963 Bytes
1fcc069 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | # Konfigurasi
Semua konfigurasi Ginchiee dibaca dari **environment variables**. Tidak ada
nilai rahasia yang boleh masuk ke git atau ke Docker image.
---
## Di mana memasukkan nilai
| Lingkungan | Cara |
|---|---|
| **Laptop / lokal** | file `.env` di root project (sudah masuk `.gitignore`) |
| **Hugging Face Space** | **Settings β Variables and secrets β Secrets** |
| **Docker** | `docker run -e KEY=value β¦` |
| **GitHub Actions** | *Settings β Secrets and variables β Actions* |
> **Penting:** file `.env` **tidak pernah terkirim ke Hugging Face**.
> `.env` masuk `.gitignore` (baris 19) dan `.dockerignore`, sehingga hanya
> `.env.example` yang ada di repository. Space membangun dari repository,
> jadi kredensial di sana **wajib** diletakkan di *Space Secrets*.
>
> Bukti: bot yang berjalan di Space sekarang sudah menerima
> `TELEGRAM_BOT_TOKEN` dan `GEMINI_API_KEY` dari Secrets β kalau `.env` yang
> dipakai, bot mustahil bisa jalan sama sekali karena `.env` tidak ada di sana.
---
## Variabel
### Wajib
Bot **tidak akan start** kalau salah satu ini kosong (fail-fast di
`config/settings.py`, bukan diam-diam pakai nilai default yang salah).
| Key | Keterangan |
|---|---|
| `TELEGRAM_BOT_TOKEN` | Token dari [@BotFather](https://t.me/BotFather) |
| `GEMINI_API_KEY` | API key dari [Google AI Studio](https://aistudio.google.com) |
| `DATABASE_URL` | Connection string PostgreSQL |
`DATABASE_URL` menerima alias `BOT_TOKEN` (untuk Telegram) dan `GEMINI_KEY`
(untuk Gemini), tapi `TELEGRAM_BOT_TOKEN` dan `GEMINI_API_KEY` lebih disarankan.
### Opsional
| Key | Default | Keterangan |
|---|---|---|
| `GEMINI_MODEL` | `gemini-flash-lite-latest` | Model Gemini |
| `AI_TEMPERATURE` | `0.95` | Makin tinggi = makin ekspresif (0.0β2.0) |
| `AI_TOP_P` | `0.95` | Nucleus sampling |
| `AI_MAX_OUTPUT_TOKENS` | `220` | Batas panjang balasan β menjaga Ginchiee tetap singkat |
| `LOG_LEVEL` | `INFO` | `DEBUG` / `INFO` / `WARNING` / `ERROR` |
| `ALLOWED_USER_IDS` | *(kosong = semua orang)* | Batasi bot ke user id Telegram tertentu, dipisah koma |
| `PORT` | `7860` | Port health-check HTTP |
---
## `DATABASE_URL`
Format:
```
postgresql://USER:PASSWORD@HOST:PORT/DBNAME
```
**Supabase** β ambil dari *Dashboard β Connect β tab Session pooler (port 5432)*:
```
postgresql://postgres.[PROJECT-REF]:[PASSWORD]@aws-0-[region].pooler.supabase.com:5432/postgres
```
**Postgres lokal:**
```
postgresql://ginchiee:password@127.0.0.1:5432/ginchiee
```
### Catatan Supabase
- Tambahkan `?sslmode=require` di akhir **bila** muncul error
*"SSL connection required"* (kadang perlu saat dideploy, kadang tidak).
- Pakai **Session pooler**, bukan Transaction pooler β asyncpg memakai
*prepared statement*, dan pooler mode Transaction tidak mendukung itu.
- Password database jangan pernah masuk ke file lain atau ke git.
---
## Migrasi database
Skema dibuat otomatis saat bot start (`database/migrations.py`), jadi tidak ada
langkah `psql` manual:
1. File `database/migrations/NNN_*.sql` dijalankan berurutan.
2. Setiap versi yang sudah diterapkan dicatat di tabel `schema_migrations`
(dengan checksum) sehingga aman dijalankan setiap boot.
3. Mengubah file migrasi yang **sudah** diterapkan akan membuat startup gagal
dengan pesan jelas β tambahkan migrasi baru, jangan edit yang lama.
Memindahkan data lama dari SQLite ke PostgreSQL:
```bash
python scripts/migrate_sqlite_to_postgres.py --source data/nichie.db --dry-run
python scripts/migrate_sqlite_to_postgres.py --source data/nichie.db
```
---
## Keamanan
- `.env`, `data/`, dan seluruh file `*client_secret*.json` sudah dikecualikan
oleh `.gitignore` **dan** `.dockerignore`.
- Kredensial tidak pernah dicetak ke log (password database di-mask pada log
migrasi; `httpx`/`httpcore` di-silence agar token tidak muncul di URL).
- `.env` tidak ikut masuk image Docker, sehingga tidak bisa diekstrak dari
image yang ter-push ke registry mana pun.
|