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

Хийгдсэн ажил

2026-07-27 — энэ баримтын платформыг байгуулж, edge тохиргооны эзэмшлийн загварыг өөрчилж, ажиллагааны эмзэг цэгүүдийг хааж, бүх баримтыг долоон хэл рүү хөрвүүлсэн ажлын бүртгэл.

Энэ хуудас нь юу хийснийг бус, юуг яагаад тэгж шийдснийг тэмдэглэх зорилготой. Шалтгаан нь хамгийн удаан хуучирдаггүй мэдээлэл — код өөрчлөгдөх ч шийдвэрийн үндэслэл хэвээр үлддэг.

Хамрах хүрээ

Хостын хаяг, зам, тохиргооны нууц утга зэрэг ажиллагааны дэлгэрэнгүй нь энэ нийтийн сайтад ороогүй — тэдгээр нь тухайн репо доторх хаалттай runbook-д байрлана.

Таван чиглэл

# Ажил Үр дүн
1 Баримтын платформ байгуулах docs.gerege.mn ажиллаж эхэлсэн
2 Edge тохиргооны эзэмшлийг задлах Домэйн бүр өөрийн репо-доо шилжсэн
3 Ажиллагааны эмзэг цэг хаах Санамсаргүй устгал, хяналтгүй байдлыг арилгасан
4 Баримтыг долоон хэл рүү хөрвүүлэх Монгол + НҮБ-ын зургаан албан ёсны хэл, бүрэн хамрал
5 Nexus рүү шилжсэнийг тусгах Экосистемийн шинэ загвар долоон хэлээр баримтжив

1. Баримтын платформ

Юу хийсэн

Gerege экосистемийн экосистемийн түвшний баримтыг нэг дор цуглуулсан MkDocs Material портал: 25 хуудас, Монгол үндсэн, Mermaid диаграм, брэндийн CSS. Хэлний хамралыг хожим долоон хэл болгож өргөтгөсөн — 4-р хэсгээс үзнэ үү.

Агуулгыг ecosystem-ийн репо-нуудын README, docs/ хавтас болон архитектурын баримтуудаас цуглуулж, давхарга · платформ · стандарт · ажиллагаа гэсэн дөрвөн бүлэгт эмхэтгэсэн.

Гол шийдвэрүүд

Статик сайтыг тусдаа контейнерээр үйлчилнэ. Edge nginx-ийн контейнерт шинэ mount нэмэх нь түүнийг дахин үүсгэхийг шаардана — тэр үед бүх домэйн түр унана. Өөрийн жижиг контейнерээр үйлчилснээр edge-д зөвхөн конфигийн нэмэлт хийж, reload-оор өнгөрдөг.

Байршуулалт rsync-ээр, байрандаа. Сайтын хавтас контейнерт bind mount хийгддэг. Хавтсыг бүтнээр нь солибол (mv) контейнер хуучин inode-оо харсаар үлдэж шинэ агуулга огт гарч ирэхгүй. rsync нь файлуудыг байрандаа шинэчилдэг тул mount хүчинтэй хэвээр үлдэнэ.

Кирилл гарчгийн anchor. Python-Markdown-ийн стандарт toc slugify нь ASCII бус тэмдэгтийг устгадаг## Танилт гарчиг хоосон id авч, хуудас доторх холбоос чимээгүй унана. Unicode хадгалдаг pymdownx.slugs.slugify-д шилжүүлсэн.

validation.anchors асаасан. MkDocs-д anchor шалгалт үндсэн байдлаараа унтраалттай ирдэг. Асаагаагүй бол #хэсэг рүү заасан эвдэрсэн холбоос build-ыг давж production-д гардаг. Одоо --strict дээр unaна.

docs/ дотор орсон бүхэн нийтэд ил гарна. Тиймээс ажиллагааны дэлгэрэнгүйг тусад нь, сайтад ордоггүй хавтаст байрлуулсан.


2. Edge тохиргооны эзэмшил

Энэ бол хамгийн том архитектурын өөрчлөлт.

Өмнөх байдал

Бүх домэйны vhost нэг төвлөрсөн файлд байсан. Үр дагавар: docs.gerege.mn-ий жижиг тохиргоог өөрчлөхөд өөр репо-д PR илгээж, өөр багийн deploy хүлээх ёстой байв. Өмчлөл бүрхэг, өөрчлөлт удаан.

