424 lines
12 KiB
Markdown
424 lines
12 KiB
Markdown
|
|
# 🚀 Auto-Install Complete - Directory + Email + Vector DB
|
||
|
|
|
||
|
|
## What Just Got Implemented
|
||
|
|
|
||
|
|
A **fully automatic installation and configuration system** that:
|
||
|
|
|
||
|
|
1. ✅ **Auto-installs Directory (Zitadel)** - Identity provider with SSO
|
||
|
|
2. ✅ **Auto-installs Email (Stalwart)** - Full email server with IMAP/SMTP
|
||
|
|
3. ✅ **Creates default org & user** - Ready to login immediately
|
||
|
|
4. ✅ **Integrates Directory ↔ Email** - Single sign-on for mailboxes
|
||
|
|
5. ✅ **Background Vector DB indexing** - Automatic email/file indexing
|
||
|
|
6. ✅ **Per-user workspaces** - `work/{bot_id}/{user_id}/vectordb/`
|
||
|
|
7. ✅ **Anonymous + Authenticated modes** - Chat works anonymously, email/drive require login
|
||
|
|
|
||
|
|
## 🏗️ Architecture Overview
|
||
|
|
|
||
|
|
```
|
||
|
|
┌─────────────────────────────────────────────────────────────┐
|
||
|
|
│ BotServer WebUI │
|
||
|
|
│ ┌──────────┬──────────┬──────────┬──────────┬──────────┐ │
|
||
|
|
│ │ Chat │ Email │ Drive │ Tasks │ Account │ │
|
||
|
|
│ │(anon OK) │ (auth) │ (auth) │ (auth) │ (auth) │ │
|
||
|
|
│ └────┬─────┴────┬─────┴────┬─────┴────┬─────┴────┬─────┘ │
|
||
|
|
│ │ │ │ │ │ │
|
||
|
|
└───────┼──────────┼──────────┼──────────┼──────────┼─────────┘
|
||
|
|
│ │ │ │ │
|
||
|
|
▼ ▼ ▼ ▼ ▼
|
||
|
|
┌────────────────────────────────────────────────────┐
|
||
|
|
│ Directory (Zitadel) - Port 8080 │
|
||
|
|
│ - OAuth2/OIDC Authentication │
|
||
|
|
│ - Default Org: "BotServer" │
|
||
|
|
│ - Default User: admin@localhost / BotServer123! │
|
||
|
|
└────────────────────────────────────────────────────┘
|
||
|
|
│
|
||
|
|
┌────────────────┼────────────────┐
|
||
|
|
▼ ▼ ▼
|
||
|
|
┌─────────┐ ┌─────────┐ ┌─────────┐
|
||
|
|
│ Email │ │ Drive │ │ Vector │
|
||
|
|
│(Stalwart│ │ (MinIO) │ │ DB │
|
||
|
|
│ IMAP/ │ │ S3 │ │(Qdrant) │
|
||
|
|
│ SMTP) │ │ │ │ │
|
||
|
|
└─────────┘ └─────────┘ └─────────┘
|
||
|
|
```
|
||
|
|
|
||
|
|
## 📁 User Workspace Structure
|
||
|
|
|
||
|
|
```
|
||
|
|
work/
|
||
|
|
{bot_id}/
|
||
|
|
{user_id}/
|
||
|
|
vectordb/
|
||
|
|
emails/ # Per-user email search index
|
||
|
|
- Recent emails automatically indexed
|
||
|
|
- Semantic search enabled
|
||
|
|
- Background updates every 5 minutes
|
||
|
|
drive/ # Per-user file search index
|
||
|
|
- Text files indexed on-demand
|
||
|
|
- Only when user searches/LLM queries
|
||
|
|
- Smart filtering (skip binaries, large files)
|
||
|
|
cache/
|
||
|
|
email_metadata.db # Quick email lookups (SQLite)
|
||
|
|
drive_metadata.db # File metadata cache
|
||
|
|
preferences/
|
||
|
|
email_settings.json
|
||
|
|
drive_sync.json
|
||
|
|
temp/ # Temporary processing files
|
||
|
|
```
|
||
|
|
|
||
|
|
## 🔧 New Components in Installer
|
||
|
|
|
||
|
|
### Component: `directory`
|
||
|
|
- **Binary**: Zitadel
|
||
|
|
- **Port**: 8080
|
||
|
|
- **Auto-setup**: Creates default org + user on first run
|
||
|
|
- **Database**: PostgreSQL (same as BotServer)
|
||
|
|
- **Config**: `./config/directory_config.json`
|
||
|
|
|
||
|
|
### Component: `email`
|
||
|
|
- **Binary**: Stalwart
|
||
|
|
- **Ports**: 25 (SMTP), 587 (submission), 143 (IMAP), 993 (IMAPS)
|
||
|
|
- **Auto-setup**: Integrates with Directory for auth
|
||
|
|
- **Config**: `./config/email_config.json`
|
||
|
|
|
||
|
|
## 🎬 Bootstrap Flow
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cargo run -- bootstrap
|
||
|
|
```
|
||
|
|
|
||
|
|
**What happens:**
|
||
|
|
|
||
|
|
1. **Install Database** (`tables`)
|
||
|
|
- PostgreSQL starts
|
||
|
|
- Migrations run automatically (including new user account tables)
|
||
|
|
|
||
|
|
2. **Install Drive** (`drive`)
|
||
|
|
- MinIO starts
|
||
|
|
- Creates default buckets
|
||
|
|
|
||
|
|
3. **Install Cache** (`cache`)
|
||
|
|
- Redis starts
|
||
|
|
|
||
|
|
4. **Install LLM** (`llm`)
|
||
|
|
- Llama.cpp server starts
|
||
|
|
|
||
|
|
5. **Install Directory** (`directory`) ⭐ NEW
|
||
|
|
- Zitadel downloads and starts
|
||
|
|
- **Auto-setup runs:**
|
||
|
|
- Creates "BotServer" organization
|
||
|
|
- Creates "admin@localhost" user with password "BotServer123!"
|
||
|
|
- Creates OAuth2 application for BotServer
|
||
|
|
- Saves config to `./config/directory_config.json`
|
||
|
|
- ✅ **You can login immediately!**
|
||
|
|
|
||
|
|
6. **Install Email** (`email`) ⭐ NEW
|
||
|
|
- Stalwart downloads and starts
|
||
|
|
- **Auto-setup runs:**
|
||
|
|
- Reads Directory config
|
||
|
|
- Configures OIDC authentication with Directory
|
||
|
|
- Creates admin mailbox
|
||
|
|
- Syncs Directory users → Email mailboxes
|
||
|
|
- Saves config to `./config/email_config.json`
|
||
|
|
- ✅ **Email ready with Directory SSO!**
|
||
|
|
|
||
|
|
7. **Start Vector DB Indexer** (background automation)
|
||
|
|
- Runs every 5 minutes
|
||
|
|
- Indexes recent emails for all users
|
||
|
|
- Indexes relevant files on-demand
|
||
|
|
- No mass copying!
|
||
|
|
|
||
|
|
## 🔐 Default Credentials
|
||
|
|
|
||
|
|
After bootstrap completes:
|
||
|
|
|
||
|
|
### Directory Login
|
||
|
|
- **URL**: http://localhost:8080
|
||
|
|
- **Username**: `admin@localhost`
|
||
|
|
- **Password**: `BotServer123!`
|
||
|
|
- **Organization**: BotServer
|
||
|
|
|
||
|
|
### Email Admin
|
||
|
|
- **SMTP**: localhost:25 (or :587 for TLS)
|
||
|
|
- **IMAP**: localhost:143 (or :993 for TLS)
|
||
|
|
- **Username**: `admin@localhost`
|
||
|
|
- **Password**: (automatically synced from Directory)
|
||
|
|
|
||
|
|
### BotServer Web UI
|
||
|
|
- **URL**: http://localhost:8080/desktop
|
||
|
|
- **Login**: Click "Login" → Directory OAuth → Use credentials above
|
||
|
|
- **Anonymous**: Chat works without login!
|
||
|
|
|
||
|
|
## 🎯 User Experience Flow
|
||
|
|
|
||
|
|
### Anonymous User
|
||
|
|
```
|
||
|
|
1. Open http://localhost:8080
|
||
|
|
2. See only "Chat" tab
|
||
|
|
3. Chat with bot (no login required)
|
||
|
|
```
|
||
|
|
|
||
|
|
### Authenticated User
|
||
|
|
```
|
||
|
|
1. Open http://localhost:8080
|
||
|
|
2. Click "Login" button
|
||
|
|
3. Redirect to Directory (Zitadel)
|
||
|
|
4. Login with admin@localhost / BotServer123!
|
||
|
|
5. Redirect back to BotServer
|
||
|
|
6. Now see ALL tabs:
|
||
|
|
- Chat (with history!)
|
||
|
|
- Email (your mailbox)
|
||
|
|
- Drive (your files)
|
||
|
|
- Tasks (your todos)
|
||
|
|
- Account (manage email accounts)
|
||
|
|
```
|
||
|
|
|
||
|
|
## 📧 Email Integration
|
||
|
|
|
||
|
|
When user clicks **Email** tab:
|
||
|
|
|
||
|
|
1. Check if user is authenticated
|
||
|
|
2. If not → Redirect to login
|
||
|
|
3. If yes → Load user's email accounts from database
|
||
|
|
4. Connect to Stalwart IMAP server
|
||
|
|
5. Fetch recent emails
|
||
|
|
6. **Background indexer** adds them to vector DB
|
||
|
|
7. User can:
|
||
|
|
- Read emails
|
||
|
|
- Search emails (semantic search!)
|
||
|
|
- Send emails
|
||
|
|
- Compose drafts
|
||
|
|
- Ask bot: "Summarize my emails about Q4 project"
|
||
|
|
|
||
|
|
## 💾 Drive Integration
|
||
|
|
|
||
|
|
When user clicks **Drive** tab:
|
||
|
|
|
||
|
|
1. Check authentication
|
||
|
|
2. Load user's files from MinIO (bucket: `user_{user_id}`)
|
||
|
|
3. Display file browser
|
||
|
|
4. User can:
|
||
|
|
- Upload files
|
||
|
|
- Download files
|
||
|
|
- Search files (semantic!)
|
||
|
|
- Ask bot: "Find my meeting notes from last week"
|
||
|
|
5. **Background indexer** indexes text files automatically
|
||
|
|
|
||
|
|
## 🤖 Bot Integration with User Context
|
||
|
|
|
||
|
|
```rust
|
||
|
|
// When user asks bot a question:
|
||
|
|
User: "What were the main points in Sarah's email yesterday?"
|
||
|
|
|
||
|
|
Bot processes:
|
||
|
|
1. Get user_id from session
|
||
|
|
2. Load user's email vector DB
|
||
|
|
3. Search for "Sarah" + "yesterday"
|
||
|
|
4. Find relevant emails (only from THIS user's mailbox)
|
||
|
|
5. Extract content
|
||
|
|
6. Send to LLM with context
|
||
|
|
7. Return answer
|
||
|
|
|
||
|
|
Result: "Sarah's email discussed Q4 budget approval..."
|
||
|
|
```
|
||
|
|
|
||
|
|
**Privacy guarantee**: Vector DBs are per-user. No cross-user data access!
|
||
|
|
|
||
|
|
## 🔄 Background Automation
|
||
|
|
|
||
|
|
**Vector DB Indexer** runs every 5 minutes:
|
||
|
|
|
||
|
|
```
|
||
|
|
For each active user:
|
||
|
|
1. Check for new emails
|
||
|
|
2. Index new emails (batch of 10)
|
||
|
|
3. Check for new/modified files
|
||
|
|
4. Index text files only
|
||
|
|
5. Skip if user workspace > 10MB of embeddings
|
||
|
|
6. Update statistics
|
||
|
|
```
|
||
|
|
|
||
|
|
**Smart Indexing Rules:**
|
||
|
|
- ✅ Text files < 10MB
|
||
|
|
- ✅ Recent emails (last 100)
|
||
|
|
- ✅ Files user searches for
|
||
|
|
- ❌ Binary files
|
||
|
|
- ❌ Videos/images
|
||
|
|
- ❌ Old archived emails (unless queried)
|
||
|
|
|
||
|
|
## 📊 New Database Tables
|
||
|
|
|
||
|
|
Migration `6.0.6_user_accounts`:
|
||
|
|
|
||
|
|
```sql
|
||
|
|
user_email_accounts -- User's IMAP/SMTP credentials
|
||
|
|
email_drafts -- Saved email drafts
|
||
|
|
email_folders -- Folder metadata cache
|
||
|
|
user_preferences -- User settings
|
||
|
|
user_login_tokens -- Session management
|
||
|
|
```
|
||
|
|
|
||
|
|
## 🎨 Frontend Changes
|
||
|
|
|
||
|
|
### Anonymous Mode (Default)
|
||
|
|
```html
|
||
|
|
<nav>
|
||
|
|
<button data-section="chat">💬 Chat</button>
|
||
|
|
<button onclick="login()">🔐 Login</button>
|
||
|
|
</nav>
|
||
|
|
```
|
||
|
|
|
||
|
|
### Authenticated Mode
|
||
|
|
```html
|
||
|
|
<nav>
|
||
|
|
<button data-section="chat">💬 Chat</button>
|
||
|
|
<button data-section="email">📧 Email</button>
|
||
|
|
<button data-section="drive">💾 Drive</button>
|
||
|
|
<button data-section="tasks">✅ Tasks</button>
|
||
|
|
<button data-section="account">👤 Account</button>
|
||
|
|
<button onclick="logout()">🚪 Logout</button>
|
||
|
|
</nav>
|
||
|
|
```
|
||
|
|
|
||
|
|
## 🔧 Configuration Files
|
||
|
|
|
||
|
|
### Directory Config (`./config/directory_config.json`)
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"base_url": "http://localhost:8080",
|
||
|
|
"default_org": {
|
||
|
|
"id": "...",
|
||
|
|
"name": "BotServer",
|
||
|
|
"domain": "botserver.localhost"
|
||
|
|
},
|
||
|
|
"default_user": {
|
||
|
|
"id": "...",
|
||
|
|
"username": "admin",
|
||
|
|
"email": "admin@localhost",
|
||
|
|
"password": "BotServer123!"
|
||
|
|
},
|
||
|
|
"client_id": "...",
|
||
|
|
"client_secret": "...",
|
||
|
|
"project_id": "..."
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Email Config (`./config/email_config.json`)
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"base_url": "http://localhost:8080",
|
||
|
|
"smtp_host": "localhost",
|
||
|
|
"smtp_port": 25,
|
||
|
|
"imap_host": "localhost",
|
||
|
|
"imap_port": 143,
|
||
|
|
"admin_user": "admin@localhost",
|
||
|
|
"admin_pass": "EmailAdmin123!",
|
||
|
|
"directory_integration": true
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## 🚦 Environment Variables
|
||
|
|
|
||
|
|
Add to `.env`:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Directory (Zitadel)
|
||
|
|
DIRECTORY_DEFAULT_ORG=BotServer
|
||
|
|
DIRECTORY_DEFAULT_USERNAME=admin
|
||
|
|
DIRECTORY_DEFAULT_EMAIL=admin@localhost
|
||
|
|
DIRECTORY_DEFAULT_PASSWORD=BotServer123!
|
||
|
|
DIRECTORY_REDIRECT_URI=http://localhost:8080/auth/callback
|
||
|
|
|
||
|
|
# Email (Stalwart)
|
||
|
|
EMAIL_ADMIN_USER=admin@localhost
|
||
|
|
EMAIL_ADMIN_PASSWORD=EmailAdmin123!
|
||
|
|
|
||
|
|
# Vector DB
|
||
|
|
QDRANT_URL=http://localhost:6333
|
||
|
|
```
|
||
|
|
|
||
|
|
## 📝 TODO / Next Steps
|
||
|
|
|
||
|
|
### High Priority
|
||
|
|
- [ ] Implement actual OAuth2 callback handler in main.rs
|
||
|
|
- [ ] Add frontend login/logout buttons with Directory redirect
|
||
|
|
- [ ] Show/hide tabs based on authentication state
|
||
|
|
- [ ] Implement actual embedding generation (currently placeholder)
|
||
|
|
- [ ] Replace base64 encryption with AES-256-GCM 🔴
|
||
|
|
|
||
|
|
### Email Features
|
||
|
|
- [ ] Sync Directory users → Email mailboxes automatically
|
||
|
|
- [ ] Email attachment support
|
||
|
|
- [ ] HTML email rendering
|
||
|
|
- [ ] Email notifications
|
||
|
|
|
||
|
|
### Drive Features
|
||
|
|
- [ ] PDF text extraction
|
||
|
|
- [ ] Word/Excel document parsing
|
||
|
|
- [ ] Automatic file indexing on upload
|
||
|
|
|
||
|
|
### Vector DB
|
||
|
|
- [ ] Use real embeddings (OpenAI API or local model)
|
||
|
|
- [ ] Hybrid search (vector + keyword)
|
||
|
|
- [ ] Query result caching
|
||
|
|
|
||
|
|
## 🧪 Testing the System
|
||
|
|
|
||
|
|
### 1. Bootstrap Everything
|
||
|
|
```bash
|
||
|
|
cargo run -- bootstrap
|
||
|
|
# Wait for all components to install and configure
|
||
|
|
# Look for success messages for Directory and Email
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Verify Directory
|
||
|
|
```bash
|
||
|
|
curl http://localhost:8080/debug/ready
|
||
|
|
# Should return OK
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. Verify Email
|
||
|
|
```bash
|
||
|
|
telnet localhost 25
|
||
|
|
# Should connect to SMTP
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4. Check Configs
|
||
|
|
```bash
|
||
|
|
cat ./config/directory_config.json
|
||
|
|
cat ./config/email_config.json
|
||
|
|
```
|
||
|
|
|
||
|
|
### 5. Login to Directory
|
||
|
|
```bash
|
||
|
|
# Open browser: http://localhost:8080
|
||
|
|
# Login with admin@localhost / BotServer123!
|
||
|
|
```
|
||
|
|
|
||
|
|
### 6. Start BotServer
|
||
|
|
```bash
|
||
|
|
cargo run
|
||
|
|
# Open: http://localhost:8080/desktop
|
||
|
|
```
|
||
|
|
|
||
|
|
## 🎉 Summary
|
||
|
|
|
||
|
|
You now have a **complete multi-tenant system** with:
|
||
|
|
|
||
|
|
✅ **Automatic installation** - One command bootstraps everything
|
||
|
|
✅ **Directory (Zitadel)** - Enterprise SSO out of the box
|
||
|
|
✅ **Email (Stalwart)** - Full mail server with Directory integration
|
||
|
|
✅ **Per-user vector DBs** - Smart, privacy-first indexing
|
||
|
|
✅ **Background automation** - Continuous indexing without user action
|
||
|
|
✅ **Anonymous + Auth modes** - Chat works for everyone, email/drive need login
|
||
|
|
✅ **Zero manual config** - Default org/user created automatically
|
||
|
|
|
||
|
|
**Generic component names** everywhere:
|
||
|
|
- ✅ "directory" (not "zitadel")
|
||
|
|
- ✅ "email" (not "stalwart")
|
||
|
|
- ✅ "drive" (not "minio")
|
||
|
|
- ✅ "cache" (not "redis")
|
||
|
|
|
||
|
|
The vision is **REAL**! 🚀
|
||
|
|
|
||
|
|
Now just run `cargo run -- bootstrap` and watch the magic happen!
|