Basic Usage

A basic example of starting and running a simple Galaxy server from a source clone in the foreground is provided in the ref:Quick Start guide. This section covers more typical usage for production Galaxy servers.

Managing a Single Galaxy

If you have not installed Gravity separate from the Galaxy virtualenv, simply activate Galaxy’s virtualenv, which will put Gravity’s galaxyctl and galaxy commands on your $PATH:

$ . /srv/galaxy/venv/bin/activate
$ galaxyctl --help
Usage: galaxyctl [OPTIONS] COMMAND [ARGS]...

  Manage Galaxy server configurations and processes.

Options:
  -d, --debug             Enables debug mode.
  -c, --config-file FILE  Gravity (or Galaxy) config file to operate on. Can
                          also be set with $GRAVITY_CONFIG_FILE or
                          $GALAXY_CONFIG_FILE
  --state-dir DIRECTORY   Where process management configs and state will be
                          stored.
  -h, --help              Show this message and exit.

Commands:
  configs     List registered config files.
  deregister  Deregister config file(s).
  exec        Run a single Galaxy service in the foreground, with logging...
  follow      Follow log files of configured instances.
  graceful    Gracefully reload configured services.
  instances   List all known instances.
  pm          Invoke process manager (supervisorctl, systemctl) directly.
  register    Register config file(s).
  rename      Update path of registered config file.
  restart     Restart configured services.
  show        Show details of registered config.
  shutdown    Shut down process manager.
  start       Start configured services.
  status      Display server status.
  stop        Stop configured services.
  update      Update process manager from config changes.

If you run galaxy or galaxyctl from the root of a Galaxy source checkout and do not specify the config file option, config/galaxy.yml or config/galaxy.yml.sample will be automatically used. This is handy for working with local clones of Galaxy for testing or development. You can skip Galaxy’s lengthy and repetitive run.sh configuration steps when starting and stopping Galaxy in between code updates (you should still run run.sh after performing a git pull to make sure your dependencies are up to date).

Gravity can either run Galaxy via the supervisor process manager (the default) or systemd. For production servers, it is recommended that you run Gravity as root in systemd mode. See the Managing a Production Galaxy section for details.

As shown in the Quick Start, the galaxy command will run a Galaxy server in the foreground. The galaxy command is actually a shortcut for two separate steps: 1. read the provided galaxy.yml and write out the corresponding process manager configurations, and 2. start and run Galaxy in the foreground using the process manager (supervisor). You can perform these steps separately (and in this example, start Galaxy as a backgrounded daemon instead of in the foreground):

$ galaxyctl update
Adding service gunicorn
Adding service celery
Adding service celery-beat
$ galaxyctl start
celery                           STARTING
celery-beat                      STARTING
gunicorn                         STARTING
Log files are in /srv/galaxy/var/gravity/log

When running as a daemon, the stop subcommand stops your Galaxy server:

$ galaxyctl stop
celery-beat: stopped
gunicorn: stopped
celery: stopped
All processes stopped, supervisord will exit
Shut down

Most Gravity subcommands (such as stop, start, restart, …) are straightforward, but a few subcommands are worth pointing out: update, graceful, and exec. All subcommands are documented in the Subcommands section and their respective --help output.

Managing a Production Galaxy

By default, Gravity runs Galaxy processes under supervisor, but setting the process_manager option to systemd in Gravity’s configuration will cause it to run under systemd instead. systemd is the default init system under most modern Linux distributions, and using systemd is strongly encouraged for production Galaxy deployments.

Gravity manages systemd service unit files corresponding to all of the Galaxy services that it is aware of, much like how it manages supervisor program config files in supervisor mode. If you run galaxyctl update as a non-root user, the unit files will be installed in ~/.config/systemd/user and run via systemd user mode. This can be useful for testing and development, but in production it is recommended to run Gravity as root, so that it installs the service units in /etc/systemd/system and are managed by the privileged systemd instance. Even when Gravity is run as root, Galaxy itself still runs as a non-root user, specified by the galaxy_user option in the Gravity configuration.

It is also recommended, when running as root, that you install Gravity independent of Galaxy, rather than use the copy installed in Galaxy’s virtualenv:

# python3 -m venv /opt/gravity
# /opt/gravity/bin/pip install gravity

Caution

Because systemd unit file names have semantic meaning (the filename is the service’s name) and systemd does not have a facility for isolating unit files controlled by an application, Gravity considers all unit files in the unit dir (/etc/systemd/system) that are named like galaxy-* to be controlled by Gravity. If you have existing unit files that are named as such, Gravity will overwrite or remove them.

In systemd mode, and especially when run as root, some Gravity options are required:

gravity:
  process_manager: systemd

  # required if running as root
  galaxy_user: GALAXY-USERNAME
  # optional, defaults to primary group of the user set above
  galaxy_group: GALAXY-GROUPNAME

  # required
  virtualenv: /srv/galaxy/venv
  # probably necessary if your galaxy.yml is not in galaxy_root/config
  galaxy_root: /srv/galaxy/server

See the Configuration section for more details on these options and others.

The log_dir option is ignored when using systemd. Logs are instead captured by systemd’s logging facility, journald.

You can use galaxyctl to manage Galaxy process starts/stops/restarts/etc. and follow the logs, just as you do under supervisor, but you can also use systemctl and journalctl directly to manage process states and inspect logs (respectively). Only galaxyctl update is necessary, in order to write and/or remove the appropriate systemd service units based on your configuration. For example:

# export GRAVITY_CONFIG_FILE=/srv/galaxy/config/galaxy.yml
# . /srv/galaxy/venv/bin/activate
(venv) # galaxyctl update
Adding service galaxy-gunicorn.service
Adding service galaxy-celery.service
Adding service galaxy-celery-beat.service

After this point, operations can be performed with either galaxyctl or systemctl. Some examples of equivalent commands:

Gravity systemd
galaxy systemctl start galaxy.target && journalctl -f -u 'galaxy-*'
galaxyctl start systemctl start galaxy.target
galaxyctl start SERVICE ... systemctl start galaxy-SERVICE.service galaxy-...
galaxyctl restart systemctl restart galaxy.target
galaxyctl restart SERVICE ... systemctl restart galaxy-SERVICE.service galaxy-...
galaxyctl graceful systemctl reload-or-restart galaxy.target
galaxyctl graceful SERVICE ... systemctl reload-or-restart galaxy-SERVICE.service galaxy-...
galaxyctl stop systemctl start galaxy.target
galayxctl follow journalctl -f -u 'galaxy-*'