All checks were successful
Build and Release / build-and-release (push) Successful in 15m24s
124 lines
3.4 KiB
Markdown
124 lines
3.4 KiB
Markdown
# Deploy — Self-Updating Docker Container
|
|
|
|
A single Docker container that serves the web app and auto-rebuilds when it receives a webhook from Gitea. Designed for Unraid with a Pangolin reverse proxy.
|
|
|
|
## How It Works
|
|
|
|
The container runs a Node.js server that:
|
|
|
|
1. **Serves** the built Vite SPA with gzip compression and proper caching
|
|
2. **Listens** for `POST /api/webhook` calls (auth handled by Pangolin)
|
|
3. **On webhook**: clones the repo, installs deps, builds, and hot-swaps the served files with zero downtime
|
|
4. **On first start**: auto-builds if no previous release exists
|
|
|
|
## Quick Start
|
|
|
|
### 1. Build the image
|
|
|
|
From the **project root** (not `deploy/`):
|
|
|
|
```bash
|
|
docker build -f deploy/Dockerfile -t moyettes/brycord .
|
|
```
|
|
|
|
### 2. Run the container
|
|
|
|
```bash
|
|
docker run -d \
|
|
--name moyettes/brycord \
|
|
-p 3000:3000 \
|
|
-e GIT_REPO_URL=https://gitea.example.com/user/discord-clone.git \
|
|
-e VITE_CONVEX_URL=https://your-convex-deployment.convex.cloud \
|
|
-e VITE_LIVEKIT_URL=wss://your-livekit-server.com \
|
|
discord-clone-web
|
|
```
|
|
|
|
The container will clone the repo and build on first start. Watch progress with:
|
|
|
|
```bash
|
|
docker logs -f discord-clone-web
|
|
```
|
|
|
|
Once the build completes, visit `http://localhost:3000`.
|
|
|
|
## Environment Variables
|
|
|
|
| Variable | Required | Default | Description |
|
|
|---|---|---|---|
|
|
| `GIT_REPO_URL` | Yes | | Git repository URL to clone |
|
|
| `GIT_BRANCH` | No | `main` | Branch to build |
|
|
| `VITE_CONVEX_URL` | Yes | | Convex backend URL |
|
|
| `VITE_LIVEKIT_URL` | Yes | | LiveKit WebSocket URL |
|
|
| `PORT` | No | `3000` | Server port |
|
|
|
|
## API Endpoints
|
|
|
|
### `POST /api/webhook`
|
|
|
|
Triggers a new build. Auth is handled by Pangolin reverse proxy.
|
|
|
|
```bash
|
|
curl -X POST http://localhost:3000/api/webhook
|
|
```
|
|
|
|
**Responses:**
|
|
- `200` — Build triggered
|
|
- `409` — Build already in progress
|
|
|
|
### `GET /api/status`
|
|
|
|
Returns current build status. No auth required.
|
|
|
|
```bash
|
|
curl http://localhost:3000/api/status
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"building": false,
|
|
"status": "success",
|
|
"timestamp": 1708531200000,
|
|
"error": null
|
|
}
|
|
```
|
|
|
|
`status` is one of: `idle`, `building`, `success`, `failed`.
|
|
|
|
## Unraid Setup
|
|
|
|
1. Build the image (or push to a registry and pull from there)
|
|
2. In the Unraid Docker UI, create a new container:
|
|
- **Repository**: `discord-clone-web`
|
|
- **Port mapping**: 3000 -> 3000
|
|
- Add each environment variable listed above
|
|
3. Start the container and wait for the initial build to finish
|
|
|
|
## Gitea Webhook Setup
|
|
|
|
1. In your Gitea repo, go to **Settings > Webhooks > Add Webhook > Gitea**
|
|
2. Configure:
|
|
- **Target URL**: `https://your-domain.com/api/webhook`
|
|
- **HTTP Method**: POST
|
|
- **Content Type**: application/json
|
|
- **Trigger On**: Push Events
|
|
- **Branch filter**: `main`
|
|
3. Click **Add Webhook**, then **Test Delivery** to verify
|
|
|
|
Auth for the webhook endpoint is handled by Pangolin's HTTP Header Auth.
|
|
|
|
## Rebuild Manually
|
|
|
|
Trigger a rebuild at any time without pushing code:
|
|
|
|
```bash
|
|
curl -X POST http://localhost:3000/api/webhook
|
|
```
|
|
|
|
## Failure Handling
|
|
|
|
- **Build fails**: temp files are cleaned up, the previous version keeps serving, error is logged and visible via `/api/status`
|
|
- **Clone fails**: same as above — old version stays live
|
|
- **Concurrent webhooks**: second request gets `409`, only one build runs at a time
|
|
- **Container restart**: serves the most recent release from `/app/releases/`, or triggers a fresh build if empty
|