Production-ready Nuxt with ElectronJS and CapacitorJS, a battlefield-tested, free-standing app.
5.6K
Welcome to the official Docker Hub repository for the Nuxt 4 Full-Stack Portfolio ā a production-grade, fully containerized application built for developers who want a battle-tested reference architecture they can clone, study, and ship.
š GitHub: Bader-Idris/nuxt4-fullstack-portfolioā š Live App: baderidris.comā
This isn't just a portfolio template ā it's a full-stack monorepo that runs equally well as a web app (SSR/SSG), a mobile app (Capacitor / Ionic), and a desktop app (Electron). Every major subsystem ā authentication, real-time communication, email delivery, blog/CMS, database backups, and reverse-proxy SSL ā ships as a single cohesive Docker Compose stack.
The project is fully internationalized across Arabic, Spanish, and English (ar / es / en), with responsive layouts tested on both mobile and desktop clients.
/content/admin, /dashboard, /login, /register, and all sensitive API routes/dashboardogImage and ogUrl meta tags for rich social previews and AI-readable structured metadataar / es / en) support across all pages/projects/train.blend) is shipped directly in the repo at app/assets/three/resources ā fully open for study and modificationtiredofit/db-backup container backs up both PostgreSQL and MongoDB on a configurable schedulereplicas: 2, rolling update policy).env files (.env.capacitor, .env.electron) isolate configuration per targetā ļø Building on a resource-constrained server is not recommended. Use this pre-built image instead.
services:
app:
image: baderidris/nuxt-portfolio:latest
restart: always
volumes:
- ./.data:/app/.data
- ./.env:/app/.env
- ./.env.production:/app/.env.production
environment:
- PORT=3000
- NODE_ENV=production
depends_on:
- mongo
- postgres
command: bun start
networks:
- app-network
mongo:
image: mongo:8-jammy
restart: always
environment:
- MONGO_INITDB_ROOT_USERNAME=your_user
- MONGO_INITDB_ROOT_PASSWORD=your_password
volumes:
- mongo-db:/data/db
networks:
- app-network
postgres:
image: postgres:18-alpine
restart: always
environment:
POSTGRES_PASSWORD: your_password
POSTGRES_DB: articles
volumes:
- psql-data:/var/lib/postgresql
networks:
- app-network
redis:
image: redis:alpine
restart: always
networks:
- app-network
volumes:
mongo-db:
psql-data:
networks:
app-network:
driver: bridge
For the full production stack including Nginx, Certbot, Postfix/Dovecot, Fail2Ban, and automated DB backups ā including the final SSL layer via compose.ssl.yaml ā refer to the detailed setup guide in the GitHub repository READMEā .
Use the appropriate prefix for Nuxt runtime config variables:
# Public (exposed to client)
NUXT_PUBLIC_ORIGIN_URL="https://example.com"
# Private (server-only)
NUXT_MAIL_HOST="smtp.example.com"
NUXT_SESSION_SECRET="a-long-random-secret"
Copy .env.example from the repo and fill in all required values before first run. For Prisma migrations run:
bunx prisma migrate deploy
bunx prisma generate
š Nuxt runtime config docs: nuxt.com/docs/guide/going-further/runtime-configā
| Service | Image | Purpose |
|---|---|---|
app | baderidris/nuxt-portfolio | Nuxt 4 SSR app (this image) |
nginx | nginx:stable-alpine | Reverse proxy + SSL termination |
certbot | certbot/certbot | Let's Encrypt TLS certificates |
mongo | mongo:8-jammy | Auth, sessions, roles, chat history |
postgres | postgres:18-alpine | Blog posts & relational content via Prisma |
redis | redis:alpine | Caching, Socket.IO adapter |
backup | tiredofit/db-backup | Scheduled DB snapshots |
If this project saves you time or teaches you something new, please consider:
Happy coding!
Content type
Image
Digest
sha256:35a2488e9ā¦
Size
147.9 MB
Last updated
12 months ago
docker pull baderidris/nuxt-portfolio