Complete Archives Management
Supports accessioning, arrangement, description, preservation, and access functions within a single content management system.
ArchivesSpace is an open-source archives information management application built for archives by archivists. It provides comprehensive tools for managing and providing web access to archives, manuscripts, and digital objects. With support for accessioning, arrangement, description, preservation, and access workflows, ArchivesSpace serves as an essential component of digital infrastructure for libraries, archives, museums, and cultural heritage institutions.
Backed by a robust member community of archivists, librarians, and developers, ArchivesSpace enables organizations to adopt standards, develop shared best practices, and gain intellectual and physical control over their collections. This guide walks you through deploying ArchivesSpace on Klutch.sh using Docker.
Complete Archives Management
Supports accessioning, arrangement, description, preservation, and access functions within a single content management system.
Standards Compliant
Implements archival standards including EAD, MARC21, and DACS for interoperability and best practices.
Community Driven
Active member community contributing to development, documentation, and shared best practices.
Open Source
Free to download and use under the Educational Community License, version 2.0.
Before deploying ArchivesSpace on Klutch.sh, ensure you have the following:
ArchivesSpace consists of multiple components working together:
┌────────────────────────────────────────────────────────────────────┐│ ArchivesSpace │├────────────────────────────────────────────────────────────────────┤│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────────┐ ││ │ Staff UI │ │ Public UI │ │ Backend API │ ││ │ Port 8080 │ │ Port 8081 │ │ Port 8089 │ ││ └──────────────┘ └──────────────┘ └──────────────────────────┘ ││ ┌──────────────┐ ┌──────────────┐ ││ │ OAI-PMH │ │ Solr Admin │ ││ │ Port 8082 │ │ Port 8090 │ ││ └──────────────┘ └──────────────┘ │├────────────────────────────────────────────────────────────────────┤│ External Dependencies ││ ┌──────────────────────┐ ┌──────────────────────┐ ││ │ MySQL 8.x │ │ Solr 9.x │ ││ │ (Production DB) │ │ (Search Index) │ ││ └──────────────────────┘ └──────────────────────┘ │└────────────────────────────────────────────────────────────────────┘| Component | Port | Description |
|---|---|---|
| Staff Interface | 8080 | Administrative interface for archivists |
| Public Interface | 8081 | Public-facing discovery interface |
| Backend API | 8089 | RESTful API for programmatic access |
| OAI-PMH Server | 8082 | Open Archives Initiative Protocol for Metadata Harvesting |
| Solr Admin | 8090 | Search index administration console |
Create a Dockerfile in your project root that uses the official ArchivesSpace image with your custom configuration:
FROM archivesspace/archivesspace:latest
# Set environment variablesENV ASPACE_DB_MIGRATE=trueENV ARCHIVESSPACE_LOGS=/dev/nullENV TZ=UTC
# Expose all ArchivesSpace portsEXPOSE 8080 8081 8089 8090 8092
# The base image handles startupCMD ["/archivesspace/startup.sh"]ArchivesSpace uses a Ruby configuration file. Create a config/config.rb file to customize your deployment:
# ArchivesSpace Configuration# See: https://docs.archivesspace.org/customization/configuration/
# Database Configuration (MySQL required for production)# Replace with your actual MySQL connection detailsAppConfig[:db_url] = ENV['ASPACE_DB_URL'] || "jdbc:mysql://your-mysql-host:3306/archivesspace?useUnicode=true&characterEncoding=UTF-8&user=archivesspace&password=your-password&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"
# Solr ConfigurationAppConfig[:solr_url] = ENV['ASPACE_SOLR_URL'] || "http://your-solr-host:8983/solr/archivesspace"
# Enable indexingAppConfig[:enable_solr] = trueAppConfig[:indexer_records_per_thread] = 25
# Session ConfigurationAppConfig[:session_expire_after_seconds] = 3600
# Allow any host (configure appropriately for production)AppConfig[:allowed_hosts] = ['*']
# Public URL Configuration (update with your actual domain)AppConfig[:public_proxy_url] = ENV['ASPACE_PUBLIC_URL'] || "https://example-app.klutch.sh"AppConfig[:frontend_proxy_url] = ENV['ASPACE_FRONTEND_URL'] || "https://example-app.klutch.sh/staff"
# OAI-PMH ConfigurationAppConfig[:oai_proxy_url] = ENV['ASPACE_OAI_URL'] || "https://example-app.klutch.sh/oai"
# Enable public interfaceAppConfig[:enable_public] = true
# PUI (Public User Interface) SettingsAppConfig[:pui_page_actions_print] = trueAppConfig[:pui_page_actions_request] = true
# Branding (customize as needed)AppConfig[:pui_branding_img] = "/assets/images/archivesspace.small.png"AppConfig[:pui_branding_img_alt_text] = "ArchivesSpace - Your Institution"
# TimezoneAppConfig[:default_timezone] = "UTC"Configure ArchivesSpace through environment variables in the Klutch.sh dashboard:
| Variable | Description | Example |
|---|---|---|
ASPACE_DB_URL | Full JDBC MySQL connection URL | jdbc:mysql://host:3306/archivesspace?user=as&password=secret&... |
ASPACE_SOLR_URL | Solr instance URL with core name | http://solr-host:8983/solr/archivesspace |
| Variable | Description | Default |
|---|---|---|
ASPACE_DB_MIGRATE | Run pending database migrations on startup | true |
ASPACE_JAVA_XMX | Maximum Java heap size | -Xmx2048m |
ASPACE_PUBLIC_URL | Public interface base URL | None |
ASPACE_FRONTEND_URL | Staff interface base URL | None |
TZ | Timezone for the application | UTC |
| Variable | Description | Default |
|---|---|---|
JAVA_OPTS | Additional Java options | See below |
ASPACE_GC_OPTS | Garbage collection options | -XX:+UseG1GC -XX:NewRatio=1 |
Default JAVA_OPTS:
-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xss1024k -Djavax.accessibility.assistive_technologies=''ArchivesSpace requires MySQL 8.x for production use. You can use a managed MySQL service or deploy your own.
Database Requirements:
utf8mb4)log_bin_trust_function_creators=1 enabledCreate the database:
CREATE DATABASE archivesspace CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'archivesspace'@'%' IDENTIFIED BY 'your-secure-password';
GRANT ALL PRIVILEGES ON archivesspace.* TO 'archivesspace'@'%';
FLUSH PRIVILEGES;ArchivesSpace v4.0.0+ requires Solr 9.x for search functionality. The ArchivesSpace team provides a pre-configured Solr Docker image:
archivesspace/solr:latestIf deploying Solr separately, you’ll need to configure it with the ArchivesSpace schema. The configuration files are available in the ArchivesSpace Solr directory.
Your ArchivesSpace deployment repository should have the following structure:
archivesspace-deploy/├── Dockerfile├── config/│ └── config.rb├── plugins/│ └── (custom plugins)├── locales/│ └── (locale customizations)└── README.mdFor a more complete deployment that includes your configuration:
FROM archivesspace/archivesspace:latest
# Set environment variablesENV ASPACE_DB_MIGRATE=true \ ARCHIVESSPACE_LOGS=/dev/null \ TZ=UTC \ LANG=C.UTF-8
# Copy custom configurationCOPY config/config.rb /archivesspace/config/config.rb
# Copy any custom plugins (optional)COPY plugins/ /archivesspace/plugins/
# Copy locale customizations (optional)COPY locales/ /archivesspace/locales/
# Set proper permissionsUSER rootRUN chown -R 1000:1000 /archivesspace/config /archivesspace/plugins /archivesspace/localesUSER 1000:1000
# Expose all ArchivesSpace portsEXPOSE 8080 8081 8089 8090 8092
# Health checkHEALTHCHECK --interval=1m --timeout=5s --start-period=5m --retries=2 \ CMD wget -q --spider http://localhost:8089/ || exit 1
CMD ["/archivesspace/startup.sh"]Set up external dependencies first
Before deploying ArchivesSpace, ensure your MySQL database and Solr instance are running and accessible:
Push your repository to GitHub
Create a new repository on GitHub and push your configuration:
git initgit add .git commit -m "Initial ArchivesSpace deployment configuration"git branch -M maingit remote add origin https://github.com/yourusername/archivesspace-deploy.gitgit push -u origin mainConnect to Klutch.sh
Navigate to klutch.sh/app and sign in with your GitHub account. Click New Project to begin the deployment process.
Select your repository
Choose the GitHub repository containing your ArchivesSpace Dockerfile. Klutch.sh will automatically detect the Dockerfile in your project root.
Configure environment variables
Add the required environment variables in the Klutch.sh dashboard:
ASPACE_DB_URL - Your full MySQL JDBC connection URLASPACE_SOLR_URL - Your Solr instance URL with core nameASPACE_DB_MIGRATE - Set to trueASPACE_JAVA_XMX - Set to -Xmx2048m for productionTZ - Your preferred timezone (e.g., America/New_York)Set the internal port
Configure the internal port to 8080 for the staff interface, or 8081 for the public interface, depending on which interface you want to expose as the primary endpoint.
Add persistent storage
ArchivesSpace requires persistent storage for application data. Add a persistent volume:
| Mount Path | Size |
|---|---|
/archivesspace/data | 5 GB+ |
Deploy your application
Click Deploy to start the deployment process. The first startup may take several minutes as ArchivesSpace initializes the database schema and runs any pending migrations.
After deployment, complete the initial configuration:
Access the Staff Interface
Navigate to your deployed ArchivesSpace URL (e.g., https://example-app.klutch.sh). You should see the staff login page.
Log in with default credentials
Use the default administrator account:
adminadminCreate your first repository
From the System menu, select Manage Repositories and create your first archival repository.
Configure user accounts
Create additional user accounts with appropriate permissions for your staff members.
The staff interface (port 8080) provides tools for:
The public interface (port 8081) offers:
The backend API (port 8089) enables:
Edit config/config.rb to customize the public interface:
# Institution brandingAppConfig[:pui_branding_img] = "/assets/images/your-logo.png"AppConfig[:pui_branding_img_alt_text] = "Your Institution Name"
# Page titlesAppConfig[:pui_page_title] = "Your Archives"
# Contact informationAppConfig[:pui_email] = "archives@yourinstitution.org"AppConfig[:pui_telephone] = "555-123-4567"
# Enable/disable featuresAppConfig[:pui_page_actions_print] = trueAppConfig[:pui_page_actions_request] = trueAppConfig[:pui_page_actions_cite] = trueArchivesSpace supports plugins for extended functionality. Place plugin directories in the plugins/ folder and enable them in config/config.rb:
# Enable pluginsAppConfig[:plugins] = ['local', 'lcnaf', 'your_custom_plugin']Popular plugins include:
lcnaf - Library of Congress Name Authority File integrationaspace-oauth - OAuth authenticationCustomize interface text by adding locale files to the locales/ directory:
en: brand: title: "Your Institution Archives" welcome_message: "Welcome to our archival collections"To use a custom domain with your ArchivesSpace deployment:
Add your domain in Klutch.sh
Navigate to your project settings in the Klutch.sh dashboard and add your custom domain (e.g., archives.yourinstitution.org).
Configure DNS records
Add a CNAME record pointing to your Klutch.sh deployment:
| Type | Name | Value |
|---|---|---|
| CNAME | archives | example-app.klutch.sh |
Update configuration URLs
Update the proxy URLs in your config/config.rb or environment variables:
AppConfig[:public_proxy_url] = "https://archives.yourinstitution.org"AppConfig[:frontend_proxy_url] = "https://archives.yourinstitution.org/staff"Wait for SSL provisioning
Klutch.sh automatically provisions SSL certificates for custom domains. This may take a few minutes.
For local development and testing:
services: archivesspace: image: archivesspace/archivesspace:latest depends_on: - db - solr ports: - "8080:8080" # Staff interface - "8081:8081" # Public interface - "8089:8089" # API volumes: - app-data:/archivesspace/data - ./config:/archivesspace/config - ./plugins:/archivesspace/plugins environment: - ASPACE_DB_MIGRATE=true - ASPACE_JAVA_XMX=-Xmx2048m
db: image: mysql:8 command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --log_bin_trust_function_creators=1 ports: - "3306:3306" environment: - MYSQL_ROOT_PASSWORD=rootpassword - MYSQL_DATABASE=archivesspace - MYSQL_USER=archivesspace - MYSQL_PASSWORD=archivesspace volumes: - db-data:/var/lib/mysql
solr: image: archivesspace/solr:latest command: solr-precreate archivesspace /opt/solr/server/solr/configsets/archivesspace ports: - "8983:8983" volumes: - solr-data:/var/solr
volumes: app-data: db-data: solr-data:Start the local environment:
docker compose up -dWait for initialization (first startup may take 5-10 minutes), then access:
http://localhost:8080 (admin/admin)http://localhost:8081http://localhost:8089http://localhost:8983If ArchivesSpace fails to connect to MySQL:
Verify your MySQL connection URL format:
jdbc:mysql://host:3306/database?useUnicode=true&characterEncoding=UTF-8&user=username&password=password&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTCEnsure log_bin_trust_function_creators=1 is set in MySQL
Check that the database user has full privileges on the ArchivesSpace database
If search isn’t working:
ASPACE_SOLR_URL includes the core name (e.g., /solr/archivesspace)Initial startup can take several minutes as ArchivesSpace:
Monitor logs for the welcome message indicating successful startup.
If experiencing out-of-memory errors:
ASPACE_JAVA_XMX to -Xmx3072m or higherAfter deploying ArchivesSpace, consider: