# Portfolio — Fullstack Developer

A modern, production-grade portfolio website built with Next.js 16, TailwindCSS, Framer Motion, and Prisma.

## Tech Stack

- **Frontend**: Next.js 16 (App Router), React 19, TypeScript
- **Styling**: TailwindCSS + custom design tokens
- **Animations**: Framer Motion
- **ORM**: Prisma (PostgreSQL)
- **Validation**: Zod + React Hook Form
- **Icons**: Lucide React + React Icons
- **Infrastructure**: Docker + Docker Compose

## Project Structure

```
src/
├── app/
│   ├── api/                  # API Routes (Analytics, Contact, etc.)
│   ├── blog/                 # Blog pages
│   ├── dashboard/            # Admin dashboard
│   ├── layout.tsx            # Root layout with SEO metadata
│   └── page.tsx              # Home page (Server Component)
├── components/
│   ├── sections/             # Full-page section components
│   └── ui/                   # Reusable UI components (shadcn/ui style)
├── lib/
│   ├── prisma.ts             # Prisma client singleton
│   ├── s3.ts                 # Storage configuration (Cloudflare R2)
│   └── visitor.ts            # Analytics tracking logic
├── prisma/
│   ├── schema.prisma         # Database schema
│   └── migrations/           # Database migration history
├── Dockerfile                # Multi-stage production build
├── docker-compose.yml        # Infrastructure orchestration
└── deploy.sh                 # Production deployment script
```

## Getting Started

### 1. Install dependencies
```bash
pnpm install
```

### 2. Setup environment
```bash
cp .env.example .env
# Edit .env with your DATABASE_URL and other credentials
```

### 3. Setup database
```bash
pnpm db:generate             # Generate Prisma client
npx prisma migrate dev       # Run migrations
```

### 4. Run development server
```bash
pnpm dev
```

Open [http://localhost:3000](http://localhost:3000)

## Deployment (Production Ready)

Project ini sudah dilengkapi dengan konfigurasi Docker untuk deployment mandiri (self-hosted).

### Deploy menggunakan Docker
1. Pastikan Docker dan Docker Compose sudah terinstall di server.
2. Siapkan file `.env` di root direktori.
3. Jalankan script deployment:
```bash
chmod +x deploy.sh
./deploy.sh
```

Script `deploy.sh` akan secara otomatis:
- Mendeteksi apakah database sudah berjalan (mencegah konflik).
- Membangun image Docker terbaru (`fikri-portfolio-app`).
- Menjalankan migrasi database Prisma secara otomatis.
- Melakukan pembersihan image lama untuk menghemat ruang disk.

Aplikasi akan berjalan di port **4000**.

## Architecture & Philosophy

Portfolio ini merefleksikan pengalaman saya sebagai **Fullstack Developer selama 3+ tahun** dalam membangun aplikasi web yang skalabel dan siap produksi:
- **Scalable Architecture**: Pemisahan yang jelas antara UI, logika bisnis, dan akses data.
- **Modern Next.js Features**: Memanfaatkan Server Components untuk performa maksimal dan SEO.
- **Type Safety**: Penggunaan TypeScript di seluruh bagian aplikasi (End-to-end).
- **Automated Deployment**: Konfigurasi Docker yang dioptimalkan untuk performa dan kemudahan maintenance.
- **Clean Code**: Fokus pada keterbacaan kode (*readability*) dan kemudahan pemeliharaan (*maintainability*).

## Contact

Update profile Anda di:
- `src/app/layout.tsx` — SEO metadata (name, description)
- `src/components/sections/...` — Konten section masing-masing
