A personal portfolio website with project showcase and URL shortener, featuring
an ASCII-style retro aesthetic. The URL shortener handles redirects for a
configurable domain (set via SHORTENER_DOMAIN environment variable).
-
Start services:
docker compose up -d
-
Run migrations:
docker compose exec backend deno task migrate -
Create admin user: Set
ADMIN_USERNAMEandADMIN_PASSWORDindocker-compose.ymlor.env, then:docker compose exec backend deno task init-admin -
Access:
- Frontend: http://localhost:5173
- Backend API: http://localhost:8000
-
Create environment file:
cp .env.skel .env # Edit .env with your values -
Required variables:
DATABASE_URL- MySQL connection stringJWT_SECRET- Generate with:openssl rand -base64 32ADMIN_USERNAME- Admin username (optional, auto-created on startup)ADMIN_PASSWORD- Admin password (required if ADMIN_USERNAME is set)CORS_ORIGIN- Your frontend domain (e.g.,https://example.com)SHORTENER_DOMAIN- Short URL domain (optional, e.g.,exam.pl- if not set, redirects are disabled)MAIN_SITE_URL- Main site URL (optional, e.g.,example.com- redirects shortener domain root to this)
-
Start services:
docker compose -f docker-compose.prod.yml up -d
Migrations and admin user creation run automatically on startup.
-
Verify:
docker compose -f docker-compose.prod.yml logs backend | grep -i admin
docker compose exec frontend bashdocker compose exec backend bashdocker compose logs -fBackend: Deno + TypeScript + Oak + Drizzle ORM
Frontend: Vue 3 + TypeScript + Vite + Pinia
Database: MySQL 8.0
Containerization: Docker + Docker Compose