<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: IMLotso</title>
    <description>The latest articles on DEV Community by IMLotso (@imlotso).</description>
    <link>https://dev.to/imlotso</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4180825%2Fe62301f2-2c9f-46d3-8e7d-60c395d124a9.jpg</url>
      <title>DEV Community: IMLotso</title>
      <link>https://dev.to/imlotso</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/imlotso"/>
    <language>en</language>
    <item>
      <title>Automating Discourse SEO with IndexNow</title>
      <dc:creator>IMLotso</dc:creator>
      <pubDate>Tue, 20 Oct 2026 03:46:55 +0000</pubDate>
      <link>https://dev.to/imlotso/i-built-a-discourse-plugin-to-automatically-submit-new-topics-to-search-engines-1dd3</link>
      <guid>https://dev.to/imlotso/i-built-a-discourse-plugin-to-automatically-submit-new-topics-to-search-engines-1dd3</guid>
      <description>&lt;h1&gt;
  
  
  I Built a Discourse Plugin to Automatically Submit New Topics to Search Engines
&lt;/h1&gt;

&lt;p&gt;If you run a Discourse forum, you've probably experienced this: someone publishes a new topic, but it takes a while before search engines even discover the page.&lt;/p&gt;

&lt;p&gt;Discourse already has sitemaps, and they work fine. But I wanted something a little more proactive.&lt;/p&gt;

&lt;p&gt;Instead of waiting for a search engine to crawl my forum, why not tell it whenever something changes?&lt;/p&gt;

&lt;p&gt;That's what got me interested in &lt;a href="https://www.indexnow.org/" rel="noopener noreferrer"&gt;IndexNow&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I ended up building an open-source Discourse plugin called &lt;strong&gt;discourse-indexnow&lt;/strong&gt; to automate the whole process.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Waiting for Crawlers
&lt;/h2&gt;

&lt;p&gt;Discourse forums generate a lot of dynamic content.&lt;/p&gt;

&lt;p&gt;People create new topics, edit posts, reply to discussions, and sometimes delete old content.&lt;/p&gt;

&lt;p&gt;Traditional XML sitemaps help search engines discover URLs, but they don't immediately notify search engines when something changes.&lt;/p&gt;

&lt;p&gt;For smaller forums, especially newer communities, this can be frustrating.&lt;/p&gt;

&lt;p&gt;You might publish a useful technical guide today, but have no idea when a search engine will discover it.&lt;/p&gt;

&lt;p&gt;I wanted a way to reduce that delay without manually submitting URLs every time I published something.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, What Is IndexNow?
&lt;/h2&gt;

&lt;p&gt;IndexNow is an open protocol that lets websites notify participating search engines when URLs are added, updated, or deleted.&lt;/p&gt;

&lt;p&gt;Instead of relying entirely on periodic crawling, your website can send a notification when something changes.&lt;/p&gt;

&lt;p&gt;For example, an IndexNow batch request looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"host"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"forum.example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-indexnow-api-key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"urlList"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://forum.example.com/t/example-topic/123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://forum.example.com/t/another-topic/456"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Search engines such as Bing and Yandex support the protocol.&lt;/p&gt;

&lt;p&gt;One important thing to understand: &lt;strong&gt;IndexNow doesn't guarantee indexing or better rankings.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It simply helps participating search engines discover changes sooner.&lt;/p&gt;

&lt;p&gt;Also, Google doesn't currently support IndexNow, so you should still maintain your sitemap and existing SEO practices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building discourse-indexnow
&lt;/h2&gt;

&lt;p&gt;I wanted the integration to work directly inside Discourse rather than relying on an external cron job or a separate automation service.&lt;/p&gt;

&lt;p&gt;The basic idea was simple:&lt;/p&gt;

&lt;p&gt;When something happens to a public topic, the plugin determines whether its URL should be submitted and then handles the IndexNow notification in the background.&lt;/p&gt;

&lt;p&gt;But once I started thinking about real forum activity, there were a few more things to consider.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Automatically submit new and updated topics
&lt;/h3&gt;

&lt;p&gt;This was the main feature I wanted.&lt;/p&gt;

&lt;p&gt;When someone creates a public topic, the plugin automatically submits its URL.&lt;/p&gt;

&lt;p&gt;When the first post is edited or important topic attributes change, the URL can be submitted again.&lt;/p&gt;

&lt;p&gt;It also handles deleted topics, allowing participating search engines to discover that the original URL may no longer be available.&lt;/p&gt;

&lt;p&gt;No need to copy URLs or manually open a webmaster dashboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Handle replies and paginated topics
&lt;/h3&gt;

