<?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[AIHostBox Guides]]></title><description><![CDATA[AIHostBox Guides]]></description><link>https://aihostbox.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Sat, 07 Nov 2026 11:12:25 GMT</lastBuildDate><atom:link href="https://aihostbox.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Run Open WebUI with Ollama on a small VPS (CPU only)]]></title><description><![CDATA[Most Open WebUI tutorials assume you have a GPU on your desk. Plenty of people don't. They have a 4 GB or 8 GB VPS and want a private chat UI with a small…]]></description><link>https://aihostbox.hashnode.dev/run-open-webui-with-ollama-on-a-small-vps-cpu-only</link><guid isPermaLink="true">https://aihostbox.hashnode.dev/run-open-webui-with-ollama-on-a-small-vps-cpu-only</guid><category><![CDATA[open-webui]]></category><category><![CDATA[ollama]]></category><category><![CDATA[self hosting]]></category><category><![CDATA[#selfhosted]]></category><dc:creator><![CDATA[AIHostBox]]></dc:creator><pubDate>Thu, 29 Oct 2026 19:38:16 GMT</pubDate><content:encoded><![CDATA[<p>Most Open WebUI tutorials assume you have a GPU on your desk. Plenty of people don't. They have a 4 GB or 8 GB VPS and want a private chat UI with a small local model, plus maybe an API key for the heavy stuff. That works fine, as long as you size the model to the box and get the networking between the two containers right. The networking is where almost everyone gets stuck, so most of this guide is about that.</p>
<h3>What you actually need</h3>
<p>Open WebUI itself is light. It is a Python app with a SQLite database by default, and it idles well under 1 GB of RAM. The model is the expensive part. On a CPU-only server the model has to fit in RAM next to the OS and Open WebUI, and it will be slow compared to a GPU. Realistic numbers from the Ollama library pages:</p>
<ul>
<li>llama3.2:1b is about 1.3 GB</li>
<li>llama3.2:3b is about 2.0 GB</li>
<li>qwen3:4b is about 2.5 GB</li>
<li>gemma3:4b is about 3.4 GB</li>
<li>qwen3:8b is about 5.2 GB</li>
<li>gemma3:12b is about 8.2 GB</li>
</ul>
<p>A rough rule that has held up for us: take the model file size, add 1 to 2 GB for context and Open WebUI, add the OS. So a 4 GB VPS is comfortable with a 1B or 3B model, an 8 GB box can run a 4B model or squeeze in an 8B one, and anything bigger wants 16 GB. More cores help token speed; 2 vCPU works, 4 feels noticeably better. Expect a few tokens per second on small models, not ChatGPT speed.</p>
<p>Sources: <a href="https://ollama.com/library/llama3.2">https://ollama.com/library/llama3.2</a>, <a href="https://ollama.com/library/qwen3">https://ollama.com/library/qwen3</a>, <a href="https://ollama.com/library/gemma3">https://ollama.com/library/gemma3</a></p>
<h3>Option A: Ollama on the host, Open WebUI in Docker</h3>
<p>This is the setup we recommend, because you can update each piece on its own.</p>
<p>Install Ollama with the official script (<a href="https://docs.ollama.com/linux">https://docs.ollama.com/linux</a>):</p>
<pre><code class="language-bash">curl -fsSL https://ollama.com/install.sh | sh
ollama pull llama3.2:3b
ollama run llama3.2:3b "say hi"
</code></pre>
<p>Ollama now runs as a systemd service and listens on 127.0.0.1:11434. That address is the first trap. A Docker container can't reach the host's 127.0.0.1, because inside the container localhost means the container itself.</p>
<p>You have two ways around it. The first is to run Open WebUI on the host network, which is the fix the Open WebUI troubleshooting page gives (<a href="https://docs.openwebui.com/troubleshooting/connection-error/">https://docs.openwebui.com/troubleshooting/connection-error/</a>):</p>
<pre><code class="language-bash">docker run -d --network=host \
  -v open-webui:/app/backend/data \
  -e OLLAMA_BASE_URL=http://127.0.0.1:11434 \
  --name open-webui --restart always \
  ghcr.io/open-webui/open-webui:main
</code></pre>
<p>With <code>--network=host</code> the port mapping goes away and the UI is on port 8080, not 3000. People miss that and think it didn't start.</p>
<p>The second way keeps normal Docker networking and uses <code>host.docker.internal</code>, which is what the quick start does (<a href="https://docs.openwebui.com/getting-started/quick-start/">https://docs.openwebui.com/getting-started/quick-start/</a>):</p>
<pre><code class="language-bash">docker run -d -p 3000:8080 \
  --add-host=host.docker.internal:host-gateway \
  -v open-webui:/app/backend/data \
  -e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
  --name open-webui --restart always \
  ghcr.io/open-webui/open-webui:main
</code></pre>
<p>For this one, Ollama has to listen on more than loopback, because host.docker.internal resolves to the Docker bridge address. The Ollama FAQ (<a href="https://docs.ollama.com/faq">https://docs.ollama.com/faq</a>) says to do it through systemd:</p>
<pre><code class="language-bash">sudo systemctl edit ollama.service
# add under [Service]:
# Environment="OLLAMA_HOST=0.0.0.0:11434"
sudo systemctl daemon-reload
sudo systemctl restart ollama
</code></pre>
<p>Now the important part. <code>0.0.0.0</code> means every interface, including the public one. Ollama has no authentication. If your VPS has no firewall, you've just published a free, open model endpoint to the internet. Block it:</p>
<pre><code class="language-bash">sudo ufw allow OpenSSH
sudo ufw deny 11434/tcp
sudo ufw enable
</code></pre>
<p>Ollama runs on the host, so ufw does cover it. (The well-known "Docker bypasses ufw" problem applies to ports that containers publish, like Open WebUI's 3000, so don't rely on ufw for those either.) An even tighter option is to bind Ollama to the Docker bridge IP only, often <code>OLLAMA_HOST=172.17.0.1:11434</code> (check with <code>ip addr show docker0</code>), or to stick with the host-network option above.</p>
<h3>Option B: the bundled image</h3>
<p>If you just want one container, Open WebUI ships an image with Ollama inside. The CPU-only command from the quick start is:</p>
<pre><code class="language-bash">docker run -d -p 3000:8080 \
  -v ollama:/root/.ollama \
  -v open-webui:/app/backend/data \
  --name open-webui --restart always \
  ghcr.io/open-webui/open-webui:ollama
</code></pre>
<p>It is the quickest way to try things. The downside is that Ollama and Open WebUI update together, and model files live in the <code>ollama</code> volume, so don't delete it when you recreate the container.</p>
<h3>First login and pulling models</h3>
<p>Open <code>http://your-server:3000</code> (or <code>:8080</code> for host networking). The first account you create becomes the admin, so do this right away rather than leaving a fresh instance open on a public IP. You can pull models from Admin Settings, or from the shell with <code>ollama pull</code>. Both end up in the same place.</p>
<h3>Pitfalls we see a lot</h3>
<ol>
<li><strong>"Ollama connection failed" in the UI.</strong> Nine times out of ten it's the localhost problem above. Test from inside the container: <code>docker exec -it open-webui curl -s http://host.docker.internal:11434/api/tags</code>. If that fails, it's networking, not Open WebUI.</li>
<li><strong>The box freezes when you load a model.</strong> The model didn't fit. Linux starts swapping or the OOM killer takes out something random. Use a smaller model, or a lower quantization tag.</li>
<li><strong>Sessions log out after every restart.</strong> Set a fixed <code>WEBUI_SECRET_KEY</code> so the key doesn't change between container recreations (see <a href="https://docs.openwebui.com/reference/env-configuration/">https://docs.openwebui.com/reference/env-configuration/</a>).</li>
<li><strong>Upgrading with</strong> <code>:main</code><strong>.</strong> The updating docs (<a href="https://docs.openwebui.com/getting-started/updating/">https://docs.openwebui.com/getting-started/updating/</a>) suggest pinning a version tag like <code>:v0.x.y</code> in production and backing up the <code>open-webui</code> volume first. Database migrations run on start and don't always roll back cleanly.</li>
<li><strong>Mixing local and API models.</strong> Small CPU models are fine for drafts, summaries and private notes. For hard reasoning, add an OpenAI-compatible connection in the admin settings and keep both in one UI. That mix is what makes a small VPS genuinely useful.</li>
</ol>
<h3>Where this leaves you</h3>
<p>You now have a private chat UI talking to a local model, on a box that costs a few dollars a month, with Ollama not exposed to the world. From here the usual next steps are a reverse proxy with TLS, backups of the data volume, and a pinned image tag.</p>
<p>If you'd rather skip the server work, this is what we do at AIHostBox (<a href="https://aihostbox.com/apps/open-webui/">https://aihostbox.com/apps/open-webui/</a>). We set up Open WebUI on its own single-tenant CPU server for you, put it on your domain with TLS, back it up nightly and keep it patched, starting at $5.99/mo <a href="https://aihostbox.com/pricing/">(see pricing)</a> for 2 GB RAM and 1 vCPU. If you get stuck on something like the <a href="https://aihostbox.com/apps/ollama/">Ollama</a> networking above, you can just ask us; we've done this setup many times and we're happy to walk you through it. Want to run local models on the same box? Pick a bigger plan, since the RAM math above still applies.</p>
]]></content:encoded></item><item><title><![CDATA[Where to host Open WebUI in 2026: Railway vs Elestio vs a DIY VPS vs managed (AIHostBox)]]></title><description><![CDATA[Disclosure: I'm part of the team behind AIHostBox, one of the options compared here. I've tried to be fair, and I point out where the other options are the…]]></description><link>https://aihostbox.hashnode.dev/where-to-host-open-webui-in-2026-railway-vs-elestio-vs-a-diy-vps-vs-managed-aihostbox</link><guid isPermaLink="true">https://aihostbox.hashnode.dev/where-to-host-open-webui-in-2026-railway-vs-elestio-vs-a-diy-vps-vs-managed-aihostbox</guid><category><![CDATA[self-hosted]]></category><category><![CDATA[AI]]></category><category><![CDATA[Docker]]></category><dc:creator><![CDATA[AIHostBox]]></dc:creator><pubDate>Thu, 29 Oct 2026 09:13:57 GMT</pubDate><content:encoded><![CDATA[<p><em>Disclosure: I'm part of the team behind AIHostBox, one of the options compared here. I've tried to be fair, and I point out where the other options are the better choice.</em></p>
<p>Open WebUI has become the default "private ChatGPT" front end. The project has over 150k GitHub stars, and v0.12.4 shipped on October 25 (<a href="https://github.com/open-webui/open-webui/releases">releases</a>). It's one container that talks to any OpenAI-compatible API or to Ollama. That makes it easy to start, and later you have to decide where it lives.</p>
<p>This post compares four realistic options for a person or a small team that wants Open WebUI on the internet, logging in with their own accounts and using an API key from OpenAI, Anthropic, OpenRouter or similar. Running models on your own GPU at home is a different question, and for that a home server usually wins.</p>
<h3>What Open WebUI actually needs</h3>
<p>Open WebUI is lighter than people expect when you use a remote API, because the model isn't on your box. The container, its SQLite or Postgres database, and uploaded files fit in 1-2 GB of RAM for a handful of users. RAG with local embedding models, local speech-to-text, or bundled Ollama is what pushes it to 4-8 GB or more.</p>
<p>It stores everything under <code>/app/backend/data</code> unless you point <code>DATABASE_URL</code> at Postgres (<a href="https://docs.openwebui.com/getting-started/quick-start">docs</a>). Whatever host you pick, that directory (or that database) is the thing you have to back up.</p>
<p>One licensing note that matters for agencies: since 2025, Open WebUI's license doesn't let you remove or change its branding unless you have 50 or fewer end users in a rolling 30 days, written permission, or an enterprise license (<a href="https://docs.openwebui.com/license">license</a>). No host can give you a "white-label" Open WebUI past that limit.</p>
<h3>Option 1: Railway</h3>
<p>Railway bills by usage. The Hobby plan is $5/month and includes $5 of usage. Beyond that, memory is about $10 per GB-month, CPU about $20 per vCPU-month, volumes $0.15 per GB-month, and egress $0.05/GB, all billed per second (<a href="https://railway.com/pricing">pricing</a>, <a href="https://docs.railway.com/reference/pricing/plans">plan docs</a>). The free tier gives $1 of credit a month, caps services at 0.5 GB of RAM, and doesn't allow custom domains, so it's for trying things out only.</p>
<p>Several community templates exist. One example is "OpenWebUI [Updated Oct '26]", which runs <code>ghcr.io/open-webui/open-webui:main</code> (<a href="https://railway.com/deploy/open-webui">template</a>). There are also variants with Postgres and Redis (<a href="https://railway.com/deploy/openwebui">template</a>).</p>
<p><strong>Rough cost:</strong> if your instance idles around 0.7-1 GB of RAM with little CPU, memory alone is roughly $7-10 a month. With Hobby's $5 included, a light single-user setup lands near $5-10. These are estimates from unit prices. Railway shows actual usage in the dashboard, so watch it for a week.</p>
<p><strong>Where Railway is better:</strong> you get a nice deploy experience, GitHub-based deploys, and it's easy to add Postgres or Redis next to the app. If you already run other projects on Railway, putting Open WebUI there is reasonable.</p>
<p><strong>Watch out for:</strong></p>
<ul>
<li>Templates are community-maintained, and <code>:main</code> is a moving tag. Updates happen when you redeploy, and nobody checks the release notes for you.</li>
<li>Backups of the volume are your job. Check what your plan includes.</li>
<li>Usage billing is great when idle and less predictable when someone uploads a pile of PDFs.</li>
</ul>
<h3>Option 2: Elestio</h3>
<p>Elestio deploys open-source apps on a dedicated VM at a cloud provider you choose (Hetzner, DigitalOcean, Vultr, Linode, Scaleway, OVH and others) and manages updates and backups. General managed plans start at $11/month (<a href="https://elest.io/pricing">pricing</a>). Its Open WebUI listing starts at <strong>$30/month</strong>, because it sits in the AI category and comes set up with Ollama by default (<a href="https://elest.io/open-source/openwebui">Open WebUI on Elestio</a>).</p>
<p>Support level 1 is included: email support with a 3-day response target and 7 days of backup retention. Faster support costs $50 or $200 a month. There's a 3-day trial (card required), and billing is hourly through credits.</p>
<p><strong>Where Elestio is better:</strong></p>
<ul>
<li><strong>Provider and region choice.</strong> If you need a specific cloud or region, Elestio can do it.</li>
<li>A long catalog. If you want Open WebUI plus many unrelated apps under one dashboard, that's convenient.</li>
<li>Ollama comes with it, if you actually want a CPU Ollama next to the UI.</li>
</ul>
<p><strong>Watch out for:</strong> $30 is a lot if you only need the UI and a remote API key. Bring-your-own-VM is cheaper (from $5/month plus your VM), but then you're partly back to running the server yourself.</p>
<h3>Option 3: DIY on a VPS</h3>
<p>This is still the cheapest way to run Open WebUI, and the most educational. At Hetzner Cloud, a cost-optimized CX23 (2 vCPU, 4 GB RAM, 40 GB NVMe) lists at €5.99/month before VAT. Availability of that line varies by location, and it showed as unavailable when I checked. The CX33 (4 vCPU, 8 GB) is €8.99 (<a href="https://www.hetzner.com/cloud">Hetzner Cloud</a>). Add Docker, Caddy or Traefik for TLS, and the official container, and you're done in an evening.</p>
<p>Something in between: PikaPods runs Open WebUI as a small managed pod "from $6.8/month" (<a href="https://www.pikapods.com/apps">PikaPods</a>). It's a good deal if you don't need to tune much.</p>
<p><strong>Where DIY is better:</strong></p>
<ul>
<li>It's cheapest per GB of RAM, and you have full control.</li>
<li>You can run other things on the same box.</li>
<li>If you already have a homelab, a reverse proxy and backups set up, Open WebUI is just another container. Paying anyone to host it makes little sense.</li>
</ul>
<p><strong>What you're signing up for:</strong></p>
<ul>
<li>OS patching and Docker updates.</li>
<li>Reading Open WebUI release notes before you pull. The project moves fast and migrations sometimes need care.</li>
<li>TLS, a firewall, and making sure open signup is off (in recent versions the first account becomes admin).</li>
<li>An off-box backup that you've actually tried restoring.</li>
</ul>
<p>None of that is hard, but it never stops. The usual way DIY fails isn't the setup. It's the box nobody has touched in eight months.</p>
<h3>Option 4: Managed Open WebUI (AIHostBox)</h3>
<p>This is the option I work on, so read this section with that in mind.</p>
<p>AIHostBox runs Open WebUI on a <strong>single-tenant</strong> CPU server (not a shared container host). You bring your own API key, and there's no markup on tokens. Plans:</p>
<ul>
<li>Starter: 1 vCPU / 2 GB, $5.99/month</li>
<li>Plus: 2 vCPU / 4 GB, $9.99</li>
<li>Pro: 3 vCPU / 8 GB, $16.99</li>
</ul>
<p>It's month to month with no setup fee (<a href="https://aihostbox.com/apps/open-webui/">Open WebUI on AIHostBox</a>, <a href="https://aihostbox.com/pricing/">pricing</a>). It's the official container backed by Postgres, with public signup off by default and new users set to "pending" until you approve them. Backups run nightly to off-box storage. The stated patch targets are 24 hours for critical and 72 hours for high-severity issues (<a href="https://aihostbox.com/security/">security</a>). OAuth/OIDC and LDAP can be configured. Open WebUI's branding stays as it is (see the license note above).</p>
<p><strong>Where it fits:</strong> a small team or a consultant who wants a working, locked-down instance with backups, at roughly what a VPS costs, and doesn't want to own the patching.</p>
<p><strong>Where it doesn't:</strong></p>
<ul>
<li>If you want local models, AIHostBox is CPU only. Ollama on CPU works for small models but is slow, and a GPU box at home or a GPU cloud will beat it.</li>
<li>It's a small company (GGameHost LLC, Wyoming, US). If you need a specific EU region or a big provider's compliance paperwork, Elestio's provider choice or a hyperscaler fits better.</li>
<li>If you enjoy running servers, Option 3 is cheaper and you'll learn more.</li>
</ul>
<h3>Summary</h3>
<table>
<thead>
<tr>
<th></th>
<th>Railway</th>
<th>Elestio</th>
<th>DIY VPS</th>
<th>AIHostBox</th>
</tr>
</thead>
<tbody><tr>
<td>Typical monthly cost (light use)</td>
<td>~$5-10 usage-based (estimate)</td>
<td>from $30 (Open WebUI listing)</td>
<td>€6-9 + your time</td>
<td>$5.99-16.99 flat</td>
</tr>
<tr>
<td>Who patches</td>
<td>You (redeploy)</td>
<td>Elestio</td>
<td>You</td>
<td>AIHostBox</td>
</tr>
<tr>
<td>Backups</td>
<td>Your job</td>
<td>Included (7-day on L1)</td>
<td>Your job</td>
<td>Nightly, off-box</td>
</tr>
<tr>
<td>Region / provider choice</td>
<td>Railway regions</td>
<td>Wide</td>
<td>Wide</td>
<td>Limited</td>
</tr>
<tr>
<td>Best for</td>
<td>Devs already on Railway</td>
<td>Specific provider/region, many apps</td>
<td>Homelabbers, tinkerers</td>
<td>Small teams wanting it done</td>
</tr>
</tbody></table>
<p>If you're comfortable with Linux, a €6 VPS is hard to beat. If you'd rather never think about the server, either pay Elestio for flexibility or a smaller managed host for price. Whichever you pick, back up <code>/app/backend/data</code> or your Postgres database, and turn off open signup.</p>
]]></content:encoded></item><item><title><![CDATA[Open WebUI upgrades without losing data: pin tags, back up volumes, watch migrations]]></title><description><![CDATA[A boring, repeatable upgrade routine, written the week v0.12.4 shipped unlisted security fixes]]></description><link>https://aihostbox.hashnode.dev/open-webui-upgrades-without-losing-data-pin-tags-back-up-volumes-watch-migrations</link><guid isPermaLink="true">https://aihostbox.hashnode.dev/open-webui-upgrades-without-losing-data-pin-tags-back-up-volumes-watch-migrations</guid><category><![CDATA[Docker]]></category><category><![CDATA[self-hosted]]></category><category><![CDATA[open source]]></category><category><![CDATA[Devops]]></category><category><![CDATA[llm]]></category><dc:creator><![CDATA[AIHostBox]]></dc:creator><pubDate>Wed, 28 Oct 2026 18:15:46 GMT</pubDate><content:encoded><![CDATA[<p>Open WebUI ships often. Between 14 and 25 October 2026 there were four releases (v0.12.1 to v0.12.4), and most of them added real features. That pace is great until an upgrade runs a database migration on a volume you never backed up.</p>
<p>This post is the routine we use. Nothing clever, just the steps that make an upgrade reversible.</p>
<h2>Why this week matters: v0.12.4</h2>
<p>v0.12.4 came out on 25 October. Its release notes include this line:</p>
<blockquote>
<p>This release contains security fixes. We strongly recommend updating all deployments as soon as possible to have the latest security fixes in place. These fixes are not listed in this changelog; we will publish the security advisories for them immediately following CVE assignment.</p>
</blockquote>
<p>Holding back details until CVEs are assigned is the responsible way to disclose. The practical side effect is that you can't read the advisory and decide whether you're affected. You just update. So if you're on anything older than 0.12.4, this is the week to have a clean upgrade routine.</p>
<p>Release notes: <a href="https://github.com/open-webui/open-webui/releases">https://github.com/open-webui/open-webui/releases</a>
Advisories (once published): <a href="https://github.com/open-webui/open-webui/security">https://github.com/open-webui/open-webui/security</a></p>
<h2>Step 1: stop using <code>:main</code> in production</h2>
<p>A lot of compose files still look like this:</p>
<pre><code class="language-yaml">services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
</code></pre>
<p><code>:main</code> moves whenever the project pushes. Your container upgrades whenever it's recreated, not when you decide. Pin a version instead:</p>
<pre><code class="language-yaml">services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:v0.12.4
    volumes:
      - open-webui:/app/backend/data
    environment:
      - WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY}
    ports:
      - "3000:8080"
    restart: unless-stopped

