<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Smart Blog Name]]></title><description><![CDATA[Just a place to save and share useful stuff...]]></description><link>https://smartblog.name/</link><image><url>https://smartblog.name/favicon.png</url><title>Smart Blog Name</title><link>https://smartblog.name/</link></image><generator>Ghost 6.5</generator><lastBuildDate>Thu, 06 Nov 2025 10:26:52 GMT</lastBuildDate><atom:link href="https://smartblog.name/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[🔐 Reset Ghost Admin Password via MariaDB/MySQL]]></title><description><![CDATA[<blockquote>
<p>Lost your Ghost admin password and can&#x2019;t use email recovery? Here&#x2019;s a clean, copy-paste friendly way to reset it directly in MariaDB/MySQL.</p>
</blockquote>
<hr>
<h2 id="what-you%E2%80%99ll-need">What you&#x2019;ll need</h2>
<ul>
<li>Shell access to your Ghost server</li>
<li>MariaDB/MySQL credentials (or sudo to run <code>mysql</code>)</li>
<li>The database name Ghost</li></ul>]]></description><link>https://smartblog.name/reset-ghost-admin-password-via-mariadb-mysql/</link><guid isPermaLink="false">68af19d93ad4230001b03ee4</guid><dc:creator><![CDATA[admin]]></dc:creator><pubDate>Wed, 27 Aug 2025 15:03:58 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>Lost your Ghost admin password and can&#x2019;t use email recovery? Here&#x2019;s a clean, copy-paste friendly way to reset it directly in MariaDB/MySQL.</p>
</blockquote>
<hr>
<h2 id="what-you%E2%80%99ll-need">What you&#x2019;ll need</h2>
<ul>
<li>Shell access to your Ghost server</li>
<li>MariaDB/MySQL credentials (or sudo to run <code>mysql</code>)</li>
<li>The database name Ghost uses (often <code>ghost_production</code>)</li>
<li>A <strong>strong new password</strong> you want to set</li>
</ul>
<hr>
<h2 id="1-find-your-ghost-database-name">1) Find your Ghost database name</h2>
<p>On most installs with Ghost-CLI:</p>
<pre><code class="language-bash"># Adjust the path if you installed Ghost elsewhere
cat /var/www/ghost/config.production.json
</code></pre>
<p>Look for:</p>
<pre><code class="language-json">&quot;database&quot;: {
  &quot;connection&quot;: {
    &quot;database&quot;: &quot;ghost_production&quot;,
    &quot;user&quot;: &quot;ghost&quot;,
    &quot;password&quot;: &quot;XXXXXXXX&quot;
  }
}
</code></pre>
<p>Note the <code>database</code> (e.g., <code>ghost_production</code>) and, if needed, the DB <code>user</code>.</p>
<hr>
<h2 id="2-back-up-the-database-don%E2%80%99t-skip">2) Back up the database (don&#x2019;t skip)</h2>
<pre><code class="language-bash"># Replace DB_NAME and DB_USER as needed
mysqldump -u DB_USER -p DB_NAME &gt; ghost-backup-$(date +%F).sql
# Example if you can use root without a user:
# mysqldump -u root -p ghost_production &gt; ghost-backup-$(date +%F).sql
</code></pre>
<hr>
<h2 id="3-generate-a-bcrypt-hash-of-your-new-password">3) Generate a bcrypt hash of your new password</h2>
<p>Ghost stores passwords as <strong>bcrypt hashes</strong>. You&#x2019;ll set the hash directly in the DB.</p>
<p>Pick a new strong password (example: <code>S0methingMuchStronger!</code>), then generate a <strong>bcrypt</strong> hash using <strong>one</strong> of these options:</p>
<h3 id="option-a-%E2%80%94-nodejs-using-bcryptjs-pure-js">Option A &#x2014; Node.js (using <code>bcryptjs</code>, pure JS)</h3>
<pre><code class="language-bash"># If npm is available, install bcryptjs (no native build needed)
npm i -g bcryptjs
node -e &quot;console.log(require(&apos;bcryptjs&apos;).hashSync(process.argv[1], 10))&quot; &apos;S0methingMuchStronger!&apos;
</code></pre>
<h3 id="option-b-%E2%80%94-python-if-bcrypt-module-is-available">Option B &#x2014; Python (if <code>bcrypt</code> module is available)</h3>
<pre><code class="language-bash">python3 - &lt;&lt;&apos;PY&apos;
import bcrypt, sys
pwd = b&apos;S0methingMuchStronger!&apos;
print(bcrypt.hashpw(pwd, bcrypt.gensalt(rounds=10)).decode())
PY
</code></pre>
<h3 id="option-c-%E2%80%94-use-this-ready-made-temporary-hash-quickest">Option C &#x2014; Use this ready-made temporary hash (quickest)</h3>
<p>If tooling is a pain right now, you can paste this <strong>precomputed bcrypt hash</strong> to set the temporary password <strong><code>MyNewGhostPass!2025</code></strong>. <strong>Change it immediately after login.</strong></p>
<pre><code>$2b$10$v4grkpfhY5PhKQjw0gHG3.cKbxh8jq69j9lBK4R23i4.thiXareuC
</code></pre>
<blockquote>
<p>&#x26A0;&#xFE0F; Strongly recommended: generate your own hash (Options A/B) rather than using the fallback.</p>
</blockquote>
<hr>
<h2 id="4-connect-to-mariadb-and-locate-your-user">4) Connect to MariaDB and locate your user</h2>
<pre><code class="language-bash"># One of these will work depending on your setup
mysql -u root -p
# or
mysql -u DB_USER -p
</code></pre>
<p>Inside the MySQL prompt:</p>
<pre><code class="language-sql">-- Use your Ghost database
USE ghost_production;

