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
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:
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:
GET /api/v1/rules
Authorization: Bearer {token}
X-Organization-ID: {organization_id} Token berisi informasi keanggotaan organization, dan semua query otomatis difilter.
Level Application
// 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:
User: alice@example.com
Organization: Acme Corp (Owner)
Organization: Consulting Co (Admin)
Organization: Partner Inc (Member) Model Keanggotaan
interface OrganizationMembership {
userId: string;
organizationId: string;
role: 'owner' | 'admin' | 'member' | 'viewer';
status: 'active' | 'invited' | 'suspended';
joinedAt: Date;
} Berpindah Organization
// 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 Penggunaan | Rekomendasi |
|---|---|
| Beberapa environment | Application terpisah (prod/staging/dev) |
| Layanan berbeda | Application terpisah per layanan |
| Isolasi tim | Application terpisah per tim |
| Testing | Application khusus untuk test |
Scoping Resource
Resource di-scope pada dua level:
- Level organization: User, role, billing, audit log
- Level application: Webhook, storage, API key
// 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:
- Role organization menentukan permission dasar
- Keanggotaan application membatasi akses resource lebih lanjut
- Owner Organization memiliki akses ke semua application
Limit Organization
Setiap paket memiliki limit di level organization:
| Limit | Free | Starter | Pro | Enterprise |
|---|---|---|---|---|
| Application | 1 | 5 | Unlimited | Unlimited |
| User | 3 | 10 | Unlimited | Unlimited |
| Webhook | 3 | 10 | 50 | Unlimited |
| Storage (GB) | 1 | 10 | 100 | Custom |
Memeriksa Limit
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:
- Service Organization: Layanan bersama lintas organization
- Federasi: Menghubungkan beberapa organization
- Sinkronisasi Data: Replikasi terkontrol
Hubungi support untuk fitur enterprise.
Pertimbangan Keamanan
Jaminan Isolasi Organization
- Isolasi Query: Semua query difilter berdasarkan organization_id
- Pemisahan Index: Index di-scope per organization
- Enkripsi: Kunci enkripsi per organization (Enterprise)
- Isolasi Audit: Audit log spesifik per organization
Praktik Terbaik Keamanan
- Gunakan Pemisahan Application: Pisahkan data sensitif dalam application
- Review Akses Berkala: Audit keanggotaan organization
- Permission Minimal: Gunakan prinsip least privilege
- Monitor Lintas Organization: Pantau anomali
Migrasi Antar Organization
Memindahkan Resource
Resource tidak dapat dipindahkan antar organization secara langsung. Untuk migrasi:
- Export dari organization sumber
- Import ke organization tujuan
- Verifikasi dan validasi
- Hapus dari organization sumber
Export/Import
# 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