Өнімдік орта
Бұл бет — дананы өнімдік ортаға шығару туралы: оны кері проксидің артына қалай дұрыс қою керек, «бір дана» инварианты нені білдіреді және сақтық көшірмені қалай жасау керек. Notarium бір контейнермен орналастырылады — өнімдік конфигурация төмендегі үш нәрсеге саяды.
Кері прокси және forwarded-тақырыптар
Қосымшаның алдына кері прокси (nginx, Caddy, Traefik) қойылады — ол TLS-ті терминациялап, Notarium портына проксилейді. Басты талап: прокси сыртқы мекенжай туралы тақырыптарды міндетті түрде жіберіп отыруы керек.
Кері прокси X-Forwarded-Host жіберуі (немесе Host-ты қайта жазбауы) және X-Forwarded-Proto: https жіберуі керек. Әйтпесе интерфейстен келетін cookie арқылы аутентификацияланған мутациялар cross-origin ретінде қабылданбай қалады — «көремін, бірақ сақтай алмаймын» деген симптом шығады. X-Forwarded-Proto жіберу сессиялық cookie-дің Secure жалаушасын алуы үшін де қажет.
Себебі мынада: мутацияларға жасалатын Origin-тексеру сұраныстың көзін браузер көретін мекенжаймен салыстырады — ал ол мекенжай forwarded-тақырыпта келеді. Bearer-PAT арқылы жасалатын агент шақырулары бұл тексеруден босатылған (оларда cookie жоқ — демек CSRF үшін шабуыл алаңы да жоқ). Ал прокси forwarded-тақырыптарды клиенттен келген күйінде өткізіп жібермей, өз мәндерімен қайта жазуға міндетті.
Егер сіз агенттердің OAuth-авторизациясын қоссаңыз, прокси артында PUBLIC_BASE_URL мәнін беріңіз (мысалы, https://notes.example.com) — OAuth-метадеректеріне арналған тұрақты сыртқы мекенжай. Онсыз мекенжай forwarded-тақырыптардан шығарылады. Қараңыз: Конфигурация.
Клиенттің IP-мекенжайына сену
Мекенжайдан бөлек тағы бір ось бар — клиенттің нақты IP-мекенжайы. Ол бойынша екі лимит есептеледі: кіру әрекеттері және жаңа OAuth-клиенттерді қабылдау. Прокси артында барлық сұраныс бір мекенжайдан келеді, сондықтан айқын баптаусыз бұл лимиттер «проксиге», яғни бәріне бірден есептелер еді.
Тұтқа — TRUST_PROXY: тікелей проксилердің IP/CIDR тізімі, үтір арқылы.
# .env — өз прокси-контейнеріңіздің немесе хостыңыздың мекенжайын қойыңыз
TRUST_PROXY=172.18.0.0/16
Қауіпсіз әдепкі — айнымалы мүлде берілмеген күй: сонда X-Forwarded-For лимиттерге еш әсер етпейді, ал бөтен IP-ті тақырып арқылы жалған көрсету мүмкін емес. Оны тек проксиіңіздің мекенжайын нақты білгенде ғана беріңіз әрі тізімді тар ұстаңыз.
Логикалық мәндер, хоп санауыштары, атаулы диапазондар және барлық мекенжайды қамтитын диапазондар (/0) іске қосылу кезінде қабылданбайды. Барлық мекенжайға сену — кез келген клиент өзіне тақырып арқылы IP тағайындап, кіру лимитінен айналып өтеді деген сөз.
Бұл баптау X-Forwarded-Host пен X-Forwarded-Proto жіберуге әсер етпейді — бұлар тәуелсіз осьтер, алдыңғы бөлімдегі келісім өз күшінде қалады.
«Бір дана» инварианты
Notarium бір процеске есептелген. Аутентификацияның екі күйі процестің жадында тұрады:
- логиннің rate-limit-і — әрекеттер санауыштары;
- SSE-сокеттер тізілімі — ол арқылы рұқсатты кері алу тірі байланыстарды лезде үзеді.
Жүктеме теңгергіш артында бірнеше дана ортақ қоймасыз жұмыс істесе, бұл механизмдер бұзылады: шабуылдаушы лимитті даналар бойынша көбейтеді, ал бір данадағы рұқсатты кері алу басқа данада ілініп тұрған SSE-байланысты жаппайды.
Екі күй де процестің жадында тұрады, сондықтан жүктеме теңгергіш артында бірнеше дана ортақ қоймасыз жұмыс істесе, бұл механизмдер істемейді. Метадеректер дерекқорын Postgres-ке шығару ортақ күй береді, бірақ көлденең масштабтау үшін бұл ғана жеткіліксіз. Бір дананы ұстаңыз.
Сақтық көшірме
Каноникалық сақтық көшірме — файлдарды сырттан көшіру емес, образдың кіріктірілген пәрмені: notarium backup тексерілген ZIP жинақтап, оны сервис жұмысын тоқтатпаған күйде ағынмен береді.
docker compose exec -T notarium backup > notarium-$(date -u +%Y%m%dT%H%M%SZ).zip
docker compose exec -T notarium backup verify < notarium-20260731.zip
Тексеру — бір реттік әрекет емес, жоспарлы тапсырманың міндетті бөлігі: ол ештеңені өзгертпейді, ал архив керек болатын күн туғанға дейін бүлінуді ұстап қалады. Тапсырманың өзі үшін қарапайым қайта бағыттау жеткіліксіз — қауіпсіз жариялау тәртібін (уақытша файл → дискіге мәжбүрлі жазу → атомарлық қатты сілтеме) runbook'тан алыңыз: Сақтық көшірме және қалпына келтіру. Сол бетте — таза томға қалпына келтіру және пәрменнің қолданылу шекарасы.
meta.db-ны көшірмеңізcp /data/meta.db немесе жұмыс істеп тұрған томды көшіру — сақтық көшірме емес: метадеректер дерекқоры WAL режимінде жұмыс істейді, коммит етілген жолдар әлі meta.db-wal ішінде жатуы мүмкін, ал бөлек-бөлек көшірілген файлдар бір сәттің тұтас суреті болмайды.
Сақтық көшірмеге нақты не кіреді және неге:
| Не | Рөлі |
|---|---|
/data/spaces | Сіздің Markdown-файлдарыңыз — шындық көзі. |
/data/meta.db | Метадеректер дерекқоры (тарих, пайдаланушылар, рұқсаттар) — файлдардан қалпына келтірілмейді. |
/data/jobs | Импорт/экспорт тапсырмаларының артефактілері мен жүктеп салынған файлдары. |
/data/engine | Қозғалтқыштың туынды индекстері. Архивке кірмейді: файлдардан қайта құрастырылады. |
Егер метадеректер дерекқоры Postgres-ке шығарылған болса немесе жазбалар деректер түбірінен тыс жатса, кіріктірілген пәрмен жартылай архив жасаудың орнына қатемен аяқталады — дерекқор мен тіркелген каталогтардың сақтық көшірмесін провайдеріңіздің штаттық құралдарымен жасаңыз. Метадеректер дерекқоры нақты нені сақтайтыны — Дерекқор бетінде.