Where will our data actually be stored?
Where you choose, and we verify that it is really there. Our systems are on OVHcloud, Bucharest and on Microsoft Azure, Poland Central, both in the European Economic Area, and the location was confirmed by querying the virtual machine metadata service and the address register — not by reading the provider’s documentation. The verification matters: for a transfer within the European Economic Area, the transfer chapter of Law no. 195/2024 does not apply and no special authorisations are required. Outside it, a file of guarantees appears.
Why a self-hosted server and not a managed platform?
Not always. A managed platform is the right choice when the team is small, traffic is irregular and nothing in the stack has residency requirements. A self-hosted server becomes the better argument in three situations: when data must remain in a specific jurisdiction, when cost becomes unpredictable at scale, and when you want to be able to take everything and leave. We have also done the reverse migration for a self-hosted system: from a database hosted in the United States to a self-hosted stack in the European Union, with eight containers — database, authentication, REST interface, real-time, storage, metadata, dashboard and access gateway.
What happens if a publication goes wrong?
It is rolled back, and preferably by itself. The previous version remains on disk alongside the new one, and after publication a check requests the real page and confirms that the file served is the one just built; if not, the script rolls back automatically. Where we use atomic symbolic link switching, rollback is a single operation. This is not a brochure description — the mechanism has already caught a publication with an old package left in the runner’s working directory and cancelled it.
Do you make backups? How often and do you test them?
Daily where we built it — and we stress this, because an automatic backup does not appear by itself when you move an application to a server. The backup runs at a fixed time, is restored on the next boot if the machine was off, and if the export is empty the execution is treated as a failure. The backup also leaves the machine, to a region in the European Union, with replication, versioning, reversible deletion and automatic expiry. The restore test is part of delivery: a backup that has never been restored is an assumption, not a backup.
Who finds out first when something goes down?
It depends on what we built, and it is worth saying without embellishment. Container-level health checks and application status endpoints exist; the alarm to a messaging channel, with rate limiting, exists where we built it. A status check point that no one queries is not monitoring — it is a page. If you want real monitoring, it is a separate stage, with an external observer that queries periodically and an alert recipient who is allowed to be woken up.
Do you apply database migrations automatically on every deployment?
No, and that is a deliberate decision, not an oversight. The deployment chain builds and copies code; that is all. Schema changes are versioned files in the repository, applied manually, with a fresh backup behind them, and components that keep their schema in memory are restarted afterwards. An automatically applied migration in production by a process that does not know what is in the table is the usual way to lose data irreversibly.
How do you prevent your deployment chain from becoming an attack path?
By three rules. External actions are pinned to the full commit fingerprint, not to a tag — in March 2026 a widely used action was redirected from its tags to malicious code and reached more than 23,000 repositories in 24 hours. The working copy does not keep credentials. Deployment is not done with an access key stored in the code platform, but through its own runner that executes on the target machine, with rights granted point by point. We recognise that not all our older projects still follow all three; migrating them is a task in itself.
Do you take over infrastructure built by someone else?
Yes, and the first pass is always an inventory, not a change. What actually runs, under which supervisor, with which versions, which ports are exposed, which backups exist, whether any has ever been restored, what secrets have ended up in repositories, and to what extent the configuration in the repository still resembles the file on the server. The last check almost always turns up something: we have documented, in a project of our own, a configuration file edited directly in production, which left a backup copy with a timestamp beside it.
What happens if we want to work with someone else?
You leave entirely. The infrastructure sits on your accounts with the provider from the start, and the handover includes the repository with all server configurations, the deployment and rollback procedure, the tested restore procedure, and the list of scheduled tasks with what each one does. Protection against accidental deletion of the production resource group is set up from installation. If a provider conditions your departure on rewriting the infrastructure, that was the problem, not the technology.