Cloudflare Pages + Hugo: Node.js Permission Error – Riešenie

Riešenie Node.js permission error (ERR_ACCESS_DENIED) na Cloudflare Pages pri buildovaní Hugo projektov. Tri odporúčané prístupy: ESM config, NODE_OPTIONS, alebo vypnúť permissions.

Problém

Build úspešne prejde lokálne, ale na Cloudflare Pages zlyha s:

ERR_ACCESS_DENIED – FileSystemRead permission denied

Príčina: Od Hugo v0.160 (apríl 2026) Node tools (PostCSS, TailwindCSS, Babel) beží s --permission flagom. Cloudflare Pages má cache mimo projektu, tak PostCSS nemôže čítať konfigurácie.


Tri riešenia

Riešenie Bezpečnosť Úsilie Kedy
1. ESM config + allowRead ✅ Bezpečné Stredné Permanentné riešenie
2. NODE_OPTIONS env ✅ Bezpečné Minimálne Rýchly test bez zmien
3. Vypnúť permissions ⚠️ Akceptovateľné Minimálne Private projekt, bez problémov

Odporúčanie: Začni s riešením 1 (ESM). Ak nefunguje → skús 2 alebo 3.


Riešenie 1: ESM Config + allowRead (ODPORÚČANÉ)

Krok 1: Premenuj postcss.config.jspostcss.config.mjs:

1import autoprefixer from 'autoprefixer'
2
3const isDev = process.env.HUGO_ENVIRONMENT === 'development'
4
5export default {
6  plugins: [!isDev ? autoprefixer : null],
7  map: isDev ? { inline: true } : false
8}

Krok 2: V config/_default/hugo.yaml pridaj:

 1security:
 2  node:
 3    permissions:
 4      allowRead:
 5        - '.'
 6        - '/**/browserslist*'
 7        - '/**/package.json'
 8        - '/**/node_modules/**'
 9      allowAddons:
10        - tailwindcss
11      allowWorker:
12        - tailwindcss

Krok 3: Commitni a pusni:

1git add config/_default/hugo.yaml package-lock.json go.sum
2git commit -m "Fix: Node.js permission error on Cloudflare Pages"
3git push

Krok 4: V Cloudflare Pages dashboard:

  • Settings > Build > Build command: npm ci && hugo --minify --gc
  • Settings > Build > Build directory: public

Nový build by mal prejsť bez chyby.


Riešenie 2: NODE_OPTIONS (Rýchlo, bez zmien súborov)

V Cloudflare Pages Settings > Environment variables pridaj:

Meno Hodnota
NODE_OPTIONS --no-experimental-permission

Potom normálny build: npm ci && hugo --minify --gc

Výhoda: Skúšanie bez commitnutia súborov. Ak funguje, môžeš potom prejsť na riešenie 1.


Riešenie 3: Vypnúť Permissions v Config

V config/_default/hugo.yaml:

1security:
2  node:
3    permissions:
4      disable: true

Commit a push:

1git add config/_default/hugo.yaml
2git commit -m "Disable Node.js permissions (ERR_ACCESS_DENIED workaround)"
3git push

Výhoda: Najrýchlejšie. Nevýhoda: Menej bezpečné, ale akceptovateľné pre private projekty.


Diagnostika

1# Debug log
2hugo --logLevel=debug 2>&1 | grep -i "postcss\|permission"
3
4# Overenie config
5hugo config | grep -A 10 security
6
7# Cloudflare logy: Deployments > Failed build > View build log
8# Hľadaj: ERR_ACCESS_DENIED, FileSystemRead

FAQ

Q: Prečo to funguje lokálne ale nie na Cloudflare?

A: Lokálny Hugo má prístup ku všetkým súborom. Cloudflare Pages je prísnejší. ESM config + allowRead to riešia.


Q: Aký je rozdiel medzi disable: true a NODE_OPTIONS?

A: Oba fungujú rovnako:

  • disable: true = permanent (v repozitári)
  • NODE_OPTIONS = dočasne (iba na Cloudflare)

Ak plánuješ to mať trvale, použij disable: true. Ak skúšaš workaround, skúś NODE_OPTIONS.


Q: Čo ak mám TailwindCSS alebo Babel?

A: Rovnaké pravidlá. Všetky Node tools (PostCSS, TailwindCSS, Babel) sa spúšťajú s rovnakými permissions. Konfigurácia vyššie ich všetky pokrýva.


Q: Ako viem, že som si zvolil správne riešenie?

A: Ak build na Cloudflare Pages prejde bez ERR_ACCESS_DENIED, je to v poriadku. Skúšaj postupne: riešenie 1 → 2 → 3.


Checklist

  • Lokálne npm ci && hugo --minify --gc prejde bez chyby
  • Zvolené riešenie (1, 2 alebo 3)
  • Ak riešenie 1: postcss.config.mjs + allowRead v config/_default/hugo.yaml
  • Commitnutý package-lock.json a go.sum
  • Cloudflare build command: npm ci && hugo --minify --gc
  • Cloudflare build directory: public

Zdroje

Zdroj Odkaz
Hugo v0.160 Release github.com/gohugoio/hugo/releases/tag/v0.160.0
Hugo Issue #15041 github.com/gohugoio/hugo/issues/15041
Hugo Discourse (ERR_ACCESS_DENIED) discourse.gohugo.io/t/57186
Hugo Security Docs (PostCSS) gohugo.io/functions/css/postcss
Cloudflare Pages + Hugo gohugo.io/host-and-deploy/host-on-cloudflare
Node.js Permissions nodejs.org/api/permissions.html

Zhrnutie

Rýchle riešenie: Riešenie 1 (ESM config) alebo riešenie 3 (vypnúť sandbox).

Bezpečnú verziu: ESM config + allowRead pravidlá.

Cloudflare Pages + Hugo 0.163+ + ESM PostCSS = stabilný, bezpečný build.