<?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: Few Servers</title>
    <description>The latest articles on DEV Community by Few Servers (fewservers).</description>
    <link>https://dev.to/fewservers</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.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F15020%2F6664460c-3ce5-4865-85e3-e26f511c4400.png</url>
      <title>DEV Community: Few Servers</title>
      <link>https://dev.to/fewservers</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fewservers"/>
    <language>en</language>
    <item>
      <title>Why free, docker stats and ps disagree about memory on your VPS (measured on a 1 GB box)</title>
      <dc:creator>Mortise Apps</dc:creator>
      <pubDate>Sat, 10 Oct 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/fewservers/why-free-docker-stats-and-ps-disagree-about-memory-on-your-vps-measured-on-a-1-gb-box-1877</link>
      <guid>https://dev.to/fewservers/why-free-docker-stats-and-ps-disagree-about-memory-on-your-vps-measured-on-a-1-gb-box-1877</guid>
      <description>&lt;p&gt;You log in to a small server to see how much memory is left, and every tool gives a different answer. We ran the usual ones on our 1 GB test server within a minute of each other and wrote down what each said.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; They count different things. &lt;code&gt;free&lt;/code&gt; reports the whole machine, and its &lt;strong&gt;available&lt;/strong&gt; column (192 MB here) is the one that tells you how close you are to trouble. &lt;code&gt;docker stats&lt;/code&gt; added up to only 343 MB because it leaves out swap and the cache the kernel can drop: n8n showed 24.6 MiB while another 195 MB of it sat in swap. Adding up &lt;code&gt;ps&lt;/code&gt; RSS gave 904 MB, more than the 769 MB &lt;code&gt;free&lt;/code&gt; called used, because pages shared between processes are counted once per process. For "am I running out", read &lt;code&gt;free&lt;/code&gt;'s available and the swap line; for "who is using it", read each container's cgroup files, swap included.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measured 8 Oct 2026, 05:15 UTC&lt;/strong&gt;, over SSH on our test droplet &lt;code&gt;coolify-test&lt;/code&gt; (DigitalOcean FRA1, $6 Basic, 1 vCPU, 1 GB RAM, Ubuntu 24.04.5, kernel 6.8, Docker 29.8.2), up 6 days 15 hours. Twelve containers: Coolify 4.3.23 and its services, n8n 2.10.2 with Postgres, Uptime Kuma 2, a small Node app. Commands: &lt;code&gt;free -m&lt;/code&gt;, &lt;code&gt;/proc/meminfo&lt;/code&gt;, &lt;code&gt;docker stats --no-stream&lt;/code&gt;, each container's cgroup &lt;code&gt;memory.current&lt;/code&gt;, &lt;code&gt;memory.swap.current&lt;/code&gt; and &lt;code&gt;memory.stat&lt;/code&gt;, every process's &lt;code&gt;/proc/&amp;lt;pid&amp;gt;/smaps_rollup&lt;/code&gt;, and &lt;code&gt;vmstat 1 5&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The four answers, one minute apart
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it said&lt;/th&gt;
&lt;th&gt;What it counts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;free -m&lt;/code&gt;, used&lt;/td&gt;
&lt;td&gt;769 MB of 961 MB&lt;/td&gt;
&lt;td&gt;All RAM that is not free and not cache the kernel can reclaim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;free -m&lt;/code&gt;, available&lt;/td&gt;
&lt;td&gt;192 MB&lt;/td&gt;
&lt;td&gt;What new programs can still get without swapping, by the kernel's own estimate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;free -m&lt;/code&gt;, swap used&lt;/td&gt;
&lt;td&gt;972 MB of 2,047 MB&lt;/td&gt;
&lt;td&gt;Pages pushed out of RAM to the swap file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;docker stats&lt;/code&gt;, all 12 containers added up&lt;/td&gt;
&lt;td&gt;343 MiB&lt;/td&gt;
&lt;td&gt;Each container's RAM minus its inactive file cache; no swap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ps&lt;/code&gt; / &lt;code&gt;smaps_rollup&lt;/code&gt;, RSS of every process added up&lt;/td&gt;
&lt;td&gt;904 MB&lt;/td&gt;
&lt;td&gt;RAM pages each process can see, shared pages counted again for every process that maps them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;smaps_rollup&lt;/code&gt;, PSS of every process added up&lt;/td&gt;
&lt;td&gt;531 MB&lt;/td&gt;
&lt;td&gt;The same pages, with each shared page split between the processes sharing it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nothing here is wrong. Each line answers a different question, and the gaps between them are where people misread a server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why docker stats looks so small
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;docker stats&lt;/code&gt; takes the container's cgroup memory and subtracts the inactive file cache. For Coolify's main container the cgroup said 164 MB in use with 12 MB of inactive cache, and &lt;code&gt;docker stats&lt;/code&gt; showed 152 MiB: the same number with the cache taken off.&lt;/p&gt;

