This repository stores the definition of the UC Davis DAMS fin deployment.
A fin application deployment is a series of Github repositories each containing docker containers for various fin services. The docker containers will be built and tagged based on the defined repository tags/branchs (*see below for note on this) within config.sh.
The following repositories are (currently) used to create the UC Davis Library DAMS deployment:
- fin-server
fin-fcrepo
Fedora common repository containerfin-postgres
PostgresSQL with init scripts to be used with fcrepofin-node-utils
Middleware image containing NodeJS utilities for microservicesfin-server
Main Fin proxy serverfin-trusted-proxy
Internal fin service which can be used for admin access to fcrepo by other services
- fin-ucd-lib-server
fin-elasticsearch
Powers front end client search interfacefin-ucd-lib-server
Extendsfin-server
adding transforms for essync, registers essync and ucd-lib-client servicesfin-essync
Service to synchronize changes from fcrepo to elastic searchfin-ucd-lib-client
UC Davis DAMS front end client
- fin-service-loris
fin-loris
IIIF Image service
- fin-service-tesseract
fin-tesseract
Tesseract OCR service
- fin-cas-service
fin-cas
CAS authentication service
Additionally this repository defines:
fin-ucd-lib-server-impl
Extendsfin-ucd-lib-server
registering IIIF, Tesseract and CAS services. Adds fin env tags for all containers used in build.
*Note: When deploying to production always use respository version tags in deployment definition (config.sh). However when deploying to development environments which change rapidly as bugs are fixed and features are added, it is ok to use branches in the deployments definition. When branches are used and new images are built, the latest versions for these branches will be pulled for the build. You can kick off dev builds with the submit.sh
script to create images without changing the deployment definition.
To create a new deployment:
- First, make sure you have modified your code, commited to appropriate repository and added a new version tags to the repository.
- Update the
config.sh
file with the updated repository tags or branches. - Update the main
APP_VERSION
number inconfig.sh
- Run
./templates/generate.sh
to create a newdocker-compose.yaml
file with updated tags - Commit your changes to this repo to GitHub
- Tag your commit with the same version number as
APP_VERSION
and push tag to Github - Once a new tag is pushed to Github, Google Cloud Build will automatically create new images and push them to DockerHub
For development builds where you are using branches in the deployment definition, you can call submit.sh
to kick off new builds.
To run a fin application deployment:
- Pull this repository
git clone https://github.com/UCDavisLibrary/fin-ucd-lib-deployment
- Checkout tag for version of application you wish to run
git checkout [tag]
- Make sure you have a
.env
file in the root directory. Here is a sample:
FIN_URL=https://sandbox.dams.library.ucdavis.edu
FIN_ENV=prod
CAS_URL=https://ssodev.ucdavis.edu/cas
JWT_ISSUER=library.ucdavis.edu
JWT_SECRET=[your secret]
To use elastic search in docker for windows, you must making the following edit using the Ubuntu Subsystem for Linux (WSL) terminal:
sudo sysctl -w vm.max_map_count=262144
vm.max_map_count = 262144
Note: To enable Google Cloud Logging you must add the mount path for webapp-service-account.json
file. If you place it in the root directory, add the following to your .env
file:
GCLOUD_SERVICE_ACCOUNT_MOUNT=./webapp-service-account.json
- run
docker-compose up -d
in root directory
If you are beginning from scatch, with no saved volumes, you will also need to add your admins, so that you can access the site. Adding admins can be done from any client, there is no need to run this on the server. You will however need the server secret to login. These are the JWT_SECRET
and JWT_ISSUER
from your server environment. The following snippet shows how to add a number of admins.
me=quinn
admins=jrmerz enebeker quinn
fin login --super-user ${me}@ucdavis.edu # It wll prompt for your SECRET and ISSUER
for i in $admins; do
fin acl add-admin $i@ucdavis.edu
done
If you were already running a deployment and want to update the version of the application:
docker-compose down
Stop the applicationgit checkout [tag]
pull this repository to the desired application versiondocker-compose pull
pull the new imagesdocker-compose up -d
start the application
The fin-ucd-lib-server-impl
will contain environment variables containing repository git hashes and tags used in the build. Additionaly /fin/info
will show you these same tags as a rest endpoint.
Working on code within docker containers can provide challanges. The following setup is not required; you can build, stop and start fresh containers as you develop, though this process can be cumbersome and slow. We will use the practice of mounting local filesystem volumes into containers so code changes are applied in real time. Additionaly, if you server is being worked on and restarts are required for those changes to show, the following pattern is preferred.
In the fin-local-dev/docker-compose.yaml
file, set the services command to:
command: bash -c 'tail -f /dev/null'
This will start the container up without running the default process. Next start the cluster
cd fin-local-dev
docker-compose up -d
Finally, open a tty connection running bash to the container and start the server from within the container
docker-compose exec ucd-lib-client bash
node /server
No if you want to restart the server, you can simply type Ctrl+C
to kill the server and then run node /server
again without having to restart the entire container.
First, clone this repository to your local disk and checkout the version/tag you want to work from.
You can generate a new development docker-compose.yaml script via ./templates/generate.sh
. This will create a new docker-compose.yaml in /fin-local-dev
. Note, git ignores this yaml file so you can make local changes that won't effect other developers, those these changes will be wiped each time your run ./templates/generate.sh
.
You will need to create a .env
file in the /fin-local-dev
directory, here is a sample:
JWT_SECRET=[your secret here]
JWT_ISSUER=library.ucdavis.edu
JWT_TTL=86400
JWT_VERBOSE=false
FIN_URL=http://localhost:3000
Now, create the repositories folder inside fin-local-dev
mkdir fin-local-dev/repositories
Somewhere on disk checkout the all repositories required for this deployment for Fin. As of this writing there are five, check config.sh
for required repositories. Make sure you check each out the correct branch for each repository. Note, this part is not automated as we do not want to accidently remove any changes you may have made. It is up to you the developer to ensure your development repositories are at the same branch/tag as this deployment.
git clone https://github.com/UCDavisLibrary/fin-server
git clone https://github.com/UCDavisLibrary/fin-ucd-lib-server
# ...
Then you want to create symbolic links to each repository from the fin-local-dev/repositories
directory.
cd fin-local-dev/repositories
ln -s ../../fin-server .
ln -s ../../fin-ucd-lib-server .
# ...
Finally, create the :local-dev
tagged images used by the fin-local-dev/docker-compose.yaml
file.
./fin-local-dev/build.sh
This build script uses Docker BUILDKIT which should make subsequent builds very fast. You should never push these local-dev images to Docker Hub.
After completing the local development setup, simply:
cd fin-local-dev
docker-compose up