420 lines
12 KiB
Markdown
420 lines
12 KiB
Markdown
# IDconvert Deployment Guide
|
|
|
|
Two deployment paths are covered:
|
|
- **Path A** — Manual: rsync code to a VPS, run Docker Compose directly
|
|
- **Path B** — Dokploy: self-hosted PaaS UI on the VPS, deploy via GitHub or rsync
|
|
|
|
---
|
|
|
|
## Prerequisites (both paths)
|
|
|
|
### Stripe API keys
|
|
|
|
1. Go to `dashboard.stripe.com` → sign in
|
|
2. Top-left dropdown → confirm you're in **Test mode** (toggle top-right) to start
|
|
3. Left sidebar → **Developers** → **API keys**
|
|
4. Copy **Publishable key** (`pk_test_...`) → `STRIPE_PUBLISHABLE_KEY`
|
|
5. Click **Reveal** on Secret key (`sk_test_...`) → `STRIPE_SECRET_KEY`
|
|
6. **Webhook secret** — leave blank until your server is live with a domain (Step 6 in each path)
|
|
|
|
### Create your local `.env` file
|
|
|
|
```bash
|
|
cp .env.example .env
|
|
```
|
|
|
|
Fill in `.env`:
|
|
|
|
```env
|
|
STRIPE_SECRET_KEY=sk_test_...
|
|
STRIPE_PUBLISHABLE_KEY=pk_test_...
|
|
STRIPE_WEBHOOK_SECRET= # fill in after server is live
|
|
|
|
# MinIO credentials — you choose these, they are self-set
|
|
AWS_ACCESS_KEY_ID=choose_a_username
|
|
AWS_SECRET_ACCESS_KEY=choose_a_strong_password
|
|
|
|
POCKETBASE_ADMIN_TOKEN= # fill in after first boot (Step 5 in each path)
|
|
|
|
# Leave these as-is — correct for docker-compose networking
|
|
POCKETBASE_URL=http://pocketbase:8090
|
|
S3_ENDPOINT_URL=http://minio:9000
|
|
S3_BUCKET=idconvert
|
|
S3_REGION=us-east-1
|
|
FRONTEND_ORIGIN=https://yourdomain.com
|
|
NUXT_PUBLIC_API_BASE=https://yourdomain.com
|
|
NUXT_PUBLIC_POCKETBASE_URL=https://yourdomain.com:8090
|
|
NUXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_...
|
|
```
|
|
|
|
---
|
|
|
|
---
|
|
|
|
# Path A — Manual rsync + Docker Compose
|
|
|
|
## Step 1 — Transfer code to your VPS
|
|
|
|
```bash
|
|
rsync -avz --progress \
|
|
--exclude '.git' \
|
|
--exclude 'node_modules' \
|
|
--exclude 'frontend/.nuxt' \
|
|
--exclude 'frontend/.output' \
|
|
--exclude 'backend/venv' \
|
|
--exclude 'backend/__pycache__' \
|
|
--exclude '**/*.pyc' \
|
|
"/Users/JasonJFraser/Desktop/desktop files/apps/idconvert/" \
|
|
user@your-vps-ip:/opt/idconvert/
|
|
```
|
|
|
|
Copy your `.env` separately (never commit this to git):
|
|
|
|
```bash
|
|
scp "/Users/JasonJFraser/Desktop/desktop files/apps/idconvert/.env" \
|
|
user@your-vps-ip:/opt/idconvert/.env
|
|
```
|
|
|
|
## Step 2 — Install Docker on the VPS
|
|
|
|
SSH in:
|
|
|
|
```bash
|
|
ssh user@your-vps-ip
|
|
```
|
|
|
|
Install Docker:
|
|
|
|
```bash
|
|
curl -fsSL https://get.docker.com | sh
|
|
sudo usermod -aG docker $USER
|
|
exit # log out so the group change takes effect
|
|
```
|
|
|
|
SSH back in, then verify:
|
|
|
|
```bash
|
|
docker --version
|
|
docker compose version
|
|
```
|
|
|
|
## Step 3 — Build and start
|
|
|
|
```bash
|
|
cd /opt/idconvert
|
|
docker compose --env-file .env up -d --build
|
|
docker compose logs -f # watch for errors until all services show healthy
|
|
```
|
|
|
|
## Step 4 — Set up PocketBase (first boot only)
|
|
|
|
1. Open `http://your-vps-ip:8090/_/` in your browser
|
|
2. Create your admin email and password — one-time setup
|
|
3. Create collections from `pb_hooks/SCHEMA.md`:
|
|
- Extend the built-in `users` collection with `credits_balance`, `free_used`, `fingerprint_id`
|
|
- Create `conversions`, `transactions`, `purchases` collections as documented
|
|
4. Go to **Settings → API keys** → create a new key → copy it
|
|
5. Add to `.env` on the VPS: `POCKETBASE_ADMIN_TOKEN=...`
|
|
|
|
```bash
|
|
# Restart backend to pick up the new token
|
|
cd /opt/idconvert
|
|
docker compose restart backend
|
|
```
|
|
|
|
## Step 5 — Point your domain at the VPS
|
|
|
|
In your DNS provider, create an A record:
|
|
|
|
```
|
|
yourdomain.com → your-vps-ip
|
|
```
|
|
|
|
Then set up a reverse proxy (nginx or Caddy) to route traffic to the containers.
|
|
Caddy is the simplest option — it handles SSL automatically:
|
|
|
|
```bash
|
|
sudo apt install -y caddy
|
|
```
|
|
|
|
`/etc/caddy/Caddyfile`:
|
|
|
|
```
|
|
yourdomain.com {
|
|
reverse_proxy localhost:3000 # frontend
|
|
}
|
|
|
|
api.yourdomain.com {
|
|
reverse_proxy localhost:8000 # backend
|
|
}
|
|
```
|
|
|
|
Or use a single domain with path routing:
|
|
|
|
```
|
|
yourdomain.com {
|
|
handle /api/* {
|
|
reverse_proxy localhost:8000
|
|
}
|
|
handle /payments/* {
|
|
reverse_proxy localhost:8000
|
|
}
|
|
handle {
|
|
reverse_proxy localhost:3000
|
|
}
|
|
}
|
|
```
|
|
|
|
```bash
|
|
sudo systemctl reload caddy
|
|
```
|
|
|
|
## Step 6 — Set up Stripe webhook
|
|
|
|
1. Stripe dashboard → **Developers** → **Webhooks** → **Add endpoint**
|
|
2. URL: `https://yourdomain.com/api/payments/webhook`
|
|
3. Event: `payment_intent.succeeded`
|
|
4. Click **Add endpoint** → copy the **Signing secret** (`whsec_...`)
|
|
5. Add to `.env`: `STRIPE_WEBHOOK_SECRET=whsec_...`
|
|
|
|
```bash
|
|
cd /opt/idconvert
|
|
docker compose restart backend
|
|
```
|
|
|
|
## Re-deploying after a code change
|
|
|
|
```bash
|
|
# 1. Push updated code from your Mac
|
|
rsync -avz --progress \
|
|
--exclude '.git' \
|
|
--exclude 'node_modules' \
|
|
--exclude 'frontend/.nuxt' \
|
|
--exclude 'frontend/.output' \
|
|
--exclude 'backend/venv' \
|
|
--exclude 'backend/__pycache__' \
|
|
--exclude '**/*.pyc' \
|
|
"/Users/JasonJFraser/Desktop/desktop files/apps/idconvert/" \
|
|
user@your-vps-ip:/opt/idconvert/
|
|
|
|
# 2. Rebuild and restart on the VPS
|
|
ssh user@your-vps-ip "cd /opt/idconvert && docker compose up -d --build"
|
|
```
|
|
|
|
## Useful management commands
|
|
|
|
```bash
|
|
docker compose ps # list containers and health status
|
|
docker compose logs -f backend # tail backend logs
|
|
docker compose logs -f frontend # tail frontend logs
|
|
docker compose restart backend # restart one service
|
|
docker compose down # stop everything (data preserved)
|
|
docker compose down -v # stop and wipe all volumes (destructive)
|
|
docker compose exec backend bash # shell into the backend container
|
|
```
|
|
|
|
## First-boot order summary
|
|
|
|
```
|
|
1. docker compose up --build
|
|
2. Visit :8090/_/ → create PocketBase admin
|
|
3. Create collections (pb_hooks/SCHEMA.md)
|
|
4. Generate PocketBase API key → add to .env → restart backend
|
|
5. Point domain at VPS → configure reverse proxy
|
|
6. Set up Stripe webhook → add whsec to .env → restart backend
|
|
7. Switch Stripe from test mode to live → swap pk/sk in .env → restart backend
|
|
```
|
|
|
|
---
|
|
|
|
---
|
|
|
|
# Path B — Dokploy (Recommended for easier ongoing management)
|
|
|
|
Dokploy is a self-hosted PaaS that runs on your VPS and gives you a web UI
|
|
for deployments, environment variables, logs, and SSL. It reads your
|
|
`docker-compose.yml` directly.
|
|
|
|
## Step 1 — Install Dokploy on your VPS
|
|
|
|
SSH into your VPS and run the installer:
|
|
|
|
```bash
|
|
ssh user@your-vps-ip
|
|
|
|
curl -sSL https://dokploy.com/install.sh | sh
|
|
```
|
|
|
|
The installer:
|
|
- Installs Docker if not already present
|
|
- Pulls and starts Dokploy
|
|
- Prints the URL to access the dashboard (typically `http://your-vps-ip:3000`)
|
|
|
|
Open that URL in your browser and create your Dokploy admin account.
|
|
|
|
> **Note:** Dokploy itself runs on port 3000. Your IDconvert frontend will
|
|
> be assigned a different port or subdomain by Dokploy — it handles this for you.
|
|
|
|
## Step 2 — Connect your code to Dokploy
|
|
|
|
**Option A — Via GitHub (recommended for automatic deploys):**
|
|
|
|
First, initialise git locally if you haven't already:
|
|
|
|
```bash
|
|
cd "/Users/JasonJFraser/Desktop/desktop files/apps/idconvert"
|
|
git init
|
|
git add .
|
|
git commit -m "Initial commit"
|
|
```
|
|
|
|
Push to a new private GitHub repository (create one at github.com first):
|
|
|
|
```bash
|
|
git remote add origin git@github.com:youruser/idconvert.git
|
|
git push -u origin main
|
|
```
|
|
|
|
In Dokploy dashboard:
|
|
1. **Settings → Git providers** → connect your GitHub account
|
|
2. This allows Dokploy to pull from your private repo
|
|
|
|
**Option B — Via rsync (if you prefer not to use GitHub):**
|
|
|
|
Transfer the code to the VPS first (same rsync command as Path A Step 1),
|
|
placing it at `/opt/idconvert/`. Then in Dokploy, point to that local path.
|
|
|
|
## Step 3 — Create a project in Dokploy
|
|
|
|
1. Dokploy dashboard → **Projects** → **Create project**
|
|
2. Name it `idconvert`
|
|
|
|
## Step 4 — Add a Compose service
|
|
|
|
1. Inside the project → **Create service** → **Compose**
|
|
2. Name it `idconvert-stack`
|
|
3. **Source:**
|
|
- If using GitHub: select your repository and branch (`main`)
|
|
- If using local path: select **Filesystem** and enter `/opt/idconvert`
|
|
4. **Docker Compose path:** `docker-compose.yml`
|
|
5. Click **Save**
|
|
|
|
## Step 5 — Set environment variables in Dokploy
|
|
|
|
In the service → **Environment** tab, paste your entire `.env` file contents.
|
|
|
|
Dokploy stores these securely and injects them at deploy time — you do not
|
|
need a `.env` file on the server.
|
|
|
|
Key variables to set:
|
|
|
|
```env
|
|
STRIPE_SECRET_KEY=sk_test_...
|
|
STRIPE_PUBLISHABLE_KEY=pk_test_...
|
|
STRIPE_WEBHOOK_SECRET= # add after Step 8
|
|
AWS_ACCESS_KEY_ID=choose_a_username
|
|
AWS_SECRET_ACCESS_KEY=choose_a_strong_password
|
|
POCKETBASE_ADMIN_TOKEN= # add after Step 7
|
|
POCKETBASE_URL=http://pocketbase:8090
|
|
S3_ENDPOINT_URL=http://minio:9000
|
|
S3_BUCKET=idconvert
|
|
S3_REGION=us-east-1
|
|
FRONTEND_ORIGIN=https://yourdomain.com
|
|
NUXT_PUBLIC_API_BASE=https://yourdomain.com
|
|
NUXT_PUBLIC_POCKETBASE_URL=https://yourdomain.com:8090
|
|
NUXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_...
|
|
```
|
|
|
|
## Step 6 — Deploy
|
|
|
|
1. Service → **Deployments** tab → **Deploy**
|
|
2. Dokploy pulls the code, builds all images, and starts the stack
|
|
3. Watch the build log in real time in the dashboard
|
|
|
|
## Step 7 — Set up PocketBase (first boot only)
|
|
|
|
1. Dokploy exposes the PocketBase port — find it in the service's **Ports** tab
|
|
or access it at `http://your-vps-ip:8090/_/`
|
|
2. Create your PocketBase admin email and password
|
|
3. Create collections from `pb_hooks/SCHEMA.md`
|
|
4. Go to **Settings → API keys** → create a key → copy it
|
|
5. Go back to Dokploy → service → **Environment** → add `POCKETBASE_ADMIN_TOKEN=...`
|
|
6. Redeploy (Dokploy → **Deploy** button) to apply the new env var
|
|
|
|
## Step 8 — Configure domain and SSL in Dokploy
|
|
|
|
Dokploy handles SSL (Let's Encrypt) automatically.
|
|
|
|
1. Service → **Domains** tab
|
|
2. Add your domain: `yourdomain.com`
|
|
3. Select which container port maps to it:
|
|
- `yourdomain.com` → port `3000` (frontend)
|
|
- `api.yourdomain.com` → port `8000` (backend)
|
|
4. Toggle **HTTPS** on — Dokploy issues the SSL certificate automatically
|
|
5. In your DNS provider, add an A record: `yourdomain.com → your-vps-ip`
|
|
|
|
## Step 9 — Set up Stripe webhook
|
|
|
|
1. Stripe dashboard → **Developers** → **Webhooks** → **Add endpoint**
|
|
2. URL: `https://yourdomain.com/api/payments/webhook`
|
|
(or `https://api.yourdomain.com/api/payments/webhook` if using a subdomain)
|
|
3. Event: `payment_intent.succeeded`
|
|
4. Copy the **Signing secret** (`whsec_...`)
|
|
5. Dokploy → service → **Environment** → add `STRIPE_WEBHOOK_SECRET=whsec_...`
|
|
6. Click **Deploy** to apply
|
|
|
|
## Re-deploying after a code change
|
|
|
|
**If using GitHub:**
|
|
|
|
```bash
|
|
git add .
|
|
git commit -m "your change"
|
|
git push
|
|
```
|
|
|
|
Then in Dokploy → **Deploy** (or enable **Auto deploy** on push in the service settings).
|
|
|
|
**If using rsync:**
|
|
|
|
```bash
|
|
rsync -avz --progress \
|
|
--exclude '.git' \
|
|
--exclude 'node_modules' \
|
|
--exclude 'frontend/.nuxt' \
|
|
--exclude 'frontend/.output' \
|
|
--exclude 'backend/venv' \
|
|
--exclude 'backend/__pycache__' \
|
|
--exclude '**/*.pyc' \
|
|
"/Users/JasonJFraser/Desktop/desktop files/apps/idconvert/" \
|
|
user@your-vps-ip:/opt/idconvert/
|
|
```
|
|
|
|
Then in Dokploy → **Deploy**.
|
|
|
|
## First-boot order summary (Dokploy)
|
|
|
|
```
|
|
1. Install Dokploy on VPS (curl installer)
|
|
2. Create project → add Compose service → set env vars → Deploy
|
|
3. Visit :8090/_/ → create PocketBase admin
|
|
4. Create collections (pb_hooks/SCHEMA.md)
|
|
5. Generate PocketBase API key → add to Dokploy env → Redeploy
|
|
6. Add domain in Dokploy → point DNS → SSL issued automatically
|
|
7. Set up Stripe webhook → add whsec to Dokploy env → Redeploy
|
|
8. Switch Stripe test → live keys in Dokploy env → Redeploy
|
|
```
|
|
|
|
## Path A vs Path B — when to use each
|
|
|
|
| | Path A (rsync + manual Docker) | Path B (Dokploy) |
|
|
|---|---|---|
|
|
| **Setup time** | Faster initially | Slightly more upfront |
|
|
| **Ongoing deploys** | Manual rsync + SSH commands | One click (or git push) |
|
|
| **SSL** | Manual (Caddy/nginx) | Automatic (built into Dokploy) |
|
|
| **Logs** | SSH + `docker compose logs` | Web UI dashboard |
|
|
| **Env var changes** | Edit `.env` on server + restart | Dokploy UI + Redeploy |
|
|
| **Best for** | One-off / simple setups | Ongoing product with regular deploys |
|
|
|
|
For a product with paying customers and regular updates, **Path B (Dokploy) is recommended.**
|