<?xml version="1.0" encoding="utf-8"?>



<feed xmlns="http://www.w3.org/2005/Atom"
    xmlns:fh="http://purl.org/syndication/history/1.0"
    xmlns:at="http://purl.org/atompub/tombstones/1.0">

    <title>Publ: Deployment guides</title>
    <subtitle>A personal publishing system for the modern web</subtitle>
    <link href="http://publ.beesbuzz.biz/manual/deploying/feed?tag=deployment" rel="self" />
    <link href="http://publ.beesbuzz.biz/manual/deploying/feed" rel="current" />
    <link href="https://busybee.superfeedr.com" rel="hub" />
    
    
    <link href="http://publ.beesbuzz.biz/manual/deploying/" />
    <fh:archive />
    <id>tag:publ.beesbuzz.biz,2020-01-07:manual/deploying</id>
    <updated>2024-07-05T11:45:08-07:00</updated>

    
    <entry>
        <title>Using MySQL/MariaDB as your backing store</title>
        <link href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store" rel="alternate" type="text/html" />
        <published>2024-07-05T11:45:08-07:00</published>
        <updated>2024-07-05T11:45:08-07:00</updated>
        <id>urn:uuid:f9569d5a-44b7-549f-b536-1de795fdd8d7</id>
        <author><name>fluffy</name></author>
        <content type="html">
