⚠️ Work in Progress - This project is actively being built and is not feature-complete. Modules may be partially implemented, APIs may change, and some sections of this README may describe planned (not yet shipped) functionality. Not intended for production use.
A multi-tenant SaaS API built with Laravel 13 (PHP 8.4), consumed by a Nuxt 4 frontend. Includes Stripe billing, Spatie roles & permissions, S3-compatible file storage, real-time notifications via Laravel Reverb, and OpenAI integration.
- Docker with Docker Compose v2
- Git
git clone https://github.com/bruzp/portfolio.git portfolio
cd portfolioIf you're on Linux or WSL and get an exec format error when building, run:
echo "{}" > ~/.docker/config.jsoncp api/.env.example api/.envOpen api/.env and update the values to match Docker:
DB_CONNECTION=pgsql
DB_HOST=postgres
DB_PORT=5432
DB_DATABASE=portfolio_db
DB_USERNAME=portfolio_user
DB_PASSWORD=portfolio_password
REDIS_HOST=redis
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
FILESYSTEM_DISK=s3
AWS_ENDPOINT=http://minio:9000
AWS_BUCKET=portfolio
AWS_ACCESS_KEY_ID=portfolio_minio
AWS_SECRET_ACCESS_KEY=portfolio_minio_secret
AWS_USE_PATH_STYLE_ENDPOINT=true
REVERB_HOST=reverb
REVERB_PORT=8080touch web/.envMake sure this is set:
NUXT_PUBLIC_API_BASE=http://localhost:8000/api
NUXT_PUBLIC_REVERB_HOST=localhost
NUXT_PUBLIC_REVERB_PORT=8080docker compose build --no-cachedocker compose run --rm api composer installThis step ensures
package-lock.jsonis compatible with the Linux Alpine container. Only needed on first setup or after adding new packages.
docker compose run --rm web npm installdocker compose up -ddocker compose exec api php artisan key:generatedocker compose exec api php artisan migrate --seedFrontend:
http://localhost:3000
API:
http://localhost:8000/api
MinIO Console (file storage):
http://localhost:9001
Mailpit (catch local emails):
http://localhost:8025
The seeder creates the following users:
| Role | Password | |
|---|---|---|
| Admin | admin@example.com |
password |
| Member | user@example.com |
password |
Backend: Laravel 13, PHP 8.4, PostgreSQL 17, Redis, Laravel Reverb, Spatie Permission, Laravel Cashier (Stripe) Frontend: Nuxt 4, Vue 3, Nuxt UI, Pinia Infra: Docker, MinIO (S3-compatible storage), Mailpit (local email testing)