File size: 5,964 Bytes
4b1daed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# AmaniQuery Render Deployment Guide

This guide details the steps to deploy the AmaniQuery monorepo components to [Render.com](https://render.com).

## Prerequisites

1. **GitHub Repository**: Ensure your code is pushed to a GitHub repository connected to Render.
2. **Docker**, **Node.js**, and **Go** knowledge.
3. **Render Account**: Created and ready.

## 1. Database & Infrastructure (Render Postgres & Redis)

Before deploying services, set up your managed data stores.

### PostgreSQL

- **Type**: PostgreSQL
- **Name**: `amaniquery-db`
- **Region**: Frankfurt (EU-Central) or nearest.
- **Environment**:
  - `POSTGRES_USER`: `amaniquery`
  - `POSTGRES_DB`: `amaniquery`
- **Internal Connection URL**: Copy this for use in service env vars.

### Redis

- **Type**: Redis
- **Name**: `amaniquery-redis`
- **Max Memory Policy**: `allkeys-lru`
- **Internal Connection URL**: Copy this (`redis://...`).

## 2. Backend Services (Docker Runtime)

Since AmaniQuery is a monorepo, using **Docker** as the Runtime is recommended for Go services to handle build context correctly (copying `go.mod` from root).

### Common Configuration for All Backend Services

- **Runtime**: Docker
- **Repository**: `your-repo/amaniquery`
- **Region**: Same as Database.

| Service Name | Dockerfile Path | Build Context Directory | Env Vars |
| :--- | :--- | :--- | :--- |
| `amaniquery-portal` | `services/portal/Dockerfile` | `.` (Root) | `SERVER_HTTP_PORT=8080`, `DB_HOST=...` |
| `amaniquery-ingestion`| `services/ingestion/Dockerfile`| `.` (Root) | `QDRANT_URL=...`, `RABBITMQ_URL=...` |
| `amaniquery-voice` | `services/voice/Dockerfile` | `.` (Root) | `OPENAI_API_KEY=...` |
| `amaniquery-files` | `services/files/Dockerfile` | `.` (Root) | `MINIO_ENDPOINT=...` |
| `amaniquery-notifications`| `services/notifications/Dockerfile.gateway` | `.` (Root) | `MAILTRAP_API_KEY=...` |

> [!TIP]
> **Root Directory Setting**: In Render, set "Root Directory" to `.` (default) so Docker builds have access to the full monorepo context.

## 3. Frontend Applications (Static Sites)

We will use the **Static Site** type for frontends, relying on the `Dockerfile` or Render's Native Node build.
*Recommendation*: Use **Static Site** with Node build command for faster deploys, or **Docker** if you need Nginx customization.

### Option A: Static Site (Native Node - Recommended)

- **Build Command**: `yarn && yarn turbo run build --filter=admin-portal`
- **Publish Directory**: `frontend/apps/admin/dist`
- **Root Directory**: `frontend`

### Option B: Docker (Using our new Turbo Dockerfiles)

- **Runtime**: Docker
- **Dockerfile Path**: `frontend/apps/admin/Dockerfile`
- **Context**: `frontend` (Important: context is `frontend` subfolder, not root, for these specific Dockerfiles)

| App Name | Build Command (Static) | Publish Dir | Context |
| :--- | :--- | :--- | :--- |
| `admin-portal` | `yarn build:admin` | `apps/admin/dist` | `frontend` |
| `developer-portal` | `yarn build:dev` | `apps/developer-portal/dist` | `frontend` |
| `web-app` | `yarn build:web` | `apps/web/dist` | `frontend` |

> *Note: You may need to add helper scripts in `frontend/package.json` like `"build:admin": "turbo run build --filter=admin-portal"` to keep commands simple.*

## 4. HuggingFace Spaces (Docker Deployment)

For users preferring HuggingFace Spaces (free tier: 2 vCPU, 16GB RAM, 50GB disk), follow these steps.

### Prerequisites

- HuggingFace Account
- External Databases (Managed Services):
  - **PostgreSQL**: Neon.tech (Free Tier available)
  - **Redis**: Upstash (Free Tier available)
  - **Qdrant**: Qdrant Cloud (Free Tier available)

### Deployment Steps

1. **Create a New Space**:
    - Go to [HuggingFace Spaces](https://huggingface.co/new-space)
    - Enter a name (e.g., `amaniquery`)
    - Select **Docker** as the Space SDK
    - Choose "Blank" for the template

2. **Deploy via Script (Recommended)**:
    - Set `HF_TOKEN` in your local `.env`.
    - Run: `python scripts/deploy_hf.py agent`
    - This deploys both the Go Agent and Rust Memory Service in a single container (Sidecar pattern) for maximum efficiency and localhost communication.

3. **Deploy Manually (Alternative)**:
    - Clone your Space's repository locally.
    - Copy `deployments/huggingface/Dockerfile.hf` to `Dockerfile` in the root.
    - Copy `deployments/huggingface/README.md` to the root.
    - Push to HuggingFace.

4. **Configure Secrets**:
    - Go to **Settings** -> **Variables and Secrets** in your Space.
    - Add the secrets listed in `deployments/huggingface/.env.hf.example`.

5. **Status**:
    - The Space will build and start both `agent-server` and `memory-server`.
    - The Go agent will automatically connect to the local memory service.

6. **Automated Deployment (Optional)**:
   We provided a script `scripts/deploy_hf.py` to automate the deployment process.

   **Prerequisites**:
   - `HF_TOKEN` must be set in your `.env` file (Get it from [HF Settings](https://huggingface.co/settings/tokens)).
   - The Spaces must be created first (e.g., `AmaniQuery/amaniquery-agent` and `AmaniQuery/amaniquery-memory`).

   **Usage**:

   ```bash
   # Deploy Agent
   python scripts/deploy_hf.py agent
   
   # Deploy Memory Service
   python scripts/deploy_hf.py memory
   
   # Deploy Both
   python scripts/deploy_hf.py all
   ```

## 5. Environment Variables Checklist

Transfer these from your `env.example` files to Render's "Environment" tab for each service.

- [ ] **Portal**: `DB_HOST`, `DB_PORT`, `DB_USER`, `DB_PASSWORD`, `DB_NAME`, `REDIS_URL`, `JWT_SECRET`
- [ ] **Voice**: `OPENAI_API_KEY`, `ELEVENLABS_API_KEY`, `REDIS_URL`
- [ ] **Frontend**: `VITE_API_BASE_URL` (Set this to the `https://...onrender.com` URL of your Portal service).

## 6. Deployment Order

1. **Infrastructure** (Postgres/Redis) - Wait for healthy.
2. **Backend Services** (Portal, etc.) - Deploy & check logs.
3. **Frontend Apps** - Deploy & update `VITE_API_BASE_URL` with backend URL.