Add INSTRUCTIONS.md with development roadmap and setup guide
This commit is contained in:
228
INSTRUCTIONS.md
Normal file
228
INSTRUCTIONS.md
Normal file
@@ -0,0 +1,228 @@
|
|||||||
|
# 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
|
||||||
Reference in New Issue
Block a user