# Login gagal: `ERR_CERT_COMMON_NAME_INVALID` / `Failed to fetch`

## Penyebab (bukan karena `.env` di FE)

Browser memanggil **`https://apiwork.rycroftapparel.com/...`**. Sebelum HTTP jalan, TLS harus valid: nama host harus cocok dengan **Subject Alternative Name (SAN)** sertifikat yang dipresentasikan server.

`net::ERR_CERT_COMMON_NAME_INVALID` artinya sertifikat yang dipakai **bukan untuk** `apiwork.rycroftapparel.com` (misalnya default vhost memakai sertifikat `admin.rycroft.id` atau domain lain). Ini **murni konfigurasi TLS / virtual host** di server (Apache + Let Encrypt), **bukan bug Gin** dan **bukan karena FE tidak punya file `.env`**.

- **Tidak ada `.env` di repo FE** itu normal: nilai default ada di `nuxt.config.ts`, override produksi lewat **variabel lingkungan PM2** / shell (`NUXT_PUBLIC_*`, `WORKPULSE_INTERNAL_API_ORIGIN`).
- Membuat `.env` saja **tidak memperbaiki** sertifikat salah host; yang memperbaiki adalah **sertifikat + vhost yang benar** untuk `apiwork.rycroftapparel.com`, atau memakai **proxy same-origin** (di bawah).

## Perbaikan infrastruktur (disarankan jangka panjang)

1. Pastikan **VirtualHost HTTPS** untuk `apiwork.rycroftapparel.com` memakai sertifikat yang SAN-nya mencakup nama itu (`certbot --apache -d apiwork.rycroftapparel.com` atau setara).
2. Uji dari server: `curl -vI https://apiwork.rycroftapparel.com/api/v1/health` (atau path health yang ada) — pastikan tidak ada mismatch CN.
3. **CORS di BE** (`WORKPULSE_CORS_ORIGINS` di `.env` backend): harus mencakup origin FE yang dipakai browser, misalnya `https://work.rycroftapparel.com` (dan `http://...` hanya jika memang masih akses HTTP).

Tidak perlu mengubah kode **BE** hanya untuk error sertifikat ini; yang diubah adalah **Apache / TLS**.

## Solusi sementara di FE: proxy same-origin

Agar browser **tidak** berbicara langsung ke `apiwork...` (sehingga tidak terkena sertifikat salah), Nuxt Nitro mem-proxy:

- Permintaan browser: **`/workpulse-api/api/v1/...`** (same origin dengan halaman `work.rycroftapparel.com`).
- Nitro meneruskan ke **`WORKPULSE_INTERNAL_API_ORIGIN`** (default `http://127.0.0.1:3040`), yaitu **WorkPulse API** di mesin yang sama (PM2 `workpulse-api`).

Default **`NUXT_PUBLIC_WORKPULSE_API_BASE`** sekarang **`/workpulse-api`** (path relatif). Setelah TLS `apiwork` benar, Anda bisa mengembalikan pemanggilan langsung:

```bash
# Contoh di PM2 / environment sebelum `pm2 restart workpulse-fe --update-env`
export NUXT_PUBLIC_WORKPULSE_API_BASE="https://apiwork.rycroftapparel.com"
```

WebSocket realtime (`wss://...`) tetap membutuhkan basis URL `https://` atau `http://` yang valid; dengan proxy path saja, WS tidak di-upgrade otomatis — setelah TLS API benar, set base publik ke URL penuh API seperti di atas.

## Ringkasan

| Gejala | Bukan penyebab | Penyebab sebenarnya |
|--------|----------------|---------------------|
| `ERR_CERT_COMMON_NAME_INVALID` | Kurang `.env` di FE | Sertifikat TLS salah host untuk `apiwork...` |
| `Failed to fetch` di UI | Logic login FE | Browser memblokir fetch karena TLS |

Lihat juga catatan infra TLS di repo (dokumen terkait BE/Apache) bila ada.

Checklist operasional login (curl, PM2, port): [`BE_OPS_LOGIN_DAN_PROXY.md`](BE_OPS_LOGIN_DAN_PROXY.md).
