Add docker-compose.yml for deploying upaas (closes #223)
Check / check (pull_request) Skipped
Check / check (pull_request) Skipped
The compose file builds the image from this repo, mounts the Docker socket and HOST_DATA_DIR (passed to upaas as UPAAS_HOST_DATA_DIR), reads settings from .env, and restarts unless stopped. The port is published on 127.0.0.1 only, for a TLS-terminating proxy in front. PORT and UPAAS_DATA_DIR are pinned so .env cannot move upaas off the port mapping, the healthcheck (busybox wget) or the data mount. upaas now refuses to start when UPAAS_HOST_DATA_DIR is set to a relative path; when unset it still falls back to the data directory. The README's plain-HTTP Compose example becomes a short deploy section that points at the file. .env is added to .dockerignore. Model: opus-5-5
This commit is contained in:
@@ -32,6 +32,12 @@ const (
|
||||
filePermissions = 0o600
|
||||
)
|
||||
|
||||
// errHostDataDirNotAbsolute is returned when UPAAS_HOST_DATA_DIR is set to a
|
||||
// relative path, which the Docker daemon cannot resolve for app bind mounts.
|
||||
var errHostDataDirNotAbsolute = errors.New(
|
||||
"UPAAS_HOST_DATA_DIR must be an absolute path",
|
||||
)
|
||||
|
||||
// Params contains dependencies for Config.
|
||||
type Params struct {
|
||||
fx.In
|
||||
@@ -124,6 +130,10 @@ func buildConfig(log *slog.Logger, params *Params) (*Config, error) {
|
||||
dataDir := viper.GetString("DATA_DIR")
|
||||
hostDataDir := viper.GetString("HOST_DATA_DIR")
|
||||
|
||||
if hostDataDir != "" && !filepath.IsAbs(hostDataDir) {
|
||||
return nil, fmt.Errorf("%w, got %q", errHostDataDirNotAbsolute, hostDataDir)
|
||||
}
|
||||
|
||||
if hostDataDir == "" {
|
||||
hostDataDir = dataDir
|
||||
}
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
package config //nolint:testpackage // tests unexported buildConfig
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"log/slog"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestBuildConfigRejectsRelativeHostDataDir(t *testing.T) {
|
||||
t.Setenv("UPAAS_HOST_DATA_DIR", "./data")
|
||||
setupViper("upaas")
|
||||
|
||||
_, err := buildConfig(slog.Default(), &Params{})
|
||||
if !errors.Is(err, errHostDataDirNotAbsolute) {
|
||||
t.Fatalf("expected errHostDataDirNotAbsolute, got %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBuildConfigHostDataDirDefaultsToDataDir(t *testing.T) {
|
||||
t.Setenv("UPAAS_DATA_DIR", "./data")
|
||||
t.Setenv("UPAAS_HOST_DATA_DIR", "")
|
||||
t.Setenv("UPAAS_SESSION_SECRET", "test-secret")
|
||||
setupViper("upaas")
|
||||
|
||||
cfg, err := buildConfig(slog.Default(), &Params{})
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if cfg.HostDataDir != "./data" {
|
||||
t.Errorf("expected HostDataDir ./data, got %q", cfg.HostDataDir)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user