- Removed InfluxDB from deployment infrastructure (service, backup/restore, provisioning).
- The following countryconfig endpoints have been removed #11899:
GET /validators.jsGET /conditionals.jsGET /dashboards/queries.jsonGET /formsPOST /event-registrationPOST /tracking-idGET /record-notification
- The following countryconfig endpoints have been renamed to sit under the
/config/namespace:Old path New path GET /workqueueGET /config/workqueuesGET /application-configGET /config/applicationGET /locationsGET /config/locationsGET /rolesGET /config/rolesGET /usersGET /config/usersGET /eventsGET /config/events - Switch to docker.io/chumaky/postgres_mongo_fdw:17.6_fdw5.5.2 image to support
mongo_fdw. This is required for the legacy user migrations to work. It will be switched back to the official postgres image in a future release. - A new service
legacy-data-migrationwhich runs the same migration image but with themigrate-legacy-dataflag and with the following new environment variables:- EVENTS_SUPERUSER_POSTGRES_URL
- MONGO_HOST
- MONGO_PORT
- MONGO_USERNAME
- MONGO_PASSWORD
- MONGO_REPLICA_SET
The default values for these variables have been added to the docker-compose.deploy.yml file. They should work out of the box for most deployments, but please ensure to set them correctly if you have a custom MongoDB setup.
- The auth service is no longer published on its own
auth.{{hostname}}subdomain — it is reachable only through the gateway atgateway.{{hostname}}/auth/*. The auth Traefik route and theLOGIN_URL,COUNTRY_CONFIG_URL_EXTERNAL, andCLIENT_APP_URLenv vars have been removed from theauthservice, andAUTH_HOSTis no longer provisioned. Remove theauth.*DNS record and TLS certificate from your deployment.
- V2 certificate SVG templates now use the
$joinhelper for location hierarchies, replacing hardcoded comma separators. Empty/undefined levels are automatically filtered, preventing leading or trailing commas. - Mother's address in
v2.birth-certificate-certified-copy.svgnow uses theadministrativeHierarchyconvenience variable ({{$lookup $declaration "mother.address.administrativeHierarchy"}}) instead of individual fields. - Docker swarm to Kubernetes migration script #10858, #10787
- Create index for analytics.event_actions.event_id field #12182
- Change reindex from stream to batch API to avoid timeouts #11877
- Introduced page-level
requireCompletionToContinuein birth and death event config, to enforce full completion before moving to the next page, and updated navigation logic accordingly.
- Certificate templates now support multi-page SVGs using ..., allowing implementors to configure and render multi-page certificates.
- Birth certificate PDF export now omits header, footer, and QR code; example SVG updated for security-paper templates.
- Remove Unused Scopes: Removed
RECORD_PRINT_RECORDS_SUPPORTING_DOCUMENTSandRECORD_EXPORT_RECORDSscopes fromREGISTRATION_AGENT,LOCAL_REGISTRARandNATIONAL_REGISTRAR
- Render number of copies printed count on a certificate template. #7586
- Certificate Template Conditionals: Added support for conditional filtering of certificate templates based on declaration form data and event metadata using JSON Schema validation. Templates can now be dynamically shown or hidden based on specific criteria such as demographics, registration status, action history, and regional variations. Includes helper functions for improved readability and maintainability. See Certificate Template Conditionals documentation for implementation details. #7585
-
Upgrade node version to 22
This version enforces environment to have Node 22 installed (supported until 30 April 2027) and removes support for Node 18 for better performance and using new features offered by NodeJS
- Use nvm to upgrade your local development environment to use node version
22.x.x. - Add conditions for the certified copy certificate to ensure it's only available to children who are 1 year or older. #9684
- Available disk space in root file system alert adjusted to fire when 20GB are remaining, rather than when diskspace usage is at 70%.
- Use nvm to upgrade your local development environment to use node version
-
Upgraded MinIO to RELEASE.2025-06-13T11-33-47Z and MinIO Client (mc) to RELEASE.2025-05-21T01-59-54Z and ensured compatibility across both amd64 and arm64 architectures.
-
Remove the remnants of OpenHIM from the backup & restore scripts. #9732
-
Store system monitoring data for 1 month #10515
-
Restricted filesystem usage for journal service and file rotation strategy #10518)
-
Tiltfile: Improved Kubernetes support for development environment #10672
- Allow non-interactive upgrades with apt #10204
- Don't restart events service after data cleanup #10704
- Ensure that place of birth/death only shows active facilities/offices on the form #9311
- Added a local virtual machine setup for testing Ansible playbooks locally (on MacOS and Ubuntu ). Check provision.ipynb for more details.
- Upgrade ELK stack to a AGPLv3 licensed version 8.16.4 #8749
- Added Build summary and refactored deployment workflow to be more clear #6984
- Build OpenCRVS release images for arm devices #9455
- Introduced
single_nodevariable in inventory files to define whether single-node clusters are allowed, set to false in production to enforce use of at least a two-node cluster. #6918 - Github runners upgraded to latest Ubuntu LTS release 24.04 #7045 and apply sticky node version from .nvmrc #423
- Updated
seed-data.ymlGitHub Actions workflow to use the newdata-seederDocker image instead of cloning the entireopencrvs-corerepository. This improves CI performance and simplifies the data seeding process. #8976
- Added
swarmtag to all tasks within theswarm.yamlplaybook, previously it was missing. #9252 - Restrict supported key exchange, cipher and MAC algorithms for SSH configuration #7542
- Remove special characters from role ids on generation #10049
No changes
- A configuration example of how to use middle names in a supported way has been added, inspired by #9369
- InfluxDB
max-values-per-tagis now set to unlimited to temporarily fix the following error when clearing data from a deployed environment
partial write: max-values-per-tag limit exceeded (100000/100000)
- Added
user.update:my-jurisdictionscope to Local System Admin to allow editing of users in jurisdiction #732
- Time field 12-hour format: To enable the 12-hour (AM/PM) format of the
TimeField, set theuse12HourFormatproperty totrue. #8336{ name: 'time', custom: true, type: 'TIME', use12HourFormat: true, ...otherProp } - Control over allowed user creation/update: user.create[role=role_a|role_b] & user.update[role=role_a|role_b] can be used to control users of which role can be created/updated by users of a certain role.
- Roles with the following scopes:
USER_CREATE, USER_CREATE_MY_JURISDICTION&USER_UPDATE, USER_UPDATE_MY_JURISDICTIONneed to have theuser.create[role=role_a|role_b]&user.update[role=role_a|role_b]scopes added to them (replace role_a|role_b with the role IDs of your selection) in order to work as expected. If you are using custom roles, please make sure to update them accordingly.
- "Match all" section should be present after "Match User..." in sshd_config #653
- Use yarn cache in test workflow & read the version to use from .nvmrc
In order to make the upgrade easier, there are a couple of steps that need to be performed which will make the codebase ready for the upgrade:
-
Run this command from the root of the countryconfig repository
curl https://raw.githubusercontent.com/opencrvs/opencrvs-countryconfig/release-v1.7.0/src/upgrade-to-1_7.ts | npx ts-node -T --cwd ./srcIt will remove
roles.csvand generate aroles.tsfile. It will also update the corresponding role column indefault-employees.csv&prod-employees.csvwhile adding the corresponding translations inclient.csv. The employee files are only used when seeding new environments, if you already have a v1.6.x of OpenCRVS deployed, the data in the environment will automatically get migrated after deploying the upgrade. The changes in these two files are made to keep the roles in sync with your previously deployed environments, if any. -
After pulling in the v1.7.0 changes reject the changes incoming to
roles.ts,default-employees.csv&prod-employees.csvfiles as we used the script above to auto-generate them.The
roles.tsfile now defines all the roles available in the system. New roles can be added & existing roles can be customized by giving them different scopes.N.B. The default roles generated in the
roles.tsfile during migration should not be removed to maintain backwards compatibility
INFORMANT_SIGNATURE&INFORMANT_SIGNATURE_REQUIREDare now deprecated- Existing implementations relying on database-stored SVGs need to be updated to use the new configuration-based approach. Default certificate templates must be created for each event type, following the convention
${event}-certificateas the certificate template ID. - Roles The previous
roles.csvfile has been deprecated. It will get removed once you run the upgrade command before pulling in the v1.7 changes. The command automatically generates aroles.tsfile which can be used as a baseline to configure the roles as per your requirements. - Github runners upgraded to latest Ubuntu LTS release 24.04 #7045 and apply sticky node version from .nvmrc #423
- Update the translations for System user add/edit form,
Last nametoUser's surnameandFirst nametoUser's first nameto make them less confusing for system users #6830 - User scopes Introduce granular scopes to grant specific permissions to a particular role. The specifics about the introduced scopes can be found here: Link to scopes description file
- Refactored certificate handling: SVGs are no longer stored in the database; streamlined configurations now include certificate details, and clients request SVGs directly via URLs.
- Add
isAgeInYearsBetweenvalidator to enable validation that will constraint a date to be only valid if it falls within a specified date range. TheisInformantOfLegalAgevalidator is now deprecated and removed in favor ofisAgeInYearsBetweenvalidator #7636 - Add constant.humanName to allow countries to customise the format of the full name in the system for
system usersandcitizense.g{LastName} {MiddleName} {Firstname}, in any case where one of the name is not provided e.g noMiddleName, we'll simply render e.g{LastName} {FirstName}without any extra spaces if that's the order set incountry-config. #6830
- Auth token, ip address, remote address, mobile number, email redacted/masked from server log
- Optimized deployment times by making docker images download in parallel.
- Country alpha3 ISO code now is derived from variables to the Docker Compose files and don't need to be hard coded
- Protect individual certificate endpoint with token
- Kibana disk space alerts now work regardless of your disk device names. Alerts listen devices mounted both to
/and/data(encrypted data partition) - "Publish release" pipeline now correctly uses the "Branch to build from" value as the branch to be tagged. Previously it tried tagging "master". "Release tag" is also now used as the release version as is instead of it being read from
package.json. - Backup process now doesn't require internet connection to download docker images thus working more reliably when internet connections are unreliable. Previously non-active images were cleaned nightly, now we only do it as part of deployment. #7896
- We make sure that the automatic cleanup job only runs before deployment (instead of cron schedule cleanup).
- Previously it was possible MongoDB replica set and users were left randomly uninitialised after a deployment. MongoDB initialisation container now retries on failure.
- On some machines 'file' utility was not preinstalled causing provision to fail. We now install the utility if it doesn't exist.
Caution
All Metabase configuration that is not persisted into metabase.init.db.sql will be cleared as part of upgrading to OpenCRVS 1.7.0 and on all proceeding deployments!
-
Metabase data is no longer backed up by the default OpenCRVS country configuration. This was done to ensure Metabase can properly be started up as part of OpenCRVS deployment, even when there has been a Metabase version upgrade. To learn more about how Metabase should be configured in a persistent manner, please refer our documentation on 4.2.5.2 Configuring Metabase Dashboards #8043
-
Reset environmentgithub action infrastructure/clear-all-data.sh now wipes all elasticsearch indices #583
action.action,Label for action button,Action
action.archive,Label for archive record button in dropdown menu,Archive declaration
action.assignee,Label for asignee,Assigned to {name } at {officeName}
action.correct,Label for correct record button in dropdown menu,Correct record
action.issue,Label for reinstate issue button in dropdown menu,Issue certificate
action.print,Label for reinstate print button in dropdown menu,Print certified copy
action.reinstate,Label for reinstate record button in dropdown menu,Reisntate declaration
action.review.correction,Label for review correction in dropdown menu,Review correction request
action.review.declaration,Label for review declaration button in dropdown menu,"Review {isDuplicate, select, true{potential duplicate} other{declaration}}"
action.update,Label for reinstate update button in dropdown menu,Update declaration
action.view,Label for view button in dropdown menu,View {recordOrDeclaration}
advancedSearch.form.recordStatusValidated,Option for form field: status of record,Validated
advancedSearch.form.timePeriodHelperText,Helper text for input Time period,Period of time since the record status changed
advancedSearch.form.timePeriodLabel,Label for input Time period,Time period
advancedSearchResult.pill.timePeriod,The label for time period in active advancedSearchParams,Time period
certificate.selectTemplate,Select certificate template,Type
certificate.selectedTemplate,Selected certificate template,Selected certificate template
certificates.birth.certificate,Birth Certificate,Birth Certificate
certificates.birth.certificate.copy,Birth Certificate Certified Copy,Birth Certificate Certified Copy
certificates.birth.registration.receipt,Birth Registration Receipt,Birth Registration Receipt
certificates.death.certificate,Death Certificate,Death Certificate
certificates.death.certificate.copy,Death Certificate Certified Copy,Death Certificate Certified Copy
certificates.marriage.certificate,Marriage Certificate,Marriage Certificate
certificates.marriage.certificate.copy,Marriage Certificate Certified Copy,Marriage Certificate Certified Copy
changeModal.cancel,The label for cancel button of change modal,Cancel
changeModal.continue,The label for continue button of change modal,Continue
changeModal.description,The description for change modal,A record will be created of any changes you make
changeModal.title,The title for change modal,Edit declaration?
config.emailAllUsers.subtitle,Subtitle for email all users,This email will be sent to all users who are active. Emails will be sent over the next 24 hours. Only one email can be sent per day
constants.humanName,Formatted full name, {lastName} {middleName} {firstName}
event.history.timeFormat,"MMMM dd, yyyy · hh.mm a","MMMM dd, yyyy · hh.mm a"
event.tennis-club-membership.action.declare.form.label,This is what this form is referred as in the system,Tennis club membership application
event.tennis-club-membership.action.declare.form.section.recommender.field.firstname.label,This is the label for the field,Recommender's first name
event.tennis-club-membership.action.declare.form.section.recommender.field.id.label,This is the label for the field,Recommender's membership ID
event.tennis-club-membership.action.declare.form.section.recommender.field.surname.label,This is the label for the field,Recommender's surname
event.tennis-club-membership.action.declare.form.section.recommender.title,This is the title of the section,Who is recommending the applicant?
event.tennis-club-membership.action.declare.form.section.who.field.dob.label,This is the label for the field,Applicant's date of birth
event.tennis-club-membership.action.declare.form.section.who.field.firstname.label,This is the label for the field,Applicant's first name
event.tennis-club-membership.action.declare.form.section.who.field.surname.label,This is the label for the field,Applicant's surname
event.tennis-club-membership.action.declare.form.section.who.title,This is the title of the section,Who is applying for the membership?
event.tennis-club-membership.action.declare.form.version.1,This is the first version of the form,Version 1
event.tennis-club-membership.action.declare.label,This is shown as the action name anywhere the user can trigger the action from,Send an application
event.tennis-club-membership.label,This is what this event is referred as in the system,Tennis club membership application
exitModal.cancel,The label for cancel button in exit modal,Cancel
exitModal.exitWithoutSaving,The title for exit without saving modal,Exit without saving changes?
exitModal.exitWithoutSavingDescription,The description for exit without saving modal,You have unsaved changes on your declaration form. Are you sure you want to exit without saving?
form.field.label.informantRelation.other,,Other ({otherInformantType})
form.field.label.userFirstName,,User's first name
form.field.label.userSurname,,User's surname
form.section.label.timePeriodLast30Days,Label for option of time period select: last 30 days,Last 30 days
form.section.label.timePeriodLast7Days,Label for option of time period select: last 7 days,Last 7 days
form.section.label.timePeriodLast90Days,Label for option of time period select: last 90 days,Last 90 days
form.section.label.timePeriodLastYear,Label for option of time period select: last year,Last year
integrations.type.nationalId,Label for national id,National id
navigation.my-drafts,My drafts label in navigation,My drafts
print.certificate.collector.form.error.template,Form level error for collector form template type,Please select certificate type
registerModal.cancel,The label for cancel button of register modal,Cancel
registerModal.description,The description for register modal,The declarant will be notified of this correction and a record of this decision will be recorded
registerModal.register,The label for register button of register modal,Register
registerModal.title,The title for register modal,Register the member?
rejectModal.archive,The label for archive button of reject modal,Archive
rejectModal.cancel,The label for cancel button of reject modal,Cancel
rejectModal.description,The description for reject modal,Please describe the updates required to this record for follow up action.
rejectModal.markAsDuplicate,The label for mark as duplicate checkbox of reject modal,Mark as a duplicate
rejectModal.sendForUpdate,The label for send For Update button of reject modal,Send For Update
rejectModal.title,The title for reject modal,Reason for rejection?
reloadmodal.body,Body of reload modal,There’s a new version of {app_name} available. Please update to continue.
reloadmodal.button.update,Label of update button,Update
reloadmodal.title,Title when update is available,Update available
reviewAction.description,The description for review action,"By clicking register, you confirm that the information entered is correct and the member can be registered."
reviewAction.register,The label for register button of review action,Register
reviewAction.reject,The label for reject button of review action,Reject
reviewAction.title,The title for review action,Register member
userRole.fieldAgent,Name for user role Field Agent,Field Agent
userRole.healthcareWorker,Name for user role Healthcare Worker,Healthcare Worker
userRole.communityLeader,Name for user role Community Leader,Community Leader
userRole.localRegistrar,Name for user role Local Registrar,Local Registrar
userRole.localSystemAdmin,Name for user role Local System Admin,Local System Admin
userRole.nationalRegistrar,Name for user role National Registrar,National Registrar
userRole.nationalSystemAdmin,Name for user role National System Admin,National System Admin
userRole.performanceManager,Name for user role Performance Manager,Performance Manager
userRole.policeOfficer,Name for user role Police Officer,Police Officer
userRole.registrationAgent,Name for user role Registration Agent,Registration Agent
userRole.hospitalClerk,Name for user role Hospital Clerk,Hospital Clerk
validations.isAgeInYearsBetween,The error message that appears when age for the given date is outside the legal age range,Age must be between {min} and {max} years.
wq.noRecords.draft,No records messages for empty draft tab,No records in my drafts
- Query the location tree directly from the config service to improve performance for large datasets
- Add constant.humanName to allow countries to customise the format of the full name in the sytem for
sytem usersandcitizense.g{LastName} {MiddleName} {Firstname}, in any case where one of the name is not provided e.g noMiddleName, we'll simply render e.g{LastName} {FirstName}without any extra spaces if that's the order set incountry-config. #6830
- We make sure that the automatic cleanup job only runs before deployment (instead of cron schedule cleanup).
- Previously it was possible MongoDB replica set and users were left randomly uninitialised after a deployment. MongoDB initialisation container now retries on failure.
- On some machines 'file' utility was not preinstalled causing provision to fail. We now install the utility if it doesn't exist.
-
Notification Flags The configuration of various notifications is now controlled from
countryconfiginstead of being handled in the UI, as notification settings are not something that should be changed on the fly. To simplify this process, we have moved the settings to theapplication-config.tsfile. From now on, the notifications can be managed in thenotificationForRecordobject defined in the mentioned file. Any changes will take effect after a new deployment.Country implementors must define the
notificationForRecordobject in theapplication-config.tsfile to enable the notifications they want. Not doing so will keep notifications disabled by default. -
Gateways searchEvents API updated
operationHistoriesonly returnsoperationType&operatedOndue to the other fields being unused in OpenCRVS -
Config changes to review/preview and signatures Core used to provide review/preview section by default which are now removed and need to be provided from countryconfig. The signature field definitions (e.g. informant signature, bride signature etc.) were hard coded in core which also have now been removed. The signatures can now be added through the review/preview sections defined in countryconfig just like any other field. You can use the following section definition as the default which is without any additional fields. We highly recommend checking out our reference country repository which has the signature fields in it's review/preview sections
{
id: 'preview',
viewType: 'preview',
name: {
defaultMessage: 'Preview',
description: 'Form section name for Preview',
id: 'register.form.section.preview.name'
},
title: {
defaultMessage: 'Preview',
description: 'Form section title for Preview',
id: 'register.form.section.preview.title'
},
groups: [
{
id: 'preview-view-group',
fields: []
}
]
}
- Remove
splitViewoption from DOCUMENT_UPLOADER_WITH_OPTION field - New required sections preview & review added. Signature field definitions are now part of these two sections same as normal form fields.
- Remove
inputFieldWidthfrom Number type form field - Application config file is renamed to
application-config.ts - Allow configuring the default search criteria for record search which can be done by adding or modifying a property named
SEARCH_DEFAULT_CRITERIAinapplication-config.tsValue ofSEARCH_DEFAULT_CRITERIAcan be one of the following- 'TRACKING_ID',
- 'REGISTRATION_NUMBER',
- 'NATIONAL_ID',
- 'NAME',
- 'PHONE_NUMBER',
- 'EMAIL'
- Updated
allowedFileFormatsin signature fields to use MIME types (image/png,image/jpg,image/jpeg,image/svg) instead of simple file extensions. If you are already using theallowedFileFormatsfield in your implementation, please ensure to update the format accordingly. - The details exists conditionals for the various sections i.e. father, mother, spouse has to use the
values.detailsExistproperty instead of accessing it fromdraftData.[sectionName].detailsExists. This is due to the fact that the draftData is not populated until any changes have been made to any of the fields in the current section.
- Certificate handlebar for registration fees
registrationFees#6817 - Logged in user details handlebar
loggedInUser#6529 - Supporting document fields can now be made required
- If there is only one option in the document uploader select, then it stays hidden and only the upload button is showed with the only option being selected by default
- The select options in DOCUMENT_UPLOADER_WITH_OPTION field can now be hidden using the new
optionConditionproperty. It works similarly to the same property available in SELECT_WITH_OPTIONS field
- ElasticSearch reindexing Allows reindexing ElasticSearch via a new search-service endpoint
reindex. We're replacing the originalocrvsindex with timestamped ones. This is done automatically when upgrading and migrating, but this is an important architectural change that should be noted. More details in #7033.
-
Introduce a new certificate handlebar "preview" which can be used to conditionally render some svg element when previewing the certificate e.g. background image similar to security paper
-
Notification flags: Added notification flags for
BIRTH,DEATH, andMARRIAGEevents, including:sent-notificationsent-notification-for-reviewsent-for-approvalregisteredsent-for-updates
-
/record-notificationAPI: Endpoint to check enabled notifications for records. The API returns thenotificationForRecordobject forBIRTHandDEATHevents, listing their respective flags. Route configuration includes description and tags for API documentation.
INSERT CSV ROWS IN ENGLISH ONLY
- Github pipeline dedicated for reading secrets and variables from other environments now checks if GH_TOKEN is still valid before attempting other operations
- Remove unnecessary UI dividers that add in various sections of the declaration forms(e.g the Death, Birth and Marriage forms) #244
- Update template transformer for fields
informantTypeandotherInformantTypethat fixes the bug of unavailability of these template fields #5952 - Fixed missing InitialValue property to set initial values based on an expression
- Broken email alerts from low disk space are now fixed 293
-
Removed dependency on OpenHIM.
The performance of OpenHIM added an unexpected burden of 200 m/s to every interaction. Cumulatively, this was negatively affecting user experience and therefore we decided to deprecate it.
Interested implementers are free to re-introduce OpenHIM should they wish to use it as an interoperability layer without affecting the performance of OpenCRVS now that our architecture no longer depends on it.
The OpenHIM database is kept for backwards compatibility reasons and will be removed in v1.6. OpenHIM is an Open Source middleware component designed for managing FHIR interoperability between disparate systems as part of the OpenHIE architectural specification. We had been using this component in a much more fundamental way to monitor microservice comms in a similar fashion to Amazon SQS.
-
Upgrade node version to 18
This version enforces environment to have Node 18 installed (supported until April 2025) and removes support for Node 16
- Use nvm to upgrade your local development environment to use node version
18.19.x. - Specified operating systems in js modules as
darwin, linux - Dev scripts and Vite run with an environment variable
NODE_OPTIONS=--dns-result-order=ipv4firstto resolve ipv4 addresses forlocalhostto support systems that resolves ipv6 addresses by default in Node versions >=17
- Use nvm to upgrade your local development environment to use node version
-
Update the certificate preview mechanism In effort of minimizing JavaScript-bundle size, we have streamlined the way how review certificate -page renders certificates. In case the images in your certificates are previewing blurry, you need to update your SVG-certificates to print QR-codes and other images directly with
<image width="36" height="36" xlink:href="{{qrCode}}" x="500" y="770"></image>instead of the more complicated<rect fill="url(#pattern)"></rect>-paradigm. This doesn't affect printed certificates as they are still created as previously. -
Generate default address according to logged-in user's location We have dropped support for the 'agentDefault' prop which was used as initial value for SELECT_WITH_DYNAMIC_OPTIONS fields. If you have not made any changes to address generation, then this should not affect you. If you have, you can refer to this PR to see how agentDefault has been deprecated in an example country: https://github.com/opencrvs/opencrvs-farajaland/pull/978
-
Remove system admin UI items: Application, User roles We have now moved to configuring these items away from the UI in favour of directly editing these from country configuration repository in code - specifically in application-config-default.ts.
-
Set Metabase default credentials. These must be configured via countryconfig repository environment variables and secrets otherwise the dashboard service won't start
-
Check your Metabase map file. For Metabase configuration, we renamed
farajaland-map.geojsontomap.geojsonto not tie implementations into example country naming conventions. -
Feature flags In order to make application config settings more readable, we re-organised
src/api/application/application-config-default.tswith a clear feature flag block like so. These are then used across the front and back end of the application to control configurable functionality. New feature flags DEATH_REGISTRATION allow you to optionally run off death registration if your country doesnt want to run its first pilot including death and PRINT_DECLARATION (see New Features) have been added.FEATURES: { DEATH_REGISTRATION: true, MARRIAGE_REGISTRATION: false, ... } -
Improve rendering of addresses in review page where addresses match When entering father's address details, some countries make use of a checkbox which says "Address is the same as the mothers. " which, when selected, makes the mother's address and fathers address the same. The checkbox has a programatic value of "Yes" or "No". As a result on the review page, the value "Yes" was displayed which didn't make grammatical sense as a response. We decided to use a custom label: "Same as mother's", which is what was asked on the form. This requires some code changes in the src/form/addresses/index.ts file to pull in the
hideInPreviewprop which will hide the value "Yes" on the review page and replace with a content managed label. Associated bug #5086
More improvements have been made to the infrastructure provisioning and Github environment creation scripts and documentation. The complexity is somewhat reduced.
- We removed the example Wireguard VPN set up as it was confusing. Our intention was to ensure that all implementers were aware that OpenCRVS should be installed behind a VPN and used Wireguard as an example. But the configuration requirements for Wireguard confused implementers who are not using it. Therefore we decided to remove Wireguard as an example.
- We now have a "backup" Github environment and the backup server is automatically provisioned. We moved the inventory file location to an explicit directory and removed parameters to scripts that can be automated. To migrate, move all inventory files (qa.yml, production.yml, staging.yml from
infrastructure/server-setuptoinfrastructure/server-setup/inventoryand configureinfrastructure/server-setup/inventory/backup.yml. Run environment creator for your backup serveryarn environment:init --environment=backup - You can configure the file path on the backup server where backups are stored. We can also allow using staging to both periodically restore a production backup and also give it the capability if required to backup it's own data to a different location using
backup_server_remote_target_directoryandbackup_server_remote_source_directoryAnsible variables. This use case is mostly meant for OpenCRVS team internal use. - We now automate SSH key exchange between application and backup server. For staging servers, automatically fetch production backup encryption key if periodic restore is enabled using
ansible_ssh_private_key_fileAnsible variables. Therefore documentation is simplified for a new server set-up. - In infrastructure Github workflows: SSH_PORT is new and required allowing you the ability to use a non-standard SSH port. This Github Action environment variable must be added.
- In infrastructure Github workflows: SSH_HOST should be moved from being a Github Action environment secret to a Github Action environment variable before it is deprecated in 1.7.0
- No longer an assumption made that production server Docker replicas and Mongo replica-sets are necessary. In our Docker Compose files, we had originally assumed that a production deployment would always be deployed on a cluster to enable load balancing. We applied a Mongo replica set by default on production and set replicas: 2 on each microservice. However after experience in multiple countries running small scale pilots, a production deployment usually starts off as 1 server node and then scales into a cluster over time in order to save costs and resources. Therefore these replicas are a waste of resources. So you will notice that this has been deleted. You can always manually add your desired replicas back into you Docker Compose configuration if you want. In Docker Compose files, search for REPLICAS and update accordingly as well as attending to the linked examples.
Follow the descriptions in the migration notes to re-provision all servers safely.
- Introduced rate limiting to routes that could potentially be bruteforced or extracted PII from.
- The login and client application loading experience has improved. A loading bar appears before the javaScript bundle has loaded and this transitions when fetching records.
- Development time logs are now much tidier and errors easier to point out. Production logging will still remain as is.
- Masked emails and phone numbers from notification logs.
- Support for landscape certificate templates.
- Allow defining maxLength attribute for number type fields.
- A new certificate handlebar for registration fees has been added
registrationFees - A new certificate handlebar for logged-in user details has been added
loggedInUser - Add support for image compression configuration. Two new properties to this form field are available:
DOCUMENT_UPLOADER_WITH_OPTIONcompressImagesToSizeMB: An optional prop of number type to define a compressed size. Compression is ignored when the input file is already smaller or equal of the given value or a falsy given value.maxSizeMB: An optional validation prop to prevent input of a file bigger than a defined value.
- If a country doesnt wish to use Sentry for logging errors, the SENTRY_DSN variable is now optional and the LogRocket option has been deprecated due to lack of demand.
- Given that upon an upgrade between versions of OpenCRVS, that users cache is cleared, it is important to inform staff to submit any draft applications before the upgrade date. We introduced an "Email all users" feature so that National System Admins can send all staff messages. This feature can be used for any other all staff comms that are deemed required.
- Included an endpoint for serving individual certificates in development mode. This improves the developer experience when configuring certificates.
- Removed logrocket refrences.
- Enable gzip compression in client & login
- Use docker compose v2 in github workflows
- Added SMTP environment variables into the qa compose file to enable QA of SMTP servers.
- In the certificate, the 'Place of Certification' now accurately reflects the correct location.
- Groom's and Bride's name, printIssue translation variables updated #124
- Add query mapper for International Postal Code field
- Provide env variables for metabase admin credentials
- Improved formatting of informant name for inProgress declaration emails
- There is now an option to print the review page of an event declaration form. The PRINT_DECLARATION feature flag in application config settings can enable this on or off.
advancedSearch.form.recordStatusCorrectionRequested,Option for form field: status of record,Correction requested
config.emailAllUsers.modal.supportingCopy,Label for send email all users confirmation supporting copy,User will receive emails over the next 24 hours
config.emailAllUsers.modal.title,Label for send email all users confirmation title,Send email to all users?
config.emailAllUsers.subtitle,Subtitle for email all users,This email will be sent to all users who are active. Emails will be sent over the next 24 hours. Only one email can be sent per day
config.emailAllUsers.title,Title for email all users,Email all users
config.userRoles.language,Language name,"{language, select, en {English} fr {French} other {{language}}}"
constants.emailBody,Label for email body input,Message
constants.emailSubject,Label for email subject input,Subject
correction.correctionForApprovalDialog.actions.cancel,The cancel button for the dialog when record correction sent by registration agent for approval,Cancel
correction.correctionForApprovalDialog.actions.send,The send button for the dialog when record correction sent by registration agent for approval,Confirm
correction.correctionForApprovalDialog.description,The description for the dialog when record correction sent by registration agent for approval,The Registrar will be notified of this correction request and a record of this request will be recorded
correction.correctionForApprovalDialog.title,The title for the dialog when record correction sent by registration agent for approval,Send record correction for approval ?
correction.correctRecordDialog.description,The description for the dialog when record correction sent by a registrar,The informant will be notified of this correction and a record of this decision will be recorded
correction.correctRecordDialog.title,The title for the dialog when record correction sent by a registrar,Correct record ?
correction.summary.office,Office where certificate correction summary was submitted,Office
correction.summary.requestedOn,Date when certificate correction summary was submitted,Requested on
correction.summary.submitter,Submitter of certificate correction summary,Submitter
form.customField.label.numberOfDependants,,No. of dependants
form.customField.label.reasonForLateRegistrationBirth,,Reason for delayed registration
form.customField.label.reasonForLateRegistrationDeath,,Reason for late registration
form.field.helpertext.nid,Helper text for nid input field,The National ID can only be numeric and must be 10 digits long
form.field.label.addressLine1RuralOption,,Village
form.field.label.addressLine1UrbanOption,,Residential Area
form.field.label.addressLine2UrbanOption,,Street
form.field.label.app.certifyRecordTo.bride,,Print and issue to bride
form.field.label.app.certifyRecordTo.groom,,Print and issue to groom
form.field.label.attendantAtBirthLayperson,,Layperson
form.field.label.cityUrbanOption,Label for City,Town
form.field.label.empty,empty string,
form.field.label.informantsRelationWithChild,,Relationship to child
form.field.label.maritalStatusSeparated,,Separated
form.field.label.relationOtherFamilyMember,Label for other family member relation,Other family member
form.field.label.totalFees,Label for input Reason for Change,
form.field.nidVerificationOngoing,Label for indicating offline status for the user. NID verification is not currently available offline.,National ID authentication is currently not available offline.
form.section.deceased.relationship,,Relationship to deceased
form.section.witnessOne.name,Form section name for Witness one,Witness 1
form.section.witnessTwo.name,Form section name for Witness two,Witness 2
home.header.placeHolderId,,Search for an ID
misc.notif.emailAllUsersError,Label for Email all users error toast,Only one email can be sent per day
misc.notif.emailAllUsersSuccess,Label for Email all users success toast,Email sent to all users
navigation.emailAllUsers,Email all users label in navigation,Email all users
number.twelve,Minimum length password,12
phone.digit,,10
phone.start,Should starts with,0(4|5)
recordAudit.regAction.markedAsNotDuplicate,Marked not a duplicate status message for record audit,Marked not a duplicate
recordAudit.regAction.verified,Verified action,Certificate verified
recordAudit.regStatus.correctionRequested,Label for when someone requested correction,Correction requested
regHome.outbox.failed,Label for declaration status failed,Failed to send
regHome.outbox.retry,Label for Retry button in Outbox shown for records that failed to send,Retry
register.form.modal.desc.saveCorrectionConfirm,Description for save correction confirmation modal,The declarant will be notified of this correction and a record of this decision will be recorded
register.form.modal.desc.saveCorrectionReject,Description for reject correction modal,The declarant will be notified of this decision and a record of this decision will be recorded
register.form.modal.title.saveCorrectionConfirm,Title for save correction confirmation modal,Approve correction?
register.form.modal.title.saveCorrectionReject,Title for reject correction modal,Reject correction?
register.selectInformant.birthInformantTitle,Who is applying for birth registration,Informant type
system.user.settings.language,Language name,"{language, select, en {English} fr {Français} other {{language}}}"
user.profile.auditList.approvedCorrectionAuditAction,Description for record correction being approved,Approved correction request
user.profile.auditList.rejectedCorrectedAuditAction,Description for record correction being rejected,Rejected correction request
user.profile.auditList.requestedCorrectionAuditAction,Description for record correction being requested,Requested correction
validations.invalidDate,The error message that appears when a date field is invalid,Invalid date field
verifyCertificate.certifiedAt,Label for date of certification,Date of certification
-
Improved logging for emails being sent
-
Updated default Metabase init file so that it's compatible with the current Metabase version
-
Deployment: Verifies Kibana is ready before setting up alert configuration
-
Deployment: Removes
depends_onconfiguration from docker compose files -
Deployment: Removes some deprecated deployment code around Elastalert config file formatting
-
Provisioning: Creates backup user on backup servers automatically
-
Provisioning: Update ansible Github action task version
-
Copy: All application copy is now located in src/translations as CSV files. This is so that copy would be easily editable in software like Excel and Google Sheets. After this change,
AVAILABLE_LANGUAGES_SELECTdoesn't need to be defined anymore by country config.
- Added examples for configuring HTTP-01, DNS-01, and manual HTTPS certificates. By default, development and QA environments use HTTP-01, while others use DNS-01.
- All secrets & variables defined in Github Secrets are now passed automatically to the deployment script.
- The VPN_HOST_ADDRESS variable is now required for staging and production installations to ensure deployments are not publicly accessible.
- Replica limits have been removed; any number can now be deployed.
- Each environment now has a dedicated docker-compose--deploy.yml. Use
environment:initto create a new environment and generate a corresponding file for customizable configurations. - 🔒 OpenHIM console is no longer exposed via HTTP.
- Ansible playbooks are refactored into smaller task files.
- We now recommend creating a new Ubuntu user
provisionwith passwordless sudo rights for all automated operations on the server, instead of using the root user. New users for different operations will be created in future releases. - All human users on all servers now have their own Linux users with mandatory 2-factor authentication.
- OpenCRVS Farajaland now has an interactive script
environment:initfor creating new Github environments and defining secrets. This script should also be run for existing environments to ensure all variables and secrets are defined, especially important when pulling the latest changes from the Farajaland repository to your own country resource package. - The environment creator script also manages the known hosts file automatically.
- 🚰 New pipeline for automatic provisioning of Ubuntu servers (all environments).
- 🚰 New pipeline for resetting data from an environment (non-production environments).
- 🚰 New pipeline for resetting SSH 2FA for all environments.
- 🚰 Development deploy pipeline now includes a "debug" option for SSHing into the action runner (non-production environments).
- A new "staging" environment has been introduced, acting as a production environment clone that resets its data nightly to match the production environment.
- The deployment script can now verify if there are undefined environment variables referred to in your compose files. All secrets and variables defined in Github Environments are automatically passed down to the deployment script.
- 🔒 Backup archives are now secured with a passphrase.
- HTTPS setup now offers three options: HTTP challenge, DNS challenge, and using a pre-issued certificate file.
- There's now a generic purpose POST /email endpoint only available from the internal network. Elastalert2 is configured to use this endpoint instead of directly using SMTP details or the Sendgrid API key.
- 🔒 QA environment now hosts a Wireguard server and admin panel (wg-easy). After deploying, you can access the admin panel at vpn..
- Allow configuring additional SSH parameters globally using
SSH_ARGSGithub variable.
- Known hosts are now defined in the
infrastructure/known-hostsfile. You can clear the file and usebash infrastructure/environments/update-known-hosts.sh <domain>to add your own domains. - Ansible inventory files are now in .yml format. Please convert your old
production.iniand similar files to this new format. - The
authorized_keysfile has been removed, and keys should now be defined in the inventory yaml files. - The
DOCKER_PASSWORDsecret has been replaced withDOCKER_TOKEN.
In the next OpenCRVS release v1.5.0, there will be two significant changes:
- The
infrastructuredirectory and related pipelines will be moved to a new repository. - Both the new infrastructure repository and the OpenCRVS country resource package repositories will start following their own release cycles, mostly independent from the core's release cycle. From this release forward, both packages are released as "OpenCRVS minor compatible" releases, meaning that the OpenCRVS countryconfig 1.3.0- is compatible with OpenCRVS 1.3.0, 1.3.1, 1.3.2, etc. This allows for the release of new hotfix versions of the core without having to publish a new version of the infrastructure or countryconfig.
- Fix typo in certificate handlebar names
-
The various admin level handlebars e.g. statePlaceofbirth, districtPrimaryMother only contained the name of that location which was not able to take advantage of all the information OpenCRVS had available about the various admin levels e.g. the name of that location in the secondary language. So we are introducing a new set of admin level handlebars that would contain the id of that location which we can resolve into a value of the shape
{ name: string alias: string }using the new "location" handlebar helper. Here name is the primary label of the location and alias being the secondary one. Currently only these 2 fields are available but we will be adding more fields depending on various countries requirements. If previously the certificate svg used to contain
{{districtPlaceofbirth}}then now we can replace it with{{location districtPlaceofbirthId 'name'}}. To access alias, the'name'needs to be replaced with'alias'.Below is a list of all the new handlebars that are meant to be used with the "location" handlebar helper.
- statePrimaryInformantId
- districtPrimaryInformantId
- statePlaceofbirthId
- districtPlaceofbirthId
- statePrimaryMotherId
- districtPrimaryMotherId
- statePrimaryFatherId
- districtPrimaryFatherId
- statePrimaryDeceasedId
- districtPrimaryDeceasedId
- statePlaceofdeathId
- districtPlaceofdeathId
- statePrimaryGroomId
- districtPrimaryGroomId
- statePrimaryBrideId
- districtPrimaryBrideId
- statePlaceofmarriageId
- districtPlaceofmarriageId
- registrar.stateId
- registrar.districtId
- registrar.officeId
- registrationAgent.stateId
- registrationAgent.districtId
- registrationAgent.officeId
-
Spouse section is an optional section in death form. Going forward it will be included in Farajaland example configuration.
-
Farajaland forms will now include a dropdown to select the type of ID an individual is providing e.g. National ID, Driving License etc. instead of being restricted to only national ID number.
-
As an example of custom field, the deceased section in death form will now include the numberOfDependants field.
-
The birth & death forms will include another custom field, reasonForLateRegistration, which makes use of "LATE_REGISTRATION_TARGET" configuration option in it's visibility conditional.
- Updated translations for form introduction page and sending for approval to reflect the default notification method being email.
- Remove hard-coded conditionals from "occupation" field to make it usable in the deceased form
