11package envconfig
22
33import (
4+ "errors"
45 "fmt"
56 "log/slog"
67 "net"
@@ -11,6 +12,18 @@ import (
1112 "strings"
1213)
1314
15+ type OllamaHost struct {
16+ Scheme string
17+ Host string
18+ Port string
19+ }
20+
21+ func (o OllamaHost ) String () string {
22+ return fmt .Sprintf ("%s://%s:%s" , o .Scheme , o .Host , o .Port )
23+ }
24+
25+ var ErrInvalidHostPort = errors .New ("invalid port specified in OLLAMA_HOST" )
26+
1427var (
1528 // Set via OLLAMA_ORIGINS in the environment
1629 AllowOrigins []string
3447 NoPrune bool
3548 // Set via OLLAMA_NUM_PARALLEL in the environment
3649 NumParallel int
50+ // Set via OLLAMA_HOST in the environment
51+ Host * OllamaHost
3752 // Set via OLLAMA_RUNNERS_DIR in the environment
3853 RunnersDir string
3954 // Set via OLLAMA_TMPDIR in the environment
@@ -50,7 +65,7 @@ func AsMap() map[string]EnvVar {
5065 return map [string ]EnvVar {
5166 "OLLAMA_DEBUG" : {"OLLAMA_DEBUG" , Debug , "Show additional debug information (e.g. OLLAMA_DEBUG=1)" },
5267 "OLLAMA_FLASH_ATTENTION" : {"OLLAMA_FLASH_ATTENTION" , FlashAttention , "Enabled flash attention" },
53- "OLLAMA_HOST" : {"OLLAMA_HOST" , "" , "IP Address for the ollama server (default 127.0.0.1:11434)" },
68+ "OLLAMA_HOST" : {"OLLAMA_HOST" , Host , "IP Address for the ollama server (default 127.0.0.1:11434)" },
5469 "OLLAMA_KEEP_ALIVE" : {"OLLAMA_KEEP_ALIVE" , KeepAlive , "The duration that models stay loaded in memory (default \" 5m\" )" },
5570 "OLLAMA_LLM_LIBRARY" : {"OLLAMA_LLM_LIBRARY" , LLMLibrary , "Set LLM library to bypass autodetection" },
5671 "OLLAMA_MAX_LOADED_MODELS" : {"OLLAMA_MAX_LOADED_MODELS" , MaxRunners , "Maximum number of loaded models (default 1)" },
@@ -216,4 +231,54 @@ func LoadConfig() {
216231 }
217232
218233 KeepAlive = clean ("OLLAMA_KEEP_ALIVE" )
234+
235+ var err error
236+ Host , err = getOllamaHost ()
237+ if err != nil {
238+ slog .Error ("invalid setting" , "OLLAMA_HOST" , Host , "error" , err , "using default port" , Host .Port )
239+ }
240+ }
241+
242+ func getOllamaHost () (* OllamaHost , error ) {
243+ defaultPort := "11434"
244+
245+ hostVar := os .Getenv ("OLLAMA_HOST" )
246+ hostVar = strings .TrimSpace (strings .Trim (strings .TrimSpace (hostVar ), "\" '" ))
247+
248+ scheme , hostport , ok := strings .Cut (hostVar , "://" )
249+ switch {
250+ case ! ok :
251+ scheme , hostport = "http" , hostVar
252+ case scheme == "http" :
253+ defaultPort = "80"
254+ case scheme == "https" :
255+ defaultPort = "443"
256+ }
257+
258+ // trim trailing slashes
259+ hostport = strings .TrimRight (hostport , "/" )
260+
261+ host , port , err := net .SplitHostPort (hostport )
262+ if err != nil {
263+ host , port = "127.0.0.1" , defaultPort
264+ if ip := net .ParseIP (strings .Trim (hostport , "[]" )); ip != nil {
265+ host = ip .String ()
266+ } else if hostport != "" {
267+ host = hostport
268+ }
269+ }
270+
271+ if portNum , err := strconv .ParseInt (port , 10 , 32 ); err != nil || portNum > 65535 || portNum < 0 {
272+ return & OllamaHost {
273+ Scheme : scheme ,
274+ Host : host ,
275+ Port : defaultPort ,
276+ }, ErrInvalidHostPort
277+ }
278+
279+ return & OllamaHost {
280+ Scheme : scheme ,
281+ Host : host ,
282+ Port : port ,
283+ }, nil
219284}
0 commit comments