<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: 0x5eva</title>
    <description>The latest articles on DEV Community by 0x5eva (@0x5eva).</description>
    <link>https://dev.to/0x5eva</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3141303%2Fd457893b-17c0-40a2-b772-fa55d9116084.png</url>
      <title>DEV Community: 0x5eva</title>
      <link>https://dev.to/0x5eva</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/0x5eva"/>
    <language>en</language>
    <item>
      <title>Accelerate Development with Fast Feedback Loops Using MCP Browser and LLMs</title>
      <dc:creator>0x5eva</dc:creator>
      <pubDate>Fri, 20 Jun 2025 16:45:21 +0000</pubDate>
      <link>https://dev.to/0x5eva/accelerate-development-with-fast-feedback-loops-using-mcp-browser-and-llms-34jd</link>
      <guid>https://dev.to/0x5eva/accelerate-development-with-fast-feedback-loops-using-mcp-browser-and-llms-34jd</guid>
      <description>&lt;p&gt;The world of modern web development is evolving. Now we're not talking about the notorious race of everyday emerging front-end frameworks or about the environments that have walked the path from text editors to powerful plugin-rich and adjustable IDEs for any purpose.&lt;/p&gt;

&lt;p&gt;LLMs are gaining power and becoming better and better so there are two ways to deal with it - deny it or accept it. In order to keep up with the more and more increasing speed of development it's always nice to revisit the current state of events and check new cool kids on the block.&lt;/p&gt;

&lt;p&gt;Nowadays the development process has become more like a copy-paste from the error trace to GPT and back. The tools are powerful, but we still require the middleman to handle all of them, to give the context. Context is still something we're trying to handle better, because we often treat LLMs like it's an all-knowing machine forgetting that it can operate only with the available context.&lt;/p&gt;

&lt;p&gt;Of course, there are new tools like web search or docs analysis but for better results, it would be nice if the agent could see the results of its creation immediately without the operator's help.&lt;/p&gt;