&lt;p&gt;What it never shows is swap. On a box that swaps, that is most of the picture (the cgroup files were read 17 seconds after &lt;code&gt;docker stats&lt;/code&gt;, so small differences between the first two columns are memory moving in between):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Container&lt;/th&gt;
&lt;th&gt;docker stats&lt;/th&gt;
&lt;th&gt;In RAM (cgroup)&lt;/th&gt;
&lt;th&gt;In swap (cgroup)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Coolify (app)&lt;/td&gt;
&lt;td&gt;152 MiB&lt;/td&gt;
&lt;td&gt;164 MB&lt;/td&gt;
&lt;td&gt;242 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;n8n&lt;/td&gt;
&lt;td&gt;24.6 MiB&lt;/td&gt;
&lt;td&gt;29 MB&lt;/td&gt;
&lt;td&gt;195 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uptime Kuma&lt;/td&gt;
&lt;td&gt;45.6 MiB&lt;/td&gt;
&lt;td&gt;47 MB&lt;/td&gt;
&lt;td&gt;110 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BuildKit (left over from a build)&lt;/td&gt;
&lt;td&gt;36.9 MiB&lt;/td&gt;
&lt;td&gt;19 MB&lt;/td&gt;
&lt;td&gt;62 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coolify realtime&lt;/td&gt;
&lt;td&gt;17.1 MiB&lt;/td&gt;
&lt;td&gt;18 MB&lt;/td&gt;
&lt;td&gt;51 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coolify Postgres&lt;/td&gt;
&lt;td&gt;19.0 MiB&lt;/td&gt;
&lt;td&gt;26 MB&lt;/td&gt;
&lt;td&gt;30 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sample Node app&lt;/td&gt;
&lt;td&gt;5.5 MiB&lt;/td&gt;
&lt;td&gt;10 MB&lt;/td&gt;
&lt;td&gt;29 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;n8n Postgres&lt;/td&gt;
&lt;td&gt;13.2 MiB&lt;/td&gt;
&lt;td&gt;17 MB&lt;/td&gt;
&lt;td&gt;26 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Judged by &lt;code&gt;docker stats&lt;/code&gt;, n8n is a 25 MB app. Counting its swap, it is about 220 MB, nine times more. If you size a server from &lt;code&gt;docker stats&lt;/code&gt; on a machine that is already swapping, you will undersize it.&lt;/p&gt;

&lt;p&gt;To read both numbers for one container on Ubuntu 24.04 (cgroup v2), use the full container id:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;docker inspect &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s1"&gt;'{{.Id}}'&lt;/span&gt; n8n-container-name&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /sys/fs/cgroup/system.slice/docker-&lt;span class="nv"&gt;$id&lt;/span&gt;.scope/memory.current       &lt;span class="c"&gt;# bytes in RAM&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /sys/fs/cgroup/system.slice/docker-&lt;span class="nv"&gt;$id&lt;/span&gt;.scope/memory.swap.current  &lt;span class="c"&gt;# bytes in swap&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why adding up ps gives too much
&lt;/h2&gt;

&lt;p&gt;RSS is every page a process has in RAM, including pages it shares with others: libraries, and memory a parent process shares with its workers. Coolify runs PHP-FPM workers, and each one reported about 25-28 MB of RSS, but only 4.6-6.3 MB of PSS, its fair share once the shared pages are split. Add up the RSS of several such workers and you count the same shared memory once for each of them.&lt;/p&gt;

&lt;p&gt;Across the whole machine, RSS added up to 904 MB and PSS to 531 MB. PSS is the better number for "how much does this group of processes cost"; RSS is the right number only for a single process on its own.&lt;/p&gt;

&lt;p&gt;Per-process swap has the same trap. The &lt;code&gt;Swap:&lt;/code&gt; lines in &lt;code&gt;smaps_rollup&lt;/code&gt; added up to 1,583 MB, while the machine only had 972 MB in swap. Shared pages that were swapped out show up in every process that maps them. The biggest single entries were still useful for ranking: n8n's Node.js process (it appears as &lt;code&gt;MainThread&lt;/code&gt;) with 187 MB, then &lt;code&gt;uptime-kuma&lt;/code&gt; with 100 MB. Use per-process numbers to find the biggest users, not to add up a total.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why free's used is not the number to watch
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;free&lt;/code&gt; called 769 MB used and 69 MB free, which looks alarming on a 961 MB machine. Linux keeps file cache in RAM until something needs the space, so free memory on a busy server is always low. The kernel's own estimate of what is still usable, MemAvailable, was 192 MB, and that is what &lt;code&gt;free&lt;/code&gt; prints as &lt;strong&gt;available&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The swap line matters more on a small box: 972 MB of pages did not fit in RAM. &lt;code&gt;vmstat 1 5&lt;/code&gt; showed the kernel reading up to 180 KB per second back from swap in the one-second samples (0, 152, 128 and 180 KB/s; the first line, 464 KB/s, is the average since boot). Swap that sits still is harmless; swap that is read back all the time means the working set does not fit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which number to use for what
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Am I about to run out?&lt;/strong&gt; &lt;code&gt;free -m&lt;/code&gt;: the &lt;strong&gt;available&lt;/strong&gt; column, then the swap line. Low available plus a busy &lt;code&gt;si&lt;/code&gt; column in &lt;code&gt;vmstat 5&lt;/code&gt; means it is time for more RAM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which container is the problem?&lt;/strong&gt; The cgroup files above, RAM plus swap. &lt;code&gt;docker stats&lt;/code&gt; alone hides swap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which process is the problem?&lt;/strong&gt; Per-process RSS or swap, to rank them. Do not add them up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What does a group of processes really cost?&lt;/strong&gt; PSS, from &lt;code&gt;/proc/&amp;lt;pid&amp;gt;/smaps_rollup&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The commands for the swap ranking are on our one-page checklist: &lt;a href="https://www.fewservers.com/g/memory/" rel="noopener noreferrer"&gt;find what is using memory and swap&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this box should be
&lt;/h2&gt;

&lt;p&gt;This is the same server we watched for &lt;a href="https://www.fewservers.com/posts/n8n-uptime-kuma-1gb-vps-5-days/" rel="noopener noreferrer"&gt;5 days with Coolify, n8n and Uptime Kuma&lt;/a&gt;. Six days in, it still runs, with about 1.7 GB of demand on 1 GB of RAM. The numbers above are why we would not judge it from &lt;code&gt;docker stats&lt;/code&gt;: that view says 343 MiB and suggests plenty of room, while the machine is a gigabyte into swap.&lt;/p&gt;

