We're 7-months old now, starting to outgrow our (1Gbps) baby clothes, and exploring a new service niche, the hosted Stremio addons!
February saw us outgrowing our 1Gbps storage nodes, and becoming more involved in the r/StremioAddons community, moving from hosting a single hacky alternative for the popular-but-overloaded torrentio service, to providing free / subscription hosting for many popular Stremio Addons.
To get us started, here are some shiny stats for Jan 2024, followed by a summary of some of the user-facing changes announced this month in the blog...
Most apps consume almost no CPU while idle - the larger consumers are streamers doing transcoding, and download clients doing download/unpack operations.
CPU usage roughly roughly doubled from last month (the big dip at 06:00 was a planned shutdown for maintenance)
Based on a quick metrics snapshot, we're more contended for RAM than we are for CPU (elves and giants run tenant workloads):
This graph represents memory usage across the entire cluster. By far the largest consumers of RAM is rook-ceph, since ceph will basically take all the RAM you give it, for caching / performance.
RAM usage has increased by about 50% since the previous month, although some of this may be due to the addition of 10Gbps ceph nodes for SSD-backed storage (the new "tenants" distinction on the graph below should make this more apparent next month)
I'm not sure these stats are accurate, they've likely overly high because pods on the host network (like metallb, ceph, etc) will end up counting all traffic on each host, rather than the pod itself. This is exacerbated with more and more storage nodes, which run in `hostNetwork`` mode. However, the graph still gives a good indication of network usage compared to the previous month.
These samples are fairly useless for trending, since they're taken over a 1h period, because I haven't worked out how to do an efficient Prometheus query of all the metrics required to graph a longer period!
Last month (Jan 2024)'s for comparison:
These are the traffic stats for egress from Hetzner. They exclude any traffic to/from Hetzner Storageboxes, and they also exclude stats from any nodes which were decomissioned during the period, which for February was a lot (we standardized on 128GB i9-9900K nodes). Thus, these stats are likely under-reported for February.
We also wouldn't see the resulting network traffic to ElfStorage or Storageboxes though, since this traffic is not counted as being "external".
Ingress / Egress stats for Feb 2024
Last month (Jan 2024)'s for comparison:
Ingress / Egress stats for Jan 2024
Ceph provides our own storage ("[ElfStorage][elfstorage]"), typically used for long-term slow storage and seeding, as well as all the storage for our per-app /config volumes, now backed by 10Gbps nodes with NVMe disks.
Ceph storage growth has slowed from 100% down to 20% during February, as we've shifted our focus / subscriber base towards "Infinite" Debrid/symlink-based storage. Interestingly, keeping track of thousands of symlinks per-tenant still consumes a significant amount of I/O resources, so although storage capacity is not under pressure at the moment, scaling Ceph was a priority during Feb.
Last month (Jan 2024)'s for comparison:
What's new?
Stremio Addons
The big highlight this month has been our hosted Stremio Addons, which started with a flakey fork of Torrentio, and has now expanded to 8 popular addons, all of which are available publicaly for free, or privately for more customization or rate-limits.
Searches for content from Prowlarr / Jackett, streams via RealDebrid. Optionally proxies streams, allowing you to use your RealDebrid account from multiple IPs simultaneously
Real-Debrid gets all the attention, but there are a lot of AllDebrid users who were left out in the cold, because AllDebrid blocks API access to "server IPs", which include our Hetzner infrastructure. We've architected a bolt-on VPN for KnightCrawler, RDTClient and our rclone mounts, so that AllDebrid users can access their media as "first-class citizens" again!
The "Advanced Infinite Streaming" bundles utilize symlinks to make it appear to Plex / Jellyfin or Emby that your debrid library is locally available.
How to help
If you'd like to make a donation in recognition of our infrastructure costs, our open-source resources, or our friendly support, a simple donation product is available at https://store.elfhosted.com/product/elf-love/
Another effective way to help is to drive traffic / organic discovery, by mentioning ElfHosted in appropriate forums such as Reddit's r/selfhosted, r/seedboxes, r/realdebrid, and r/StremioAddons, which is where much of our target audience is to be found!
What's coming up?
Regular pricing re-balancing starts 1 April 2024
Just like we re-balance our node workloads daily to meet resourcing / responsiveness targets, we're going to need to start regularly adjusting our pricing to meet budget / break-even targets! After 7 months of production operation, we have enough data, and a wide enough pool of users, that we should be able to reasonably estimate how much each app costs to run, such that the platform can become self-sustainable (the current app prices were guesses without adequate data to back them up).
Look for updates on this pricing balancing idea during March, with the intention to apply our first changes from 1 April - I'll be be posting updates and requests for input in the next week or two. If you have any feedback / suggestions / experience in this regard, let me know!
Backlog management
There's an ever-growing list of app bugs, suggestions, improvements, and opportunities that are gathering dust in my Things.app inbox. Recently several community members have offered their time / expertise to help with outstanding tasks.
To better surface all these tasks, I'll be moving them to GitHub issues - this will not only help us to track the backlog and deal with bugs etc, but make it easy for fellow elves to contribute suggestions, improvements, and expertise.
Plex library migrations
We've started to run into I/O contention on the big, busy storage volumes, which use CephFS to make files available to multiple pods (for example, to Plex for storage, but to FileBrowser for browsing config). In early March (already started as I write this), we'll be migrating users' Plex libraries (some of which are >50GB!) to Ceph "block" storage, which bypasses the I/O contention, at the cost of being unable to "view" your Plex metadata / DB / logs via FileBrowser (we'll come up with an alternate solution as required).
PostgreSQL support for the Aars
Radarr, Sonarr, etc all now have built-in support for PostgreSQL as a replacement to the troublesome and easy-to-corrupt SQLite database they come with by default. To support our KnightCrawler database, I've started using CloudNativePG (CNPG) for full-lifecycle database management. With a simple CR, CNPG will establish a highly-available PostgreSQL cluster, including automated failover, incremental and automatic backups to local snapshots and to an S3 bucket.
This declarative approach to creating a PostgreSQL database could allow us to, in bulk, create individual database for Arr instances, such that setup is still fully automatic, and users just "get" the PostgreSQL-enabled instances. I'm testing this internally, so look out for updates during March!
Offering free demos
Nothing gets my attention on a new app like a live demo. I've considered reaching out to open source projects who don't have their own online demo, and offering to host a self-resetting demo for them.
This approach has been successful with the Stremio Addons, and I think it'd be effective at gaining exposure to more niche communities.
A hosted demo would provide their potential users the opportunity to evaluate the app "live", and would also drive more traffic / recognition / SEO juice towards ElfHosted.
If you've got an open-source, self-hosted app and you'd like a free demo instance hosted, hit me up!
Includes "opportunity cost" of deferring billable consulting work for ElfHosted development! ↩
Cluster costs are calculated based on Hetzner montly invoicing, which lags behind by a month. So this month's changes are only reflected in next month's invoice! ↩
These are actually paid yearly in advance, but represented here monthly for consistency. Confirm my sponsorships here↩