&lt;p&gt;One of them is &lt;a href="https://github.com/microsoft/playwright-mcp" rel="noopener noreferrer"&gt;Playwright MCP&lt;/a&gt;. This project is a browser, that provides our agent with "eyes". After generating a component it's able to immediately see the outcome and make the adjustments. You don't need to insert error codes or explain - you could just ask it to check the dev tools and fix the code to avoid those errors, thus creating a powerful feedback loop that helps you to focus on more architectural tasks rather than explaining why you don't like the result. Now, let's dive into how to use it, and let's make a simple news website to test the setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools required:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pnpm.io/" rel="noopener noreferrer"&gt;pnpm&lt;/a&gt; - as a package manager&lt;/li&gt;
&lt;li&gt;Cursor IDE (or any MCP-compatible IDE like VS Code, Windsurf, etc)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/microsoft/playwright-mcp" rel="noopener noreferrer"&gt;Playwright MCP&lt;/a&gt; - Browser with MCP interface&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tanstack.com/start/latest" rel="noopener noreferrer"&gt;TanStack Start&lt;/a&gt; - A fullstack framework&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.thenewsapi.com/" rel="noopener noreferrer"&gt;TheNewsAPI&lt;/a&gt; - an example API&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://vitest.dev/" rel="noopener noreferrer"&gt;Vitest&lt;/a&gt; - For visual and unit testing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Initial setup:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pnpm dlx gitpick TanStack/router/tree/main/examples/react/start-basic start-basic
cd start-basic
pnpm install
pnpm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In your package.json, add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"scripts": {
  "mcp": "npx @playwright/mcp@latest"
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then start the development server and MCP browser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pnpm dev
pnpm mcp:browser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Developing process
&lt;/h2&gt;

&lt;p&gt;Start interacting with the browser via the MCP interface. You'll prompt, observe the outcome, and iterate. For example, you might:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask the agent to check the console for errors&lt;/li&gt;
&lt;li&gt;Let the LLM suggest UI or logic fixes&lt;/li&gt;
&lt;li&gt;Watch as your IDE uses MCP to inspect live browser state and adjust code accordingly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;💡 You can also enable auto tool usage - just be cautious, as it can be unstable. I recommend adding the MCP browser command to the allowed list otherwise you might get an unpleasant surprise where the agent installs packages while trying to resolve a simple bug caused by an incorrect import.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So our first goal will be creating a simple news layout. While you're doing that you could also ask LLM to launch a development server, check the webpage and console for any errors and immediately try to resolve them.&lt;br&gt;
Prompt example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Build a modern news aggregator website using React, Vite, TanStack Router for routing, TanStack Query for data fetching, and Tailwind CSS for styling. The application should have a main page with a category sidebar that filters a news feed, a simple "About" page, and a persistent header for navigation. Fetch articles from a public news API, display them in a card-based layout with a clear loading state, and ensure that clicking a category dynamically updates the main content to show relevant news&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flf7jiwnos5hqxu2g01cu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flf7jiwnos5hqxu2g01cu.png" alt="Screenshot of the resulting news website" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;💡 News API requires a key&lt;br&gt;
Make sure to add your News API key to the .env file:&lt;/em&gt;&lt;br&gt;
&lt;code&gt;NEWS_API_KEY=your_api_key_here&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Time to Test
&lt;/h2&gt;

&lt;p&gt;Now let's push the MCP browser to its limits and generate some tests using Vitest.&lt;br&gt;
Prompt example:&lt;br&gt;
_&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Use the browser_generate_playwright_test action to generate tests:&lt;br&gt;
 -scenario 1: should navigate between Home and About pages&lt;br&gt;
 -scenario 2: should filter news by category&lt;br&gt;
_&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test('should navigate between home and about pages', async ({ page }) =&amp;gt; {
  await page.goto('http://localhost:3000/about');
  await page.getByRole('link', { name: 'Home' }).click();
  await expect(page).toHaveURL('http://localhost:3000/');
  await expect(page.getByRole('heading', { name: 'General News' })).toBeVisible();
  await page.getByRole('link', { name: 'About' }).click();
  await expect(page).toHaveURL('http://localhost:3000/about');
  await expect(page.getByRole('heading', { name: 'About This News Website' })).toBeVisible();
});

test('should filter news by category', async ({ page }) =&amp;gt; {
  await page.goto('http://localhost:3000/');
  await page.getByRole('button', { name: 'Business' }).click();

  // Wait for the heading to appear, with a longer timeout
  await expect(page.getByRole('heading', { name: 'Business News' })).toBeVisible({ timeout: 10000 });
}); 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8kgin9wtuolwxl62upuy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8kgin9wtuolwxl62upuy.png" alt="Screenshot of successfully running tests " width="684" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, we can also prompt it to run those tests, check for errors, and if they exist - fix them. Yes, it's that easy! However, I also recommend carefully inspecting the generated tests to ensure they actually meet all your requirements of the product.&lt;/p&gt;

&lt;p&gt;Don't assume this basic project is the limit of what agents can do. It's just a simple example to help you explore the new development principles that can speed up your workflow a lot - and help you experiment without the regret of wasted time!&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Setting Up a Private Docker Registry with Coolify</title>
      <dc:creator>0x5eva</dc:creator>
      <pubDate>Fri, 09 May 2025 15:36:24 +0000</pubDate>
      <link>https://dev.to/0x5eva/setting-up-a-private-docker-registry-with-coolify-3ag9</link>
      <guid>https://dev.to/0x5eva/setting-up-a-private-docker-registry-with-coolify-3ag9</guid>
      <description>&lt;p&gt;&lt;a href="https://docs.docker.com/registry/#what-it-is" rel="noopener noreferrer"&gt;Docker Registry&lt;/a&gt; is an application that handles storing and managing docker container images.  It helps create a stable, well tested environment for your app that can be used both during both development and production.&lt;/p&gt;

&lt;p&gt;In this tutorial we'll walk through the process of setting up our own private docker registry and pushing images to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why would you need it?
&lt;/h2&gt;

&lt;p&gt;Sure, you could just host your app without it and manage deployments with a few bash scripts. That might work at first but as soon as your app grows, so do your requirements. You might need some kind of rollback mechanism, ensure environment consistency or improve reliability and repeatability.&lt;/p&gt;

&lt;p&gt;Besides, the build process often demands more compute resources than simply running the app, which could result in longer deployment durations. It's better to break the deployment into stages, handling all the preparations and code transformations before the app reaches the production server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why would you use additional tools like Coolify for this?
&lt;/h2&gt;

&lt;p&gt;Well, technically, you are still able to manage images via terminal commands, but why bother doing this if there is already a battle-tested software that can help us to skip a few steps?&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://coolify.io/docs/get-started/installation" rel="noopener noreferrer"&gt;VPS with Coolify installed&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.docker.com/get-started/" rel="noopener noreferrer"&gt;Docker Desktop or the Docker CLI installed locally&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In this tutorial we'll be using &lt;a href="https://github.com/coollabsio/coolify/releases/tag/v4.0.0-beta.390" rel="noopener noreferrer"&gt;v4.0.0-beta.390&lt;/a&gt;  which is the latest available release now &lt;/p&gt;

&lt;p&gt;Let’s log into the Coolify dashboard:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs5gldok0hl20jeunxolp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs5gldok0hl20jeunxolp.jpg" alt="empty coolify page with the add new resource button in the center of the page" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, we need  to add a new service:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73ko11uktzkms278gj3q.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73ko11uktzkms278gj3q.jpg" alt="Add new resource in Coolify screen. docker registry option in the center" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select the Docker Registry service, then choose the server where you want to host it. After that you'll be redirected to the service configuration page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdkh7pg0xvbqtitip7804.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdkh7pg0xvbqtitip7804.png" alt="Coolify service service stack settings page. There are: service name, connect to predefined network checkmark and other settings options" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here, we can change the name of the container and proceed with the setup.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Don’t forget to click the save button after making any changes!&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you're going to make the registry accessible from the internet, you can also edit the domain name that points to your server's address here&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Now let's set up the login credentials.&lt;br&gt;
This is the default user:&lt;br&gt;
&lt;code&gt;testuser:testpassword&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;and being represented as&lt;/p&gt;

&lt;p&gt;&lt;code&gt;testuser:$2y$05$/o2JvmI2bhExXIt6Oqxa7ekYB7v3scj1wFEf6tBslJvJOMoPQL.Gy&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It's defined both in the compose file and in persistent storage after the first launch of the container.&lt;br&gt;
You should change it immediately after installation for security reasons.&lt;br&gt;
To do this, we need to generate a new &lt;code&gt;username:password&lt;/code&gt; pair. You can do it with the following command:&lt;/p&gt;

&lt;p&gt;You may need to install Apache utilities first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update
sudo apt install apache2-utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command to generate the new credentials:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;htpasswd -nB docker-tutorial-user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9n96tqb89yramr826nia.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9n96tqb89yramr826nia.png" alt="Terminal screenshot with the htpasswd command in inside, terminal asks for the password and then re-type password" width="800" height="84"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once we have the generated string we can use it for authentication &lt;br&gt;
so let's update the value in the persistent storage:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3psz6xbv3aofgg58mc7r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3psz6xbv3aofgg58mc7r.png" alt="Coolify service settings page screenshot. Content with the username:password is focused" width="800" height="768"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, let’s take a look at the compose file.&lt;br&gt;
The only optional change we might want to make here is to remove the existing credentials to ensure they won't be used anymore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services:

  registry:

    image: 'registry:2'

    environment:

      - SERVICE_FQDN_REGISTRY_5000

      - REGISTRY_AUTH=htpasswd

      - REGISTRY_AUTH_HTPASSWD_REALM=Registry

      - REGISTRY_AUTH_HTPASSWD_PATH=/auth/registry.password

      - REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/data

    volumes:

      -

        type: bind

        source: ./auth/registry.password

        target: /auth/registry.password

        isDirectory: false

        content: 'testuser:$2y$05$/o2JvmI2bhExXIt6Oqxa7ekYB7v3scj1wFEf6tBslJvJOMoPQL.Gy'

      -

        type: bind

        source: ./config/config.yml

        target: /etc/docker/registry/config.yml

        isDirectory: false

        content: "version: 0.1\nlog:\n  fields:\n    service: registry\nstorage:\n  cache:\n    blobdescriptor: inmemory\n  filesystem:\n    rootdirectory: /var/lib/registry\nhttp:\n  addr: :5000\n  headers:\n    X-Content-Type-Options: [nosniff]\nhealth:\n  storagedriver:\n    enabled: true\n    interval: 10s\n    threshold: 3"

      -

        type: bind

        source: ./data

        target: /data

        isDirectory: true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Making the registry accessible
&lt;/h2&gt;

&lt;p&gt;After entering a valid domain that points at the server IP address and restarting the container we should be able to connect to the container with our client and push/pull images.&lt;/p&gt;

&lt;p&gt;If we didn't change the default settings for the proxy Coolify will automatically issue a valid SSL Let's encrypt certificate:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fakn0zhcwqgs6cxeg2cun.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fakn0zhcwqgs6cxeg2cun.png" alt="Coolify service domain editing screenshot. Domain input element is active" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn70z9w3u8t1aucteg71b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn70z9w3u8t1aucteg71b.png" alt="Terminal screenshot with a docker login example" width="800" height="142"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If we still encounter a certificate error, try switching the default proxy to Caddy and restart the container&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Once you see the Login Succeeded message, you can start pushing and using your images! 😊&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Additional information:&lt;/strong&gt;&lt;br&gt;
If you're operating inside the virtual network or just prefer to not expose the registry to the internet you have at least 3 options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate a self-signed certificate&lt;/li&gt;
&lt;li&gt;Use ready-to-go tools to set up a VPN with an internal SSL domain&lt;/li&gt;
&lt;li&gt;Set up an unencrypted Docker registry and add it to you docker client's &lt;code&gt;daemon.json&lt;/code&gt; file
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "insecure-registries": ["docker-registry-internal-address:5000"]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>docker</category>
      <category>coolify</category>
    </item>
  </channel>
</rss>
