digital-curation-manager
Science Score: 44.0%
This score indicates how likely this project is to be science-related based on various indicators:
-
✓CITATION.cff file
Found CITATION.cff file -
✓codemeta.json file
Found codemeta.json file -
✓.zenodo.json file
Found .zenodo.json file -
○DOI references
-
○Academic publication links
-
○Academic email domains
-
○Institutional organization owner
-
○JOSS paper metadata
-
○Scientific vocabulary similarity
Low similarity (8.7%) to scientific vocabulary
Repository
Basic Info
- Host: GitHub
- Owner: lzv-nrw
- License: mit
- Language: Python
- Default Branch: main
- Size: 1.28 MB
Statistics
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
- Releases: 0
Metadata Files
README.md
Digital Curation Manager
This is a meta-repository for the software system Digital Curation Manager (DCM) developed in the context of the LZV.nrw-initiative.
Software architecture
The following diagram visualizes the top level of the DCM's software architecture:

Repositories
The following is a comprehensive list of related repositories * APIs * Import Module API * Object Validator API * IP Builder API * Preparation Module API * SIP Builder API * Transfer Module API * Job Processor API * Backend API * Apps * Import Module * Object Validator * IP Builder * Preparation Module * SIP Builder * Transfer Module * Job Processor * Backend * Frontend * libraries/other * common * database * OAI-PMH-extractor * legacy libraries * s11n * metadata-mapper * bag-builder * bag-validator
Install packages locally
To install python-packages associated with this project, configure pip to use the extra-index-url https://zivgitlab.uni-muenster.de/api/v4/projects/9020/packages/pypi/simple.
This can be achieved, for example, by entering
pip install --extra-index-url https://zivgitlab.uni-muenster.de/api/v4/projects/9020/packages/pypi/simple dcm-common
Additional requirements
Some service components, like for example the Object Validator's JHOVE-plugin, need additional software to be installed. Please refer to the relevant project-READMEs for details: * Object Validator: JHOVE * Transfer Module: openssh + rsync
Run locally
A demo-configuration for the application can be run locally by using the contents of the python/-directory.
Simply change into that directory, install the required dependencies, and run the starter-script:
cd python
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python3 run.py
After all services have started, the frontend web-client is hosted at http://localhost:8088.
By default, a demo-data set will be loaded including an administrator (username: admin; pw: admin) and a few curator-users (see backend-documentation for details).
API-tests can be run as described below.
All data will be generated in the data subdirectory.
Afterwards, the execution can be stopped with CTRL+C.
Alongside the actual DCM-services, a stub-server for the archive system is deployed which simulates relevant parts of the ExLibris Rosetta-REST-API (see also this description).
Docker
This repository contains Dockerfiles for building all DCM core- as well as supplementary-services (with the latter only intended to be used in a test-instance; see details here).
It also contains both a compose.yml-file providing a sample-configuration of the system as well as a Makefile that can be used to build images manually.
Run with docker compose
The compose.yml-file located in the docker/-directory can be used to view a demo or as a starting point for configuring a custom instance of the DCM.
To use this configuration, first create a volume with
docker volume create dcm_file_storage
Then, start up the system by changing into the docker/-directory and entering
docker compose up
After all services have started, the frontend web-client is hosted at http://localhost:8088.
API-tests can be run as described below.
The file compose.yml defines both build and image for all services.
To force a rebuild after an initial run, enter docker compose up --build or use the provided Makefile to build specific images (see here).
To fully shut down the system and remove containers, first stop the process and then enter
docker compose down
Manually build docker images
This repository contains a Makefile that can be used to simplify a manually building docker images.
To start the build process, navigate to the docker/-directory and run
make all
for all images used in the compose-file or
make dcm
for only the images of DCM-microservices.
The Makefile also defines targets for all individual images.
Additionally custom flags for the docker build-commands can be set via the DFLAGS-flag.
To rebuild, e.g., the Import Module-image without using the cache, enter
make import-module DFLAGS="--no-cache"
More specifically, images can be tagged with a version by setting the variable TAG like
make import-module TAG=latest
which generates an image named lzvnrw/import-module:latest (as opposed to the default lzvnrw/import-module).
The Dockerfiles also accept the BUILD_VERSION_SELECTOR-build arg.
This can be used to select a specific python package version of the respective application, e.g.
make import-module DFLAGS="--build-arg BUILD_VERSION_SELECTOR='>=1.0.2,<1.1'"
Miscellaneous images
To allow running a comprehensive demo, some additional services are required (see target all when building images).
In the following, a brief description of the options for environment-configuration are given.
lzvnrw/queue-registry-notifications
Combined job queue-, job registry-, and notifications service-solution that is recommended in order to allow scaling the DCM-microservices horizontally. This service defines HTTP-APIs to be used by individual workers as a common job-queue and similar resources.
Environment configuration options:
* X_MOUNT_POINT: where X is either QUEUE or REGISTRY; job queue and registry; specify the location where JSON-documents should be written; if omitted, an in-memory database-backend is used
* NOTIFICATION_REGISTRY: notification-service user-registry; specify the location where JSON-documents should be written; if omitted, an in-memory database-backend is used
* NOTIFICATION_ABORT_DB: notification-service abort-subscriptions; specify the location where JSON-documents should be written; if omitted, an in-memory database-backend is used
lzvnrw/rosetta-stub
Minimal flask app that can be used as a stub for a part of the Rosetta REST-API (Deposit Web Services and SIP Processing Related Web Services).
Environment configuration options:
* ROSETTA_STUB_OUT: specify the working directory for the stub-server (used to store temporary files; works in-memory if not set)
Test
UI-Test
The easiest way to test the DCM-functionality is by using the UI.
To this end,
1. log in as the user einstein with password relativity,
1. switch to the Jobs-tab,
1. click on the run-button for the Demo-Job 1-configuration,
1. wait for the job to complete and check the results presented in the modal.

