General outline
- Spin up machine
a. If mounting drives for fedora-data or for the tmp directory for migration, make sure to change the owner to tomcat7 (sudo chown tomcat7:tomcat7 folder) - Deploy Sufia
- Ensure apache is off
- Activate maintenance mode on old server
- Move over minter
- Fedora Export - see below
- migrate postgres
- Fedora Import - see below
- run (currently nonexistent) verification job
- migrate dump.rdb
- Reindex solr
Box Build changes
The current build scripts in Ansible have problems with two changes we're making to the new boxes.
- Migration from Postgresql 9.3 to 9.5
- Moving to Fedora 4.7
Postgres
- Remove the old version of postgres:
- sudo apt-get purge postgresql*
- Create the file /etc/apt/sources.list.d/pgdg.list
- Add the line deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main to that
- Add the repo key with this command
- wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
- sudo apt-get update
- sudo apt-get install postgresql-9.5
- Log in as postgres and enter psql
- sudo su postgres
- psql
- In Postgres create the chf_hydra and fcrepo databases
- CREATE DATABASE chf_hydra;
- CREATE DATABASE fcrepo;
- In Postgres create the needed users
- CREATE USER chf_pg_hydra WITH PASSWORD 'SEE ANSIBLE GROUPVARS/ALL';
- CREATE USER trilby WITH PASSWORD 'porkpie2';
- Grant each user access to their table
- GRANT Create,Connect,Temporary ON DATABASE chf_hydra TO chf_pg_hydra;
- GRANT All Privileges ON DATABASE fcrepo TO trilby;
- Set the user password for postgres
- \password postgres
- Enter password from groupvars/all
- sudo nano /etc/postgresql/9.5/main/pg_hba.conf
- Change the sections under "Database administrative login by Unix domain socket"
- peer should be set to md5 for
- local all postgres
- local all all
- host all all
- peer should be set to md5 for
- Restart postgres, try to log in with
- psql -U postgres
- If it lets you use the password, it works!
Fedora
- Stop Tomcat
- sudo service tomcat7 stop
- Replace the current /etc/default/tomcat7 with
# A backup of the original file with addition options is at /etc/default/tomcat7.bak
TOMCAT7_USER=tomcat7
TOMCAT7_GROUP=tomcat7
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
#Postgres
JAVA_OPTS="-Dfcrepo.home=/opt/fedora-data -Dfcrepo.modeshape.configuration=classpath:/config/jdbc-postgresql/repository.json -Dfcrepo.postgresql.username=trilby -Dfcrepo.postgresql.password=porkpie2 -Dfcrepo.postgresql.host=localhost -Dfcrepo.postgresql.port=5432 -Djava.awt.headless=true -XX:+UseG1GC -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:MaxPermSize=128M -Xms512m -Xmx4096m -Djava.util.logging.config.file=/etc/tomcat7/logging.properties -server"
- Start Tomcat
- sudo service tomcat7 start
Fedora export
In sufia 6 instance:
- Run audit script
RAILS_ENV=production bundle exec sufia_survey -v
- Run json export
$ RAILS_ENV=production bundle exec sufia_export --models GenericFile=Chf::Export::GenericFileConverter,Collection=Chf::Export::CollectionConverter
- Open up fedora port to the other server so it can grab the binaries
- Change all the 127.0.0.1 URIs to reflect actual host, e.g.
$ find tmp/export -type f -name "*.json" -print0 | xargs -0 sed -i "s/127\.0\.0\.1/staging.hydra.chemheritage.org/g"
- Move the resulting directory full of exported data from tmp/export to the new server's tmp/import (or wherever desired; this can be provided to the import script)
$ cd tmp; tar -czf json_export_201611141510.tgz export
- Then from your own machine:
$ scp staging:/opt/sufia-project/current/tmp/json_export_201611141510.tgz new_box_ip:/opt/sufia-project/current/tmp/.
Fedora import
On sufia 7 instance:
- Mount the /dev/xvdh drive on the
- unpack the exported json files
cd opt/sufia-project/current/tmp/tar -xzf json_export_201611141510.tgzmv export import
- configure sufia6_user and sufia6_password in config/application
- run the import
$ RAILS_ENV=production bundle exec sufia_import -d tmp/import --json_mapping Chf::Import::GenericFileTranslator=generic_file_
- You can use the little bash script I wrote to create batches of files if you want. It's at /opt/sufia-project/batch_imports.sh
$ RAILS_ENV=production bundle exec sufia_import -d /opt/sufia-project/import/gf_batch_0 --json_mapping Chf::Import::GenericFileTranslator=generic_file_
Postgres export/Import
On Staging
- Run the following to generate the export.
pg_dump -U postgres chf_hydra -Fp > chf_hydra_dump.sql
On Migration
From your machine run
scp -3 -i /path/to/test.pem ubuntu@staging:~/chf_hydra_dump.sql ubuntu@new_box_ip:~
- Run this command to get into postgres (password for user is stored elsewhere)
psql -U postgres
- Inside Postgres generate the database and required permissions
CREATE DATABASE chf_hydra;
GRANT Create,Connect,Temporary ON DATABASE chf_hydra TO chf_pg_hydra
- Then enter \q to quit
- Finally import the data you copied over with scp
psql _U postgres chf_hydra < chf_hydra_dump.sql
How to check the statefile
There are 3 parts to the state: sequence, counters, and seed. You need the correct combination of all three in order to have the right state. However, if you know you have two valid state files with the same origin you can do a rough comparison of their equivalence just by checking the sequence. To check sequence in our 7.2-based application:
$ cd /opt/sufia-project/current$ bin/rails c production> sf = ActiveFedora::Noid::Minter::File.new> state = sf.read> state[:seq]
To check in our 6.7-based application:
$ cd /opt/sufia-project/current$ bin/rails c production> sm = ActiveFedora::Noid::SynchronizedMinter.new> state = {}> ::File.open(sm.statefile, ::File::RDWR|::File::CREAT, 0644) do |f|> f.flock(::File::LOCK_EX)> state = sm.send(:state_for, f)> end> state[:seq]
To check sequence on a file that's not in the default location, pass the template and the filename when you create the object with 'new', e.g:
> sm = ActiveFedora::Noid::SynchronizedMinter.new(".reeddeeddk", "/var/sufia/minter-state")
Misc.
Postgres
You can get a list of all tables and fields with the command:
SELECT * FROM information_schema.columns WHERE table_schema = 'public'
Cleanup
To clean up a server for a new migration test, take the following steps.
- Stop Tomcat and Solr
- Remove all the folders in /opt/fedora-data.
- Remove all the files in /var/solr/data/collection1/data/index/, and /var/sufia/derivatives
- Remove all the upload files in the tmp directory of the version of sufia used.
- Enter into postgres (psql -U postgres)
- Drop the fcrepo database (DROP DATABASE fcrepo;)
- Build a new fcrepo database (CREATE DATABASE fcrepo;)
- Grant the fcrepo user (currently tribly until we get a better user) all privileges on fcrepo. (grant all privileges on fcrepo to tribly;)
- Restart tomcat and solr