<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: MP Singh</title>
    <description>The latest articles on DEV Community by MP Singh (@mp_singh).</description>
    <link>https://dev.to/mp_singh</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3873409%2F0437544c-15a5-449f-ad08-8f611566087d.png</url>
      <title>DEV Community: MP Singh</title>
      <link>https://dev.to/mp_singh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mp_singh"/>
    <language>en</language>
    <item>
      <title>Replaced Acquia (€134/month) with a €10 Hetzner VPS. One bash script. Full enterprise Drupal stack. XeLaTeX, S3, preview environments, Grafana — all included. Here is exactly how.</title>
      <dc:creator>MP Singh</dc:creator>
      <pubDate>Sun, 12 Apr 2026 05:53:20 +0000</pubDate>
      <link>https://dev.to/mp_singh/replaced-acquia-eu134month-with-a-eu10-hetzner-vps-one-bash-script-full-enterprise-drupal-stack-3n5d</link>
      <guid>https://dev.to/mp_singh/replaced-acquia-eu134month-with-a-eu10-hetzner-vps-one-bash-script-full-enterprise-drupal-stack-3n5d</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/mp_singh/-how-i-replaced-acquia-eu134month-with-a-eu10-hetzner-vps-and-beat-it-on-every-feature-3337" class="crayons-story__hidden-navigation-link"&gt;How I Replaced Acquia (€134/month) with a €10 Hetzner VPS — and Beat It on Every Feature&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/mp_singh" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3873409%2F0437544c-15a5-449f-ad08-8f611566087d.png" alt="mp_singh profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/mp_singh" class="crayons-story__secondary fw-medium m:hidden"&gt;
              MP Singh
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                MP Singh
                
              
              &lt;div id="story-author-preview-content-3489338" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/mp_singh" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3873409%2F0437544c-15a5-449f-ad08-8f611566087d.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;MP Singh&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/mp_singh/-how-i-replaced-acquia-eu134month-with-a-eu10-hetzner-vps-and-beat-it-on-every-feature-3337" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 12&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/mp_singh/-how-i-replaced-acquia-eu134month-with-a-eu10-hetzner-vps-and-beat-it-on-every-feature-3337" id="article-link-3489338"&gt;
          How I Replaced Acquia (€134/month) with a €10 Hetzner VPS — and Beat It on Every Feature
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/drupal"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;drupal&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/selfhosted"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;selfhosted&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devops&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/docker"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;docker&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/mp_singh/-how-i-replaced-acquia-eu134month-with-a-eu10-hetzner-vps-and-beat-it-on-every-feature-3337#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>How I Replaced Acquia (€134/month) with a €10 Hetzner VPS — and Beat It on Every Feature</title>
      <dc:creator>MP Singh</dc:creator>
      <pubDate>Sun, 12 Apr 2026 05:41:52 +0000</pubDate>
      <link>https://dev.to/mp_singh/-how-i-replaced-acquia-eu134month-with-a-eu10-hetzner-vps-and-beat-it-on-every-feature-3337</link>
      <guid>https://dev.to/mp_singh/-how-i-replaced-acquia-eu134month-with-a-eu10-hetzner-vps-and-beat-it-on-every-feature-3337</guid>
      <description>&lt;p&gt;I run a Drupal 11 production site. For years, managed Drupal hosting meant one thing: pay Acquia, Pantheon, or Platform.sh a significant monthly fee and hope nothing breaks.&lt;/p&gt;

&lt;p&gt;Last month I built Actools — a single-command enterprise Drupal installer that runs on a €10/month Hetzner VPS. It now handles everything my managed hosting used to do, plus things it never did.&lt;/p&gt;

&lt;p&gt;Here is the honest comparison.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Managed Hosting Gives You
&lt;/h2&gt;

&lt;p&gt;Acquia Cloud starts at around €134/month for a basic production environment. For that you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Managed Drupal hosting&lt;/li&gt;
&lt;li&gt;Automated backups&lt;/li&gt;
&lt;li&gt;A CDN&lt;/li&gt;
&lt;li&gt;SSH access&lt;/li&gt;
&lt;li&gt;A deployment pipeline (basic)&lt;/li&gt;
&lt;li&gt;Support tickets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What you do not get: control. You cannot touch the server. You cannot customise the stack. You cannot add a XeLaTeX worker for PDF generation. You cannot run your own Redis configuration. You pay for their infrastructure decisions.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built Instead
&lt;/h2&gt;