Одоогийн байдал

edge nginx-ийн тохиргооны хавтас
├── (дундын файлууд)          ← нэгдсэн stack-ийн репо эзэмшинэ
│     sso · dan · gsign · xyp
├── docs.gerege.mn.conf       ← docs-gerege-mn
├── developer.gerege.mn.conf  ← developer-gerege-mn
└── template.gerege.mn.conf   ← template-gerege-mn

Домэйн бүрийн vhost нь тухайн үйлчилгээний репо-д амьдарч, түүний deploy өөрөө суулгадаг болсон. Өөрчлөлт нэг репо дотор дуусна.

Яагаад ажилладаг вэ

Тохиргооны хавтас нь физикээр өөр репо-гийн ажлын хуулбар дотор байрладаг ба тэр репо-гийн deploy git reset --hard ажиллуулдаг. git reset --hard нь зөвхөн tracked файлыг сэргээдэг — untracked файлыг хөнддөггүй. Тиймээс гадны репо-гоос суулгасан файл амьд үлдэнэ.

Бүрэн бие даасан байх гурван нөхцөл

Vhost нь дундын файлуудаас юугаар ч хамаарах ёсгүй:

Нөхцөл Яагаад
Өөрийн limit_req_zone Дундын zone файл руу хандвал түүнээс хамаарна
Өөрийн listen 80 блок (ACME + redirect) Гэрчилгээний шинэчлэлт бие даан ажиллана
Deploy бүрд дахин суулгах Файл алдагдвал өөрөө сэргэнэ

Тэг тасалдалтай шилжилтийн дараалал

  1. Эхлээд шинэ файлыг суулгана. Энэ үед хоёр газар нэг домэйн тодорхойлогдох ч nginx үүнийг зөвхөн conflicting server name анхааруулга болгож зохицуулна — зан төлөв өөрчлөгдөхгүй, хоёулаа ижил upstream руу заана.
  2. Дараа нь төвлөрсөн файлаас хасна. Давхардал арилж, шинэ файл идэвхжинэ.

Эсрэгээр хийвэл хоёр алхмын хооронд домэйн унана.

Нээлттэй эх репо-д хостын зам бичихгүй

template-gerege-mn нь нээлттэй эх бөгөөд одоо байгаа конвенц нь серверийн мэдээллийг зөвхөн CI-ийн secrets-д хадгалах явдал байсан. Тиймээс суулгагч нь тохиргооны хавтасны замыг edge контейнерийн mount-аас өөрөө олдог:

docker inspect <edge> --format \
  '{{range .Mounts}}{{if eq .Destination "/etc/nginx/conf.d"}}{{.Source}}{{end}}{{end}}'

Энэ нь зам хатуу бичихээс илүү найдвартай тул хожим гурван репо бүгдэд хэрэглэсэн — хост солигдох, зам өөрчлөгдөхөд дагаж ажиллана.

Аюулгүй байдлын урьдач нөхцөл

Гэрчилгээ ЭХЛЭЭД, дараа нь vhost. Гэрчилгээгүй байхад HTTPS vhost нэмбэл nginx -t унаж, тэр үед бүх домэйн эрсдэлд орно. ACME challenge нь port 80-ийн ерөнхий default server-ээр ажилладаг тул гэрчилгээ авахад конфиг өөрчлөх шаардлагагүй.

Push хийхийн өмнө эцсийн тохиргоог бодит сүлжээ ба гэрчилгээтэй, түр контейнерт nginx -t-ээр шалгасан.


3. Ажиллагааны бэхжилт

Санамсаргүй устгалаас хамгаалах

Production-ыг барьж байгаа боловч аль ч репо-д tracked биш файлууд байсан. git reset --hard тэднийг хөнддөггүй ч git clean -fd устгадаг.

Файл Алдвал Шийдэл
Гурван домэйны vhost 3 домэйн зэрэг унана .gitignore
Хостын compose override Контейнер edge сүлжээнээс салж 502 .gitignore + жишээ файл

Яагаад .gitignore шийддэг вэ: git clean нь -x-гүй үед ignore хийсэн файлыг алгасдаг. Tracked болгох шаардлагагүйгээр хамгаална.

