Агуулгыг алгасах

Өгөгдөл ба RLS

Өгөгдлийн давхарга нь PostgreSQL 16 + pgvector, ORM-гүй. Бүх query гар бичмэл, параметржүүлсэн; бичлэгүүд нь pgx.RowToStructByName-ээр уншигдах энгийн struct.

Row-Level Security

RLS бол платформын хэрэглэгч тус бүрийн тусгаарлалтын гол хил — repository аль хэдийн бичдэг WHERE user_id = … нөхцлийн доорх defense-in-depth. Query-ийн алдаа гарсан ч өөр хэрэглэгчийн мөр буцаж чадахгүй.

Гурван identity

Context дээр Identity{ UserID, Role } зөөгддөг. Role нь SQL policy-ийн литералтай яг таарах гурван утгын нэг:

Role Хэн тавьдаг Хамрах хүрээ
service /auth бүлгийн ServiceRLSContext Нэвтрэхээс өмнөх / системийн урсгал (eID upsert, refresh identity хайлт, bootstrap). Бүрэн эрх
admin Auth middleware, admin JWT дээр Бүх мөрд бүрэн хандалт
user Auth middleware, энгийн JWT дээр Зөвхөн дуудагчийн өөрийн мөр

Repository-ийн withRLS(ctx, fn) туслах нь query бүрийг транзакцид боож, identity-г session хувьсагчаар нийтэлдэг. Тиймээс policy нь дуудагчийг мэдэж байдаг.

RLS үйлчилдэг хүснэгтүүд

users                     organizations            organization_memberships
gov_applications          gov_application_events   gov_references
gov_notifications         gov_payments             gov_appointments
user_integrations         user_recovery_codes      security_events
superadmin_accounts       sso_tokens               audit_log
oauth_consents            oauth_access_tokens      oauth_auth_codes

gov_* хүснэгтүүд дээр дөрөв дэх policyofficer — байдаг: gov.review эрхтэй албан хаагч өөрт хуваарилагдсан хүсэлтийн мөрийг харна.

API нь superuser-ээр холбогдож БОЛОХГҮЙ

RLS нь BYPASSRLS эсвэл table owner дээр үйлчлэхгүй. Тиймээс апп нь хамгийн бага эрхтэй role-оор холбогдоно, ба production дээр boot guard нь үүнийг шалгаж, зөрчилтэй бол асахаас татгалзана.

Шинэ хүснэгт нэмэхэд

Хэрэглэгч тус бүрийн өгөгдөл хадгалдаг шинэ хүснэгт бүрд өөрийн policy хэрэгтэй:

ALTER TABLE my_table ENABLE ROW LEVEL SECURITY;

CREATE POLICY my_table_service ON my_table
  USING (current_setting('app.role', true) = 'service');
CREATE POLICY my_table_admin ON my_table
  USING (current_setting('app.role', true) = 'admin');
CREATE POLICY my_table_self ON my_table
  USING (user_id::text = current_setting('app.user_id', true));

Гол хүснэгтүүд

Хүснэгт Юу хадгалдаг
users Иргэн — civil_id-ээр түлхүүрлэсэн; role_id, токен цуцлалтын cutoff
roles · permissions · role_permissions Динамик RBAC каталог
superadmin_accounts · superadmin_invites Super admin данс (тусдаа), урилгын allow-list
user_recovery_codes TOTP сэргээх кодууд (hash)
login_events Нэвтрэлтийн түүх, lockout тооцоо
Хүснэгт Юу
organizations Байгууллага — улсын бүртгэлээс лавласан мэдээлэл
organization_memberships Гишүүнчлэл + үүрэг
org_stamps Байгууллагын тамганы зураг
Хүснэгт Юу
gov_services · gov_life_events Каталог
gov_applications · gov_application_events Хүсэлт + түүний timeline
gov_references Олгосон лавлагаа
gov_notifications · gov_payments · gov_appointments Мэдэгдэл, төлбөр, цаг
gov_service_events Үйлчилгээний түвшний үйл явдал
Хүснэгт Юу
registry_services · registry_service_versions Үйлчилгээний паспорт + хувилбар
registry_evidences · registry_service_evidences Нотолгооны каталог, холбоос
registry_life_events Амьдралын үйл явдал
relay_platforms · relay_routes Доод байгууллага, чиглүүлэлт
relay_requests · relay_assignments · relay_events Дамжуулсан хүсэлт, хуваарилалт, түүх
Хүснэгт Юу
gateway_services · gateway_request_logs Service catalog + телеметр
applications · application_services RP бүртгэл, service олголт
oauth_clients · oauth_consents OIDC client, зөвшөөрөл
oauth_auth_codes · oauth_access_tokens · oauth_challenges Урсгалын түр төлөв
admin_api_keys · developer_apps Admin key, хөгжүүлэгчийн апп
Хүснэгт Юу
ai_prompts Админ засварладаг scope / instructions prompt давхарга
ai_knowledge Мэдлэгийн сангийн корпус + pgvector embedding (HNSW индекс)
themes · site_appearance Нэрлэсэн theme, сайт-даяарх харагдац
platform_settings Платформын түлхүүр-утга тохиргоо
audit_log Hash-chain холбоост, зөвхөн-нэмэх бүртгэл

Migration

  • Файл нэр: N_name.up.sql + N_name.down.sql, platform-core/migrations/-д.
  • Go binary-д embed хийгддэг тул контейнерт SQL файл хуулах шаардлагагүй.
  • Compose-ийн migrate үйлчилгээ up бүрд ажиллана — хэрэгжсэнийг алгасна.
  • Дугаарлалтын муж: аппын өөрийн migration нь суурийн мужаас гадуур байна (migrations/RANGE) — эс бөгөөс дугаар мөргөлдөнө.

Мэдлэгийн санг засварлахад

ai_knowledge-ийн корпус migration 48-д. Бүлгийн slug-ийг хэвээр хадгал — embedding нь boot дээр эсвэл POST /api/v1/admin/ai/knowledge/reindex-ээр шинэчлэгдэнэ.

Холболтын удирдлага

Тохиргоо Юу
DB_MAX_OPEN_CONNS Pool-ийн дээд хэмжээ
DB_MAX_IDLE_CONNS Сул холболтын тоо
DB_CONN_MAX_LIFE_MINS Холболтын нас

pgx pool нь otelpgx-ээр trace хийгддэг тул удаан query нь trace дээр харагдана.