Installation Issues
pnpm install fails with dependency errors
Symptom: Running pnpm install in the project root or admin/ directory produces errors such as ENOTSUP, Unsupported engine, or peer dependency conflicts.
Solution:
- Confirm you are running Node.js 20.x — run
node -vto check. NodeForgeCMS is not tested against Node.js 18.x or 22.x and may produce incompatible native module errors on other versions. - Clear the pnpm cache and retry:
- Ensure
pnpmitself is up to date:npm install -g pnpm@latest.
If you are using a Node version manager (nvm, fnm, volta), make sure the correct version is active in your current shell session before running
pnpm install.Database connection error on startup
Symptom: The API server fails to start and logs an error such asError: connect ECONNREFUSED 127.0.0.1:3306 or Access denied for user.
Solution:
- Verify MySQL 8.x is installed and running:
systemctl status mysql(Linux) or check MySQL Workbench/Services on Windows. - Open your
.envfile and confirm the following variables are correctly set: - Test the connection manually:
mysql -u your_db_user -p -h 127.0.0.1. - Ensure the database user has been granted the necessary privileges:
GRANT ALL PRIVILEGES ON nodeforge.* TO 'your_db_user'@'localhost';
Redis connection error on startup
Symptom: The server starts but immediately logsError: connect ECONNREFUSED 127.0.0.1:6379 or ReplyError: NOAUTH Authentication required.
Solution:
- Verify Redis 7 is installed and running:
systemctl status redisorredis-cli ping(should returnPONG). - Check your
.envfor the correct Redis settings: - If Redis requires a password, ensure
REDIS_PASSWORDis set to match therequirepassdirective in yourredis.conf. - If Redis is running on a non-standard port or a remote host, update
REDIS_HOSTandREDIS_PORTaccordingly.
Admin Panel Issues
Admin panel at port 4000 won’t load
Symptom: Navigating tohttp://localhost:4000 returns a “connection refused” or blank error page.
Solution:
- The admin panel is a separate Nuxt4 application that must be started independently. Ensure you have opened a terminal inside the
admin/directory and run: - Confirm no other process is occupying port 4000:
lsof -i :4000(Linux/macOS) ornetstat -ano | findstr :4000(Windows). - Verify the main API server is also running on port 3000, as the admin panel depends on it for all data.
In production, the admin panel is served as a built static application. Run
pnpm build inside admin/ and point your web server to the generated admin/.output/public directory.Can’t log in to the admin panel
Symptom: Entering credentials on the login screen returns “Invalid username or password” or the page redirects back to login without feedback. Solution:- The default credentials are
admin/admin123. Try these first if you have not changed them. - Ensure the API server is running on port 3000 and is reachable from the browser — open
http://localhost:3000/api/healthto verify. - If you have changed your password and forgotten it, reset it directly in MySQL:
Replace
newpassword123with your desired password and log in with it immediately, then change it via the admin UI.
Admin panel shows a blank page after login
Symptom: Login succeeds but the dashboard renders as a completely blank white page with no content or error message visible. Solution:- Open your browser’s developer tools (F12) and check the Console tab for JavaScript errors. Note the full error message before proceeding.
- Confirm the API server is running on port 3000 — many admin views fail silently when API calls return network errors.
- Clear your browser cache and local storage, then refresh. Stale cached assets from a previous version can cause rendering failures after an update.
- If the issue appeared after a recent update, re-run
pnpm installin theadmin/directory and rebuild:pnpm build.
Content & Media Issues
Images not loading after upload
Symptom: Images are successfully uploaded via the admin panel but appear as broken links on the public-facing site. Solution:- Open your
.envfile and verify thatIMG_HOSTis set to the publicly accessible base URL of your server, e.g.: - If you are using Nginx as a reverse proxy, confirm the
/uploadsalias is present in your Nginx server block: - Check that the
/uploadsdirectory has the correct read permissions for the web server user (www-dataornginx).
In development,
IMG_HOST is typically http://localhost:3000. Remember to update it to your production domain before going live.Article not appearing on the public site
Symptom: An article has been created and saved in the admin panel but does not appear on the public-facing website. Solution:- In the admin panel, open the article and confirm its status is set to Published — articles in Draft status are never rendered on the public site.
- Verify the article has been assigned to an active, published column (category). If the parent column is in draft status, all its articles are hidden regardless of their individual status.
- If running in SSG mode, the static site must be regenerated and redeployed after publishing new content — static files are not updated automatically.
SEO / Static Generation Issues
pnpm run generate fails mid-build
Symptom: Running pnpm run generate starts but terminates with errors related to rate limiting, request blocking, or missing modules.
Solution:
- The most common cause is the
nuxt-api-shieldmodule intercepting the high volume of internal API requests made during static generation. Remove or comment outnuxt-api-shieldfrom yournuxt.config.tsbefore running generate: - Re-add
nuxt-api-shieldafter generation is complete if you are deploying in a hybrid mode. - Ensure your API server is running and accessible during the generate process, as Nuxt will fetch live data to build static pages.
Pages not indexed by search engines
Symptom: Pages exist on the site but Google Search Console or other crawlers report them as not indexed, or they appear with “Crawled - currently not indexed”. Solution:- Ensure NodeForgeCMS is running in SSR or SSG mode, not CSR-only. Client-Side Rendering (CSR) delivers an empty HTML shell to crawlers, which prevents indexing. Check your
nuxt.config.ts—ssr: truemust be set. - Verify your
robots.txt(served from/public/robots.txt) is not accidentally blocking crawlers with aDisallow: /directive. - Confirm your XML sitemap is being generated and is accessible at
/sitemap.xml. Submit the sitemap URL directly in Google Search Console to accelerate indexing. - Check that your production server is not serving pages behind HTTP Basic Auth or an IP allowlist that blocks crawler access.
Multilingual Issues
Translated content not showing at the localized URL
Symptom: Content exists in the admin panel in a specific language but navigating to the localized URL (e.g.,/fr/article-slug) returns a 404 or falls back to the default language.
Solution:
- In the admin panel, open the article and confirm that the correct language was selected when the translated version was created. Each language version is stored independently — saving content in English does not automatically create translations.
- Verify the target language is enabled in Admin Panel → Settings → Languages. Disabled languages are excluded from routing.
- Check that the language routing configuration in
nuxt.config.ts(under@nuxtjs/i18n) includes the expected locale code and its URL prefix matches what you are testing. - In SSG mode, re-run
pnpm run generateafter adding or updating translated content to rebuild the localized static pages.
URL slugs are language-specific in NodeForgeCMS. The slug for the French version of an article can (and often should) differ from the English slug to improve local SEO.