&lt;p&gt;If you are choosing a size for a similar stack, prices read on 7 Oct 2026: a &lt;a href="https://www.fewservers.com/go/digitalocean/" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt; Basic droplet with 2 GB is $12 a month and 4 GB is $24; &lt;a href="https://www.fewservers.com/go/databasemart/" rel="noopener noreferrer"&gt;Database Mart&lt;/a&gt;'s Express Linux VPS has 4 GB for $5.99 with a shared IP address and US data centres only (details in &lt;a href="https://www.fewservers.com/posts/database-mart-vps-pricing-explained/" rel="noopener noreferrer"&gt;Database Mart VPS pricing explained&lt;/a&gt;). We measured only the 1 GB droplet in this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why does docker stats show less memory than free?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;docker stats&lt;/code&gt; leaves out swap and subtracts the cache the kernel can drop, and it only covers containers, not Docker itself, the system services or the kernel. On our server the 12 containers added up to 343 MiB in &lt;code&gt;docker stats&lt;/code&gt; while &lt;code&gt;free&lt;/code&gt; said 769 MB used and 972 MB in swap.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does docker stats include swap?
&lt;/h3&gt;

&lt;p&gt;No. On our server n8n showed 24.6 MiB in &lt;code&gt;docker stats&lt;/code&gt; and had 195 MB in swap at the same moment, according to its cgroup's &lt;code&gt;memory.swap.current&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between RSS and PSS?
&lt;/h3&gt;

&lt;p&gt;RSS counts every page a process has in RAM, including pages shared with other processes. PSS splits each shared page between the processes that share it. Our PHP-FPM workers had about 25 MB of RSS each but 5 MB of PSS. Adding up RSS over-counts; adding up PSS does not.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which free column should I watch?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;available&lt;/strong&gt;. It is the kernel's estimate of memory that new programs can use without swapping. &lt;strong&gt;free&lt;/strong&gt; is always low on a busy server because Linux fills spare RAM with cache.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why do the per-process swap numbers add up to more than the swap in use?
&lt;/h3&gt;

&lt;p&gt;Swapped-out shared pages are reported by every process that maps them. Ours added up to 1,583 MB with only 972 MB of swap in use. Use the per-process numbers to rank, and &lt;code&gt;free&lt;/code&gt; for the total.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://www.fewservers.com/posts/free-vs-docker-stats-vs-ps-memory/" rel="noopener noreferrer"&gt;Few Servers&lt;/a&gt;. Some links there are affiliate links; we only cover what we measured.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>linux</category>
      <category>selfhosted</category>
      <category>devops</category>
    </item>
    <item>
      <title>The best MCP servers for Claude Code that need no API key: the 5 we ran</title>
      <dc:creator>Mortise Apps</dc:creator>
      <pubDate>Fri, 09 Oct 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/fewservers/the-best-mcp-servers-for-claude-code-that-need-no-api-key-the-5-we-ran-2ip7</link>
      <guid>https://dev.to/fewservers/the-best-mcp-servers-for-claude-code-that-need-no-api-key-the-5-we-ran-2ip7</guid>
      <description>&lt;p&gt;Most "best MCP servers" lists are a page of logos. This one has five servers, and we ran every one on 6 October 2026. None of them needs an account, a card or an API key. For each server we counted its tools, timed it and noted what to watch for.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; These five work in Claude Code with nothing but a terminal command: &lt;strong&gt;Context7&lt;/strong&gt; (current library docs, 2 tools), &lt;strong&gt;Playwright MCP&lt;/strong&gt; (drives a real browser, 25 tools), &lt;strong&gt;Microsoft Learn&lt;/strong&gt; (Microsoft and Azure docs, 3 tools, remote, nothing to install), &lt;strong&gt;Fetch&lt;/strong&gt; (reads any web page as markdown, 1 tool) and &lt;strong&gt;Git&lt;/strong&gt; (reads and writes a local repository, 12 tools). All five showed "Connected" in &lt;code&gt;claude mcp list&lt;/code&gt;, and every test call worked. Playwright MCP is the heavy one: about 780 MB of memory with one page open, and 55% of the tool definitions in this list. Fetch can read internal URLs and Git can commit and reset, so add those two deliberately.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The 3-minute video version: &lt;a href="https://youtu.be/DpVl38mr15Y" rel="noopener noreferrer"&gt;5 MCP servers for Claude Code with no API key (YouTube)&lt;/a&gt;. In 30 seconds each: &lt;a href="https://youtube.com/shorts/f3ZNvcjNhSA" rel="noopener noreferrer"&gt;the five, with their tool counts&lt;/a&gt; and &lt;a href="https://youtube.com/shorts/4PN0DVz3VQM" rel="noopener noreferrer"&gt;what to know about the Fetch server&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tested 6 Oct 2026, 04:38 to 04:45 UTC:&lt;/strong&gt; a MacBook (Apple silicon) with Node.js 20.19.4, Python 3.12 and uv 0.12.23; Claude Code 2.1.284. Each local server was started with the same command Claude Code uses. We then recorded its handshake, its &lt;code&gt;tools/list&lt;/code&gt; reply and one or two real calls with a small MCP client of our own, measuring memory with &lt;code&gt;ps&lt;/code&gt;. Then we added all five to Claude Code in a scratch project with the commands below and ran &lt;code&gt;claude mcp list&lt;/code&gt;. No API keys or accounts were used anywhere.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The five, side by side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;What it gives Claude Code&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;th&gt;Key or account&lt;/th&gt;