volumes:
  open-webui:
</code></pre>
<p>Two things in there besides the tag:</p>
<ul>
<li><strong>The volume.</strong> Everything that matters lives in <code>/app/backend/data</code>: the SQLite database (<code>webui.db</code>) if you haven't moved to Postgres, uploaded files, and the default Chroma vector index. Lose that and you've lost users, chats and knowledge bases.</li>
<li><strong><code>WEBUI_SECRET_KEY</code> set explicitly.</strong> If it isn't fixed, a recreated container can sign sessions with a new key and everyone gets logged out. Not data loss, but it looks like it to your users.</li>
</ul>
<p>Now an upgrade is a one-line diff in git, and a rollback is the same diff reversed.</p>
<h2>Step 2: back up before every upgrade, not "nightly, probably"</h2>
<p>For the SQLite setup, stop the container so the database isn't mid-write, then tar the volume:</p>
<pre><code class="language-bash">docker compose stop open-webui

docker run --rm \
  -v open-webui:/data:ro \
  -v "$PWD/backups":/backup \
  alpine tar czf /backup/open-webui-$(date +%F-%H%M).tar.gz -C /data .

docker compose start open-webui
</code></pre>
<p>If you've moved users and chats to Postgres (<code>DATABASE_URL</code>), you need two things: a database dump and the volume, because uploads and the vector index still sit in <code>/app/backend/data</code>.</p>
<pre><code class="language-bash">docker compose exec -T postgres pg_dump -U openwebui -Fc openwebui \
  &gt; backups/openwebui-$(date +%F-%H%M).dump
