<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Julian's Blog about Data Engineering]]></title><description><![CDATA[Data Engineering Blog about everything Data Engineering and Open Source related.]]></description><link>https://blog.rommel.solutions</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 09:35:07 GMT</lastBuildDate><atom:link href="https://blog.rommel.solutions/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Deploy Airbyte behind an NGINX reverse proxy]]></title><description><![CDATA[Introduction
Airbyte doesn't support SSL encryption at the time of writing this article. To secure Airbyte in a production environment, you need to deploy it behind a reverse proxy like NIGNX and let the reverse proxy handle the encryption to the out...]]></description><link>https://blog.rommel.solutions/deploy-airbyte-behind-an-nginx-reverse-proxy</link><guid isPermaLink="true">https://blog.rommel.solutions/deploy-airbyte-behind-an-nginx-reverse-proxy</guid><category><![CDATA[airbyte ]]></category><category><![CDATA[data-engineering]]></category><dc:creator><![CDATA[Julian Rommel]]></dc:creator><pubDate>Sun, 05 Feb 2023 12:26:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/7JX0-bfiuxQ/upload/4938182d38ba97ace8e79b39435a8c7d.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-introduction">Introduction</h1>
<p>Airbyte doesn't support SSL encryption at the time of writing this article. To secure Airbyte in a production environment, you need to deploy it behind a reverse proxy like NIGNX and let the reverse proxy handle the encryption to the outside world. This guide will cover the installation of Docker, Airbyte and NGINX. To follow this guide, you need the following <strong>prerequisites</strong>:</p>
<ul>
<li><p>Ubuntu 22.04</p>
</li>
<li><p>SSL certificate</p>
</li>
<li><p>DNS entry for Airbyte deployment (e.g. airbyte.&lt;your-domain&gt;.com)</p>
</li>
</ul>
<h1 id="heading-docker">Docker</h1>
<p>Docker is required to run Airbyte. If you have already installed Docker Engine &amp; Docker Compose, then you can skip this section.</p>
<blockquote>
<p>Note: Don't use the Snap version of Docker that can be installed during the Ubuntu Server installation process. This version is known to cause all kinds of problems with Airbyte.</p>
</blockquote>
<h2 id="heading-docker-installation">Docker installation</h2>
<p>To install Docker Engine and Docker Compose (plugin), follow the guide on the <a target="_blank" href="https://docs.docker.com/engine/install/">docker website</a> or the instructions below (commands are from the docker website but may change in the future).</p>
<pre><code class="lang-bash"><span class="hljs-comment"># uninstall old versions</span>
sudo apt-get remove docker docker-engine docker.io containerd runc

<span class="hljs-comment"># install dependencies</span>
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release

<span class="hljs-comment"># add GPG key</span>
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

<span class="hljs-comment"># set up repository</span>
<span class="hljs-built_in">echo</span> \
  <span class="hljs-string">"deb [arch=<span class="hljs-subst">$(dpkg --print-architecture)</span> signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  <span class="hljs-subst">$(lsb_release -cs)</span> stable"</span> | sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null

<span class="hljs-comment"># Install Docker Engine, containerd, Docker Compose</span>
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
</code></pre>
<h2 id="heading-verify-docker-installation">Verify Docker installation</h2>
<p>To verify you have set up Docker correctly, run the hello-world image.</p>
<pre><code class="lang-bash">sudo docker run hello-world

<span class="hljs-comment"># output</span>
Hello from Docker!
This message shows that your installation appears to be working correctly.
</code></pre>
<p>If your output looks similar to the above, then you have installed Docker correctly.</p>
<h1 id="heading-airbyte">Airbyte</h1>
<p>If you have Airbyte already up and running, skip this section.</p>
<h2 id="heading-airbyte-installation">Airbyte installation</h2>
<p>The Airbyte installation is described in the <a target="_blank" href="https://docs.airbyte.com/quickstart/deploy-airbyte">official docs</a>. You can also follow the commands below.</p>
<pre><code class="lang-bash"><span class="hljs-comment"># pull Airbyte from GitHub</span>
git <span class="hljs-built_in">clone</span> https://github.com/airbytehq/airbyte.git

