olexsmir.xyz/freshfly.html(view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
<!DOCTYPE html><html lang="en"><head><title>FreshRSS on fly</title><meta charset="utf-8"><meta content="width=device-width, initial-scale=1.0, viewport-fit=cover" name="viewport"><link href="https://olexsmir.xyz/feed.xml" rel="alternate" title="olexsmir's blog feed, also hi rss reader!" type="application/atom+xml"></link><link href="style.css" rel="stylesheet"></link><link href="chroma.css" rel="stylesheet"></link><link href="assets/favicon.svg" rel="icon"></link><meta content="Blog post titled: FreshRSS on fly" name="description"><meta content="Blog post titled: FreshRSS on fly" property="og:description"><meta content="FreshRSS on fly" property="og:site_name"><meta content="FreshRSS on fly" property="og:title"><meta content="website" property="og:type"></head><body class="home"><header><nav><p><a class="visual-hidden" href="#main">Skip to content</a><a href="/">home</a><a href="/posts">posts</a><a href="/feed.xml">feed</a><button id="theme-toggle">🌓</button></p></nav></header><main id="main"><div class="blog-title"><h1>FreshRSS on fly</h1><p><time datetime="2025-11-10">2025-11-10</time></p></div><h1>The problem.</h1>
<p>I'm broke, and I like using FreshRSS.</p>
<h1>The solution.</h1>
<p>We'll be using <a href="https://fly.io">fly.io</a>
they have a generous <a href="https://fly.io/docs/about/pricing">free allowance</a>.</p>
<h2>Setting up</h2>
<p>First, you have to <a href="https://fly.io/app/sign-up">sign up for fly account</a>.
<a href="https://fly.io/docs/flyctl/install">Get their cli</a>, and login with <code>flyctl auth login</code>.</p>
<h2>Deploying FreshRSS</h2>
<p>Create a directory where you'll store the <code>fly.toml</code> file, <code>cd</code> into this directory, we'll do our magic.</p>
<p>Now, we need to create an app on fly.io, using the following command:</p>
<pre class="chroma"><code><span class="line"><span class="cl">flyctl app create --save
</span></span></code></pre><p>After this, you'll get an auto-generated <code>fly.toml</code> file.
<br>
Modify it to look like this (<strong>don't change the app name</strong>):</p>
<pre class="chroma"><code><span class="line"><span class="cl"><span class="nx">app</span> <span class="p">=</span> <span class="s1">'your-app-name'</span> <span class="c"># TODO: update me</span>
</span></span><span class="line"><span class="cl"><span class="nx">primary_region</span> <span class="p">=</span> <span class="s1">'fra'</span>
</span></span><span class="line"><span class="cl"><span class="nx">kill_signal</span> <span class="p">=</span> <span class="s1">'SIGINT'</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">build</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="c"># Please check what the latest version is at: https://github.com/FreshRSS/FreshRSS</span>
</span></span><span class="line"><span class="cl"><span class="c"># and set it here</span>
</span></span><span class="line"><span class="cl"><span class="nx">image</span> <span class="p">=</span> <span class="s1">'docker.io/freshrss/freshrss:1.27.1'</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">env</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">CRON_MIN</span> <span class="p">=</span> <span class="s1">'*/20'</span> <span class="c"># update feeds every 20 minutes</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># you don't want your account and feeds to be deleted after a restart</span>
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">mounts</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"><span class="nx">source</span> <span class="p">=</span> <span class="s1">'freshrss_data'</span>
</span></span><span class="line"><span class="cl"><span class="nx">destination</span> <span class="p">=</span> <span class="s1">'/var/www/FreshRSS/data'</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># you probably want this app to be accessible</span>
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">services</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"><span class="nx">protocol</span> <span class="p">=</span> <span class="s1">'tcp'</span>
</span></span><span class="line"><span class="cl"><span class="nx">internal_port</span> <span class="p">=</span> <span class="mi">80</span>
</span></span><span class="line"><span class="cl"><span class="nx">processes</span> <span class="p">=</span> <span class="p">[</span><span class="s1">'app'</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">services</span><span class="p">.</span><span class="nx">ports</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"><span class="nx">port</span> <span class="p">=</span> <span class="mi">80</span>
</span></span><span class="line"><span class="cl"><span class="nx">handlers</span> <span class="p">=</span> <span class="p">[</span><span class="s1">'http'</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">force_https</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">services</span><span class="p">.</span><span class="nx">ports</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"><span class="nx">port</span> <span class="p">=</span> <span class="mi">443</span>
</span></span><span class="line"><span class="cl"><span class="nx">handlers</span> <span class="p">=</span> <span class="p">[</span><span class="s1">'tls'</span><span class="p">,</span> <span class="s1">'http'</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">vm</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"><span class="nx">size</span> <span class="p">=</span> <span class="s1">'shared-cpu-1x'</span>
</span></span></code></pre><p>Deploy to fly.io by running:</p>
<pre class="chroma"><code><span class="line"><span class="cl">flyctl launch
</span></span></code></pre><p>Now open <a href="https://your-app-name.fly.dev">your-app-name.fly.dev</a>
in your browser, and follow the setup wizard.
Chose <strong>sqlite</strong> as your database, it will be automatically stored in <code>/var/www/FreshRSS/data</code>.</p>
<h2>Setting up custom domain (optional)</h2>
<pre class="chroma"><code><span class="line"><span class="cl">fly certs create rss.your-domain.com
</span></span></code></pre><p>The output of this command will guide you through the records you need to add to your domain.</p>
</main><script>const root = document.documentElement;root.dataset.theme = localStorage.theme || 'dark';document.getElementById('theme-toggle').onclick = () => {root.dataset.theme = root.dataset.theme === 'dark' ? 'light' : 'dark';localStorage.theme = root.dataset.theme;};</script></body></html>
|