&lt;th&gt;Started in (first run / again)&lt;/th&gt;
&lt;th&gt;Memory&lt;/th&gt;
&lt;th&gt;Version we ran&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.fewservers.com/posts/context7-mcp-explained-tested/" rel="noopener noreferrer"&gt;Context7&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Current documentation for libraries and frameworks&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;None (optional key for higher rate limits)&lt;/td&gt;
&lt;td&gt;6.8 s / 1.7 s&lt;/td&gt;
&lt;td&gt;195 to 341 MB&lt;/td&gt;
&lt;td&gt;4.1.1 (npm, MIT)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.fewservers.com/posts/playwright-mcp-explained-tested/" rel="noopener noreferrer"&gt;Playwright MCP&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A real browser it can open, read and click&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;3.8 s / 1.5 s&lt;/td&gt;
&lt;td&gt;332 MB, 778 MB with a page open&lt;/td&gt;
&lt;td&gt;0.0.83 (npm, Apache-2.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Learn&lt;/td&gt;
&lt;td&gt;Search and fetch over Microsoft and Azure docs&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;0.5 s (remote)&lt;/td&gt;
&lt;td&gt;none on your machine&lt;/td&gt;
&lt;td&gt;server 1.0.0 (hosted by Microsoft)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fetch&lt;/td&gt;
&lt;td&gt;Any URL as markdown&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;10.8 s / 0.7 s&lt;/td&gt;
&lt;td&gt;61 to 158 MB&lt;/td&gt;
&lt;td&gt;2026.8.18 (PyPI, MIT)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git&lt;/td&gt;
&lt;td&gt;Log, diff, status, and also commit, branch and reset&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;4.3 s / 0.7 s&lt;/td&gt;
&lt;td&gt;95 to 133 MB&lt;/td&gt;
&lt;td&gt;2026.8.18 (PyPI, MIT)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;"First run" includes &lt;code&gt;npx&lt;/code&gt; or &lt;code&gt;uvx&lt;/code&gt; downloading the package; "again" is the second start with the package cached. Memory is the server and its child processes, read with &lt;code&gt;ps&lt;/code&gt; after the tool list (and, for Playwright, after opening a page).&lt;/p&gt;

&lt;h2&gt;
  
  
  The commands
&lt;/h2&gt;

&lt;p&gt;Each line is the one we ran, in the form the project's own README gives for Claude Code (or, where it gives none, the standard &lt;code&gt;claude mcp add&lt;/code&gt; form). They add the server to the current project only; add &lt;code&gt;--scope user&lt;/code&gt; to make one available in every project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add context7 &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; @upstash/context7-mcp
claude mcp add playwright npx @playwright/mcp@latest
claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http microsoft-learn https://learn.microsoft.com/api/mcp
claude mcp add fetch &lt;span class="nt"&gt;--&lt;/span&gt; uvx mcp-server-fetch
claude mcp add git &lt;span class="nt"&gt;--&lt;/span&gt; uvx mcp-server-git &lt;span class="nt"&gt;--repository&lt;/span&gt; /path/to/your/repo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fetch and Git are Python packages run with &lt;code&gt;uvx&lt;/code&gt;, so you need &lt;a href="https://docs.astral.sh/uv/" rel="noopener noreferrer"&gt;uv&lt;/a&gt; installed. Context7 and Playwright need Node.js. Microsoft Learn needs nothing local: Claude Code talks to Microsoft's server over HTTPS.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Context7: library docs that are not two versions old
&lt;/h2&gt;

&lt;p&gt;What it does: two tools. One finds the library you mean, the other returns documentation snippets for your question. We asked it to resolve "fastapi" for the question "How do I add a background task in FastAPI?". In 2.5 seconds it returned five candidate sources with their snippet counts, the top one FastAPI's own site with 3,457 snippets.&lt;/p&gt;

&lt;p&gt;Without a key it worked for everything we tried. Its README says a key gives "higher rate limits and private repositories", and its API guide describes the no-key tier as "Low rate limits and no custom configuration" without giving a number (&lt;a href="https://context7.com/docs/api-guide" rel="noopener noreferrer"&gt;Context7 API guide&lt;/a&gt;, read 6 Oct 2026). We did not hit a limit in a handful of calls. Our &lt;a href="https://www.fewservers.com/posts/context7-mcp-explained-tested/" rel="noopener noreferrer"&gt;full Context7 test&lt;/a&gt; graded three of its answers against ones we had checked by hand: two right, one incomplete.&lt;/p&gt;

&lt;p&gt;Cost of keeping it connected: 4,937 bytes of tool definitions, about a quarter of Playwright MCP's.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Playwright MCP: a browser your agent can use
&lt;/h2&gt;

&lt;p&gt;What it does: 25 tools that open pages, read them, click, type, fill forms, take screenshots and read the console and network. We opened fewservers.com/g/ and asked for a snapshot: the page loaded in 8.9 seconds (that includes starting headless Chromium) and the snapshot was 6,916 characters.&lt;/p&gt;

&lt;p&gt;What to watch: it is the heavy one. With one page open, the server and its browser processes took 778 MB. Its 25 tool definitions are 21,332 bytes, more than the other four servers together. Our &lt;a href="https://www.fewservers.com/posts/playwright-mcp-explained-tested/" rel="noopener noreferrer"&gt;Playwright MCP test&lt;/a&gt; has the details, including the 32,732-character snapshot of a longer page and the find tool that keeps snapshots small.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Microsoft Learn: the remote one
&lt;/h2&gt;

&lt;p&gt;What it does: three tools, &lt;code&gt;microsoft_docs_search&lt;/code&gt;, &lt;code&gt;microsoft_code_sample_search&lt;/code&gt; and &lt;code&gt;microsoft_docs_fetch&lt;/code&gt;, over Microsoft's documentation. It runs on Microsoft's servers, so nothing is installed and nothing uses your memory. The handshake took 0.5 seconds.&lt;/p&gt;

&lt;p&gt;We searched "Azure Functions Python timeout limit consumption plan". The answer came back in 1.2 seconds, 21,770 characters long. The first result was a Microsoft Q&amp;amp;A thread rather than a documentation page, so check which source an answer came from before relying on it. Use this one if you write code against Azure, .NET or Microsoft 365; skip it otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Fetch: any page as markdown
&lt;/h2&gt;

&lt;p&gt;What it does: one tool, &lt;code&gt;fetch&lt;/code&gt;, which downloads a URL and turns the HTML into markdown, in chunks if the page is long. Our article page came back in 3.4 seconds as clean markdown: breadcrumbs, intro, byline. A page that is mostly a form (our /g/ page) came back as two lines, because the extractor keeps the main text and drops forms.&lt;/p&gt;

&lt;p&gt;What to watch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It quietly needs Node.js too.&lt;/strong&gt; When Node is installed, Fetch uses a JavaScript HTML simplifier and runs &lt;code&gt;npm install&lt;/code&gt; on the first fetch. On our machine that first fetch failed with an npm cache permission error ("returned non-zero exit status 1"). With a clean npm cache it took 6.0 seconds the first time and 1.9 seconds after that. If your first fetch fails, look at npm, not at the server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It can reach your internal network.&lt;/strong&gt; Its README warns that it "can access local/internal IP addresses". Do not add Fetch on a machine that can see admin panels or cloud metadata endpoints you don't want an agent reading.&lt;/li&gt;
&lt;li&gt;It obeys a site's robots.txt by default for requests the model makes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Git: your repository, including the write commands
&lt;/h2&gt;

&lt;p&gt;What it does: 12 tools. Seven only read: status, three kinds of diff, log, show and branch. Five change things: add, commit, create branch, checkout, and reset, which the server itself marks as destructive. On a three-commit test repository, &lt;code&gt;git_log&lt;/code&gt;, &lt;code&gt;git_status&lt;/code&gt; and &lt;code&gt;git_diff_unstaged&lt;/code&gt; each answered in 0.02 to 0.04 seconds.&lt;/p&gt;

&lt;p&gt;What to watch: Claude Code can already run &lt;code&gt;git&lt;/code&gt; in its shell, with your permission prompts. The difference is that this server's tools are separate MCP tools, and an "allow" you give them applies to commit and reset too if you allow the whole server. Pin it to one repository with &lt;code&gt;--repository&lt;/code&gt;, and allow the read tools only. Add it when you want git history in an agent that has no shell. In Claude Code itself it adds little. Its README also says it "is currently in early development" and that its tools may change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which ones to add
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Context7&lt;/strong&gt; if you write code against any library that changes often. It is light and needs no key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft Learn&lt;/strong&gt; if you work with Microsoft or Azure. It costs you nothing locally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Playwright MCP&lt;/strong&gt; when the agent has to check a real page: a deploy, a form, a bug report with steps. Remove it when you don't need it: it is the largest tool list and the biggest memory user here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fetch&lt;/strong&gt; only if you need the agent to read pages as markdown in a client without web tools, and never on a machine with sensitive internal addresses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git&lt;/strong&gt; mainly for clients without a shell; in Claude Code, prefer plain &lt;code&gt;git&lt;/code&gt; with permission prompts.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each server's tool definitions are loaded into Claude Code's context, and together these five come to about 39 KB. If you only need two of them, add two.&lt;/p&gt;

&lt;p&gt;All five are listed, with thousands of others, in our &lt;a href="https://www.fewservers.com/mcp/" rel="noopener noreferrer"&gt;MCP server directory&lt;/a&gt;, built from the official MCP Registry and refreshed daily.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Which MCP servers work in Claude Code without an API key?
&lt;/h3&gt;

&lt;p&gt;Context7, Playwright MCP, Microsoft Learn, Fetch and Git all worked with no key and no account when we ran them on 6 Oct 2026. Context7 accepts an optional key for higher rate limits.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I add an MCP server to Claude Code?
&lt;/h3&gt;

&lt;p&gt;Run &lt;code&gt;claude mcp add &amp;lt;name&amp;gt; -- &amp;lt;command&amp;gt;&lt;/code&gt; for a local server, or &lt;code&gt;claude mcp add --transport http &amp;lt;name&amp;gt; &amp;lt;url&amp;gt;&lt;/code&gt; for a remote one, then check it with &lt;code&gt;claude mcp list&lt;/code&gt;. Add &lt;code&gt;--scope user&lt;/code&gt; to use it in every project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which MCP server uses the most memory?
&lt;/h3&gt;

&lt;p&gt;Playwright MCP, because it runs a real browser: 778 MB with one page open in our test. The others used 61 to 341 MB, and Microsoft Learn none, because it runs on Microsoft's servers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is the Fetch MCP server safe to use?
&lt;/h3&gt;

&lt;p&gt;Its own README warns that it can reach local and internal IP addresses. Use it on a machine where that is acceptable, and keep Claude Code's permission prompts on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do these servers slow Claude Code down?
&lt;/h3&gt;

&lt;p&gt;Each one adds its tool definitions to the context: from 1,161 bytes for Fetch to 21,332 bytes for Playwright MCP. Local servers also start with Claude Code, from under a second to about 11 seconds on a first run while the package downloads.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>claude</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Deploy Coolify on a $6 VPS in 15 minutes, timed step by step</title>
      <dc:creator>Mortise Apps</dc:creator>
      <pubDate>Sun, 04 Oct 2026 05:00:00 +0000</pubDate>
      <link>https://dev.to/fewservers/deploy-coolify-on-a-6-vps-in-15-minutes-timed-step-by-step-33m5</link>
      <guid>https://dev.to/fewservers/deploy-coolify-on-a-6-vps-in-15-minutes-timed-step-by-step-33m5</guid>
      <description>&lt;p&gt;Coolify is the self-hosted alternative to Heroku, Vercel and Netlify: one server, a web UI, push-to-deploy for anything that runs in Docker. The project's own docs say you need 2 CPUs and 2 GB of RAM. We wanted to know whether the &lt;strong&gt;$6 DigitalOcean droplet&lt;/strong&gt; (1 vCPU, 1 GB RAM, 25 GB SSD) is enough for a small team's side projects, so we installed it, timed every step and left it running.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; Yes, Coolify runs on DigitalOcean's $6 droplet (1 vCPU, 1 GB RAM) if you add a 2 GB swap file first. Measured on 1 Oct 2026: install script 172 s, first app deployed and answering in 210 s, build peak 720 MB RAM + 669 MB swap, idle footprint about 250 MB for Coolify itself. For more than two small apps, take the $12 plan.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Short version: it works, with one trick (a 2 GB swap file). The install script took &lt;strong&gt;172 seconds&lt;/strong&gt;, the first app was answering HTTP requests &lt;strong&gt;210 seconds&lt;/strong&gt; after clicking Deploy, and the measured steps from an empty account to a running app add up to just under 10 minutes (our wall clock said 23, because of a wrong base directory described below and a coffee). Memory after boot sat at &lt;strong&gt;618 MB used&lt;/strong&gt; with four containers healthy; the build peaked at 720 MB plus 669 MB of swap, which is why the swap file is not optional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch it instead
&lt;/h2&gt;

&lt;p&gt;The same steps as a 5-minute video, with the numbers on screen: &lt;a href="https://youtu.be/zyjQs_WvBkc" rel="noopener noreferrer"&gt;Deploy Coolify on a $6 VPS in 15 minutes (YouTube)&lt;/a&gt;. Two 30-second versions: &lt;a href="https://youtube.com/shorts/bnzzMjjuBqo" rel="noopener noreferrer"&gt;the one number that decides 1 GB&lt;/a&gt; and &lt;a href="https://youtube.com/shorts/lihj0TNT9ds" rel="noopener noreferrer"&gt;the deploy that said Success while restarting&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;a href="https://www.digitalocean.com/" rel="noopener noreferrer"&gt;DigitalOcean account&lt;/a&gt;. New accounts need a payment method before the first droplet; the droplet is billed hourly ($0.009/h), so a one-hour test costs a cent.&lt;/li&gt;
&lt;li&gt;An SSH key on your machine. If you do not have one: &lt;code&gt;ssh-keygen -t ed25519 -f ~/.ssh/coolify&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;About 15 minutes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: create the droplet (1 minute)
&lt;/h2&gt;

&lt;p&gt;In the DigitalOcean console choose &lt;strong&gt;Create → Droplets&lt;/strong&gt;. Pick the region closest to you, then &lt;strong&gt;Ubuntu 24.04 (LTS)&lt;/strong&gt; as the image.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz06q8sjefsogsovkx2wd.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz06q8sjefsogsovkx2wd.jpg" alt="DigitalOcean create droplet: region and Ubuntu 24.04 image selected" width="799" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Under &lt;strong&gt;Choose a Droplet Plan&lt;/strong&gt; stay on &lt;em&gt;Basic → Regular&lt;/em&gt; and pick the &lt;strong&gt;$6.00/mo&lt;/strong&gt; plan: 1 vCPU, 1 GB RAM, 25 GB SSD, 1000 GB transfer. Skip the $4 plan: 512 MB is not enough for Coolify's four containers even with swap.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbhgvwfq8mgps0aygec18.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbhgvwfq8mgps0aygec18.jpg" alt="The $6 Basic plan: 1 vCPU, 1 GB RAM, 25 GB SSD" width="799" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Under &lt;strong&gt;Authentication&lt;/strong&gt; choose &lt;em&gt;SSH Keys&lt;/em&gt; and add your public key. Do not use a root password; Coolify itself will later use SSH keys to talk to the server, and password logins are the first thing bots try.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fszwwigqaybn94li0arqh.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fszwwigqaybn94li0arqh.jpg" alt="SSH key selected for authentication" width="799" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tick &lt;strong&gt;Improved Metrics and monitoring&lt;/strong&gt; (free), give the droplet a name, and click &lt;strong&gt;Create Droplet&lt;/strong&gt;. Ours showed a public IP after about 60 seconds.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fek0sjzvnci5dgrixj4ur.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fek0sjzvnci5dgrixj4ur.jpg" alt="Droplet active with public IPv4 and the $6/month cost shown" width="799" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: add swap (30 seconds)
&lt;/h2&gt;

&lt;p&gt;This is the part that makes the 1 GB plan work. Log in and create a 2 GB swap file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh root@YOUR_DROPLET_IP
fallocate &lt;span class="nt"&gt;-l&lt;/span&gt; 2G /swapfile
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 /swapfile
mkswap /swapfile
swapon /swapfile
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'/swapfile none swap sw 0 0'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/fstab
free &lt;span class="nt"&gt;-m&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without swap the install still completes, but the first &lt;code&gt;docker build&lt;/code&gt; of a real app pushes demand past 1 GB and the kernel kills a container. With swap the build gets slow instead of dying; we measured the peak below (669 MB of swap in use during the build).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: run the Coolify installer (172 seconds)
&lt;/h2&gt;

&lt;p&gt;One command, from the official docs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://cdn.coollabs.io/coolify/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We timed it with &lt;code&gt;date&lt;/code&gt; before and after. On the $6 droplet in Frankfurt:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1-2&lt;/td&gt;
&lt;td&gt;OS check, apt packages (curl, wget, git, jq, openssl), SSH config&lt;/td&gt;
&lt;td&gt;6 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3-4&lt;/td&gt;
&lt;td&gt;Installs Docker 29 and configures the network pool&lt;/td&gt;
&lt;td&gt;57 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5-8&lt;/td&gt;
&lt;td&gt;Downloads compose files, writes &lt;code&gt;.env&lt;/code&gt;, creates the localhost SSH key&lt;/td&gt;
&lt;td&gt;under 1 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Pulls and starts Coolify, Postgres, Redis, the realtime server and the Traefik proxy&lt;/td&gt;
&lt;td&gt;109 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;172 s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When it finishes it prints &lt;code&gt;Your instance is ready to use!&lt;/code&gt; and the URL &lt;code&gt;http://YOUR_DROPLET_IP:8000&lt;/code&gt;. Four containers are running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;coolify           Up (healthy)
coolify-db        Up (healthy)
coolify-redis     Up (healthy)
coolify-realtime  Up (healthy)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Memory right after the install: 618 MB used of 961 MB, swap 32 MB. Disk: 7.1 GB used of 24 GB (Docker images are the bulk of it).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: create the root account and finish onboarding
&lt;/h2&gt;

&lt;p&gt;Open &lt;code&gt;http://YOUR_DROPLET_IP:8000&lt;/code&gt; in a browser. The first screen creates the root user; do this straight away, because until you do, anyone who finds the port can.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv3aqczdvmc0zymrygrdv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv3aqczdvmc0zymrygrdv.jpg" alt="Coolify first-run screen: create the root account" width="799" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the account, a three-step onboarding wizard asks where to deploy. Pick &lt;strong&gt;This machine&lt;/strong&gt; (the droplet itself); Coolify connects to it over its own localhost SSH key, checks that Docker is running and creates "My first project" with a production environment. The wizard offers to provision new servers on Hetzner, Vultr or DigitalOcean from inside Coolify, which is how you add a second box later.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9yulpdjgo3wmn254t6ao.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9yulpdjgo3wmn254t6ao.jpg" alt="Coolify onboarding: choose This machine as the first server" width="799" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The whole wizard is four clicks and took us under a minute; it ends on a "Setup complete" screen with the server, the project and the Docker engine all green, and a &lt;strong&gt;Deploy Your First Resource&lt;/strong&gt; button.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: deploy your first app
&lt;/h2&gt;

&lt;p&gt;The resource picker lists a few hundred one-click services (Sonarr, Plausible, n8n, Uptime Kuma and so on) plus the generic sources: public Git repository, private repository, GitHub app, Dockerfile, Docker Compose, Docker image. We chose &lt;strong&gt;Public Git Repository&lt;/strong&gt; and pointed it at Coolify's own examples repo, &lt;code&gt;https://github.com/coollabsio/coolify-examples&lt;/code&gt;, with the base directory &lt;code&gt;/javascript/runtimes/nodejs&lt;/code&gt; (a tiny Fastify server on port 3000). Coolify inspects the repo, proposes &lt;strong&gt;Railpack&lt;/strong&gt; as the build pack and shows the branch, port and base directory for review.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2pvw8e4f56ez8qs7cdxd.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2pvw8e4f56ez8qs7cdxd.jpg" alt="Public repository build configuration: Railpack, port 3000, base directory" width="799" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Continue&lt;/strong&gt;, then &lt;strong&gt;Actions → Deploy&lt;/strong&gt;. The deployment log streams live:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fddsdttvpvrr53x6kuu7m.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fddsdttvpvrr53x6kuu7m.jpg" alt="Deployment log: BuildKit detected, helper image pulled, Railpack build plan generated" width="799" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We timed it from the Deploy click to the first HTTP 200 from the public URL: &lt;strong&gt;210 seconds&lt;/strong&gt;. That breaks down into about 100 s of pulling the Railpack builder and Node base images (first deploy only; later deploys reuse them), 60 s of &lt;code&gt;npm install&lt;/code&gt; on a 1 vCPU, and 20 s to start the container and for Traefik to pick up the route. The second deploy of the same app took 1 min 52 s.&lt;/p&gt;

&lt;p&gt;Coolify gives every app a working URL immediately, on the free &lt;a href="https://www.fewservers.com/posts/sslip-io-vs-nip-io/" rel="noopener noreferrer"&gt;&lt;code&gt;sslip.io&lt;/code&gt; wildcard DNS&lt;/a&gt;: &lt;code&gt;http://&amp;lt;app-id&amp;gt;.64.226.72.55.sslip.io&lt;/code&gt;. Ours answered &lt;code&gt;{"hello":"from nodejs #2"}&lt;/code&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2miaqyl6qy8bklagsdoe.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2miaqyl6qy8bklagsdoe.jpg" alt="Deployment history: two successful deployments" width="799" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One honest mistake worth recording: on our first attempt we typed the base directory as &lt;code&gt;/nodejs&lt;/code&gt; (the folder had moved in the repo). Railpack happily built an image from an empty directory, the deployment reported &lt;strong&gt;Success&lt;/strong&gt;, and the container then restarted every few seconds because it had nothing to run. Check the runtime logs after your first deploy, not just the green badge.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the build did to a 1 GB server
&lt;/h3&gt;

&lt;p&gt;This is where the swap file earns its keep. Our sampler logged memory every five seconds during the build:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Moment&lt;/th&gt;
&lt;th&gt;RAM used&lt;/th&gt;
&lt;th&gt;Swap used&lt;/th&gt;
&lt;th&gt;Load (1 vCPU)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Idle, Coolify only&lt;/td&gt;
&lt;td&gt;618 MB&lt;/td&gt;
&lt;td&gt;32 MB&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;npm install&lt;/code&gt; running&lt;/td&gt;
&lt;td&gt;765 MB&lt;/td&gt;
&lt;td&gt;498 MB&lt;/td&gt;
&lt;td&gt;4.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image export, peak&lt;/td&gt;
&lt;td&gt;720 MB&lt;/td&gt;
&lt;td&gt;669 MB&lt;/td&gt;
&lt;td&gt;7.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App running, 5 min later&lt;/td&gt;
&lt;td&gt;648 MB&lt;/td&gt;
&lt;td&gt;478 MB&lt;/td&gt;
&lt;td&gt;0.4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Without the 2 GB swap file, the peak would have been about 1.4 GB of demand on a 961 MB box: the kernel's OOM killer would have taken out either the build or Coolify's own database. With swap, the build was slow (load 7 on one core) but finished. The Fastify app itself uses 31 MB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is 1 GB enough? The verdict so far
&lt;/h2&gt;

&lt;p&gt;Resident memory per container after the deploy, from &lt;code&gt;docker stats&lt;/code&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Container&lt;/th&gt;
&lt;th&gt;Memory&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;coolify (the app)&lt;/td&gt;
&lt;td&gt;150 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;coolify-proxy (Traefik)&lt;/td&gt;
&lt;td&gt;38 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;coolify-realtime&lt;/td&gt;
&lt;td&gt;25 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;coolify-db (Postgres)&lt;/td&gt;
&lt;td&gt;23 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;coolify-sentinel&lt;/td&gt;
&lt;td&gt;9 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;coolify-redis&lt;/td&gt;
&lt;td&gt;7 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;your app (Fastify)&lt;/td&gt;
&lt;td&gt;31 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;283 MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Coolify's own footprint is about 250 MB; the rest of the "used" figure is the kernel, Docker and page cache. Disk after one build: 11 GB of 24 GB (base images and the build cache are the bulk; Coolify's cleanup job reclaims the cache weekly).&lt;/p&gt;

