Upgrading a native Linux install
These instructions assume a configuration similar to the ‘One page complete Ubuntu install’ provided with release 0.8.1 and later. If you are running an older distribution, consider upgrading the operating system or migrating the service to a new host. The test system for these upgrade instructions was upgraded from 18.04 to 20.04 and then 22.04 before the OpenREM upgrade was started. If you are using a different distribution or have set up your system differently, it might be better to start afresh following or adapting the Upgrading to a new Linux server docs instead.
If upgrading to a new host, follow the Upgrading to a new Linux server docs.
This release will run on Python 3.8 or 3.9, but Python 3.10 is recommended. If a different release of Python is being used, substitute 3.10 for that version where necessary below.
If you are upgrading OpenREM on a Linux server with limited internet access, go to the Offline installation or upgrade docs.
Upgrades from 0.9.1 or earlier should review Upgrade to OpenREM 0.10.0 from 0.7.3 or later first. Upgrading to 1.0 is only possible from 0.10.0.
Preparation
Back up the database - you will need the password for openremuser
that will be in your
local_settings.py
file. You’ll need this file again later so open it in a different window:
$ less /var/dose/veopenrem/lib/python2.7/site-packages/openrem/openremproject/local_settings.py
Backup the database, in the main window:
$ pg_dump -U openremuser -d openremdb -F c -f pre-1-0-upgrade-dump.bak
Stop any Celery workers, Flower, RabbitMQ, Gunicorn, NGINX, and Orthanc (OpenREM service names will be reversed if they weren’t changed with the 0.9.1 upgrade):
$ sudo systemctl stop openrem-celery
$ sudo systemctl stop openrem-flower
$ sudo systemctl stop openrem-gunicorn
$ sudo systemctl stop rabbitmq-server
$ sudo systemctl stop nginx
$ sudo systemctl stop orthanc
Update apt and install any updates:
$ sudo -- sh -c 'apt update && apt upgrade'
Install Python 3.10 and other packages:
$ sudo apt install acl python3.10 python3.10-dev python3.10-distutils python3.10-venv python3-pip \
postgresql nginx orthanc dcmtk default-jre zip gettext
Reset the permissions for the /var/dose
folder:
$ sudo chmod -R 775 /var/dose
$ sudo chown -R $USER:openrem /var/dose
$ sudo chmod -R g+s /var/dose/*
Now find the uid
of your user and the gid
of the openrem
group:
$ id
$ getent group openrem
Take note of the uid
number and the gid
in the third field of the group information and use it in the next
command, replacing 1001
(user uid
) and 1002
(openrem
group gid
) as appropriate:
$ sudo setfacl -PRdm u:1001:rwx,g:1002:rwx,o::r /var/dose/
Create a new Python virtual environment:
$ python3.10 -m venv /var/dose/veopenrem3
Activate the virtualenv:
$ . /var/dose/veopenrem3/bin/activate
Install the new version of OpenREM
Ensure the new virtualenv is active — prompt will look like
(veopenrem3)username@hostname:~$
Upgrade Pip and install OpenREM
$ pip install --upgrade pip
$ pip install openrem==1.0.0b1
Configure the local_settings.py file
Navigate to the Python openrem folder and copy the example local_settings.py
and wsgi.py
files to remove the
.linux
and .example
suffixes:
$ cd /var/dose/veopenrem3/lib/python3.10/site-packages/openrem/
$ cp openremproject/local_settings.py{.linux,}
$ cp openremproject/wsgi.py{.example,}
Review the old local_settings.py
file that was opened earlier - see the first part of the Preparation section. Edit
the new local_settings.py
as needed - make sure you update the database NAME
, USER
and PASSWORD
, the
ALLOWED_HOSTS
list and the EMAIL
configuration and check all the other settings. Change the SECRET_KEY
from
the default:
$ nano openremproject/local_settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'openremdb',
'USER': 'openremuser',
'PASSWORD': 'mysecretpassword', # This is the password you set earlier
'HOST': '',
'PORT': '',
}
}
MEDIA_ROOT = '/var/dose/media/'
STATIC_ROOT = '/var/dose/static/'
# Change secret key
SECRET_KEY = 'hmj#)-$smzqk*=wuz9^a46rex30^$_j$rghp+1#y&i+pys5b@$'
# DEBUG mode: leave the hash in place for now, but remove it and the space (so DEBUG
# is at the start of the line) as soon as something doesn't work. Put it back
# when you get it working again.
# DEBUG = True
ALLOWED_HOSTS = [
# Add the names and IP address of your host, for example:
'openrem-server',
'openrem-server.ad.abc.nhs.uk',
'10.123.213.22',
]
LOG_ROOT = '/var/dose/log'
LOG_FILENAME = os.path.join(LOG_ROOT, 'openrem.log')
QR_FILENAME = os.path.join(LOG_ROOT, 'openrem_qr.log')
EXTRACTOR_FILENAME = os.path.join(LOG_ROOT, 'openrem_extractor.log')
# Removed comment hashes to enable log file rotation:
LOGGING['handlers']['file']['class'] = 'logging.handlers.RotatingFileHandler'
LOGGING['handlers']['file']['maxBytes'] = 10 * 1024 * 1024 # 10*1024*1024 = 10 MB
LOGGING['handlers']['file']['backupCount'] = 5 # number of log files to keep before deleting the oldest one
LOGGING['handlers']['qr_file']['class'] = 'logging.handlers.RotatingFileHandler'
LOGGING['handlers']['qr_file']['maxBytes'] = 10 * 1024 * 1024 # 10*1024*1024 = 10 MB
LOGGING['handlers']['qr_file']['backupCount'] = 5 # number of log files to keep before deleting the oldest one
LOGGING['handlers']['extractor_file']['class'] = 'logging.handlers.RotatingFileHandler'
LOGGING['handlers']['extractor_file']['maxBytes'] = 10 * 1024 * 1024 # 10*1024*1024 = 10 MB
LOGGING['handlers']['extractor_file']['backupCount'] = 5 # number of log files to keep before deleting the oldest one
# Regionalisation settings
# Date format for exporting data to Excel xlsx files.
# Default in OpenREM is dd/mm/yyyy. Override it by uncommenting and customising below; a full list of codes is
# available at https://msdn.microsoft.com/en-us/library/ee634398.aspx.
# XLSX_DATE = 'mm/dd/yyyy'
# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# In a Windows environment this must be set to your system time zone.
TIME_ZONE = 'Europe/London'
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'
DCMTK_PATH = '/usr/bin'
DCMCONV = os.path.join(DCMTK_PATH, 'dcmconv')
DCMMKDIR = os.path.join(DCMTK_PATH, 'dcmmkdir')
JAVA_EXE = '/usr/bin/java'
JAVA_OPTIONS = '-Xms256m -Xmx512m -Xss1m -cp'
PIXELMED_JAR = '/var/dose/pixelmed/pixelmed.jar'
PIXELMED_JAR_OPTIONS = '-Djava.awt.headless=true com.pixelmed.doseocr.OCR -'
# E-mail server settings - see https://docs.djangoproject.com/en/2.2/topics/email/
EMAIL_HOST = 'localhost'
EMAIL_PORT = 25
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
EMAIL_USE_TLS = 0 # Use 0 for False, 1 for True
EMAIL_USE_SSL = 0 # Use 0 for False, 1 for True
EMAIL_DOSE_ALERT_SENDER = 'your.alert@email.address'
EMAIL_OPENREM_URL = 'http://your.openrem.server'
Migrate the database
In a shell/command window, move into the openrem
folder:
$ cd /var/dose/veopenrem3/lib/python3.10/site-packages/openrem/
Prepare the migrations folder:
Rename
0001_initial.py.1-0-upgrade
to0001_initial.py
$ mv remapp/migrations/0001_initial.py{.1-0-upgrade,}
Migrate the database:
$ python manage.py migrate --fake-initial
$ python manage.py migrate remapp --fake
$ python manage.py makemigrations remapp
Rename questions
There will be some questions about fields being renamed - answer N
to all of them.
$ python manage.py migrate
$ python manage.py loaddata openskin_safelist.json
Update static files and translations
$ python manage.py collectstatic --clear
Warning about deleting all files
You will get a warning about all files in the static files location being deleted. As long as the folder is correct,
type yes
to continue.
Virtual directory users
If you are running your website in a virtual directory, you also have to update the reverse.js file.
To get the file in the correct path, take care that you insert just after the declaration of
STATIC_ROOT
the following line in your local_settings.py
(see also the sample local_settings.py.example
):
JS_REVERSE_OUTPUT_PATH = os.path.join(STATIC_ROOT, 'js', 'django_reverse')
To update the reverse.js file execute the following command:
$ python manage.py collectstatic_js_reverse
See Running the OpenREM website in a virtual directory for more details.
Generate translation binary files
$ python manage.py compilemessages
Update all the services configurations
Edit the Gunicorn systemd file WorkingDirectory
and ExecStart
:
$ sudo nano /etc/systemd/system/openrem-gunicorn.service
WorkingDirectory=/var/dose/veopenrem3/lib/python3.10/site-packages/openrem
ExecStart=/var/dose/veopenrem3/bin/gunicorn \
--bind unix:/tmp/openrem-server.socket \
openremproject.wsgi:application --timeout 300 --workers 4
Celery, Flower and RabbitMQ are no longer required for this release, so their Systemd control files can be disabled, and RabbitMQ can be removed (assuming it is not in use for any other services on this server):
$ sudo systemctl disable openrem-celery.service
$ sudo systemctl disable openrem-flower.service
$ sudo apt remove rabbitmq-server
$ sudo apt purge rabbitmq-server
Reload systemd and restart the services
$ sudo systemctl daemon-reload
Start and check Gunicorn:
$ sudo systemctl start openrem-gunicorn.service
$ sudo systemctl status openrem-gunicorn.service
Start and check NGINX:
$ sudo systemctl start nginx.service
$ sudo systemctl status nginx.service
Start and check Orthanc:
$ sudo systemctl start orthanc.service
$ sudo systemctl status orthanc.service
Registered Users error
If Orthanc fails to start, check the Orthanc log file:
$ sudo less /var/log/orthanc/Orthanc.log
If there is an error: Bad file format: The configuration section "RegisteredUsers" is defined in
2 different configuration files
this might be due to changes in the installed version of Orthanc.
Edit the main Orthanc configuration file to remove the setting, as it is now in a credentials.json
configuration file.
$ sudo nano /etc/orthanc/orthanc.json
Remove the RegisteredUsers
setting and try again:
$ sudo systemctl start orthanc.service
$ sudo systemctl status orthanc.service
If there is still an issue, check the log again. If the problem this time is due to the TCP port of the DICOM
server
, you might need to give it permission again:
$ sudo setcap CAP_NET_BIND_SERVICE=+eip /usr/sbin/Orthanc
And restart Orthanc once more.
Test the webserver
You should now be able to browse to the web interface of your upgraded OpenREM system and have a look around.
Update the DICOM Store settings
Log in to the web interface, and navigate to Config
, DICOM networking
.
The remote nodes should be correct from the old system, but the DICOM Store SCP settings will need
updating. Modify the store, and add the hostname localhost
.
After you have clicked Submit
, the status page should show the server is alive. If it isn’t, go and check the
status of Orthanc again (we may have checked it too quickly before).