Runbook-ууд
Шөнийн гурван цагт уншигдах хуудас. Тайлбар бага, тушаал их. Төлөвлөсөн ажлууд Ажиллагаа-д.
ssh root@38.180.243.138
Юуг эхлээд харах вэ
docker ps --format '{{.Names}}\t{{.Status}}'
curl -fsS http://127.0.0.1:8082/health && echo " open OK"
curl -fsS http://127.0.0.1:8096/health && echo " sso OK"
systemctl is-active nginx
df -h / | tail -1
Гурван боломж: контейнер унасан, nginx унасан, эсвэл хоёул эрүүл боловч домэйн хариулахгүй байгаа (энэ тохиолдолд гэмтэл nginx-ийн тохиргоо эсвэл TLS дээр).
Нэвтрэлт бүхэлдээ боломжгүй болсон
Шинж тэмдэг. open.dgov.mn дээр «нэвтрэх» дарахад sso.dgov.mn хариулахгүй,
эсвэл алдаа буцаана. Одоо байгаа сессүүд ажилласаар байна, шинээр орох зам
байхгүй.
Шалтгаан. SSO_CLIENT_LOCAL_LOGIN=false — провайдер бол цорын ганц зам
(Архитектур).
Эхлээд: провайдерийг сэргээхийг оролд.
cd /opt/sso-dgov-mn/deploy
docker compose ps
docker compose logs --tail 80 backend
docker compose restart backend
curl -s https://sso.dgov.mn/.well-known/openid-configuration | jq .issuer
Хэрэв тэр богино хугацаанд боломжгүй бол — буцах зам нь open.dgov.mn дээр
локал нэвтрэлтийг түр асаах:
cd /opt/open-dgov-mn
sed -i 's/^SSO_CLIENT_LOCAL_LOGIN=false/SSO_CLIENT_LOCAL_LOGIN=true/' .env
docker compose -f docker-compose.prod.yml up -d backend frontend
Энэ нь нууц үг ба eID-ийн нэвтрэлтийг тэр домэйн дээр дахин нээнэ. Провайдер
сэргэмэгц буцааж false болго — хоёр нэвтрэлтийн зам зэрэг нээлттэй байх нь
түр байдал, архитектур биш.
Контейнер дахин дахин асаж унана
docker compose -f docker-compose.prod.yml logs --tail 100 backend # open
docker compose logs --tail 100 backend # sso, deploy/ дотроос
Хамгийн түгээмэл гурван шалтгаан:
| Логт харагдах зүйл | Шалтгаан | Засвар |
|---|---|---|
| каталог ба компилдсэн модулийн зөрүү | Цөмийн шинэ tag аппын нэр/хувилбарыг өөрчилсөн | catalog/ доторх хуулбар бичлэгүүдийг цөмийнхтэй тааруул (SSO) |
SSO_DEFAULT_CLIENT_SECRET шаардлагатай |
Production дээр энэ хоосон бол цөм асахаас татгалздаг | .env-д нөх |
| Postgres руу холбогдож чадахгүй | Сангийн контейнер эрүүл болоогүй | docker compose ps, сангийн логийг үз |
Өгөгдлийн сан асахгүй, эсвэл хоосон
docker volume ls | grep dgov
docker exec dgov_nexus_postgres psql -U postgres -lqt | cut -d\| -f1
Хоосон сан эрүүл мэт асдаг: миграцууд ажиллаж, платформ хариулж эхэлнэ,
зөвхөн өгөгдөл байхгүй. POSTGRES_VOLUME буруу заасан эсэхийг эхлээд шалга —
тэр мөрийг өөрчлөх нь өгөгдөл нүүлгэх ажил, засвар биш. Volume байгаа хэрнээ
хоосон харагдаж байвал дахин асаахаа боль, өгөгдлийг дарж бичихээс өмнө
volume-ыг хуулж ав.
Домэйн 404 эсвэл 502
nginx -t
systemctl reload nginx
ls /etc/nginx/sites-enabled/
- 404 — vhost
server_name-д тэр домэйн байхгүй, хүсэлт nginx-ийн өгөгдмөл сайт руу очиж байна.dgov.mnбаwww.dgov.mnөнөөдөр яг ингэж хариулна; энэ бол хүлээгдсэн байдал (Архитектур). - 502 — vhost зөв, upstream хариулахгүй. Портыг шалга: 3008/8082 (open),
3016/8096 (sso).
.envдэхBACKEND_HOST_PORT/FRONTEND_HOST_PORT-ыг өөрчилсөн бол vhost хамт өөрчлөгдөх ёстой.
Сертификат хугацаа дуусах гэж байна
certbot certificates
certbot renew --dry-run
systemctl list-timers | grep certbot
Сунгалт унаж байвал хамгийн түгээмэл шалтгаан нь vhost дотор гараар бичсэн
listen 443 ssl мөрүүд — certbot өөрийн тэмдэглэгээгээ олохгүй болно. Засвар:
тэр мөрүүдийг устгаж, certbot --nginx -d <домэйн>-ийг дахин ажиллуул.
Диск дүүрсэн
df -h /
docker system df
docker image prune -a # ашиглагдаагүй образууд — эхлээд энэ
journalctl --vacuum-size=200M
Хуучин образууд хамгийн их зай эзэлдэг: хоёр стек GHCR-ээс tag-аар татдаг тул rollout бүр өмнөх образыг үлдээдэг.
Роллаут CI дээр улаан болсон
Гурван репогийн Deploy workflow нь тест гүйлгэдэггүй — ногоон CI-ийн араас л асдаг. Тиймээс улаан Deploy гэдэг нь сервер тал дээрх алдаа:
| Логт | Шалтгаан | Засвар |
|---|---|---|
Permission denied (publickey) |
DEPLOY_SSH_KEY буруу эсвэл серверийн authorized_keys-ээс хасагдсан |
Түлхүүрийг дахин суулгаж, secret-ийг шинэчил |
denied / unauthorized (docker pull) |
GHCR_READ_TOKEN хугацаа дууссан |
Шинэ токен, read:packages эрхтэй |
curl: (22) … 429 |
GitHub-ийн raw эсвэл codeload нэг IP-аас хязгаарласан | Дахин ажиллуул; татан авалтууд --retry-all-errors-той болсон |
git merge --ff-only унасан |
Сервер дээр хэн нэгэн локал commit үлдээсэн | /opt/<репо> дотор git status, шалтгааныг ойлгоод л цэвэрлэ |
| CI өөрөө улаан, action татагдахгүй | GitHub Actions-ийн түр зуурын доголдол | Ажлыг дахин ажиллуул (gh run rerun) |
Роллаутыг буцаах
# аль commit ажиллаж байсныг олох
cd /opt/open-dgov-mn && git log --oneline -5
docker ps --format '{{.Names}}\t{{.Image}}'
Буцах нь өмнөх commit-ыг main дээр git revert хийх — роллаут өөрөө явна.
Яаралтай үед сервер дээр шууд: IMAGE_TAG=<өмнөх sha> ./deploy.sh.
latest бол буцах цэг биш.
Дэлгэц «This page couldn't load» гэж унасан
Бүрхүүлийн JavaScript алдаа. Хөтчийн консол дээрх мөрийг ол — цөмийн frontend кодын зам гарна.
Бодит жишээ (2026-08-17): клиентийн анхны зөвшөөрөл дээр API нь
already_granted: null буцааж, дэлгэц тэр жагсаалтаас scope бүрийг агуулж
эсэхийг асуухдаа унадаг байв. Засвар цөмд орж backend/v1.9.1 болсон.
Ийм тохиолдолд хийх зүйл: алдааг цөмийн репод issue/PR болгох. Байрлуулалт дээр түр засвар байхгүй — бүрхүүл бол нэг образ, бүх суулгацад үйлчилдэг.
Тохиргоо өөрчилсөн ч юу ч болсонгүй
Хамгийн түгээмэл шалтгаан: тэр утга хоёр газар бичигдсэн бөгөөд серверийн
.env дэх хуулбар репогийнхыг дардаг.
grep -n 'WEB_IMAGE\|FRONTEND_TAG\|CORE_REF\|OAUTH_REDIRECT_HOSTS' \
/opt/sso-dgov-mn/deploy/.env /opt/open-dgov-mn/.env
Эдгээрийн аль нэг нь .env дотроос олдвол тэр мөр илүү: пин бүр репод
байдаг (Ажиллагаа). Мөрийг устгаад
роллаутыг дахин ажиллуул.
Compose-ийн дүрэм: environment: нь env_file:-ээс давамгайлдаг, харин
${VAR:-default} орлуулга нь .env-ээс уншигддаг — тиймээс .env дэх мөр
анхдагчийг дардаг.
Deploy дунд нь унасан
deploy.sh нь образуудыг эхлээд татаж, дараа нь л ажиллаж байгаа стекийг
хөнддөг. Тиймээс pull дээр унасан бол ажиллаж байгаа хувилбар хэвээрээ —
хийх зүйл байхгүй, шалтгааныг (ихэвчлэн GHCR токен) засаад дахин ажиллуул.
up -d-ийн дараа унасан бол шинэ образ аль хэдийн ажиллаж байна. Буцах:
.env-ийн IMAGE_TAG-ыг өмнөх commit sha-гаар түгжээд deploy.sh-ыг дахин
ажиллуул. latest нь буцах цэг биш.