&lt;p&gt;Here's something that makes forums a little different from regular blogs.&lt;/p&gt;

&lt;p&gt;A discussion can grow across multiple pages.&lt;/p&gt;

&lt;p&gt;If a new reply appears on page three, submitting only the main topic URL might not be the most useful approach.&lt;/p&gt;

&lt;p&gt;So I added optional reply-triggered submissions.&lt;/p&gt;

&lt;p&gt;The plugin can submit the URL of the page containing the new reply.&lt;/p&gt;

&lt;p&gt;To avoid flooding IndexNow with notifications on busy discussions, there's also a configurable cooldown for each URL.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Support multilingual topics
&lt;/h3&gt;

&lt;p&gt;Discourse supports content localization, and I wanted the plugin to work with it.&lt;/p&gt;

&lt;p&gt;If a topic has localized versions available to crawlers, the plugin can submit the relevant localized URLs alongside the original.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://forum.example.com/t/example/123
https://forum.example.com/t/example/123?tl=es
https://forum.example.com/t/example/123?tl=fr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are illustrative URLs; the plugin uses the locale parameters actually configured in Discourse.&lt;/p&gt;

&lt;p&gt;Rather than making a separate request for every language, the URLs can be grouped into one batch.&lt;/p&gt;

&lt;p&gt;This was especially useful for making the integration work with multilingual communities.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Don't accidentally submit private content
&lt;/h3&gt;

&lt;p&gt;This was one of the most important design considerations.&lt;/p&gt;

&lt;p&gt;A forum isn't just a collection of public blog posts.&lt;/p&gt;

&lt;p&gt;Discourse can contain private messages, restricted categories, unlisted topics, and other content that shouldn't be sent to search engines.&lt;/p&gt;

&lt;p&gt;The plugin checks whether a URL is eligible before submitting it.&lt;/p&gt;

&lt;p&gt;It also supports additional category and tag exclusions.&lt;/p&gt;

&lt;p&gt;The goal is to make automatic submission useful without exposing URLs that should remain private.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Add rate limiting and retry handling
&lt;/h3&gt;

&lt;p&gt;Automating URL submission sounds easy until you think about what happens on a busy forum.&lt;/p&gt;

&lt;p&gt;Imagine hundreds of topics being updated in a short period.&lt;/p&gt;

&lt;p&gt;You don't want every event generating unlimited API requests.&lt;/p&gt;

&lt;p&gt;So I added:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hourly and daily submission limits&lt;/li&gt;
&lt;li&gt;Per-URL cooldowns&lt;/li&gt;
&lt;li&gt;Batch submissions&lt;/li&gt;
&lt;li&gt;Handling for HTTP 429 responses&lt;/li&gt;
&lt;li&gt;Retry delays based on the API response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The plugin also splits large batches to respect IndexNow's 10,000-URL-per-request limit.&lt;/p&gt;

&lt;p&gt;All of this happens asynchronously, so submissions don't need to block normal forum interactions.&lt;/p&gt;

&lt;h2&gt;
  
  
  An Admin Dashboard Makes Things Easier
&lt;/h2&gt;

&lt;p&gt;I also wanted to know whether the integration was actually working.&lt;/p&gt;

&lt;p&gt;Just sending API requests and hoping for the best didn't seem like a great solution.&lt;/p&gt;

&lt;p&gt;So the plugin includes an admin interface that displays:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Successful and failed submissions&lt;/li&gt;
&lt;li&gt;Submission history and trigger reasons&lt;/li&gt;
&lt;li&gt;Hourly and daily quota usage&lt;/li&gt;
&lt;li&gt;Seven-day activity trends&lt;/li&gt;
&lt;li&gt;Error categories&lt;/li&gt;
&lt;li&gt;API key verification status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also supports manual URL submission and historical backfills.&lt;/p&gt;

&lt;p&gt;For example, if you install the plugin on a forum that already has hundreds of public topics, you can select a category and date range, preview the matching topics, and submit them in batches.&lt;/p&gt;

&lt;p&gt;That's much more convenient than submitting existing URLs one at a time.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Install It
&lt;/h2&gt;

&lt;p&gt;The plugin is open source and available on GitHub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/imlotso/discourse-indexnow" rel="noopener noreferrer"&gt;imlotso/discourse-indexnow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After installing the plugin using the standard Discourse plugin installation process and rebuilding your container, open:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Admin &amp;gt; Plugins &amp;gt; discourse-indexnow&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;From there, generate an IndexNow API key and enable submissions.&lt;/p&gt;