&lt;p&gt;One bash script. One config file. One command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; ./actools.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What it deploys in under 10 minutes on a fresh Hetzner VPS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Drupal 11&lt;/strong&gt; — production-isolated with PHP 8.3-FPM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caddy 2.8&lt;/strong&gt; — automatic HTTPS, custom rate-limiting plugin&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MariaDB 11.4&lt;/strong&gt; — with binary logging for point-in-time recovery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redis 7&lt;/strong&gt; — session caching, page caching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XeLaTeX worker&lt;/strong&gt; — PDF generation fully containerised&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;S3 storage&lt;/strong&gt; — works with AWS, Backblaze, Wasabi, Cloudflare R2, MinIO&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preview environments&lt;/strong&gt; — &lt;code&gt;actools branch feature-x&lt;/code&gt; spins up a full isolated environment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD pipeline&lt;/strong&gt; — GitHub Actions integration built in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prometheus + Grafana&lt;/strong&gt; — full observability stack&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated backups&lt;/strong&gt; — encrypted, offsite, with restore testing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-healing health checks&lt;/strong&gt; — containers restart on failure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-downtime migrations&lt;/strong&gt; — database migrations without taking the site down&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total cost: &lt;strong&gt;€10/month&lt;/strong&gt; for a Hetzner CX22 (2 vCPU, 4GB RAM).&lt;/p&gt;




&lt;h2&gt;
  
  
  The XeLaTeX Part
&lt;/h2&gt;

&lt;p&gt;This is the detail that matters if you generate PDFs from Drupal content.&lt;/p&gt;

&lt;p&gt;Every managed host I tried either did not support XeLaTeX at all, or required a separate server, or had it as an expensive add-on. With Actools, the XeLaTeX worker lives inside a Docker container. It builds once, caches, and is available to every environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;actools pdf-test          &lt;span class="c"&gt;# Verifies XeLaTeX is working&lt;/span&gt;
actools storage-info      &lt;span class="c"&gt;# Shows S3 config and PDF mode&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PDFs generated by Drupal go directly to S3. No local storage. No egress fees with Cloudflare R2.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Preview Environments Part
&lt;/h2&gt;

&lt;p&gt;This one still surprises people when I show them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;actools branch feature-redesign
&lt;span class="c"&gt;# → Creates: dev-feature-redesign.yourdomain.com&lt;/span&gt;
&lt;span class="c"&gt;# → Full database clone&lt;/span&gt;
&lt;span class="c"&gt;# → Full files clone&lt;/span&gt;
&lt;span class="c"&gt;# → Isolated PHP-FPM container&lt;/span&gt;
&lt;span class="c"&gt;# → Own Redis namespace&lt;/span&gt;
&lt;span class="c"&gt;# → Automatic HTTPS&lt;/span&gt;

actools branch &lt;span class="nt"&gt;--list&lt;/span&gt;
actools branch &lt;span class="nt"&gt;--destroy&lt;/span&gt; feature-redesign
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pantheon charges extra for multidev environments. Acquia limits them by plan. With Actools they are unlimited and take about 90 seconds to spin up.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Observability Part
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;actools health
&lt;span class="c"&gt;# → Checks: web, database, cache, worker, storage&lt;/span&gt;
&lt;span class="c"&gt;# → Returns: green/yellow/red per component&lt;/span&gt;
&lt;span class="c"&gt;# → Auto-restarts failed containers&lt;/span&gt;

actools logs &lt;span class="nt"&gt;--tail&lt;/span&gt; 100
actools drush status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Grafana dashboards are available at &lt;code&gt;grafana.yourdomain.com&lt;/code&gt; with Drupal-specific metrics out of the box.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Backup Part
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;actools backup
&lt;span class="c"&gt;# → Dumps database&lt;/span&gt;
&lt;span class="c"&gt;# → Archives files&lt;/span&gt;
&lt;span class="c"&gt;# → Encrypts with age&lt;/span&gt;
&lt;span class="c"&gt;# → Uploads to S3&lt;/span&gt;
&lt;span class="c"&gt;# → Tests restore in isolation&lt;/span&gt;
&lt;span class="c"&gt;# → Reports: backup verified&lt;/span&gt;