Compose override-ыг tracked болгож болохгүй: compose түүнийг автоматаар уншдаг тул хөгжүүлэгч бүрийн локал орчинд прод тохиргоо албадан хэрэгжинэ. Тиймээс амьд файл нь хост дээр untracked үлдэж, репо-д зөвхөн сэргээх жишээ хадгалагдана. Жишээ нь амьд тохиргоотой ижил үр дүн өгөхийг docker compose config-ийн гаралтыг харьцуулж баталсан.

Эрүүл мэндийн хяналт

Өмнө нь хостын хяналтын скрипт байсан ч хоёр гэмтэл давхацсан: cron-д огт бүртгэгдээгүй, мөн заасан контейнеруудын зарим нь нэр солигдож алга болсон. Скрипт байхгүй контейнерийг чимээгүй алгасдаг тул хяналт бүрэн зогссоныг хэн ч мэдэхгүй байв.

Шинэ хувилбарын гол шийдвэрүүд:

Контейнерийн өөрийн healthcheck-ийг эхэнд тавина. Тэдгээрийн interval, retries нь тухайн үйлчилгээнд аль хэдийн тааруулагдсан байдаг.

HTTP probe-ыг контейнер дотроос нь хийнэ. Бүгдийг edge-ээр дамжуулж шалгавал edge унахад бүх үйлчилгээ унасан мэт харагдаж, бөөнөөр restart хийж жинхэнэ доголдлыг нуух байсан. Одоо шалгалт бүр бие даасан.

Дараалсан алдааны босго + cooldown. Түр зуурын саатал (deploy, GC, ачаалал) restart үүсгэхгүй; эвдэрсэн үйлчилгээг давтан унтрааж асаахаас сэргийлнэ.

Stateful дэд бүтцийг автоматаар restart хийхгүй. Өгөгдлийн сан, кэшийг зөвхөн хянаж бүртгэнэ. Диск дүүрэх зэрэг бодит шалтгааныг restart засахгүй, харин олон stack-ийн гүйлгээг тасалж хохирлыг зөвхөн нэмнэ. Ийм тохиолдолд хүн шийднэ.

Байхгүй контейнерийг алдаа болгон бүртгэнэ — хуучин хувилбарын гол алдааг давтахгүй.

Босго · cooldown · stateful бодлого · сэргэлт · байхгүй контейнер — таван зан төлөвийг тусгаарлагдсан туршилтын контейнер дээр бодитоор шалгасан.

Гэрчилгээний шинэчлэлт

Cron бичлэг байгааг харах нь хангалтгүй — шинэчлэлт бодитоор ажиллах эсэхийг --dry-run-аар туршиж, бүх домэйн амжилттай шинэчлэгдэхийг баталсан. Энэ бол хугацаа дуустал чимээгүй унтардаг төрлийн эрсдэл.


4. Долоон хэлний хамрал

Юу хийсэн

Сайтын бүх хуудсыг Монгол дээр нэмээд НҮБ-ын зургаан албан ёсны хэл рүү хөрвүүлсэн: العربية · 中文 · English · Français · Русский · Español. Өмнө нь англи орчуулга нь хэсэгчилсэн (нүүр, танилцуулга, давхарга, платформын жагсаалт, танилт) байсныг бүрэн болгож, дээр нь таван хэл нэмсэн.

Гол шийдвэрүүд

Монгол нь эх сурвалж хэвээр. Бусад зургаа нь орчуулга — эх бичвэр Монголоор бичигдэж, тэндээс хөрвөнө. Хоёр «эх» хэл байвал агуулга чимээгүй салж эхэлдэг.

Хуудсаар нь орчуулна, хэлээр нь биш. Нэг баримтыг зургаан хэл рүү зэрэг хөрвүүлэхэд нэр томьёо, хүснэгтийн мөр, бүтэц ижил үлддэг. Эсрэгээр «эхлээд бүх хуудсыг англиар» гэж явбал сүүлд орчуулагдсан хэлүүд нь аль хэдийн өөрчлөгдсөн эх бичвэрийг барих болно.

