Add db config and move data dir config

This commit is contained in:
2025-12-01 20:48:17 +01:00
parent 7272aa26ec
commit 00114caa00
5 changed files with 117 additions and 58 deletions

View File

@@ -179,11 +179,12 @@ backends:
args: [] args: []
environment: {} # Environment variables for the backend process environment: {} # Environment variables for the backend process
data_dir: ~/.local/share/llamactl # Main data directory (database, instances, logs), default varies by OS
instances: instances:
port_range: [8000, 9000] # Port range for instances port_range: [8000, 9000] # Port range for instances
data_dir: ~/.local/share/llamactl # Data directory (platform-specific, see below) configs_dir: instances # Instance configs directory (relative to data_dir)
configs_dir: ~/.local/share/llamactl/instances # Instance configs directory logs_dir: logs # Logs directory (relative to data_dir)
logs_dir: ~/.local/share/llamactl/logs # Logs directory
auto_create_dirs: true # Auto-create data/config/logs dirs if missing auto_create_dirs: true # Auto-create data/config/logs dirs if missing
max_instances: -1 # Max instances (-1 = unlimited) max_instances: -1 # Max instances (-1 = unlimited)
max_running_instances: -1 # Max running instances (-1 = unlimited) max_running_instances: -1 # Max running instances (-1 = unlimited)
@@ -195,6 +196,12 @@ instances:
on_demand_start_timeout: 120 # Default on-demand start timeout in seconds on_demand_start_timeout: 120 # Default on-demand start timeout in seconds
timeout_check_interval: 5 # Idle instance timeout check in minutes timeout_check_interval: 5 # Idle instance timeout check in minutes
database:
path: llamactl.db # Database file path (relative to data_dir)
max_open_connections: 25 # Maximum open database connections
max_idle_connections: 5 # Maximum idle database connections
connection_max_lifetime: 5m # Connection max lifetime
auth: auth:
require_inference_auth: true # Require auth for inference endpoints require_inference_auth: true # Require auth for inference endpoints
inference_keys: [] # Keys for inference endpoints inference_keys: [] # Keys for inference endpoints

View File