&lt;p&gt;You'll also need to verify that the key file is publicly accessible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://your-forum-domain.com/&amp;lt;your-key&amp;gt;.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The endpoint should return HTTP 200 and the key as its response body.&lt;/p&gt;

&lt;p&gt;The plugin provides a built-in check for this.&lt;/p&gt;

&lt;p&gt;I've also written a more detailed guide covering the plugin's features, configuration options, URL filtering, and troubleshooting.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://www.sitetalk.net/t/topic/642" rel="noopener noreferrer"&gt;Discourse IndexNow Plugin — Complete Setup Guide and Feature Overview&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That guide includes the configuration reference and explains how each submission mechanism works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does This Actually Improve SEO?
&lt;/h2&gt;

&lt;p&gt;This is probably the most important question.&lt;/p&gt;

&lt;p&gt;IndexNow can help supported search engines learn about new or updated content faster.&lt;/p&gt;

&lt;p&gt;But notifying a search engine isn't the same thing as getting indexed.&lt;/p&gt;

&lt;p&gt;And getting indexed isn't the same thing as ranking well.&lt;/p&gt;

&lt;p&gt;Content quality, crawlability, internal linking, canonical URLs, and many other SEO factors still matter.&lt;/p&gt;

&lt;p&gt;I see IndexNow as an additional discovery mechanism rather than a replacement for traditional SEO.&lt;/p&gt;

&lt;p&gt;For an active Discourse community, reducing the time between publishing content and notifying search engines seems like a useful improvement.&lt;/p&gt;

&lt;p&gt;Whether that translates into better organic search performance is something worth measuring separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  It's Open Source
&lt;/h2&gt;

&lt;p&gt;I originally built this plugin for my own Discourse forum, &lt;a href="https://www.sitetalk.net/t/topic/642" rel="noopener noreferrer"&gt;SiteTalk&lt;/a&gt;, and it's already running in production there.&lt;/p&gt;

&lt;p&gt;The project is independently developed, not an official Discourse plugin.&lt;/p&gt;

&lt;p&gt;It's available under the MIT license, with automated tests and CI configured for development.&lt;/p&gt;

&lt;p&gt;If you're running a Discourse community and want automatic IndexNow submissions, feel free to check it out:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/imlotso/discourse-indexnow" rel="noopener noreferrer"&gt;https://github.com/imlotso/discourse-indexnow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Issues, suggestions, and contributions are welcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  One Question for Other Forum Owners
&lt;/h2&gt;

&lt;p&gt;I'm curious how other people approach search engine discovery for community-generated content.&lt;/p&gt;

&lt;p&gt;Do you mostly rely on XML sitemaps and normal crawling, or have you tried IndexNow or another push-based solution?&lt;/p&gt;

&lt;p&gt;And if you've used IndexNow on a forum, have you noticed any measurable improvement in discovery or indexing times?&lt;/p&gt;

&lt;p&gt;I'd be interested to hear what has worked for you.&lt;/p&gt;

</description>
      <category>discourse</category>
      <category>seo</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Automatically Sync SSL Certificates from 1Panel to SafeLine WAF</title>
      <dc:creator>IMLotso</dc:creator>
      <pubDate>Sun, 18 Oct 2026 09:01:31 +0000</pubDate>
      <link>https://dev.to/imlotso/how-to-automatically-sync-ssl-certificates-from-1panel-to-safeline-waf-2kb6</link>
      <guid>https://dev.to/imlotso/how-to-automatically-sync-ssl-certificates-from-1panel-to-safeline-waf-2kb6</guid>
      <description>&lt;p&gt;Managing SSL certificates across multiple services can quickly become a repetitive maintenance task, especially when your web infrastructure includes a hosting control panel, a reverse proxy, and a Web Application Firewall (WAF).&lt;/p&gt;

&lt;p&gt;If you're using &lt;strong&gt;1Panel&lt;/strong&gt; to manage SSL certificates and &lt;strong&gt;SafeLine WAF&lt;/strong&gt; to protect your websites, you've probably encountered a common issue: certificates renew automatically in 1Panel, but the WAF may still be serving an older certificate.&lt;/p&gt;

&lt;p&gt;Fortunately, this process can be automated using Python and SafeLine's OpenAPI.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: SSL Renewal Doesn't Always Mean SSL Deployment
&lt;/h2&gt;

&lt;p&gt;Let's consider a typical self-hosted infrastructure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1Panel&lt;/strong&gt; manages websites and automatically renews SSL certificates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SafeLine WAF&lt;/strong&gt; filters malicious traffic before requests reach your applications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Let's Encrypt&lt;/strong&gt; provides free SSL certificates.&lt;/li&gt;
&lt;li&gt;A scheduled task handles routine infrastructure maintenance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even when 1Panel successfully renews a certificate, SafeLine might continue using the previously uploaded version.&lt;/p&gt;

