# MYINFO v1.2 — SHARED HOSTING OPERATIONS

**Status:** BASELINE OPERATIONS  
**Target Environment:** Shared Hosting + cPanel + Terminal  
**Applies To:** Backend PHP, Admin Dashboard, Commercial API, scheduled maintenance

---

## 1. Environment Baseline

Production MyInfo dijalankan pada lingkungan:

```text
Shared Hosting
cPanel
Terminal / PHP CLI
PHP 8.x
MySQL
HTTPS
cPanel Cron
```

Arsitektur production tidak boleh bergantung pada service yang harus hidup terus-menerus.

---

## 2. Forbidden Mandatory Dependencies

Core MyInfo tidak boleh mengharuskan:

```text
Redis daemon
RabbitMQ
Supervisor
systemd custom service
permanent queue worker
WebSocket daemon permanen
Docker daemon di production hosting
```

Jika suatu library dapat memakai Redis secara opsional tetapi juga mempunyai fallback MySQL/file yang aman, penggunaan masih dapat dipertimbangkan.

---

## 3. Background Job Strategy

Pekerjaan background menggunakan:

```text
PHP CLI
+
cPanel Cron
+
MySQL state/checkpoint
```

Contoh pekerjaan:

```text
OTP cleanup
Expired session cleanup
Expired API key maintenance
Commercial API usage aggregation
Commercial API request-log cleanup
Snapshot generation
Data integrity checks
Temporary file cleanup
Scheduled maintenance
```

---

## 4. Cron Job Requirements

Setiap Cron job wajib dirancang:

```text
idempotent
bounded
overlap-safe
recoverable
checkpointed when needed
retry-safe
```

Artinya job boleh dijalankan ulang tanpa merusak data atau menggandakan proses.

---

## 5. Prevent Overlapping Jobs

Cron yang sama tidak boleh berjalan bersamaan.

Gunakan salah satu:

```text
MySQL advisory lock
lock table
lock file
job status table
```

Contoh konsep:

```text
START JOB
   ↓
Acquire Lock
   ↓
Lock gagal?
   ├── YES → exit
   └── NO
        ↓
      Process batch
        ↓
      Save checkpoint
        ↓
      Release lock
```

---

## 6. Bounded Batch Processing

Hindari memproses dataset besar tanpa batas dalam satu request/Cron execution.

Contoh:

```text
10.000 record
```

jangan diproses sekaligus jika berisiko timeout.

Gunakan:

```text
500 record per batch
```

misalnya.

Simpan checkpoint:

```text
last_processed_id
last_sync_id
offset
cursor
```

Cron berikutnya melanjutkan proses.

---

## 7. Recommended Cron Areas

### 7.1 OTP Cleanup

Membersihkan:

```text
expired OTP
used OTP
old failed OTP attempts
```

Contoh frekuensi:

```text
every 10–15 minutes
```

### 7.2 Session Cleanup

Membersihkan atau menandai expired:

```text
refresh token
revoked session
expired device session
```

Contoh:

```text
hourly
```

### 7.3 Commercial API Usage Aggregation

Aggregate raw request logs menjadi:

```text
daily usage
monthly usage
per-client totals
per-key totals
per-endpoint totals
HTTP status summary
```

Contoh:

```text
hourly
atau
daily
```

tergantung traffic.

### 7.4 Commercial Raw Log Cleanup

Raw API logs tidak boleh tumbuh tanpa batas.

Contoh retention:

```text
30 days
60 days
90 days
```

Simpan aggregate lebih lama.

Retention final ditentukan sebelum production.

### 7.5 API Key Expiry Maintenance

Periksa:

```text
expired key
expired trial
suspended client
expired plan
```

dan update status jika diperlukan.

### 7.6 Snapshot Generation

Jika snapshot Wilayah/Bank dibuat berkala:

```text
generate
↓
validate
↓
checksum
↓
publish metadata
```

Jangan mengganti snapshot aktif sebelum snapshot baru lolos validasi.

---

## 8. Example cPanel Cron Command

Format umum:

```bash
/usr/local/bin/php /home/CPANEL_USER/path/to/backend/cron/job.php
```

atau sesuai path PHP hosting:

```bash
php /home/CPANEL_USER/path/to/backend/cron/job.php
```

Path PHP harus dikonfirmasi melalui Terminal hosting.

Contoh:

```bash
which php
php -v
```

Jangan mengasumsikan `/usr/bin/php` atau `/usr/local/bin/php` tanpa pengecekan.

---

## 9. Cron File Structure

Direkomendasikan:

```text
backend/
└── cron/
    ├── otp_cleanup.php
    ├── session_cleanup.php
    ├── api_usage_aggregate.php
    ├── api_log_cleanup.php
    ├── api_key_expiry.php
    ├── snapshot_generate.php
    └── integrity_check.php
```

---

## 10. CLI Safety

Cron scripts harus memeriksa bahwa script memang dijalankan dari CLI bila tidak dimaksudkan untuk web.

Contoh:

```php
if (PHP_SAPI !== 'cli') {
    http_response_code(403);
    exit('CLI only');
}
```

---

## 11. Secret Handling

Jangan meletakkan credential production langsung di command Cron.

Hindari:

```bash
php job.php --db-password=SECRET
```