actools restore-test
&lt;span class="c"&gt;# → Pulls latest backup&lt;/span&gt;
&lt;span class="c"&gt;# → Restores to isolated environment&lt;/span&gt;
&lt;span class="c"&gt;# → Runs smoke tests&lt;/span&gt;
&lt;span class="c"&gt;# → Confirms data integrity&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most managed hosts say "we take backups." Actools proves the backup works every time it runs.&lt;/p&gt;




&lt;h2&gt;
  
  
  What It Cannot Do (Honest)
&lt;/h2&gt;

&lt;p&gt;Managed hosts have large support teams. If something goes wrong at 3am, you can file a ticket.&lt;/p&gt;

&lt;p&gt;With Actools you are the support team. The health checks, the observability, the self-healing containers — they reduce the 3am events significantly. But they do not eliminate the possibility. If you are not comfortable being the operator of your own infrastructure, managed hosting is still the right answer for you.&lt;/p&gt;

&lt;p&gt;Actools is for teams and individuals who want control, want cost efficiency, and are comfortable running a VPS.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Acquia Basic&lt;/th&gt;
&lt;th&gt;Pantheon Performance&lt;/th&gt;
&lt;th&gt;Actools + Hetzner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Monthly cost&lt;/td&gt;
&lt;td&gt;~€134&lt;/td&gt;
&lt;td&gt;~€179&lt;/td&gt;
&lt;td&gt;€10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preview environments&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Extra cost&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XeLaTeX / custom workers&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full server access&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observability (Grafana)&lt;/td&gt;
&lt;td&gt;Extra&lt;/td&gt;
&lt;td&gt;Extra&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restore testing&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Automated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 provider choice&lt;/td&gt;
&lt;td&gt;Locked&lt;/td&gt;
&lt;td&gt;Locked&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;The installer and full documentation are available at &lt;a href="https://feesix.com" rel="noopener noreferrer"&gt;feesix.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Hetzner VPS (CX22 or larger, €10/month)&lt;/li&gt;
&lt;li&gt;Ubuntu 24.04&lt;/li&gt;
&lt;li&gt;A domain pointing at the server
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone into a dedicated directory — important&lt;/span&gt;
&lt;span class="c"&gt;# The installer uses the directory it runs from as the project root&lt;/span&gt;
git clone https://github.com/actools-pl/actoolsDrupal.git
&lt;span class="nb"&gt;cd &lt;/span&gt;actoolsDrupal

&lt;span class="c"&gt;# Configure&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;actools.env.example actools.env
nano actools.env
&lt;span class="c"&gt;# Required: BASE_DOMAIN, DRUPAL_ADMIN_EMAIL&lt;/span&gt;
&lt;span class="c"&gt;# Everything else auto-generates&lt;/span&gt;

&lt;span class="c"&gt;# Install&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./actools.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is it. Drupal 11 with the full enterprise stack, running in under 10 minutes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;One important note:&lt;/strong&gt; Always clone into a subdirectory as shown above. The installer creates all project files — &lt;code&gt;docker-compose.yml&lt;/code&gt;, &lt;code&gt;Caddyfile&lt;/code&gt;, &lt;code&gt;docroot/&lt;/code&gt;, &lt;code&gt;logs/&lt;/code&gt;, &lt;code&gt;backups/&lt;/code&gt; — relative to wherever &lt;code&gt;actools.sh&lt;/code&gt; lives. If you run it from your home directory directly, everything lands there. Clone first, then run.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What is Coming
&lt;/h2&gt;

&lt;p&gt;Phase 4.5 is in progress: encrypted offsite backups, Cloudflare Tunnel for zero-trust networking, multi-user RBAC with audit trails, and a DNA/resurrection system that rebuilds a complete server from a single JSON snapshot in under 15 minutes.&lt;/p&gt;

&lt;p&gt;The goal is a platform that any serious Drupal team can run confidently without a managed hosting bill.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built on a €10 server. Running in production. Replacing a €134/month bill.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Questions or feedback? Reach me at &lt;a href="mailto:hello@feesix.com"&gt;hello@feesix.com&lt;/a&gt; or leave a comment below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>drupal</category>
      <category>selfhosted</category>
      <category>devops</category>
      <category>docker</category>
    </item>
  </channel>
</rss>
