Docker

Using docker compose

You can run SEEK in Docker together with MySQL and SOLR running in its own containers as micro-services, using Docker Compose.

You will first need Docker installed

See the Docker Compose Installation Guide for how to install Docker Compose.

Once installed, all that is needed are the docker-compose.yml and the docker/db.env files, although you can simply check out the SEEK source from GitHub - see Getting SEEK. You would be advised to change the passwords in the db.env file.

First you need to create 4 volumes

docker volume create --name=seek-filestore
docker volume create --name=seek-mysql-db
docker volume create --name=seek-solr-data
docker volume create --name=seek-cache

and then to start up, with the docker-compose.yml in your currently directory run

docker compose up -d

and go to http://localhost:3000. There may be a short delay before you can connect, especially if this is the first time and various things are being initialized.

to stop run

docker compose down

You change the port, and image in the docker-compose.yml by editing

seek:
    ..
    ..
    image: fairdom/seek:1.16
    ..
    ..
    ports:
          - "3000:3000"

Proxy through NGINX or Apache

An alternative to changing the port (particularly if running several instances on same machine), you can proxy through Apache or Nginx. E.g. for Nginx you would configure a virtual host like the following:

server {
    listen 80;
    server_name www.my-seek.org;
    client_max_body_size 2G;

    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $host:$server_port;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_pass         http://127.0.0.1:3000;
    }
}

for Apache the virtual host would include:

UseCanonicalName on
ProxyPreserveHost on
<Location />
     ProxyPass   http://127.0.0.1:3000/ Keepalive=On
     ProxyPassReverse http://127.0.0.1:3000/
</Location>

You would also want to configure for HTTPS (port 443), and would strongly recommend using Lets Encrypt for free SSL certificates.

Backup and Restore

To backup the MySQL database and seek filestore, you will need to mount the volumes into a temporary container. Don’t try backing up by copying the volumes directly from the host system. The following gives an example of a basic procedure, but we recommend you read Backup, restore, or migrate data volumes and are familiar with what the steps mean.

docker compose stop
docker run --rm --volumes-from seek -v $(pwd):/backup ubuntu tar cvf /backup/seek-filestore.tar /seek/filestore
docker run --rm --volumes-from seek-mysql -v $(pwd):/backup ubuntu tar cvf /backup/seek-mysql-db.tar /var/lib/mysql
docker compose start

and to restore into new volumes:

docker compose down
docker volume rm seek-filestore
docker volume rm seek-mysql-db
docker volume create --name=seek-filestore
docker volume create --name=seek-mysql-db
docker compose up --no-start
docker run --rm --volumes-from seek -v $(pwd):/backup ubuntu bash -c "tar xfv /backup/seek-filestore.tar"
docker run --rm --volumes-from seek-mysql -v $(pwd):/backup ubuntu bash -c "tar xfv /backup/seek-mysql-db.tar"
docker compose up -d

Note that when rolling back a version, for example from an unsuccessful upgrade, it is particularly important to remove and recreate the seek-filestore and seek-mysql-db volumes - otherwise additional files may be left around when the backup is restored over the top.

The cache and solr index don’t need backing up. Once up and running, if necessary the solr index can be regenerated with:

docker exec seek bundle exec rake seek:reindex_all

Upgrading between versions

The process is very similar to Upgrading a Basic Container.

First update the docker-compose.yml for the new version. You will be able to tell the version from the image tag - e.g for 1.16

image: fairdom/seek:1.16

using the new docker-compose.yml do:

docker compose down
docker compose pull
docker compose up -d seek db solr            # avoiding the seek-workers, which will interfere
docker exec -it seek docker/upgrade.sh
docker compose down
docker compose up -d

Moving from a standalone installation to Docker Compose

If you have an existing SEEK installation running on “Bare Metal” and would like to move to using Docker compose, we have a script that can help migrate the data. The script was created to help move some of our own services, but hasn’t been heavily tested beyond that so please use with care. Please feel free to Contribute any improvements.

First a dump of the mysql database is needed, which can be created using mysqldump

mysqldump -u<user> -p <dbname> > seek.sql

Copy both seek.sql and the filestore/ directory in to a separate directory, e.g:

mkdir /tmp/seek-migration
cp -rf filestore/ /tmp/seek-migration/
cp seek.sql /tmp/seek-migration/

The script to use can be found at https://github.com/seek4science/seek/blob/seek-1.16/script/import-docker-data.sh

Start with a clean Docker Compose setup described above. Running the script, passing the location of the directory, will drop any existing volumes, recreate new ones and populate them with the sql and filestore data.

wget https://github.com/seek4science/seek/raw/seek-1.16/script/import-docker-data.sh
sh ./import-docker-data.sh /tmp/seek-migration/

Using a sub-URI

If you wish to run SEEK under a sub-URI (e.g. https://yourdomain.com/seek/) you can use the alternative docker-compose-relative-root.yml file:

docker compose -f docker-compose-relative-root.yml up -d

To customize the sub-URI (/seek by default), change the RAILS_RELATIVE_URL_ROOT variable in that file in both the seek and seek_workers sections.

Please note if adding/changing/removing the RAILS_RELATIVE_URL_ROOT on an existing container, you will have to recompile assets and clear the cache:

docker exec seek bundle exec rake assets:precompile
docker exec seek bundle exec rake tmp:clear