Docker Frappe
Fixing Common Frappe Docker Errors, Backing Up, and Restoring Databases
π§ Introduction
Running Frappe or ERPNext in Docker simplifies deployment, but real-world use often brings challenges β like missing CSS, password mismatches, and restoring backups correctly.
This guide explains how to:
- Back up your database and site files
- Restore a full Frappe instance on a fresh Docker setup
- Fix common Frappe Docker errors
- Solve the notorious βCSS not loadingβ issue after restore
Tested on Arch Linux (Manjaro i3) using Frappe/ERPNext v15.
π³ 1. Frappe Docker Overview
A typical frappe_docker setup runs these containers:
| Container | Role |
|---|---|
frappe_docker-frontend-1 |
Nginx web server (serves frontend assets) |
frappe_docker-backend-1 |
Bench and Python app server |
frappe_docker-db-1 |
MariaDB database |
frappe_docker-redis-* |
Redis for cache, queue, socketio |
frappe_docker-scheduler-1 |
Scheduled background jobs |
frappe_docker-queue-* |
Workers handling background tasks |
Each container is isolated β site data, database, and static files live in different volumes.
πΎ 2. Backing Up Frappe / ERPNext Data
A complete backup includes two parts:
- Database Dump (.sql)
- Site Files (site folder with public/private/uploads)
π Step 1 β Find Your Database Info
Run inside the backend container:
docker exec -it frappe_docker-backend-1 cat /home/frappe/frappe-bench/sites/frontend/site_config.json
Youβll see something like:
{
"db_name": "_5e5899d8398b5f7b",
"db_password": "8F9NalSR2to37McZ",
"db_type": "mariadb"
}
πΎ Step 2 β Backup the Database
Run on your host, not inside a container:
docker exec -i frappe_docker-db-1 mysqldump -u _5e5899d8398b5f7b -p'8F9NalSR2to37McZ' _5e5899d8398b5f7b > frappe_db_backup.sql
β
Creates frappe_db_backup.sql on your host.
π Step 3 β Backup Site Files
docker exec -t frappe_docker-backend-1 tar czf - -C /home/frappe/frappe-bench sites > frappe_sites_backup.tar.gz
β
This saves your entire sites/ directory (public, private, and configs).
π Step 4 β Organize Backups
Keep things clean and dated:
mkdir -p backups/$(date +%F)
mv frappe_db_backup.sql frappe_sites_backup.tar.gz backups/$(date +%F)/
π 3. Restoring a Backup to a Fresh Instance
Step 1 β Remove Old Setup
docker stop $(docker ps -aq --filter "name=frappe_docker-")
docker rm $(docker ps -aq --filter "name=frappe_docker-")
docker volume rm $(docker volume ls -q --filter "name=frappe_docker")
Step 2 β Recreate the Stack
git clone https://github.com/frappe/frappe_docker.git
cd frappe_docker
docker compose -f compose.yaml -f overrides/compose.erpnext.yaml up -d
Step 3 β Restore Database
Copy your SQL backup into the DB container:
docker cp frappe_db_backup.sql frappe_docker-db-1:/root/
Access the DB container:
docker exec -it frappe_docker-db-1 bash
Inside MariaDB:
mysql -u root -p
Then:
CREATE DATABASE _5e5899d8398b5f7b;
GRANT ALL PRIVILEGES ON _5e5899d8398b5f7b.* TO '_5e5899d8398b5f7b'@'%' IDENTIFIED BY '8F9NalSR2to37McZ';
FLUSH PRIVILEGES;
EXIT;
Now import:
mysql -u _5e5899d8398b5f7b -p'8F9NalSR2to37McZ' _5e5899d8398b5f7b < /root/frappe_db_backup.sql
exit
Step 4 β Restore Site Files
docker cp frappe_sites_backup.tar.gz frappe_docker-backend-1:/home/frappe/
docker exec -it frappe_docker-backend-1 bash
cd /home/frappe/frappe-bench
tar -xzf /home/frappe/frappe_sites_backup.tar.gz
exit
Step 5 β Sync Passwords
If db_password mismatches:
docker exec -it frappe_docker-db-1 mysql -u root -p
Then:
ALTER USER '_5e5899d8398b5f7b'@'%' IDENTIFIED BY 'k8INrBbWUX3RrGNB';
FLUSH PRIVILEGES;
EXIT;
Step 6 β Migrate and Rebuild
docker exec -it frappe_docker-backend-1 bash
cd /home/frappe/frappe-bench
bench --site frontend migrate
bench build
exit
docker compose restart
π¨ 4. Fix: CSS or JS Not Loading After Restore
Symptom: ERPNext loads as plain text with no CSS or theme β βunstyledβ page.
Root Causes:
- Missing or outdated assets in
/sites/assets/ - Version mismatch between your site and current image
- Nginx serving cached or broken links
β Solution 1 β Rebuild Assets
docker exec -it frappe_docker-backend-1 bash
cd /home/frappe/frappe-bench
bench build
bench clear-cache
bench clear-website-cache
exit
docker restart frappe_docker-frontend-1
β Solution 2 β Delete Old Assets and Rebuild
docker exec -it frappe_docker-backend-1 bash
cd /home/frappe/frappe-bench/sites
rm -rf assets
cd /home/frappe/frappe-bench
bench build
exit
docker restart frappe_docker-frontend-1
β Solution 3 β Clear Browser + Nginx Cache
-
In your browser β DevTools β Network β Disable cache
-
Hard-refresh (
Ctrl+Shift+RorCmd+Shift+R) -
Restart containers again if necessary:
docker compose restart
β Solution 4 β Version Sync Fix (Advanced)
If you restored a site from a different ERPNext/Frappe version, you may need to rebuild the assets with matching code:
docker exec -it frappe_docker-backend-1 bash
cd /home/frappe/frappe-bench
bench setup requirements
bench build
exit
docker restart frappe_docker-frontend-1
β Solution 5 β Check Assets Path in Nginx
Inside the frontend container:
docker exec -it frappe_docker-frontend-1 cat /etc/nginx/conf.d/default.conf | grep assets
Ensure it points to /usr/share/nginx/html/assets or the correct mounted site assets volume.
βοΈ 5. Common Frappe Docker Errors & Fixes
| Problem | Cause | Fix |
|---|---|---|
| Access denied for user | DB password mismatch | Update site_config.json or run ALTER USER |
| Redis connection refused | Redis container not ready | docker restart frappe_docker-redis-* |
| Bench commands restricted | Production mode | Use docker exec -it frappe_docker-backend-1 bash |
| Missing site error | Site folder not restored | Copy site folder into /home/frappe/frappe-bench/sites |
| No CSS / unstyled site | Broken assets | Run bench build and restart Nginx |
| Port 8080 already in use | Conflict with another app | Change port mapping in compose file |
π 6. Verify the Restore
-
Log in with your old credentials
-
Run:
docker exec -it frappe_docker-backend-1 bench doctorEnsure all services are green (OK).
π§Ή 7. Cleanup
Once restored successfully:
docker exec -it frappe_docker-db-1 rm /root/frappe_db_backup.sql
docker exec -it frappe_docker-backend-1 rm /home/frappe/frappe_sites_backup.tar.gz
π§ 8. Summary
| Task | Command |
|---|---|
| Backup DB | docker exec -i frappe_docker-db-1 mysqldump ... > backup.sql |
| Backup Site | docker exec -t frappe_docker-backend-1 tar czf ... > sites.tar.gz |
| Restore DB | mysql -u user -p'pass' db < backup.sql |
| Restore Files | tar -xzf sites.tar.gz -C /home/frappe/frappe-bench |
| Fix CSS | bench build && docker restart frappe_docker-frontend-1 |
| Verify | bench doctor |