&lt;p&gt;This creates an unnecessary operational dependency: someone must manually upload the new certificate to the WAF.&lt;/p&gt;

&lt;p&gt;For infrastructure administrators managing multiple domains, this is both inconvenient and error-prone.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Better Approach: Automate Certificate Synchronization
&lt;/h2&gt;

&lt;p&gt;Instead of manually replacing certificates, we can create a small Python automation that checks whether SafeLine's certificate matches the latest version stored by 1Panel.&lt;/p&gt;

&lt;p&gt;The overall workflow is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;1Panel automatically renews an SSL certificate.&lt;/li&gt;
&lt;li&gt;The updated certificate and private key are saved locally.&lt;/li&gt;
&lt;li&gt;A Python script reads the certificate files.&lt;/li&gt;
&lt;li&gt;The script retrieves the currently configured certificate from SafeLine's API.&lt;/li&gt;
&lt;li&gt;Both certificates are compared using their serial numbers.&lt;/li&gt;
&lt;li&gt;If they differ, the script updates the certificate through OpenAPI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach avoids unnecessary API updates and eliminates repeated manual uploads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Compare Certificate Serial Numbers?
&lt;/h2&gt;

&lt;p&gt;A simple automation might compare expiration dates or file modification timestamps.&lt;/p&gt;

&lt;p&gt;However, these methods are not always reliable.&lt;/p&gt;

&lt;p&gt;A certificate's serial number provides a more direct way to identify whether two certificates are the same.&lt;/p&gt;

&lt;p&gt;With Python's &lt;code&gt;cryptography&lt;/code&gt; library, extracting the serial number is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;cryptography&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;x509&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/path/to/fullchain.pem&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;certificate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x509&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_pem_x509_certificate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;certificate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;serial_number&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script can compare this value against the certificate currently stored in SafeLine.&lt;/p&gt;

&lt;p&gt;If the values match, no update is necessary.&lt;/p&gt;

&lt;p&gt;If they differ, the certificate can be replaced using the existing certificate ID.&lt;/p&gt;

&lt;p&gt;This makes the synchronization process efficient and repeatable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using SafeLine's OpenAPI
&lt;/h2&gt;

&lt;p&gt;SafeLine provides certificate management endpoints that can be used for automation.&lt;/p&gt;

&lt;p&gt;The relevant API operations include:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/open/cert&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List certificates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/open/cert/{id}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Retrieve certificate details&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/open/cert&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create or update certificates&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A Python script can interact with these endpoints using the &lt;code&gt;requests&lt;/code&gt; library.&lt;/p&gt;

&lt;p&gt;For manually managed certificates, the update request includes the existing certificate ID, certificate content, and private key.&lt;/p&gt;

&lt;p&gt;An important detail is to &lt;strong&gt;preserve the existing certificate ID&lt;/strong&gt; rather than creating a new certificate every time.&lt;/p&gt;

&lt;p&gt;This prevents unnecessary certificate entries from accumulating in SafeLine.&lt;/p&gt;

&lt;p&gt;The automation should also avoid modifying certificates managed internally through ACME.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full Implementation and Configuration
&lt;/h2&gt;

&lt;p&gt;I documented a working implementation that connects 1Panel certificate renewal with SafeLine WAF certificate management.&lt;/p&gt;

&lt;p&gt;The guide includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A complete Python synchronization script&lt;/li&gt;
&lt;li&gt;Support for multiple domains&lt;/li&gt;
&lt;li&gt;Certificate serial-number comparison&lt;/li&gt;
&lt;li&gt;SafeLine OpenAPI authentication&lt;/li&gt;
&lt;li&gt;Dry-run testing before applying changes&lt;/li&gt;
&lt;li&gt;Scheduled execution through 1Panel&lt;/li&gt;
&lt;li&gt;Troubleshooting API requests blocked by SafeLine&lt;/li&gt;
&lt;li&gt;Security considerations for API tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;You can find the complete implementation here:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://www.sitetalk.net/t/topic/648" rel="noopener noreferrer"&gt;Automating SafeLine WAF SSL Certificate Updates with 1Panel — Full Python Script and Setup Guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The guide also explains how to handle an issue that may occur when the SafeLine management interface is protected by its own WAF.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Issue: HTTP 467 When Calling the API
&lt;/h2&gt;

