Амнияти сатҳи сатр
AiHummer бисёрмустаъҷир аст ва қавитарин ҳудуди ҷудоии он дар худи пойгоҳи додаҳо зиндагӣ мекунад: Амнияти сатҳи сатри PostgreSQL (RLS). Бо RLS-и фаъол, пойгоҳи додаҳо — на танҳо коди замима — иҷро мекунад, ки як дархост ҳамеша танҳо сатрҳоеро, ки ба мустаъҷири ҷорӣ тааллуқ доранд, мебинад.
Чаро RLS
Филтркунии сатҳи замима (WHERE tenant_id = ...) зарурӣ аст, аммо нозук аст: як
банди фаромӯшшуда метавонад додаро дар байни мустаъҷирон чакад. RLS кафолатро ба
PostgreSQL мегузаронад, то ҳатто як дархости филтрнашуда танҳо сатрҳои мустаъҷири
ҷориро баргардонад. Ин як қабати дифоъ-дар-чуқурӣ дар зери доирабандии худи замима аст. Барои
модели васеътари бисёрмустаъҷирӣ — ва он ки чӣ тавр он бо таъсироти иловагии идемпотентӣ
ҷуфт мешавад — ба
Бисёрмустаъҷирӣ ва идемпотентӣ нигаред.
Нақши маҳдуд (ихтиёрӣ)
RLS ихтиёрӣ аст ва бо додани як пайвасти дуюми пойгоҳи додаҳо ба гейтвей фаъол мешавад, ки як нақши маҳдудро на соҳибро истифода мебарад:
# /home/.aihummer/etc/gateway.env
# Owner pool — runs migrations, used for system/bypass operations
AIHUMMER_DATABASE_URL=postgres://owner:...@localhost/aihummer
# Restricted application pool — RLS policies apply (aihummer_app role)
AIHUMMER_DB_APP_URL=postgres://aihummer_app:...@localhost/aihummer
Нақши aihummer_app соҳиби ҷадвал нест, бинобар ин PostgreSQL ба он сиёсатҳои RLS-ро
татбиқ мекунад. Дархостҳои замима тавассути ин ҳавзи маҳдуд ҷорӣ мешаванд. Барои насбҳои
мизбон-табиӣ насбкунанда AIHUMMER_DB_APP_URL-ро ба таври худкор васл мекунад.
[!NOTE] Бидуни
AIHUMMER_DB_APP_URL, гейтвей ҳавзи соҳибро барои ҳама чиз истифода мебарад ва RLS амалан иҷро намешавад. Ҳавзи маҳдудро муқаррар кунед, то ҷудоии сатҳи пойгоҳи додаҳо фаъол шавад.
Доирабандии ҳар-мустаъҷир
Дар дохили як дархост, замима мустаъҷири ҷориро дар пайваст пеш аз иҷрои
дархостҳои мустаъҷир-доирабандишуда муқаррар мекунад — аз ҷиҳати мафҳумӣ db.WithTenant.
Пас аз доирабандӣ, сиёсатҳои RLS дар нақши маҳдуд ҳар хондан ва навиштанро ба
сатрҳои он мустаъҷир маҳдуд мекунанд. Доира ба воҳиди кор баста аст, бинобар ин он дар байни
дархостҳои ҳамзамон чакида намешавад.
request ─▶ resolve tenant ─▶ db.WithTenant(tenant) ─▶ queries see only that tenant
Реҷаи система / убур барои коргарон
Баъзе корҳо ба таври қонунӣ байни-мустаъҷир ё мустаъҷир-агностикӣ мебошанд — коргарони заминавӣ, ҷадвалбандон, outbox ва механизмҳои монанд. Барои инҳо, гейтвей як реҷаи система (убур)-ро истифода мебарад, ки дар ҳавзи соҳиб, берун аз сиёсатҳои RLS-и ҳар-мустаъҷир иҷро мешавад, то вазифаҳои инфрасохтор дар саросари маҷмӯи дода амал кунанд.
[!WARNING] Реҷаи убур танҳо барои коргарони дохилии боваринок аст. Роҳҳои коди коркарди дархост, ки аз номи як корбар амал мекунанд, бояд ҳамеша тавассути ҳавзи маҳдуди мустаъҷир-доирабандишуда иҷро шаванд — ҳаргиз тавассути роҳи убур.
Миграцияҳо дар ҳавзи соҳиб иҷро мешаванд
Тағйироти схема имтиёзҳоеро талаб мекунанд, ки нақши маҳдуд надорад, бинобар ин
миграцияҳо ҳамеша дар ҳавзи соҳиб (AIHUMMER_DATABASE_URL) зери як қулфи маслиҳатӣ дар
оғоз иҷро мешаванд. Нақши маҳдуди aihummer_app танҳо барои трафики оддии замима истифода
мешавад. Ин ҷудоии имтиёзро тоза нигоҳ медорад: амалиётҳои тағйирдиҳандаи схема
соҳибро истифода мебаранд; дастрасии додаҳои мустаъҷир нақши маҳдудро бо RLS-и татбиқшуда
истифода мебарад.
Минбаъд ба куҷо
- Бисёрмустаъҷирӣ ва идемпотентӣ — модели пурраи мустаъҷир ва он ки чӣ тавр таъсироти иловагӣ зери барқароршавӣ бехатар мемонанд.
- Анбори махфигоҳ — DEK-ҳои ҳар-мустаъҷир ҳамон ҷудоиро дар сатҳи махфигоҳҳо тақвият медиҳанд.
- RBAC ва калидҳои API-и доирабандишуда — иҷозат дар болои сатҳи дода.