-- See accounts on the site
SELECT id, name, email, status FROM users;

-- (Optional) If you forgot which account is the Owner:
SELECT u.id, u.email, u.status
FROM users u
JOIN roles_users ru ON ru.user_id = u.id
JOIN roles r ON r.id = ru.role_id
WHERE r.name = &apos;Owner&apos;;
</code></pre>
<p>Copy the <code>email</code> (or <code>id</code>) of the account you want to reset.</p>
<hr>
<h2 id="5-update-the-password-hash">5) Update the password hash</h2>
<p>Replace <code>you@example.com</code> and <code>PASTE_YOUR_BCRYPT_HASH_HERE</code>:</p>
<pre><code class="language-sql">UPDATE users
SET password = &apos;PASTE_YOUR_BCRYPT_HASH_HERE&apos;, status = &apos;active&apos;
WHERE email = &apos;you@example.com&apos;;
</code></pre>
<p><strong>Example</strong> using the temporary fallback hash/password from Option C:</p>
<pre><code class="language-sql">UPDATE users
SET password = &apos;$2b$10$v4grkpfhY5PhKQjw0gHG3.cKbxh8jq69j9lBK4R23i4.thiXareuC&apos;, status = &apos;active&apos;
WHERE email = &apos;you@example.com&apos;;
</code></pre>
<blockquote>
<p>Tip: If you prefer to target by user <code>id</code>:</p>
<pre><code class="language-sql">UPDATE users SET password = &apos;PASTE_HASH&apos; WHERE id = &apos;THE-USER-ID&apos;;
</code></pre>
</blockquote>
<hr>
<h2 id="6-optional-but-helpful-clear-existing-sessionstokens">6) (Optional but helpful) Clear existing sessions/tokens</h2>
<p>Different Ghost versions store sessions/tokens slightly differently. The following commands are safe to try&#x2014;<strong>if a table doesn&#x2019;t exist, you&#x2019;ll simply get an error you can ignore.</strong></p>
<pre><code class="language-sql">-- Remove existing login sessions for that user (if table exists)
DELETE FROM sessions
WHERE user_id = (SELECT id FROM users WHERE email = &apos;you@example.com&apos;);