Gunakan konfigurasi server/environment.

Credential meliputi:

```text
DB_PASSWORD
Wablas API key
Wablas secret
Google private credentials
JWT/token secret
Commercial API signing secrets
```

---

## 12. Database Connection

Backend PHP membaca:

```text
DB_HOST
DB_PORT
DB_NAME
DB_USER
DB_PASSWORD
DB_CHARSET
```

Database existing di hosting adalah authoritative source.

Cron dan web backend menggunakan connection layer yang sama.

---

## 13. Logging

Setiap Cron job harus mencatat minimal:

```text
Job Name
StartedAt
FinishedAt
Status
Processed
Succeeded
Failed
Checkpoint
Error summary
```

Jangan menulis:

```text
password
raw access token
raw refresh token
raw OTP
raw API key
```

ke log.

---

## 14. Failure Handling

Jika job gagal:

```text
jangan hapus checkpoint terakhir yang valid
jangan menandai batch sebagai selesai
jangan corrupt production state
```

Cron berikutnya harus dapat melanjutkan.

---

## 15. Database Transactions

Gunakan transaksi untuk proses yang harus atomik.

Contoh:

```text
Publish Change Request
Release creation
Sync change creation
Rollback
```

Jangan membuka transaksi besar untuk ribuan record lebih lama dari yang diperlukan.

---

## 16. Long-running HTTP Requests

Hindari proses besar melalui request browser seperti:

```text
bulk geocoding ribuan cabang
snapshot generation besar
usage aggregation besar
mass data migration
```

Untuk proses besar:

```text
Admin creates job
↓
MySQL job queue/status
↓
cPanel Cron processes batch
↓
Dashboard reads progress
```

Ini tidak membutuhkan daemon permanen.

---

## 17. Lightweight Job Queue

Jika dibutuhkan queue sederhana, gunakan tabel MySQL.

Contoh:

```text
tbl_jobs
---------
JobID
JobType
Payload
Status
Attempts
AvailableAt
StartedAt
FinishedAt
LastError
CreatedAt
UpdatedAt
```

Status:

```text
PENDING
PROCESSING
DONE
FAILED
```

Cron mengambil job secara batch.

Tidak perlu Redis/RabbitMQ untuk baseline v1.2.

---

## 18. Bulk Plus Code / Latitude Update

Bulk update latitude/longitude tidak boleh dilakukan dalam satu request besar.

Flow:

```text
Admin
↓
Create Bulk Job
↓
PENDING
↓
Cron processes batch
↓
Decode Plus Code
↓
Resolve fallback if needed
↓
Store result as Draft / Change Request
↓
Progress updated
```

Hasil:

```text
SUCCESS
INVALID CODE
NEEDS CONTEXT
API ERROR
UNCHANGED
```

Tidak langsung Publish production.

---

## 19. Commercial API on Shared Hosting

Commercial API harus tetap bekerja tanpa Redis.

Authentication:

```text
API Key hash lookup
```

Quota/rate limit:

```text
MySQL
```

Usage:

```text
raw/aggregated MySQL records
```

Cron:

```text
aggregate usage
cleanup logs
expire keys
```

Jika traffic kelak terlalu besar untuk shared hosting, scaling menjadi architecture decision baru.

---

## 20. File Storage

Jika snapshot atau export disimpan di filesystem:

```text
jangan letakkan file sensitif di public web root
```

Jika file harus downloadable:

```text
gunakan protected endpoint
atau
signed/temporary access pattern
```

sesuai kebutuhan.

---

## 21. Backup

Sebelum:

```text
schema migration
mass update
publish besar
rollback besar
```

pastikan ada backup database yang valid.

Backup strategy mengikuti kemampuan hosting/cPanel.

---

## 22. Deployment Rule

Production deployment minimal:

```text
1. Backup
2. Upload code
3. Apply approved migrations
4. Verify config
5. Health check
6. Test critical API
7. Test Admin login
8. Test Android config endpoint
9. Verify Cron
10. Monitor error log
```

---

## 23. Definition of Done

Shared Hosting Operations dianggap siap jika:

```text
[ ] PHP CLI tersedia
[ ] Path PHP diketahui
[ ] Cron cPanel tersedia
[ ] DB connection works
[ ] Cron lock mechanism tersedia
[ ] Batch/checkpoint strategy tersedia
[ ] Logging tersedia
[ ] Secret tidak tampil di log/command
[ ] OTP cleanup bekerja
[ ] Session cleanup bekerja
[ ] Commercial API usage aggregation bekerja
[ ] Commercial log cleanup bekerja
[ ] API key expiry maintenance bekerja
[ ] Snapshot job dapat dijalankan jika diperlukan
[ ] Bulk jobs dapat resume setelah gagal
[ ] Tidak ada mandatory permanent daemon
```

---

# Final Principle

MyInfo v1.2 harus dapat beroperasi penuh pada:

```text
Shared Hosting
+
cPanel
+
Terminal
+
PHP CLI
+
MySQL
+
Cron
```

tanpa memerlukan server VPS atau worker permanen sebagai dependency wajib.

Jika suatu fitur baru memerlukan daemon/server tambahan, fitur tersebut harus melalui Architecture Decision sebelum diimplementasikan.

**END — SHARED HOSTING OPERATIONS**