@@ -50,10 +50,17 @@ func main() {
// Create the data directory if it doesn't exist // Create the data directory if it doesn't exist
if cfg.Instances.AutoCreateDirs { if cfg.Instances.AutoCreateDirs {
if err := os.MkdirAll(cfg.Instances.InstancesDir, 0755); err != nil { // Create the main data directory
log.Printf("Error creating config directory %s: %v\nPersistence will not be available.", cfg.Instances.InstancesDir, err) if err := os.MkdirAll(cfg.DataDir, 0755); err != nil {
log.Printf("Error creating data directory %s: %v\nData persistence may not be available.", cfg.DataDir, err)
} }
// Create instances directory
if err := os.MkdirAll(cfg.Instances.InstancesDir, 0755); err != nil {
log.Printf("Error creating instances directory %s: %v\nPersistence will not be available.", cfg.Instances.InstancesDir, err)
}
// Create logs directory
if err := os.MkdirAll(cfg.Instances.LogsDir, 0755); err != nil { if err := os.MkdirAll(cfg.Instances.LogsDir, 0755); err != nil {
log.Printf("Error creating log directory %s: %v\nInstance logs will not be available.", cfg.Instances.LogsDir, err) log.Printf("Error creating log directory %s: %v\nInstance logs will not be available.", cfg.Instances.LogsDir, err)
} }

View File

@@ -49,11 +49,12 @@ backends:
environment: {} # Environment variables for the backend process environment: {} # Environment variables for the backend process
response_headers: {} # Additional response headers to send with responses response_headers: {} # Additional response headers to send with responses
data_dir: ~/.local/share/llamactl # Main data directory (database, instances, logs), default varies by OS
instances: instances:
port_range: [8000, 9000] # Port range for instances port_range: [8000, 9000] # Port range for instances
data_dir: ~/.local/share/llamactl # Data directory (platform-specific, see below) configs_dir: data_dir/instances # Instance configs directory
configs_dir: ~/.local/share/llamactl/instances # Instance configs directory logs_dir: data_dir/logs # Logs directory
logs_dir: ~/.local/share/llamactl/logs # Logs directory
auto_create_dirs: true # Auto-create data/config/logs dirs if missing auto_create_dirs: true # Auto-create data/config/logs dirs if missing
max_instances: -1 # Max instances (-1 = unlimited) max_instances: -1 # Max instances (-1 = unlimited)
max_running_instances: -1 # Max running instances (-1 = unlimited) max_running_instances: -1 # Max running instances (-1 = unlimited)
@@ -65,6 +66,12 @@ instances:
on_demand_start_timeout: 120 # Default on-demand start timeout in seconds on_demand_start_timeout: 120 # Default on-demand start timeout in seconds
timeout_check_interval: 5 # Idle instance timeout check in minutes timeout_check_interval: 5 # Idle instance timeout check in minutes
database:
path: data_dir/llamactl.db # Database file path
max_open_connections: 25 # Maximum open database connections
max_idle_connections: 5 # Maximum idle database connections
connection_max_lifetime: 5m # Connection max lifetime
auth: auth:
require_inference_auth: true # Require auth for inference endpoints require_inference_auth: true # Require auth for inference endpoints
inference_keys: [] # Keys for inference endpoints inference_keys: [] # Keys for inference endpoints
@@ -193,14 +200,27 @@ backends:
- `LLAMACTL_MLX_ENV` - Environment variables in format "KEY1=value1,KEY2=value2" - `LLAMACTL_MLX_ENV` - Environment variables in format "KEY1=value1,KEY2=value2"
- `LLAMACTL_MLX_RESPONSE_HEADERS` - Response headers in format "KEY1=value1;KEY2=value2" - `LLAMACTL_MLX_RESPONSE_HEADERS` - Response headers in format "KEY1=value1;KEY2=value2"
### Data Directory Configuration
```yaml
data_dir: "~/.local/share/llamactl" # Main data directory for database, instances, and logs (default varies by OS)
```
**Environment Variables:**
- `LLAMACTL_DATA_DIRECTORY` - Main data directory path
**Default Data Directory by Platform:**
- **Linux**: `~/.local/share/llamactl`
- **macOS**: `~/Library/Application Support/llamactl`
- **Windows**: `%LOCALAPPDATA%\llamactl` or `%PROGRAMDATA%\llamactl`
### Instance Configuration ### Instance Configuration
```yaml ```yaml
instances: instances:
port_range: [8000, 9000] # Port range for instances (default: [8000, 9000]) port_range: [8000, 9000] # Port range for instances (default: [8000, 9000])
data_dir: "~/.local/share/llamactl" # Directory for all llamactl data (default varies by OS) configs_dir: "instances" # Directory for instance configs, default: data_dir/instances
configs_dir: "~/.local/share/llamactl/instances" # Directory for instance configs (default: data_dir/instances) logs_dir: "logs" # Directory for instance logs, default: data_dir/logs
logs_dir: "~/.local/share/llamactl/logs" # Directory for instance logs (default: data_dir/logs)
auto_create_dirs: true # Automatically create data/config/logs directories (default: true) auto_create_dirs: true # Automatically create data/config/logs directories (default: true)
max_instances: -1 # Maximum instances (-1 = unlimited) max_instances: -1 # Maximum instances (-1 = unlimited)
max_running_instances: -1 # Maximum running instances (-1 = unlimited) max_running_instances: -1 # Maximum running instances (-1 = unlimited)
@@ -215,7 +235,6 @@ instances:
**Environment Variables:** **Environment Variables:**
- `LLAMACTL_INSTANCE_PORT_RANGE` - Port range (format: "8000-9000" or "8000,9000") - `LLAMACTL_INSTANCE_PORT_RANGE` - Port range (format: "8000-9000" or "8000,9000")
- `LLAMACTL_DATA_DIRECTORY` - Data directory path
- `LLAMACTL_INSTANCES_DIR` - Instance configs directory path - `LLAMACTL_INSTANCES_DIR` - Instance configs directory path
- `LLAMACTL_LOGS_DIR` - Log directory path - `LLAMACTL_LOGS_DIR` - Log directory path
- `LLAMACTL_AUTO_CREATE_DATA_DIR` - Auto-create data/config/logs directories (true/false) - `LLAMACTL_AUTO_CREATE_DATA_DIR` - Auto-create data/config/logs directories (true/false)
@@ -229,6 +248,22 @@ instances:
- `LLAMACTL_ON_DEMAND_START_TIMEOUT` - Default on-demand start timeout in seconds - `LLAMACTL_ON_DEMAND_START_TIMEOUT` - Default on-demand start timeout in seconds
- `LLAMACTL_TIMEOUT_CHECK_INTERVAL` - Default instance timeout check interval in minutes - `LLAMACTL_TIMEOUT_CHECK_INTERVAL` - Default instance timeout check interval in minutes
### Database Configuration
```yaml
database:
path: "llamactl.db" # Database file path, default: data_dir/llamactl.db
max_open_connections: 25 # Maximum open database connections (default: 25)
max_idle_connections: 5 # Maximum idle database connections (default: 5)
connection_max_lifetime: 5m # Connection max lifetime (default: 5m)
```
**Environment Variables:**
- `LLAMACTL_DATABASE_PATH` - Database file path (relative to data_dir or absolute)
- `LLAMACTL_DATABASE_MAX_OPEN_CONNECTIONS` - Maximum open database connections
- `LLAMACTL_DATABASE_MAX_IDLE_CONNECTIONS` - Maximum idle database connections
- `LLAMACTL_DATABASE_CONN_MAX_LIFETIME` - Connection max lifetime (e.g., "5m", "1h")
### Authentication Configuration ### Authentication Configuration
```yaml ```yaml

View File

@@ -47,6 +47,10 @@ type AppConfig struct {
Auth AuthConfig `yaml:"auth" json:"auth"` Auth AuthConfig `yaml:"auth" json:"auth"`
LocalNode string `yaml:"local_node,omitempty" json:"local_node,omitempty"` LocalNode string `yaml:"local_node,omitempty" json:"local_node,omitempty"`
Nodes map[string]NodeConfig `yaml:"nodes,omitempty" json:"nodes,omitempty"` Nodes map[string]NodeConfig `yaml:"nodes,omitempty" json:"nodes,omitempty"`
// Directory where all llamactl data will be stored (database, instances, logs, etc.)
DataDir string `yaml:"data_dir" json:"data_dir"`
Version string `yaml:"-" json:"version"` Version string `yaml:"-" json:"version"`
CommitHash string `yaml:"-" json:"commit_hash"` CommitHash string `yaml:"-" json:"commit_hash"`
BuildTime string `yaml:"-" json:"build_time"` BuildTime string `yaml:"-" json:"build_time"`
@@ -75,7 +79,7 @@ type ServerConfig struct {
// DatabaseConfig contains database configuration settings // DatabaseConfig contains database configuration settings
type DatabaseConfig struct { type DatabaseConfig struct {
// Database file path (relative to data_dir or absolute) // Database file path (relative to the top-level data_dir or absolute)
Path string `yaml:"path" json:"path"` Path string `yaml:"path" json:"path"`
// Connection settings // Connection settings
@@ -89,13 +93,11 @@ type InstancesConfig struct {
// Port range for instances (e.g., 8000,9000) // Port range for instances (e.g., 8000,9000)
PortRange [2]int `yaml:"port_range" json:"port_range"` PortRange [2]int `yaml:"port_range" json:"port_range"`
// Directory where all llamactl data will be stored (instances.json, logs, etc.)
DataDir string `yaml:"data_dir" json:"data_dir"`
// Instance config directory override // Instance config directory override (relative to data_dir if not absolute)
InstancesDir string `yaml:"configs_dir" json:"configs_dir"` InstancesDir string `yaml:"configs_dir" json:"configs_dir"`
// Logs directory override // Logs directory override (relative to data_dir if not absolute)
LogsDir string `yaml:"logs_dir" json:"logs_dir"` LogsDir string `yaml:"logs_dir" json:"logs_dir"`
// Automatically create the data directory if it doesn't exist // Automatically create the data directory if it doesn't exist
@@ -156,6 +158,8 @@ type NodeConfig struct {
// 3. Environment variables // 3. Environment variables
func LoadConfig(configPath string) (AppConfig, error) { func LoadConfig(configPath string) (AppConfig, error) {
// 1. Start with defaults // 1. Start with defaults
defaultDataDir := getDefaultDataDirectory()
cfg := AppConfig{ cfg := AppConfig{
Server: ServerConfig{ Server: ServerConfig{
Host: "0.0.0.0", Host: "0.0.0.0",
@@ -166,6 +170,7 @@ func LoadConfig(configPath string) (AppConfig, error) {
}, },
LocalNode: "main", LocalNode: "main",
Nodes: map[string]NodeConfig{}, Nodes: map[string]NodeConfig{},
DataDir: defaultDataDir,
Backends: BackendConfig{ Backends: BackendConfig{
LlamaCpp: BackendSettings{ LlamaCpp: BackendSettings{
Command: "llama-server", Command: "llama-server",
@@ -176,7 +181,7 @@ func LoadConfig(configPath string) (AppConfig, error) {
Image: "ghcr.io/ggml-org/llama.cpp:server", Image: "ghcr.io/ggml-org/llama.cpp:server",
Args: []string{ Args: []string{
"run", "--rm", "--network", "host", "--gpus", "all", "run", "--rm", "--network", "host", "--gpus", "all",
"-v", filepath.Join(getDefaultDataDirectory(), "llama.cpp") + ":/root/.cache/llama.cpp"}, "-v", filepath.Join(defaultDataDir, "llama.cpp") + ":/root/.cache/llama.cpp"},
Environment: map[string]string{}, Environment: map[string]string{},
}, },
}, },
@@ -188,7 +193,7 @@ func LoadConfig(configPath string) (AppConfig, error) {
Image: "vllm/vllm-openai:latest", Image: "vllm/vllm-openai:latest",
Args: []string{ Args: []string{
"run", "--rm", "--network", "host", "--gpus", "all", "--shm-size", "1g", "run", "--rm", "--network", "host", "--gpus", "all", "--shm-size", "1g",
"-v", filepath.Join(getDefaultDataDirectory(), "huggingface") + ":/root/.cache/huggingface", "-v", filepath.Join(defaultDataDir, "huggingface") + ":/root/.cache/huggingface",
}, },
Environment: map[string]string{}, Environment: map[string]string{},
}, },
@@ -201,7 +206,6 @@ func LoadConfig(configPath string) (AppConfig, error) {
}, },
Instances: InstancesConfig{ Instances: InstancesConfig{
PortRange: [2]int{8000, 9000}, PortRange: [2]int{8000, 9000},
DataDir: getDefaultDataDirectory(),
// NOTE: empty strings are set as placeholder values since InstancesDir and LogsDir // NOTE: empty strings are set as placeholder values since InstancesDir and LogsDir
// should be relative path to DataDir if not explicitly set. // should be relative path to DataDir if not explicitly set.
InstancesDir: "", InstancesDir: "",
@@ -218,7 +222,7 @@ func LoadConfig(configPath string) (AppConfig, error) {
TimeoutCheckInterval: 5, // Check timeouts every 5 minutes TimeoutCheckInterval: 5, // Check timeouts every 5 minutes
}, },
Database: DatabaseConfig{ Database: DatabaseConfig{
Path: "llamactl.db", // Relative to data_dir Path: "", // Will be set to data_dir/llamactl.db if empty
MaxOpenConnections: 25, MaxOpenConnections: 25,
MaxIdleConnections: 5, MaxIdleConnections: 5,
ConnMaxLifetime: 5 * time.Minute, ConnMaxLifetime: 5 * time.Minute,
@@ -244,17 +248,15 @@ func LoadConfig(configPath string) (AppConfig, error) {
// 3. Override with environment variables // 3. Override with environment variables
loadEnvVars(&cfg) loadEnvVars(&cfg)
// If InstancesDir or LogsDir is not set, set it to relative path of DataDir // Set default directories if not specified
if cfg.Instances.InstancesDir == "" { if cfg.Instances.InstancesDir == "" {
cfg.Instances.InstancesDir = filepath.Join(cfg.Instances.DataDir, "instances") cfg.Instances.InstancesDir = filepath.Join(cfg.DataDir, "instances")
} }
if cfg.Instances.LogsDir == "" { if cfg.Instances.LogsDir == "" {
cfg.Instances.LogsDir = filepath.Join(cfg.Instances.DataDir, "logs") cfg.Instances.LogsDir = filepath.Join(cfg.DataDir, "logs")
} }
if cfg.Database.Path == "" {
// Resolve database path relative to DataDir if it's not absolute cfg.Database.Path = filepath.Join(cfg.DataDir, "llamactl.db")
if cfg.Database.Path != "" && !filepath.IsAbs(cfg.Database.Path) {
cfg.Database.Path = filepath.Join(cfg.Instances.DataDir, cfg.Database.Path)
} }
// Validate port range // Validate port range
@@ -312,7 +314,7 @@ func loadEnvVars(cfg *AppConfig) {
// Data config // Data config
if dataDir := os.Getenv("LLAMACTL_DATA_DIRECTORY"); dataDir != "" { if dataDir := os.Getenv("LLAMACTL_DATA_DIRECTORY"); dataDir != "" {
cfg.Instances.DataDir = dataDir cfg.DataDir = dataDir
} }
if instancesDir := os.Getenv("LLAMACTL_INSTANCES_DIR"); instancesDir != "" { if instancesDir := os.Getenv("LLAMACTL_INSTANCES_DIR"); instancesDir != "" {
cfg.Instances.InstancesDir = instancesDir cfg.Instances.InstancesDir = instancesDir

View File

@@ -30,7 +30,6 @@ export interface ServerConfig {
export interface InstancesConfig { export interface InstancesConfig {
port_range: [number, number] port_range: [number, number]
data_dir: string
configs_dir: string configs_dir: string
logs_dir: string logs_dir: string
auto_create_dirs: boolean auto_create_dirs: boolean
@@ -45,6 +44,13 @@ export interface InstancesConfig {
timeout_check_interval: number timeout_check_interval: number
} }
export interface DatabaseConfig {
path: string
max_open_connections: number
max_idle_connections: number
connection_max_lifetime: number
}
export interface AuthConfig { export interface AuthConfig {
require_inference_auth: boolean require_inference_auth: boolean
inference_keys: string[] // Will be empty in sanitized response inference_keys: string[] // Will be empty in sanitized response
@@ -61,9 +67,11 @@ export interface AppConfig {
server: ServerConfig server: ServerConfig
backends: BackendConfig backends: BackendConfig
instances: InstancesConfig instances: InstancesConfig
database: DatabaseConfig
auth: AuthConfig auth: AuthConfig
local_node: string local_node: string
nodes: Record<string, NodeConfig> nodes: Record<string, NodeConfig>
data_dir: string
version?: string version?: string
commit_hash?: string commit_hash?: string
build_time?: string build_time?: string