Struggling to backup selfhosted fusionAuth.
-
Hi folks, new user here, and love this IAM. Its working great in all respects, however, i recently decide to test disaster recovery and spun up a local version in containers running on postgresql. I backed up everything using pg_dumpall and then tried to restore that to a new postgres instance container using psql, which it did without any errors, when I brought fusionAuth up again pointing to the restored database, it would not launch, instead it gave me, hundreds of errors in fusionauth container log like:
2025-01-31 16:33:44 fusionauth-1 | Starting fusionauth-app... 2025-01-31 16:33:44 fusionauth-1 | --> Logging to /usr/local/fusionauth/logs/fusionauth-app.log 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 11:33:44.600 PM INFO io.fusionauth.api.configuration.DefaultFusionAuthConfiguration - Loading FusionAuth configuration file [/usr/local/fusionauth/config/fusionauth.properties] 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 11:33:44.611 PM INFO io.fusionauth.api.configuration.DefaultFusionAuthConfiguration - Set property [fusionauth-app.url] set to [http://fusionauth:9011] using configured value. 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 11:33:44.612 PM INFO com.inversoft.configuration.BasePropertiesFileInversoftConfiguration - 2025-01-31 16:33:44 fusionauth-1 | - Overriding default value of property [database.mysql.enforce-utf8mb4] with value [true] 2025-01-31 16:33:44 fusionauth-1 | - Overriding default value of property [FUSIONAUTH_APP_RUNTIME_MODE] with value [development] 2025-01-31 16:33:44 fusionauth-1 | - Overriding default value of property [SEARCH_TYPE] with value [elasticsearch] 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 11:33:44.629 PM INFO io.fusionauth.api.configuration.DefaultFusionAuthConfiguration - Loading FusionAuth configuration file [/usr/local/fusionauth/config/fusionauth.properties] 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 11:33:44.629 PM INFO io.fusionauth.api.configuration.DefaultFusionAuthConfiguration - Set property [fusionauth-app.url] set to [http://fusionauth:9011] using configured value. 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 11:33:44.629 PM INFO com.inversoft.configuration.BasePropertiesFileInversoftConfiguration - 2025-01-31 16:33:44 fusionauth-1 | - Overriding default value of property [database.mysql.enforce-utf8mb4] with value [true] 2025-01-31 16:33:44 fusionauth-1 | - Overriding default value of property [FUSIONAUTH_APP_RUNTIME_MODE] with value [development] 2025-01-31 16:33:44 fusionauth-1 | - Overriding default value of property [SEARCH_TYPE] with value [elasticsearch] 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 11:33:44.682 PM INFO com.inversoft.maintenance.DefaultMaintenanceModeWorkflow - 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 16:33:44 fusionauth-1 | --------------------------------------------------------------------------------------------------------- 2025-01-31 16:33:44 fusionauth-1 | ---------------------------------- Entering Silent Configuration Mode ----------------------------------- 2025-01-31 16:33:44 fusionauth-1 | --------------------------------------------------------------------------------------------------------- 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 11:33:44.773 PM INFO com.inversoft.maintenance.db.JDBCMaintenanceModeDatabaseService - [b5TD7Q] Attempting to lock database to support multi-node configurations 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 11:33:44.778 PM INFO com.inversoft.maintenance.db.JDBCMaintenanceModeDatabaseService - [b5TD7Q] Obtained a database lock 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 11:33:44.800 PM INFO com.inversoft.maintenance.db.JDBCMaintenanceModeDatabaseService - [b5TD7Q] Database Version [1.55.1] 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 11:33:44.802 PM INFO com.inversoft.maintenance.db.JDBCMaintenanceModeDatabaseService - [b5TD7Q] Latest Migration Version [1.55.1] 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 11:33:44.803 PM INFO com.inversoft.maintenance.db.JDBCMaintenanceModeDatabaseService - [b5TD7Q] Attempting to unlock database to support multi-node configurations 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 11:33:44.803 PM INFO com.inversoft.maintenance.db.JDBCMaintenanceModeDatabaseService - [b5TD7Q] Unlock completed 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 11:33:44.804 PM INFO com.inversoft.search.ElasticRestClientHelper - Connecting to Elasticsearch at [http://search:9200] 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 11:33:44.996 PM INFO io.fusionauth.api.configuration.DefaultFusionAuthConfiguration - Loading FusionAuth configuration file [/usr/local/fusionauth/config/fusionauth.properties] 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 11:33:44.996 PM INFO io.fusionauth.api.configuration.DefaultFusionAuthConfiguration - Set property [fusionauth-app.url] set to [http://fusionauth:9011] using configured value. 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 11:33:44.996 PM INFO com.inversoft.configuration.BasePropertiesFileInversoftConfiguration - 2025-01-31 16:33:44 fusionauth-1 | - Overriding default value of property [database.mysql.enforce-utf8mb4] with value [true] 2025-01-31 16:33:44 fusionauth-1 | - Overriding default value of property [FUSIONAUTH_APP_RUNTIME_MODE] with value [development] 2025-01-31 16:33:44 fusionauth-1 | - Overriding default value of property [SEARCH_TYPE] with value [elasticsearch] 2025-01-31 16:33:44 fusionauth-1 | 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.040 PM INFO com.inversoft.maintenance.MaintenanceModePoller - Poller started to Wait for configuration to be completed. 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.041 PM INFO io.fusionauth.app.primeframework.FusionHTTPContextAuthSetup - Initializing the FusionAuth HTTP Context. 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.071 PM INFO com.inversoft.maintenance.db.JDBCMaintenanceModeDatabaseService - [b5TD7Q] Database Version [1.55.1] 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.071 PM INFO com.inversoft.maintenance.db.JDBCMaintenanceModeDatabaseService - [b5TD7Q] Latest Migration Version [1.55.1] 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.072 PM INFO com.inversoft.search.ElasticRestClientHelper - Connecting to Elasticsearch at [http://search:9200] 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.078 PM INFO io.fusionauth.app.guice.FusionAuthModule - 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 16:33:45 fusionauth-1 | --------------------------------------------------------------------------------------------------------- 2025-01-31 16:33:45 fusionauth-1 | --------------------------------- Starting FusionAuth version [1.55.1] ---------------------------------- 2025-01-31 16:33:45 fusionauth-1 | --------------------------------------------------------------------------------------------------------- 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.171 PM INFO io.fusionauth.api.plugin.guice.PluginModule - No plugins found 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.219 PM INFO io.fusionauth.api.service.system.NodeService - Node [ee607efc-5736-480b-b3ad-3308126a8fbb] started. 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.380 PM INFO io.fusionauth.api.configuration.DefaultFusionAuthConfiguration - Loading FusionAuth configuration file [/usr/local/fusionauth/config/fusionauth.properties] 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.380 PM INFO io.fusionauth.api.configuration.DefaultFusionAuthConfiguration - Set property [fusionauth-app.url] set to [http://fusionauth:9011] using configured value. 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.381 PM INFO com.inversoft.configuration.BasePropertiesFileInversoftConfiguration - 2025-01-31 16:33:45 fusionauth-1 | - Overriding default value of property [database.mysql.enforce-utf8mb4] with value [true] 2025-01-31 16:33:45 fusionauth-1 | - Overriding default value of property [FUSIONAUTH_APP_RUNTIME_MODE] with value [development] 2025-01-31 16:33:45 fusionauth-1 | - Overriding default value of property [SEARCH_TYPE] with value [elasticsearch] 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.381 PM INFO com.inversoft.jdbc.hikari.DataSourceProvider - Connecting to PostgreSQL database at [jdbc:postgresql://db2:5432/fusionauth] 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.384 PM INFO com.zaxxer.hikari.HikariDataSource - Database-background - Starting... 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.398 PM INFO com.zaxxer.hikari.HikariDataSource - Database-background - Start completed. 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.673 PM INFO com.inversoft.jdbc.hikari.DataSourceProvider - Connecting to PostgreSQL database at [jdbc:postgresql://db2:5432/fusionauth] 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.673 PM INFO com.zaxxer.hikari.HikariDataSource - Database-primary - Starting... 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.678 PM INFO com.zaxxer.hikari.pool.HikariPool - Database-primary - Added connection org.postgresql.jdbc.PgConnection@175f859e 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.678 PM INFO com.zaxxer.hikari.HikariDataSource - Database-primary - Start completed. 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.754 PM INFO com.inversoft.jdbc.hikari.DataSourceProvider - Connecting to PostgreSQL database at [jdbc:postgresql://db2:5432/fusionauth] 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.755 PM INFO com.zaxxer.hikari.HikariDataSource - Database-secondary - Starting... 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.759 PM INFO com.zaxxer.hikari.pool.HikariPool - Database-secondary - Added connection org.postgresql.jdbc.PgConnection@21f91efa 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.759 PM INFO com.zaxxer.hikari.HikariDataSource - Database-secondary - Start completed. 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.921 PM INFO com.inversoft.scheduler.DefaultScheduler - Starting up scheduler 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.922 PM INFO com.inversoft.scheduler.DefaultScheduler - Scheduler is running 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.952 PM ERROR com.inversoft.scheduler.LogAndRetainFailureHandler - The scheduled service [class io.fusionauth.api.service.cache.CORSConfigurationCacheLoader] failed but will be re-run. 2025-01-31 16:33:45 fusionauth-1 | org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2 2025-01-31 16:33:45 fusionauth-1 | at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:81) 2025-01-31 16:33:45 fusionauth-1 | at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) 2025-01-31 16:33:45 fusionauth-1 | at java.base/java.lang.reflect.Method.invoke(Method.java:580) 2025-01-31 16:33:45 fusionauth-1 | at org.apache.ibatis.session.SqlSessionManager$SqlSessionInterceptor.invoke(SqlSessionManager.java:355) 2025-01-31 16:33:45 fusionauth-1 | at jdk.proxy2/jdk.proxy2.$Proxy61.selectOne(Unknown Source) 2025-01-31 16:33:45 fusionauth-1 | at org.apache.ibatis.session.SqlSessionManager.selectOne(SqlSessionManager.java:164) 2025-01-31 16:33:45 fusionauth-1 | at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:87) 2025-01-31 16:33:45 fusionauth-1 | at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:141) 2025-01-31 16:33:45 fusionauth-1 | at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86) 2025-01-31 16:33:45 fusionauth-1 | at jdk.proxy2/jdk.proxy2.$Proxy63.retrieve(Unknown Source) 2025-01-31 16:33:45 fusionauth-1 | at io.fusionauth.api.service.cache.CORSConfigurationCacheLoader.internalLoad(CORSConfigurationCacheLoader.java:36) 2025-01-31 16:33:45 fusionauth-1 | at com.inversoft.cache.BaseSingleValueCacheLoader.load(BaseSingleValueCacheLoader.java:13) 2025-01-31 16:33:45 fusionauth-1 | at io.fusionauth.api.service.cache.CORSConfigurationCacheLoader.run(CORSConfigurationCacheLoader.java:30) 2025-01-31 16:33:45 fusionauth-1 | at com.inversoft.scheduler.InjectableRunnable.run(InjectableRunnable.java:56) 2025-01-31 16:33:45 fusionauth-1 | at com.inversoft.scheduler.DefaultScheduler.<init>(DefaultScheduler.java:70) 2025-01-31 16:33:45 fusionauth-1 | at com.inversoft.scheduler.DefaultScheduler$$FastClassByGuice$$9ed33ea.GUICE$TRAMPOLINE(<generated>) 2025-01-31 16:33:45 fusionauth-1 | at com.inversoft.scheduler.DefaultScheduler$$FastClassByGuice$$9ed33ea.apply(<generated>) 2025-01-31 16:33:45 fusionauth-1 | at com.google.inject.internal.DefaultConstructionProxyFactory$FastClassProxy.newInstance(DefaultConstructionProxyFactory.java:82) 2025-01-31 16:33:45 fusionauth-1 | at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:114) 2025-01-31 16:33:45 fusionauth-1 | at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91) 2025-01-31 16:33:45 fusionauth-1 | at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:300) 2025-01-31 16:33:45 fusionauth-1 | at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) 2025-01-31 16:33:45 fusionauth-1 | at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:169) 2025-01-31 16:33:45 fusionauth-1 | at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:45) 2025-01-31 16:33:45 fusionauth-1 | at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:60) 2025-01-31 16:33:45 fusionauth-1 | at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:213) 2025-01-31 16:33:45 fusionauth-1 | at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:186) 2025-01-31 16:33:45 fusionauth-1 | at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:113) 2025-01-31 16:33:45 fusionauth-1 | at com.google.inject.Guice.createInjector(Guice.java:87) 2025-01-31 16:33:45 fusionauth-1 | at com.google.inject.Guice.createInjector(Guice.java:69) 2025-01-31 16:33:45 fusionauth-1 | at com.google.inject.Guice.createInjector(Guice.java:59) 2025-01-31 16:33:45 fusionauth-1 | at org.primeframework.mvc.guice.GuiceBootstrap.initialize(GuiceBootstrap.java:60) 2025-01-31 16:33:45 fusionauth-1 | at org.primeframework.mvc.BasePrimeMain.hup(BasePrimeMain.java:69) 2025-01-31 16:33:45 fusionauth-1 | at org.primeframework.mvc.BasePrimeMain.start(BasePrimeMain.java:100) 2025-01-31 16:33:45 fusionauth-1 | at io.fusionauth.app.FusionAuthMain.main(FusionAuthMain.java:27) 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.958 PM INFO com.inversoft.search.ElasticRestClientHelper - Connecting to Elasticsearch at [http://search:9200] 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.961 PM ERROR com.inversoft.scheduler.LogAndRetainFailureHandler - The scheduled service [class io.fusionauth.api.service.cache.IdentityProviderCacheLoader] failed but will be re-run. 2025-01-31 16:33:45 fusionauth-1 | com.google.inject.ProvisionException: Unable to provision, see the following errors: 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 16:33:45 fusionauth-1 | 1) [Guice/ErrorInCustomProvider]: TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2 2025-01-31 16:33:45 fusionauth-1 | at FusionAuthMVCModule.configure(FusionAuthMVCModule.java:31) 2025-01-31 16:33:45 fusionauth-1 | \_ installed by: FusionAuthModule -> Modules$OverrideModule -> FusionAuthMVCModule 2025-01-31 16:33:45 fusionauth-1 | at FusionAuthObjectMapperProvider.<init>(FusionAuthObjectMapperProvider.java:24) 2025-01-31 16:33:45 fusionauth-1 | \_ for 2nd parameter 2025-01-31 16:33:45 fusionauth-1 | while locating FusionAuthObjectMapperProvider 2025-01-31 16:33:45 fusionauth-1 | at FusionAuthContentModule.bindObjectMapper(FusionAuthContentModule.java:24) 2025-01-31 16:33:45 fusionauth-1 | \_ installed by: FusionAuthModule -> Modules$OverrideModule -> FusionAuthContentModule 2025-01-31 16:33:45 fusionauth-1 | at DefaultCipherService.<init>(DefaultCipherService.java:37) 2025-01-31 16:33:45 fusionauth-1 | \_ for 1st parameter 2025-01-31 16:33:45 fusionauth-1 | while locating DefaultCipherService 2025-01-31 16:33:45 fusionauth-1 | at DefaultReactorCore.<init>(DefaultReactorCore.java:66) 2025-01-31 16:33:45 fusionauth-1 | \_ for 1st parameter 2025-01-31 16:33:45 fusionauth-1 | while locating DefaultReactorCore 2025-01-31 16:33:45 fusionauth-1 | at InstanceManager.<init>(InstanceManager.java:38) 2025-01-31 16:33:45 fusionauth-1 | \_ for 3rd parameter 2025-01-31 16:33:45 fusionauth-1 | at DefaultReactorService.<init>(DefaultReactorService.java:90) 2025-01-31 16:33:45 fusionauth-1 | \_ for 5th parameter 2025-01-31 16:33:45 fusionauth-1 | while locating DefaultReactorService 2025-01-31 16:33:45 fusionauth-1 | at DefaultPasswordService.<init>(DefaultPasswordService.java:52) 2025-01-31 16:33:45 fusionauth-1 | \_ for 3rd parameter 2025-01-31 16:33:45 fusionauth-1 | while locating DefaultPasswordService 2025-01-31 16:33:45 fusionauth-1 | at FusionAuthConnector.<init>(FusionAuthConnector.java:43) 2025-01-31 16:33:45 fusionauth-1 | \_ for 2nd parameter 2025-01-31 16:33:45 fusionauth-1 | while locating FusionAuthConnector 2025-01-31 16:33:45 fusionauth-1 | while locating Connector annotated with @Element(setName=,uniqueId=56, type=MAPBINDER, keyType=ConnectorType) 2025-01-31 16:33:45 fusionauth-1 | at DefaultAuthenticationService.<init>(DefaultAuthenticationService.java:140) 2025-01-31 16:33:45 fusionauth-1 | \_ for 4th parameter 2025-01-31 16:33:45 fusionauth-1 | while locating DefaultAuthenticationService 2025-01-31 16:33:45 fusionauth-1 | at AppleIdentityProviderAuthenticationService.<init>(AppleIdentityProviderAuthenticationService.java:76) 2025-01-31 16:33:45 fusionauth-1 | \_ for 2nd parameter 2025-01-31 16:33:45 fusionauth-1 | while locating AppleIdentityProviderAuthenticationService 2025-01-31 16:33:45 fusionauth-1 | while locating IdentityProviderAuthenticationService annotated with @Element(setName=,uniqueId=114, type=MAPBINDER, keyType=IdentityProviderType) 2025-01-31 16:33:45 fusionauth-1 | at IdentityProviderCacheLoader.<init>(IdentityProviderCacheLoader.java:39) 2025-01-31 16:33:45 fusionauth-1 | \_ for 4th parameter 2025-01-31 16:33:45 fusionauth-1 | while locating IdentityProviderCacheLoader 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 16:33:45 fusionauth-1 | Learn more: 2025-01-31 16:33:45 fusionauth-1 | https://github.com/google/guice/wiki/ERROR_IN_CUSTOM_PROVIDER 2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 16:33:45 fusionauth-1 | 1 errorThese appear to be duplicates create during restore, but i was hoping conventional backup logic would work with postgres & fusionAuth.
Im i missing something obvious? what do other folks do using pg and FA?
Thanks in advance
Franco -
@spydmobile Are all the errors specifically about the CORSConfigurationCacheLoader or are there others?
@spydmobile said in Struggling to backup selfhosted fusionAuth.:
2025-01-31 16:33:45 fusionauth-1 | 2025-01-31 11:33:45.952 PM ERROR com.inversoft.scheduler.LogAndRetainFailureHandler - The scheduled service [class io.fusionauth.api.service.cache.CORSConfigurationCacheLoader] failed but will be re-run.
2025-01-31 16:33:45 fusionauth-1 | org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2 -
Did you ever get a solution to this? I've just hit the same problem.
In my case, I have a single server which failed, so I've re-installed (with the same version of FusionAuth as was on there before). I can let it run up as normal and it works fine, but if I restore my
pg_dumpallbackup, then I get the same errors as you.I rather assumed that a postgres full backup was all I needed to do for DR, but are there other steps as well? This seems surprisingly under-documented

-
@ralph Are you getting the same errors? I did see a reference to trying pg_dump vs pg_dumpall. Can you try that and let us know if it works?
-
Answering my own question here... turns out there was a version mismatch. Oh dear

To summarise...
Perform backups using
pg_dumpalland hive them off the server somewhere. This gives you textual SQL files, if you prefer,pg_dumpcan do different things, but works on an individual database at a time.I'd also recommend you setup your server using something like Ansible. It means that things like your properties file and other details will be the same next time you need to (re)install.
To restore:
- Stop FusionAuth if it's running
- Make certain FusionAuth is the same version as was used when the backup took place!
- Go double-check those versions

- Restore by running
sudo -u postgres psql < dump.sql - Restart FusionAuth (not in silent mode)
For More sensitive environments, you may want to consider database replication and making a warm-standby server.