<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Drupal Planet on Colan Schwartz on Cloud Architecture, Security, Privacy &amp; Startups</title>
        <link>https://colan.pro/tags/drupal-planet/</link>
        <description>Recent content in Drupal Planet on Colan Schwartz on Cloud Architecture, Security, Privacy &amp; Startups</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-ca</language>
        <copyright>8494959 Canada Inc.</copyright>
        <lastBuildDate>Wed, 22 Oct 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://colan.pro/tags/drupal-planet/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Announcing Drubernetes v2: Moving from Bitnami to the Official MariaDB Operator</title>
        <link>https://colan.pro/blog/drubernetes-v2-bitnami-to-official-mariadb-operator/</link>
        <pubDate>Wed, 22 Oct 2025 00:00:00 +0000</pubDate>
        
        <guid>https://colan.pro/blog/drubernetes-v2-bitnami-to-official-mariadb-operator/</guid>
        <description>&lt;img src="https://colan.pro/blog/drubernetes-v2-bitnami-to-official-mariadb-operator/drubernetes-v2-bitnami-to-official-mariadb-operator.png" alt="Featured image of post Announcing Drubernetes v2: Moving from Bitnami to the Official MariaDB Operator" /&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;This article was &lt;a class=&#34;link&#34; href=&#34;https://backupscale.com/posts/drubernetes-v2-bitnami-to-official-mariadb-operator/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;originally published on the BackUpScale blog&lt;/a&gt;.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;why-it-matters&#34;&gt;Why It Matters
