Tu je rýchla Github Action, ktorú mi navrhol prompt, na pravidelné zálohovanie nastavení Cloudflare DNS pre všetky moje domény a ich commitovanie do repozitára. Po nastavení nevyžaduje žiadnu údržbu:

name: Cloudflare DNS Backup

on:
  workflow_dispatch:
  schedule:
    - cron: "40 0 * * 0"

jobs:
  backup:
    runs-on: ubuntu-22.04
    env:
      CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    steps:
      - uses: actions/checkout@v4

      - run: |
          # Create backup directory
          mkdir -p dns-backups

          # Get list of zones (domains)
          zones=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones" \
            -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
            -H "Content-Type: application/json" | jq -r '.result[].id')

          # Loop through zones and backup DNS records
          for zone in $zones; do
            # Get zone name
            zone_name=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$zone" \
              -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
              -H "Content-Type: application/json" | jq -r '.result.name')

            echo "Backing up DNS records for $zone_name"

            # Get DNS records and save to file
            curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$zone/dns_records" \
              -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
              -H "Content-Type: application/json" | jq > "dns-backups/$zone_name.json"
          done

      - uses: stefanzweifel/git-auto-commit-action@v5

Po nastavení budú zálohy Cloudflare DNS vytvorené v priečinku dns-backups/domain.tld.json. Samotné nastavenie je však trochu magické, takže som pripravil podrobné kroky, aby bolo možné to v budúcnosti zopakovať.

Inštrukcie #

  1. Získaj Cloudflare API token
  2. Pridaj tento token do svojho Github repozitára ako secret s názvom CLOUDFLARE_API_TOKEN
  3. Povol Github Actions oprávnenia na zápis, keďže táto akcia vytvára automatické commity
  4. Záloha sa bude spúšťať manuálne alebo každú nedeľu skoro ráno, podľa potreby uprav schedule v .github/workflow/main.yml

Cloudflare API token #

Tu je postup, ako vytvoriť Cloudflare API token s minimálnymi oprávneniami pre prístup DNS len na čítanie:

  1. Prihlás sa do svojho Cloudflare dashboardu na https://dash.cloudflare.com/
  2. Klikni na ikonu profilu v pravom hornom rohu a vyber “My Profile”
  3. V ľavom postrannom paneli klikni na “API Tokens”
  4. Klikni na tlačidlo “Create Token”
  5. Vyber “Create Custom Token”
  6. Zadaj opisný názov, napríklad “DNS Backup Read-Only”
  7. V sekcii “Permissions”:
  • Z prvého rozbaľovacieho zoznamu vyber “Zone”
  • Z druhého rozbaľovacieho zoznamu vyber “DNS”
  • Z tretieho rozbaľovacieho zoznamu vyber “Read”
  1. V sekcii “Zone Resources”:
  • Z prvého rozbaľovacieho zoznamu vyber “Include”
  • Z druhého rozbaľovacieho zoznamu vyber “All zones”
  • (Alternatívne môžeš vybrať “Specific zone”, ak chceš obmedziť na určité domény)
  1. Ak chceš, nastav dátum vypršania platnosti (voliteľné, pre väčšiu bezpečnosť)
  2. Klikni na “Continue to summary”
  3. Skontroluj oprávnenia a klikni na “Create Token”
  4. Okamžite skopíruj vygenerovaný token (zobrazí sa len raz)

Tento token má absolútne minimálne potrebné oprávnenia — môže len čítať DNS záznamy a nemôže robiť žiadne zmeny v tvojej konfigurácii. Dodržiava princíp najmenších oprávnení, čo je osvedčená bezpečnostná prax.

Pridávanie Github Secrets #

