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.