This repository is now split into a modern frontend/backend architecture:
frontend/: Nuxt (Vue) application for the portfolio UI.backend/: Django API + admin for projects, services, blog, and contact inquiries.docker-compose.yml: Local full-stack environment with PostgreSQL.
- Migrated from Django template monolith to split frontend + backend.
- Added Services section support via Django model + API.
- Added Blog section support via Django model + API.
- Added professional Call-To-Action flows:
- Calendly integration (env-driven)
- WhatsApp integration (env-driven)
- Switched Python dependency management from
pip+requirements.txttouv(pyproject.toml+uv.lock). - Added Dockerfiles and Compose stack for local verification before production deployment.
- Copy env template:
cp .env.example .env- Update required variables in
.env:
SECRET_KEYCONTACT_EMAILCALENDLY_URLWHATSAPP_NUMBER- social links
uv sync
uv run python manage.py migrate
uv run python manage.py seed_projects
uv run python manage.py seed_site_content
uv run python manage.py runserverAPI base URL (local): http://localhost:8000/api/
Useful endpoints:
/api/health//api/config//api/landing//api/services//api/projects//api/blog//api/blog/<slug>//api/contact/
cp .env.example .envSet:
API_BASE_URL(server-side in Nuxt)NUXT_PUBLIC_API_BASE_URL(browser-side)
Default local values point to http://localhost:8000/api.
npm install
npm run devFrontend local URL: http://localhost:3000
- Ensure these files exist:
backend/.env.docker(copy frombackend/.env.docker.example)frontend/.env(copy fromfrontend/.env.example)
- Start dev stack:
docker compose up --buildServices:
- Frontend (Nuxt dev):
http://localhost:3000 - Backend API (Django runserver):
http://localhost:8000/api/ - Django admin:
http://localhost:8000/admin/ - PostgreSQL:
localhost:5432
This profile uses:
- Nginx as reverse proxy/edge
- Gunicorn for Django WSGI
- Nuxt SSR runtime (
node .output/server/index.mjs)
- Set production env values (at minimum):
backend/.env.docker: setDEBUG=False, a strongSECRET_KEY, productionALLOWED_HOSTS, and trusted origins.frontend/.env: set public metadata such asNUXT_PUBLIC_SITE_NAME.
docker-compose already pins production API routing to:
API_BASE_URL=http://backend-prod:8000/apiNUXT_PUBLIC_API_BASE_URL=/api
Production-oriented examples are included:
backend/.env.production.examplefrontend/.env.production.example
- Build and run production profile via Nginx entrypoint service:
docker compose --profile prod up --build -d nginx- Validate:
- App through Nginx:
http://localhost/ - API through Nginx:
http://localhost/api/health/ - Nginx health:
http://localhost/healthz
- Stop:
docker compose --profile prod downBackend tests:
cd backend
uv run pytestFrontend build/type check:
cd frontend
npm run build
npm run lintGitHub Actions and Coolify deployment notes are documented in:
docs/deployment/coolify.md