Github Secrets ti umožňujú bezpečne ukladať citlivé informácie ako sú API tokeny. Postupuj podľa týchto krokov na pridanie Cloudflare API tokenu ako secret.

  1. Prejdi do svojho Github repozitára v prehliadači. Klikni na záložku “Settings” v hornej navigačnej lište (blízko pravej strany)
  2. V ľavom postrannom paneli prejdi dolu do sekcie “Security”. Klikni na “Secrets and variables” a vyber “Actions” z rozbaľovacieho menu
  3. Klikni na tlačidlo “New repository secret”. Zadaj presný názov secretu tak, ako je uvedený vo workflow:
  • Do poľa “Name” zadaj CLOUDFLARE_API_TOKEN
  • Do poľa “Secret” vlož svoj Cloudflare API token. Klikni na “Add secret” pre uloženie
  1. Teraz by si mal vidieť CLOUDFLARE_API_TOKEN v zozname secretov repozitára. Hodnota bude skrytá a zobrazená ako ”●●●●●●●●”. Secret je teraz dostupný pre tvoje Github Actions workflow
  2. Secret v tvojom workflow je už nakonfigurovaný na jeho použitie

Povolenie oprávnení na zápis pre Github Actions #

Aby mohol tvoj DNS zálohovací workflow úspešne commitovať a pushovat zmeny do repozitára, musíš mu udeliť príslušné oprávnenia na zápis. Postupuj podľa týchto krokov:

  1. Prejdi do svojho Github repozitára. Klikni na záložku “Settings” (blízko pravého horného rohu stránky repozitára)
  2. V ľavom postrannom paneli klikni na “Actions” pod “Code and automation”. Prejdi dolu do sekcie “Workflow permissions”
  3. Vyber možnosť “Read and write permissions”
  4. Klikni na “Save” pre uloženie nastavení

Toto je postačujúce pre spúšťanie priamo na Github.

Lokálny vývoj #

Postupuj podľa všetkých vyššie uvedených krokov. Potom navyše nainštaluj nektos/act na svojom počítači, pre mňa na Mac M3 Pro fungovala verzia z Homebrew:

brew install act

Získaj fine-grained Personal Access Token.

cp .secrets.example .secrets

V súbore .secrets aktualizuj CLOUDFLARE_API_TOKEN aj GITHUB_TOKEN. Do tejto premennej vlož svoj práve získaný fine-grained token. Uprav čokoľvek ďalšie potrebné vo svojom main.yml. Potom spusti lokálne:

act workflow_dispatch --no-skip-checkout

Ak spúšťaš act prvýkrát, preferovane vyber Medium Docker image (500 MB). Malo by fungovať s Large (~75 GB) a s Micro nebolo testované.

Vytvorenie fine-grained Personal Access Token #

Tento návod ťa prevedie vytvorením Github fine-grained personal access tokenu (PAT) s oprávneniami na zápis pre konkrétny repozitár.

  1. Prihlás sa do svojho Github účtu. Klikni na svoju profilovú fotku v pravom hornom rohu. Vyber “Settings” z rozbaľovacieho menu. Prejdi dolu na spodok ľavého postranného panela a klikni na “Developer settings”
  2. V ľavom postrannom paneli klikni na “Personal access tokens”. Vyber “Fine-grained tokens”. Klikni na tlačidlo “Generate new token”
  3. Názov tokenu: Zadaj opisný názov (napr. “DNS Backup Workflow”). Popis: Pridaj voliteľný popis, na čo bude token použitý. Platnosť: Vyber, kedy má token vypršať (odporúčané: zvoľ rozumnú dobu, napríklad 90 dní). Vlastník zdroja: Vyber svoje Github používateľské meno (alebo organizáciu, ak sa to týka)
  4. Vyber “Only select repositories”. Klikni na rozbaľovací zoznam repozitárov. Vyber konkrétny repozitár, ku ktorému chceš udeliť prístup
  5. Prejdi dolu do sekcie “Repository permissions”. Nájdi “Contents” v zozname. Zmeň úroveň prístupu z “No access” na “Read and write”. Všetky ostatné oprávnenia nechaj na “No access”, aby si dodržal princíp najmenších oprávnení
  6. Prejdi na spodok stránky. Klikni na “Generate token”. DÔLEŽITÉ: Okamžite skopíruj vygenerovaný token a bezpečne ho ulož (toto je tvoja jediná príležitosť vidieť celý token)

Treba poznamenať, že GITHUB_TOKEN je automaticky injektovaný pre Actions bežiace cez Github. Vyplnenie secretu GITHUB_TOKEN je potrebné len vtedy, keď sa akcia spúšťa cez act. Nech sa darí!

Odkazy #