{"id":988822,"date":"2026-09-25T23:14:25","date_gmt":"2026-09-25T19:14:25","guid":{"rendered":"https:\/\/techservice.ge\/?p=988822"},"modified":"2026-09-25T23:16:19","modified_gmt":"2026-09-25T19:16:19","slug":"medical-company-vps-migration-digitalocean-to-hetzner","status":"publish","type":"post","link":"https:\/\/techservice.ge\/en\/medical-company-vps-migration-digitalocean-to-hetzner\/","title":{"rendered":"Migrating a medical company from DigitalOcean to Hetzner without disrupting websites"},"content":{"rendered":"<div class=\"vgblk-rw-wrapper limit-wrapper\">\n<p class=\"wp-block-paragraph\"><strong>How we moved three public websites and five internal applications from a six-year-old, unmaintainable, difficult-to-manage server to a new environment.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The project at a glance<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Client:<\/strong> Georgian Medical Company<\/li>\n\n\n\n<li><strong>Initial state:<\/strong> DigitalOcean VPS, old version of Ubuntu, and limited administrative access<\/li>\n\n\n\n<li><strong>Solution:<\/strong> Exploring data and services, preparing a new Hetzner server, setting up EasyPanel and an S3 bucket, configuring domains in Cloudflare<\/li>\n\n\n\n<li><strong>Result:<\/strong> Eight services in a new environment; public websites transition without downtime or traffic loss<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Problem: Running services on a server that has become difficult to manage<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The company&#039;s websites and internal applications were running on a DigitalOcean VPS server. The version of Ubuntu installed on it was outdated, and the software environment had not been updated for six years. In addition, the company no longer had the necessary access to fully administer the server. Due to the outdated software, working with the DigitalOcean terminal was also limited.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This situation created two problems. The first was <strong>Operational attitude<\/strong>: If any service were to be disrupted, it would be difficult to check and restore it. The second was <strong>Uncertainty in migration<\/strong>: When the server configuration is not accessible in the usual way, you cannot assume that simply copying files will make websites and applications work in the new environment.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Therefore, the project could not start with the purchase of a new VPS. First, we had to obtain sufficient information about the existing environment.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why was the unupdateable server a risk?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A server that has not been updated for a long time does not automatically mean that it has been attacked or that data has been exposed. However, it increases the risk that known problems in the operating system or applications running on it will remain unpatched. The exact level of risk depends on the versions installed, the status of security updates, the server configuration, and which services are accessible from the Internet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In such an environment, a company should especially consider several possible scenarios:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Unauthorized access to the server.<\/strong> If a publicly available program or service is outdated, an unpatched vulnerability could allow an attacker to gain access to the system.<\/li>\n\n\n\n<li><strong>Unauthorized reading or modification of data.<\/strong> Data and application configurations hosted on the server are at additional risk if the system is compromised.<\/li>\n\n\n\n<li><strong>Disruption of services.<\/strong> In legacy environments, diagnosing and fixing a problem can take longer, especially when administrative access is limited.<\/li>\n\n\n\n<li><strong>Difficulty of recovery.<\/strong> During an incident, simply having data is not enough \u2014 we need to know how applications, their settings, storage, and domains are connected to each other.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This is outdated infrastructure. <strong>Possible risks<\/strong> Description: No specific cyberattack or data breach has been confirmed within the scope of this project.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">First step: What should we move?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Due to limited access to the server, we started the migration by examining the available data and running services. We extracted the information needed to migrate from the old DigitalOcean VPS and determined the requirements for each website and internal application.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This step was necessary because a website is not just about its visible pages. It may require data, application settings, storage connectivity, and proper domain configuration to function. Similarly, an internal application will only work properly on a new server if the components it needs are also properly prepared.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Our goal was to understand before the transition, <strong>What worked on the old server and what each service would need in the new environment<\/strong>. This reduced the risk of missing any important components at the end of the migration.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step Two: Preparing a New Environment on Hetzner<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">After reviewing the existing environment, we configured a new server on Hetzner. Instead of directly porting the limitations of the old server, we prepared a new working environment for websites and applications.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Server management system <strong>EasyPanel<\/strong> We set it up. Its purpose was to create a unified interface for managing services for the company. This was especially important for a project where one of the initial problems was limited access to the old infrastructure: management in the new environment should not become a complicated and opaque process again.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We also held <strong>S3 bucket<\/strong> and the storage settings required for the new environment. Configuring the storage is a separate part of the migration, because the proper functioning of the service is not determined only by its launch \u2014 it must also be able to work with the necessary data and appropriate settings.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step Three: Transfer Services and Set Up Domains<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">After preparing the new server, we migrated the websites and internal applications to Hetzner. The main task at this stage was not just to deploy the services on the new server, but also to ensure their operation in the new environment.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For public websites, it was also important to point domains to the correct address. <strong>We have configured DNS and domain settings in Cloudflare.<\/strong>, so that websites can be served to users from the new server. Changing domain settings is one of the most sensitive moments of migration: if the new environment is not ready, users may end up with an inaccessible or incompletely functioning website.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The transition to this project was made so that <strong>Three public websites were not down and traffic was not lost.<\/strong>. We also migrated five of the company&#039;s internal applications to the new server.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What did the company receive?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">As a result of the migration, the company&#039;s digital services are no longer dependent on DigitalOcean VPS, which has not been updated for six years. They are running in a new environment prepared on Hetzner, where EasyPanel is used for server management, and the required storage configuration includes an S3 bucket. Domain settings are configured through Cloudflare.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The main achievement for the company was <strong>Infrastructure changes without disrupting public websites<\/strong>. However, the new environment has a clear management system, which was one of the main obstacles on the old server.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What does this project teach us?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Replacing an outdated VPS may seem urgent, but rushing a migration creates the risk of disruption. Especially when access to the old server is limited, the work must be done in the right order: first, examine the available data and dependencies, then prepare the new environment, and finally, transfer services and domains.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Are your company&#039;s websites or internal systems running on an outdated server?<\/strong> <a href=\"https:\/\/techservice.ge\/en\/contact\/\">Contact us at Techservice<\/a> We will assess the existing environment, access restrictions, and migration routes.<\/p>\n<\/div><!-- .vgblk-rw-wrapper -->","protected":false},"excerpt":{"rendered":"<p>\u10e0\u10dd\u10d2\u10dd\u10e0 \u10d2\u10d0\u10d3\u10d0\u10d5\u10d8\u10e2\u10d0\u10dc\u10d4\u10d7 \u10e1\u10d0\u10db\u10d8 \u10e1\u10d0\u10ef\u10d0\u10e0\u10dd \u10d5\u10d4\u10d1\u10e1\u10d0\u10d8\u10e2\u10d8 \u10d3\u10d0 \u10ee\u10e3\u10d7\u10d8 \u10e8\u10d8\u10d3\u10d0 \u10d0\u10de\u10da\u10d8\u10d9\u10d0\u10ea\u10d8\u10d0 \u10d4\u10e5\u10d5\u10e1\u10d8 \u10ec\u10da\u10d8\u10e1 \u10d2\u10d0\u10dc\u10db\u10d0\u10d5\u10da\u10dd\u10d1\u10d0\u10e8\u10d8 \u10d2\u10d0\u10dc\u10e3\u10d0\u10ee\u10da\u10d4\u10d1\u10d4\u10da\u10d8, \u10e0\u10d7\u10e3\u10da\u10d0\u10d3 \u10e1\u10d0\u10db\u10d0\u10e0\u10d7\u10d0\u10d5\u10d8 \u10e1\u10d4\u10e0\u10d5\u10d4\u10e0\u10d8\u10d3\u10d0\u10dc \u10d0\u10ee\u10d0\u10da \u10d2\u10d0\u10e0\u10d4\u10db\u10dd\u10e8\u10d8. \u10de\u10e0\u10dd\u10d4\u10e5\u10e2\u10d8 \u10d4\u10e0\u10d7\u10d8 \u10e8\u10d4\u10ee\u10d4\u10d3\u10d5\u10d8\u10d7 \u10de\u10e0\u10dd\u10d1\u10da\u10d4\u10db\u10d0: \u10db\u10dd\u10e5\u10db\u10d4\u10d3\u10d8 \u10e1\u10d4\u10e0\u10d5\u10d8\u10e1\u10d4\u10d1\u10d8 \u10e1\u10d4\u10e0\u10d5\u10d4\u10e0\u10d6\u10d4, \u10e0\u10dd\u10db\u10da\u10d8\u10e1 \u10db\u10d0\u10e0\u10d7\u10d5\u10d0\u10ea \u10d2\u10d0\u10e0\u10d7\u10e3\u10da\u10d3\u10d0 \u10d9\u10dd\u10db\u10de\u10d0\u10dc\u10d8\u10d8\u10e1 \u10d5\u10d4\u10d1\u10e1\u10d0\u10d8\u10e2\u10d4\u10d1\u10d8 \u10d3\u10d0 \u10e8\u10d8\u10d3\u10d0 \u10d0\u10de\u10da\u10d8\u10d9\u10d0\u10ea\u10d8\u10d4\u10d1\u10d8 DigitalOcean-\u10d8\u10e1 VPS \u10e1\u10d4\u10e0\u10d5\u10d4\u10e0\u10d6\u10d4 \u10db\u10e3\u10e8\u10d0\u10dd\u10d1\u10d3\u10d0. \u10db\u10d0\u10e1\u10d6\u10d4 \u10d3\u10d0\u10e7\u10d4\u10dc\u10d4\u10d1\u10e3\u10da\u10d8 Ubuntu-\u10e1 \u10d5\u10d4\u10e0\u10e1\u10d8\u10d0 \u10db\u10dd\u10eb\u10d5\u10d4\u10da\u10d4\u10d1\u10e3\u10da\u10d8 \u10d8\u10e7\u10dd, \u10ee\u10dd\u10da\u10dd \u10de\u10e0\u10dd\u10d2\u10e0\u10d0\u10db\u10e3\u10da\u10d8 \u10d2\u10d0\u10e0\u10d4\u10db\u10dd \u10d4\u10e5\u10d5\u10e1\u10d8 \u10ec\u10da\u10d8\u10e1 \u10d2\u10d0\u10dc\u10db\u10d0\u10d5\u10da\u10dd\u10d1\u10d0\u10e8\u10d8 \u10d0\u10e0 \u10d2\u10d0\u10dc\u10d0\u10ee\u10da\u10d4\u10d1\u10e3\u10da\u10d0. \u10d0\u10db\u10d0\u10e1\u10d7\u10d0\u10dc, \u10d9\u10dd\u10db\u10de\u10d0\u10dc\u10d8\u10d0\u10e1 \u10d0\u10e6\u10d0\u10e0 \u10f0\u10e5\u10dd\u10dc\u10d3\u10d0&#8230;<\/p>","protected":false},"author":2,"featured_media":988823,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"content-type":"","page_builder":"","footnotes":""},"categories":[3],"tags":[],"class_list":["post-988822","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-case-studies"],"_links":{"self":[{"href":"https:\/\/techservice.ge\/en\/wp-json\/wp\/v2\/posts\/988822","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/techservice.ge\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/techservice.ge\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/techservice.ge\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/techservice.ge\/en\/wp-json\/wp\/v2\/comments?post=988822"}],"version-history":[{"count":2,"href":"https:\/\/techservice.ge\/en\/wp-json\/wp\/v2\/posts\/988822\/revisions"}],"predecessor-version":[{"id":988825,"href":"https:\/\/techservice.ge\/en\/wp-json\/wp\/v2\/posts\/988822\/revisions\/988825"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/techservice.ge\/en\/wp-json\/wp\/v2\/media\/988823"}],"wp:attachment":[{"href":"https:\/\/techservice.ge\/en\/wp-json\/wp\/v2\/media?parent=988822"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/techservice.ge\/en\/wp-json\/wp\/v2\/categories?post=988822"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/techservice.ge\/en\/wp-json\/wp\/v2\/tags?post=988822"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}