API-Test
This section provides some curl-commands that can be issued with an instance of the DCM to test the setup via the backend-API.
These tests are tuned to the configurations given in the demo-setups for native or containerized execution.
Note that for the containerized version, by default, only the Backend- and Frontend-services are exposed to the local machine via the ports 8086 and 8088, respectively.
First start the service-network with
docker compose up
To test whether everything is ready use
curl -X 'GET' \
'http://localhost:8086/status' \
-H 'accept: application/json'
On a positive response, continue by manually submitting a job for execution (included in pre-configured demo):
curl -X 'POST' \
'http://localhost:8086/job' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"id": "250270b2-141e-35be-99a8-fe5633b6273e"
}'
A job-token is returned that enables to collect the (current) report-document via
curl -X 'GET' \
'http://localhost:8086/job?token=<token-value>' \
-H 'accept: application/json'
Refer to the Backend API for more options.
Contributors
- Sven Haubold
- Orestis Kazasidis
- Stephan Lenartz
- Kayhan Ogan
- Michael Rahier
- Steffen Richters-Finger
- Malte Windrath
- Roman Kudinov
Owner
- Name: LZV.nrw
- Login: lzv-nrw
- Kind: organization
- Location: Germany
- Website: https://www.lzv.nrw
- Repositories: 1
- Profile: https://github.com/lzv-nrw
Citation (CITATION.cff)
cff-version: 1.2.0
title: Digital Curation Manager
abstract: A pre-ingest tool for the streamlined validation, preparation and submission of digital objects into digital preservation systems.
version: 2025.08.0
url: 'https://github.com/lzv-nrw/digital-curation-manager'
message: If you use this software, please cite it as below.
type: software
authors:
- given-names: Michael
family-names: Rahier
email: michael.rahier@uni-muenster.de
affiliation: University and State Library of Münster
- given-names: Stephan
family-names: Lenartz
email: lenartz@ub.uni-koeln.de
affiliation: University and City Library of Cologne
- given-names: Steffen
family-names: Richters-Finger
orcid: 'https://orcid.org/0000-0003-2080-4949'
email: srichters@uni-muenster.de
website: 'https://github.com/RichtersFinger'
affiliation: University and State Library of Münster
- given-names: Orestis
family-names: Kazasidis
orcid: 'https://orcid.org/0000-0002-1350-7674'
email: orestis.kazasidis@uni-muenster.de
website: 'https://www.researchgate.net/profile/Orestis-Kazasidis'
affiliation: University and State Library of Münster
- given-names: Kayhan
family-names: Ogan
email: kayhan.ogan@hbz-nrw.de
website: 'https://github.com/KayhanOgan'
affiliation: North Rhine-Westphalian Library Service Centre (hbz)
- given-names: Malte
family-names: Windrath
- given-names: Roman
family-names: Kudinov
email: kudinov@ub.uni-koeln.de
website: 'https://github.com/kudinovR'
affiliation: University and City Library of Cologne
- given-names: Sven
family-names: Haubold
affiliation: University and State Library of Münster
keywords:
- digital preservation
- long-term preservation
- pre-ingest
- submission application
- object validation
- Ex Libris Rosetta
publisher:
- name: LZV.nrw
website: 'https://www.lzv.nrw'
license: MIT
GitHub Events
Total
- Push event: 3
- Public event: 1
- Create event: 2
Last Year
- Push event: 3
- Public event: 1
- Create event: 2