P
PUGUH

Arsitektur Multi-Organization

Memahami multi-organization di ARSAKA PUGUH.

Gambaran Umum

PUGUH menggunakan arsitektur multi-organization di mana setiap organization memiliki data dan konfigurasi yang sepenuhnya terisolasi. Hal ini memungkinkan:

  • Isolasi Data: Pemisahan lengkap antar organization
  • Independensi Konfigurasi: Setiap organization memiliki pengaturan dan application sendiri
  • Manajemen Resource: Billing dan limit per organization
  • Keamanan: Tidak ada kebocoran data antar organization

Hirarki Organization

plaintext
Organization
  Users (via Memberships)
    Owner (1 per organization)
    Admins
    Members
    Viewers

  Applications
    Production
    Staging
    Development

  Rules
    Organization-level (shared)
    Application-level (isolated)

  Workflows
    Application-scoped

  Subscription
    Plan + Billing

Isolasi Data

Level Database

Setiap tabel menyertakan organization_id:

sql
CREATE TABLE rules (
  id UUID PRIMARY KEY,
  organization_id UUID NOT NULL,  -- Organization isolation
  application_id UUID,             -- Optional application scope
  name TEXT,
  ...
);

-- Row-Level Security (RLS) enforces isolation
CREATE POLICY organization_isolation ON rules
  USING (organization_id = current_setting('app.current_organization')::uuid);

Level API

Semua request API di-scope ke sebuah organization:

http
GET /api/v1/rules
Authorization: Bearer {token}
X-Organization-ID: {organization_id}

Token berisi informasi keanggotaan organization, dan semua query otomatis difilter.

Level Application

typescript
// SDK automatically includes organization context
const client = new PuguhClient({
  organizationId: 'your-organization-id',
  // ...
});

// All operations scoped to this organization
const webhooks = await client.webhooks.list(); // Only returns organization's webhooks

Keanggotaan Organization

Hubungan User-Organization

User dapat tergabung dalam beberapa organization:

plaintext
User: alice@example.com
  Organization: Acme Corp (Owner)
  Organization: Consulting Co (Admin)
  Organization: Partner Inc (Member)

Model Keanggotaan

typescript
interface OrganizationMembership {
  userId: string;
  organizationId: string;
  role: 'owner' | 'admin' | 'member' | 'viewer';
  status: 'active' | 'invited' | 'suspended';
  joinedAt: Date;
}

Berpindah Organization

typescript
// List user's organizations
const organizations = await client.listMyOrganizations();

// Switch active organization
await client.setActiveOrganization(organizationId);

Scoping Application

Application menyediakan lapisan isolasi tambahan di dalam organization.

Kapan Menggunakan Application

Kasus PenggunaanRekomendasi
Beberapa environmentApplication terpisah (prod/staging/dev)
Layanan berbedaApplication terpisah per layanan
Isolasi timApplication terpisah per tim
TestingApplication khusus untuk test

Scoping Resource

Resource di-scope pada dua level:

  1. Level organization: User, role, billing, audit log
  2. Level application: Webhook, storage, API key
typescript
// Organization-level: list all members
const members = await client.organizations.listMembers(orgId);

// Application-level: create a webhook for a specific app
await client.webhooks.create({
  url: 'https://prod.example.com/webhook',
  eventTypes: ['user.registered'],
  applicationId: 'prod-app-id',
});

Kontrol Akses

Akses dikelola pada kedua level:

  1. Role organization menentukan permission dasar
  2. Keanggotaan application membatasi akses resource lebih lanjut
  3. Owner Organization memiliki akses ke semua application

Limit Organization

Setiap paket memiliki limit di level organization:

LimitFreeStarterProEnterprise
Application 1 5 Unlimited Unlimited
User 3 10 Unlimited Unlimited
Webhook 3 10 50 Unlimited
Storage (GB) 1 10 100 Custom

Memeriksa Limit

typescript
const usage = await client.getOrganizationUsage();

console.log(usage.storage.used);  // '2.5 GB'
console.log(usage.storage.limit); // '10 GB'
console.log(usage.members.used);  // 5
console.log(usage.members.limit); // 10

Penegakan Limit

Ketika limit terlampaui:

  • Storage: Upload file mengembalikan 413 dengan prompt upgrade
  • Application: Tidak dapat membuat application baru
  • User: Tidak dapat mengundang anggota baru

Operasi Lintas Organization

Operasi lintas organization tidak diizinkan secara desain:

  • User tidak dapat mengakses data organization lain
  • API key di-scope per organization
  • Tidak ada query lintas organization yang dimungkinkan

Resource Bersama (Enterprise)

Pelanggan Enterprise dapat mengatur sharing terkontrol:

  1. Service Organization: Layanan bersama lintas organization
  2. Federasi: Menghubungkan beberapa organization
  3. Sinkronisasi Data: Replikasi terkontrol

Hubungi support untuk fitur enterprise.

Pertimbangan Keamanan

Jaminan Isolasi Organization

  1. Isolasi Query: Semua query difilter berdasarkan organization_id
  2. Pemisahan Index: Index di-scope per organization
  3. Enkripsi: Kunci enkripsi per organization (Enterprise)
  4. Isolasi Audit: Audit log spesifik per organization

Praktik Terbaik Keamanan

  1. Gunakan Pemisahan Application: Pisahkan data sensitif dalam application
  2. Review Akses Berkala: Audit keanggotaan organization
  3. Permission Minimal: Gunakan prinsip least privilege
  4. Monitor Lintas Organization: Pantau anomali

Migrasi Antar Organization

Memindahkan Resource

Resource tidak dapat dipindahkan antar organization secara langsung. Untuk migrasi:

  1. Export dari organization sumber
  2. Import ke organization tujuan
  3. Verifikasi dan validasi
  4. Hapus dari organization sumber

Export/Import

bash
# Export rules
puguh-cli export rules --organization SOURCE_ORG --output rules.json

# Import to new organization
puguh-cli import rules --organization DEST_ORG --input rules.json

Pemecahan Masalah

"Organization not found"

  • Verifikasi organization ID sudah benar
  • Periksa apakah user memiliki akses ke organization
  • Pastikan organization tidak di-suspend

"Cross-organization access denied"

  • Tidak dapat mengakses resource dari organization lain
  • Pindah ke organization yang benar terlebih dahulu
  • Verifikasi status keanggotaan

"Limit exceeded"

  • Periksa penggunaan saat ini vs limit
  • Upgrade paket atau kurangi penggunaan
  • Hubungi support untuk peningkatan sementara

Terkait