Deploying a Beacon v1 in Galaxy

Author(s) orcid logoHelena Rasche avatar Helena Rasche
Editor(s) orcid logoSaskia Hiltemann avatar Saskia Hiltemann
Creative Commons License: CC-BY Questions:
  • What is a Beacon?

  • How do I deploy it?

  • Is v1 the same as v2?

  • Deploy a Beacon

Time estimation: 30 minutes
Supporting Materials:
Published: Apr 16, 2023
Last modification: Apr 21, 2023
License: Tutorial Content is licensed under Creative Commons Attribution 4.0 International License. The GTN Framework is licensed under MIT
purl PURL:
version Revision: 3

This tutorial will guide you through setting up a GA4GH Beacon!

The Beacon Project is developed under a Global Alliance for Genomics and Health (GA4GH) Iniciative for the federated discovery of genomic data in biomedical research and clinical applications.

Warning: Beacon v1

This deploys an older Beacon v1 which was a simpler system. The Beacon v1 is more or less deprecated, with users being pushed to Beacon v2 which gives much richer answers, and offers better querying syntax.

  1. Installing and Configuring
  2. Setting up the Importer

Installing and Configuring

Hands-on: Setting up a Beacon with Ansible
  1. Setup the hosts

    --- a/hosts
    +++ b/hosts
    @@ -9,3 +9,12 @@ ansible_connection=local ansible_user=ubuntu
     [sentryservers] ansible_connection=local ansible_user=ubuntu
    +[beacon_server] ansible_connection=local ansible_user=ubuntu
    +[beacon_import] ansible_connection=local ansible_user=ubuntu

    Here we use some of the more advanced features of Ansible’s Inventory system. We declare a host group called ‘beacon’ with no hosts of its own.

    Then we declare that this beacon group has two children: beacon_import, and beacon_server. We can then define host groups for those two entries with as many different hosts as we need. This makes it very easy to scale up configuration.

    Here we will be using that feature to declare some ‘beacon variables’, which will be shared between the beacon_server and beacon_importer. Because they’re children of ‘beacon’, they’ll inherit any group variables defined for group_vars/beacon.yml.

  2. Setup the requirements

    --- a/requirements.yml
    +++ b/requirements.yml
    @@ -60,3 +60,8 @@
     # Our FTP Server
     - src: galaxyproject.proftpd
       version: 0.3.1
    +# Beacon support
    +- name: paprikant.beacon
    +  src:
    +- name: paprikant.beacon-importer
    +  src:
  3. Install the role with:

    Input: Bash
    ansible-galaxy install -p roles -r requirements.yml
  4. Create the vars file

    --- /dev/null
    +++ b/group_vars/beacon.yml
    @@ -0,0 +1,31 @@
    +postgres_data_dir: /data/beacon/postgresql/data
    +postgres_init_dir: /data/beacon/postgresql/init
    +bp_external_binding: 5050 # The default
    +postgres_user: "{{ beacon_db_user }}"
    +postgres_pass: "{{ beacon_db_password }}"
    +postgres_external_binding: "{{ beacon_db_port }}"
    +# Database Configuration
    +beacon_db_user: beacon
    +beacon_db_host: "{{ groups['beacon_server'][0] }}"
    +beacon_db_password: "{{ vault_beacon_db_password }}"
    +beacon_db_port: 9001
    +#galaxy_api_key: This we will set in secrets.
    +# Information about your beacon (consider filling this out.
    +beacon_info_title: GA4GH Beacon
    +beacon_info_beacon_id: your.galaxy.beacon
    +beacon_info_description: Beacon service hosting datasets from all over the Galaxy
    +beacon_info_url: https://{{ groups['beacon_server'][0] }}/beacon/
    +beacon_info_service_group: galaxy-eu
    +beacon_info_org_name: Some Galaxy
    +beacon_info_org_description: Galaxy community
    +beacon_info_org_address: 123 Main Street, ZA
    +beacon_info_org_info: More information about the organisation than just the description can go here.
    +# Script Configuration
    +galaxy_api_url: "https://{{ groups['galaxyservers'][0] }}"
    +script_user: beacon
    +script_dir: /home/beacon/script

    Here we again use some advanced features of Ansible’s inventory system. Ansible knows the name of every hostname in the inventory. Now that we want to point the beacon configuration, either at the database which should be on beacon_server, or at Galaxy in galaxyservers, we ask the groups variable for what the inventory looks like. We use [0] to pull out the first hostname we find for both of those groups.

  5. Add the beacon-server playbook

    --- /dev/null
    +++ b/beacon-server.yml
    @@ -0,0 +1,9 @@
    +- name: Beacon Server
    +  hosts: beacon_server
    +  become: true
    +  become_user: root
    +  vars_files:
    +    - group_vars/secret.yml
    +  roles:
    +    - paprikant.beacon
  6. Run the playbook

    Input: Bash
    ansible-playbook beacon-server.yml

    TODO: Check that it works

