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.
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.
| 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.
Krok 1: Premenuj postcss.config.js → postcss.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:
npm ci && hugo --minify --gcpublicNový build by mal prejsť bez chyby.
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.
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.
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
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.
npm ci && hugo --minify --gc prejde bez chybypostcss.config.mjs + allowRead v config/_default/hugo.yamlpackage-lock.json a go.sumnpm ci && hugo --minify --gcpublic| 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 |
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.