# Deployment Options
OllamaFlow supports multiple deployment methods to fit different infrastructure requirements and preferences. Choose the option that best suits your environment.
## Docker Deployment
Docker deployment is the recommended approach for most users, providing consistent runtime environments and simplified management.
### Single Container
The simplest deployment runs OllamaFlow as a single container:
```bash
# Basic deployment with persistent data
docker run -d \
--name ollamaflow \
--restart unless-stopped \
-p 43411:43411 \
-v /opt/ollamaflow/ollamaflow.json:/app/ollamaflow.json \
-v /opt/ollamaflow/ollamaflow.db:/app/ollamaflow.db \
jchristn/ollamaflow:v1.1.0
```
### Docker Compose
For complex deployments, use Docker Compose:
```yaml
# docker-compose.yml
version: '3.8'
services:
ollamaflow:
image: jchristn/ollamaflow:v1.1.0
container_name: ollamaflow
restart: unless-stopped
ports:
- "43411:43411"
volumes:
- ./ollamaflow.json:/app/ollamaflow.json:ro
- ./ollamaflow.db:/app/ollamaflow.db
- ./logs/:/app/logs/
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:43411/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
```
Deploy with:
```bash
# Start the deployment
docker-compose up -d
# View logs
docker-compose logs -f ollamaflow
# Stop the deployment
docker-compose down
```
```bash
# Download the latest release (replace with actual release URL)
wget https://github.com/jchristn/ollamaflow/releases/latest/download/ollamaflow-linux-x64.tar.gz
# Extract
tar -xzf ollamaflow-linux-x64.tar.gz
# Move to installation directory
sudo mv ollamaflow /opt/
# Create user and set permissions
sudo useradd -r -s /bin/false ollamaflow
sudo chown -R ollamaflow:ollamaflow /opt/ollamaflow
sudo chmod +x /opt/ollamaflow/OllamaFlow.Server
```
## Source Code Deployment
Deploy from source for development or customization.
### Prerequisites
* .NET 8.0 SDK
* Git
### Build and Deploy
```bash
# Clone repository
git clone https://github.com/ollamaflow/ollamaflow.git
cd ollamaflow
# Build release version
dotnet build src/OllamaFlow.sln -c Release
# Publish self-contained application
dotnet publish src/OllamaFlow.Server -c Release -r linux-x64 --self-contained
# Deploy binaries
sudo cp -r src/OllamaFlow.Server/bin/Release/net8.0/linux-x64/publish /opt/ollamaflow
sudo chown -R ollamaflow:ollamaflow /opt/ollamaflow
```
### Development Mode
For development environments:
```bash
cd src/OllamaFlow.Server
dotnet run
```
## Kubernetes Deployment
Deploy OllamaFlow in Kubernetes environments.
### Basic Deployment
```yaml
# ollamaflow-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ollamaflow
labels:
app: ollamaflow
spec:
replicas: 2
selector:
matchLabels:
app: ollamaflow
template:
metadata:
labels:
app: ollamaflow
spec:
containers:
- name: ollamaflow
image: jchristn/ollamaflow:v1.1.0
ports:
- containerPort: 43411
env:
- name: ASPNETCORE_ENVIRONMENT
value: "Production"
volumeMounts:
- name: config
mountPath: /app/ollamaflow.json
subPath: ollamaflow.json
readOnly: true
- name: database
mountPath: /app/ollamaflow.db
subPath: ollamaflow.db
readOnly: false
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "1Gi"
cpu: "500m"
livenessProbe:
httpGet:
path: /
port: 43411
initialDelaySeconds: 30
periodSeconds: 30
readinessProbe:
httpGet:
path: /
port: 43411
initialDelaySeconds: 5
periodSeconds: 10
volumes:
- name: config
configMap:
name: ollamaflow-config
- name: data
persistentVolumeClaim:
claimName: ollamaflow-data
---
apiVersion: v1
kind: Service
metadata:
name: ollamaflow-service
spec:
selector:
app: ollamaflow
ports:
- protocol: TCP
port: 43411
targetPort: 43411
type: LoadBalancer
---
apiVersion: v1
kind: ConfigMap
metadata:
name: ollamaflow-config
data:
ollamaflow.json: |
{
"Webserver": {
"Hostname": "*",
"Port": 43411
},
"Logging": {
"ConsoleLogging": true,
"MinimumSeverity": "Info"
},
"AdminBearerTokens": [
"kubernetes-admin-token"
]
}
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ollamaflow-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
```
Deploy to Kubernetes:
```bash
# Apply the deployment
kubectl apply -f ollamaflow-deployment.yaml
# Check deployment status
kubectl get deployments
kubectl get pods
kubectl get services
# View logs
kubectl logs -l app=ollamaflow
```
## Load Balancer and Reverse Proxy
Configure external load balancers or reverse proxies.
### Nginx Configuration
```nginx
# /etc/nginx/sites-available/ollamaflow
upstream ollamaflow_backend {
server 127.0.0.1:43411 max_fails=3 fail_timeout=30s;
# Add more OllamaFlow instances for high availability
# server 127.0.0.1:43412 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name ai.yourcompany.com;
# Redirect HTTP to HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name ai.yourcompany.com;
# SSL configuration
ssl_certificate /etc/ssl/certs/yourcompany.crt;
ssl_certificate_key /etc/ssl/private/yourcompany.key;
# Proxy settings
location / {
proxy_pass http://ollamaflow_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Streaming support
proxy_buffering off;
proxy_cache off;
# Timeout settings
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 300s;
}
# Health check endpoint
location /health {
access_log off;
proxy_pass http://ollamaflow_backend/;
}
}
```
### HAProxy Configuration
```haproxy
# /etc/haproxy/haproxy.cfg
global
log stdout local0
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
mode http
log global
option httplog
option dontlognull
timeout connect 5000
timeout client 300000
timeout server 300000
frontend ollamaflow_frontend
bind *:80
bind *:443 ssl crt /etc/ssl/certs/yourcompany.pem
redirect scheme https if !{ ssl_fc }
default_backend ollamaflow_backend
backend ollamaflow_backend
balance roundrobin
option httpchk GET /
server ollamaflow1 127.0.0.1:43411 check
# server ollamaflow2 127.0.0.1:43412 check
listen stats
bind *:8404
stats enable
stats uri /stats
stats refresh 30s
```
## Security Considerations
### Firewall Configuration
```bash
# Allow OllamaFlow port
sudo ufw allow 43411/tcp
# Restrict admin API access (optional)
sudo ufw allow from 192.168.1.0/24 to any port 43411
```
### SSL/TLS Termination
For production deployments, always use SSL/TLS:
1. **At Load Balancer**: Terminate SSL at nginx/HAProxy (recommended)
2. **At Application**: Configure OllamaFlow with SSL certificates
3. **End-to-End**: Use SSL throughout the chain
### Authentication
* Change default admin bearer tokens
* Use strong, randomly generated tokens
* Rotate tokens regularly
* Consider integrating with existing authentication systems
## Monitoring and Logging
### Health Checks
Configure health check endpoints:
```bash
# Application health
curl -f http://localhost:43411/ || exit 1
# Backend health
curl -H "Authorization: Bearer your-token" \
http://localhost:43411/v1.0/backends/health
```
### Log Management
Configure log rotation and management:
```bash
# Logrotate configuration
sudo tee /etc/logrotate.d/ollamaflow > /dev/null << 'EOF'
/var/log/ollamaflow/*.log {
daily
missingok
rotate 30
compress
notifempty
create 0644 ollamaflow ollamaflow
postrotate
systemctl reload ollamaflow
endscript
}
EOF
```
## Next Steps
* Review [Configuration Reference](configuration-reference.md) for detailed settings
* Explore [API Documentation](api-reference.md) for integration
* Check [Monitoring and Observability](monitoring.md) for production insights
```bash
# Logrotate configuration
sudo tee /etc/logrotate.d/ollamaflow > /dev/null << 'EOF'
/var/log/ollamaflow/*.log {
daily
missingok
rotate 30
compress
notifempty
create 0644 ollamaflow ollamaflow
postrotate
systemctl reload ollamaflow
endscript
}
EOF
```