&lt;p&gt;One interesting challenge with this setup is that SafeLine can block automation requests to its own management interface.&lt;/p&gt;

&lt;p&gt;In some configurations, API requests may return HTTP 467 rather than the expected API response.&lt;/p&gt;

&lt;p&gt;This typically indicates that a WAF protection rule intercepted the request before it reached the API.&lt;/p&gt;

&lt;p&gt;A practical solution is to create a narrowly scoped allow rule:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Restrict the source to the automation server's public IP.&lt;/li&gt;
&lt;li&gt;Limit the permitted path to &lt;code&gt;/api/open/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Avoid creating unrestricted exceptions for the entire management interface.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a CDN or reverse proxy is involved, ensure SafeLine is configured to identify the real client IP correctly.&lt;/p&gt;

&lt;p&gt;Avoid disabling TLS verification as a routine workaround. A properly trusted HTTPS endpoint is preferable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scheduling the Automation
&lt;/h2&gt;

&lt;p&gt;Once the script is tested, it can run through 1Panel's scheduled task system.&lt;/p&gt;

&lt;p&gt;A weekly schedule may be sufficient for many deployments, provided it runs after certificate renewal and the acceptable deployment delay is understood.&lt;/p&gt;

&lt;p&gt;For more demanding environments, an event-triggered workflow or more frequent checks may be appropriate.&lt;/p&gt;

&lt;p&gt;A good synchronization script should be idempotent: running it repeatedly should not cause unnecessary certificate changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security Considerations
&lt;/h2&gt;

&lt;p&gt;Certificate automation handles sensitive private keys and privileged API credentials.&lt;/p&gt;

&lt;p&gt;Before deploying it to production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep API tokens outside publicly accessible source code.&lt;/li&gt;
&lt;li&gt;Restrict configuration file permissions.&lt;/li&gt;
&lt;li&gt;Use HTTPS with proper certificate validation.&lt;/li&gt;
&lt;li&gt;Limit access to SafeLine's management API.&lt;/li&gt;
&lt;li&gt;Avoid logging private keys or authentication tokens.&lt;/li&gt;
&lt;li&gt;Test the automation with a dry run before enabling updates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Automation should reduce operational risk, not introduce new security vulnerabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;SSL certificate renewal is only one part of certificate lifecycle management.&lt;/p&gt;

&lt;p&gt;When multiple services terminate HTTPS connections, renewed certificates must also be propagated to the components that actually serve them.&lt;/p&gt;

&lt;p&gt;By combining 1Panel, Python, and SafeLine OpenAPI, you can build a lightweight certificate synchronization workflow without adding another complex infrastructure service.&lt;/p&gt;

&lt;p&gt;For the complete working script and detailed configuration steps, see the &lt;a href="https://www.sitetalk.net/t/topic/648" rel="noopener noreferrer"&gt;original 1Panel and SafeLine WAF automation tutorial on SiteTalk&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you're managing self-hosted infrastructure, this is a useful way to eliminate one more recurring maintenance task.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>python</category>
      <category>security</category>
      <category>automation</category>
    </item>
    <item>
      <title>Why Is My Forum So Quiet?</title>
      <dc:creator>IMLotso</dc:creator>
      <pubDate>Tue, 13 Oct 2026 03:17:04 +0000</pubDate>
      <link>https://dev.to/imlotso/why-is-my-forum-so-quiet-1ne6</link>
      <guid>https://dev.to/imlotso/why-is-my-forum-so-quiet-1ne6</guid>
      <description>&lt;p&gt;Hey everyone! This is my first post on DEV 👋&lt;/p&gt;

&lt;p&gt;I run a forum where I’d love to get developers and sysadmins chatting, but right now… it’s mostly just me posting 😂&lt;/p&gt;

&lt;p&gt;Honestly, it’s not just about traffic. I’d love to have a few regulars who come back, share what they’re working on, ask questions, or just hang out. Instead, it sometimes feels like I’m writing a personal blog with a comment section.&lt;/p&gt;

&lt;p&gt;Maybe the topics aren’t clicking, or maybe people already have their favorite places to hang out. I’m still trying to figure it out.&lt;/p&gt;

&lt;p&gt;Anyway, I’m hoping to meet some fellow devs and Linux/DevOps folks here, swap stories, and talk about things we’re building—or breaking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes you stick around in a tech community?&lt;/strong&gt; If you’ve ever started a forum or community, I’d love to hear how it went for you.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxwsdtrvs5jlgrwzp8wny.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxwsdtrvs5jlgrwzp8wny.png" alt="Sitetalk Forum" width="800" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>community</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