<span class="hljs-comment"># start Airbyte</span>
<span class="hljs-built_in">cd</span> airbyte
docker compose up
</code></pre>
<h2 id="heading-verify-airbyte-installation">Verify Airbyte installation</h2>
<p>If Airbyte starts up and you visit your server on <strong>http://&lt;server-ip&gt;:8000</strong> (Port 8000), you should see a login prompt. The default credentials are specified in the .env file in your Airbyte directory and default to username: airbyte; password: password. After logging in, you should see something like below:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1675595657265/1e124e6c-f9ff-4082-b960-45dd0a733ac7.jpeg" alt="Airbyte UI screen on first login" class="image--center mx-auto" /></p>
<h1 id="heading-nginx">NGINX</h1>
<p>If you have NGINX already installed, skip to the config part.</p>
<h2 id="heading-nginx-installation">NGINX installation</h2>
<p>NGINX is available via apt, which makes the installation process as easy as it gets.</p>
<pre><code class="lang-bash"><span class="hljs-comment"># install NGINX</span>
sudo apt install nginx
</code></pre>
<p>If you now visit your server on <strong>http://&lt;server-ip&gt;</strong> (Port 80), you should see the NGINX welcome message.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1675596240152/5b3a0370-1eb5-433d-9459-10fd41c146d1.jpeg" alt="NGINX welcome message" class="image--center mx-auto" /></p>
<h2 id="heading-nginx-config">NGINX config</h2>
<p>Now we need to configure NGINX as a reverse proxy to handle all incoming requests with SSL encryption. I assume that you have created a DNS entry that you will use for your Airbyte deployment. You also need a valid SSL certificate to use SSL authentication.</p>
<p>Then just simply copy the config below and fill in your domain name and the path to your SSL certificate. If you don't know where to put your SSL certificate, I would recommend storing it under <strong>/etc/ssl/certs/</strong>.</p>
<pre><code class="lang-nginx"><span class="hljs-comment"># /etc/nginx/sites-enabled/reverse-proxy.conf</span>
<span class="hljs-section">server</span> {
  <span class="hljs-attribute">listen</span> <span class="hljs-number">443</span> ssl;
  <span class="hljs-attribute">server_name</span> airbyte.&lt;your-domain&gt;.com;
  <span class="hljs-attribute">client_max_body_size</span> <span class="hljs-number">200M</span>;  <span class="hljs-comment"># see below</span>
  <span class="hljs-attribute">ssl_certificate</span> &lt;path-to-your-cert&gt;.crt.pem; 
  <span class="hljs-attribute">ssl_certificate_key</span> &lt;path-to-your-key&gt;.key.pem;

  <span class="hljs-attribute">location</span> / {
    <span class="hljs-attribute">proxy_pass</span> http://127.0.0.1:8000;
    <span class="hljs-attribute">proxy_set_header</span> Cookie <span class="hljs-variable">$http_ccokie</span>;  <span class="hljs-comment"># Airbyte auth cookie</span>
    <span class="hljs-attribute">proxy_read_timeout</span> <span class="hljs-number">3600</span>;  <span class="hljs-comment"># see below</span>
  }
}
</code></pre>
<p><strong>Explanation</strong></p>
<ul>
<li><p><strong>client_max_body_size</strong> defaults to 1M. This needs to be increased for the Airbyte API to work. 200M seems to work for me, but you can play around with the values.</p>
</li>
<li><p><strong>proxy_set_header Cookie $http_cookie</strong> is only needed if you use Airbytes basic authentication. You can also use configure authentication on the NGINX site and disable authentication for Airbyte (set username and password to "" in .env).</p>
</li>
<li><p><strong>proxy_read_timeout</strong> defaults to 60 seconds, which is not enough for some Airbyte API operations like schema discovery. 1 hour (3600 seconds) works for me but you can again play around with the values and see what works for you.</p>
</li>
</ul>
<p>After adding the reverse-proxy.conf you can restart NGINX and go to your configured domain (e.g. https://airbyte.&lt;your-domain&gt;.com). You should see the same login prompt and Airbyte UI as before, just with SSL encryption enabled!</p>
<h2 id="heading-http-to-https-redirect">HTTP to HTTPS redirect</h2>
<p>You can also set an automatic redirect so you don't have to add <em>https://</em> to your domain name every time you want to visit Airbyte. Simply add a redirect block to your existing config.</p>
<pre><code class="lang-nginx"><span class="hljs-comment"># /etc/nginx/sites-enabled/reverse-proxy.conf</span>

<span class="hljs-comment"># http to https redirect</span>
<span class="hljs-section">server</span> {
  <span class="hljs-attribute">listen</span> <span class="hljs-number">80</span>;
  <span class="hljs-attribute">server_name</span> airbyte.&lt;your-domain&gt;.com;
  <span class="hljs-attribute">return</span> <span class="hljs-number">301</span> https://airbyte.&lt;your-domain&gt;.com<span class="hljs-variable">$request_uri</span>;
}

<span class="hljs-comment"># config from earlier</span>
<span class="hljs-section">server</span> {
  <span class="hljs-attribute">listen</span> <span class="hljs-number">443</span> ssl;
  <span class="hljs-attribute">server_name</span> airbyte.&lt;your-domain&gt;.com;
  <span class="hljs-attribute">client_max_body_size</span> <span class="hljs-number">200M</span>;
  <span class="hljs-attribute">ssl_certificate</span> &lt;path-to-your-cert&gt;.crt.pem; 
  <span class="hljs-attribute">ssl_certificate_key</span> &lt;path-to-your-key&gt;.key.pem;

  <span class="hljs-attribute">location</span> / {
    <span class="hljs-attribute">proxy_pass</span> http://127.0.0.1:8000;
    <span class="hljs-attribute">proxy_set_header</span> Cookie <span class="hljs-variable">$http_ccokie</span>;
    <span class="hljs-attribute">proxy_read_timeout</span> <span class="hljs-number">3600</span>;
  }
}
</code></pre>
<blockquote>
<p>Don't forget to delete the default config at /etc/nginx/sites-enabled/default and restart NGINX</p>
</blockquote>
]]></content:encoded></item></channel></rss>