&lt;p&gt;So: for one or two small apps, a static site, or a private tool, the $6 droplet with swap is fine and we are leaving ours running. We will update this section with the 7-day numbers (memory trend, swap, any restarts) once we have them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the $6 plan cannot do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Build large Node or Rust projects on the server. Builds are the memory peak; for anything heavier than a static site or a small Express/Flask app, build elsewhere (GitHub Actions) and have Coolify pull the image.&lt;/li&gt;
&lt;li&gt;Run a database per app comfortably. One Postgres is fine; three is not.&lt;/li&gt;
&lt;li&gt;Survive a traffic spike without swapping. If an app matters, the &lt;strong&gt;$12 plan (2 GB)&lt;/strong&gt; is the realistic minimum and still far cheaper than one Heroku dyno.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cost comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Monthly&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DigitalOcean $6 droplet + Coolify&lt;/td&gt;
&lt;td&gt;$6.00&lt;/td&gt;
&lt;td&gt;Unlimited apps within the box, your own domain, free SSL via Traefik&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DigitalOcean $12 droplet + Coolify&lt;/td&gt;
&lt;td&gt;$12.00&lt;/td&gt;
&lt;td&gt;The comfortable size for a small team&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heroku Eco dyno&lt;/td&gt;
&lt;td&gt;$5 per app, sleeps&lt;/td&gt;
&lt;td&gt;One app, sleeps after 30 min idle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Render starter&lt;/td&gt;
&lt;td&gt;$7 per service&lt;/td&gt;
&lt;td&gt;One service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Railway hobby&lt;/td&gt;
&lt;td&gt;$5 + usage&lt;/td&gt;
&lt;td&gt;Usage-based&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a team running three or four small services, a single Coolify box replaces $20-40 of PaaS fees. The trade: you own the updates and backups.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does Coolify work with 1 GB of RAM?
&lt;/h3&gt;