<![CDATA[
<p>How to use MySQL as the index database</p>

<p>For smaller Publ sites, the suggested configuration is to use <a href="https://sqlite.org/">SQLite</a> for the index database, as it is low-maintenance and performs very well due to being in-process and taking advantage of the operating system&rsquo;s disk cache.</p><p>However, sometimes it&rsquo;s helpful to use a larger-scale database system for the deployment, primarily to gain access to finer-grained locking. This is especially useful in situations where there are many thousands of entries and a desire to keep the site running at full capacity during a reindex.</p><p>Here is a configuration snippet that allows you to use MySQL/MariaDB on your Publ site:</p><figure class="blockcode"><figcaption>app.py</figcaption><pre class="highlight" data-language="python" data-line-numbers><span class="line" id="e764cb1L1"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L1"></a><span class="line-content"><span class="c1"># ...</span></span></span>
<span class="line" id="e764cb1L2"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L2"></a><span class="line-content"></span></span>
<span class="line" id="e764cb1L3"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L3"></a><span class="line-content"><span class="k">if</span> <span class="s1">&#39;DATABASE_URL&#39;</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span></span></span>
<span class="line" id="e764cb1L4"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L4"></a><span class="line-content">    <span class="kn">import</span><span class="w"> </span><span class="nn">urllib.parse</span></span></span>
<span class="line" id="e764cb1L5"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L5"></a><span class="line-content">    <span class="n">parsed</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">parse</span><span class="o">.</span><span class="n">urlparse</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">&#39;DATABASE_URL&#39;</span><span class="p">])</span></span></span>
<span class="line" id="e764cb1L6"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L6"></a><span class="line-content">    <span class="n">user</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;(.*):(.*)@(.*)&#39;</span><span class="p">,</span> <span class="n">parsed</span><span class="o">.</span><span class="n">netloc</span><span class="p">)</span></span></span>
<span class="line" id="e764cb1L7"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L7"></a><span class="line-content">    <span class="n">db_config</span> <span class="o">=</span> <span class="p">{</span></span></span>
<span class="line" id="e764cb1L8"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L8"></a><span class="line-content">            <span class="s1">&#39;provider&#39;</span><span class="p">:</span> <span class="n">parsed</span><span class="o">.</span><span class="n">scheme</span><span class="p">,</span></span></span>
<span class="line" id="e764cb1L9"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L9"></a><span class="line-content">            <span class="s1">&#39;user&#39;</span><span class="p">:</span> <span class="n">user</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span></span></span>
<span class="line" id="e764cb1L10"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L10"></a><span class="line-content">            <span class="s1">&#39;password&#39;</span><span class="p">:</span> <span class="n">user</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">2</span><span class="p">),</span></span></span>
<span class="line" id="e764cb1L11"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L11"></a><span class="line-content">            <span class="s1">&#39;host&#39;</span><span class="p">:</span> <span class="n">user</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">3</span><span class="p">),</span></span></span>
<span class="line" id="e764cb1L12"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L12"></a><span class="line-content">            <span class="s1">&#39;database&#39;</span><span class="p">:</span> <span class="n">parsed</span><span class="o">.</span><span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:],</span></span></span>
<span class="line" id="e764cb1L13"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L13"></a><span class="line-content">            <span class="c1"># charset and collation must be specified, as the MySQL defaults do</span></span></span>
<span class="line" id="e764cb1L14"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L14"></a><span class="line-content">            <span class="c1"># not properly support emoji and other 4-byte characters</span></span></span>
<span class="line" id="e764cb1L15"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L15"></a><span class="line-content">            <span class="s1">&#39;charset&#39;</span><span class="p">:</span> <span class="s1">&#39;utf8mb4&#39;</span><span class="p">,</span></span></span>
<span class="line" id="e764cb1L16"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L16"></a><span class="line-content">            <span class="s1">&#39;collation&#39;</span><span class="p">:</span> <span class="s1">&#39;utf8mb4_bin&#39;</span><span class="p">,</span></span></span>
<span class="line" id="e764cb1L17"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L17"></a><span class="line-content">        <span class="p">}</span></span></span>
<span class="line" id="e764cb1L18"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L18"></a><span class="line-content"><span class="k">else</span><span class="p">:</span></span></span>
<span class="line" id="e764cb1L19"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L19"></a><span class="line-content">    <span class="n">db_config</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;provider&#39;</span><span class="p">:</span> <span class="s1">&#39;sqlite&#39;</span><span class="p">,</span> <span class="s1">&#39;filename&#39;</span><span class="p">:</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">APP_PATH</span><span class="p">,</span> <span class="s1">&#39;index.db&#39;</span><span class="p">)}</span></span></span>
<span class="line" id="e764cb1L20"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L20"></a><span class="line-content"></span></span>
<span class="line" id="e764cb1L21"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L21"></a><span class="line-content"><span class="n">config</span> <span class="o">=</span> <span class="p">{</span></span></span>
<span class="line" id="e764cb1L22"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L22"></a><span class="line-content">    <span class="s1">&#39;database_config&#39;</span><span class="p">:</span> <span class="n">db_config</span><span class="p">,</span></span></span>
<span class="line" id="e764cb1L23"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb1L23"></a><span class="line-content">    <span class="c1"># ...</span></span></span>
</pre></figure><p>Then when running the site, set an environment variable such as:</p><figure class="blockcode"><pre><span class="line"><span class="line-content">DATABASE_URL=&#x27;mysql://username:password@server/dbname&#x27;</span></span>
</pre></figure><p>If migrating from SQLite to MySQL, it is a good idea to create the index first before flipping the configuration:</p><figure class="blockcode"><pre><span class="line"><span class="line-content">DATABASE_URL=&#x27;mysql://username:password@server/dbname&#x27; poetry run flask publ reindex</span></span>
</pre></figure><p>An alternate way to store the database configuration is to put it into a local <code>db_config.py</code> file, like so:</p><figure class="blockcode"><figcaption>db_config.py</figcaption><pre class="highlight" data-language="python" data-line-numbers><span class="line" id="e764cb4L1"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb4L1"></a><span class="line-content"><span class="n">db_config</span> <span class="o">=</span> <span class="p">{</span></span></span>
<span class="line" id="e764cb4L2"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb4L2"></a><span class="line-content">    <span class="s1">&#39;provider&#39;</span><span class="p">:</span> <span class="s1">&#39;mysql&#39;</span><span class="p">,</span></span></span>
<span class="line" id="e764cb4L3"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb4L3"></a><span class="line-content">    <span class="s1">&#39;user&#39;</span><span class="p">:</span> <span class="s1">&#39;db username&#39;</span><span class="p">,</span></span></span>
<span class="line" id="e764cb4L4"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb4L4"></a><span class="line-content">    <span class="s1">&#39;password&#39;</span><span class="p">:</span> <span class="s1">&#39;db password&#39;</span><span class="p">,</span></span></span>
<span class="line" id="e764cb4L5"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb4L5"></a><span class="line-content">    <span class="s1">&#39;host&#39;</span><span class="p">:</span> <span class="s1">&#39;localhost&#39;</span><span class="p">,</span></span></span>
<span class="line" id="e764cb4L6"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb4L6"></a><span class="line-content">    <span class="s1">&#39;database&#39;</span><span class="p">:</span> <span class="s1">&#39;my_site&#39;</span><span class="p">,</span></span></span>
<span class="line" id="e764cb4L7"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb4L7"></a><span class="line-content">    <span class="s1">&#39;charset&#39;</span><span class="p">:</span> <span class="s1">&#39;utf8mb4&#39;</span><span class="p">,</span></span></span>
<span class="line" id="e764cb4L8"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb4L8"></a><span class="line-content">    <span class="s1">&#39;collation&#39;</span><span class="p">:</span> <span class="s1">&#39;utf8mb4_bin&#39;</span></span></span>
<span class="line" id="e764cb4L9"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb4L9"></a><span class="line-content"><span class="p">}</span></span></span>
</pre></figure><figure class="blockcode"><figcaption>app.py</figcaption><pre class="highlight" data-language="python" data-line-numbers><span class="line" id="e764cb5L1"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb5L1"></a><span class="line-content"><span class="c1"># ...</span></span></span>
<span class="line" id="e764cb5L2"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb5L2"></a><span class="line-content"></span></span>
<span class="line" id="e764cb5L3"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb5L3"></a><span class="line-content"><span class="k">try</span><span class="p">:</span></span></span>
<span class="line" id="e764cb5L4"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb5L4"></a><span class="line-content">    <span class="kn">from</span><span class="w"> </span><span class="nn">.db_config</span><span class="w"> </span><span class="kn">import</span> <span class="n">db_config</span></span></span>
<span class="line" id="e764cb5L5"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb5L5"></a><span class="line-content"><span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span></span></span>
<span class="line" id="e764cb5L6"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb5L6"></a><span class="line-content">    <span class="n">db_config</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;provider&#39;</span><span class="p">:</span> <span class="s1">&#39;sqlite&#39;</span><span class="p">,</span> <span class="s1">&#39;filename&#39;</span><span class="p">:</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">APP_PATH</span><span class="p">,</span> <span class="s1">&#39;index.db&#39;</span><span class="p">)}</span></span></span>
<span class="line" id="e764cb5L7"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb5L7"></a><span class="line-content"></span></span>
<span class="line" id="e764cb5L8"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb5L8"></a><span class="line-content"><span class="n">config</span> <span class="o">=</span> <span class="p">{</span></span></span>
<span class="line" id="e764cb5L9"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb5L9"></a><span class="line-content">    <span class="s1">&#39;databse_config&#39;</span><span class="p">:</span> <span class="n">db_config</span><span class="p">,</span></span></span>
<span class="line" id="e764cb5L10"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb5L10"></a><span class="line-content">    <span class="c1"># ...</span></span></span>
<span class="line" id="e764cb5L11"><a class="line-number" href="http://publ.beesbuzz.biz/manual/deploying/764-Using-MySQL-MariaDB-as-your-backing-store#e764cb5L11"></a><span class="line-content"><span class="p">}</span></span></span>
</pre></figure><p>but as always it is important to ensure the security of this file; environment-based configuration is traditionally considered to be much easier to secure and prevent mishaps such as accidentally checking it into source control.</p>

]]>
        </content>
    </entry>
    

    
</feed>