<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Sqlite on dKade's notes</title><link>https://dkade.com/tags/sqlite/</link><description>Recent content in Sqlite on dKade's notes</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>dkade@dkade.com (Daniel Loureiro)</managingEditor><webMaster>dkade@dkade.com (Daniel Loureiro)</webMaster><lastBuildDate>Tue, 11 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://dkade.com/tags/sqlite/index.xml" rel="self" type="application/rss+xml"/><item><title>Running Wiki.js in a FreeBSD 15.1 Jail</title><link>https://dkade.com/posts/wikijs_freebsd_jail/</link><pubDate>Tue, 11 Aug 2026 00:00:00 +0000</pubDate><author>dkade@dkade.com (Daniel Loureiro)</author><guid>https://dkade.com/posts/wikijs_freebsd_jail/</guid><description>Installing Wiki.js 2.5.314 on FreeBSD 15.1 with SQLite and Node.js 24, including rebuilding the Linux sqlite3 native module</description><content:encoded><![CDATA[<p>Wiki.js works well inside a FreeBSD jail, but there is one important catch: the official Wiki.js release ships a prebuilt Linux <code>sqlite3</code> native module. On FreeBSD this needs to be rebuilt locally before Wiki.js will start.</p>
<p>This post covers a simple Wiki.js 2.5.314 installation on FreeBSD 15.1 using SQLite, Node.js 24, and a native <code>rc.d</code> service.</p>
<h2 id="setup">Setup</h2>
<p>The jail is a normal FreeBSD 15.1-RELEASE jail with its own IP on the LAN.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">FreeBSD 15.1-RELEASE Host
</span></span><span class="line"><span class="cl">│
</span></span><span class="line"><span class="cl">└── wiki jail
</span></span><span class="line"><span class="cl">    └── Wiki.js :3000
</span></span></code></pre></div><p>No Docker or Linux emulation is needed. Wiki.js itself runs natively under FreeBSD Node.js.</p>
<h2 id="installing-wikijs">Installing Wiki.js</h2>
<p>I created a small bootstrap script which handles the whole installation.</p>
<p>Inside the jail as root:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">fetch https://codeberg.org/dkade/BSD/raw/branch/main/FreeBSD/wikijs/install-wikijs-freebsd-15.1.sh
</span></span><span class="line"><span class="cl">chmod +x install-wikijs-freebsd-15.1.sh
</span></span><span class="line"><span class="cl">./install-wikijs-freebsd-15.1.sh
</span></span></code></pre></div><p>The script installs:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">node24
</span></span><span class="line"><span class="cl">npm-node24
</span></span><span class="line"><span class="cl">python311
</span></span><span class="line"><span class="cl">gmake
</span></span><span class="line"><span class="cl">pkgconf
</span></span><span class="line"><span class="cl">sqlite3
</span></span><span class="line"><span class="cl">ca_root_nss
</span></span></code></pre></div><p>It then downloads Wiki.js 2.5.314 and extracts it under:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/usr/local/wikijs
</span></span></code></pre></div><p>A dedicated <code>wikijs</code> user is created to run the service instead of running Wiki.js as root.</p>
<h2 id="the-sqlite-freebsd-gotcha">The SQLite FreeBSD gotcha</h2>
<p>The official Wiki.js release includes its <code>node_modules</code>, including a prebuilt <code>sqlite3</code> native module.</p>
<p>Trying to start it directly on FreeBSD results in errors such as:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Shared object &#34;libc.musl-x86_64.so.1&#34; not found,
</span></span><span class="line"><span class="cl">required by &#34;node_sqlite3.node&#34;
</span></span></code></pre></div><p>Running <code>ldd</code> makes the problem obvious:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">ldd /usr/local/wikijs/node_modules/sqlite3/build/Release/node_sqlite3.node
</span></span></code></pre></div><p>returns:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">not a FreeBSD ELF shared object
</span></span></code></pre></div><p>The bundled module is a Linux/musl binary, so it cannot be used natively on FreeBSD.</p>
<p>The solution is to rebuild only the SQLite native module:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="nb">cd</span> /usr/local/wikijs
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">rm -rf node_modules/sqlite3/build
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">env <span class="se">\
</span></span></span><span class="line"><span class="cl">  <span class="nv">npm_config_python</span><span class="o">=</span>/usr/local/bin/python3.11 <span class="se">\
</span></span></span><span class="line"><span class="cl">  <span class="nv">npm_config_build_from_source</span><span class="o">=</span><span class="nb">true</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  <span class="nv">MAKE</span><span class="o">=</span>gmake <span class="se">\
</span></span></span><span class="line"><span class="cl">  npm rebuild sqlite3
</span></span></code></pre></div><p>Python 3.11 is used because the version of <code>node-gyp</code> bundled with Wiki.js 2.5.x still depends on Python&rsquo;s old <code>distutils</code> module, which was removed in Python 3.12.</p>
<p>After the rebuild:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">file node_modules/sqlite3/build/Release/node_sqlite3.node
</span></span></code></pre></div><p>should identify it as a FreeBSD ELF shared object.</p>
<p>Test it directly:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">node -e <span class="s2">&#34;const s=require(&#39;sqlite3&#39;); console.log(s.VERSION); console.log(&#39;sqlite3 OK&#39;)&#34;</span>
</span></span></code></pre></div><h2 id="configuration">Configuration</h2>
<p>Wiki.js uses:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/usr/local/wikijs/config.yml
</span></span></code></pre></div><p>For a simple SQLite setup:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="m">3000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">db</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">sqlite</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="l">/usr/local/wikijs/data/wiki.db</span><span class="w">
</span></span></span></code></pre></div><p>Make sure the database directory is writable by the Wiki.js user:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">mkdir -p /usr/local/wikijs/data
</span></span><span class="line"><span class="cl">chown -R wikijs:wikijs /usr/local/wikijs
</span></span></code></pre></div><h2 id="freebsd-rcd-service">FreeBSD rc.d service</h2>
<p>The installer creates:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/usr/local/etc/rc.d/wikijs
</span></span></code></pre></div><p>Wiki.js is started using FreeBSD&rsquo;s <code>daemon(8)</code> and Node.js:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">/usr/local/bin/node /usr/local/wikijs/server
</span></span></code></pre></div><p>The service is enabled with:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sysrc <span class="nv">wikijs_enable</span><span class="o">=</span>YES
</span></span></code></pre></div><p>Start it:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">service wikijs start
</span></span></code></pre></div><p>Check the status:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">service wikijs status
</span></span></code></pre></div><p>Restart it:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">service wikijs restart
</span></span></code></pre></div><p>Logs are written to:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/var/log/wikijs.log
</span></span></code></pre></div><p>so they can be followed with:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">tail -f /var/log/wikijs.log
</span></span></code></pre></div><p>Once running, Wiki.js is available at:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">http://&lt;jail-ip&gt;:3000
</span></span></code></pre></div><p>The first connection opens the Wiki.js setup wizard.</p>
<h2 id="upgrading">Upgrading</h2>
<p>Before upgrading, take a ZFS snapshot or at least back up:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/usr/local/wikijs/config.yml
</span></span><span class="line"><span class="cl">/usr/local/wikijs/data/
</span></span></code></pre></div><p>After replacing the Wiki.js application files with a newer release, rebuild the SQLite module again:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="nb">cd</span> /usr/local/wikijs
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">env <span class="se">\
</span></span></span><span class="line"><span class="cl">  <span class="nv">npm_config_python</span><span class="o">=</span>/usr/local/bin/python3.11 <span class="se">\
</span></span></span><span class="line"><span class="cl">  <span class="nv">npm_config_build_from_source</span><span class="o">=</span><span class="nb">true</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  <span class="nv">MAKE</span><span class="o">=</span>gmake <span class="se">\
</span></span></span><span class="line"><span class="cl">  npm rebuild sqlite3
</span></span></code></pre></div><p>Then restart Wiki.js:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">service wikijs restart
</span></span></code></pre></div><p>Avoid blindly running:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">npm update
</span></span></code></pre></div><p>or:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">npm audit fix --force
</span></span></code></pre></div><p>inside the Wiki.js application tree. Wiki.js ships with a specific dependency set and changing package versions independently can break the application.</p>
<h2 id="gotchas">Gotchas</h2>
<ul>
<li><strong>SQLite native module:</strong> the bundled <code>node_sqlite3.node</code> is Linux/musl and must be rebuilt for FreeBSD.</li>
<li><strong>Python version:</strong> use Python 3.11 when rebuilding with the older bundled <code>node-gyp</code>.</li>
<li><strong>Node.js:</strong> Wiki.js 2.5.314 runs correctly with the FreeBSD <code>node24</code> package.</li>
<li><strong>Do not copy old <code>node_modules</code>:</strong> when upgrading, use a clean Wiki.js release tree and preserve only your configuration and database.</li>
<li><strong>rc.d PID tracking:</strong> when using <code>daemon(8)</code>, set <code>procname</code> to <code>/usr/local/bin/node</code> so <code>service wikijs status</code> correctly detects the running process.</li>
</ul>
<h2 id="summary">Summary</h2>
<p>Wiki.js runs cleanly inside a FreeBSD 15.1 jail without Docker or Linux emulation.</p>
<p>The only non-obvious part is rebuilding the bundled SQLite native module for FreeBSD. Once that is done, Wiki.js behaves like any other native FreeBSD service: a dedicated user, an <code>rc.d</code> script, automatic startup, and straightforward ZFS snapshots for backups and upgrades.</p>
<p>The bootstrap script automates the complete process from a fresh jail.</p>
<hr>
<p><em>Disclaimer: I use AI as a productivity tool. For a senior engineer, AI is incredibly powerful as one can focus on the solution design and conceptualization and leave the boring part that is implementation to the AI.</em></p>
]]></content:encoded></item></channel></rss>