Installation & Configuration Reference

Installation Guide

Installation & Configuration Reference

INSTALLATION

This document describes the installation  of Spillbox software to utilize the free compute resources of remote data center. User level software and documentation is a separate bundle.

Requirements at remote data center

  1. Need a machine ( 32-64 cores, 128-256Gb, 2TB and above local NVME storage) to run Spillbox server.  IT needs to create a Unix service account which will be used to run Spillbox server. Service accounts should have SUDO (super user do ) access without needing a password on the spillbox server machine. Service account should have Docker/Singularity access. This machine should have good amount of storage in /var ( or somewhere local, about 20gb ) to accommodate docker images.
  2. IT needs to have a list of OS patches to create Docker/Singularity images.
  3. IT needs to allocate an adequate set of machines with enough local storage (32-64 cores, 256Gb, 2TB and above local NVME storage ) for data caching to be used by Spillbox NFS servers. NVME storage should be mount locally with world writable permission.
  4. If using Docker, then IT needs to setup and maintain Docker image orchestration by installing docker daemon on all machines. Spillbox can create a container registry server on the spillbox server. Need docker-ce and docker-ce-cli containerd.io packages on all machines.
  5. Common storage ( NFS mounted, visible to all hosts ) to install Spillbox software
    • Spillbox installation area creates two directories parallel to its installation ( ../sites and ../customers ) which may grow over time and it keeps per project/user data. This will be a few gb only.
  6. NIS/LDAP support required on host and in container. All Spillbox users must have an account with home directory on cloud hosts machines.

NFS server cannot be run in a container on azure Cloud due to a bug/limitation in Azure Cloud. For NFS server on run on host without container, followinngs are needed on all NFS servers:

  • patchelf binary/pkg
  • sudo without password by the service account on the nfs server
  • max number of open files for all users should be 1024000. Entry in /etc/security/limits.conf on spillbox server and nfs-server
*                soft    nproc           65536
*                hard    nproc           65536
*                soft    nofile          1024000
*                hard    nofile          1024000
  • Below kernel configurations on spillbox server and nfs-server ( /etc/sysctl.conf):
sunrpc.tcp_max_slot_table_entries=65536
sunrpc.tcp_slot_table_entries = 128
fs.file-max=10240000
vm.min_free_kbytes=4124416
net.core.somaxconn=8192
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.tun0.disable_ipv6=1
net.core.rmem_max=16777216
net.core.wmem_max=16777216

      # please do "sysctl -w ..." for each above entry for already running kernel.

There are two steps

In Phase 1: One time installation by an account having docker access. This account must have write permission in the area where Spillbox software is installed. Better way would be for this account to download and install the software at common NFS location.

This phase will create common docker image and docker registry , if needed. This account also configures the config file used by all.

In Phase 2: This step starts a spillbox server. Any user can start a spillbox server and need not have docker access if docker container can be spawned through LSF app.

If docker container cannot be spawned through LSF app then server should be run by a common service account which has docker access ( in docker group). All users can use this server for their clients on premise. In this case, $HOME of the servrice account should be on the local disk on the server machine, not on a common NFS storage.

Phase 1 Steps

  • Login to designated spillbox server machine with account created for Spillbox
  • Install docker and run docker server ( sudo service docker start )
  • On NFS partition ( no. 6 above ), create a directory spillbox ( mkdir -p spillbox ) for Spillbox software download and installation.
  • Download software from https://s3-us-west-1.amazonaws.com/spillbox.io-public/spill-dc/latest/spill-dc.tar.gz ("latest" can be replaced with a specific version tag, e.g. v1.5; run "./upgrade.sh -list-versions" to see what versions are available)
  • unzip and untar it in spillbox
  • copy terraform/etc/spillbox_config.example to terraform/etc/spillbox_config
  • Edit terraform/etc/spillbox_config configuration file as per your site ( described below )
  • Run "terraform/server_image.sh build" This will create docker image and docker registry server
  • To destroy, please run "terraform/server_image.sh destroy"
  • This account should also configure system-wide terraform/etc/spillbox_config.
  • If you are using Spillbox docker registry server then please make Spillbox registry server as insecure private registry server in /etc/docker/daemon.json on all of your machines.