&lt;/h2&gt;&lt;p&gt;For many open-source projects and small teams, Bitnami’s charts were the default starting point for running DBs and applications on Kubernetes. When a large vendor changes course, it sends ripples across the ecosystem; it can suddenly make basic infrastructure harder or more expensive to maintain. Drubernetes v2 ensures that Drupal deployments remain fully open, self-contained, and future-proof, regardless of corporate licensing shifts. Community-driven alternatives are essential to preserve innovation and accessibility.&lt;/p&gt;
&lt;h2 id=&#34;background-why-drubernetes-needed-a-v2&#34;&gt;Background: Why Drubernetes Needed a v2
&lt;/h2&gt;&lt;p&gt;When we first built Drubernetes, the goal was simple: make it easy for various organizations to deploy Drupal on Kubernetes using Terraform for infrastructure automation. Our stack relied heavily on community-maintained Helm charts (most notably &lt;a class=&#34;link&#34; href=&#34;https://artifacthub.io/packages/helm/bitnami/mariadb&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Bitnami’s MariaDB chart&lt;/a&gt;) for reliability and ease of integration.&lt;/p&gt;
&lt;p&gt;But the open-source ecosystem around Bitnami has shifted dramatically.&lt;/p&gt;
&lt;h2 id=&#34;bitnamis-policy-shift-from-open-access-to-paywall&#34;&gt;Bitnami’s Policy Shift: From Open Access to Paywall
&lt;/h2&gt;&lt;p&gt;Bitnami historically maintained one of the best collections of open Helm charts in the cloud-native space. These charts were widely used for MySQL, MariaDB, Redis, WordPress, and many others, often forming the foundation of production workloads for startups and open-source projects.&lt;/p&gt;
&lt;p&gt;However, following VMware’s 2022 acquisition by Broadcom and its ensuing restructuring, &lt;strong&gt;Bitnami’s open chart repositories were deprecated&lt;/strong&gt;, and &lt;strong&gt;support for their community versions effectively ended&lt;/strong&gt;. As covered in &lt;a class=&#34;link&#34; href=&#34;https://fastcode.io/2025/08/30/the-69-billion-domino-effect-how-vmwares-debt-fueled-acquisition-is-killing-open-source-one-repository-at-a-time/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Fastcode’s analysis&lt;/a&gt;, Broadcom’s pivot toward expensive subscription-only licensing has created a domino effect, shuttering long-standing open-source pipelines and forcing projects like ours to re-architect.&lt;/p&gt;
&lt;p&gt;For open-source maintainers like &lt;a class=&#34;link&#34; href=&#34;https://backupscale.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;BackUpScale&lt;/a&gt;, continuing to use Bitnami’s images now involves licensing uncertainty,
limited updates, instability and the risk of losing upstream security fixes.&lt;/p&gt;
&lt;p&gt;Simply put: &lt;strong&gt;Bitnami’s stack is no longer a viable base for sustainable open-source projects with limited funding.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;what-changed-in-drubernetes-v2&#34;&gt;What Changed in Drubernetes v2
&lt;/h2&gt;&lt;p&gt;To keep Drubernetes fully open and future-proof, we replaced our only Bitnami dependency, MariaDB, with the official &lt;a class=&#34;link&#34; href=&#34;https://mariadb.com/docs/tools/mariadb-enterprise-operator/installation/helm&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MariaDB Enterprise Operator&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can review the full changelog on the &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/backupscale/drubernetes/-/releases/2.0.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;2.0.0 release page&lt;/a&gt; and discussion in &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/backupscale/drubernetes/-/issues/3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Issue #3&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;migration-guide-upgrading-from-v1x-to-v20&#34;&gt;Migration Guide: Upgrading from v1.x to v2.0
&lt;/h2&gt;&lt;p&gt;While this release represents a major step forward, the migration process does require manual intervention due to the difference in architectures.&lt;/p&gt;
&lt;p&gt;Please review the complete details in the &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/backupscale/drubernetes/-/releases/2.0.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;release notes&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;looking-ahead&#34;&gt;Looking Ahead
&lt;/h2&gt;&lt;p&gt;Drubernetes v2 isn’t just about keeping up with upstream changes.  It’s about reinforcing the open-source foundations we depend on. By moving to the official Helm charts, we gain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transparent governance and roadmaps&lt;/li&gt;
&lt;li&gt;Consistent upstream support&lt;/li&gt;
&lt;li&gt;Easier compliance for enterprise users&lt;/li&gt;
&lt;li&gt;Freedom from vendor lock-in&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We’ll continue to monitor the health of the operator ecosystem and ensure Drubernetes remains reliable, free from opaque licensing traps.&lt;/p&gt;
&lt;p&gt;For more information, visit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The introducing article:&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://backupscale.com/posts/drubernetes-terraform-module-for-kubernetes-clusters/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Want to Run Drupal in Kubernetes? Try Our New Terraform Module&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The project page:&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/backupscale/drubernetes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;gitlab.com/backupscale/drubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Terraform registry module:&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://registry.terraform.io/modules/BackUpScale/drupal/kubernetes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;BackUpScale/drupal/kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Want to Run Drupal in Kubernetes? Try Our New Terraform Module</title>
        <link>https://colan.pro/blog/drubernetes-terraform-module-for-drupal-in-kubernetes-clusters/</link>
        <pubDate>Sun, 13 Jul 2025 00:00:00 +0000</pubDate>
        
        <guid>https://colan.pro/blog/drubernetes-terraform-module-for-drupal-in-kubernetes-clusters/</guid>
        <description>&lt;img src="https://colan.pro/blog/drubernetes-terraform-module-for-drupal-in-kubernetes-clusters/drubernetes-terraform-kubernetes-drupal.png" alt="Featured image of post Want to Run Drupal in Kubernetes? Try Our New Terraform Module" /&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;This article was &lt;a class=&#34;link&#34; href=&#34;https://backupscale.com/posts/drubernetes-terraform-module-for-kubernetes-clusters/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;originally published on the BackUpScale blog&lt;/a&gt;.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;background&#34;&gt;Background
&lt;/h2&gt;&lt;p&gt;Our customer dashboard, which will soon be used for managing subscriptions to our backup service (and not just newsletters and our contact form, as we&amp;rsquo;re doing now), is built on the Drupal data management framework.  Until now, we&amp;rsquo;ve been hosting it with a company that specializes in hosting very specific types of applications, like Drupal.  This wasn&amp;rsquo;t working for us because our service is running in our Kubernetes cluster at a cloud service provider that specializes in managed Kubernetes hosting, which let&amp;rsquo;s us run whatever applications we want, and configure them however we need.  The challenge was getting the dashboard to communicate securely with our other applications.&lt;/p&gt;
&lt;p&gt;It needs to communicate with our back-end systems in the Kubernetes cluster to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;send requests from customers to provision services,&lt;/li&gt;
&lt;li&gt;configure customer accounts, and&lt;/li&gt;
&lt;li&gt;receive status information from back-end services to create log entries that users can see in their accounts.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;why-the-old-approach-broke-down&#34;&gt;Why the old approach broke down
&lt;/h2&gt;&lt;p&gt;In order for things to work with the old set up, we&amp;rsquo;d have to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;expose internal applications to the Internet (so the dashboard site could access them), and&lt;/li&gt;
&lt;li&gt;add additional layers of security to the communications to ensure privacy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We didn&amp;rsquo;t feel as confident with this set-up as moving everything into our private Kubernetes network, which protects all of our services with a single firewall.  Keeping non-public facing services within that network ensures that they&amp;rsquo;re not accessible by anyone on the greater Internet (except our staff using the company VPN), which ensures greater security and privacy for our users.&lt;/p&gt;
&lt;p&gt;In order to make the change, we needed to be able to run a Drupal site within Kubernetes.  Given that Drupal is a popular framework, and Kubernetes is a popular container orchestration system, we assumed that there would be good options for putting them together using open-source infrastructure as code (IaC) to handle the automated provisioning (we automate everything here).  However, we weren&amp;rsquo;t able to find anything that could help us.&lt;/p&gt;
&lt;h2 id=&#34;evaluated-options&#34;&gt;Evaluated options
&lt;/h2&gt;&lt;p&gt;We explored the following options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://artifacthub.io/packages/helm/bitnami/drupal&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Bitnami&amp;rsquo;s Helm chart&lt;/a&gt; (&lt;a class=&#34;link&#34; href=&#34;https://github.com/bitnami/charts/issues/5434#issuecomment-1001165522&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;no longer supported as of 2021&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/geerlingguy/drupal-operator&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Jeff Geerling&amp;rsquo;s Drupal Operator&lt;/a&gt; (&lt;a class=&#34;link&#34; href=&#34;https://github.com/geerlingguy/drupal-operator/issues/28#issuecomment-2585584277&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;no longer supported as of early 2025&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Bitnami Helm chart did at least one very strange thing: It was placing the Drupal code files on the persistent volume instead of placing them in the container image.  We wanted the Drupal code (or at least the Composer files that build it along with any custom code) to be version controlled with Git.  When we tried to work around this, &lt;a class=&#34;link&#34; href=&#34;https://github.com/bitnami/charts/issues/8302&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;they made it very difficult to make these changes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Jeff Geerling simply stopped recommending his earlier approach (except for potentially hosting many sites on a hosting platform), and said that he currently uses his own Kubernetes primitives.  So we took that idea, and expanded on it to build a fairly complete solution.  Once we had something that worked for us, we believed we could make it generic enough to make it available to everyone else.  So that&amp;rsquo;s what we did.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://colan.pro/blog/drubernetes-terraform-module-for-drupal-in-kubernetes-clusters/moving-dashboard-inside-cluster.png&#34;
	width=&#34;665&#34;
	height=&#34;592&#34;
	srcset=&#34;https://colan.pro/blog/drubernetes-terraform-module-for-drupal-in-kubernetes-clusters/moving-dashboard-inside-cluster_hu8b6b4db856f7790f46f53359d0b88936_46423_480x0_resize_box_3.png 480w, https://colan.pro/blog/drubernetes-terraform-module-for-drupal-in-kubernetes-clusters/moving-dashboard-inside-cluster_hu8b6b4db856f7790f46f53359d0b88936_46423_1024x0_resize_box_3.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;diagram&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;112&#34;
		data-flex-basis=&#34;269px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;This move eliminated two Internet-facing endpoints and let us apply a single network-policy layer to all microservices.  Additionally, running inside the cluster removes a public load balancer, and shrinks latency.&lt;/p&gt;
&lt;h2 id=&#34;meet-drubernetes&#34;&gt;Meet &amp;ldquo;Drubernetes&amp;rdquo;
&lt;/h2&gt;&lt;p&gt;Because we automate all of our infrastructure with Terraform, we just released &lt;a class=&#34;link&#34; href=&#34;https://registry.terraform.io/modules/BackUpScale/drupal/kubernetes/latest&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drubernetes&lt;/a&gt;, a new module in the Terraform Registry, which provisions Drupal onto a generic Kubernetes cluster.  It shouldn&amp;rsquo;t matter where your cluster is, who&amp;rsquo;s managing it for you, or if you&amp;rsquo;re managing it yourself on your own hardware.  We wanted to provide something standardized that everyone can use and build from.&lt;/p&gt;
&lt;h2 id=&#34;contribute&#34;&gt;Contribute
&lt;/h2&gt;&lt;p&gt;Contributions are welcome!  Please try it, and provide any feedback that you may have.  The project is &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/backupscale/drubernetes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;hosted on Gitlab.com&lt;/a&gt;, and any issues can be opened &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/backupscale/drubernetes/-/boards&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;from the board&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;As always, if you have questions or feedback, feel free to &lt;a class=&#34;link&#34; href=&#34;https://backupscale.com/community/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;reach out&lt;/a&gt;. We appreciate your support and can’t wait to bring you the next chapter of BackupScale.&lt;/em&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>From DevOps Headaches to Seamless Onboarding: How Dropping Chocolatey Made DDEV the Perfect Fit for a Client&#39;s Drupal Team</title>
        <link>https://colan.pro/blog/dropping-chocolatey-for-ddev-on-windows-drupal-development/</link>
        <pubDate>Thu, 03 Jul 2025 00:00:00 +0000</pubDate>
        
        <guid>https://colan.pro/blog/dropping-chocolatey-for-ddev-on-windows-drupal-development/</guid>
        <description>&lt;img src="https://colan.pro/blog/dropping-chocolatey-for-ddev-on-windows-drupal-development/simpler-drupal-dev-on-windows-with-ddev.png" alt="Featured image of post From DevOps Headaches to Seamless Onboarding: How Dropping Chocolatey Made DDEV the Perfect Fit for a Client&#39;s Drupal Team" /&gt;&lt;h2 id=&#34;tldr&#34;&gt;TL;DR
&lt;/h2&gt;&lt;p&gt;After watching my enterprise client&amp;rsquo;s Drupal developers lose hours every week wrestling with raw Docker Compose for local development, I championed a switch to &lt;strong&gt;DDEV&lt;/strong&gt;, the open‑source tool that gives &lt;em&gt;“container superpowers with zero required Docker skills”&lt;/em&gt; (&lt;a class=&#34;link&#34; href=&#34;https://ddev.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ddev.com&lt;/a&gt;). One of the snags on their Windows laptops was the Chocolatey package manager, whose  install path clashed with locked‑down corporate security policies. Working with DDEV maintainer Randy Fay, I removed the Chocolatey dependency, paving the way for a leaner installer that shipped in version 1.24.5. Development team members now onboard much quicker, and leadership can point to measurable productivity gains.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-starting-point-docker-compose-drag&#34;&gt;The Starting Point: Docker Compose Drag
&lt;/h2&gt;&lt;p&gt;My client&amp;rsquo;s legacy workflow relied on a bespoke Docker Compose stack. Developers routinely diverted time to babysit containers as well as copying their work in and out, instead of writing code.  This echeos industry findings that more than &lt;a class=&#34;link&#34; href=&#34;https://www.cortex.io/report/the-2024-state-of-developer-productivity&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;58% of engineers lose 5‑plus hours per week to “unproductive work”&lt;/a&gt;.  This DevOps overhead impacts their developer experience (DX), which is a distraction from their actual work.&lt;/p&gt;
&lt;h2 id=&#34;enter-ddev&#34;&gt;Enter DDEV
&lt;/h2&gt;&lt;p&gt;DDEV abstracts all that Docker plumbing with simple commands (e.g. &lt;code&gt;ddev start&lt;/code&gt;, &lt;code&gt;ddev stop&lt;/code&gt;) while still running everything locally. Its promise, &lt;em&gt;“environments in minutes, multiple concurrent projects, and less time to deployment”&lt;/em&gt;, resonated immediately.&lt;/p&gt;
&lt;h3 id=&#34;why-it-mattered-for-drupal&#34;&gt;Why It Mattered for Drupal
&lt;/h3&gt;&lt;p&gt;A Drupal codebase is never just PHP; it drags along Composer, Drush, front‑end toolchains, and database snapshots. DDEV’s predefined &lt;strong&gt;Drupal preset&lt;/strong&gt; provides a reproducible stack with Nginx/Apache, MariaDB, and Mailhog out of the box.&lt;/p&gt;
&lt;h2 id=&#34;a-windows-speedbump-called-chocolatey&#34;&gt;A Windows Speed‑Bump Called Chocolatey
&lt;/h2&gt;&lt;p&gt;The developers work on locked‑down Windows laptops. DDEV’s install script used the &lt;strong&gt;Chocolatey&lt;/strong&gt; package manager, which corporate policies block from writing to its default location. Workarounds involved various hurdles, exactly the sort of DevOps toil they wanted to eliminate.&lt;/p&gt;
&lt;h2 id=&#34;collaborating-upstream-issue-6636--pr-7049&#34;&gt;Collaborating Upstream: Issue #6636 → PR #7049
&lt;/h2&gt;&lt;p&gt;While in research mode, I discovered &lt;a class=&#34;link&#34; href=&#34;https://github.com/ddev/ddev/issues/6636&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Issue #6636&lt;/a&gt;, maintainers themselves wanted to drop Chocolatey but hadn’t had the bandwidth to do so. I volunteered a pull request that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;removed Chocolatey from the installation process, and&lt;/li&gt;
&lt;li&gt;no longer required an Administrator Powershell; an unprivileged user could install it in a terminal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The patch was merged on &lt;a class=&#34;link&#34; href=&#34;https://github.com/ddev/ddev/pull/7049#event-17207866881&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;April 10, 2025&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;release-v1245-goodbye-chocolatey&#34;&gt;Release v1.24.5: Goodbye Chocolatey
&lt;/h2&gt;&lt;p&gt;A month later, the change landed in &lt;a class=&#34;link&#34; href=&#34;https://github.com/ddev/ddev/releases/tag/v1.24.5&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;v1.24.5&lt;/a&gt; with a shout‑out in the release notes: &lt;em&gt;“Chocolatey removed from automated Windows installation scripts. Thanks to &lt;a class=&#34;link&#34; href=&#34;https://github.com/colans&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;@colans&lt;/a&gt;.”&lt;/em&gt;  It&amp;rsquo;s now simpler for Windows developers to install DDEV, and they don&amp;rsquo;t have to be an administrator.&lt;/p&gt;
&lt;h2 id=&#34;business-case-as-pitched-to-leadership&#34;&gt;Business Case (as pitched to leadership)
&lt;/h2&gt;&lt;p&gt;&lt;em&gt;“Container superpowers with zero required Docker skills”&lt;/em&gt; isn’t just marketing. Here’s the quantified rationale I presented:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Zero Docker config&lt;/strong&gt;: &lt;code&gt;ddev start&lt;/code&gt; replaces hand‑rolled Compose files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No central registry maintenance&lt;/strong&gt;: Images build locally.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Host‑level commands&lt;/strong&gt;: &lt;code&gt;ddev drush status&lt;/code&gt; or &lt;code&gt;ddev composer install&lt;/code&gt; without &lt;code&gt;docker exec&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unified file system&lt;/strong&gt;: The code lives on the host, eliminating copy‑in/out cycles.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Safe rebuilds&lt;/strong&gt;: Deleting containers never loses work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Always‑on Git&lt;/strong&gt;: &lt;code&gt;blame&lt;/code&gt;, &lt;code&gt;diff&lt;/code&gt;, and &lt;code&gt;branch&lt;/code&gt; with the active code without stepping into the container.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;First‑class Composer&lt;/strong&gt;: Composer‑managed Drupal is just a &lt;code&gt;ddev composer require&lt;/code&gt; away.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;outcomes&#34;&gt;Outcomes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Onboarding time&lt;/strong&gt; dropped from half a day (or more) to an hour (or less).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Additonal support&lt;/strong&gt; for broken sandboxes fell to nearly zero.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Developers now focus on development&lt;/strong&gt;, not troubleshooting containers, or moving code in and out of them.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;gratitude&#34;&gt;Gratitude
&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;d like to thank &lt;a class=&#34;link&#34; href=&#34;https://github.com/rfay&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Randy Fay&lt;/a&gt; for prompt code reviews, patient feedback, and for shepherding the change into a release.&lt;/p&gt;
&lt;h2 id=&#34;ready-to-try&#34;&gt;Ready to Try?
&lt;/h2&gt;&lt;p&gt;Head to the official DDEV installation documentation and give it a spin.  And if you&amp;rsquo;re stuck on Windows, it&amp;rsquo;s now much easier to install.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Does your Drupal hosting company lack native Composer support?</title>
        <link>https://colan.pro/blog/drupal-hosting-company-lacking-composer-support/</link>
        <pubDate>Thu, 12 Mar 2020 00:00:00 +0000</pubDate>
        
        <guid>https://colan.pro/blog/drupal-hosting-company-lacking-composer-support/</guid>
        <description>&lt;img src="https://colan.pro/blog/drupal-hosting-company-lacking-composer-support/composer-plus-aegir.png" alt="Featured image of post Does your Drupal hosting company lack native Composer support?" /&gt;&lt;p&gt;&lt;em&gt;Originally published on the &lt;a class=&#34;link&#34; href=&#34;https://consensus.enterprises/blog/drupal-hosting-company-lacking-composer-support/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Consensus Enterprises blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Best practices for building Web sites in the &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Drupal&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drupal&lt;/a&gt; framework (for major versions 8 and above) dictate that codebases should be built with the &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Composer_%28software%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Composer&lt;/a&gt; package manager for PHP.  That is, the code repository for any sites relying on it should not contain any upstream code; it should only contain a makefile with instructions for assembing it.&lt;/p&gt;
&lt;p&gt;However, there are some prominent Drupal hosting companies that don&amp;rsquo;t support Composer natively.  That is, after receiving updates to Composer-controlled Git repositories, they don&amp;rsquo;t automatically rebuild the codebase, which should result in changes to the deployed code.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re hosting your site(s) at one of these companies, and you have this problem, why not consider the obvious alternative?&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.aegirproject.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Aegir&lt;/a&gt;, the one-and-only open-source hosting system for Drupal that&amp;rsquo;s been around for &lt;a class=&#34;link&#34; href=&#34;https://www.aegirproject.org/blog/aegir_turns_10/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;over 10 years&lt;/a&gt;, has had native Composer support for &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/provision/issues/2937147&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;over 2 years&lt;/a&gt;.  That is, on each and every &lt;a class=&#34;link&#34; href=&#34;https://docs.aegirproject.org/usage/platforms/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;platform&lt;/a&gt; deployment (&amp;ldquo;platform&amp;rdquo; is Aegir-speak for a Drupal codebase), Aegir reassembles the upstream code assets by running the following automatically:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;composer create-project --no-dev --no-interaction --no-progress
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;As a result, any sites created on that platform (or &lt;a class=&#34;link&#34; href=&#34;https://docs.aegirproject.org/usage/sites/tasks/#migratingupgrading-sites&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;migrated/upgraded to it&lt;/a&gt;) will have access to all of the assets built by Composer.&lt;/p&gt;
&lt;p&gt;Additionally, Aegir now ships with the &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/hosting_deploy&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Aegir Deploy&lt;/a&gt; module, which enhances the platform creation process.  It allows for the following types of deployment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Classic/None/Manual/Unmanaged&lt;/li&gt;
&lt;li&gt;Drush Makefile deployment&lt;/li&gt;
&lt;li&gt;Pure Git&lt;/li&gt;
&lt;li&gt;Composer deployment from a Git repository&lt;/li&gt;
&lt;li&gt;Composer deployment from a Packagist repository&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, please read the &lt;a class=&#34;link&#34; href=&#34;https://docs.aegirproject.org/usage/advanced/deployment/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Deployment Strategies&lt;/a&gt; section of the documentation.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;d like to get started with Aegir, the best option would be to spin up an &lt;a class=&#34;link&#34; href=&#34;https://colan.pro/blog/try-aegir-now-with-the-new-dev-vm/&#34; &gt;Aegir Development VM&lt;/a&gt;, which allows you to run it easily, play with it, and get familiar with the concepts.  Naturally, reading &lt;a class=&#34;link&#34; href=&#34;https://docs.aegirproject.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;the documentation&lt;/a&gt; helps with this too.&lt;/p&gt;
&lt;p&gt;Afterwards, review &lt;a class=&#34;link&#34; href=&#34;https://docs.aegirproject.org/install/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;the installation guide&lt;/a&gt; for more permanent options, and take advantage of our Ansible roles.  We have &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/consensus.enterprises/ansible-roles/ansible-role-aegir-policy&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;a policy role&lt;/a&gt; that configures &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/consensus.enterprises/ansible-roles/ansible-role-aegir&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;the main role&lt;/a&gt; using our favoured approach.&lt;/p&gt;
&lt;p&gt;For help, &lt;a class=&#34;link&#34; href=&#34;https://docs.aegirproject.org/community/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;contact the community&lt;/a&gt;, or &lt;a class=&#34;link&#34; href=&#34;https://colan.pro/contact&#34; &gt;get in touch with me directly&lt;/a&gt;.  I provide the following Aegir services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Installation &amp;amp; maintenance in corporate/enterprise (or other) environments&lt;/li&gt;
&lt;li&gt;Architectural and technical support&lt;/li&gt;
&lt;li&gt;Hosting guidance&lt;/li&gt;
&lt;li&gt;Coaching&lt;/li&gt;
&lt;li&gt;Audits&lt;/li&gt;
&lt;li&gt;Upgrades&lt;/li&gt;
&lt;li&gt;Conversion to best practices&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Aegir 5 is coming, and not just for Drupal!</title>
        <link>https://colan.pro/blog/aegir5-is-coming/</link>
        <pubDate>Tue, 10 Mar 2020 00:00:00 +0000</pubDate>
        
        <guid>https://colan.pro/blog/aegir5-is-coming/</guid>
        <description>&lt;img src="https://colan.pro/blog/aegir5-is-coming/aegir-logo-banner.svg" alt="Featured image of post Aegir 5 is coming, and not just for Drupal!" /&gt;&lt;p&gt;&lt;em&gt;Originally published on the &lt;a class=&#34;link&#34; href=&#34;https://consensus.enterprises/blog/aegir5-is-coming/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Consensus Enterprises blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.aegirproject.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Aegir&lt;/a&gt; is the one-and-only
&lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Free_and_open-source_software#FLOSS&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;FLOSS&lt;/a&gt;
hosting system for Drupal sites that&amp;rsquo;s been around for over &lt;a class=&#34;link&#34; href=&#34;https://www.aegirproject.org/blog/aegir_turns_10/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;10
years&lt;/a&gt;, a rock in the
community.  While Drupal hosting companies have come and gone, Aegir&amp;rsquo;s always
been there for folks who want to host Drupal sites themselves.  According to
&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/usage/hosting&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;recent data&lt;/a&gt; at the time of this
writing, there are 567 instances (that we know about).&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s used by organizations worldwide such as the US &lt;a class=&#34;link&#34; href=&#34;https://www.ndi.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;National Democratic
Institute&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://www.nasa.gov/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;NASA&lt;/a&gt;, and the
&lt;a class=&#34;link&#34; href=&#34;https://ec.europa.eu/info/index_en&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;European Commission&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While &lt;a class=&#34;link&#34; href=&#34;https://docs.aegirproject.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Aegir 3&lt;/a&gt; is the currently stable
recommended major release, we&amp;rsquo;ve started working on Aegir 5, which is a
complete rewrite.  It has notable differences such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drush.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drush&lt;/a&gt;, traditionally used as &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/provision&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;the provisioner&lt;/a&gt;, has been replaced by &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Ansible_%28software%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ansible&lt;/a&gt;, which allows for the hosting of any type of site or service, not just Drupal.&lt;/li&gt;
&lt;li&gt;The front-end, formerly Drupal 7, has been replaced by Drupal 8, which allows us to take advantage of all of the newer features it provides.&lt;/li&gt;
&lt;li&gt;Components are now best-of-breed open-source tools such as &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Celery_%28software%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Celery&lt;/a&gt;, for the task queue.  When Aegir was originally written, tools such as Ansible and Celery didn&amp;rsquo;t exist so all of the functionality was written as Aegir-specific code.  We can now get off that island.&lt;/li&gt;
&lt;li&gt;The entire project is now maintained in &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/aegir/aegir&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;a single code repository&lt;/a&gt;, unlike the traditional four (&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/hosting&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Hosting&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/Provision&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Provision&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/hostmaster&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Hostmaster&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/eldir&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Eldir&lt;/a&gt;) that have been maintained historically.&lt;/li&gt;
&lt;li&gt;An &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/aegir/aegir/-/issues/32&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;out-of-the-box framework&lt;/a&gt; for automatic site updates via the &lt;a class=&#34;link&#34; href=&#34;https://docs.aegirproject.org/usage/advanced/distributions/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Distributions&lt;/a&gt; concept.  This was experimental in Aegir 3.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While still maintaining Aegir 3, we&amp;rsquo;d like to direct any new development
initiatives towards the more modern Aegir 5.&lt;/p&gt;
&lt;p&gt;The initial focus is on supporting Drupal.  We then intend to add support for
&lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/aegir/aegir/-/issues/16&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Matomo&lt;/a&gt;,
&lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/aegir/aegir/-/issues/36&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Hugo&lt;/a&gt;, and other applications we
use.  However, documentation has been started on &lt;a class=&#34;link&#34; href=&#34;http://docs.aegir.hosting/dev/extending/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;how to add support for
anything else&lt;/a&gt; so merge requests or
funding for new apps are greatly encouraged.&lt;/p&gt;
&lt;p&gt;Along with the &lt;a class=&#34;link&#34; href=&#34;http://docs.aegir.hosting/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;main documentation site&lt;/a&gt;, which
includes &lt;a class=&#34;link&#34; href=&#34;http://docs.aegir.hosting/dev/architecture/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;the architecture&lt;/a&gt;, there
is also &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/aegir/aegir/-/boards&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;an issues board&lt;/a&gt; for tracking
tickets.&lt;/p&gt;
&lt;p&gt;While we&amp;rsquo;re working on it as quickly as we can, we sometimes get delayed by
other priorities.  As such, we&amp;rsquo;re actively looking for sponsors to help us
prioritize development.  Please get in touch if you&amp;rsquo;re interested in
partnering, collaborating, providing funding, or anything else.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Drupal North 2019: Drupal SaaS: Building software as a service on Drupal</title>
        <link>https://colan.pro/blog/drupal-saas-building-software-as-a-service-on-drupal/</link>
        <pubDate>Fri, 15 Nov 2019 00:00:00 +0000</pubDate>
        
        <guid>https://colan.pro/blog/drupal-saas-building-software-as-a-service-on-drupal/</guid>
        <description>&lt;img src="https://colan.pro/blog/drupal-saas-building-software-as-a-service-on-drupal/saas-icon.png" alt="Featured image of post Drupal North 2019: Drupal SaaS: Building software as a service on Drupal" /&gt;&lt;p&gt;&lt;em&gt;Originally published on the &lt;a class=&#34;link&#34; href=&#34;https://consensus.enterprises/blog/drupal-saas-building-software-as-a-service-on-drupal/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Consensus Enterprises blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;On Friday, June 14th, I presented &lt;a class=&#34;link&#34; href=&#34;https://drupalnorth.org/en/session/drupal-saas-building-software-service-drupal&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this session&lt;/a&gt; at &lt;a class=&#34;link&#34; href=&#34;https://drupalnorth.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drupal North 2019&lt;/a&gt;. That&amp;rsquo;s the annual gathering of the Drupal community in Ontario and Quebec, in Canada.&lt;/p&gt;
&lt;p&gt;As I realized I hadn&amp;rsquo;t yet posted this information yet, I&amp;rsquo;m doing so now.&lt;/p&gt;
&lt;p&gt;Session information:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Are you (considering) building a &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Software_as_a_service&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SaaS&lt;/a&gt; product on &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Drupal&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drupal&lt;/a&gt; or running a Drupal hosting company?  Have you done it already?  Come share your experiences and learn from others.&lt;/p&gt;
&lt;p&gt;Among other things, we&amp;rsquo;ll be discussing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project vs. product business&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/docs/8/distributions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Installation profiles / distributions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Customer service (e.g. &lt;a class=&#34;link&#34; href=&#34;https://about.gitlab.com/product/service-desk/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitLab&amp;rsquo;s Service Desk&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Hosting architecture (&lt;a class=&#34;link&#34; href=&#34;https://colan.consulting/blog/drupal-specific-hosting-choose-provider-those-offering-comprehensive-platforms&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drupal hosting companies&lt;/a&gt; vs. &lt;a class=&#34;link&#34; href=&#34;https://www.aegirproject.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Aegir&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Infrastructure (&lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Infrastructure_as_a_service&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;IaaS&lt;/a&gt; hosting providers: &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/OpenStack&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenStack&lt;/a&gt; vs. AWS, GCS, Azure, etc.)&lt;/li&gt;
&lt;li&gt;E-commerce, recurring billing and subscription provider integration
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/aegir_site_subscriptions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Aegir Site Subscriptions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Others?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Resource quotas&lt;/li&gt;
&lt;li&gt;Site admin access permissions for clients&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;hellip;and any other related topics that come up.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A video recording of my presentation is available on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://drupal.tv/external-video/2019-06-15/drupal-saas-building-software-service-drupal&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drupal.tv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=2XN3J3X1GGw&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My slides (with clickable links) are available on &lt;a class=&#34;link&#34; href=&#34;https://talks.consensus.enterprises/2019-drupalnorth-drupal-saas/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;our presentations site&lt;/a&gt;.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Exposing Drupal&#39;s Taxonomy Data on the Semantic Web</title>
        <link>https://colan.pro/blog/exposing-drupal-taxonomy-data-sematic-web/</link>
        <pubDate>Thu, 24 Oct 2019 00:00:00 +0000</pubDate>
        
        <guid>https://colan.pro/blog/exposing-drupal-taxonomy-data-sematic-web/</guid>
        <description>&lt;img src="https://colan.pro/blog/exposing-drupal-taxonomy-data-sematic-web/semantic-spider-web.jpg" alt="Featured image of post Exposing Drupal&#39;s Taxonomy Data on the Semantic Web" /&gt;&lt;p&gt;&lt;em&gt;Originally published on the &lt;a class=&#34;link&#34; href=&#34;https://consensus.enterprises/blog/exposing-drupal-taxonomy-data-sematic-web/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Consensus Enterprises blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;As a content management framework, &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Drupal&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drupal&lt;/a&gt; provides strong support for its &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/docs/user_guide/en/structure-taxonomy.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;taxonomical subsystem for classifying data&lt;/a&gt;.  It would be great if such data could be exposed via the &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Simple_Knowledge_Organization_System&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Simple Knowledge Organization System (SKOS)&lt;/a&gt; standard for publishing vocabularies as &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Linked_data&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;linked data&lt;/a&gt;.  As Drupal becomes used more and more as a back-end data store (due to features such as &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/blog/jsonapi-lands-in-drupal-core&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;built-in support for JSON:API&lt;/a&gt;), presenting this data in standard ways becomes especially important.&lt;/p&gt;
&lt;p&gt;So is this actually possible now?  If not, what remains to be done?&lt;/p&gt;
&lt;h2 id=&#34;drupals-history&#34;&gt;Drupal&amp;rsquo;s history
&lt;/h2&gt;&lt;p&gt;First, let&amp;rsquo;s explore some of Drupal core&amp;rsquo;s history as it relates to the &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Semantic_Web&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Semantic Web&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Web_service&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Web services&lt;/a&gt; formats, also useful for future reference.   This is basically the backstory that makes all of this possible.&lt;/p&gt;
&lt;h3 id=&#34;rest-support-was-added-to-views&#34;&gt;REST support was added to Views
&lt;/h3&gt;&lt;p&gt;This was implemented in the (now closed) issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/drupal/issues/1819760&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Add a REST export display plugin and serializer integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/drupal/issues/1857256&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Convert the taxonomy listing and feed at /taxonomy/term/%term to Views&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;non-schemaorg-namespace-mappings-were-removed-including-contribs-ui-support-in-drupal-8&#34;&gt;Non-Schema.org namespace mappings were removed (including contrib&amp;rsquo;s UI support) in Drupal 8
&lt;/h3&gt;&lt;p&gt;Here&amp;rsquo;s the change notice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/drupal/issues/1784234&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Use schema.org types and properties in RDF mappings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And a follow-up issue requesting support for additional namespaces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/rdfui/issues/2386777&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Allow usage of any namespace in RDF mapping UI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;the-community-chose-to-replace-json-ld-with-hal-in-drupal-8&#34;&gt;The community chose to replace JSON-LD with HAL in Drupal 8
&lt;/h3&gt;&lt;p&gt;Here&amp;rsquo;s an article with the details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://dev.acquia.com/blog/decoupling-drupal-8-core-web-services-in-core-and-the-serialization-module/20/03/2018/19271&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Decoupling Drupal 8 Core: Web Services in Core and the Serialization Module&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://colan.pro/images/blog/banners/example-vocabulary-vehicles.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Taxonomy Screenshot&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;multiple-components&#34;&gt;Multiple Components
&lt;/h2&gt;&lt;p&gt;As this is really a two-part issue, adding machine-readable metadata and then making machine-readable data available, I&amp;rsquo;ll split the discussion into two sections.&lt;/p&gt;
&lt;h2 id=&#34;adding-machine-readable-metadata&#34;&gt;Adding machine-readable metadata
&lt;/h2&gt;&lt;p&gt;While there&amp;rsquo;s an &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/rdfui&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;RDF UI&lt;/a&gt; module that enables one to specify mappings between Drupal entities and their fields with RDF types and properties, &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/rdfui/issues/2386777&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;it only supports Schema.org&lt;/a&gt; via RDFa (not JSON-LD).&lt;/p&gt;
&lt;p&gt;As explained very well in &lt;a class=&#34;link&#34; href=&#34;https://www.lullabot.com/articles/create-seo-juice-by-adding-json-ld-structured-data-to-drupal-8&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Create SEO Juice From JSON LD Structured Data in Drupal&lt;/a&gt;, a better solution is to use the framework provided by the &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/metatag&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Metatag&lt;/a&gt; module (used by modules such as &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/agls&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AGLS Metadata&lt;/a&gt;).  The article introduces the &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/schema_metatag&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Schema.org Metatag&lt;/a&gt; module, which uses the Metatag UI to allow users to map Drupal data to Schema.org, &lt;em&gt;and exposes it via JSON-LD&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;So one solution would be to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Clone Schema.org Metatag, calling the new module &lt;em&gt;SKOS Metatag&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Replace all of the Schema.org specifics with SKOS.&lt;/li&gt;
&lt;li&gt;Rejoice.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;But after taking some time to process all of the above information, I believe we should be able to use the knowledge of the vocabulary hierarchy to  add the SKOS metadata.  We probably don&amp;rsquo;t need any admin UI at all for configuring mappings.&lt;/p&gt;
&lt;p&gt;Assuming that&amp;rsquo;s true, we can instead create a SKOS module that doesn&amp;rsquo;t depend on Metatag, but Metatag may still be useful given that it already &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/node/2563647&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;supports Views&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;making-the-machine-readable-data-available&#34;&gt;Making the machine-readable data available
&lt;/h2&gt;&lt;p&gt;Exposing the site&amp;rsquo;s data can be done best though &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/docs/8/core/modules/views/overview&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Views&lt;/a&gt;.  I wouldn&amp;rsquo;t recommend doing this any other way, e.g. accessing nodes (Drupal-speak for records) directly, or through any default taxonomy links for listing all of a vocabulary&amp;rsquo;s terms.  (These actually are Views, but their default set-ups are missing configuration.)  A good recipe for getting this up &amp;amp; running, for both the list and individual items, is available at &lt;a class=&#34;link&#34; href=&#34;https://drupalize.me/blog/201402/your-first-restful-view-drupal-8&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Your First RESTful View in Drupal 8&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To actually access the data from elsewhere, you need to be aware of the recent API change &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/node/2954953&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;To access REST export views, one now MUST specify a ?_format=… query string&lt;/a&gt;, which explains why some consumers broke.&lt;/p&gt;
&lt;p&gt;The JSON-LD format is, however, not supported in Core by default.  There is some code in a couple of sandboxes, which may or may not work, that will need to be ported to the official module, brought up-to-date, and have a release (ideally stable) cut.  See the issue &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/jsonld/issues/2799305&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;JSON-LD REST Services: Port to Drupal 8&lt;/a&gt; for details.&lt;/p&gt;
&lt;p&gt;Now, the Metatag solution I proposed in the previous section may work with Views natively, already exposing data as JSON-LD.  If that&amp;rsquo;s the case, this JSON-LD port may not be necessary, but this remains to be seen.  Also, accessing the records directly (without Views) may work as well, but this also remains to be seen after that solution is developed.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Clearly, there&amp;rsquo;s more work to be done.  While the ultimate goal hasn&amp;rsquo;t been achieved yet, at least we have a couple of paths forward.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s as far as I got with pure research.  Due to priorities shifting on the client project, I didn&amp;rsquo;t get a chance to learn more by reviewing the code and testing it to see what does and doesn&amp;rsquo;t work, which would be the next logical step.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve got a project that could make use of any of this, please reach out.  We&amp;rsquo;d love to help move this technology further along and get it implemented.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;h3 id=&#34;general-information&#34;&gt;General information
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://stackoverflow.com/questions/14307792/what-is-the-relationship-between-rdf-rdfa-microformats-and-microdata&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;What is the relationship between RDF, RDFa, Microformats and Microdata&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.quora.com/What-is-the-difference-between-Microdata-RDFa-JSON-LD&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;What is the difference between Microdata, RDFa &amp;amp; JSON-LD?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;contributed-modules-that-probably-arent-helpful-but-could-be&#34;&gt;Contributed modules that probably aren&amp;rsquo;t helpful (but could be)
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/structured_data&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Structured Data (JSON+LD Rich Snippets)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/json_ld_schema&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;JSON LD Schema API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/wisski&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;WissKI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/ontology&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ontology&lt;/a&gt; (OWL)&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/dcat&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DCAT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/rdf_entity&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;RDF entity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/drupal2rdf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drupal2RDF&lt;/a&gt; (This is brand new, but at the time of this writing, there&amp;rsquo;s not enough info/code yet to figure out what it&amp;rsquo;s trying to do.)&lt;/li&gt;
&lt;li&gt;There&amp;rsquo;s a module called &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/smart_glossary&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Smart Glossary&lt;/a&gt; which allows you to have multilingual SKOS Thesauri on your Drupal site, but I don&amp;rsquo;t think it&amp;rsquo;s useful at all as it&amp;rsquo;s part of a suite of modules maintained by &lt;a class=&#34;link&#34; href=&#34;https://www.poolparty.biz/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;PoolParty&lt;/a&gt;, where they expect you to use their data store:
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/smart_glossary&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Smart Glossary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/pp_taxonomy_manager&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;PoolParty Taxonomy Manager for Drupal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/semantic_connector&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Semantic Connector&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/powertagging&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;PowerTagging&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;questions-about-importing-skos-data-not-exporting-it&#34;&gt;Questions about importing SKOS data (not exporting it)
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://groups.drupal.org/node/516739&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Options for SKOS integration in Drupal 8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/forum/support/post-installation/2017-05-08/how-can-i-work-with-skos-data&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;How can I work with SKOS data?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Aegir DevOps: Deployment Workflows for Drupal Sites</title>
        <link>https://colan.pro/blog/aegir-devops-deployment-workflows-drupal-sites/</link>
        <pubDate>Tue, 24 Sep 2019 00:00:00 +0000</pubDate>
        
        <guid>https://colan.pro/blog/aegir-devops-deployment-workflows-drupal-sites/</guid>
        <description>&lt;img src="https://colan.pro/blog/aegir-devops-deployment-workflows-drupal-sites/brain-web-640.jpg" alt="Featured image of post Aegir DevOps: Deployment Workflows for Drupal Sites" /&gt;&lt;p&gt;&lt;em&gt;Originally published on the &lt;a class=&#34;link&#34; href=&#34;https://consensus.enterprises/blog/aegir-devops-deployment-workflows-drupal-sites/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Consensus Enterprises blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.aegirproject.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Aegir&lt;/a&gt; is often seen as a stand-alone &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Application_lifecycle_management&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;application lifecycle management (ALM)&lt;/a&gt; system for hosting and managing &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Drupal&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drupal&lt;/a&gt; sites.  In the &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Enterprise_software&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;enterprise context&lt;/a&gt;, however, it&amp;rsquo;s necessary to provide mutiple &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Deployment_environment&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;deployment environments&lt;/a&gt; for &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Quality_assurance&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;quality assurance (QA)&lt;/a&gt;, development or other purposes.  Aegir trivializes this process by allowing sites to easily be copied from one environment to another in a point-and-click fashion from the Web front-end, eliminating the need for &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Command-line_interface&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;command-line&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/DevOps&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DevOps&lt;/a&gt; tasks, which it was designed to do.&lt;/p&gt;
&lt;h2 id=&#34;setting-up-the-environments&#34;&gt;Setting up the environments
&lt;/h2&gt;&lt;p&gt;An Aegir instance needs to be installed in each environment.  We would typically have three (3) of them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Development (Dev)&lt;/strong&gt;: While generally reserved for integration testing, it is sometimes also used for development (e.g. when local environments cannot be used by developers or there are a small number of them).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Staging&lt;/strong&gt;: Used for QA purposes.  Designed to be a virtual clone of Production to ensure that tagged releases operate the same way as they would there, before being made live.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Production (Prod)&lt;/strong&gt;: The live environment visible to the public or the target audience, and the authoritative source for data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(While outside the scope of this article, local development environments can be set up as well.  See &lt;a class=&#34;link&#34; href=&#34;https://colan.pro/blog/try-aegir-now-with-the-new-dev-vm/&#34; &gt;Try Aegir now with the new Dev VM&lt;/a&gt; for details.)&lt;/p&gt;
&lt;p&gt;To install Aegir in each of these, follow the &lt;a class=&#34;link&#34; href=&#34;https://docs.aegirproject.org/install/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;installation instructions&lt;/a&gt;.  For larger deployments, common architectures for Staging and Prod would include features such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Separate Web and database servers&lt;/li&gt;
&lt;li&gt;Multiple Web and database servers&lt;/li&gt;
&lt;li&gt;Load balancers&lt;/li&gt;
&lt;li&gt;Caching/HTTPS proxies&lt;/li&gt;
&lt;li&gt;Separate partitions for (external) storage of:
&lt;ul&gt;
&lt;li&gt;The Aegir file system (&lt;code&gt;/var/aegir&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Site backups (&lt;code&gt;/var/aegir/backups&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Database storage (&lt;code&gt;/var/lib/mysql&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As these are all out of scope for the purposes of this article, I&amp;rsquo;ll save these discussions for the future, and assume we&amp;rsquo;re working with default installations.&lt;/p&gt;
&lt;h2 id=&#34;allowing-the-environments-to-communicate&#34;&gt;Allowing the environments to communicate
&lt;/h2&gt;&lt;p&gt;To enable inter-environment communication, we must perform the following series of tasks on each Aegir VM as part of the initial set-up, which only needs to be done once.&lt;/p&gt;
&lt;h3 id=&#34;back-end-set-up&#34;&gt;Back-end set-up
&lt;/h3&gt;&lt;p&gt;The back-ends of each instance must be able to communicate.  For that we use the secure &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Secure_Shell&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SSH protocol&lt;/a&gt;.  As stated on Wikipedia:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;SSH is important in cloud computing to solve connectivity problems, avoiding the security issues of exposing a cloud-based virtual machine directly on the Internet. An SSH tunnel can provide a secure path over the Internet, through a firewall to a virtual machine.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
Steps to enable SSH communication:
&lt;ol&gt;
&lt;li&gt;SSH into the VM.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh ENVIRONMENT.aegir.example.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Become the Aegir user.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo -sHu aegir&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Generate an SSH key.  (If you&amp;rsquo;ve done this already to access a private Git repository, you can skip this step.)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh-keygen -t rsa -b 4096 -C &amp;quot;ORGANIZATION Aegir ENVIRONMENT&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;For every other environment from where you&amp;rsquo;d like to fetch sites:
&lt;ol&gt;
&lt;li&gt;Add the generated public key (&lt;code&gt;~/.ssh/id_rsa.pub&lt;/code&gt;) to the whitelist for the Aegir user on the other VM so that the original instance can connect to this target.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh OTHER_ENVIRONMENT.aegir.example.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo -sHu aegir&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vi ~/.ssh/authorized_keys&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;exit&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Back on the original VM, allow connections to the target VM.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo -sHu aegir&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ssh OTHER_ENVIRONMENT.aegir.example.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Answer affirmatively when asked to confirm the host (after verifying the fingerprint, etc.).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;front-end-set-up&#34;&gt;Front-end set-up
&lt;/h3&gt;&lt;p&gt;These steps will tell Aegir about the other Aegir servers whose sites can be imported.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;On Aegir&amp;rsquo;s front-end Web UI, the &amp;ldquo;hostmaster&amp;rdquo; site, enable remote site imports by navigating to &lt;em&gt;Administration » Hosting » Advanced&lt;/em&gt;, and check the &lt;em&gt;Remote import&lt;/em&gt; box.  Save the form.  (This enables the &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/hosting_remote_import&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Aegir Hosting Remote Import&lt;/a&gt; module.)&lt;/li&gt;
&lt;li&gt;For every other server you&amp;rsquo;d like to add, do the following:
&lt;ol&gt;
&lt;li&gt;Navigate to the &lt;em&gt;Servers&lt;/em&gt; tab, and click on the &lt;em&gt;Add server&lt;/em&gt; link.&lt;/li&gt;
&lt;li&gt;For the &lt;em&gt;Server hostname&lt;/em&gt;, enter the hostname of the other Aegir server (e.g. &lt;code&gt;staging.aegir.example.com&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Remote import&lt;/em&gt; vertical tab, check &lt;em&gt;Remote hostmaster&lt;/em&gt;, and then enter &lt;code&gt;aegir&lt;/code&gt; for the &lt;em&gt;Remote user&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;For the &lt;em&gt;Human-readable name&lt;/em&gt;, you can enter something like &lt;code&gt;Foo&#39;s Staging Aegir&lt;/code&gt; (assuming the Staging instance).&lt;/li&gt;
&lt;li&gt;You can generally ignore the &lt;em&gt;IP addresses&lt;/em&gt; section.&lt;/li&gt;
&lt;li&gt;Hit the &lt;em&gt;Save&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;Wait for the server verification to complete successfully.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All of the one-time command-line tasks are now done.  You or your users can now use the Web UI to shuffle site data between environments.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://colan.pro/images/blog/banners/aegir-select-remote-site-to-import.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Select remote site to import&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;deploying-sites-from-one-environment-to-another&#34;&gt;Deploying sites from one environment to another
&lt;/h2&gt;&lt;p&gt;Whenever necessary, this point-and-click process can be used to deploy sites from one Aegir environment to another.  It&amp;rsquo;s actually a pull method as the destination Aegir instance imports a site from the source.&lt;/p&gt;
&lt;p&gt;Reasons to do this include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The initial deployment of a development site from Dev to Prod.&lt;/li&gt;
&lt;li&gt;Refreshing Dev and Staging sites from Prod.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If you&amp;rsquo;d like to install the site onto a new &lt;a class=&#34;link&#34; href=&#34;https://docs.aegirproject.org/usage/platforms/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;platform&lt;/a&gt; that&amp;rsquo;s not yet available, &lt;a class=&#34;link&#34; href=&#34;https://docs.aegirproject.org/usage/platforms/#getting-a-platform-onto-your-server&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;create the platform&lt;/a&gt; first.&lt;/li&gt;
&lt;li&gt;Navigate to the &lt;em&gt;Servers&lt;/em&gt; tab.&lt;/li&gt;
&lt;li&gt;Click on the server hosting the site you&amp;rsquo;d like to import.&lt;/li&gt;
&lt;li&gt;Click on the &lt;em&gt;Import remote sites&lt;/em&gt; link.&lt;/li&gt;
&lt;li&gt;Follow the prompts.&lt;/li&gt;
&lt;li&gt;Wait for the batch job, Import and Verify tasks to complete.&lt;/li&gt;
&lt;li&gt;Enable the imported site by hitting the &lt;em&gt;Run&lt;/em&gt; button on the &lt;em&gt;Enable&lt;/em&gt; task.&lt;/li&gt;
&lt;li&gt;The imported site is now ready for use!&lt;/li&gt;
&lt;/ol&gt;
</description>
        </item>
        <item>
        <title>Try Aegir now with the new Dev VM</title>
        <link>https://colan.pro/blog/try-aegir-now-with-the-new-dev-vm/</link>
        <pubDate>Mon, 09 Sep 2019 00:00:00 +0000</pubDate>
        
        <guid>https://colan.pro/blog/try-aegir-now-with-the-new-dev-vm/</guid>
        <description>&lt;img src="https://colan.pro/blog/try-aegir-now-with-the-new-dev-vm/aegir-logo-banner.svg" alt="Featured image of post Try Aegir now with the new Dev VM" /&gt;&lt;p&gt;&lt;em&gt;Originally published on the &lt;a class=&#34;link&#34; href=&#34;https://consensus.enterprises/blog/try-aegir-now-with-the-new-dev-vm/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Consensus Enterprises blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Have you been looking for a self-hosted solution for hosting and managing Drupal sites?  Would you like be able able to upgrade all of your sites at once with a single button click?  Are you tired of dealing with all of the proprietary Drupal hosting providers that won&amp;rsquo;t let you customize your set-up?  Wouldn&amp;rsquo;t it be nice if all of your sites had free automatically-updating HTTPS certificates?  You probably know that &lt;a class=&#34;link&#34; href=&#34;https://www.aegirproject.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Aegir&lt;/a&gt; can do all of this, but it&amp;rsquo;s now trivial to set up a temporary trial instance to see how it works.&lt;/p&gt;
&lt;p&gt;The new &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/aegir/aegir-dev-vm&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Aegir Development VM&lt;/a&gt; makes this possible.&lt;/p&gt;
&lt;h2 id=&#34;history&#34;&gt;History
&lt;/h2&gt;&lt;p&gt;Throughout Aegir&amp;rsquo;s history, we&amp;rsquo;ve had several projects striving to achieve the same goal.  They&amp;rsquo;re listed in the &lt;a class=&#34;link&#34; href=&#34;https://docs.aegirproject.org/extend/contrib/#development&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Contributed Projects section of the documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;aegir-up&#34;&gt;Aegir Up
&lt;/h3&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/aegir_up&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Aegir Up&lt;/a&gt; was based on a &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/VirtualBox&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;VirtualBox&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Virtual_machine&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;virtual machine (VM)&lt;/a&gt;, managed by &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Vagrant_%28software%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Vagrant&lt;/a&gt; and provisioned with &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Puppet_%28software%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Puppet&lt;/a&gt;.  It was superseded by Valkyrie (see below).&lt;/p&gt;
&lt;h3 id=&#34;aegir-development-environment&#34;&gt;Aegir Development Environment
&lt;/h3&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/aegir-project/development&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Aegir Development Environment&lt;/a&gt; took a completely different approach using &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Docker_%28software%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Docker&lt;/a&gt;.  It assembles all of the services (each one in a container, e.g. the MySQL database) into a system managed by Docker Compose.  While this is a novel approach, it&amp;rsquo;s not necessary to have multiple containers to get a basic Aegir instance up and running.&lt;/p&gt;
&lt;h3 id=&#34;valkyrie&#34;&gt;Valkyrie
&lt;/h3&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/valkyrie&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Valkyrie&lt;/a&gt; was similar to Aegir Up, but provisioning moved from Puppet to &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Ansible_%28software%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ansible&lt;/a&gt;.  Valkyrie also made extensive use of custom &lt;a class=&#34;link&#34; href=&#34;http://www.drush.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drush&lt;/a&gt; commands to simplify development.&lt;/p&gt;
&lt;p&gt;Its focus was more on developing Drupal sites than on developing Aegir.  Now that we have &lt;a class=&#34;link&#34; href=&#34;https://docs.devwithlando.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Lando&lt;/a&gt;, it&amp;rsquo;s no longer necessary to include this type of functionality.&lt;/p&gt;
&lt;p&gt;It was superseded by the now current Aegir Development VM.&lt;/p&gt;
&lt;h2 id=&#34;present&#34;&gt;Present
&lt;/h2&gt;&lt;p&gt;Like Valkyrie, the Aegir Development VM is based on a VirtualBox VM (but that&amp;rsquo;s not the only option; see below) managed with Vagrant and provisioned with Ansible.  However, it doesn&amp;rsquo;t rely on custom Drush commands.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://colan.pro/images/blog/banners/aegir-dev-vm-screenshot.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;features&#34;&gt;Features
&lt;/h2&gt;&lt;h3 id=&#34;customizable-configuration&#34;&gt;Customizable configuration
&lt;/h3&gt;&lt;p&gt;The Aegir Development VM configuration is very easy to customize as &lt;a class=&#34;link&#34; href=&#34;https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ansible variables&lt;/a&gt; are used &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/aegir/aegir-dev-vm/blob/master/ansible/playbook.yml#L6&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;throughout&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For example, if you&amp;rsquo;d like to use &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Nginx&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Nginx&lt;/a&gt; instead of &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Apache_HTTP_Server&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Apache&lt;/a&gt;, simply replace:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;aegir_http_service_type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;apache&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&amp;hellip;with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;aegir_http_service_type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;nginx&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&amp;hellip;or &lt;a class=&#34;link&#34; href=&#34;https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#passing-variables-on-the-command-line&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;override using the command line&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can also &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/aegir/aegir-dev-vm/blob/master/ansible/playbook.yml#L11&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;install and enable additional Aegir modules&lt;/a&gt; from &lt;a class=&#34;link&#34; href=&#34;https://docs.aegirproject.org/extend/contrib/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;the available set&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;support-for-remote-vms&#34;&gt;Support for remote VMs
&lt;/h3&gt;&lt;p&gt;For those folks with older hardware who are unable to spare extra gigabytes (GB) for VMs, it&amp;rsquo;s possible to set up the VM remotely.&lt;/p&gt;
&lt;p&gt;While the default amount of RAM necessary is 1 GB, 2 GB would be better for any serious work, and 4 GB is necessary if &lt;a class=&#34;link&#34; href=&#34;https://docs.aegirproject.org/usage/platforms/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;creating platforms&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;https://git.drupalcode.org/project/hosting_deploy&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;directly from Packagist&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Support for &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/DigitalOcean&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DigitalOcean&lt;/a&gt; is included, but other &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Infrastructure_as_a_service&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;IaaS&lt;/a&gt; providers (e.g. &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/OpenStack&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenStack&lt;/a&gt;) can be added later.  Patches welcome!&lt;/p&gt;
&lt;h3 id=&#34;fully-qualified-domain-name-fqdn-not-required&#34;&gt;Fully qualified domain name (FQDN) not required
&lt;/h3&gt;&lt;p&gt;While Aegir can quickly be installed with a small number of commands in the &lt;a class=&#34;link&#34; href=&#34;https://docs.aegirproject.org/quick-start/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick Start Guide&lt;/a&gt;, that process requires an &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Fully_qualified_domain_name&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;FQDN&lt;/a&gt;, usually something like &lt;code&gt;aegir.example.com&lt;/code&gt; (which requires global &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Domain_Name_System&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DNS&lt;/a&gt; configuration).  That is not the case with the Dev VM, which assumes &lt;code&gt;aegir.local&lt;/code&gt; by default.&lt;/p&gt;
&lt;h3 id=&#34;simplified-development&#34;&gt;Simplified development
&lt;/h3&gt;&lt;p&gt;You can use it for Aegir development as well as trying Aegir!&lt;/p&gt;
&lt;p&gt;Unlike the default set-up provisioned by the Quick Start Guide, which would require additional configuration, the individual components (e.g. &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/hosting&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Hosting&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/provision&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Provision&lt;/a&gt;, etc.) are cloned repositories making it easy to create patches (and for module maintainers: push changes upstream).&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;We&amp;rsquo;ve recently updated the project so that &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/aegir/aegir-dev-vm/issues/8&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;an up-to-date VM is being used&lt;/a&gt;, and it&amp;rsquo;s now ready for general use.  Please go ahead and try it.&lt;/p&gt;
&lt;p&gt;If you run into any problems, feel free to create issues on &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/aegir/aegir-dev-vm/boards&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;the issue board&lt;/a&gt; and/or submit &lt;a class=&#34;link&#34; href=&#34;https://docs.gitlab.com/ee/user/project/merge_requests/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;merge requests&lt;/a&gt;.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>DrupalCamp Ottawa 2018: Drupal SaaS: Building software as a service on Drupal</title>
        <link>https://colan.pro/blog/drupalcamp-ottawa-2018-drupal-saas-building-software-service-drupal/</link>
        <pubDate>Fri, 26 Oct 2018 00:00:00 +0000</pubDate>
        
        <guid>https://colan.pro/blog/drupalcamp-ottawa-2018-drupal-saas-building-software-service-drupal/</guid>
        <description>&lt;img src="https://colan.pro/blog/drupalcamp-ottawa-2018-drupal-saas-building-software-service-drupal/new-banner.jpg" alt="Featured image of post DrupalCamp Ottawa 2018: Drupal SaaS: Building software as a service on Drupal" /&gt;&lt;p&gt;On Friday, October 26th, I presented at &lt;a class=&#34;link&#34; href=&#34;https://drupalcampottawa.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DrupalCamp Ottawa 2018&lt;/a&gt;, the annual gathering of the Drupal community in Ottawa, Ontario, Canada.&lt;/p&gt;
&lt;h2 id=&#34;session-information&#34;&gt;Session Information
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Are you (considering) building a SaaS product on Drupal or running a Drupal hosting company? Have you done it already? Come share your experiences and learn from others.&lt;/p&gt;
&lt;p&gt;Among other things, we&amp;rsquo;ll be discussing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project vs. product business&lt;/li&gt;
&lt;li&gt;Installation profiles / distributions&lt;/li&gt;
&lt;li&gt;Customer service (e.g. GitLab&amp;rsquo;s Service Desk)&lt;/li&gt;
&lt;li&gt;Hosting architecture (Drupal hosting companies vs. Aegir)&lt;/li&gt;
&lt;li&gt;Infrastructure (IaaS hosting providers: OpenStack vs. AWS, GCS, Azure, etc.)&lt;/li&gt;
&lt;li&gt;E-commerce, recurring billing and subscription provider integration
&amp;gt;   - Aegir Site Subscriptions
&lt;ul&gt;
&lt;li&gt;Others?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Resource quotas&lt;/li&gt;
&lt;li&gt;Site admin access permissions for clients&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;&amp;hellip;and any other related topics that come up.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;resources&#34;&gt;Resources
&lt;/h2&gt;&lt;p&gt;A video recording of our presentation is available on &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=HMe9GFMag8Y&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;YouTube&lt;/a&gt; (with the audio track missing, unfortunately), and my slides (with clickable links) are available at &lt;a class=&#34;link&#34; href=&#34;https://talks.consensus.enterprises/drupal-saas&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;talks.consensus.enterprises/drupal-saas&lt;/a&gt;.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Drupal North Toronto 2018: Hosting Drupal Sites? You need Aegir</title>
        <link>https://colan.pro/blog/drupal-north-toronto-2018-hosting-drupal-sites-you-need-aegir/</link>
        <pubDate>Sat, 18 Aug 2018 00:00:00 +0000</pubDate>
        
        <guid>https://colan.pro/blog/drupal-north-toronto-2018-hosting-drupal-sites-you-need-aegir/</guid>
        <description>&lt;img src="https://colan.pro/blog/drupal-north-toronto-2018-hosting-drupal-sites-you-need-aegir/new-banner.webp" alt="Featured image of post Drupal North Toronto 2018: Hosting Drupal Sites? You need Aegir" /&gt;&lt;p&gt;On Saturday, August 11th, &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/u/ergonlogic&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Christopher Gervais&lt;/a&gt; and I presented at &lt;a class=&#34;link&#34; href=&#34;https://drupalnorth.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drupal North 2018&lt;/a&gt;, the annual gathering of the Drupal community in southern Ontario and Quebec, Canada.&lt;/p&gt;
&lt;h2 id=&#34;session-information&#34;&gt;Session Information
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Do you need a self-hosted solution for hosting and managing Drupal sites? Would you like to be able to upgrade all of your sites at once with a single button click? Are you tired of dealing with all of the proprietary Drupal hosting providers that won&amp;rsquo;t let you customize your set-up? Wouldn&amp;rsquo;t it be nice if all of your sites could automatically get free HTTPS certificates?&lt;/p&gt;
&lt;p&gt;If you said yes to any of the above questions, there&amp;rsquo;s only one option: the &lt;a class=&#34;link&#34; href=&#34;https://www.aegirproject.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Aegir Hosting System&lt;/a&gt;. While it&amp;rsquo;s possible to &lt;a class=&#34;link&#34; href=&#34;https://colan.consulting/blog/drupal-specific-hosting-choose-provider-those-offering-comprehensive-platforms&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;find a company that will host Drupal sites for you&lt;/a&gt;, Aegir helps you maintain control whether you want to use your own infrastructure or manage your own software-as-a-service (SaaS) product. Plus, you get all the &lt;a class=&#34;link&#34; href=&#34;https://opensource.com/article/17/8/enterprise-open-source-advantages&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;benefits of open source&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;History&lt;/li&gt;
&lt;li&gt;Architecture&lt;/li&gt;
&lt;li&gt;Basic features&lt;/li&gt;
&lt;li&gt;Advanced features&lt;/li&gt;
&lt;li&gt;Development workflows&lt;/li&gt;
&lt;li&gt;Recent additions&lt;/li&gt;
&lt;li&gt;Future&lt;/li&gt;
&lt;li&gt;Questions &amp;amp; discussion&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;resources&#34;&gt;Resources
&lt;/h2&gt;&lt;p&gt;A one-hour video recording of our presentation is available on &lt;a class=&#34;link&#34; href=&#34;https://m.youtube.com/watch?v=Ie31O9qBOgI&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;YouTube&lt;/a&gt;, and our slides (with clickable links) are attached here.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;Hosting-Drupal-sites-You-need-Aegir.pdf&#34; &gt;Slides&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>DrupalCamp Montreal 2018: Hosting Drupal Sites? You need Aegir</title>
        <link>https://colan.pro/blog/drupalcamp-montreal-2018-hosting-drupal-sites-you-need-aegir/</link>
        <pubDate>Fri, 15 Jun 2018 00:00:00 +0000</pubDate>
        
        <guid>https://colan.pro/blog/drupalcamp-montreal-2018-hosting-drupal-sites-you-need-aegir/</guid>
        <description>&lt;img src="https://colan.pro/blog/drupalcamp-montreal-2018-hosting-drupal-sites-you-need-aegir/new-banner.webp" alt="Featured image of post DrupalCamp Montreal 2018: Hosting Drupal Sites? You need Aegir" /&gt;&lt;p&gt;On Friday, June 15th, &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/u/ergonlogic&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Christopher Gervais&lt;/a&gt; and I presented at &lt;a class=&#34;link&#34; href=&#34;https://drupalcampmontreal.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DrupalCamp Montreal 2018&lt;/a&gt;, the annual gathering of the Drupal community in Montreal, Canada.&lt;/p&gt;
&lt;h2 id=&#34;session-information&#34;&gt;Session Information
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Do you need a self-hosted solution for hosting and managing Drupal sites? Would you like to be able to upgrade all of your sites at once with a single button click? Are you tired of dealing with all of the proprietary Drupal hosting providers that won&amp;rsquo;t let you customize your set-up? Wouldn&amp;rsquo;t it be nice if all of your sites could automatically get free HTTPS certificates?&lt;/p&gt;
&lt;p&gt;If you said yes to any of the above questions, there&amp;rsquo;s only one option: the &lt;a class=&#34;link&#34; href=&#34;https://www.aegirproject.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Aegir Hosting System&lt;/a&gt;. While it&amp;rsquo;s possible to &lt;a class=&#34;link&#34; href=&#34;https://colan.consulting/blog/drupal-specific-hosting-choose-provider-those-offering-comprehensive-platforms&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;find a company that will host Drupal sites for you&lt;/a&gt;, Aegir helps you maintain control whether you want to use your own infrastructure or manage your own software-as-a-service (SaaS) product. Plus, you get all the &lt;a class=&#34;link&#34; href=&#34;https://opensource.com/article/17/8/enterprise-open-source-advantages&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;benefits of open source&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;History&lt;/li&gt;
&lt;li&gt;Architecture&lt;/li&gt;
&lt;li&gt;Basic features&lt;/li&gt;
&lt;li&gt;Advanced features&lt;/li&gt;
&lt;li&gt;Development workflows&lt;/li&gt;
&lt;li&gt;Recent additions&lt;/li&gt;
&lt;li&gt;Future&lt;/li&gt;
&lt;li&gt;Questions &amp;amp; discussion&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;resources&#34;&gt;Resources
&lt;/h2&gt;&lt;p&gt;A one-hour video recording of our presentation is available on &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=_-fJupSTKa4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;YouTube&lt;/a&gt;, and our slides (with clickable links) are attached here.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;Hosting-Drupal-sites-You-need-Aegir.pdf&#34; &gt;Slides&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Aegir: Your open-source hosting platform for Drupal sites</title>
        <link>https://colan.pro/blog/aegir-your-open-source-hosting-platform-drupal-sites/</link>
        <pubDate>Thu, 07 Dec 2017 00:00:00 +0000</pubDate>
        
        <guid>https://colan.pro/blog/aegir-your-open-source-hosting-platform-drupal-sites/</guid>
        <description>&lt;img src="https://colan.pro/blog/aegir-your-open-source-hosting-platform-drupal-sites/new-banner.png" alt="Featured image of post Aegir: Your open-source hosting platform for Drupal sites" /&gt;&lt;p&gt;If you need an open-source solution for hosting and managing Drupal sites, there&amp;rsquo;s only one option: the &lt;a class=&#34;link&#34; href=&#34;http://www.aegirproject.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Aegir Hosting System&lt;/a&gt;. While it&amp;rsquo;s possible to find a company that will &lt;a class=&#34;link&#34; href=&#34;https://colan.consulting/blog/drupal-specific-hosting-choose-provider-those-offering-comprehensive-platforms&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;host Drupal sites for you&lt;/a&gt;, Aegir helps you maintain control whether you want to use your own infrastructure or manage your own software-as-a-service (SaaS) product. Plus, you get all the &lt;a class=&#34;link&#34; href=&#34;https://web.archive.org/web/20231002012933/https://opensource.com/article/17/8/enterprise-open-source-advantages&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;benefits of open source&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Aegir turns ten today. The first commit occurred on December 7th, 2007. We&amp;rsquo;ve actually produced &lt;a class=&#34;link&#34; href=&#34;http://tenyears.aegirproject.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;a timeline&lt;/a&gt; including all major historical events. While Aegir had a slow uptake (the usability wasn&amp;rsquo;t great in the early days), it&amp;rsquo;s now being used by all kinds of organizations, &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=vsAOjP5iIhQ&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;including NASA&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I got involved in the project a couple of years ago when I needed a hosting solution for a project I was working on. I started by improving &lt;a class=&#34;link&#34; href=&#34;http://docs.aegirproject.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;the documentation&lt;/a&gt;, working on &lt;a class=&#34;link&#34; href=&#34;http://docs.aegirproject.org/en/3.x/extend/contrib/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;contributed modules&lt;/a&gt;, and then eventually the &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/hostmaster&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;core system&lt;/a&gt;. I&amp;rsquo;ve been using it ever since for all of my SaaS projects and have been taking the lead on Drupal 8 e-commerce integration. I became a &lt;a class=&#34;link&#34; href=&#34;http://docs.aegirproject.org/en/3.x/community/core-team/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;core maintainer&lt;/a&gt; of the project about a year and a half ago.&lt;/p&gt;
&lt;p&gt;So what&amp;rsquo;s new with the project? We&amp;rsquo;ve got several initiatives on the go. While Aegir 3 is stable and usable now (&lt;a class=&#34;link&#34; href=&#34;http://www.aegirproject.org/#download&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Download it!&lt;/a&gt;), we&amp;rsquo;ve started moving away from &lt;a class=&#34;link&#34; href=&#34;https://web.archive.org/web/20231002012933/https://github.com/drush-ops/drush&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drush&lt;/a&gt;, which traditionally handles the heavy lifting (see &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/provision/issues/2911855&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Provision: Drupal 8.4 support&lt;/a&gt; for details), and into a couple of different directions. We&amp;rsquo;ve got an &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/node/2912579&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Aegir 4 branch based on Symfony&lt;/a&gt;, which is also included in Drupal core. This is intended to be a medium-term solution until Aegir 5 (codenamed AegirNG), a complete rewrite for hosting any application, is ready. Neither of these initiatives is stable yet, but development is ongoing. Feel free to peruse &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/aegir/aegir/wikis/architecture&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;the AegirNG architecture document&lt;/a&gt;, which is publicly available.&lt;/p&gt;
&lt;p&gt;Please watch this space for future articles on the subject. I plan on writing about the following Aegir-related topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Managing your development workflow across Aegir environments&lt;/li&gt;
&lt;li&gt;Automatic HTTPS-enabled sites with Aegir&lt;/li&gt;
&lt;li&gt;Remote site management with Aegir Services&lt;/li&gt;
&lt;li&gt;Preventing clients from changing Aegir site configurations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Happy Birthday Aegir! It&amp;rsquo;s been a great ten years.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Representing Drupal at the GSoC 2017 Mentor Summit</title>
        <link>https://colan.pro/blog/representing-drupal-gsoc-2017-mentor-summit/</link>
        <pubDate>Thu, 26 Oct 2017 00:00:00 +0000</pubDate>
        
        <guid>https://colan.pro/blog/representing-drupal-gsoc-2017-mentor-summit/</guid>
        <description>&lt;img src="https://colan.pro/blog/representing-drupal-gsoc-2017-mentor-summit/new-banner.png" alt="Featured image of post Representing Drupal at the GSoC 2017 Mentor Summit" /&gt;&lt;p&gt;I&amp;rsquo;ve been mentoring students as part of &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drupal&lt;/a&gt;&amp;rsquo;s &lt;a class=&#34;link&#34; href=&#34;https://summerofcode.withgoogle.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google Summer of Code (GSoC)&lt;/a&gt; program for the last two years, where we guide students in working on Drupal projects over the summer. (For the projects I&amp;rsquo;ve been involved in, see &lt;a class=&#34;link&#34; href=&#34;https://colan.consulting/blog/client-side-encryption-options-now-available-drupal&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;User-friendly encryption now in Drupal 8!&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://colan.consulting/blog/client-side-encryption-options-now-available-drupal&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Client-side encryption options now available in Drupal&lt;/a&gt;.) This year, our organization administrator, &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/u/slurpee&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Matthew Lechleider&lt;/a&gt;, invited me to the &lt;a class=&#34;link&#34; href=&#34;https://developers.google.com/open-source/gsoc/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Mentor Summit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Google-provided summit creates a forum for members of &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Free_and_open-source_software&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;free/libre and open-source software (FLOSS)&lt;/a&gt; organizations to come together to discuss GSoC, mentoring, and FLOSS in an &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Unconference&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;unconference&lt;/a&gt; format. I met attendees from all over the world, who flew in from far-reaching places to interact as part of a wider community. Generally, two mentors are invited from each organization, but some had more and some had less.&lt;/p&gt;
&lt;p&gt;I arrived late Friday night, having missed that day&amp;rsquo;s introductory sessions due to some trouble at the US border. Historically, in my experience, we Canadians haven&amp;rsquo;t had too much trouble getting across the border for technology conferences. This has recently changed so it&amp;rsquo;s now necessary to provide proof of intent for being in the country (a signed invitation from the organizers) as well as proof of business activities (corporate and tax documents). Needless to say, all of this took a significant amount of time to prepare. Eventually though, I was allowed through and made my way to Sunnyvale, California.&lt;/p&gt;
&lt;p&gt;On Saturday morning, the day started with Lightning Talks, where attendees gave presentations on their student projects having only a few minutes each to speak. There were so many presentations that it was necessary to split the session into two, continuing after dinner that same evening. While there were several interesting projects highlighted, the most interesting to me was &lt;a class=&#34;link&#34; href=&#34;https://jitsi.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Jitsi&lt;/a&gt;&amp;rsquo;s &lt;a class=&#34;link&#34; href=&#34;https://jitsi.org/news/speech-to-text-a-summer-of-code-success-story/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;speech-to-text service&lt;/a&gt;. Besides making video conferences accessible through textual media, it also allows for automated note-taking. This was one of the truly amazing projects completed by a student over the summer.&lt;/p&gt;
&lt;p&gt;In talking about Drupal with other folks, I was surprised to hear that many other delegates do not have paying day jobs associated with their organizations. They work on these projects on the side, and generally don&amp;rsquo;t get paid for them. For example, nobody in the &lt;a class=&#34;link&#34; href=&#34;https://kodi.tv/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kodi&lt;/a&gt; contributor community gets paid; it&amp;rsquo;s all volunteer work. While there are volunteer contributions to Drupal, many of those contributors eventually turn that knowledge into paid work. I suppose we&amp;rsquo;re a lucky bunch, being able to work on an open-source project and get paid for it. And speaking of Kodi, I&amp;rsquo;m happy to report that they&amp;rsquo;re using Drupal for their website!&lt;/p&gt;
&lt;p&gt;There were quite a few conversations about messaging applications, with a large &lt;a class=&#34;link&#34; href=&#34;https://xmpp.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;XMPP&lt;/a&gt; delegation. There were also folks from the &lt;a class=&#34;link&#34; href=&#34;https://zulip.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Zulip&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://rocket.chat/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Rocket.Chat&lt;/a&gt; communities. It was interesting to hear from a former XMPP developer who&amp;rsquo;s shifted completely to &lt;a class=&#34;link&#34; href=&#34;https://matrix.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Matrix&lt;/a&gt; with the &lt;a class=&#34;link&#34; href=&#34;https://element.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Riot&lt;/a&gt; client, exactly as I&amp;rsquo;ve done. I use that client and the federated protocol to bridge with other communications networks such as proprietary closed-source &lt;a class=&#34;link&#34; href=&#34;https://slack.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Slack&lt;/a&gt; and classic &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Internet_Relay_Chat&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Internet Relay Chat (IRC)&lt;/a&gt; whenever possible. Matrix already integrates with these two protocols, and has built-in support. The goal is to eventually use only one messaging client, instead of the many applications we all have installed on all of our devices. Rocket.Chat has already started working on Matrix integration, while Zulip hasn&amp;rsquo;t. They&amp;rsquo;re open to it, and may move in this direction eventually, but for now they&amp;rsquo;re focused on user-experience innovations. In the Drupal community, we&amp;rsquo;ve had &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/node/2490332&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;a very long discussion&lt;/a&gt; about using Matrix for our communications alongside IRC, and have finally put &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/matrixchat&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;a plan into place to make this happen&lt;/a&gt;. For those eager to jump in, &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/node/2906243&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;it&amp;rsquo;s now possible to use Matrix as an always-on IRC bouncer client&lt;/a&gt; to connect to &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/irc&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drupal&amp;rsquo;s IRC channels&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Alongside Drupal, representatives from other &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Content_management_system&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;content management systems (CMSes)&lt;/a&gt; also attended. There were folks from both the Joomla and Plone communities. It would have been great to connect with them, but I didn&amp;rsquo;t get a chance. I was hoping that &lt;a class=&#34;link&#34; href=&#34;https://airshipcms.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Airship CMS&lt;/a&gt; would have representation as that crew has been doing a lot of excellent security work with PHP projects (including &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/docs/develop/security&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;helping us&lt;/a&gt; with Drupal), but they weren&amp;rsquo;t in attendance.&lt;/p&gt;
&lt;p&gt;All in all, it was an excellent conference. In my humble opinion, it&amp;rsquo;s really important to stay in touch with this greater community, cross-pollinate with folks doing similar work in the public interest, and keep contributing!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Client-side encryption options now available in Drupal</title>
        <link>https://colan.pro/blog/client-side-encryption-options-now-available-drupal/</link>
        <pubDate>Mon, 18 Sep 2017 00:00:00 +0000</pubDate>
        
        <guid>https://colan.pro/blog/client-side-encryption-options-now-available-drupal/</guid>
        <description>&lt;img src="https://colan.pro/blog/client-side-encryption-options-now-available-drupal/new-banner.webp" alt="Featured image of post Client-side encryption options now available in Drupal" /&gt;&lt;p&gt;After the success of &lt;a class=&#34;link&#34; href=&#34;https://colan.pro/blog/user-friendly-encryption-now-drupal-8&#34; &gt;last year&amp;rsquo;s GSOC project with Drupal&lt;/a&gt;, I thought it would be a great idea to see if we could take what we did there (server-side encryption) and do something similar on &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Client-side_encryption&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;the client side&lt;/a&gt;. The benefit of this approach is that unencrypted content/data is never seen by the hosting server. So it&amp;rsquo;s not necessary to trust it to the same degree. This has been &lt;a class=&#34;link&#34; href=&#34;https://drupal.stackexchange.com/questions/88925/what-are-the-alternatives-for-storing-client-side-encrypted-data&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;a requested feature&lt;/a&gt; for some time, and become very popular within &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Comparison_of_instant_messaging_clients#Messengers_with_client-to-client_encryption&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;the instant-messaging space&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I posted &lt;a class=&#34;link&#34; href=&#34;https://groups.drupal.org/node/515848#project1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;the idea&lt;/a&gt;, but wasn&amp;rsquo;t sure how much traction there would be given the additional complexity. Before long, there were two interested students, &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/u/marncz&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Marcin Czarnecki&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/u/tameeshb&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Tameesh Biswas&lt;/a&gt;, who were interested in the project given their interest in cryptography. They both wrote very good proposals, which we in the Drupal community accepted.&lt;/p&gt;
&lt;p&gt;With the help of &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/u/nerdstein&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Adam Bergstein&lt;/a&gt; (my co-mentor from last year) and &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/u/talhaparacha&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Talha Paracha&lt;/a&gt; (last year&amp;rsquo;s student), we were able to mentor both students in working towards completing their projects, even with the added complexity. Unlike last year, users&amp;rsquo; passwords couldn&amp;rsquo;t be used to encrypt anything because the site has access to these. An out-of-band mechanism was necessary to perform the encryption, &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Public-key_cryptography&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;public-key cryptography&lt;/a&gt;. It needed to be in the hands of users themselves instead of being handled implicitly by the server.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m delighted to report that both students passed. The community can now take their projects and build upon them. Please review the new Drupal modules at &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/encrypt_content_client&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Client-side content encryption&lt;/a&gt; (&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/node/2901707&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;overview&lt;/a&gt;) and &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/client_side_file_crypto&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Client Side File Crypto&lt;/a&gt; (&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/node/2904242&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;overview&lt;/a&gt;). If there are any issues, please open tickets in the respective queues.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>User-friendly encryption now in Drupal 8!</title>
        <link>https://colan.pro/blog/user-friendly-encryption-now-drupal-8/</link>
        <pubDate>Mon, 12 Sep 2016 00:00:00 +0000</pubDate>
        
        <guid>https://colan.pro/blog/user-friendly-encryption-now-drupal-8/</guid>
        <description>&lt;img src="https://colan.pro/blog/user-friendly-encryption-now-drupal-8/DALL%C2%B7E%202024-06-24%2015.41.32%20-%20A%20vibrant,%20wide%20banner%20image%20representing%20data%20encryption%20and%20security,%20featuring%20elements%20like%20locks,%20keys,%20and%20encrypted%20data%20symbols,%20with%20a%20focus%20.webp" alt="Featured image of post User-friendly encryption now in Drupal 8!" /&gt;&lt;p&gt;The problem with most encryption strategies nowadays is that they require third-party software and/or services, require maintenance of additional keys and/or secrets, and provide an awful user experience.&lt;/p&gt;
&lt;p&gt;Earlier this year, I started wondering why we couldn&amp;rsquo;t simply encrypt data with pre-existing secrets, the passwords users already have for logging into their Drupal sites. They shouldn&amp;rsquo;t have to deal with public and private keys and other cryptographic details. So I did some research, and was happy to discover that the security model is already in existence. The folks at &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/OwnCloud&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ownCloud&lt;/a&gt; have not only published it (&lt;a class=&#34;link&#34; href=&#34;https://owncloud.com/wp-content/uploads/2014/10/Overview_of_ownCloud_Encryption_Model_1.1.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Data Encryption Model 1.1&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://owncloud.com/wp-content/uploads/2015/07/Overview_of_ownCloud_Encryption_Model_2.2.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;2.2&lt;/a&gt;); they&amp;rsquo;ve already implemented it in their product. What&amp;rsquo;s even better is that the product is also written in PHP like Drupal, and has &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/GNU_Affero_General_Public_License&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;an open-source license&lt;/a&gt;. So the ideas and code can be reused.&lt;/p&gt;
&lt;p&gt;Not too long after I made this discovery, the Drupal community was looking for project ideas for &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/google-summer-of-code&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google&amp;rsquo;s Summer of Code (GSOC)&lt;/a&gt;. So &lt;a class=&#34;link&#34; href=&#34;https://groups.drupal.org/node/508466#project30&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;I added mine to the list&lt;/a&gt;. There were several students interested in the topic, and wrote proposals to match. &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/u/talhaparacha&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Talha Paracha&lt;/a&gt;&amp;rsquo;s excellent &lt;a class=&#34;link&#34; href=&#34;https://summerofcode.withgoogle.com/projects/#6125392490397696&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;proposal&lt;/a&gt; was accepted, and he began in earnest. With &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/u/nerdstein&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Adam Bergstein (nerdstein)&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/u/colan&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;I&lt;/a&gt; mentoring him, Talha successfully worked though all phases of the project. For details, please see his &lt;a class=&#34;link&#34; href=&#34;http://www.talhaparacha.com/blog-posts/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;blog posts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now that GSOC 2016 has come to a close, we have a full project release for the &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/pubkey_encrypt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Pubkey Encrypt&lt;/a&gt; module. It&amp;rsquo;s currently in beta, awaiting community review before we publish a production-ready version. We&amp;rsquo;ve included an architecture document, user stories, and usage documentation. There&amp;rsquo;s also a video! Please take the time to experiment with the module, and create tickets for any issues that you find.&lt;/p&gt;
&lt;p&gt;At the time of this writing, only field data can be encrypted via the &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/field_encrypt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Field Encryption&lt;/a&gt; module. The &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/file_encrypt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;File Encryption&lt;/a&gt; module is still in development, but as soon as it&amp;rsquo;s released, it should work with Pubkey Encrypt as well.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Authenticating Drupal users via OAuth2</title>
        <link>https://colan.pro/blog/authenticating-drupal-users-oauth2/</link>
        <pubDate>Sun, 06 Sep 2015 00:00:00 +0000</pubDate>
        
        <guid>https://colan.pro/blog/authenticating-drupal-users-oauth2/</guid>
        <description>&lt;img src="https://colan.pro/blog/authenticating-drupal-users-oauth2/DALL%C2%B7E%202024-06-24%2016.05.18%20-%20A%20vibrant,%20wide%20banner%20image%20representing%20OAuth2%20authentication%20for%20Drupal,%20featuring%20elements%20like%20locks,%20keys,%20and%20dat.webp" alt="Featured image of post Authenticating Drupal users via OAuth2" /&gt;&lt;p&gt;I recently had a client that began delegating access to all of its data assets across the enterprise network via &lt;a class=&#34;link&#34; href=&#34;https://oauth.net/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OAuth&lt;/a&gt;, specifically the OAuth 2.0 protocol. While I was there architecting a Drupal solution as their new Web platform, they wanted me to hook into this system to authenticate their Drupal users. Although there have been some modules available in the ecosystem to support OAuth2, there weren&amp;rsquo;t any available to provide this functionality. So I created the &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/oauth2_authentication&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OAuth2 Authentication&lt;/a&gt; module.&lt;/p&gt;
&lt;p&gt;This module allows users to log into a Drupal site authenticating against a remote &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Identity_provider&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;identity provider (IDP)&lt;/a&gt; via &lt;a class=&#34;link&#34; href=&#34;https://oauth.net/2/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OAuth2&lt;/a&gt;. That is, if a user&amp;rsquo;s credentials can be used to retrieve a valid &lt;a class=&#34;link&#34; href=&#34;https://oauth.net/2/access-tokens/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;access token&lt;/a&gt;, he/she will be logged into the site with those credentials and the token will be added to his/her session. If the user account doesn&amp;rsquo;t exist yet, it will be created.&lt;/p&gt;
&lt;p&gt;In doing this, we&amp;rsquo;re making the assumption that resource requesters are actually resource owners. Generally, one shouldn&amp;rsquo;t make that assumption as OAuth2 is an authorization mechanism, not an authentication mechanism. Ideally, logging in users via OAuth2 should be done with &lt;a class=&#34;link&#34; href=&#34;https://openid.net/connect/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenID Connect&lt;/a&gt;. It provides a proper identity layer on top of OAuth2. It&amp;rsquo;s essentially the evolution of &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/SAML_2.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SAML&lt;/a&gt;; see &lt;a class=&#34;link&#34; href=&#34;https://stackoverflow.com/questions/22470159/can-oauth-2-be-used-for-sso-or-do-i-need-a-more-sophisticated-authentication/24739510#24739510&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;my answer&lt;/a&gt; to &lt;a class=&#34;link&#34; href=&#34;http://stackoverflow.com/q/22470159/442022&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Can OAuth 2 be used for SSO? Or do I need a more sophisticated authentication?&lt;/a&gt; for details. In situations where one doesn&amp;rsquo;t have access to an OpenID Connect server, but does have access to an IDP that speaks OAuth2 and can trust the environment in which all of it operates, this module is sufficient.&lt;/p&gt;
&lt;p&gt;The security implications of using this module should be well understood. If one doesn&amp;rsquo;t control the environment in which it&amp;rsquo;s running, then it shouldn&amp;rsquo;t be used. For example, I don&amp;rsquo;t recommend running with this concept in a mobile environment as it can&amp;rsquo;t be trusted to the same extent as a Drupal site behind a corporate firewall. The following articles are on the subject are noteworthy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://blog.api-security.org/2013/02/why-oauth-it-self-is-not-authentication.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Why OAuth it self is not an authentication framework?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://www.thread-safe.com/2012/01/problem-with-oauth-for-authentication.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;The problem with OAuth for Authentication&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It also wouldn&amp;rsquo;t hurt to study the official &lt;a class=&#34;link&#34; href=&#34;https://datatracker.ietf.org/doc/html/rfc6819&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OAuth 2.0 Threat Model and Security Considerations&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;initial-set-up&#34;&gt;Initial Set-Up
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Install and enable the &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/oauth2_client&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OAuth2 Client&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/oauth2_authentication&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OAuth2 Authentication&lt;/a&gt; modules as you would any other.&lt;/li&gt;
&lt;li&gt;If you wish to override any of the methods in the OAuth2AuthenticationClient class to change the module&amp;rsquo;s behaviour, create another class that extends it and implement the desired methods. This is best done in a custom module for your site, something like Sitename Authentication (sitename_authentication) where S/sitename is the name of your site.&lt;/li&gt;
&lt;li&gt;Surf to the configuration page over at Home » Administration » Configuration » Web services » OAuth2 Authentication to configure your token endpoint. This section is mandatory while the others are optional. They contain sane defaults, but look over all of it to make sure it&amp;rsquo;s what you need for your set-up.&lt;/li&gt;
&lt;li&gt;If you subclassed OAuth2AuthenticationClient, replace the default class name in Miscellaneous Settings » Client Class with the name of your new class.&lt;/li&gt;
&lt;li&gt;Hit the Save configuration button to save your settings.&lt;/li&gt;
&lt;li&gt;Enjoy!&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;notes&#34;&gt;Notes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Once you&amp;rsquo;ve got this set up, you&amp;rsquo;ll have to ensure that &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/wsclient&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;the Web-services client module you&amp;rsquo;re using&lt;/a&gt; supports the OAuth2 protocol (i.e., token access to resources). If you&amp;rsquo;re already using one that doesn&amp;rsquo;t, you&amp;rsquo;ll have to add that support. Otherwise, go with one that supports this already.&lt;/li&gt;
&lt;li&gt;When an existing local user logs in, the module will attempt to get an access token for him/her. On success, the token will be added to the user&amp;rsquo;s session. On failure, the user will still be logged in, but will not get a token. Whenever a request to get a token is made, the results are reported in the log.&lt;/li&gt;
&lt;li&gt;If an existing user whose password has changed on the IDP, but not Drupal yet, logs in, the password hash stored locally will be updated. This is attempted after a local login failure: If the user can authenticate remotely, the account is updated locally, and the user is logged in normally. There are no noticeable differences to the end user.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;issues&#34;&gt;Issues
&lt;/h2&gt;&lt;h3 id=&#34;token-expiration&#34;&gt;Token Expiration
&lt;/h3&gt;&lt;p&gt;If the total expiration time for your tokens, including successive tokens returned by your token server through refresh tokens (RTs), is less than the maximum time a user can be logged in (see &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/session_expire&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Session Expire&lt;/a&gt; for details), users will still be logged in when their final tokens expire.&lt;/p&gt;
&lt;p&gt;As this module doesn&amp;rsquo;t (yet) deal with that situation, you&amp;rsquo;ll need to come up with a solution that meets your requirements. Some background information on this can be found over at &lt;a class=&#34;link&#34; href=&#34;https://rnd.feide.no/2012/04/19/best-practice-for-dealing-with-oauth-2-0-token-expiration-at-the-consumer/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Best-Practice for dealing with OAuth 2.0 Token expiration at the Consumer&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;options&#34;&gt;Options
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Automatically log out each user after being logged in for the token expiry time.&lt;/li&gt;
&lt;li&gt;Extend the token expiration time to the maximum amount of time a user can be logged in.&lt;/li&gt;
&lt;li&gt;Add support for refresh tokens (RTs) that can keep working until a user&amp;rsquo;s login session expires.&lt;/li&gt;
&lt;li&gt;Have the token server issue tokens that don&amp;rsquo;t expire.&lt;/li&gt;
&lt;li&gt;Some combination of the above.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;real-world-solutions&#34;&gt;Real-World Solutions
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://developers.facebook.com/docs/facebook-login/access-tokens&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Facebook: Access Tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://developer.linkedin.com/documents/handling-errors-invalid-tokens&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;LinkedIn: Handling Errors &amp;amp; Invalid Tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://web.archive.org/web/20231002003854/https://developers.blog.box.com/2013/11/13/oauth2-update-longer-lived-refresh-tokens/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Box: OAuth2 update - Longer lived refresh tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.salesforce.com/articleView?id=remoteaccess_oauth_refresh_token_flow.htm&amp;amp;type=5&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Salesforce: Understanding the OAuth Refresh Token Process&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;helpful-drupal-modules&#34;&gt;Helpful Drupal Modules
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/session_expire&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Session expire&lt;/a&gt; (also explains the default login session length)&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/autologout&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Automated Logout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/ejectorseat&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ejector Seat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;similar-modules&#34;&gt;Similar Modules
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/oauth2_login&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OAuth2 Login&lt;/a&gt; redirects users to another Drupal site for authentication, and then sends them back logged in once they&amp;rsquo;re authenticated. This module doesn&amp;rsquo;t do any redirection; everything is done behind the scenes. Users logging in won&amp;rsquo;t even know that they&amp;rsquo;re authenticating against another system. They simply log in using the normal Drupal login process, but get an access token on top of that (if granted). Users that don&amp;rsquo;t exist locally will be created during the login process.&lt;/p&gt;
&lt;p&gt;In conclusion, although this solution isn&amp;rsquo;t the most appropriate given the technology that&amp;rsquo;s now available, it does fit a lot of real-world use cases. At the time of this writing, there are &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/usage/oauth2_authentication&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;130 sites&lt;/a&gt; using it. This is quite impressive given that I recommend against it on the project page!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Responding to Drupal&#39;s Highly Critical SQL Injection Vulnerability</title>
        <link>https://colan.pro/blog/responding-drupals-highly-critical-sql-injection-vulnerability/</link>
        <pubDate>Thu, 03 Sep 2015 00:00:00 +0000</pubDate>
        
        <guid>https://colan.pro/blog/responding-drupals-highly-critical-sql-injection-vulnerability/</guid>
        <description>&lt;img src="https://colan.pro/blog/responding-drupals-highly-critical-sql-injection-vulnerability/DALL%C2%B7E%202024-06-25%2008.02.21%20-%20A%20vibrant,%20wide%20banner%20image%20representing%20a%20response%20to%20a%20critical%20security%20vulnerability%20in%20Drupal,%20featuring%20elements%20like%20warning%20symbols,%20a%20lock,%20.webp" alt="Featured image of post Responding to Drupal&#39;s Highly Critical SQL Injection Vulnerability" /&gt;&lt;p&gt;On October 15th, 2014, the highly critical &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/SA-CORE-2014-005&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SA-CORE-2014-005 - Drupal core - SQL injection&lt;/a&gt; vulnerability was announced. Shortly afterwards, research showed that sites not patched that same day could very well be compromised. Two weeks later, a &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/PSA-2014-003&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;public service announcement&lt;/a&gt; was released explaining the gravity of the situation. There was also a &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/drupalsa05FAQ&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;FAQ&lt;/a&gt;, a &lt;a class=&#34;link&#34; href=&#34;http://www.js.geek.nz/blog/your-drupal-website-has-backdoor&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;flowchart&lt;/a&gt; for dealing with it and a &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/drupalgeddon&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;module&lt;/a&gt; that could potentially confirm a compromised site. Needless to say, it was a challenging time for the community.&lt;/p&gt;
&lt;p&gt;At the time, I was asked by a client of mine to analyze a site to determine risk.&lt;/p&gt;
&lt;p&gt;Some common attack vectors associated with the vulnerability were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Changing the superuser&amp;rsquo;s (user ID 1) username, password or e-mail address.&lt;/li&gt;
&lt;li&gt;Adding new users to the user table with the administrator role (usually ID 3).&lt;/li&gt;
&lt;li&gt;Adding entries to the menu_router table.&lt;/li&gt;
&lt;li&gt;Adding PHP files to the code base or in the sites/all/files directory.&lt;/li&gt;
&lt;li&gt;Adding nodes (pages) or blocks with executable PHP.&lt;/li&gt;
&lt;li&gt;Downloading the list of user passwords&lt;/li&gt;
&lt;li&gt;Determining hackability through the version listed in CHANGELOG.txt&lt;/li&gt;
&lt;li&gt;Spawned processes run by the Web server&lt;/li&gt;
&lt;li&gt;Adding new roles&lt;/li&gt;
&lt;li&gt;Permission changes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So based on the above, and some other sources, it was possible to produce a list of things one could look for to determine if a site had been compromised. As has been discussed elsewhere, failure to confirm any of these did not mean the site was not compromised, but it did provide some indication of risk.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Rerun the &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/security_review&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Security Review&lt;/a&gt; module.&lt;/li&gt;
&lt;li&gt;Perform checks with the &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/Drupalgeddon&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drupalgeddon&lt;/a&gt; &amp;amp; &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/project/site_audit&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Site Audit&lt;/a&gt; modules.&lt;/li&gt;
&lt;li&gt;Check for changes to user 1&amp;rsquo;s username, password or e-mail address.&lt;/li&gt;
&lt;li&gt;Check all users in roles other than &amp;ldquo;anonymous&amp;rdquo; and &amp;ldquo;authenticated&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Check for strange entries in the menu_router table.&lt;/li&gt;
&lt;li&gt;Check for code files outside of version control.&lt;/li&gt;
&lt;li&gt;Check for code files inside sites/all/files.&lt;/li&gt;
&lt;li&gt;Check for new nodes or blocks in the DB.&lt;/li&gt;
&lt;li&gt;Check for strange processes spawned by the Web server user.&lt;/li&gt;
&lt;li&gt;Check for any new roles.&lt;/li&gt;
&lt;li&gt;Check for any permission changes.&lt;/li&gt;
&lt;li&gt;Check the mail logs for anything suspicious being sent out.&lt;/li&gt;
&lt;li&gt;Scan site with the &lt;a class=&#34;link&#34; href=&#34;http://sucuri.net/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Sucuri&lt;/a&gt; tools &lt;a class=&#34;link&#34; href=&#34;http://sitecheck.sucuri.net/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Free Website Malware and Security Scanner&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;http://www.unmaskparasites.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Unmask Parasites&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There are some worthwhile things to note with respect to the checklist above:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Some of the clues (such as 5 and 6 above) would have been long gone as they&amp;rsquo;re rebuilt during cache clears and deployments.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s theoretically possible that malicious processes could have been spawned by the Web servers. The names could have been renamed to look non-malicious, but unless something was set up to make these persist across power cycles, they would be wiped on a system reboot.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s also theoretically possible that user passwords could have been compromised. In Drupal 7, hashed passwords are &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Salt_%28cryptography%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;salted&lt;/a&gt;, but the random string used for the salt could have been read as it&amp;rsquo;s in sites/colan.consulting/settings.php. With that in mind, the site would be susceptible to brute force, &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Dictionary_attack&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;dictionary&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Rainbow_table&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;rainbow table&lt;/a&gt; attacks. If the site isn&amp;rsquo;t going to be rebuilt, it would be a good idea to expire all passwords and forcing users to reset them. If another system is handling authentication, this isn&amp;rsquo;t an issue.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And of course there could be any number of other things. The best course of action would be to rebuild the site. If that&amp;rsquo;s a challenge, always consider the level of risk before deciding not to. Hopefully we won&amp;rsquo;t have to make too many of these determinations in the future.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.acquia.com/blog/shields&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Shields Up!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.acquia.com/blog/learning-hackers-week-after-drupal-sql-injection-announcement&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Learning from hackers a week after the Drupal SQL Injection announcement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://blog.sucuri.net/2014/10/drupal-sql-injection-attempts-in-the-wild.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drupal SQL Injection Attempts in the Wild&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://www.volexity.com/blog/?p=83&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drupal Vulnerability: Mass Scans &amp;amp; Targeted Exploitation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://www.doit.wisc.edu/news/new-vulnerability-drupal-project-psa/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;UPDATE: New vulnerability–Drupal Project PSA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.getpantheon.com/blog/what-we-are-seeing-drupal-sa-2014-005&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;What We Are Seeing With Drupal SA 2014-005&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://drupal.stackexchange.com/questions/133996/drupal-sa-core-2014-005-how-to-tell-if-my-server-sites-were-compromised&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drupal SA-CORE-2014-005 - How to tell if my server / sites were compromised?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/drupalsa05FAQ&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;FAQ on SA-CORE-2014-005&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/node/2368709&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;How to improve security on Drupal websites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://stratusclear.com/drupal-sql-injection-attempts-in-the-wild/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drupal SQL Injection Attempts in the Wild&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://stratusclear.com/drupal-warns-every-drupal-7-website-was-compromised-unless-patched/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drupal Warns – Every Drupal 7 Website was Compromised Unless Patched&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Drupal Helpers: Tools for DevOps and Deployment</title>
        <link>https://colan.pro/blog/drupal-helpers-tools-devops-and-deployment/</link>
        <pubDate>Mon, 10 Aug 2015 00:00:00 +0000</pubDate>
        
        <guid>https://colan.pro/blog/drupal-helpers-tools-devops-and-deployment/</guid>
        <description>&lt;img src="https://colan.pro/blog/drupal-helpers-tools-devops-and-deployment/DALL%C2%B7E%202024-06-24%2016.44.07%20-%20A%20vibrant,%20wide%20banner%20image%20representing%20DevOps%20and%20deployment%20tools%20for%20Drupal,%20featuring%20elements%20like%20servers,%20code,%20automation%20symbols,%20and%20Drupa.webp" alt="Featured image of post Drupal Helpers: Tools for DevOps and Deployment" /&gt;&lt;p&gt;As I&amp;rsquo;ve been architecting Drupal solutions for almost ten years now, I&amp;rsquo;ve accumulated quite a bit of knowledge on &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/DevOps&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;devops&lt;/a&gt; best practices, which constitutes a sizeable amount of the consulting that I do. This includes documentation, configuration management, development processes and deployment processes. In this article, I&amp;rsquo;ll be introducing &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/colan/drupal-helpers&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drupal Helpers&lt;/a&gt;, a collection of standard scripts and configurations that I use on all of my client projects (where applicable).&lt;/p&gt;
&lt;p&gt;At the time of the writing, the repository provides support for the following operations and &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Drush&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drush&lt;/a&gt; set-up. Additional tools are always welcome.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#refreshing-a-development-sites-database-and-files&#34; &gt;Refreshing a development site&amp;rsquo;s database and files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#deploying-code-to-a-developmentintegration-site&#34; &gt;Deploying code to a development/integration site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#deploying-code-to-staging-or-production-sites&#34; &gt;Deploying code to staging or production sites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#php-configuration-for-drush&#34; &gt;PHP configuration for Drush&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#default-drush-alias-configuration&#34; &gt;Default Drush alias configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#backing-up-databases&#34; &gt;Backing up databases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#rebuilding-a-site-with-its-latest-drush-makefile&#34; &gt;Rebuilding a site with its latest Drush makefile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#deploying-solr-onto-the-glassfish-application-server&#34; &gt;Deploying Solr onto the GlassFish application server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;refreshing-a-development-sites-database-and-files&#34;&gt;Refreshing a development site&amp;rsquo;s database and files
&lt;/h2&gt;&lt;p&gt;The &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/colan/drupal-helpers/blob/master/scripts/resync-drupal-db-for-dev&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;resync-drupal-db-for-dev&lt;/a&gt; script essentially deploys the database and files from a staging site (Staging) or production site (Prod) onto a development site, but it also does many other things that should be done as part of that process, devifying it.&lt;/p&gt;
&lt;p&gt;It takes source and destination Drush aliases as arguments and the third one, a list of modules to disable, is optional. Here is the usage example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;resync-drupal-db-for-dev &amp;lt;SOURCE_DRUSH_ALIAS&amp;gt; &amp;lt;DESTINATION_DRUSH_ALIAS&amp;gt; [&amp;lt;MODULES_DISABLE&amp;gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It performs the following tasks:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Saves a cache-cleared dump of the destination database (DB) as a backup.&lt;/li&gt;
&lt;li&gt;Overwrites the destination DB with the source&amp;rsquo;s.&lt;/li&gt;
&lt;li&gt;Rebuilds the registry in case PHP file locations have changed.&lt;/li&gt;
&lt;li&gt;Updates the DB schema.&lt;/li&gt;
&lt;li&gt;Reverts all features to the code in Features modules.&lt;/li&gt;
&lt;li&gt;Reverts all views to those defined in code.&lt;/li&gt;
&lt;li&gt;Disables modules that shouldn&amp;rsquo;t be enabled during development.&lt;/li&gt;
&lt;li&gt;Enables modules that are helpful for development.&lt;/li&gt;
&lt;li&gt;Disables CSS and JavaScript caching.&lt;/li&gt;
&lt;li&gt;Sets the &lt;em&gt;files&lt;/em&gt; and temporary directories to standard locations.&lt;/li&gt;
&lt;li&gt;Enables on-screen error reporting.&lt;/li&gt;
&lt;li&gt;Disables user-initiated cron runs. &lt;em&gt;This should really be disabled everywhere for &lt;a class=&#34;link&#34; href=&#34;https://colan.consulting/blog/improving-drupal-7-performance-after-period-inactivity&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;performance reasons&lt;/a&gt;.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Clears all caches.&lt;/li&gt;
&lt;li&gt;Overwrites the destination&amp;rsquo;s &lt;em&gt;files&lt;/em&gt; directory with the source&amp;rsquo;s.&lt;/li&gt;
&lt;li&gt;Runs cron.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Developers should be doing all of this every time they refresh their DBs. Because it&amp;rsquo;s tricky and time-consuming to do all of these manually, some of the steps are often missed. This leads to configuration mismanagement issues between development sandboxes and other environments. I&amp;rsquo;d recommend that this script, or another one like it, be run frequently on the authoritative development/integration site (Dev) and local development sites to prevent such mishaps.&lt;/p&gt;
&lt;p&gt;The script tries to be as versatile as possible, working in a variety of GNU/Linux environments. If it doesn&amp;rsquo;t work for yours, please submit a merge request so that we can get support added.&lt;/p&gt;
&lt;h2 id=&#34;deploying-code-to-a-developmentintegration-site&#34;&gt;Deploying code to a development/integration site
&lt;/h2&gt;&lt;p&gt;The &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/colan/drupal-helpers/blob/master/scripts/deploy-drupal-code-dev&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;deploy-drupal-code-dev&lt;/a&gt; script is useful for deploying the latest development code that&amp;rsquo;s been merged to the development branch to Dev. As part of that process, it does everything else that&amp;rsquo;s necessary after a code deployment, including clearing external Varnish caches. It doesn&amp;rsquo;t produce output to the screen when running it directly, as it&amp;rsquo;s assumed to be run as a cron job. All output gets redirected to a log file. A best practice is to have it run nightly so that Dev is kept up-to-date.&lt;/p&gt;
&lt;h2 id=&#34;deploying-code-to-staging-or-production-sites&#34;&gt;Deploying code to staging or production sites
&lt;/h2&gt;&lt;p&gt;The two (2) scripts &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/colan/drupal-helpers/blob/master/scripts/deploy-drupal-code-qa&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;deploy-drupal-code-qa&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/colan/drupal-helpers/blob/master/scripts/deploy-drupal-code-prod&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;deploy-drupal-code-prod&lt;/a&gt; basically follow the same idea as the Dev script above, except that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They require a Git release tag as an argument, as only tagged releases should be deployed to Staging and Prod.&lt;/li&gt;
&lt;li&gt;They produce output directly to the screen, as they are intended to be run manually.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;php-configuration-for-drush&#34;&gt;PHP configuration for Drush
&lt;/h2&gt;&lt;p&gt;The &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/colan/drupal-helpers/blob/master/drush/drush.ini&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;drush.ini&lt;/a&gt; configuration file (see &lt;a class=&#34;link&#34; href=&#34;http://www.drush.org/en/master/configure/#configuring-phpini&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Configuring php.ini&lt;/a&gt; for details) adds Drush-specific configuration to PHP, differentiated by its being run from the command line; Drush&amp;rsquo;s PHP doesn&amp;rsquo;t go through a Web server.&lt;/p&gt;
&lt;p&gt;As Drush is often called upon for batch processing, it requires more resources than Web-server PHP. Also, there aren&amp;rsquo;t usually multiple instances of it running so we don&amp;rsquo;t need be as concerned about overflowing resource limits. With Web servers, there could be a huge number of PHP processes running on public-facing sites.&lt;/p&gt;
&lt;p&gt;The configuration file does the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Increases the memory limit.&lt;/li&gt;
&lt;li&gt;Ensures all errors are shown.&lt;/li&gt;
&lt;li&gt;Sets the time zone.&lt;/li&gt;
&lt;li&gt;Increases the maximum execution time. &lt;em&gt;You may need to do this &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/node/587250#comment-3506436&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;for MySQL/variants as well&lt;/a&gt;.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Make sure this is set up by placing the file (or a symlink to it) in your &lt;em&gt;/etc/php5/cli/conf.d/&lt;/em&gt; directory (or the equivalent for different systems).&lt;/p&gt;
&lt;h2 id=&#34;default-drush-alias-configuration&#34;&gt;Default Drush alias configuration
&lt;/h2&gt;&lt;p&gt;The &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/colan/drupal-helpers/blob/master/drush/default.alias.drushrc.php&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;default.alias.drushrc.php&lt;/a&gt; Drush alias file is a standard location for storing all common Drush configuration. It needs to be set in each of your site alias&amp;rsquo; configuration stanzas to use it.&lt;/p&gt;
&lt;p&gt;The line is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;?php$aliases[&amp;#39;dev&amp;#39;] = array(  &amp;#39;parent&amp;#39; =&amp;gt; &amp;#39;@default&amp;#39;,  ...?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It could actually use an update now that &lt;a class=&#34;link&#34; href=&#34;https://www.drupal.org/node/698264&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Better handling of structure-tables and skip-tables options (including cache_* support!)&lt;/a&gt; is done. We no longer need to explicitly state which cache tables we need to skip during certain operations.&lt;/p&gt;
&lt;h2 id=&#34;backing-up-databases&#34;&gt;Backing up databases
&lt;/h2&gt;&lt;p&gt;The &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/colan/drupal-helpers/blob/master/scripts/backup-drupal-db&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;backup-drupal-db&lt;/a&gt; script will back up a Drupal DB whenever it&amp;rsquo;s run. It can be run stand-alone or as a Cron job. To save storage space, cache tables will not be included in the compressed dump files. Each is timestamped, and the &amp;ldquo;LATEST&amp;rdquo; file will always be a symbolic link to the most recent backup. Old backups are automatically deleted after a set number of days; the default is 60 (~2 months).&lt;/p&gt;
&lt;h2 id=&#34;rebuilding-a-site-with-its-latest-drush-makefile&#34;&gt;Rebuilding a site with its latest Drush makefile
&lt;/h2&gt;&lt;p&gt;The &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/colan/drupal-helpers/blob/master/scripts/drupal-remake&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;drupal-remake&lt;/a&gt; script will rebuild a Drupal site&amp;rsquo;s document root to reflect recent changes in its &lt;a class=&#34;link&#34; href=&#34;http://www.drush.org/en/master/make/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drush makefile&lt;/a&gt;. It performs the following tasks:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Takes the site off-line.&lt;/li&gt;
&lt;li&gt;Backs up the existing database.&lt;/li&gt;
&lt;li&gt;Updates the Git repository with the latest code.&lt;/li&gt;
&lt;li&gt;Purges the old code base.&lt;/li&gt;
&lt;li&gt;Rebuilds it.&lt;/li&gt;
&lt;li&gt;Re-installs the previous &lt;em&gt;sites&lt;/em&gt; directory (with site-specific configuration).&lt;/li&gt;
&lt;li&gt;Properly sets all file permissions.&lt;/li&gt;
&lt;li&gt;Updates the DB schema.&lt;/li&gt;
&lt;li&gt;Turns the site back on-line.&lt;/li&gt;
&lt;li&gt;Clears all caches.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;deploying-solr-onto-the-glassfish-application-server&#34;&gt;Deploying Solr onto the GlassFish application server
&lt;/h2&gt;&lt;p&gt;The &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/colan/drupal-helpers/blob/master/scripts/deploy-solr-on-glassfish&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;deploy-solr-on-glassfish&lt;/a&gt; script sets up the &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Apache_Solr&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Solr&lt;/a&gt; search engine to run on the &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/GlassFish&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GlassFish&lt;/a&gt; application server.&lt;/p&gt;
&lt;p&gt;With Solr 5, it&amp;rsquo;s no longer necessary to run the search engine in an application server. It can run as a stand-alone application. See &lt;a class=&#34;link&#34; href=&#34;http://flink.com.au/install-apache-solr-5-and-drupal-search-api-on-laptop-in-minutes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Install Apache Solr 5 and Drupal Search API on your laptop in minutes&lt;/a&gt; for an example of how to do this. For earlier versions though, this is helpful in getting the Java stack set up to run alongside the PHP one.&lt;/p&gt;
&lt;p&gt;A special thanks goes out to &lt;a class=&#34;link&#34; href=&#34;https://github.com/jamonation&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Jamon Camisso&lt;/a&gt; for &lt;a class=&#34;link&#34; href=&#34;https://gist.github.com/jamonation/38d8adad26344e0a4453&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;posting the original version of this on GitHub&lt;/a&gt; earlier.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
