> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sertifikasitrainer.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Model environment

> Shared .env + override dev/prod opsional untuk lokal dan Cloudflare.

Environment di project ini memakai **layer**: satu file shared untuk secret, file override opsional kalau ada perbedaan per lingkungan.

## File dan perannya

| File                              | Wajib? | Fungsi                                               |
| --------------------------------- | ------ | ---------------------------------------------------- |
| `.env`                            | Ya     | Secret shared — dipakai dev lokal **dan** Cloudflare |
| `.env.development.local`          | Tidak  | Override khusus laptop                               |
| `.env.production.local`           | Tidak  | Override khusus deploy production                    |
| `apps/api/.env`                   | Auto   | Hasil merge — **jangan edit manual**                 |
| `apps/web/.env.development.local` | Tidak  | Override `VITE_API_URL` untuk Vite dev               |
| `apps/web/.env`                   | Auto   | Hasil merge web                                      |

## Aturan merge

```
apps/api/.env = .env + .env.development.local   (dev)
apps/api/.env = .env + .env.production.local    (prod / secrets push)
```

Kalau key ada di file override → nilai override menang.\
Kalau tidak ada → fallback ke `.env` shared.

```bash theme={null}
./thub env merge          # dev
./thub env merge --prod   # production layer
```

## Apa yang masuk `.env` shared?

Secret dan konfigurasi yang **sama** di dev dan prod:

* `BETTER_AUTH_SECRET`
* `DEEPSEEK_API_KEY`
* `AWS_ACCESS_KEY_ID` / `AWS_SECRET_ACCESS_KEY` (R2)
* `MUX_*`
* `SCALEV_*`
* `RESEND_API_KEY`
* dll.

Template: `.env.example` di root repo.

Tutorial per layanan (cara dapat API key): [Layanan eksternal](/external/overview).

## Apa yang masuk override dev?

Hanya yang **beda di laptop**:

```bash theme={null}
# .env.development.local
NODE_ENV=development
PORT=3739
DATABASE_URL=postgresql://trainerhub_beta:trainerhub_beta_2026@127.0.0.1:5432/trainerhub_beta_clean
BETTER_AUTH_URL=http://localhost:3739/api/auth
FRONTEND_URL=http://localhost:5757
FRONTEND_ORIGINS=http://localhost:5757,http://127.0.0.1:5757
PAYMENT_PROVIDER=manual
DOCX_RENDERER_URL=http://127.0.0.1:8787
```

Template: `.env.development.local.example`

## Apa yang masuk override prod?

Biasanya hanya yang beda di Cloudflare:

```bash theme={null}
# .env.production.local
DATABASE_URL=postgresql://user:pass@ep-xxx.neon.tech/dbname?sslmode=require
```

URL production (`FRONTEND_URL`, `BETTER_AUTH_URL`, dll.) sudah di `apps/api/wrangler.jsonc` vars.

Template: `.env.production.local.example`

## Contoh: hanya ubah DB lokal

<Steps>
  <Step title="Edit override dev">
    ```bash theme={null}
    # .env.development.local
    DATABASE_URL=postgresql://...@127.0.0.1:5432/my_local_db
    ```
  </Step>

  <Step title="Merge ulang">
    ```bash theme={null}
    ./thub env merge
    ```
  </Step>

  <Step title="Dev">
    ```bash theme={null}
    ./thub dev
    ```
  </Step>
</Steps>

Secret AI/R2/Mux tetap di `.env` — tidak perlu duplikasi.

## Migrasi dari `apps/api/.env` lama

```bash theme={null}
./thub setup
# atau
./thub env migrate
```

Script memisahkan:

* Secret → `.env`
* URL/DB lokal → `.env.development.local`

<Tip>
  File `.env` harus format `KEY=value`. Baris catatan bebas (tanpa `=`) diabaikan saat merge.
</Tip>
