Check out my project: Esign Portal
Infrastructure & Deployment
PostgreSQL unavailable — Had to switch to SQLite mid-project because PG wasn't installed, requiring database config rewrite
No SSH access — Password didn't work for SSH, so we had to use the OpenCode web interface to execute every command manually
File transfer failures — 6 different file sharing services failed (temp.sh, transfer.sh, file.io, 0x0.st, catbox.moe, gofile.io) before tmpfiles.org worked
Port conflicts — Python app (Pakistan IP Intelligence) took over port 5000, forced us to move eportal to port 5002 and update Caddy
PM2 instability — Process list kept getting lost on daemon restart, had to repeatedly restart and resave
Backend
JWT secret missing — Deployed app.js was missing dotenv.config(), causing "secretOrPrivateKey must have a value" on login
Frontend not served — app.js on VPS was missing Express static file serving and catch-all route for React
pdf-lib crash — pdf-lib module caused MODULE_NOT_FOUND error when backend tried to start
Frontend
Wrong import paths — Button, Card, and Input components had ../lib/utils instead of ../../lib/utils
Login navigation bug — After successful login, page stayed on login screen because navigate('/') was called before React state flushed; fixed with useEffect-based redirect
Browser cache — Old JS/CSS files cached by browsers after deployments; fixed by building with new Vite content hashes
Caddy & Networking
502 Bad Gateway — Caddy cached stale proxy connections after backend restarts
TLS certificate delays — Let's Encrypt cert took time to provision, HTTPS was broken initially
Dist deployment failed — First tarball extraction didn't properly replace old files
🌐 Live: https://esign.12.jugaar.ai
🐙 Code: https://github.com/mishi29mk-art
Infrastructure & Deployment
PostgreSQL unavailable — Had to switch to SQLite mid-project because PG wasn't installed, requiring database config rewrite
No SSH access — Password didn't work for SSH, so we had to use the OpenCode web interface to execute every command manually
File transfer failures — 6 different file sharing services failed (temp.sh, transfer.sh, file.io, 0x0.st, catbox.moe, gofile.io) before tmpfiles.org worked
Port conflicts — Python app (Pakistan IP Intelligence) took over port 5000, forced us to move eportal to port 5002 and update Caddy
PM2 instability — Process list kept getting lost on daemon restart, had to repeatedly restart and resave
Backend
JWT secret missing — Deployed app.js was missing dotenv.config(), causing "secretOrPrivateKey must have a value" on login
Frontend not served — app.js on VPS was missing Express static file serving and catch-all route for React
pdf-lib crash — pdf-lib module caused MODULE_NOT_FOUND error when backend tried to start
Frontend
Wrong import paths — Button, Card, and Input components had ../lib/utils instead of ../../lib/utils
Login navigation bug — After successful login, page stayed on login screen because navigate('/') was called before React state flushed; fixed with useEffect-based redirect
Browser cache — Old JS/CSS files cached by browsers after deployments; fixed by building with new Vite content hashes
Caddy & Networking
502 Bad Gateway — Caddy cached stale proxy connections after backend restarts
TLS certificate delays — Let's Encrypt cert took time to provision, HTTPS was broken initially
Dist deployment failed — First tarball extraction didn't properly replace old files
🌐 Live: https://esign.12.jugaar.ai
🐙 Code: https://github.com/mishi29mk-art