Very interesting question. Actually, it mostly depends on your application and how do you work with private data there. 

You can make application for any number of customers working in one database, with good security which does not allow to access data from one customer by another.  But in this case mostly means, that your application should be designed so, from the beginning.

Another and maybe simplest way is making separate databases for each customer. In Caché you can create multiple namespaces with different databases for each customer, but with the same database for a code of your application. So, you can update all sites at the same time.

Nowadays, I would recommend looking at containerization of application. And with kubernetes you can very fast deploy any new site with completely separate code and data between customers. But it means some work on how to prepare your application to be deployable with kubernetes.

I have configured automatic deployment of the application to Kubernetes with Helm from GitLab as a part of CI/CD process.

I would not say that I had some specific issues, just well configured Kubernetes cluster with the right storage driver. Any InterSystems products supports devicemapper and aufs right now, yet. So, of course, better to have devicemapper available server, and use this possibility. AUFS already deprecated by Docker and will disappear in the next major release.

I made such an example years ago, you can look at GitHub. This example maybe not so correct by this time, but can be useful. When you have to run only ECP clients, it becomes a bit easier. You should not care about volumes, in most cases, all the data stored in ECP-client is temporal. So, you mostly should care only about buffers. In my example, you can find how to configure instance during docker build to work as ECP-client.

Well, there is mostly only one reason, why you can't mount your database and this issue mostly happens when anybody tries to migrate between different versions on different machines. And it is different localization settings. Like, your database uses some national global collation, and you try to copy it to the instance with different settings, where this collation does not supported. You should find mention about  wrong collation in cconsole.log. So, then, you should set the same NLS, as in the first system and try to mount again.

Another possible reason is different blocksize in the Database. By default Caché uses 8KB blocks, but it is possible to have different block size, and instance should be configured for this particular blocksize, as well. cconsole.log should also contain error in this case.

Some other issues, which you can face, but they do not prevent database to be mounted.

  • 8-bit or Unicode, when you install Caché you still able to choose it, when Ensemble, HealthShare, and IRIS is Unicode only. In this case, if your data not in English, possible data should be converted from 8-bit codepage to Unicde.
  • cache.lck file next to CACHE.DAT, it is a lock file, prevents to mount database with exclusive access. But Database in this case should be mounted in read-only mode.

Function $zf(-1) just executes a command passed as the second argument, you passed only file name. it is not complete, you should add command del  for Windows.

set status = $zf(-1, "del c:\sys\text.txt")

it should return 0 if the command was successful.

If you want just delete a file, you can use %File class, useful for many different operations with files and folders.

set result = ##class(%File).Delete("c:\sys\text.txt")

I would recommend to use more suitable class for it. %Stream.FileCharacter when you can set TranslateTable property

Set stream=##class(%Stream.FileCharacter).%New()
Set sc=stream.LinkToFile("c:\myfile.txt")
Set stream.TranslateTable = "UTF8"
While 'stream.AtEnd {
	Set line=stream.Read()
	; Process the chunk here
}

And you don't need any conversions after that

Collation 20 is Portuguese2. Looks like windows was localized in Portuguese or regional settings when Ensemble was installed. But later changed locale definition to something else. You should return back because the database was created with this collation, and if you want to use new collation you should create a new one and move all data to the new database.

I think your original locale was ptbw, so, you should choose it and press install, and in confirmation press install again.