Monorepo for Tangled tangled.org
2

Configure Feed

Select the types of activity you want to include in your feed.

spindle: exclude microvm engine on non-linux machines

This allows spindle build on non-linux machines like darwin.

Signed-off-by: Seongmin Lee <git@boltless.me>

author
Seongmin Lee
date (Jul 27, 2026, 7:59 PM +0900) commit fd0f509a parent 9022df2d change-id ntmmrzts
+83 -30
+18
docker-compose.linux.yml
··· 1 + # Linux-only overrides: microVM devices/caps that don't exist on macOS. 2 + # Use with: docker compose -f docker-compose.yml -f docker-compose.linux.yml --profile linux up 3 + services: 4 + spindle: 5 + # these two are required for cgroups, uncomment if testing 6 + # privileged: true 7 + # cgroup: host 8 + devices: 9 + - /dev/vsock:/dev/vsock 10 + - /dev/kvm:/dev/kvm 11 + - /dev/vhost-vsock:/dev/vhost-vsock 12 + - /dev/net/tun:/dev/net/tun 13 + cap_add: 14 + - NET_ADMIN 15 + - SYS_ADMIN 16 + security_opt: 17 + - label=disable 18 + - seccomp=unconfined
+2 -15
docker-compose.yml
··· 163 163 networks: [tngl] 164 164 165 165 spindle: 166 - profiles: ["linux"] 167 166 build: 168 167 context: . 169 168 dockerfile: localinfra/spindle.Dockerfile ··· 189 188 SPINDLE_NIX_CACHE_READ_URLS: http://ncps:8501 190 189 SPINDLE_NIX_CACHE_TRUSTED_PUBLIC_KEYS: cache.local:F7YqpMzuBdILYd/v+wMZN2YKxCzliXQyFmeezOxw7rU= 191 190 SPINDLE_NIX_CACHE_UPLOAD_URL: http://ncps:8501/upload 192 - # these two are required for cgroups, uncomment if testing 193 - # privileged: true 194 - # cgroup: host 195 - devices: 196 - - /dev/vsock:/dev/vsock 197 - - /dev/kvm:/dev/kvm 198 - - /dev/vhost-vsock:/dev/vhost-vsock 199 - - /dev/net/tun:/dev/net/tun 200 - cap_add: 201 - - NET_ADMIN 202 - - SYS_ADMIN 203 - security_opt: 204 - - label=disable 205 - - seccomp=unconfined 191 + # microVM devices/caps live in docker-compose.linux.yml (Linux only) 206 192 volumes: 207 193 - spindle-data:/var/lib/spindle 208 194 - spindle-logs:/var/log/spindle ··· 224 210 condition: service_completed_successfully 225 211 ncps: 226 212 condition: service_started 213 + required: false 227 214 networks: [tngl] 228 215 229 216 knotmirror-tap:
+2 -1
localinfra/readme.md
··· 49 49 ./localinfra/scripts/prepare-spindle-images.sh 50 50 ``` 51 51 This writes the image directory under `out/localinfra-spindle-images`. 52 - 5. `docker compose up` 52 + 5. `docker compose up` (macOS). On Linux, to run spindle's microVM engine + ncps cache: 53 + `docker compose -f docker-compose.yml -f docker-compose.linux.yml --profile linux up` 53 54 6. AppView will be running on `127.0.0.1:3000` with two test users: `alice.pds.tngl.boltless.dev` and `bob.pds.tngl.boltless.dev`. Both with password `password`. 54 55 55 56 `TANGLED_APPVIEW_HOST` must be a loopback IP with the mapped port (`127.0.0.1:3000`), not `localhost`: atproto's dev OAuth client requires a loopback IP for the redirect URI. If you remap the published appview port, update `TANGLED_APPVIEW_HOST` in `docker-compose.yml` to match.
+2 -14
spindle/server.go
··· 35 35 "tangled.org/core/spindle/config" 36 36 "tangled.org/core/spindle/db" 37 37 "tangled.org/core/spindle/engine" 38 - "tangled.org/core/spindle/engines/dummy" 39 - "tangled.org/core/spindle/engines/microvm" 40 - "tangled.org/core/spindle/engines/nixery" 41 38 "tangled.org/core/spindle/git" 42 39 "tangled.org/core/spindle/models" 43 40 "tangled.org/core/spindle/secrets" ··· 347 344 return fmt.Errorf("failed to setup db: %w", err) 348 345 } 349 346 350 - nixeryEng, err := nixery.New(ctx, cfg) 347 + engines, err := buildEngines(ctx, cfg, d) 351 348 if err != nil { 352 349 return err 353 350 } 354 351 355 - microvmEng, err := microvm.New(ctx, cfg, d) 356 - if err != nil { 357 - return err 358 - } 359 - 360 - s, err := New(ctx, cfg, d, map[string]models.Engine{ 361 - "nixery": nixeryEng, 362 - "microvm": microvmEng, 363 - "dummy": dummy.New(log.FromContext(ctx)), 364 - }) 352 + s, err := New(ctx, cfg, d, engines) 365 353 if err != nil { 366 354 return err 367 355 }
+33
spindle/server_engines_linux.go
··· 1 + //go:build linux 2 + 3 + package spindle 4 + 5 + import ( 6 + "context" 7 + 8 + "tangled.org/core/log" 9 + "tangled.org/core/spindle/config" 10 + "tangled.org/core/spindle/db" 11 + "tangled.org/core/spindle/engines/dummy" 12 + "tangled.org/core/spindle/engines/microvm" 13 + "tangled.org/core/spindle/engines/nixery" 14 + "tangled.org/core/spindle/models" 15 + ) 16 + 17 + func buildEngines(ctx context.Context, cfg *config.Config, d *db.DB) (map[string]models.Engine, error) { 18 + nixeryEng, err := nixery.New(ctx, cfg) 19 + if err != nil { 20 + return nil, err 21 + } 22 + 23 + microvmEng, err := microvm.New(ctx, cfg, d) 24 + if err != nil { 25 + return nil, err 26 + } 27 + 28 + return map[string]models.Engine{ 29 + "nixery": nixeryEng, 30 + "microvm": microvmEng, 31 + "dummy": dummy.New(log.FromContext(ctx)), 32 + }, nil 33 + }
+26
spindle/server_engines_other.go
··· 1 + //go:build !linux 2 + 3 + package spindle 4 + 5 + import ( 6 + "context" 7 + 8 + "tangled.org/core/log" 9 + "tangled.org/core/spindle/config" 10 + "tangled.org/core/spindle/db" 11 + "tangled.org/core/spindle/engines/dummy" 12 + "tangled.org/core/spindle/engines/nixery" 13 + "tangled.org/core/spindle/models" 14 + ) 15 + 16 + func buildEngines(ctx context.Context, cfg *config.Config, _ *db.DB) (map[string]models.Engine, error) { 17 + nixeryEng, err := nixery.New(ctx, cfg) 18 + if err != nil { 19 + return nil, err 20 + } 21 + 22 + return map[string]models.Engine{ 23 + "nixery": nixeryEng, 24 + "dummy": dummy.New(log.FromContext(ctx)), 25 + }, nil 26 + }