Configuration Reference

Please note that all entries are not must. Tool will inform about missing must field at runtime.

ParameterDescription
disable_server_image=falseIf you have your own docker image, Spillbox can use that.
disable_registry_server=falseIf you have your own docker orchestration system through LSF etc,
Spillbox will not create docker registry server used as docker repo
for docker orchestration.
registry_server=""Please provide host:port here if using own docker registry server.
cache_dir=/cache_dirThis is a snapshot area where local data center's data will be cached.
This should be a large local or NFS partition.
This is required; an empty value is an error.
cache_server=10.1.10.103if cache_dir is NAS then the IP address of the NAS server.
hub_port_min=8090For all projects and users, currently hub will run on the spillbox server itself.
So multiple hub will be on one machines and each hub will use a unique
port to communicate with the nfs server of that project. Hub will hunt for
free unix port starting from this port number.
docker_base_image="centos:7"If you have your own base image to be used company wide, please add here.
Users can override this.
local_mount_paths="/tools"If remote data center has its own tool area and need not cache that from local
data center, please add here.
exclude_mount_paths="" // list seperated by spacesForce exclusion of these nfs/local mount paths from being exported
from on-premise.
disable_docker_image=trueThis disables docker image per user/project.
disable_docker_privileged=falseDisable –privileged option in docker being passed.
cloud_shell="/bin/csh"Change default shell in Docker.
nfs_portmin=10000Starting port number for NFS server.
docker_wrapper="" // full paths separated by spacesUser's runtime commands are executed in a docker wrapper such that command runs
as user. Spillbox has a default wrapper. Customer can bring their own wrapper.
Multiple approved wrappers can be provided. Only approved wrappers are allowed.
client_hosts=""In case if you want to enforce all clients (onprem) to be run from
a particular machine.
container_with_automount=falseIn case you are using your own container and container already mounts
relevant local file systems and does not need help from Spillbox for
local_mount_paths. This is not common.
job_manager="" // slurm, uge, lsf, ncJob manager used for running file server.
job_submit_command="" // sbatch, bsub, qsub ...job manager submit command
job_kill_command="" // scancel, bkill ...job manager' command to cancel a job
user_setup_file="" // path to a setup fileIf setup file exists, then it will be sourced before spawning the container(running the job/batch job).
preexec_file="" // on-premise filepath to be executed as first thing in the containerIf preexec_file exists in the container, then it will be sourced quietly before executing the user command. Please note the file path and file exists on premise.
container="" // default docker"docker" and "singularity" containers are supported ("host" runs without a container). Applies for NFS servers as well
as for compute servers.
docker_path=In case "docker" in your network is at some other location.
singularity_path=In case "singularity" in your network is at some other location.
singularity_base_image=""Location of singularity .sif image. Please provide full path.
runtime_container= // default is whatever is during NFS serverAt compute time, one could use singularity container even if nfs
servers are docker container.
workdir= // default log/work directory is .spillbox directory in $HOMEof the service account which runs the server. User can configure
this to any NFS directory, instead of default $HOME.
batch_command_allowed= // default is ALLThis should be either left "" ( allow all) or filled with set of commands,
separated by spaces. These are usually job manager's batch commands
like sinfo, qsub, bsub, nc. Please provide full path also.
docker_option = // default is ""Instead of users providing options through "docker run -docker_option" for
each command line, this adds globally for all commands.
uge_dockerized_cluster = // default is falseUGE is configured to spin Spillbox docker.
lsf_dockerized_cluster = // default is falseLSF is configured to spin Spillbox docker. Please see
spillbox_lsf_docker_app_profile_configuration.docx.
docker_registry_port = // default is 5000Port used by Spillbox docker registry server.
server_base_image = // default is docker_base_imageIf NFS servers are configured to use container then container image
to be used by it.
remote_command_allowed = // default is "", list seperated by spaces<remote_cmd> in "splrun run -remote <remote_cmd>" will run by server
with server userid, not non-prem user's userid.
rootless_docker == // default is falseEnable rootless docker.
nameserver = // default is nameservers on spillbox server hostList of nameservers seperated by spaces, to be used in container.
uge_docker_option = // default is ""In case of UGE spawning docker container, extra docker option to be supplied.
setup_bapp = // default is falseSet this to true if the spillbox specific lsf bapp setup guide needs to be enabled.
bapp_name = // default is the image tagSet this to the name of lsf application profile. This in effect if setup_bapp is true.
bapp_image_name= // default is noneSet this to the docker image that has to be used. This in effect if setup_bapp is true.
lsf_cluster_name= // required, no defaultSet this to the lsf clustername that is needed. This in effect if setup_bapp is true.
nc_setup_bapp = // default is falseSet this to true if the spillbox specific nc bapp setup guide needs to be enabled.
nc_bapp_name = // default is noneSet this to the name of nc resource name. This in effect if nc_setup_bapp is true.
nc_bapp_image_name = // default is noneSet this to the docker image that has to be used. This in effect if nc_setup_bapp is true.
nc_vov_swd= // default is noneSet this to the main vov server's swd path. This in effect if nc_setup_bapp is true.
nc_vov_project= // default is noneSet this to the vovproject for which the setup to be done. This in effect if nc_setup_bapp is true.
checkpoint_objstore= // true/falseProvide a object store file system (juicefs with S3) to keep the checkpoint data
To enable object store (To enable object store, set these variable in spillbox_config:
checkpoint_objstore, checkpoint_image_dir, checkpoint_bucket, checkpoint_objport )
checkpoint_image_dir= // no defaultProvide a world writable NFS directory with enough space for checkpoint
to keep data in this directory.
checkpoint_bucket= // (only alphabet, number and - are allowed, and the length should be 3 to 63 characters)Bucket used for storing juicefs data, only empty buckets is allowed to be configured for juicefs storage
If bucket doesn't exist, new bucket will be created.
checkpoint_objport= // port numberCurrently used fo redis database, necessary for juicefs to track checkpoint metadata
backup_bucket= // object-store URL for project archive/restore(Different from checkpoint_bucket above which is used by JuiceFS for metadata storage)
Cloud storage location where project archives are saved and restored.
Format depends on the cloud provider:

AWS:
backup_bucket=s3://<bucket-name>
e.g. backup_bucket=s3://spillboxbackup
Auth: instance IAM role with s3:GetObject / s3:PutObject / s3:ListBucket / s3:DeleteObject on the bucket.

Azure:
backup_bucket=https://<storage_account>.blob.core.windows.net/<container>
e.g. backup_bucket=https://myaccount.blob.core.windows.net/spillboxbackup
Auth: managed identity — do NOT include a SAS token in the URL.
The VM managed identity must have the "Storage Blob Data Contributor"
role assigned on the target container.

GCP:
backup_bucket=gs://<bucket-name>
e.g. backup_bucket=gs://spillboxbackup
Auth: service account attached to the instance with
storage.objects.create / storage.objects.get / storage.objects.list / storage.objects.delete on the bucket.
hybrid_mount_paths = "" // list of mount paths separated by spacesEnable fully synchronized data sync between on-premise and Cloud
for set of mount paths hierarchically. This is equivalent to
enabling -download-hier, missing-hier and sync-hier in the snapshot option
for these directories. Special keyword "ALL" enables globally on all mount paths.
"hybrid_mount_paths_exclude" = "" // list of mount paths separated by spacesDiasble fully synchronized data sync between on-premise and Cloud
for set of mount paths hierarchically. This will be applied after
hybrid_mount_paths Environment variable SPILLBOX_HYBRID_MOUNT_PATHS_EXCLUDE
also does the same.
boostmode= // default is falseSet this to true to enable boostmode
boost_server_cache_size="" // default will be 500M, possible values K|M|GConfigures the cache size on the server. Setting this variable will allocate
the specified amount of host RAM for the spillbox project
boost_client_cache_dir="" // default will be /var/cache/fscacheConfigures the cache directory on the client.
"wan_timeout" = 900 // set WAN timeout in seconds ( 0 for no timeout )
max_file_size_gb= // default is unset, no limitCaps the size of any single file a job writes. Whole GB values only.
A file that hits the cap fails immediately and is left truncated near
that size — this limits one file at a time, not a job's total disk
usage. Set it above your largest known legitimate file, or that file
will fail too.
job_monitor= // default is falseSet this to true to launch job_monitor.sh alongside the job. It
watches for the job's NFS server/mount going unreachable and
force-kills the job's container so it doesn't hang around as an
unkillable zombie.
max_project=0 // default is 0, unlimitedCaps the number of concurrently alive project hubs. Once that many
are alive, a new "start" hub request is rejected (HTTP 503) with
"Project limit reached (max N). Destroy an existing project before
applying a new one." until an existing one is destroyed.
admin_users="" // default is unsetSpace-separated list of usernames allowed to log in to the web
GUI as admin. If set, only these usernames may do so (each still
authenticated against their own Linux/sudo password). If unset,
only the account that owns the spld process itself can log in as
admin.
gui_port=8888 // default is 8888Port for the web GUI (spld –gui-only), separate from the main
server port above. The GUI is started by default alongside the
main server; this only needs to be set to use a non-default port.
cron_lockfile="" // default is unset (no scheduler)Absolute path of the lock file of the crontab scheduler, in a
directory the user running run_server.sh can write to. If set, the
web GUI spld (spld –gui-only) runs the jobs in
<cron_lockfile>.crontab on a schedule, for example the hold queue to
send queue move (see doc/BMOD_WORKFLOW.md). The first time, the
shipped etc/spillbox_cron.crontab.example is copied there with every
entry commented out, so nothing runs until a # is taken off a line.
Only one scheduler runs at a time per lock file.
spld_systemctl="" // default is unset (plain background process)Set to "yes" to run spld as a systemd service instead of a plain
nohup'd background process.
mcp_server=true // default is true (when the MCP server code is installed)Set to true (also accepts yes/on/1) to start an MCP (Model
Context Protocol) server alongside spld, so an AI assistant (e.g.
Claude Code) can drive Spillbox project actions directly.
mcp_server_dir="" // default: <install_dir>/mcp, or ~/spillbox-mcp-vpcDirectory containing the MCP server's app.py (or vpc/app.py).
Only needed if the MCP server code isn't in one of those default
locations.
mcp_server_port=8000 // default is 8000 (8001 for run_cloud_server.sh)Port the MCP server listens on.
mcp_server_bind=127.0.0.1 // default is 127.0.0.1 (loopback only)Address the MCP server binds to. At the loopback default it's
reachable only by something that already has a shell on the host,
and needs no credential of its own. Widening this means anything
that can reach the port can call every MCP tool, including
destroying a project — every call is still recorded by address
in the MCP server's own audit.log regardless.
Only read by run_cloud_server.sh; with run_server.sh the bind comes
from SPILLBOX_MCP_BIND (default 0.0.0.0).

Phase 2 Steps

Can be run as any user if docker orchestration does not need user to be in docker group

  • Run the spillbox server on any machine through LSF/ssh:
bash
terraform/run_server.sh  [-kill] [-p <portnumber>] <tag>  

This starts spillbox server and returns SPILLBOX_SERVER value as host:port. Clients onprem should set this value and SPILLBOX_VPN=1.

💬 Ask a Question