feat: add shared project deployment with Dokploy project-level variables
- Add SHARED_PROJECT_ID and SHARED_ENVIRONMENT_ID to all docker-compose files
- Use Dokploy's project-level variable syntax: ${{project.VARIABLE}}
- Deploy all user AI stacks to a single shared Dokploy project
- Update DOKPLOY_DEPLOYMENT.md with shared project configuration guide
- Add comprehensive SHARED_PROJECT_DEPLOYMENT.md architecture documentation
Benefits:
- Centralized management (all stacks in one project)
- Resource efficiency (no per-user project overhead)
- Simplified configuration (project-level shared vars)
- Better organization (500 apps in 1 project vs 500 projects)
How it works:
1. Portal reads SHARED_PROJECT_ID from environment
2. Docker-compose uses ${{project.SHARED_PROJECT_ID}} to reference project-level vars
3. Dokploy resolves these at runtime
4. Portal deploys user stacks as applications within the shared project
Fallback: If variables not set, falls back to legacy behavior (separate project per user)
This commit is contained in:
@@ -91,6 +91,75 @@ main branch → git.app.flexinit.nl/oussamadouhou/ai-stack-deployer:latest
|
||||
|
||||
---
|
||||
|
||||
## Shared Project Configuration (IMPORTANT)
|
||||
|
||||
### What is Shared Project Deployment?
|
||||
|
||||
The portal deploys **all user AI stacks as applications within a single shared Dokploy project**, instead of creating a new project for each user. This provides:
|
||||
|
||||
- ✅ Better organization (all stacks in one place)
|
||||
- ✅ Shared environment variables
|
||||
- ✅ Centralized monitoring
|
||||
- ✅ Easier management
|
||||
|
||||
### How It Works
|
||||
|
||||
```
|
||||
Dokploy Project: ai-stack-portal
|
||||
├── Environment: deployments
|
||||
│ ├── Application: john-dev
|
||||
│ ├── Application: jane-prod
|
||||
│ └── Application: alice-test
|
||||
```
|
||||
|
||||
### Setting Up the Shared Project
|
||||
|
||||
**Step 1: Create the Shared Project in Dokploy**
|
||||
|
||||
1. In Dokploy UI, create a new project:
|
||||
- Name: `ai-stack-portal` (or any name you prefer)
|
||||
- Description: "Shared project for all user AI stacks"
|
||||
|
||||
2. Note the **Project ID** (visible in URL or API response)
|
||||
- Example: `2y2Glhz5Wy0dBNf6BOR_-`
|
||||
|
||||
3. Get the **Environment ID**:
|
||||
```bash
|
||||
curl -s "http://10.100.0.20:3000/api/project.one?projectId=2y2Glhz5Wy0dBNf6BOR_-" \
|
||||
-H "Authorization: Bearer $DOKPLOY_API_TOKEN" | jq -r '.environments[0].id'
|
||||
```
|
||||
- Example: `RqE9OFMdLwkzN7pif1xN8`
|
||||
|
||||
**Step 2: Configure Project-Level Variables**
|
||||
|
||||
In the shared project (`ai-stack-portal`), add these **project-level environment variables**:
|
||||
|
||||
| Variable Name | Value | Purpose |
|
||||
|---------------|-------|---------|
|
||||
| `SHARED_PROJECT_ID` | `2y2Glhz5Wy0dBNf6BOR_-` | The project where user stacks deploy |
|
||||
| `SHARED_ENVIRONMENT_ID` | `RqE9OFMdLwkzN7pif1xN8` | The environment within that project |
|
||||
|
||||
**Step 3: Reference Variables in Portal Applications**
|
||||
|
||||
The portal's docker-compose files use Dokploy's variable syntax to reference these:
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- SHARED_PROJECT_ID=${{project.SHARED_PROJECT_ID}}
|
||||
- SHARED_ENVIRONMENT_ID=${{project.SHARED_ENVIRONMENT_ID}}
|
||||
```
|
||||
|
||||
**This syntax `${{project.VARIABLE}}` tells Dokploy**: "Get this value from the project-level environment variables"
|
||||
|
||||
### Important Notes
|
||||
|
||||
- ⚠️ **Both variables MUST be set** in the shared project for deployment to work
|
||||
- ⚠️ If not set, portal will fall back to creating separate projects per user (legacy behavior)
|
||||
- ✅ You can have different shared projects for dev/staging/prod environments
|
||||
- ✅ All 3 portal deployments (dev/staging/prod) should point to their respective shared projects
|
||||
|
||||
---
|
||||
|
||||
## Setting Up Dokploy
|
||||
|
||||
### Step 1: Create Dev Application
|
||||
@@ -107,12 +176,28 @@ main branch → git.app.flexinit.nl/oussamadouhou/ai-stack-deployer:latest
|
||||
- Enable SSL (via Traefik wildcard cert)
|
||||
|
||||
3. **Set Environment Variables**:
|
||||
|
||||
**Important**: The portal application should be deployed **inside the shared project** (e.g., `ai-stack-portal-dev`).
|
||||
|
||||
Then set these **project-level variables** in that shared project:
|
||||
```env
|
||||
SHARED_PROJECT_ID=<your-shared-project-id>
|
||||
SHARED_ENVIRONMENT_ID=<your-shared-environment-id>
|
||||
```
|
||||
|
||||
And these **application-level variables** in the portal app:
|
||||
```env
|
||||
DOKPLOY_URL=http://10.100.0.20:3000
|
||||
DOKPLOY_API_TOKEN=<your-token>
|
||||
STACK_DOMAIN_SUFFIX=ai.flexinit.nl
|
||||
STACK_IMAGE=git.app.flexinit.nl/flexinit/agent-stack:latest
|
||||
```
|
||||
|
||||
The docker-compose file will automatically reference the project-level variables using:
|
||||
```yaml
|
||||
SHARED_PROJECT_ID=${{project.SHARED_PROJECT_ID}}
|
||||
SHARED_ENVIRONMENT_ID=${{project.SHARED_ENVIRONMENT_ID}}
|
||||
```
|
||||
|
||||
4. **Configure Webhook**:
|
||||
- Event: **Push**
|
||||
|
||||
Reference in New Issue
Block a user