(cdcs-administration)= # Administration This guide covers day-to-day administration tasks for NexusLIMS-CDCS including backups, XSLT management, user administration, and monitoring. ## Admin Commands Overview Load admin commands before running any administrative task: ```bash cd /path/to/NexusLIMS-CDCS/deployment source admin-commands.sh ``` ### Command Summary | Command | Description | |---------|-------------| | `dc-prod` | Docker Compose alias for production stack | | `admin-backup` | Backup all CDCS data | | `admin-restore ` | Restore from backup directory | | `admin-db-dump` | Create PostgreSQL database dump | | `admin-db-restore ` | Restore database from dump | | `admin-list-users` | List all users with status | | `admin-export-users` | Export users to JSON | | `admin-import-users ` | Import users from JSON | | `admin-stats` | Show system statistics | | `admin-init` | Initialize environment (superuser, schema, XSLT) | --- ## Backup and Restore ### Understanding Backup Types NexusLIMS-CDCS supports two backup approaches: | Type | Command | Use Case | |------|---------|----------| | **Application Backup** | `admin-backup` | Regular backups, includes all data | | **Database Dump** | `admin-db-dump` | Disaster recovery, PostgreSQL raw dump | **Recommendation**: Use `admin-backup` for regular backups. Use `admin-db-dump` only for disaster recovery scenarios. ### Application Backup Application backups include: - Templates (XSD schemas) - Data records (XML documents) - Binary blobs (uploaded files) - Users (Django fixtures) - XSLT stylesheets - Persistent queries ```bash source admin-commands.sh admin-backup ``` **Output:** ```text → Starting CDCS backup... → Exporting templates... ✓ Exported 1 templates to /srv/nexuslims/backups/backup_20260115_143022/templates/ → Exporting records... ✓ Exported 42 records to /srv/nexuslims/backups/backup_20260115_143022/records/ → Exporting blobs... ✓ Exported 128 blobs to /srv/nexuslims/backups/backup_20260115_143022/blobs/ → Exporting users... ✓ Exported 5 users to /srv/nexuslims/backups/backup_20260115_143022/users.json → Exporting XSLT... ✓ Exported 2 stylesheets to /srv/nexuslims/backups/backup_20260115_143022/xslt/ ✓ Backup completed: /srv/nexuslims/backups/backup_20260115_143022/ ``` Backups are stored at the path configured in `NX_CDCS_BACKUPS_HOST_PATH` (default: `/opt/nexuslims/backups/`). ### Restoring from Backup ```bash source admin-commands.sh admin-restore /opt/nexuslims/backups/backup_20260115_143022 ``` The restore command: 1. Imports templates 2. Imports records 3. Imports blobs 4. Imports users 5. Imports XSLT stylesheets ### Database Dump (Disaster Recovery) For complete disaster recovery, create a PostgreSQL dump: ```bash source admin-commands.sh admin-db-dump ``` Creates a SQL file at `$NX_CDCS_BACKUPS_HOST_PATH/db_backup_YYYYMMDD_HHMMSS.sql` ### Database Restore (Disaster Recovery) ```{warning} Database restore will **DROP and RECREATE** the entire database. All existing data will be lost! ``` ```bash source admin-commands.sh admin-db-restore /opt/nexuslims/backups/db_backup_20260115_143022.sql ``` The command requires two confirmations before proceeding. ### Automated Backup Schedule Set up a cron job for automated backups: ```bash # Create backup script cat > /opt/nexuslims-backup.sh << 'EOF' #!/bin/bash set -e cd /opt/nexuslims/NexusLIMS-CDCS/deployment source admin-commands.sh admin-backup admin-db-dump # Cleanup old backups (30 days) find /opt/nexuslims/backups -type d -name "backup_*" -mtime +30 -exec rm -rf {} \; 2>/dev/null || true find /opt/nexuslims/backups -type f -name "db_backup_*.sql" -mtime +30 -delete 2>/dev/null || true EOF chmod +x /opt/nexuslims-backup.sh # Add to crontab (daily at 2 AM) (crontab -l 2>/dev/null; echo "0 2 * * * /opt/nexuslims-backup.sh") | crontab - ``` --- ## XSLT Stylesheet Management ```{important} XSLT stylesheets are stored in the Django database. Editing the `.xsl` files alone is not enough - you must update the database. ``` ### XSLT Files | File | Purpose | |------|---------| | `xslt/detail_stylesheet.xsl` | Full record view (single record page) | | `xslt/list_stylesheet.xsl` | Search result cards (list view) | ### Update Process 1. **Edit the XSL file** in the `xslt/` directory 2. **Update the database**: **Development:** ```bash source dev-commands.sh dev-update-xslt ``` **Production:** ```bash # Re-run initialization (uploads XSLT along with schema) docker exec -it nexuslims_prod_cdcs python /srv/scripts/init_environment.py ``` Or use the update script directly: ```bash docker exec nexuslims_prod_cdcs bash /srv/scripts/update-xslt.sh ``` ### URL Patching XSLT stylesheets contain URLs for linking to instrument data and preview images. These are automatically patched from environment variables: - `XSLT_DATASET_BASE_URL` → links to instrument data files - `XSLT_PREVIEW_BASE_URL` → links to preview images See {doc}`configuration` for details. ### Verifying XSLT Updates After updating, verify in the web interface: 1. Navigate to any record 2. Check that links to data files and images work correctly 3. Inspect the HTML source to confirm URLs are correct --- ## Schema Management ### Schema File Location The NexusLIMS schema (`nexus-experiment.xsd`) is located at: - Repository: `deployment/schemas/nexus-experiment.xsd` - Container: `/srv/nexuslims/schemas/nexus-experiment.xsd` ### Updating the Schema 1. **Download latest schema** from the NexusLIMS repository: ```bash cd deployment bash scripts/update-schema.sh ``` 2. **Apply to database** by re-running initialization: ```bash docker exec -it nexuslims_prod_cdcs python /srv/scripts/init_environment.py ``` ```{note} Schema updates create a new template version. Existing records remain valid against their original template version. ``` --- ## User Management ### List Users ```bash source admin-commands.sh admin-list-users ``` **Output:** ``` admin (admin@example.com) - Active: True, Admin: True jsmith (jane.smith@example.com) - Active: True, Admin: False ``` ### Export Users Export all users to JSON for backup or migration: ```bash admin-export-users # Creates: /opt/nexuslims/backups/users_YYYYMMDD_HHMMSS.json ``` ### Import Users Import users from a JSON fixture: ```bash admin-import-users /opt/nexuslims/backups/users_20260115_143022.json ``` ### Create Superuser To create an additional superuser: ```bash docker exec -it nexuslims_prod_cdcs python manage.py createsuperuser ``` ### Reset User Password ```bash docker exec -it nexuslims_prod_cdcs python manage.py changepassword username ``` --- ## Monitoring ### System Statistics ```bash source admin-commands.sh admin-stats ``` **Output:** ``` ============================================================ NexusLIMS-CDCS System Statistics ============================================================ Users: Total: 5 Active: 5 Superusers: 1 Templates: Total: 1 - Nexus Experiment Schema (Version 1) Data Records: Total: 42 XSLT Stylesheets: Total: 2 - detail_stylesheet.xsl - list_stylesheet.xsl ============================================================ ``` ### Container Health ```bash dc-prod ps ``` All services should show `Up` and `healthy`. ### View Logs ```bash # All services dc-prod logs -f # Specific service dc-prod logs -f cdcs dc-prod logs -f postgres dc-prod logs -f caddy ``` ### Resource Usage ```bash docker stats ``` ### Database Queries For advanced troubleshooting, access the PostgreSQL shell: ```bash docker exec -it nexuslims_prod_cdcs_postgres psql -U nexuslims nexuslims ``` Example queries: ```sql -- Active connections SELECT pid, query, state FROM pg_stat_activity WHERE state != 'idle'; -- Table sizes SELECT relname, pg_size_pretty(pg_total_relation_size(relid)) FROM pg_catalog.pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC; -- Vacuum stats SELECT relname, last_vacuum, last_analyze FROM pg_stat_user_tables; ``` --- ## Maintenance Tasks ### Clear Expired Sessions ```bash docker exec nexuslims_prod_cdcs python manage.py clearsessions ``` ### Clear Redis Cache ```bash docker exec nexuslims_prod_cdcs_redis redis-cli -a $REDIS_PASS FLUSHDB ``` ### Optimize Database ```bash docker exec nexuslims_prod_cdcs_postgres vacuumdb -U nexuslims --all --full --analyze ``` ### Restart Services ```bash source admin-commands.sh dc-prod restart ``` Or restart specific services: ```bash dc-prod restart cdcs dc-prod restart caddy ``` --- ## Service Management ### Start/Stop Services ```bash source admin-commands.sh # Stop all services dc-prod down # Start all services dc-prod up -d # Stop specific service dc-prod stop cdcs # Start specific service dc-prod start cdcs ``` ### Update Images Pull latest images and restart: ```bash dc-prod pull dc-prod up -d ``` ### View Configuration Verify the resolved Docker Compose configuration: ```bash dc-prod config ``` --- ## Next Steps - {doc}`troubleshooting` - Common issues and solutions - {doc}`production` - Production deployment guide - {doc}`configuration` - Environment variable reference