Automate LobeChat deployment with Ansible. This playbook deploys LobeChat with Docker, including optional PostgreSQL database for multi-user mode.
Create lobechat-deploy.yml:
---
- name: Deploy LobeChat
hosts: all
become: true
vars:
lobechat_version: "latest"
lobechat_port: 3210
lobechat_openai_key: "sk-your-key"
lobechat_db_enabled: true
lobechat_db_password: "secure-password"
lobechat_secret_key: "your-secret-key"
tasks:
- name: Create LobeChat directory
file:
path: /opt/lobechat
state: directory
mode: '0755'
- name: Create Docker Compose file
copy:
dest: /opt/lobechat/docker-compose.yml
content: |
version: '3.8'
services:
lobe-chat:
image: lobehub/lobe-chat:{{ lobechat_version }}
container_name: lobe-chat
ports:
- "{{ lobechat_port }}:3210"
environment:
- OPENAI_API_KEY={{ lobechat_openai_key }}
{% if lobechat_db_enabled %}
- DATABASE_URL=postgresql://lobechat:{{ lobechat_db_password }}@db:5432/lobechat
- KEY_VAULTS_SECRET={{ lobechat_secret_key }}
{% endif %}
depends_on:
{% if lobechat_db_enabled %}
db:
condition: service_healthy
{% endif %}
restart: unless-stopped
volumes:
- lobe-chat-data:/app/data
{% if lobechat_db_enabled %}
db:
image: postgres:15-alpine
container_name: lobe-chat-db
environment:
POSTGRES_USER: lobechat
POSTGRES_PASSWORD: {{ lobechat_db_password }}
POSTGRES_DB: lobechat
volumes:
- lobe-chat-db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U lobechat"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
volumes:
lobe-chat-data:
lobe-chat-db-data:
mode: '0644'
- name: Start LobeChat with Docker Compose
shell: |
cd /opt/lobechat
docker compose up -d
args:
creates: /opt/lobechat/.deployed
- name: Mark deployment as complete
file:
path: /opt/lobechat/.deployed
state: touch
Create inventory.ini:
[lobechat_servers]
your-server-ip ansible_user=root ansible_ssh_private_key_file=~/.ssh/id_rsa
ansible-playbook -i inventory.ini lobechat-deploy.yml
---
- name: Deploy LobeChat with HTTPS
hosts: all
become: true
vars:
lobechat_domain: "chat.example.com"
lobechat_email: "admin@example.com"
lobechat_openai_key: "sk-your-key"
lobechat_db_password: "secure-password"
lobechat_secret_key: "your-secret-key"
tasks:
- name: Create LobeChat directory
file:
path: /opt/lobechat
state: directory
- name: Create Docker Compose file with Traefik
copy:
dest: /opt/lobechat/docker-compose.yml
content: |
version: '3.8'
services:
traefik:
image: traefik:v2.10
container_name: traefik
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik.yml:/etc/traefik/traefik.yml
- ./acme:/acme
restart: unless-stopped
lobe-chat:
image: lobehub/lobe-chat:latest
container_name: lobe-chat
environment:
- OPENAI_API_KEY={{ lobechat_openai_key }}
- DATABASE_URL=postgresql://lobechat:{{ lobechat_db_password }}@db:5432/lobechat
- KEY_VAULTS_SECRET={{ lobechat_secret_key }}
labels:
- "traefik.enable=true"
- "traefik.http.routers.lobechat.rule=Host(`{{ lobechat_domain }}`)"
- "traefik.http.routers.lobechat.entrypoints=websecure"
- "traefik.http.routers.lobechat.tls.certresolver=myresolver"
depends_on:
db:
condition: service_healthy
restart: unless-stopped
db:
image: postgres:15-alpine
container_name: lobe-chat-db
environment:
POSTGRES_USER: lobechat
POSTGRES_PASSWORD: {{ lobechat_db_password }}
POSTGRES_DB: lobechat
volumes:
- lobe-chat-db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U lobechat"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
volumes:
lobe-chat-db-data:
mode: '0644'
- name: Create Traefik configuration
copy:
dest: /opt/lobechat/traefik.yml
content: |
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
certificatesResolvers:
myresolver:
acme:
email: {{ lobechat_email }}
storage: /acme/acme.json
httpChallenge:
entryPoint: web
mode: '0644'
- name: Create ACME directory
file:
path: /opt/lobechat/acme
state: directory
mode: '0600'
- name: Start LobeChat
shell: |
cd /opt/lobechat
docker compose up -d
---
- name: Deploy LobeChat to multiple servers
hosts: lobechat_servers
become: true
vars:
lobechat_servers_config:
- name: server1
domain: "chat1.example.com"
port: 3210
- name: server2
domain: "chat2.example.com"
port: 3211
tasks:
- name: Deploy to each server
include_tasks: lobechat-deploy-task.yml
loop: "{{ lobechat_servers_config }}"
loop_control:
loop_var: server_config
| Variable | Default | Description |
|---|---|---|
lobechat_version |
latest |
LobeChat Docker image version |
lobechat_port |
3210 |
Port to expose LobeChat |
lobechat_openai_key |
- |
OpenAI API key (required) |
lobechat_db_enabled |
true |
Enable PostgreSQL database |
lobechat_db_password |
- |
Database password |
lobechat_secret_key |
- |
Encryption key for sensitive data |
lobechat_domain |
- |
Custom domain for HTTPS |
lobechat_email |
- |
Email for Let’s Encrypt |
After deployment, verify the installation:
# Check container status
docker ps | grep lobe-chat
# View logs
docker logs lobe-chat
# Test connection
curl http://localhost:3210
Access LobeChat at http://your-server-ip:3210.
ansible-playbook -i inventory.ini lobechat-deploy.yml --extra-vars "lobechat_version=latest"
# SSH to server
ssh root@your-server-ip
# Check containers
docker compose ps
# View logs
docker compose logs -f lobe-chat
Database connection errors:
# Check database is running
docker compose ps db
# Test connection
docker compose exec db pg_isready -U lobechat
Permission errors:
# Fix directory permissions
chmod -R 755 /opt/lobechat
Any questions?
Feel free to contact us. Find all contact information on our contact page.