Техникийн тэмдэглэгээг орчуулаагүй. Домэйн, репо нэр, код, YAML, endpoint зам, стандартын нэршил (OIDC · PKCE · RFC 3161) бүх хэлэнд байгаагаараа үлдэнэ. Орчуулбал хуулж ажиллуулах боломжгүй болно.

Файлын нэр орчуулагдахгүй. platforms/sso.ru.md байна, платформы/sso.md биш. Ингэснээр хэл солиход URL-ийн зам ижил хэвээр үлдэж, өөр репо-гоос ирсэн гүн холбоос ажилласаар байна.

Араб хэлний RTL-ийг гараар хийгээгүй. Material нь ar локалыг таниад <html dir="rtl"> тавьж, цэс болон агуулгын урсгалыг өөрөө эргүүлдэг. Код блок ба ASCII диаграм нь LTR хэвээр үлдэнэ — энэ нь зөв, учир нь команд, URL чиглэл солиход утга нь эвдэрнэ.

Unicode slugify нь одоо гурав дахин чухал болсон. Кирилл гарчгийн төлөө оруулсан pymdownx.slugs.slugify нь араб, хятад, орос гарчгуудын anchor-ыг мөн адил барьж байна. Стандарт slugify байсан бол зургаан локалын хуудас доторх бүх холбоос чимээгүй унах байлаа.

fallback_to_default идэвхтэй хэвээр. Одоо бүх хуудас орчуулагдсан тул fallback ажиллахгүй, гэхдээ шинэ хуудас нэмэгдээд орчуулга нь хойно явах үед сайт бүтэн ажиллах баталгаа болж үлдэнэ.

Хамрах хүрээ

Энэ бодлого нь экосистемийн түвшний баримтад — өөрөөр хэлбэл энэ сайтад л хамаарна. Тухайн платформын гүн техникийн баримт (endpoint схем, SDK лавлах) нь репо-дотроо MN + EN хэвээр; тэдгээрийн уншигч нь тухайн репо-той ажиллаж буй инженер тул хамрах хүрээг өргөтгөх өгөөж бага.


5. Nexus рүү шилжсэнийг тусгасан нь (2026-08-07)

Юу болов

2026-08-05-нд open-gerege-nexus репо үүсч, 08-07-нд платформ Gerege Nexus нэрээр брэндчилэгдэн nexus.gerege.mn рүү шилжсэн. Түүнээс хоёр салаа гарав: sso-gerege-nexus (Gerege SSO) ба eduge-mn-nexus (eduge.mn). Энэ нь экосистемийн тархах загварыг өөрчилсөн тул баримтыг долоон хэлээр тэнцүүлж шинэчлэв.

Гол шийдвэрүүд

Хуучин платформын хуудсуудыг устгаагүй. Template, Gerege Platform, SSO, Kiosk бүгд production-д ажилласаар байна. Шинэ хуудас нэмээд, хуучин хуудсууд дээр «аль төлөв нь хүчинтэй»-г заасан анхааруулга тавьсан. Хуудсыг устгах нь ажиллаж буй системийн баримтыг алга болгоно.

Давхарга 3-ыг хоёр үе болгож задалсан. Nexus нь Template-ийг орлохгүй — хоёулаа Давхарга 3 дээр зэрэг оршиж байна. Шинэ давхарга нэмбэл давхаргын дүрэм («дамжиж шууд хандахгүй») утгаа алдах байв.

Nexus-ийн өөрийн OIDC provider нь Давхарга 2 БИШ. Nexus дотор OAuth2/OIDC provider байдаг ч тэр нь тухайн байршуулалтын тенант, гуравдагч client-үүдэд зориулагдсан. Иргэнийг таних экосистемийн зам нь Gerege SSO хэвээр. Үүнийг тодруулаагүй бол «Nexus SSO-г орлолоо» гэсэн буруу дүгнэлт гарах байв.

Домэйн бүрийг гараар шалгасан. nexus.gerege.mn, eduge.mn, geregekiosk.mn гурав амьд эсэхийг DNS, HTTP, TLS гэрчилгээгээр нь батлав. Ингэхэд хоёр зүйл илэрсэн: geregekiosk.mn дээр одоо Nexus үйлчилж байгаа, open.gerege.mn нь тэр хостын гэрчилгээнээс хасагдсан тул HTTPS нэрийн зөрчил өгч байна.

