ЦЗ Цахим Засаг
GitHub Нэвтрэх

Ажиллагаа

Хоёр стек, нэг хост, нэг ssh. Энэ хуудас нь төлөвлөсөн ажлуудын тухай; хэвийн бус үед Runbook-ууд руу.

ssh root@38.180.243.138

Хаана юу байгаа

open.dgov.mn sso.dgov.mn docs.dgov.mn
Хавтас /opt/open-dgov-mn/ /opt/sso-dgov-mn/ /var/www/docs.dgov.mn/
.env ./.env ./deploy/.env
deploy ./deploy.sh ./deploy/deploy.sh ажлын машинаас rsync
nginx /etc/nginx/sites-enabled/open.dgov.mn.conf …/sso.dgov.mn.conf …/docs.dgov.mn.conf

.env файлууд chmod 600, git-д хэзээ ч ордоггүй. Репод байгаа нь тэдгээрийн хэлбэр (\*.env.example).

Шинэчлэх

Хоёр стек тусдаа шинэчлэгдэнэ. Хамтад нь шинэчлэх шаардлага байхгүй: хоорондоо OIDC-ээр л ярьдаг ба тэр гэрээ хувилбар хооронд тогтвортой.

open.dgov.mn

cd /opt/open-dgov-mn && git pull
REGISTRY_USER=<github-хэрэглэгч> REGISTRY_TOKEN=<read:packages> ./deploy.sh

Цөмийг шинэчлэх нь хоёр мөр: deploy.sh-ийн CORE_REF (compose файл ямар commit-оос ирэх) ба .env-ийн IMAGE_TAG (ямар образ). Хоёул түгжигдсэн байх нь санаатай — «өчигдөр ажиллаж байсан» гэдэг нь тодорхой commit байх ёстой, өнөөдрийн main биш.

sso.dgov.mn

cd /opt/sso-dgov-mn && git pull
cd deploy && REGISTRY_USER=<github-хэрэглэгч> REGISTRY_TOKEN=<read:packages> ./deploy.sh

Энд бинар нь хост дээр баригдана тул deploy удаан. Цөм нь go.mod-ын нэг мөрөөр ирнэ; түүнийг өсгөх PR-ыг Dependabot нээдэг. CI ногоон бол merge, улаан бол цөмийн release-д асуудал байна гэсэн дохио тул цөмийн багт issue.

GHCR токен

GHCR дээрх пакетууд хаалттай тул rollout бүр read:packages эрхтэй токеноор нэвтэрч, дараа нь гардаг. Токеныг сервер дээр хадгалдаггүй — deploy бүрд дамжуулна.

Deploy юу шалгадаг вэ

Хоёр скрипт ижил зарчимтай:

  1. Образуудыг эхлээд татна. Ажиллаж байгаа контейнеруудыг образ хост дээр буусны дараа л хөндөнө: pull унасны дараах татан буулгалт бол амжилтгүй deploy биш, тасалдал.
  2. up -d --remove-orphans.
  3. Backend /health эрүүл болтол 60 секунд хүлээнэ.
  4. Бүрхүүл /login хариулж, дотор нь .env-ийн BRAND_NAME байгаа эсэхийг шалгана. Бүрхүүл backend эрүүл болсны дараа хэдэн секунд асдаг тул нэг удаагийн шалгалт эрүүл rollout-ыг унасан гэж дуудна — тиймээс давталттай.

Брэндийн шалгалт сайн дурын биш: тэр бол энэ байрлуулалтыг цөмийн анхдагчаас ялгадаг цорын ганц зүйл. Брэнд буруу ирж байгаа нь .env уншигдаагүйн шинж.

Гараар эрүүл эсэхийг шалгах

curl -fsS http://127.0.0.1:8082/health   # open.dgov.mn backend
curl -fsS http://127.0.0.1:8096/health   # sso.dgov.mn backend
curl -fsS http://127.0.0.1:3008/login | grep -o 'Засгийн газрын[^<]*'
curl -fsS http://127.0.0.1:3016/login | grep -o 'Засгийн газрын[^<]*'
docker ps --format '{{.Names}}\t{{.Status}}'

Гаднаас:

curl -sI https://open.dgov.mn/ | head -1
curl -s https://sso.dgov.mn/.well-known/openid-configuration | jq .issuer
curl -sI https://docs.dgov.mn/ | head -1

Эхний админ

Бүртгүүлэх дэлгэц байхгүй, control plane нь өөрийн vhost, TOTP шаарддаг тул эхний хүн SQL-ээр ордог. Скрипт өөрөө нэвтэрч үзэж баталгаажуулна.

cd /opt/open-dgov-mn && ./first-admin.sh <и-мэйл> <нууц үг>
cd /opt/sso-dgov-mn/deploy && ./first-admin.sh <и-мэйл> <нууц үг>

Апп суулгах

Каталогт байх нь суулгасан гэсэн үг биш: цөм тенант бүрээр суулгацын мөр хайдаг ба байхгүй бол модулийн API 403 хариулна. Шинэ тенант үүсгэсний дараа аппууд API-аар суудаг, SQL-ээр биш:

for s in sso-clients sso-federation sso-sessions sso-access-review sso-provisioning; do
  curl -sb <cookie> -X POST -H 'Origin: https://sso.dgov.mn' \
    "https://sso.dgov.mn/api/v1/store/apps/$s/install"
done

organisation ба egov хоёрыг цөм өөрөө асахдаа суулгадаг.

TLS

open.dgov.mn, sso.dgov.mn, docs.dgov.mn гурвуулаа Let's Encrypt дээр, certbot-ийн systemd таймераар сунгагдана.

certbot certificates
certbot renew --dry-run

vhost файлуудыг certbot-оос өмнө суулгана; listen 443 ssl мөрүүд ба 80 → https чиглүүлэгчийг certbot өөрөө нэмнэ. Тэдгээрийг гараар бичих нь сунгалтыг өөрийнхөө тэмдэглэгээг олохгүй болгодог.

Нөөцлөлт

Хоёр Postgres тусдаа тул хоёр нөөцлөлт:

docker exec dgov_nexus_postgres pg_dump -U postgres platform_db > open-$(date +%F).sql
docker exec dgov_sso_postgres   pg_dump -U postgres platform_db > sso-$(date +%F).sql

POSTGRES_VOLUME бол дискэн дээрх заагч. Хоосон санг цөм эрүүл мэт асаадаг тул тэр мөрийг өөрчлөх нь өгөгдөл нүүлгэх ажил, засвар биш.

ponytail: энэ нөөцлөлт гараар. Хуваарьт нөөцлөлт, хаалтын гадна хуулбар хоёулаа байхгүй — эхний бодит өгөгдөл орох өдөр cron + гадаад хадгалалт нэмэгдэнэ.

Баримтын сайт

cd docs-dgov-mn && npm --prefix site ci && ./deploy/deploy.sh

Дэлгэрэнгүйг Энэ сайт хэрхэн баригддаг-аас.