-- Clear any existing tokens (password reset, etc.) for that user (if table exists)
DELETE FROM tokens
WHERE user_id = (SELECT id FROM users WHERE email = &apos;you@example.com&apos;);
</code></pre>
<p>Then exit:</p>
<pre><code class="language-sql">EXIT;
</code></pre>
<hr>
<h2 id="7-restart-ghost">7) Restart Ghost</h2>
<p>If you used Ghost-CLI:</p>
<pre><code class="language-bash">cd /var/www/ghost
ghost restart
</code></pre>
<p>(Or restart your process manager/service if you run Ghost another way.)</p>
<hr>
<h2 id="8-log-in-and-change-the-password">8) Log in and change the password</h2>
<ul>
<li>Visit <code>https://your-domain.com/ghost/</code></li>
<li>Log in with the email you targeted and the new password
<ul>
<li>If you used the fallback hash: <strong><code>MyNewGhostPass!2025</code></strong></li>
</ul>
</li>
<li>Immediately change the password in <strong>Settings &#x2192; Staff &#x2192; (your account)</strong></li>
</ul>
<hr>
<h2 id="troubleshooting">Troubleshooting</h2>
<ul>
<li><strong>&#x201C;Access denied&#x201D; to DB:</strong> Use the DB username/password from <code>config.production.json</code>, or connect as root with <code>sudo mysql</code> if configured.</li>
<li><strong>Hash looks wrong / login fails:</strong> Make sure you used <strong>bcrypt</strong> (strings start with <code>$2a$</code>, <code>$2b$</code>, or <code>$2y$</code>). Other hashes (like SHA-512 crypt) won&#x2019;t work.</li>
<li><strong>Which account is the admin?</strong> Use the <strong>Owner</strong> query above to find the primary owner account.</li>
<li><strong>Still logged out after update?</strong> Make sure you cleared sessions/tokens (Step 6) and restarted Ghost (Step 7).</li>
</ul>
<hr>
<h2 id="security-reminders">Security reminders</h2>
<ul>
<li>Use a unique, long password (and a password manager).</li>
<li>Re-enable email and test password-reset emails so you don&#x2019;t need DB edits next time.</li>
<li>Keep your database backups safe and encrypted.</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[GL.iNet GL-MT3000/Beryl ALX no internet after enabling Tailscale custom exit node]]></title><description><![CDATA[<p>I recently ran into a frustrating issue with my&#xA0;<strong>GL.iNet GL-MT3000 (Beryl AX)</strong>&#xA0;when trying to use a&#xA0;<strong>Tailscale custom exit node</strong>. The moment I enabled it, my internet connection completely dropped&#x2014;no browsing, no ping, nothing.</p><p>After some digging, I found out the culprit:</p>]]></description><link>https://smartblog.name/gl-inet-2/</link><guid isPermaLink="false">67d8a6ec4577b00001035524</guid><dc:creator><![CDATA[admin]]></dc:creator><pubDate>Mon, 17 Mar 2025 22:57:03 GMT</pubDate><content:encoded><![CDATA[<p>I recently ran into a frustrating issue with my&#xA0;<strong>GL.iNet GL-MT3000 (Beryl AX)</strong>&#xA0;when trying to use a&#xA0;<strong>Tailscale custom exit node</strong>. The moment I enabled it, my internet connection completely dropped&#x2014;no browsing, no ping, nothing.</p><p>After some digging, I found out the culprit:&#xA0;<strong>the router&apos;s firewall was blocking connections when using an exit node</strong>. Thankfully, I came across a solution in the GL.iNet forum that fixed everything.</p><p><strong>Credit to </strong><a href="https://forum.gl-inet.com/u/Cfm765?ref=smartblog.name">Cfm765</a>&#xA0;for sharing this fix:</p><blockquote>On the MT3000 Admin Panel<br>Under menu item System-&gt;Advanced<br>Go into the LUCI admin panel then select Network &#x2192; Firewall.<br>By default, below you will see 3 zones:<br>lan &gt; wan<br>wan &gt;&#xA0;<em>REJECT</em><br>guest &gt; wan<br>Click on &#x201C;EDIT&#x201D; on the second one ( wan &gt; REJECT)<br>Then click on the second top tab &#x201C;Advanced Settings&#x201D; and in the covered devices dropdown select tailscale0. Save, Save and apply.</blockquote><figure class="kg-card kg-image-card"><img src="https://smartblog.name/content/images/2025/03/fw_settings.png" class="kg-image" alt loading="lazy" width="2000" height="526" srcset="https://smartblog.name/content/images/size/w600/2025/03/fw_settings.png 600w, https://smartblog.name/content/images/size/w1000/2025/03/fw_settings.png 1000w, https://smartblog.name/content/images/size/w1600/2025/03/fw_settings.png 1600w, https://smartblog.name/content/images/2025/03/fw_settings.png 2192w" sizes="(min-width: 720px) 720px"></figure><p></p><p>Once I made that firewall change, everything worked perfectly. If you&#x2019;re dealing with the same issue, give this fix a shot!</p>]]></content:encoded></item><item><title><![CDATA[Enabling always-on VPN for Tailscale on AndroidTV]]></title><description><![CDATA[<p>To enable the Always-On VPN feature for Tailscale:</p><pre><code>adb shell settings put secure always_on_vpn_app com.tailscale.ipn</code></pre><p>Explanation:</p><p>With an ADB command it is possible to enable the Always-On VPN feature of Android for Tailscale. This feature should be available since Android 7 or FireOS 6.</p><p>The</p>]]></description><link>https://smartblog.name/enabling-always-on-vpn-for-tailscale-on-androidtv/</link><guid isPermaLink="false">678fc2818dfb690001d8a729</guid><category><![CDATA[vpn]]></category><dc:creator><![CDATA[admin]]></dc:creator><pubDate>Tue, 21 Jan 2025 16:12:54 GMT</pubDate><media:content url="https://smartblog.name/content/images/2025/01/unnamed.webp" medium="image"/><content:encoded><![CDATA[<img src="https://smartblog.name/content/images/2025/01/unnamed.webp" alt="Enabling always-on VPN for Tailscale on AndroidTV"><p>To enable the Always-On VPN feature for Tailscale:</p><pre><code>adb shell settings put secure always_on_vpn_app com.tailscale.ipn</code></pre><p>Explanation:</p><p>With an ADB command it is possible to enable the Always-On VPN feature of Android for Tailscale. This feature should be available since Android 7 or FireOS 6.</p><p>The following steps are required to enable it:</p><ol><li>Install ADB (Android Debug Bridge).</li><li>Change to the ADB directory using the Windows CMD or the Windows or Linux Terminal using the CD command.</li><li>Find out the (local) IP address of your Android TV or FireTV. Enable ADB debugging in the TV device settings.</li><li>Run the following command and replace &quot;IP&quot; with the (local) IP of your device (for Windows, add &quot;.exe&quot; after &quot;adb&quot;) and then allow the connection on the TV:</li></ol><pre><code>adb connect &lt;IP&gt;</code></pre><ol start="5"><li>run the following command</li></ol><pre><code>adb shell settings put secure always_on_vpn_app com.tailscale.ipn</code></pre><ol start="6"><li>Confirm by running the below command:</li></ol><pre><code>./adb shell settings list secure</code></pre><p> And looking for the following:</p><blockquote>always_on_vpn_app=com.tailscale.ipn</blockquote><p><br><strong>Bonus</strong>:<br>Two other usefull commands, but as far as I know they are not necessary because they are already disabled by default, but for the sake of completeness I list them here. <br><br>The first disables the VPN lockdown feature, i.e. no data can be transferred without an active VPN connection. If this were active (set to 1) and no exit node was set up in Tailscale, Internet access would no longer work, which is logical since Tailscale does not normally route normal Internet connections outside its own tailnet. The second command removes all applications that are exempt from the VPN lockdown feature from the whitelist.</p><pre><code>adb shell settings put secure always_on_vpn_lockdown 0</code></pre><pre><code>adb shell settings put secure always_on_vpn_lockdown_whitelist</code></pre><p><br>Source for reference:<br><a href="https://github.com/tailscale/tailscale/issues/7824?ref=smartblog.name">https://github.com/tailscale/tailscale/issues/7824</a></p>]]></content:encoded></item><item><title><![CDATA[How to Set Up a Let’s Encrypt Certificate for Plex Media Server  using a DNS Challenge]]></title><description><![CDATA[<h3 id></h3><p>Serving your Plex Media Server over HTTPS ensures that your media streams securely to your devices. Let&#x2019;s Encrypt offers free SSL/TLS certificates that can be integrated into Plex. Here&#x2019;s a step-by-step guide to set this up:</p><h3 id="step-1-prerequisites">Step 1: Prerequisites</h3><p>Before getting started, ensure you have:</p>]]></description><link>https://smartblog.name/how-to-set-up-a-lets-encrypt-certificate-for-plex-media-server-using-a-dns-challenge/</link><guid isPermaLink="false">6762f94c24aa3e0001760edb</guid><dc:creator><![CDATA[admin]]></dc:creator><pubDate>Wed, 18 Dec 2024 17:26:17 GMT</pubDate><content:encoded><![CDATA[<h3 id></h3><p>Serving your Plex Media Server over HTTPS ensures that your media streams securely to your devices. Let&#x2019;s Encrypt offers free SSL/TLS certificates that can be integrated into Plex. Here&#x2019;s a step-by-step guide to set this up:</p><h3 id="step-1-prerequisites">Step 1: Prerequisites</h3><p>Before getting started, ensure you have:</p><ul><li>A domain name.</li><li>Access to the server where Plex Media Server is installed.</li><li>Administrative privileges on the server.</li><li>Basic knowledge of the terminal (for Linux-based servers).</li></ul><p></p><h3 id="step-2-install-certbot">Step 2: Install Certbot</h3><p><em>Certbot</em> is a tool provided by the Electronic Frontier Foundation (EFF) to easily generate Let&#x2019;s Encrypt certificates.</p><p>Update your package manager:</p><pre><code>sudo apt update
sudo apt upgrade</code></pre><p>Install Certbot:</p><pre><code>sudo apt install certbot</code></pre><p>The above instructions are for Ubuntu/Debian.<br>For other operating systems, consult the&#xA0;<a>Certbot installation instructions</a>.</p><p></p><h3 id="step-3-installing-acme-dns-certbot"><strong>Step</strong> 3:&#xA0;Installing acme-dns-certbot</h3><p>Start by downloading a copy of the script:</p><pre><code class="language-bash">wget https://github.com/joohoi/acme-dns-certbot-joohoi/raw/master/acme-dns-auth.py</code></pre><p>Change the script permissions:</p><pre><code>chmod +x acme-dns-auth.py</code></pre><p>Then, edit the file using your favorite text editor and adjust the first line in order to force it to use Python 3:</p><pre><code>nano acme-dns-auth.py</code></pre><p>Add a&#xA0;<code>3</code>&#xA0;to the end of the first line:</p><pre><code>#!/usr/bin/env python3
. . .
</code></pre><p>This is required in order to ensure that the script uses the latest supported version of Python 3, rather than the legacy Python version 2.</p><p>Once complete, save and close the file.</p><p>Finally, move the script into the Certbot Let&#x2019;s Encrypt directory so that Certbot can load it:</p><pre><code class="language-bash">sudo mv acme-dns-auth.py /etc/letsencrypt/</code></pre><p></p><h3 id="step-4-request-a-certificate-using-certbot-and-acme-dns-auth">Step 4: Request a certificate using certbot and acme-dns-auth</h3><p>Now that we have all in place, we can request the new certificate using certbot and acme-dns-auth using a DNS challenge.</p><pre><code class="language-bash">sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d your-domain.com</code></pre><p>After running the above command, you will get something like this:</p><pre><code>Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for *.your-domain.com
Hook &apos;--manual-auth-hook&apos; for your-domain.com ran with output:
 Please add the following CNAME record to your main DNS zone:
 _acme-challenge.your-domain.com CNAME 48a2f6b4-3541-4053-cghf-8392805d8748.auth.acme-dns.io.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Challenges loaded. Press continue to submit to CA. Pass &quot;-v&quot; for more info about
challenges.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue</code></pre><p>You will now need to go to your DNS provider and create the DNS record described above:<br><br><code>_acme-challenge.your-domain.com CNAME 48a2f6b4-3541-4053-cghf-8392805d8748.auth.acme-dns.io.</code></p><p>Once the record is in place, click Enter and wait for the certificate to be provisioned and downloaded.</p><p></p><h3 id="step-5-export-the-new-certificate-to-a-plex-friendly-format">Step 5: Export the new certificate to a &quot;Plex friendly&quot; format</h3><p>The below code for openssl will take the cert data, the private key and the certificate chain and export it in pkcs12 format:</p><pre><code>sudo openssl pkcs12 -export -out ~/plex_certificate.pfx \
    -inkey /etc/letsencrypt/live/your-domain.com/privkey.pem \
    -in /etc/letsencrypt/live/your-domain.com/cert.pem \
    -certfile /etc/letsencrypt/live/your-domain.com/chain.pem</code></pre><p>This will ask you for your sudo password and an export passkey.<br>Make sure you choose a key that you&apos;re comfortable having stored in plain text in your Plex server.</p><p>All that is left to do is to move the new cert to its final destination.</p><pre><code>sudo mv ~/plex_certificate.pfx /var/lib/plexmediaserver/certs
</code></pre><p>Note: you can change the path where the certificate will be stored, just make sure you take note of it.</p><h3 id="step-6-configure-plex-to-use-the-new-certificate-to-serve-secure-requests">Step 6: Configure Plex to use the new certificate to serve secure requests</h3><p>Navigate to your Plex &gt; Settings &gt; Network and edit with the details of your certificate:</p><figure class="kg-card kg-image-card"><img src="https://smartblog.name/content/images/2024/12/plex_settings.png" class="kg-image" alt loading="lazy" width="2000" height="877" srcset="https://smartblog.name/content/images/size/w600/2024/12/plex_settings.png 600w, https://smartblog.name/content/images/size/w1000/2024/12/plex_settings.png 1000w, https://smartblog.name/content/images/size/w1600/2024/12/plex_settings.png 1600w, https://smartblog.name/content/images/2024/12/plex_settings.png 2026w" sizes="(min-width: 720px) 720px"></figure><p></p><p></p>]]></content:encoded></item></channel></rss>