Хуучирсан баталгааг залруулсан. Template-ийн хуудас «autosync өдөр бүр дамжуулна» гэж бичсэн байсныг зассан — тэр автоматыг 2026-08-06-нд флотын хэмжээнд зогсоосон. Хуурамч амлалт нь буруу баримтаас ч аюултай: инженер засвар өөрөө урсана гэж бодоод хүлээнэ.

Орчуулгын хоёр цоорхойг нөхсөн. Домэйн зураглалын «Бие даасан брэнд домэйн» хэсэг зургаан орчуулгад огт байгаагүйг илрүүлж, долуулаа тэнцүүлэв.

Шийдвэрүүдийн хураангуй

Шийдвэр Үндэслэл
Статик сайтыг тусдаа контейнерээр Edge-г дахин үүсгэвэл бүх домэйн унана
rsync, mv биш Bind mount хуучин inode дээр үлддэг
Unicode slugify Стандарт slugify кирилл гарчгийн anchor-ыг устгадаг
validation.anchors асаах Эвдэрсэн холбоос эс бөгөөс production-д гардаг
Vhost-ыг үйлчилгээний репо-д Өөрчлөлт нэг репо дотор дуусна
Vhost бүрэн бие даасан Дундын файлаас хамаарвал салгалт утгагүй
Суулгах өмнө, хасах дараа Эсрэгээр хийвэл домэйн унана
Замыг автоматаар олох Хатуу бичихээс найдвартай; нээлттэй эх репо-д зам үлдээхгүй
.gitignore-оор хамгаалах git clean ignore хийсэн файлыг алгасдаг
Override-ыг tracked болгохгүй Compose автоматаар уншдаг — локал орчинд прод тохиргоо хэрэгжинэ
Probe-ыг контейнер дотроос Edge унахад бөөнөөр restart хийхээс сэргийлнэ
Stateful-ыг restart хийхгүй Restart нь шалтгааныг засахгүй, хохирлыг нэмнэ
Монгол нь цорын ганц эх хэл Хоёр «эх» байвал агуулга чимээгүй салдаг
Хуудсаар орчуулна, хэлээр биш Нэр томьёо, бүтэц зургаан хэлэнд ижил үлдэнэ
Код, домэйн, репо нэрийг орчуулахгүй Орчуулбал хуулж ажиллуулах боломжгүй болно
Файлын нэрийг орчуулахгүй Хэл солиход URL-ийн зам ижил, гүн холбоос ажиллана
Хэл бүр дэд зам дээр (/ar/) Поддомэйн бол SAN · vhost · hreflang гурав өснө

Зориудаар хийгээгүй зүйлс

sso · dan · gsign · xyp домэйныг салгаагүй. Тэдгээрийн код нэгдсэн stack-ийн репо дотроо байдаг тул төвлөрсөн файл нь аль хэдийн тэдний өөрсдийн репо мөн. Салгах шалтгаангүй.

Edge контейнерт тусдаа mount нэмээгүй. Тэр нь нэгдсэн stack-ийн compose-ыг засахыг шаардахаас гадна контейнерийг дахин үүсгэж бүх домэйныг түр унагах байсан.

Монгол хэлний хайлтын индексийг албадаагүй. lunr.js нь Монгол хэлийг дэмждэггүй тул үндсэн локалын хайлт нь стандарт токенчлэлээр ажиллана. Тусгай stemmer бичих нь одоогийн өгөөжөөс их зардалтай.

Хэл бүрт тусдаа домэйн эсвэл поддомэйн гаргаагүй. /ar/, /zh/ маягийн зам нь нэг гэрчилгээ, нэг vhost, нэг deploy-оор шийдэгддэг. Поддомэйн болгох нь гэрчилгээний SAN, edge конфиг, hreflang гурвыг зэрэг өсгөх байсан.

Үлдсэн эрсдэл

Гурван домэйны vhost болон хостын override файлууд нь .gitignore-оор хамгаалагдсан ч, хэн нэгэн git clean -fdx (ignore хийсэн файлыг ч хамардаг) ажиллуулбал устана. Засах арга нь тухайн репо-гийн суулгах скриптийг дахин ажиллуулах — гурван репо-гийн runbook бүрд тэмдэглэсэн.