Kompletné riešenie Node.js ERR_ACCESS_DENIED na Cloudflare Pages. Krok za krokom s citáciami a osvedčenými postupmi.
Build úspešne prejde lokálne, ale na Cloudflare Pages zlyha:
panic: POSTCSS: failed to transform "css/hb.css" (text/css):
Error: Access to this API has been restricted. Use --allow-fs-read to manage permissions.
code: 'ERR_ACCESS_DENIED',
permission: 'FileSystemRead',
resource: '/opt/buildhome/.cache/hugo_cache/modules/filecache/.../package.json'
Od Hugo v0.160 (apríl 2026) bol zavedený Node.js permission model, ktorý spúšťa Node tools (PostCSS, TailwindCSS, Babel) s --permission flagom. Cloudflare Pages má globálne cache mimo projektu, takže PostCSS nemôže čítať konfigurácie mimo . (projekt).
Zdroj: Hugo v0.160 Release Notes – “Harden Node tool execution with –permission flag”
postcss.config.mjs (ESM formát)Premenujte postcss.config.js → postcss.config.mjs a použite ESM syntax:
1// postcss.config.mjs
2import autoprefixer from 'autoprefixer'
3
4const isDev = process.env.HUGO_ENVIRONMENT === 'development'
5
6export default {
7 plugins: [
8 !isDev ? autoprefixer : null
9 ],
10 map: isDev ? { inline: true } : false
11}
Prečo ESM?
V config/_default/hugo.yaml pridajte:
1security:
2 node:
3 permissions:
4 allowRead:
5 - '.' # Projekt
6 - '/**/browserslist*' # Browserslist config
7 - '/**/package.json' # package.json kdekoľvek
8 - '/**/node_modules/**' # Node modules
9 allowAddons:
10 - tailwindcss
11 allowWorker:
12 - tailwindcss
13 allowChildProcess:
14 - tailwindcss
1git add package-lock.json go.sum
2git commit -m "Lock dependencies for CI/CD builds"
3git push
Prečo?
V Cloudflare Pages dashboard:
npm ci && hugo --minify --gcpublicHUGO_VERSION: 0.164.0 (alebo novšia)NODE_VERSION: 22.16.0 (alebo novšia)Ak máte HB Stack modul, skontrolujte, že package-lock.json je commitnutý.
Podľa Hugo Discourse diskusie a GitHub Issue #15041, tu je overená postupnosť krokov.
1# Vymaž cache
2rm -rf resources/ .hugo_cache/
3
4# Build ako na Cloudflare
5npm ci
6hugo --minify --gc
Ak build projde bez chyby, problém je iba na Cloudflare Pages.
Variant A (odporúčané): Vypni sandbox v config
1# Uprav config/_default/hugo.yaml
2# Pridaj:
3# security:
4# node:
5# permissions:
6# disable: true
Variant B: Alebo skúsime ESM config (bezpečnejšie)
1# Premenuj postcss.config.js na postcss.config.mjs
2# a použij ESM syntax (viď vyššie)
1git add config/_default/hugo.yaml package-lock.json go.sum
2git commit -m "Fix Node.js permission error on Cloudflare Pages"
3git push
V Cloudflare Pages dashboard:
npm ci && hugo --minify --gcpublicPodľa Cloudflare Pages dokumentácie, environment by mal automaticky nainštalovať Hugo a NPM dependencies.
Ak vám všetky vyššie riešenia nefungujú alebo chcete najrýchlejší workaround, môžete vypnúť Node.js permission model. Toto je odporúčané riešenie od Hugo maintainerov pre prípad, keď permissions spôsobujú problémy.
V config/_default/hugo.yaml pridajte:
1security:
2 node:
3 permissions:
4 disable: true
Prečo to funguje?
--permission flagomBezpečnosť:
Commit a push:
1git add config/_default/hugo.yaml
2git commit -m "Disable Node.js permissions (ERR_ACCESS_DENIED workaround)"
3git push
V Cloudflare Pages dashboard > Settings > Build > Environment variables:
| Meno | Hodnota |
|---|---|
NODE_OPTIONS |
--no-experimental-permission |
Potom normálny build command:
npm ci && hugo --minify --gc
Výhody:
Podľa Hugo dokumentácie, môžete vyňať PostCSS z security allow listu:
V config/_default/hugo.yaml:
1security:
2 exec:
3 allow:
4 - '^(dart-)?sass(-embedded)?$'
5 - '^go$'
6 - '^git$'
7 - '^node$'
8 # - '^postcss$' <- ZAKOMENTOVANÉ (vypnutá security)
9 - '^tailwindcss$'
Výhody:
1security:
2 node:
3 permissions:
4 allowRead:
5 - '.'
6 - '*' # Všetky súbory (menej bezpečné, ale jemnejšie ako disable)
Commit:
1git add config/_default/hugo.yaml
2git commit -m "Expand Node.js permissions for Cloudflare Pages"
3git push
V Cloudflare Pages environment variables:
HUGO_CACHEDIR=./.hugo_cache
Niekedy pomôže, ak je cache umiestnený v projekte.
1hugo --logLevel=debug 2>&1 | grep -i "postcss\|permission\|access"
1hugo config | grep -A 20 security
V Cloudflare dashboard > Deployments > Zvolte failed build > View build log:
Hľadajte:
ERR_ACCESS_DENIED
FileSystemRead
resource: /path/to/file
Q: Môžem mať postcss.config.js aj postcss.config.mjs?
A: Nie, Hugo hľadá v tomto poradí: .mjs → .js → .cjs. Mať obidva je matúce. Staň sa pri .mjs.
Q: Musím commitnúť resources/ priečinok?
A: Nie je povinné, ale je silne odporúčané na CI/CD. Image processing cache urýchľuje build o minúty.
1git add resources/
2git commit -m "Cache image resources for faster builds"
Q: Prečo to funguje lokálne ale nie na Cloudflare?
A: Lokálny Hugo má prístup k všetkým súborom. Cloudflare Pages permissions ide prísnejšie. ESM config + allowRead pravidlá to riešia.
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 pokrýva.
1security:
2 node:
3 permissions:
4 allowAddons:
5 - tailwindcss
6 allowWorker:
7 - tailwindcss
Q: Je to bezpečné vypnúť Node permissions úplne?
A: Áno, pre private projekty je to bezpečné. Hugo je trusted tool a spúšťate ho vy, nie hostingová platforma. Ide len o to, že Node.js sandbox (introduced v Hugo 0.160) zamedzuje file system prístupom mimo projektu. Ak sa vám páči prísnosť, ponechajte si ESM config + allowRead. Ak chcete rýchle riešenie bez problémov, vypnite sandbox.
Q: Aký je rozdiel medzi disable: true a NODE_OPTIONS?
A: Obe fungujú rovnako:
disable: true v Hugo config = permanent (uložené v repozitári)NODE_OPTIONS v Cloudflare env = dočasné (iba na CI/CD)Ak plánujete mať to trvale, použite disable: true. Ak skúšate workaround, skúste NODE_OPTIONS bez zmeny súborov.
Q: Je to bezpečné expandovať permissions s allowRead: ['*']?
A: Áno, je to bezpečnejšie než disable: true. Stále máte file system kontrolu, len čítanie všetkých súborov. Dopĺňa sa to medzi:
| Hugo verzia | PostCSS support | Node permissions | ESM support | Odporúčanie |
|---|---|---|---|---|
| < 0.160 | ✅ Funguje | ❌ Nie | ❌ Nie | Upgrade |
| 0.160–0.162 | ⚠️ Problémy | ✅ Ano | ⚠️ Slabé | Upgrade |
| 0.163.0+ | ✅ OK | ✅ Ano | ✅ Ano | Používajte |
| 0.164+ | ✅ Optimálny | ✅ Ano | ✅ Ano | Ideálny |
npm ci && hugo --minify --gc prejde bez chybypostcss.config.mjs (ESM, nie CJS)config/_default/hugo.yaml má security settings s allowReadpackage-lock.json a go.sumnpm ci && hugo --minify --gcpublicconfig/_default/hugo.yaml je security.node.permissions.disable: truepackage-lock.json a go.sumnpm ci && hugo --minify --gcpublic| Zdroj | URL | Poznámka |
|---|---|---|
| Hugo v0.160 Release | gohugo.io releases | Zavedenie Node.js permission modelu |
| Hugo Issue #15041 | github.com/gohugoio/hugo/issues/15041 | CJS resolver problém – diskusia s maintainermi |
| Hugo Discourse | discourse.gohugo.io/t/57186 | PostCSS ERR_ACCESS_DENIED problém a riešenia |
| Hugo Security Docs | gohugo.io/functions/css/postcss | PostCSS konfigurácia a Node permissions |
| Cloudflare Pages Hugo | gohugo.io/host-and-deploy/host-on-cloudflare | Deploy na Cloudflare s Hugo |
| Node.js Permissions | nodejs.org/api/permissions.html | Node.js permission model dokumentácia |
| Cloudflare Pages Docs | developers.cloudflare.com/pages | Build environment a verzie nástrojov |
Rýchle riešenie: security.node.permissions.disable: true v config/_default/hugo.yaml
Bezpečnejšie riešenie: ESM config (postcss.config.mjs) + allowRead pravidlá
Cloudflare Pages + Hugo 0.163+ + ESM PostCSS = stabilný, bezpečný build.
Postupujte podľa checklistu vyššie a problémy by mali zmiznúť. Ak nie, skontrolujte Cloudflare build logy.