Overview:
The Voice Recording Solution (VRS) includes an archival process designed to manage and maintain the storage of call recordings. The process archives recordings based on a configurable retention period and transfers them to SFTP or, from VRS 14.12.0, an S3-compatible destination (S3 / MinIO / Wasabi) for long-term storage. This ensures optimal use of storage resources and helps in compliance with data retention policies.
-
Archival Process Workflow
-
Retention Period Configuration:
Archival eligibility retention is configured via Archival Configuration Archive Days (archival_setting / retention_days). The minimum is 2 days. Related env for local/stream housekeeping is NO_OF_DEL_DAYS — do not treat NO_OF_DAYS alone as the archival retention setting.
Recordings older than the specified number of days are marked for archival.
-
Archiving Recordings:
Eligible recordings are uploaded to the configured archive destination (SFTP or S3-compatible cloud). Local removal depends on delete/purge settings.
The archival service runs periodically to ensure all eligible recordings are archived.
-
Remote path on the archive destination
Use the path from Archival Configuration: SFTP Folder Path or S3 Bucket / Prefix. Site-specific paths are allowed (for example/root/<folder>). Create and permission that configured directory on the destination host.
# Example only — use your configured Folder Path
mkdir -p /path/from/archival-configuration
chmod 777 /path/from/archival-configuration
-
Database Updates:
After archiving, the database table (v_xml_cdr) is updated: is_archived is set to 1, and from 14.12.0 the service also stamps archive_storage and archive_path so playback knows which store holds the file. From 14.12.1, each uploaded file gets its own path, and play matches the stamp to the requested leg. Rows uploaded with no CDR match may have no stamp — play then depends on the current Archival Configuration / filename.
Automatic Service Activation:
If the archival service is added in the VRS deployment docker compose file, it automatically performs its tasks as per the schedule or configuration.
Dual archival schema on fusionpbx (14.12.0+)
EFCX only. Cisco dual archival columns ship in the recording-solution skeleton (data/scripts/postgres.sql / sqlserver.sql on database vrs). EFCX does not use those scripts for archival schema — operators must run the following on the Media Server database fusionpbx.
During a new deploy, run this step in the Installation Guide (EFCX-gated step before install-efcx.sh). For upgrades from 14.11.0, see VRS Upgrade Guide from 14.11.0 to 14.12.0.
-
On the Media Server, note the database password:
cat /etc/fusionpbx/config.conf | grep database.0.password
-
Connect to
fusionpbx(enter the password when prompted; use your DB host if it is not local):
psql -h 127.0.0.1 -p 5432 -U fusionpbx -d fusionpbx
-
Run the following query in the database:
-- EFCX / fusionpbx — dual archival settings + CDR stamps
ALTER TABLE archival_setting
ADD COLUMN IF NOT EXISTS storage_type VARCHAR(20) NOT NULL DEFAULT 'sftp';
ALTER TABLE archival_setting
ADD COLUMN IF NOT EXISTS sftp_server_ip VARCHAR(255),
ADD COLUMN IF NOT EXISTS sftp_username VARCHAR(255),
ADD COLUMN IF NOT EXISTS sftp_password VARCHAR(255),
ADD COLUMN IF NOT EXISTS sftp_folder_path VARCHAR(512),
ADD COLUMN IF NOT EXISTS s3_endpoint VARCHAR(255),
ADD COLUMN IF NOT EXISTS s3_access_key VARCHAR(255),
ADD COLUMN IF NOT EXISTS s3_secret_key VARCHAR(255),
ADD COLUMN IF NOT EXISTS s3_folder_path VARCHAR(512);
UPDATE archival_setting
SET
sftp_server_ip = CASE WHEN COALESCE(storage_type, 'sftp') NOT IN ('s3','minio','wasabi')
THEN external_server_ip ELSE sftp_server_ip END,
sftp_username = CASE WHEN COALESCE(storage_type, 'sftp') NOT IN ('s3','minio','wasabi')
THEN username ELSE sftp_username END,
sftp_password = CASE WHEN COALESCE(storage_type, 'sftp') NOT IN ('s3','minio','wasabi')
THEN password ELSE sftp_password END,
sftp_folder_path = CASE WHEN COALESCE(storage_type, 'sftp') NOT IN ('s3','minio','wasabi')
THEN folder_path ELSE sftp_folder_path END,
s3_endpoint = CASE WHEN COALESCE(storage_type, 'sftp') IN ('s3','minio','wasabi')
THEN external_server_ip ELSE s3_endpoint END,
s3_access_key = CASE WHEN COALESCE(storage_type, 'sftp') IN ('s3','minio','wasabi')
THEN username ELSE s3_access_key END,
s3_secret_key = CASE WHEN COALESCE(storage_type, 'sftp') IN ('s3','minio','wasabi')
THEN password ELSE s3_secret_key END,
s3_folder_path = CASE WHEN COALESCE(storage_type, 'sftp') IN ('s3','minio','wasabi')
THEN folder_path ELSE s3_folder_path END
WHERE sftp_server_ip IS NULL
OR sftp_folder_path IS NULL
OR (storage_type IN ('s3','minio','wasabi') AND s3_endpoint IS NULL);
ALTER TABLE v_xml_cdr
ADD COLUMN IF NOT EXISTS archive_storage VARCHAR(16) NULL;
ALTER TABLE v_xml_cdr
ADD COLUMN IF NOT EXISTS archive_path VARCHAR NULL;
Environment Variables
The archival process relies on several environment variables for configuration. These variables are defined in the Docker Compose file and loaded from the specified environment file.
General Variables
|
ENV |
Name |
|---|---|
|
NO_OF_DEL_DAYS |
Local/stream housekeeping retention (days). Archival eligibility uses Archival Configuration Archive Days (minimum 2), not this env alone. |
|
DEPLOYMENT_PROFILE |
Deployment profile to distinguish between environments e.g, EFCX |
Database Configuration
|
|
|
|---|---|
|
DB_DRIVER |
JDBC driver class for database connectivity (org.postgresql.Driver) |
|
DB_ENGINE |
Database engine used by the application. postgres |
|
DB_HOST |
Hostname or IP address of the database server. 192.168.1.173 |
|
DB_NAME |
Name of the database storing call records. fusionpbx |
|
DB_USER |
Database user with read/write permissions. fusionpbx |
|
DB_PASSWORD |
Password for the database user. (from /etc/fusionpbx/config.conf) |
-
Archival Service Configuration in Docker Compose
Below is the Docker Compose configuration snippet for the archival process:
archival-process:
container_name: archival-process
image: gitlab.expertflow.com:9242/voice-recording-solution/archival-process:TAG
volumes:
- /var/lib/freeswitch/recordings:/var/lib/freeswitch/recordings
env_file:
- ${PWD}/docker/config.env
restart: always