1 of 11

$6.

One droplet, running a whole AI stack.

2 of 11

THE PROJECT

EnggFeed

Two flows: what happens on a page view, and what happens every night.

User

browser / API call

FastAPI app

handler + service

Cache lookup

Redis → Postgres on miss

Claude + OpenAI

only if summary is stale

Postgres

write result, respond

1

2

3

4

GitHub Actions

daily cron trigger

FastAPI app

/ingest endpoint

Claude + OpenAI

tags, prerequisites, embeddings

Postgres

insert blog + tags + prereqs

1

2

3

Phoenix

traces every LLM call, automatically

Request flow: per page view

Ingest flow: daily cron

3 of 11

SIGNED IN

What it looks like, logged in

Local environment, real ingested data. Auth isn't set up on the demo server.

4 of 11

ELI5

CPU, RAM, storage, in one breath

The three numbers everything else on this deck comes back to.

CPU

How fast it can think

RAM

How much it can hold in its head, right now

Storage

How much it remembers after it sleeps

5 of 11

docker stats

on the actual EnggFeed containers, live.

6 of 11

WHAT'S ACTUALLY RUNNING

Core vs. supporting components

CONTAINER

PURPOSE

ROLE

LOCAL IDLE, OF 7.4GB

app

FastAPI backend

Core

206.8 MiB

postgresql

Blog + embeddings store

Core

34.17 MiB

redis

cache

Core

5.945 MiB

phoenix

LLM tracing

Support

245.9 MiB

pgadmin

Postgres admin GUI

Support

72.91 MiB

redisinsight

Redis admin GUI

Support

177.4 MiB

Local = this laptop. Server = the redeployed droplet, idle. Server figures = RAM + swap, because docker stats alone only shows RAM-resident memory, understating phoenix (23 MiB resident, 345 MiB actually swapped) and pgadmin. DB issue blocked the loaded capture there.

LOCAL LOADED, OF 7.4GB

SERVER MEM (RAM+SWAP)

161.4 MiB

86.8 MiB

30.28 MiB

49.1 MiB

4.391 MiB

3.20 MiB

245.9 MiB

367.7 MiB

239.8 MiB

391.2 MiB

123.3 MiB

27.6 MiB

Core total

246.9 MiB

196.1 MiB

139.1 MiB

Support total

496.2 MiB

609.0 MiB

786.5 MiB

7 of 11

BACKUP (IF ASKED)

Where the swap numbers came from

1. docker stats (server, idle)

Shows RAM used by each running container.

2. free -h (current)

Shows total RAM and swap used on the whole server, right now.

3. Scan every process for VmSwap

This returns list of PIDs, with how much swap memory each one is using.

for pid in $(ps -eo pid=); do swap=$(awk '/VmSwap/{print $2}' /proc/$pid/status); [ "$swap" ] && echo "$swap $(ps -p $pid -o comm=)"; done | sort -rn

4. docker top, per container

Docker command lists container name corresponding to the PIDs.

for id in $(docker ps -q); do echo $(docker inspect --format '{{.Name}}' $id); docker top "$id" -o pid,comm; done

5. Cross-referenced both lists

As a final step, mapped docker container name to SWAP used, instead of PID.

6. docker stats (RAM) + VmSwap (swap)

Added RAM (docker stats) + swap (VmSwap) = memory used per container, a slight underestimate, see note below.

Note: VmSwap only counts memory a process keeps to itself. It misses shared memory (like Postgres's internal cache), so the real swap usage could be a bit higher than shown here.

8 of 11

WHAT IT COST

The DigitalOcean bill

$6 / month

1 vCPU · 1GB RAM · 25GB SSD · 1TB transfer

$3.28 (June)

EnggFeed's own droplet, prorated partial month, pre-GST

1GB RAM wasn't quite enough for 6 services running together, so added swap to keep it from hanging.

Before swap: 934Mi/961Mi used, 26Mi available → After swap: 812Mi/961Mi used, 149Mi available (163Mi in swap).

EnggFeed's droplet ran alone: no managed DB, no managed cache, everything self-hosted in Docker.

(June account total was $7.74: that's this droplet + a second, unrelated project's droplet + $1.18 GST.)

9 of 11

DO VS AWS

Same box, AWS-shaped

DigitalOcean

Basic droplet�1 vCPU · 1GB RAM�25GB SSD + 1TB transfer bundled��$6.00 / month flat

AWS: MINIMAL (same specs as DO)

t2.micro · 1 vCPU · 1GB RAM · 25GB gp3 SSD + 100GB transfer free�$9.05 + $2.28 = $11.33 / month

AWS: RIGHT-SIZED (no swap needed)

t3.small · 2 vCPU · 2GB RAM · 25GB gp3 SSD + 100GB transfer free�$16.35 + $2.28 = $18.63 / month

gp3 = AWS's general-purpose SSD, EBS's default volume type. Transfer isn't apples-to-apples either: DO bundles 1,000GB free per droplet; AWS gives only 100GB free per whole account, then $0.09/GB beyond that. "Right-sized" avoids the swap issue at ~1.6× the minimal cost.

10 of 11

EnggFeed

DO vs AWS: an AI side project's cost story

Thank you.

11 of 11

REFERENCES

Where the numbers came from

DigitalOcean droplet pricing ($6/mo, 1 vCPU, 1GB RAM, 25GB SSD)

AWS EC2 + EBS pricing (t2.micro, t3.micro, t3.small, gp3 storage, data transfer)

calculator.aws (official) · cross-checked against aws-pricing.com

EC2 root volume requirement (Nitro instances need EBS, no instance store)

AWS Free Tier structure ($200 credit / 6 months, not the old per-service model)

Linux VmSwap accounting limitations (misses shared memory)