76 lines
2.2 KiB
Markdown
76 lines
2.2 KiB
Markdown
|
|
# 🚀 Deployment Guide
|
||
|
|
|
||
|
|
## 📁 **Environment Files Overview**
|
||
|
|
|
||
|
|
### **Development:**
|
||
|
|
- `.env` - Your local development environment (active)
|
||
|
|
- `.env.example` - Development template for new developers
|
||
|
|
|
||
|
|
### **Production:**
|
||
|
|
- `.env.production` - Production environment for Plesk deployment
|
||
|
|
- `compose-plesk.yaml` - Docker Stack definition
|
||
|
|
|
||
|
|
## 🔧 **Plesk Deployment Steps**
|
||
|
|
|
||
|
|
### **Step 1: Authenticate Docker (One-time)**
|
||
|
|
```bash
|
||
|
|
# SSH to Plesk server
|
||
|
|
echo "YOUR_GITHUB_TOKEN" | docker login ghcr.io -u ntumurbars --password-stdin
|
||
|
|
```
|
||
|
|
|
||
|
|
### **Step 2: Upload Files to Plesk**
|
||
|
|
Upload these files to your domain directory:
|
||
|
|
1. `compose-plesk.yaml` - Docker Stack definition
|
||
|
|
2. `.env.production` - Environment variables (rename to `.env`)
|
||
|
|
|
||
|
|
### **Step 3: Deploy Stack**
|
||
|
|
1. **Plesk → Docker → Stacks → Add Stack**
|
||
|
|
2. **Project name**: `customer-portal`
|
||
|
|
3. **Method**: Upload file or paste `compose-plesk.yaml` content
|
||
|
|
4. **Deploy**
|
||
|
|
|
||
|
|
### **Step 4: Configure Nginx Proxy**
|
||
|
|
1. **Plesk → Websites & Domains → yourdomain.com → Docker Proxy Rules**
|
||
|
|
2. **Add rule**: `/` → `portal-frontend` → port `3000`
|
||
|
|
3. **Add rule**: `/api` → `portal-backend` → port `4000`
|
||
|
|
|
||
|
|
## 🔄 **Update Workflow**
|
||
|
|
|
||
|
|
### **When You Push Code:**
|
||
|
|
1. **GitHub Actions** builds new images automatically
|
||
|
|
2. **SSH to Plesk** and update:
|
||
|
|
```bash
|
||
|
|
cd /var/www/vhosts/yourdomain.com/httpdocs/
|
||
|
|
docker compose -f compose-plesk.yaml pull
|
||
|
|
docker compose -f compose-plesk.yaml up -d
|
||
|
|
```
|
||
|
|
|
||
|
|
## 🔐 **Environment Variables**
|
||
|
|
|
||
|
|
Your compose file uses these key variables from `.env.production`:
|
||
|
|
|
||
|
|
### **Database:**
|
||
|
|
- `POSTGRES_DB`, `POSTGRES_USER`, `POSTGRES_PASSWORD`
|
||
|
|
- `DATABASE_URL` - Full connection string
|
||
|
|
|
||
|
|
### **Application:**
|
||
|
|
- `JWT_SECRET`, `CORS_ORIGIN`
|
||
|
|
- `NEXT_PUBLIC_API_BASE`, `NEXT_PUBLIC_APP_NAME`
|
||
|
|
|
||
|
|
### **External APIs:**
|
||
|
|
- `WHMCS_BASE_URL`, `WHMCS_API_IDENTIFIER`, `WHMCS_API_SECRET`
|
||
|
|
- `SF_LOGIN_URL`, `SF_CLIENT_ID`, `SF_USERNAME`
|
||
|
|
|
||
|
|
### **Email & Logging:**
|
||
|
|
- `SENDGRID_API_KEY`, `EMAIL_FROM`
|
||
|
|
- `LOG_LEVEL`, `LOG_FORMAT`
|
||
|
|
|
||
|
|
## ✅ **Ready to Deploy!**
|
||
|
|
|
||
|
|
Your setup is clean and production-ready:
|
||
|
|
- ✅ Environment variables properly configured
|
||
|
|
- ✅ Docker secrets via environment variables
|
||
|
|
- ✅ Database and Redis secured (localhost only)
|
||
|
|
- ✅ Automated image building
|
||
|
|
- ✅ Clean file structure
|