228 lines
4.5 KiB
Markdown
228 lines
4.5 KiB
Markdown
# PNGer Development Instructions
|
|
|
|
## Project Overview
|
|
|
|
PNGer is a single-container web application for PNG editing and resizing, designed for deployment on Unraid with Gitea version control.
|
|
|
|
## Development Roadmap
|
|
|
|
### Phase 1: MVP Foundation (Current)
|
|
- [x] Repository setup
|
|
- [ ] Project structure initialization
|
|
- [ ] Backend API scaffold
|
|
- [ ] Frontend scaffold
|
|
- [ ] Basic upload/download flow
|
|
- [ ] Dockerfile configuration
|
|
|
|
### Phase 2: Core Features
|
|
- [ ] Image resize functionality
|
|
- [ ] PNG compression
|
|
- [ ] Real-time preview
|
|
- [ ] Responsive UI design
|
|
- [ ] Error handling
|
|
|
|
### Phase 3: Polish & Deployment
|
|
- [ ] Docker Compose for Unraid
|
|
- [ ] Environment configuration
|
|
- [ ] Documentation
|
|
- [ ] Testing
|
|
- [ ] Production build optimization
|
|
|
|
## Technical Architecture
|
|
|
|
### Backend (Express + Sharp)
|
|
|
|
**Endpoints:**
|
|
- `POST /api/upload` - Accept PNG file
|
|
- `POST /api/process` - Resize/compress image
|
|
- `GET /api/health` - Health check
|
|
|
|
**Key Dependencies:**
|
|
- express: Web framework
|
|
- multer: File upload handling
|
|
- sharp: Image processing
|
|
- cors: Cross-origin support
|
|
|
|
### Frontend (Svelte + Vite)
|
|
|
|
**Components:**
|
|
- `App.svelte` - Main container
|
|
- `Uploader.svelte` - Drag & drop interface
|
|
- `Editor.svelte` - Resize controls
|
|
- `Preview.svelte` - Real-time image preview
|
|
- `Download.svelte` - Download button
|
|
|
|
**Key Dependencies:**
|
|
- svelte: Reactive framework
|
|
- vite: Build tool
|
|
- axios: HTTP client
|
|
|
|
### Docker Strategy
|
|
|
|
**Multi-stage Build:**
|
|
1. Stage 1: Build frontend (Vite build)
|
|
2. Stage 2: Copy frontend + setup backend
|
|
3. Final image: Alpine-based Node.js
|
|
|
|
**Image Size Target:** < 150MB
|
|
|
|
## Local Development Setup
|
|
|
|
### Prerequisites
|
|
- Node.js 20+
|
|
- npm or pnpm
|
|
- Docker (optional)
|
|
|
|
### Initial Setup
|
|
|
|
```bash
|
|
# Clone repository
|
|
git clone https://git.alwisp.com/jason/pnger.git
|
|
cd pnger
|
|
|
|
# Install root dependencies (if monorepo)
|
|
npm install
|
|
|
|
# Setup backend
|
|
cd backend
|
|
npm install
|
|
npm run dev
|
|
|
|
# Setup frontend (new terminal)
|
|
cd frontend
|
|
npm install
|
|
npm run dev
|
|
```
|
|
|
|
### Development Workflow
|
|
|
|
1. **Feature Branch**: Create from `main`
|
|
2. **Develop**: Make changes with hot-reload
|
|
3. **Test**: Manual testing + health checks
|
|
4. **Commit**: Descriptive commit messages
|
|
5. **Push**: Push to Gitea
|
|
6. **Review**: Self-review changes
|
|
7. **Merge**: Merge to `main`
|
|
|
|
### Environment Variables
|
|
|
|
**Backend (.env):**
|
|
```
|
|
PORT=3000
|
|
NODE_ENV=development
|
|
MAX_FILE_SIZE=10
|
|
CORS_ORIGIN=http://localhost:5173
|
|
```
|
|
|
|
**Frontend (.env):**
|
|
```
|
|
VITE_API_URL=http://localhost:3000/api
|
|
```
|
|
|
|
## Docker Build & Test
|
|
|
|
```bash
|
|
# Build image
|
|
docker build -t pnger:test .
|
|
|
|
# Run container
|
|
docker run -p 8080:3000 --name pnger-test pnger:test
|
|
|
|
# Test endpoints
|
|
curl http://localhost:8080/api/health
|
|
|
|
# View logs
|
|
docker logs pnger-test
|
|
|
|
# Stop and remove
|
|
docker stop pnger-test && docker rm pnger-test
|
|
```
|
|
|
|
## Unraid Deployment
|
|
|
|
### Setup Steps
|
|
|
|
1. **SSH into Unraid**
|
|
2. **Navigate to docker configs**: `/mnt/user/appdata/pnger`
|
|
3. **Clone repository**:
|
|
```bash
|
|
git clone https://git.alwisp.com/jason/pnger.git
|
|
cd pnger
|
|
```
|
|
4. **Build and run**:
|
|
```bash
|
|
docker-compose up -d
|
|
```
|
|
5. **Access**: http://[unraid-ip]:8080
|
|
|
|
### Update Process
|
|
|
|
```bash
|
|
cd /mnt/user/appdata/pnger
|
|
git pull origin main
|
|
docker-compose down
|
|
docker-compose build
|
|
docker-compose up -d
|
|
```
|
|
|
|
## Code Standards
|
|
|
|
### JavaScript/Svelte
|
|
- Use ES6+ features
|
|
- Async/await for asynchronous operations
|
|
- Descriptive variable names
|
|
- Comments for complex logic only
|
|
|
|
### File Organization
|
|
- One component per file
|
|
- Group related utilities
|
|
- Keep components under 200 lines
|
|
|
|
### Commit Messages
|
|
- Format: `type: description`
|
|
- Types: feat, fix, docs, style, refactor, test
|
|
- Example: `feat: add drag and drop upload`
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
**Port already in use:**
|
|
```bash
|
|
lsof -ti:3000 | xargs kill -9
|
|
```
|
|
|
|
**Sharp installation issues:**
|
|
```bash
|
|
npm rebuild sharp
|
|
```
|
|
|
|
**Docker build fails:**
|
|
- Check Docker daemon is running
|
|
- Verify Dockerfile syntax
|
|
- Clear Docker cache: `docker builder prune`
|
|
|
|
## Performance Targets
|
|
|
|
- Upload handling: < 100ms (for 5MB file)
|
|
- Image processing: < 2s (for 10MP image)
|
|
- Download generation: < 500ms
|
|
- UI response time: < 100ms
|
|
- Docker image size: < 150MB
|
|
|
|
## Security Considerations
|
|
|
|
- File type validation (PNG only)
|
|
- File size limits (10MB default)
|
|
- No persistent storage of user files
|
|
- Memory cleanup after processing
|
|
- CORS configuration
|
|
|
|
## Next Steps
|
|
|
|
1. Create backend folder structure
|
|
2. Create frontend folder structure
|
|
3. Initialize package.json files
|
|
4. Create Dockerfile
|
|
5. Create docker-compose.yml
|
|
6. Begin MVP development |