Some checks are pending
Deploy to Production / deploy (push) Waiting to run
- Added .dockerignore to exclude unnecessary files from Docker builds - Enhanced .env.example with detailed configuration options and added MySQL settings - Created Gitea CI/CD workflow for automated production deployment with health checks - Added comprehensive Caddy server setup guide and configuration for reverse proxy - Created Caddyfile with secure defaults for SSL, compression, and security headers The changes focus on setting up a production-
377 lines
8.9 KiB
Markdown
377 lines
8.9 KiB
Markdown
# VoxBlog Production Deployment - Complete Setup
|
|
|
|
## 🎉 What's Been Created
|
|
|
|
Your VoxBlog project is now **production-ready** with a complete CI/CD pipeline!
|
|
|
|
### Files Created
|
|
|
|
```
|
|
voxblog/
|
|
├── docker/
|
|
│ ├── api.Dockerfile ✅ Backend Docker image
|
|
│ ├── admin.Dockerfile ✅ Frontend Docker image
|
|
│ └── nginx.conf ✅ Nginx config for frontend
|
|
├── .gitea/
|
|
│ └── workflows/
|
|
│ └── deploy.yml ✅ Gitea Actions CI/CD workflow
|
|
├── docker-compose.yml ✅ Multi-container orchestration
|
|
├── deploy.sh ✅ Deployment script (executable)
|
|
├── .dockerignore ✅ Docker build optimization
|
|
├── .env.example ✅ Updated with all variables
|
|
├── DEPLOYMENT_GUIDE.md ✅ Complete deployment documentation
|
|
└── QUICK_START.md ✅ 5-minute setup guide
|
|
```
|
|
|
|
## 🏗️ Architecture
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────┐
|
|
│ Your VPS Server │
|
|
│ │
|
|
│ ┌────────────┐ ┌──────────────┐ ┌─────────────┐ │
|
|
│ │ Gitea │→ │ Gitea Runner │→ │ Docker │ │
|
|
│ │ Repository │ │ (CI/CD) │ │ Containers │ │
|
|
│ └────────────┘ └──────────────┘ └─────────────┘ │
|
|
│ ↓ │
|
|
│ ┌────────────────────────┐ │
|
|
│ │ voxblog-api:3001 │ │
|
|
│ │ voxblog-admin:3000 │ │
|
|
│ │ mysql:3306 │ │
|
|
│ └────────────────────────┘ │
|
|
└─────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## 🚀 Deployment Options
|
|
|
|
### Option 1: Gitea Actions (Recommended)
|
|
|
|
**Pros:**
|
|
- ✅ Fully automated
|
|
- ✅ Built-in to Gitea
|
|
- ✅ GitHub Actions compatible
|
|
- ✅ Detailed logs and status
|
|
- ✅ Secrets management
|
|
|
|
**Setup:**
|
|
1. Install Gitea Runner on VPS
|
|
2. Add secrets to Gitea repository
|
|
3. Push to main → auto-deploy!
|
|
|
|
### Option 2: Webhook + Script
|
|
|
|
**Pros:**
|
|
- ✅ Simple and lightweight
|
|
- ✅ No additional services needed
|
|
- ✅ Direct script execution
|
|
- ✅ Easy to debug
|
|
|
|
**Setup:**
|
|
1. Install webhook listener
|
|
2. Configure Gitea webhook
|
|
3. Push to main → webhook triggers deploy.sh
|
|
|
|
### Option 3: Manual Deployment
|
|
|
|
**Pros:**
|
|
- ✅ Full control
|
|
- ✅ No setup required
|
|
- ✅ Good for testing
|
|
|
|
**Usage:**
|
|
```bash
|
|
ssh user@vps
|
|
cd /path/to/voxblog
|
|
./deploy.sh
|
|
```
|
|
|
|
## 📋 Deployment Workflow
|
|
|
|
```
|
|
Developer commits code
|
|
↓
|
|
Push to main branch
|
|
↓
|
|
Gitea detects push
|
|
↓
|
|
┌─────────────────────────────┐
|
|
│ Gitea Actions / Webhook │
|
|
│ triggers deployment │
|
|
└─────────────────────────────┘
|
|
↓
|
|
┌─────────────────────────────┐
|
|
│ deploy.sh executes: │
|
|
│ 1. Pull latest code │
|
|
│ 2. Build Docker images │
|
|
│ 3. Stop old containers │
|
|
│ 4. Start new containers │
|
|
│ 5. Run DB migrations │
|
|
│ 6. Health checks │
|
|
│ 7. Clean up old images │
|
|
└─────────────────────────────┘
|
|
↓
|
|
✅ Deployment Complete!
|
|
```
|
|
|
|
## 🎯 Quick Start (5 Minutes)
|
|
|
|
### 1. On Your VPS
|
|
|
|
```bash
|
|
# Clone repository
|
|
git clone https://your-gitea-url/username/voxblog.git
|
|
cd voxblog
|
|
|
|
# Configure environment
|
|
cp .env.example .env
|
|
nano .env # Fill in your values
|
|
|
|
# Deploy!
|
|
./deploy.sh
|
|
```
|
|
|
|
### 2. Set Up CI/CD
|
|
|
|
**For Gitea Actions:**
|
|
```bash
|
|
# Install runner
|
|
wget https://dl.gitea.com/act_runner/latest/act_runner-latest-linux-amd64
|
|
chmod +x act_runner-latest-linux-amd64
|
|
sudo mv act_runner-latest-linux-amd64 /usr/local/bin/act_runner
|
|
|
|
# Register and start
|
|
act_runner register --instance https://your-gitea --token YOUR_TOKEN
|
|
# Then set up as systemd service (see QUICK_START.md)
|
|
```
|
|
|
|
**For Webhook:**
|
|
```bash
|
|
sudo apt-get install webhook
|
|
# Configure webhook (see QUICK_START.md)
|
|
```
|
|
|
|
### 3. Add Secrets (Gitea Actions only)
|
|
|
|
Repository → Settings → Secrets → Add all from `.env`
|
|
|
|
### 4. Push to Main
|
|
|
|
```bash
|
|
git add .
|
|
git commit -m "Add deployment configuration"
|
|
git push origin main
|
|
```
|
|
|
|
🎉 **Auto-deployment triggered!**
|
|
|
|
## 🔧 Environment Variables
|
|
|
|
All required variables in `.env`:
|
|
|
|
```bash
|
|
# Database
|
|
MYSQL_ROOT_PASSWORD=strong_password
|
|
MYSQL_PASSWORD=voxblog_password
|
|
|
|
# Application
|
|
ADMIN_PASSWORD=admin_password
|
|
OPENAI_API_KEY=sk-...
|
|
GHOST_ADMIN_API_KEY=...
|
|
|
|
# S3 Storage
|
|
S3_BUCKET=your-bucket
|
|
S3_REGION=us-east-1
|
|
S3_ACCESS_KEY=...
|
|
S3_SECRET_KEY=...
|
|
S3_ENDPOINT=https://s3.amazonaws.com
|
|
|
|
# Frontend
|
|
VITE_API_URL=https://api.yourdomain.com
|
|
```
|
|
|
|
## 🌐 Production Setup
|
|
|
|
### With Domain Name
|
|
|
|
1. **Point DNS to VPS**
|
|
```
|
|
A Record: @ → your-vps-ip
|
|
A Record: api → your-vps-ip
|
|
```
|
|
|
|
2. **Install Nginx**
|
|
```bash
|
|
sudo apt-get install nginx
|
|
# Configure (see QUICK_START.md)
|
|
```
|
|
|
|
3. **Add SSL**
|
|
```bash
|
|
sudo certbot --nginx -d yourdomain.com
|
|
```
|
|
|
|
### Without Domain (IP Only)
|
|
|
|
Access directly:
|
|
- Admin: `http://your-vps-ip:3000`
|
|
- API: `http://your-vps-ip:3001`
|
|
|
|
## 📊 Monitoring & Maintenance
|
|
|
|
### View Logs
|
|
```bash
|
|
docker-compose logs -f
|
|
docker-compose logs -f api
|
|
docker-compose logs -f admin
|
|
```
|
|
|
|
### Check Status
|
|
```bash
|
|
docker-compose ps
|
|
docker ps
|
|
```
|
|
|
|
### Restart Services
|
|
```bash
|
|
docker-compose restart
|
|
docker-compose restart api
|
|
```
|
|
|
|
### Backup Database
|
|
```bash
|
|
docker-compose exec mysql mysqldump -u voxblog -p voxblog > backup.sql
|
|
```
|
|
|
|
### Clean Up
|
|
```bash
|
|
docker system prune -a
|
|
docker volume prune
|
|
```
|
|
|
|
## 🔐 Security Best Practices
|
|
|
|
- ✅ Use strong passwords in `.env`
|
|
- ✅ Never commit `.env` to git (already in .gitignore)
|
|
- ✅ Enable firewall: `sudo ufw enable`
|
|
- ✅ Use SSL/TLS (HTTPS)
|
|
- ✅ Keep Docker updated
|
|
- ✅ Regular backups
|
|
- ✅ Monitor logs for suspicious activity
|
|
- ✅ Use SSH keys instead of passwords
|
|
|
|
## 🐛 Troubleshooting
|
|
|
|
### Deployment Failed
|
|
|
|
```bash
|
|
# Check logs
|
|
docker-compose logs
|
|
|
|
# Check specific service
|
|
docker-compose logs api
|
|
|
|
# Restart
|
|
docker-compose restart
|
|
```
|
|
|
|
### Port Already in Use
|
|
|
|
```bash
|
|
# Find process
|
|
sudo lsof -i :3001
|
|
sudo lsof -i :3000
|
|
|
|
# Kill process
|
|
sudo kill -9 <PID>
|
|
```
|
|
|
|
### Out of Disk Space
|
|
|
|
```bash
|
|
# Check usage
|
|
docker system df
|
|
|
|
# Clean up
|
|
docker system prune -a
|
|
docker volume prune
|
|
```
|
|
|
|
### Database Connection Failed
|
|
|
|
```bash
|
|
# Check MySQL
|
|
docker-compose exec mysql mysql -u voxblog -p
|
|
|
|
# Check environment variables
|
|
docker-compose exec api env | grep DATABASE
|
|
```
|
|
|
|
## 📚 Documentation
|
|
|
|
- **[DEPLOYMENT_GUIDE.md](DEPLOYMENT_GUIDE.md)** - Complete deployment guide
|
|
- **[QUICK_START.md](QUICK_START.md)** - 5-minute setup
|
|
- **[REFACTORING_SUMMARY.md](apps/api/REFACTORING_SUMMARY.md)** - API refactoring details
|
|
- **[STREAMING_GUIDE.md](apps/api/STREAMING_GUIDE.md)** - AI streaming implementation
|
|
|
|
## 🎯 Next Steps
|
|
|
|
1. **Test Locally First**
|
|
```bash
|
|
docker-compose up --build
|
|
```
|
|
|
|
2. **Deploy to VPS**
|
|
```bash
|
|
./deploy.sh
|
|
```
|
|
|
|
3. **Set Up CI/CD**
|
|
- Choose Gitea Actions or Webhook
|
|
- Configure secrets
|
|
- Test auto-deployment
|
|
|
|
4. **Configure Domain & SSL**
|
|
- Point DNS
|
|
- Install Nginx
|
|
- Get SSL certificate
|
|
|
|
5. **Set Up Monitoring**
|
|
- Configure log rotation
|
|
- Set up uptime monitoring
|
|
- Configure backups
|
|
|
|
6. **Go Live!** 🚀
|
|
|
|
## ✅ Production Readiness Checklist
|
|
|
|
- [ ] Docker files created
|
|
- [ ] docker-compose.yml configured
|
|
- [ ] .env file filled with production values
|
|
- [ ] deploy.sh tested locally
|
|
- [ ] CI/CD pipeline chosen and configured
|
|
- [ ] Secrets added to Gitea (if using Actions)
|
|
- [ ] Domain DNS configured (optional)
|
|
- [ ] Nginx reverse proxy set up (optional)
|
|
- [ ] SSL certificate installed (optional)
|
|
- [ ] Firewall configured
|
|
- [ ] Backup strategy in place
|
|
- [ ] Test deployment successful
|
|
- [ ] Health checks passing
|
|
- [ ] Logs accessible and monitored
|
|
|
|
## 🎉 You're Ready!
|
|
|
|
Your VoxBlog project is now production-ready with:
|
|
- ✅ Dockerized backend and frontend
|
|
- ✅ Automated CI/CD pipeline
|
|
- ✅ Database with migrations
|
|
- ✅ Health checks
|
|
- ✅ Easy rollback
|
|
- ✅ Comprehensive documentation
|
|
|
|
**Push to main and watch it deploy automatically!** 🚀
|
|
|
|
---
|
|
|
|
**Questions?** Check the documentation or review the logs: `docker-compose logs -f`
|