</code></pre>
<p>Then tar the volume as above. A database without the files gives you chats with broken attachments. Files without the database give you nothing useful.</p>
<p>Copy both somewhere that isn't the same disk. A backup on the box you're upgrading protects you from a bad migration, not from a dead disk.</p>
<p><strong>Test the restore once.</strong> Spin up the old tag against a copy of the volume on another port and log in. Ten minutes, once, and you'll know the backup is real.</p>
<h2>Step 3: upgrade and watch the migrations</h2>
<p>Open WebUI applies its schema migrations automatically when the new version starts. That's convenient, and it's also the moment to pay attention.</p>
<pre><code class="language-bash"># edit the tag in compose, e.g. v0.12.3 -&gt; v0.12.4
docker compose pull open-webui
docker compose up -d open-webui
docker compose logs -f open-webui
</code></pre>
<p>What to look for in the logs:</p>
<ul>
<li>Migration lines running and finishing, then the server reporting it's listening on 8080.</li>
<li>No tracebacks during startup. A migration that fails halfway is the case where your backup matters.</li>
<li>On a big SQLite database, migrations can take a while. Don't restart the container because the page is slow to come up. Watch the log.</li>
</ul>
<p>Then do a quick smoke test: log in, open an old chat, send a message to each configured provider, and open one knowledge base.</p>
<h2>Step 4: know what a rollback actually is</h2>
<p>Migrations go forward. Starting an older image against a database that a newer version already migrated may fail, or worse, half work. So a real rollback is:</p>
<ol>
<li>Stop the container.</li>
<li>Restore the volume (and the Postgres dump) from the backup you took in step 2.</li>
<li>Put the old tag back in compose.</li>
<li>Start it.</li>
</ol>
<p>This is why the backup has to be taken right before the upgrade. A backup from last night loses today's chats.</p>
<h2>Step 5: skip versions carefully</h2>
<p>If you're several releases behind, read the release notes for every version in between, not just the latest. Breaking changes and required env var changes are usually called out there. Going straight to the newest tag is generally fine, but you want to know what you're jumping over.</p>
<h2>The short version</h2>
<ul>
<li>Pin <code>v0.12.4</code>, not <code>:main</code>.</li>
<li>Fix <code>WEBUI_SECRET_KEY</code>.</li>
<li>Stop, back up the volume (plus <code>pg_dump</code> if on Postgres), copy it off the box.</li>
<li>Pull, start, read the logs until it's listening.</li>
<li>Roll back by restoring data, not just by changing the tag.</li>
</ul>
<p>We do exactly this for the <a href="https://aihostbox.com/apps/open-webui/">managed Open WebUI instances</a> we run, with the backup going off-box before each pull. But none of it needs us: it's a compose file, a tar command and ten minutes of reading logs.</p>
]]></content:encoded></item></channel></rss>