&lt;p&gt;Yes, with a swap file. Coolify's own containers use about 250 MB; the problem is the build step, which peaked at 720 MB of RAM plus 669 MB of swap in our test. Without swap the kernel kills a container during the first real build. With a 2 GB swap file the build is slow but completes.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long does the Coolify install take?
&lt;/h3&gt;

&lt;p&gt;172 seconds on a $6 DigitalOcean droplet in Frankfurt, measured from running the official install script to the "Your instance is ready" message. Most of that is installing Docker (57 s) and pulling the Coolify images (109 s).&lt;/p&gt;

&lt;h3&gt;
  
  
  How much does it cost to run Coolify on DigitalOcean?
&lt;/h3&gt;

&lt;p&gt;$6.00 a month for the droplet ($0.009 an hour), plus $1.20 a month if you turn on weekly backups. Coolify itself is free and open source. There is no per-app charge, so the cost does not change when you add a second or third small app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I use the $4 droplet instead?
&lt;/h3&gt;

&lt;p&gt;No. The $4 plan has 512 MB of RAM and 10 GB of disk; Coolify's images alone used 7 GB in our install and the four core containers need more than 512 MB before any app runs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which plan for a small team running several apps?
&lt;/h3&gt;

&lt;p&gt;The $12 droplet (2 GB RAM, 50 GB SSD) is the realistic minimum once you run three or more services or any database next to your apps. It is still far cheaper than one dyno or service on a hosted PaaS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Point a domain at the droplet and set it in Coolify's settings; Traefik issues Let's Encrypt certificates automatically.&lt;/li&gt;
&lt;li&gt;Enable DigitalOcean's weekly backups ($1.20/month on this plan) or Coolify's own S3 backups.&lt;/li&gt;
&lt;li&gt;Lock the server down: &lt;a href="https://www.fewservers.com/posts/coolify-ports-firewall-rules/" rel="noopener noreferrer"&gt;which ports Coolify needs and which to close&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Wondering whether 1 GB is really enough? &lt;a href="https://www.fewservers.com/posts/can-coolify-run-on-1gb-ram/" rel="noopener noreferrer"&gt;The docs versus what we measured&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Know what the droplet costs before the invoice arrives: &lt;a href="https://www.fewservers.com/posts/digitalocean-droplet-pricing-explained/" rel="noopener noreferrer"&gt;DigitalOcean droplet pricing explained&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Read our Coolify vs Dokploy comparison once it is published; both ran on this same droplet.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://www.fewservers.com/posts/deploy-coolify-6-dollar-vps/" rel="noopener noreferrer"&gt;Few Servers&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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