portfolio-page/backend/README.md

240 lines
5.7 KiB
Markdown

# Portfolio Backend API
A secure Node.js backend API for handling contact form submissions from your portfolio website.
## Features
- 🔒 **Security**: Rate limiting, CORS protection, input validation, spam protection
- 📧 **Email Integration**: Nodemailer with Gmail/SMTP support
-**Validation**: Comprehensive form validation with Joi
- 🚀 **Performance**: Express.js with async error handling
- 🛡️ **Anti-Spam**: Honeypot fields and rate limiting
- 📝 **Logging**: Request/response logging and error tracking
- 🎨 **Email Templates**: Professional HTML email templates
## Setup Instructions
### 1. Install Dependencies
```bash
cd backend
npm install
```
### 2. Configure Environment
Copy the example environment file and configure your settings:
```bash
cp .env.example .env
```
Edit `.env` with your actual configuration:
```env
# Server Configuration
PORT=3001
NODE_ENV=development
# Email Configuration (Gmail example)
EMAIL_SERVICE=gmail
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_SECURE=false
EMAIL_USER=your-email@gmail.com
EMAIL_PASS=your-app-password
# Recipient Configuration
RECIPIENT_EMAIL=your-email@gmail.com
RECIPIENT_NAME=Your Name
# Frontend URL (for CORS)
FRONTEND_URL=http://localhost:5173
# Rate Limiting
RATE_LIMIT_WINDOW_MS=900000
RATE_LIMIT_MAX_REQUESTS=5
```
### 3. Gmail Setup (Recommended)
1. **Enable 2-Factor Authentication** on your Gmail account
2. **Generate App Password**:
- Go to Google Account settings
- Security → 2-Step Verification → App passwords
- Generate a password for "Mail"
- Use this as `EMAIL_PASS` in your `.env` file
### 4. Alternative Email Providers
**Outlook/Hotmail:**
```env
EMAIL_SERVICE=hotmail
EMAIL_HOST=smtp-mail.outlook.com
EMAIL_PORT=587
EMAIL_SECURE=false
```
**Custom SMTP:**
```env
EMAIL_SERVICE=
EMAIL_HOST=your-smtp-host.com
EMAIL_PORT=587
EMAIL_SECURE=false
```
### 5. Run the Server
**Development:**
```bash
npm run dev
```
**Production:**
```bash
npm start
```
### 6. Test the API
Visit: `http://localhost:3001/health` to verify the server is running.
For development, you can test the contact endpoint: `http://localhost:3001/api/contact/test`
## API Endpoints
### Health Check
- **GET** `/health` - Server health status
### Contact Form
- **POST** `/api/contact` - Send contact email
**Request Body:**
```json
{
"firstName": "John",
"lastName": "Doe",
"email": "john@example.com",
"subject": "Project Inquiry",
"message": "Hello, I'd like to discuss a project..."
}
```
**Response:**
```json
{
"success": true,
"message": "Your message has been sent successfully! I'll get back to you soon."
}
```
## Security Features
- **Rate Limiting**: 5 requests per 15 minutes per IP
- **Input Validation**: Joi schema validation for all fields
- **CORS Protection**: Configurable origin restrictions
- **Helmet Security**: Security headers
- **Honeypot Anti-Spam**: Hidden field detection
- **Request Logging**: IP and user agent tracking
## Deployment Options
### 1. Heroku
```bash
# Install Heroku CLI, then:
heroku create your-portfolio-api
heroku config:set NODE_ENV=production
heroku config:set EMAIL_USER=your-email@gmail.com
# ... set other environment variables
git push heroku main
```
### 2. Railway
```bash
# Install Railway CLI, then:
railway login
railway new
railway add
railway up
```
### 3. DigitalOcean App Platform
- Create new app from GitHub repository
- Set environment variables in the dashboard
- Deploy automatically
### 4. Vercel (Serverless)
- Convert Express app to serverless functions
- Deploy with `vercel` CLI
## Environment Variables Reference
| Variable | Description | Example |
| ------------------------- | --------------------------- | ---------------------- |
| `PORT` | Server port | `3001` |
| `NODE_ENV` | Environment | `production` |
| `EMAIL_SERVICE` | Email service provider | `gmail` |
| `EMAIL_HOST` | SMTP host | `smtp.gmail.com` |
| `EMAIL_PORT` | SMTP port | `587` |
| `EMAIL_SECURE` | Use SSL/TLS | `false` |
| `EMAIL_USER` | Email username | `your@gmail.com` |
| `EMAIL_PASS` | Email password/app password | `app-password` |
| `RECIPIENT_EMAIL` | Where to send emails | `your@gmail.com` |
| `RECIPIENT_NAME` | Recipient display name | `Your Name` |
| `FRONTEND_URL` | Frontend URL for CORS | `https://yoursite.com` |
| `RATE_LIMIT_WINDOW_MS` | Rate limit window | `900000` (15 min) |
| `RATE_LIMIT_MAX_REQUESTS` | Max requests per window | `5` |
## Troubleshooting
### Email Not Sending
1. Check Gmail app password is correct
2. Verify 2FA is enabled on Gmail
3. Check console logs for detailed errors
4. Test with `/health` endpoint first
### CORS Issues
1. Verify `FRONTEND_URL` matches your frontend domain exactly
2. Include protocol (http/https) in the URL
3. No trailing slashes
### Rate Limiting
- Default: 5 requests per 15 minutes per IP
- Adjust `RATE_LIMIT_*` variables as needed
- Check IP address in logs for debugging
## Production Checklist
- [ ] Environment variables configured
- [ ] Email service tested
- [ ] Rate limiting configured
- [ ] CORS origins restricted
- [ ] SSL/HTTPS enabled
- [ ] Error monitoring setup
- [ ] Logs configured
- [ ] Backup strategy in place
## Support
If you encounter issues:
1. Check the console logs
2. Verify your `.env` configuration
3. Test email configuration with `/health` endpoint
4. Ensure your email provider allows SMTP access