Setting up the Importer

Now that our beacon is running, we need to get data from Galaxy to the Beacon

Hands-on: Setting up the Beacon Importer
  1. Add the beacon-import playbook

    --- /dev/null
    +++ b/beacon-import.yml
    @@ -0,0 +1,9 @@
    +- name: Beacon Importer
    +  hosts: beacon_import
    +  become: true
    +  become_user: root
    +  vars_files:
    +    - group_vars/secret.yml
    +  roles:
    +    - paprikant.beacon-importer
  2. Edit your group_vars/secret.yml and define some random passwords:

    • The API key for your account, which must be an admin

    Galaxy admin accounts are specified as a comma-separated email list in the admin_users directive of galaxy.yml . If you have set up your Galaxy server using the Galaxy Installation with Ansible tutorial, this is set to

    1. In your browser, open your Galaxy homepage
    2. Log in, or register a new account, if it’s the first time you’re logging in
    3. Go to User -> Preferences in the top menu bar, then click on Manage API key
    4. If there is no current API key available, click on Create a new key to generate it
    5. Copy your API key to somewhere convenient, you will need it throughout this tutorial

    Input: Bash
    ansible-vault edit group_vars/secret.yml
    --- a/group_vars/secret.yml
    +++ b/group_vars/secret.yml
    @@ -1,13 +1,15 @@
    +galaxy_api_key: your-galaxy-api-key
    +vault_beacon_db_password: some-super-secret-password
  3. Run the playbook

    Input: Bash
    ansible-playbook beacon-importer.yml
  4. Add the nginx routes

    --- a/templates/nginx/galaxy.j2
    +++ b/templates/nginx/galaxy.j2
    @@ -115,4 +115,14 @@ server {
     	{{ tiaas_nginx_routes }}
    +	location /beacon {
    +		proxy_pass http://{{ groups['beacon_server'][0] }}:5050;
    +		proxy_http_version 1.1;
    +		proxy_set_header Upgrade $http_upgrade;
    +		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    +		proxy_set_header X-Real-IP $remote_addr;
    +		proxy_set_header Connection "upgrade";
    +		proxy_set_header Host $host;
    +	}
  5. Run the playbook

    Input: Bash
    ansible-playbook galaxy.yml

Congratulations, you’ve set up a Beacon v1 for Galaxy! Go check it out at /beacon/ on your server.

Comment: Got lost along the way?

If you missed any steps, you can compare against the reference files, or see what changed since the previous tutorial.

If you’re using git to track your progress, remember to add your changes and commit with a good commit message!

Comment: Galaxy Admin Training Path

The yearly Galaxy Admin Training follows a specific ordering of tutorials. Use this timeline to help keep track of where you are in Galaxy Admin Training.

  1. Step 1
  2. Step 2
  3. Step 3
  4. Step 4
  5. Step 5
  6. Step 6
  7. Step 7
  8. Step 8
  9. Step 9
  10. Step 10
  11. Step 11
  12. Step 12
  13. Step 13
  14. Step 14
  15. Step 15
  16. Step 16
  17. Step 17
  18. Step 18
  19. Step 19
  20. Step 20
  21. Step 21