Containerized NBS (NIST Beamline Software) services for beamline simulation.
This repository provides containerized NBS services that can be run in two modes:
Uses pre-built images from GitHub Container Registry (GHCR):
# Images are automatically built and pushed to:
# ghcr.io/xraygui/nbs-pods/bluesky:latest
# ghcr.io/xraygui/nbs-pods/nbs:latest
# ghcr.io/xraygui/nbs-pods/nbs-gui:latestBuild images locally for development:
# Build all images
podman-compose -f docker-compose.build.yml build
# Build specific image
podman-compose -f docker-compose.build.yml build nbs
# Rebuild with no caching
podman-compose -f docker-compose.build.yml build --no-cache nbs_guifedora → bluesky → nbs → nbs-gui
# Start all services with pre-built images
./scripts/deploy.sh start
# Start specific services
./scripts/deploy.sh start gui queueserver
# Start demo services (bluesky-services, gui, queueserver, sim, viewer)
./scripts/deploy.sh demo# Build images locally first
podman-compose -f docker-compose.build.yml build
# Start specific services in development mode
./scripts/deploy.sh start --dev gui
# Mix normal and development mode
./scripts/deploy.sh start queueserver --dev gui# Stop all services
./scripts/deploy.sh stop
# Stop specific services
./scripts/deploy.sh stop gui queueserver- bluesky-services: Core infrastructure (Redis, MongoDB, Kafka, ZMQ proxies)
- queueserver: RE Manager for experiment orchestration
- gui: NBS GUI with display protocol detection (Wayland/X11)
- sim: NBS simulation services
- viewer: Additional viewing services (if configured)
The deployment system uses Docker Compose's override mechanism to enable flexible configuration:
- Base Configuration: Each service has a main
docker-compose.ymlfile with default settings - Override Files:
docker-compose.override.ymlfiles (if present) are automatically composed with the main file - Development Files:
docker-compose.development.ymlfiles are applied when using the--devflag
Override files allow local customization without modifying the base configuration:
- Testing: Override environment variables, ports, or volumes for testing
- Bug Fixes: Temporarily modify service parameters to work around issues
- GUI Configuration: Especially useful for display protocol issues (Wayland/X11)
- Local Paths: Mount local directories for configuration or data
Example override file:
services:
qs-gui:
volumes:
- ${HOME}/local-config:/etc/bluesky
environment:
- DEBUG=trueDevelopment files are applied when using the --dev flag and typically:
- Switch to Local Images: Use locally built images instead of GHCR images
- Config Mounts: Mount configuration directories to test config changes
- Code Mounts: Mount local source code directories for live development
- Local Installs: Install packages from local paths with
pip install -e - Debug Settings: Enable debugging, logging, or development-specific configurations
Example development file which only mounts local config directories
services:
qs-gui:
volumes:
- ${NBS_PODS_DIR}/config/bluesky:/etc/bluesky
- ${BEAMLINE_PODS_DIR}/config/ipython:/usr/local/share/ipython
- ${NBS_PODS_DIR}/config/tiled:/etc/tiledExample development file which installs local code
services:
nbs-sim:
volumes:
- ${NBSDIR}:/usr/local/src/xraygui
- ${BEAMLINE_PODS_DIR}/config/ipython:/usr/local/share/ipython
command: >
bash -c "
pip3 install --no-deps --no-build-isolation -e /usr/local/src/xraygui/nbs-sim/src &&
nbs-sim --startup-dir /usr/local/share/ipython/profile_default/startup --list-pvs
"The system resolves compose files in this order:
- Base service file (e.g.,
docker-compose.yml) - Override file (
docker-compose.override.yml) - if present - Development file (
docker-compose.development.yml) - if--devflag used
Later files override earlier ones, allowing for flexible configuration management.
Images include default configurations in /etc/bluesky and /etc/tiled/profiles which can be overridden with volume mounts in development mode.