# Managing Multiple Bot Configs Efficiently

Yes, with Docker you'll need to manage multiple config files, but here are strategies to make it easier:

## The Challenge

When you have 3 bots, you have 3 config files:
- `~/.nanobot-user1/config.json`
- `~/.nanobot-user2/config.json`
- `~/.nanobot-user3/config.json`

If you need to change something like:
- API key (shared across all bots)
- Model settings (might be shared)
- Tool configurations (might be shared)

You'd normally need to edit all 3 files.

## Solution 1: Use Environment Variables for Shared Settings

Nanobot supports environment variables! You can set shared settings via environment variables in Docker.

### Update docker-compose.multi.yml

```yaml
services:
  nanobot-user1:
    # ... existing config ...
    environment:
      # Shared settings - set once, applies to all
      NANOBOT_PROVIDERS__OPENROUTER__API_KEY: "sk-or-v1-xxx"
      NANOBOT_AGENTS__DEFAULTS__MODEL: "anthropic/claude-opus-4-5"
      NANOBOT_AGENTS__DEFAULTS__TEMPERATURE: "0.7"
      # Bot-specific settings still in config.json
    volumes:
      - ~/.nanobot-user1:/root/.nanobot

  nanobot-user2:
    # ... same environment variables ...
    environment:
      NANOBOT_PROVIDERS__OPENROUTER__API_KEY: "sk-or-v1-xxx"
      NANOBOT_AGENTS__DEFAULTS__MODEL: "anthropic/claude-opus-4-5"
      NANOBOT_AGENTS__DEFAULTS__TEMPERATURE: "0.7"
    volumes:
      - ~/.nanobot-user2:/root/.nanobot
```

**Better yet**, use a shared `.env` file:

### Create `.env.shared`:

```bash
# Shared settings for all bots
NANOBOT_PROVIDERS__OPENROUTER__API_KEY=sk-or-v1-xxx
NANOBOT_AGENTS__DEFAULTS__MODEL=anthropic/claude-opus-4-5
NANOBOT_AGENTS__DEFAULTS__TEMPERATURE=0.7
NANOBOT_AGENTS__DEFAULTS__MAX_TOKENS=8192
```

### Update docker-compose.multi.yml:

```yaml
services:
  nanobot-user1:
    env_file:
      - .env.shared  # Load shared settings
    volumes:
      - ~/.nanobot-user1:/root/.nanobot
    # ... rest of config ...

  nanobot-user2:
    env_file:
      - .env.shared  # Same shared settings
    volumes:
      - ~/.nanobot-user2:/root/.nanobot
    # ... rest of config ...
```

Now you only update `.env.shared` for shared settings!

## Solution 2: Minimal Configs + Environment Variables

Keep only bot-specific settings in config files:

**`~/.nanobot-user1/config.json`** (minimal):
```json
{
  "channels": {
    "telegram": {
      "enabled": true,
      "token": "BOT_TOKEN_1",
      "allowFrom": ["USER_ID_1"]
    }
  }
}
```

**`~/.nanobot-user2/config.json`** (minimal):
```json
{
  "channels": {
    "telegram": {
      "enabled": true,
      "token": "BOT_TOKEN_2",
      "allowFrom": ["USER_ID_2"]
    }
  }
}
```

Everything else comes from `.env.shared`!

## Solution 3: Use the Update Script

I've created `update-multi-configs.sh` to batch-update configs:

```bash
# Update API key in all configs
./update-multi-configs.sh update-api-key openrouter "sk-or-v1-new-key"

# Update model in all configs
./update-multi-configs.sh update-model "anthropic/claude-opus-4-5"

# Update any setting
./update-multi-configs.sh update-setting "agents.defaults.temperature" "0.8"
```

Requires `jq` to be installed:
```bash
sudo apt install jq  # Linux
brew install jq       # macOS
```

## Solution 4: Base Config Template

Create a template and only override what's different:

**`~/.nanobot-base/config.json`** (template):
```json
{
  "providers": {
    "openrouter": {
      "apiKey": "sk-or-v1-xxx"
    }
  },
  "agents": {
    "defaults": {
      "model": "anthropic/claude-opus-4-5",
      "temperature": 0.7
    }
  },
  "channels": {
    "telegram": {
      "enabled": true,
      "token": "REPLACE_WITH_BOT_TOKEN",
      "allowFrom": ["REPLACE_WITH_USER_ID"]
    }
  }
}
```

Then create bot-specific configs by copying and modifying:

```bash
cp ~/.nanobot-base/config.json ~/.nanobot-user1/config.json
# Edit only the telegram token and user ID

cp ~/.nanobot-base/config.json ~/.nanobot-user2/config.json
# Edit only the telegram token and user ID
```

## Recommended Approach

**Use Solution 1 (Environment Variables)** - it's the cleanest:

1. Create `.env.shared` with all shared settings
2. Keep minimal configs with only bot-specific settings (Telegram tokens/user IDs)
3. Update `.env.shared` when you need to change shared settings
4. Restart containers to apply changes

This way:
- ✅ Shared settings: Update once in `.env.shared`
- ✅ Bot-specific settings: Only in each config.json
- ✅ Easy to manage and maintain

## Example: Complete Setup

**`.env.shared`**:
```bash
NANOBOT_PROVIDERS__OPENROUTER__API_KEY=sk-or-v1-xxx
NANOBOT_AGENTS__DEFAULTS__MODEL=anthropic/claude-opus-4-5
NANOBOT_AGENTS__DEFAULTS__TEMPERATURE=0.7
NANOBOT_AGENTS__DEFAULTS__MAX_TOKENS=8192
```

**`~/.nanobot-user1/config.json`**:
```json
{
  "channels": {
    "telegram": {
      "enabled": true,
      "token": "1234567890:ABC...",
      "allowFrom": ["123456789"]
    }
  }
}
```

**`docker-compose.multi.yml`**:
```yaml
services:
  nanobot-user1:
    env_file:
      - .env.shared
    volumes:
      - ~/.nanobot-user1:/root/.nanobot
    # ... rest ...
```

Now when you need to change the API key or model, just edit `.env.shared` and restart!


