244 lines
5.4 KiB
Markdown
244 lines
5.4 KiB
Markdown
# Local Development Setup
|
|
|
|
This guide shows how to run the application locally for faster development iteration.
|
|
|
|
## Overview
|
|
|
|
Instead of running everything in containers, you can run just PostgreSQL in a container and run the backend (Go) and frontend (Next.js) natively on your machine. This provides:
|
|
|
|
- ✨ Faster hot-reload and rebuild times
|
|
- 🔧 Better debugging experience
|
|
- 📦 Smaller resource footprint
|
|
- 🚀 Quicker iteration cycles
|
|
|
|
## Prerequisites
|
|
|
|
- **Go** 1.24+ installed
|
|
- **Node.js** 18+ and npm (or Bun)
|
|
- **Podman** or **Docker** (for PostgreSQL only)
|
|
|
|
## Quick Start
|
|
|
|
### Option 1: Single Command - Everything! (Recommended)
|
|
|
|
```bash
|
|
# Setup AND start all services in background
|
|
./dev.sh --start
|
|
```
|
|
|
|
**That's it!** This one command:
|
|
- ✓ Starts PostgreSQL (if not running)
|
|
- ✓ Creates `.env` files (if they don't exist)
|
|
- ✓ Runs database migrations (if needed)
|
|
- ✓ Starts backend in background
|
|
- ✓ Starts frontend in background
|
|
|
|
View logs: `tail -f backend.log` or `tail -f frontend.log`
|
|
Stop services: `./dev.sh --stop`
|
|
Check status: `./dev.sh --status`
|
|
|
|
### Option 2: Setup Only (Manual Start)
|
|
|
|
```bash
|
|
# Run setup without starting services
|
|
./dev.sh
|
|
|
|
# Then in separate terminals:
|
|
# Terminal 1 - Backend
|
|
make run-backend
|
|
|
|
# Terminal 2 - Frontend
|
|
make run-frontend
|
|
```
|
|
|
|
The `dev.sh` script is **idempotent** - you can run it multiple times safely. It will:
|
|
- ✓ Check if PostgreSQL is already running (won't restart if running)
|
|
- ✓ Create .env files only if they don't exist
|
|
- ✓ Run migrations only if needed
|
|
- ✓ Skip steps that are already complete
|
|
- ✓ Detect if services are already running (won't duplicate)
|
|
|
|
### Option 3: Using Make
|
|
|
|
```bash
|
|
# Start PostgreSQL and run migrations
|
|
make dev-local
|
|
|
|
# Then in separate terminals:
|
|
# Terminal 1 - Backend
|
|
make run-backend
|
|
|
|
# Terminal 2 - Frontend
|
|
make run-frontend
|
|
```
|
|
|
|
### Option 4: Manual Setup
|
|
|
|
1. **Start PostgreSQL**
|
|
```bash
|
|
make dev-db
|
|
```
|
|
|
|
2. **Configure Backend**
|
|
```bash
|
|
# Copy example env file
|
|
cp backend/.env.example backend/.env
|
|
|
|
# Edit if needed (defaults should work)
|
|
# vim backend/.env
|
|
```
|
|
|
|
3. **Run Database Migrations**
|
|
```bash
|
|
make migrate-up DATABASE_URL="postgres://dev:devpass@localhost:5432/paragliding?sslmode=disable"
|
|
```
|
|
|
|
4. **Start Backend** (in one terminal)
|
|
```bash
|
|
cd backend
|
|
go run ./cmd/api
|
|
```
|
|
Backend will be available at: http://localhost:8080
|
|
|
|
5. **Start Frontend** (in another terminal)
|
|
```bash
|
|
cd frontend
|
|
npm run dev
|
|
# or with bun:
|
|
# bun run dev
|
|
```
|
|
Frontend will be available at: http://localhost:3000
|
|
|
|
## Configuration
|
|
|
|
### Backend Environment Variables
|
|
|
|
The backend uses environment variables defined in `backend/.env`:
|
|
|
|
```bash
|
|
DATABASE_URL=postgres://dev:devpass@localhost:5432/paragliding?sslmode=disable
|
|
PORT=8080
|
|
LOCATION_LAT=32.8893 # Torrey Pines Gliderport
|
|
LOCATION_LON=-117.2519
|
|
LOCATION_NAME=Torrey Pines Gliderport
|
|
TIMEZONE=America/Los_Angeles
|
|
FETCH_INTERVAL=15m
|
|
CACHE_TTL=10m
|
|
```
|
|
|
|
### Frontend Environment Variables
|
|
|
|
The frontend uses `frontend/.env.local`:
|
|
|
|
```bash
|
|
NEXT_PUBLIC_API_URL=http://localhost:8080/api/v1
|
|
```
|
|
|
|
## Database Management
|
|
|
|
```bash
|
|
# Start PostgreSQL
|
|
make dev-db
|
|
|
|
# Stop PostgreSQL
|
|
make dev-db-down
|
|
|
|
# Run migrations up
|
|
make migrate-up DATABASE_URL="postgres://dev:devpass@localhost:5432/paragliding?sslmode=disable"
|
|
|
|
# Run migrations down
|
|
make migrate-down DATABASE_URL="postgres://dev:devpass@localhost:5432/paragliding?sslmode=disable"
|
|
|
|
# Create a new migration
|
|
make migrate-create name=add_new_table
|
|
```
|
|
|
|
## Using Bun Instead of npm
|
|
|
|
If you prefer Bun for faster package installation and execution:
|
|
|
|
```bash
|
|
cd frontend
|
|
|
|
# Install dependencies
|
|
bun install
|
|
|
|
# Run dev server
|
|
bun run dev
|
|
|
|
# Run build
|
|
bun run build
|
|
```
|
|
|
|
## Switching Between Local and Container Development
|
|
|
|
### To Local Development:
|
|
```bash
|
|
# Stop all containers
|
|
make dev-down
|
|
|
|
# Start only PostgreSQL
|
|
make dev-db
|
|
|
|
# Run apps locally (separate terminals)
|
|
make run-backend
|
|
make run-frontend
|
|
```
|
|
|
|
### Back to Full Container Development:
|
|
```bash
|
|
# Stop local PostgreSQL
|
|
make dev-db-down
|
|
|
|
# Start all services in containers
|
|
make dev
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Backend won't connect to PostgreSQL
|
|
- Ensure PostgreSQL is running: `podman ps` or `docker ps`
|
|
- Check connection string in `backend/.env`
|
|
- Verify PostgreSQL is healthy: `podman logs paragliding-postgres`
|
|
|
|
### Frontend can't reach backend
|
|
- Ensure backend is running on port 8080
|
|
- Check `NEXT_PUBLIC_API_URL` in `frontend/.env.local`
|
|
- Verify backend health: `curl http://localhost:8080/api/v1/health`
|
|
|
|
### Port already in use
|
|
- Backend (8080): Change `PORT` in `backend/.env`
|
|
- Frontend (3000): Next.js will prompt for alternative port automatically
|
|
- PostgreSQL (5432): Change port mapping in `docker-compose.dev.yml`
|
|
|
|
## Hot Reload & Live Development
|
|
|
|
- **Frontend**: Next.js automatically hot-reloads on file changes
|
|
- **Backend**: For auto-reload, install Air:
|
|
```bash
|
|
go install github.com/air-verse/air@latest
|
|
cd backend
|
|
air
|
|
```
|
|
Air config is already set up in `backend/.air.toml`
|
|
|
|
## Running Tests
|
|
|
|
```bash
|
|
# Backend tests
|
|
make test-backend
|
|
|
|
# Frontend tests
|
|
make test-frontend
|
|
```
|
|
|
|
## API Endpoints
|
|
|
|
Once running, you can access:
|
|
|
|
- Frontend: http://localhost:3000
|
|
- Backend API: http://localhost:8080/api/v1
|
|
- Health Check: http://localhost:8080/api/v1/health
|
|
- Current Weather: http://localhost:8080/api/v1/weather/current
|
|
- Forecast: http://localhost:8080/api/v1/weather/forecast
|