showmygear

Strategi Data: Persistensi Kontainer

Isolated Data Container Architecture

[!IMPORTANT] Data lives in Volumes, not in the Image.

Dokumen ini menjelaskan bagaimana kami mengelola data aplikasi, database, dan konfigurasi saat menggunakan lingkungan terisolasi (Docker/Nix).


📖 Daftar Isi

Dalam filosofi ShowMyGear (lihat Filosofi Inti), Host Machine (WSL/Windows) adalah tanah suci. Komando seperti apt install postgresql adalah penodaan.

1. Strategi: Container-First

flowchart TD
    subgraph "Windows/WSL Host"
    V["Direktori Volume Lokal: ./data/postgres"]
    end

    subgraph "Kontainer Docker"
    D["DB Engine: PostgreSQL 16"]
    C["Penyimpanan Internal: /var/lib/postgresql/data"]
    end

    V <-->|"Mount/Sync"| C
    D --> C

Rasional

\[Integritas Data = Backup \times (Isolasi + Portabilitas)\]

Implementasi

2. Toolchain: “CLI First, GUI Second”

Opsi A: TUI/CLI (Diutamakan)

Opsi B: GUI (Diterima)


3. Data sebagai Konteks AI

Di era agentik, “Data” bukan hanya isi row database, tapi juga struktur codebase, logs, dan dokumentasi yang menjadi “makanan” bagi AI.

A. Kebenaran dalam Konteks (Truth of Context)

AI hanya sepintar data yang bisa ia akses. Kita harus menganggap Konteks sebagai Data.

B. Higiene Struktur untuk AI-Readability

Agar AI bisa membantu Anda, data/codebase harus “skimmable”:

  1. Strict Type Definitions: Gunakan .d.ts (TS) atau Type Hints (Python). Ini adalah metadata paling berharga bagi AI.
  2. Flat vs Deep Hierarchy: AI lebih suka struktur folder yang tidak terlalu dalam (maksimal 3-4 level) untuk meminimalisir kesalahan navigasi.
  3. Logs as Context: Gunakan Structured Logging (JSON) agar AI bisa melakukan “Pattern Recognition” pada ribuan baris logs untuk mencari penyebab error secara otomatis.
graph LR
    Raw["Raw Project Data"] --> Triage["Context Triage (.cursorrules)"]
    Triage --> RAG["RAG Index (Searchable)"]
    Triage --> LC["Long Context (Full Ingest)"]
    RAG --> AI["AI Architect"]
    LC --> AI
    
    style Triage fill:#fff9c4,stroke:#fbc02d

4. Modern Tech Stack: “Edge & Serverless”

Untuk skenario di mana “menjalankan docker” terasa terlalu berat, atau untuk prototyping kolaboratif yang cepat, kami mengadopsi filosofi Serverless Data.

A. Arsitektur Data Borderless

Kami melihat data sebagai aliran yang dinamis, bukan sekadar tabel statis yang terkunci di satu server.

graph LR
    subgraph Local["Lingkungan Lokal (Source of Truth)"]
        L1["SQLite / libSQL"] --> L2["Penyimpanan Lokal (Host)"]
    end
    subgraph Edge["Lapisan Edge (The Bridge)"]
        E1["Turso / TiDB Serverless"] --> E2["Replikasi Global"]
    end
    subgraph Access["Lapisan Aplikasi (Consumer)"]
        C1["Aplikasi Mobile / Web"]
        C2["Kolaborasi Tim (Global)"]
    end
    
    L1 -.->|"turso db push"| E1
    E1 --> C1
    E1 --> C2
    E2 --> C1
    
    style Local fill:#fff3e0,stroke:#ef6c00
    style Edge fill:#e8f5e9,stroke:#2e7d32
    style Access fill:#e1f5fe,stroke:#0288d1

B. Prototyping & Kolaborasi: SQLite / Turso

stateDiagram-v2
    direction LR
    Local: "SQLite Lokal (db.sqlite)"
    Edge: "Turso Cloud / Edge"
    Collab: "Teman Tim"
    
    Local --> Edge : "turso db push"
    Edge --> Collab : "Akses via URL"
    Collab --> Edge : "Query/Edit"

Auth Kompleks & RBAC: Supabase

Masalah Kolaborasi MySQL: Terpecahkan

5. Analisis Trade-off

| Metode | Pro | Kontra | Rekomendasi | | :— | :— | :— | :— | | Container-First | Bersih, ter-versi per proyek. | Sedikit kompleks di manajemen volume. | 🟢 Wajib (Enterprise) | | Local-First AI Data | Privasi total, tanpa latensi cloud. | Butuh resource hardware lokal besar. | 🔵 Wajib (Digital Sovereignty)| | Turso/TiDB | Kolaboratif, instan, branching. | Bergantung koneksi cloud. | 🟡 Pilihan Agile/Proto |

6. Technical Boilerplate

Struktur Standar Docker Compose

Gunkan template ini untuk layer persistensi yang bersih dan terisolasi.

services:
  # Aplikasi (e.g., Laravel, Node, Python)
  app:
    build: .
    volumes:
      - .:/var/www/html

  # Persistensi (Jangan di Host)
  db:
    image: postgres:16-alpine
    volumes:
      - db_data:/var/lib/postgresql/data
    ports:
      - "5432:5432" # Diekspos hanya untuk GUI Lokal (DBeaver)

  # Cache
  redis:
    image: redis:alpine

volumes:
  db_data: # **Named Volume** bertahan meski kontainer dihancurkan

CLI Cheatsheet


🏠 Home | 🗺️ Roadmap | 🤖 Protokol Agentik