Database Containers =================== NL-BIOMERO uses PostgreSQL containers for persistent data storage across multiple services. Overview -------- The platform uses separate PostgreSQL instances: * **OMERO Database**: Core OMERO metadata and user data * **BIOMERO Database**: Workflow and analysis data * **Shared Configuration**: Common database management practices Key Components -------------- * **Data Persistence**: Volume management for database files * **Initialization Scripts**: Automated database setup * **Configuration Management**: Performance and security settings * **Backup Integration**: Automated backup and restore workflows Schema customization -------------------- * OMERO: The OMERO schema is managed by the OME project. NL-BIOMERO does not alter it. Only OMERO.forms interacts with OMERO data using supported APIs. * BIOMERO: Schemas are owned and created via SQLAlchemy by BIOMERO and ADI. Any schema changes or updates must go through SQLAlchemy migrations or model updates. Migration --------- Migrate to a new PostgreSQL version using pg_dump/pg_restore. The backup_and_restore scripts in this repo automate most steps and can also help migrate an existing OMERO DB into NL-BIOMERO. .. code-block:: bash # Dump from old Postgres (inside container or via exec) docker exec -t nl-biomero_database_1 \ pg_dump -Fc -U "$POSTGRES_USER" "$POSTGRES_DB" \ -f /tmp/omero.pg_dump docker cp nl-biomero_database_1:/tmp/omero.pg_dump ./backup_and_restore/backups/ # Restore into new Postgres (version upgrade) # See: backup_and_restore/restore/restore_db.sh (Bash) or restore_db.ps1 (PowerShell) ./backup_and_restore/restore/restore_db.sh --dbType omero --postgresVersion 16 Performance tuning ------------------ You can pass PostgreSQL settings to the container via the entrypoint command or environment variables. Example (Podman) enabling logging and increasing connections: .. code-block:: bash podman run -d --rm --name database \ --network=omero \ -e POSTGRES_USER=... \ -e POSTGRES_DB=... \ -e POSTGRES_PASSWORD=... \ -v /mnt/...:/var/lib/postgresql/data \ -v "$(pwd)/logs/database:/var/lib/postgresql/data/logs:Z" \ postgres:16 postgres -N 500 \ -c logging_collector=on \ -c log_directory='logs' \ -c log_filename='postgresql-%Y-%m-%d.log' \ -c log_rotation_age=1d \ -c log_rotation_size=100MB \ -c log_statement=all See the PostgreSQL documentation for the full list of tunables. Backup automation ----------------- Follow the OMERO backup/restore guidance: https://omero.readthedocs.io/en/stable/sysadmins/server-backup-and-restore.html This repository provides container-oriented helpers in backup_and_restore: * Backup: backup/backup_db.sh, backup/backup_server.sh, backup/backup_metabase.sh * Restore: restore/restore_db.sh, restore/restore_server.sh, restore/restore_metabase.sh If you mount data to disk directly, the process mirrors the OMERO docs closely. Accessing PostgreSQL -------------------- You can exec into the database containers and use psql directly. .. code-block:: bash # OMERO DB docker exec -it nl-biomero_database_1 bash psql -U "$POSTGRES_USER" # BIOMERO DB docker exec -it nl-biomero_database-biomero_1 bash psql -U "$BIOMERO_POSTGRES_USER" Common psql commands: .. code-block:: psql -- List tables \dt -- Example queries -- OMERO DB: count jobs SELECT COUNT(*) FROM job; -- BIOMERO DB: inspect recent imports (ADI orders) SELECT uuid, stage, group_name, user_name, timestamp FROM imports ORDER BY timestamp DESC LIMIT 10; -- Retry a failed ADI order by setting it back to pending UPDATE imports SET stage = 'Import Pending' WHERE uuid = '00000000-0000-0000-0000-000000000000'; Related Documentation --------------------- * `PostgreSQL Documentation `_ * `OMERO Database Documentation `_