feat: Add server dependencies and initial application components.
All checks were successful
Build and Release / build-and-release (push) Successful in 15m24s

This commit is contained in:
Bryan1029384756
2026-02-21 15:06:36 -06:00
parent cbda60757c
commit 84aa458012
17 changed files with 1288 additions and 12 deletions

123
deploy/README.md Normal file
View File

@@ -0,0 +1,123 @@
# 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