Dasturchilar → Kod sifatida DNS

Kod sifatida DNS

Zonangizni kodingiz yonida bitta YAML yoki JSON faylda saqlang. DNS o‘zgarishlarini pull request’larda ko‘rib chiqing, nima o‘zgarishini oldindan aniq ko‘ring va uni bir qadamda qo‘llang.

Zonangizdan boshlang

nameocean
$ nameocean dns export example.com > dns.yaml
$ $EDITOR dns.yaml
$ nameocean dns plan -f dns.yaml
+  CNAME  blog  example.netlify.app
~  A      @     203.0.113.10  ttl 1h → 5m
-  A      old   203.0.113.9
example.com: 1 to add, 1 to change, 1 to delete, 6 unchanged.
$ nameocean dns apply -f dns.yaml
Apply these changes? [y/N] y
Applied: 1 added, 1 changed, 1 deleted. example.com is at serial 214.

Fayl

dns.yaml
# yaml-language-server: $schema=https://nameocean.net/schemas/dns-zone.json
zone: example.com
records:
  - name: "@"
    type: A
    value: 203.0.113.10
    ttl: 5m
  - name: www
    type: CNAME
    value: "@"
  - name: "@"
    type: MX
    value: mail.example.com
    priority: 10
  - name: "@"
    type: TXT
    value: "v=spf1 mx -all"
  - name: _sip._tcp
    type: SRV
    value: sip.example.com
    priority: 10
    weight: 5
    port: 5060
  - name: old
    type: REDIRECT
    value: https://example.com/new
  • name zonaning o‘zi uchun @ yoki unga nisbatan nom (www, _dmarc); oxirida nuqtasi bo‘lgan to‘liq nom ham ishlaydi.
  • type — A, AAAA, CNAME, MX, TXT, SRV, PTR yoki REDIRECT (value’dagi URL’ga HTTP yo‘naltirish).
  • ttl — 5m, 15m, 30m, 1h yoki 1d; u ko‘rsatilmasa, yozuv faylning ttl qiymatini yoki 1h oladi. MX priority (standart 10), SRV priority, weight va port, REDIRECT esa save_path (standart true) qabul qiladi.
  • Xuddi shu hujjat JSON ko‘rinishida ham ishlaydi. JSON Schema VS Code va boshqa muharrirlarda avtoto‘ldirish va tekshiruvlarni taqdim etadi.

Reja qanday tuziladi

Fayl butun zonani ifodalaydi: zonada bor, lekin faylda yo‘q yozuv o‘chiriladi. Faqat qo‘shish va o‘zgartirish uchun --keep-unlisted (API’da prune=false) parametrini bering.

A, AAAA, MX va TXT yozuvlari nom va qiymat bo‘yicha (MX uchun esa ustuvorlik bo‘yicha ham) moslashtiriladi, chunki bitta nomda ulardan bir nechtasi bo‘lishi mumkin. CNAME, SRV, PTR va REDIRECT yozuvlari nom bo‘yicha moslashtiriladi. Boshqa ttl yoki SRV ustuvorligi, og‘irligi yoki porti o‘zgarish hisoblanadi; qolgan barcha holatlar qo‘shish yoki o‘chirish hisoblanadi.

Apply bitta tranzaksiyada bajariladi: avval o‘chirishlar, keyin o‘zgarishlar, so‘ng yangi yozuvlar — shu sababli bitta faylda CNAME A yozuvining o‘rnini egallashi mumkin. Agar bitta yozuv rad etilsa, hech narsa o‘zgarmaydi. Agar reja va apply oralig‘ida kimdir zonani o‘zgartirsa, apply rad etiladi va siz qayta reja tuzasiz.

NameOcean o‘zi uchun saqlaydigan yozuvlar — HTTP yo‘naltirish ortidagi manzil va SSL uchun ACME challenge’lari — hech qachon eksport qilinmaydi, rejaga kiritilmaydi va o‘chirilmaydi.

GitHub Actions

dns:write (yoki faqat reja tuzadigan job uchun dns:read) huquqiga ega API kaliti yarating va uni NAMEOCEAN_API_KEY secret sifatida saqlang.

.github/workflows/dns.yml
name: dns
on:
  pull_request: {paths: [dns.yaml]}
  push: {branches: [main], paths: [dns.yaml]}
jobs:
  dns:
    runs-on: ubuntu-latest
    env:
      NAMEOCEAN_API_KEY: ${{ secrets.NAMEOCEAN_API_KEY }}
    steps:
      - uses: actions/checkout@v4
      - run: curl -fsSL https://nameocean.net/install.sh | sh
      - run: nameocean dns plan -f dns.yaml
      - if: github.event_name == 'push'
        run: nameocean dns apply -f dns.yaml --yes

dns plan --detailed-exitcode o‘zgarishlar bo‘lganda 2 kodi bilan tugaydi — faqat drift haqida xabar berishi kerak bo‘lgan job’lar uchun.

REST API bilan

GET /dns/{zone}/export?output=yamlZona fayl ko‘rinishida (output=yaml bo‘lmasa JSON); X-Zone-Serial sarlavhasi uning serial raqami
POST /dns/{zone}/planApply nima qilishi; hech narsani o‘zgartirmaydi va faqat dns:read talab qiladi
POST /dns/{zone}/apply?serial=NZonani faylga moslashtiradi; agar zona endi rejadagi seriya raqamida bo‘lmasa, 409 zone_changed qaytariladi
curl
$ curl -X POST https://nameocean.net/api/v1/dns/example.com/plan \
    -H "Authorization: Bearer $NAMEOCEAN_API_KEY" \
    -H "Content-Type: application/yaml" --data-binary @dns.yaml

YAML’ni Content-Type: application/yaml bilan yoki xuddi shu hujjatni JSON ko‘rinishida yuboring. Server qabul qila olmaydigan fayl uchun 400 invalid_zone_file javobi qaytariladi, unda har bir yozuv va maydon ko‘rsatilgan errors ro‘yxati bo‘ladi. Barcha tafsilotlar API qo‘llanmasida.

Sun’iy intellektingiz orqali

MCP orqali assistent zonani eksport qilishi, plan_dns_zone yordamida bir vaqtning o‘zida ko‘plab yozuvlarga o‘zgartirish rejalashtirishi va sizga rejani ko‘rsatgandan so‘ng uni apply_dns_zone bilan qo‘llashi mumkin.