<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>AI Crawler on miti99</title><link>https://miti99.com/tags/ai-crawler/</link><description>Recent content in AI Crawler on miti99</description><generator>Hugo -- gohugo.io</generator><language>vi</language><lastBuildDate>Thu, 29 Oct 2026 23:21:36 +0700</lastBuildDate><atom:link href="https://miti99.com/tags/ai-crawler/index.xml" rel="self" type="application/rss+xml"/><item><title>Khi AI crawler đi dạo khắp Gitea tự host của mình</title><link>https://miti99.com/post/2026/10/29/</link><pubDate>Thu, 29 Oct 2026 00:00:00 +0700</pubDate><guid>https://miti99.com/post/2026/10/29/</guid><description>&lt;p&gt;Mình tự host một Gitea trên con server OCI Always Free, chủ yếu để làm bản backup mirror cho các repo trên GitHub. Mình cứ nghĩ nó là góc nhỏ chẳng ai để ý. Hóa ra có ba &amp;ldquo;vị khách&amp;rdquo; ghé thăm rất chăm chỉ: ClaudeBot, GPTBot và Reflectionbot. Bài này ghi lại chuyện mình phát hiện ra, đoán nguyên nhân thế nào, xử lý ra sao và đang theo dõi tiếp như thế nào.&lt;/p&gt;
&lt;h2 id="phát-hiện"&gt;Phát hiện
&lt;/h2&gt;&lt;p&gt;Sáng 29/10/2026, mình để ý server bên Nhật (chạy Gitea) bận bất thường. Mở access log của Traefik ra xem thì thấy log xoay vòng rất nhanh: phần còn giữ lại chỉ phủ khoảng 4,5 tiếng (từ 17:55 đến 22:22 UTC ngày 28/10), nhưng trong khoảng đó đã có &lt;strong&gt;86.765 request&lt;/strong&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;User agent&lt;/th&gt;
&lt;th&gt;Số request&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ClaudeBot (Anthropic)&lt;/td&gt;
&lt;td&gt;39.860&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPTBot (OpenAI)&lt;/td&gt;
&lt;td&gt;26.901&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reflectionbot (Reflection AI)&lt;/td&gt;
&lt;td&gt;16.412&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bun (chính gitea-mirror của mình đang sync)&lt;/td&gt;
&lt;td&gt;3.587&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Còn lại (DuckDuckBot, OAI-SearchBot)&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Khoảng 95% response 200 là các trang &lt;code&gt;src&lt;/code&gt;, &lt;code&gt;commit&lt;/code&gt;, &lt;code&gt;raw&lt;/code&gt; của 86 repo mirror. Nói cách khác, các crawler đang đi qua &lt;strong&gt;từng commit của từng repo&lt;/strong&gt;, mỗi commit là vài trang, nên con số mới lớn như vậy.&lt;/p&gt;
&lt;p&gt;Nhìn rộng ra cả tháng thì mọi thứ còn rõ hơn. Traffic gần như bằng 0 cho đến ngày 10/10, rồi từ 11/10 vọt lên và giữ ở mức cao suốt từ đó:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://miti99.com/post/2026/10/29/requests-by-day.png"
width="1280"
height="267"
srcset="https://miti99.com/post/2026/10/29/requests-by-day_hu_60b149c1ee35a125.png 480w, https://miti99.com/post/2026/10/29/requests-by-day_hu_e07e807b55352c53.png 1024w"
loading="lazy"
alt="Số request theo ngày, từ 30/9 đến 28/10"
class="gallery-image"
data-flex-grow="479"
data-flex-basis="1150px"
&gt;&lt;/p&gt;
&lt;p&gt;Tổng cộng gần &lt;strong&gt;13,9 triệu request&lt;/strong&gt; và &lt;strong&gt;1,48 TB&lt;/strong&gt; băng thông, cho một con Gitea chỉ có mình mình dùng:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://miti99.com/post/2026/10/29/traffic-overview.png"
width="1280"
height="150"
srcset="https://miti99.com/post/2026/10/29/traffic-overview_hu_aa320de0ce69d149.png 480w, https://miti99.com/post/2026/10/29/traffic-overview_hu_98412e797889e0e4.png 1024w"
loading="lazy"
alt="Tổng quan traffic: request, unique visitor, băng thông, error rate, P95 latency"
class="gallery-image"
data-flex-grow="853"
data-flex-basis="2048px"
&gt;&lt;/p&gt;
&lt;p&gt;Gần như toàn bộ là bot, và gần như toàn bộ đến từ Mỹ:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://miti99.com/post/2026/10/29/client-types.png"
width="363"
height="269"
srcset="https://miti99.com/post/2026/10/29/client-types_hu_eef9ab49065ec456.png 480w, https://miti99.com/post/2026/10/29/client-types_hu_1b8bd6cb370410b1.png 1024w"
loading="lazy"
alt="Tỉ lệ loại client: gần như toàn bộ là Bot"
class="gallery-image"
data-flex-grow="134"
data-flex-basis="323px"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://miti99.com/post/2026/10/29/traffic-by-country.png"
width="843"
height="69"
srcset="https://miti99.com/post/2026/10/29/traffic-by-country_hu_39bbd4b8c8d3d5bd.png 480w, https://miti99.com/post/2026/10/29/traffic-by-country_hu_b249a313b709d4aa.png 1024w"
loading="lazy"
alt="Traffic theo quốc gia: United States chiếm 13,51 triệu request"
class="gallery-image"
data-flex-grow="1221"
data-flex-basis="2932px"
&gt;&lt;/p&gt;
&lt;p&gt;Riêng ClaudeBot đã chiếm 10,82 triệu request và 1,4 TB, GPTBot thêm 2,52 triệu request:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://miti99.com/post/2026/10/29/ai-bots.png"
width="696"
height="188"
srcset="https://miti99.com/post/2026/10/29/ai-bots_hu_696f3c7e4552e319.png 480w, https://miti99.com/post/2026/10/29/ai-bots_hu_e9769eb02611e726.png 1024w"
loading="lazy"
alt="Bảng AI agents &amp; bots: ClaudeBot và GPTBot"
class="gallery-image"
data-flex-grow="370"
data-flex-basis="888px"
&gt;&lt;/p&gt;
&lt;h2 id="đoán-nguyên-nhân"&gt;Đoán nguyên nhân
&lt;/h2&gt;&lt;p&gt;Câu hỏi đầu tiên là: có ai lấy được tài khoản của mình không? Mình kiểm tra lại log:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Toàn bộ request đều ẩn danh, không có request nào đăng nhập.&lt;/li&gt;
&lt;li&gt;Không có client bên ngoài nào gửi POST, PATCH, push hay gọi API. Tất cả lệnh ghi đều đến từ chính server, tức là gitea-mirror đang sync.&lt;/li&gt;
&lt;li&gt;Ba crawler đều là hàng thật: IP của GPTBot nằm trong danh sách OpenAI công bố, ClaudeBot nằm trong dải IP của Anthropic, còn Reflectionbot có reverse DNS trỏ về &lt;code&gt;reflection.ai&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://miti99.com/post/2026/10/29/crawler-verification.png"
width="824"
height="195"
srcset="https://miti99.com/post/2026/10/29/crawler-verification_hu_1c9c5406e135c849.png 480w, https://miti99.com/post/2026/10/29/crawler-verification_hu_5b93fa1c21f024f9.png 1024w"
loading="lazy"
alt="Kiểm chứng ba crawler: Reflectionbot, GPTBot và ClaudeBot đều là bot thật"
class="gallery-image"
data-flex-grow="422"
data-flex-basis="1014px"
&gt;&lt;/p&gt;
&lt;p&gt;Vậy tài khoản không lộ. Đây là crawl bình thường, đúng nghĩa đen: mỗi bot đều hỏi &lt;code&gt;/robots.txt&lt;/code&gt; trước, nhận về 404 (tức là &amp;ldquo;cứ crawl thoải mái&amp;rdquo;), rồi Gitea phục vụ các trang public cho người dùng ẩn danh với HTTP 200. Không có gì để report abuse cả, lỗi nằm ở phía mình.&lt;/p&gt;
&lt;p&gt;Nhưng có một chuyện tệ hơn: &lt;strong&gt;một repo private đã bị lộ&lt;/strong&gt;. Một repo private trên GitHub lại có bản mirror &lt;strong&gt;public&lt;/strong&gt; trên Gitea, và Reflectionbot đã lấy 48 trang của nó. Lần theo thì ra là gitea-mirror dùng lại một bản ghi cũ:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Lúc đầu, tên repo đó thuộc về một repo public. gitea-mirror import nó và ghi lại cờ &lt;code&gt;is_private = 0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Repo public đó sau này chuyển sang namespace khác.&lt;/li&gt;
&lt;li&gt;Mình tạo một repo &lt;strong&gt;private&lt;/strong&gt; mới trùng tên cũ. Bản ghi cũ vẫn trỏ vào URL đó với cờ public, và gitea-mirror coi hai repo là một nên không đọc lại visibility.&lt;/li&gt;
&lt;li&gt;Gitea pull mirror theo URL bằng GitHub token, nên từ đó repo public trên Gitea chứa nội dung của repo private mới.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Setting &lt;code&gt;visibility: &amp;quot;private&amp;quot;&lt;/code&gt; trong config của gitea-mirror cũng không cứu được, vì nó chỉ áp dụng cho các org mà gitea-mirror tạo ra, còn repo vẫn lấy cờ private của GitHub tại thời điểm import.&lt;/p&gt;
&lt;p&gt;Mình kiểm tra lại toàn bộ: chỉ 105 repo đọc được khi không đăng nhập, tất cả thuộc user cá nhân trên Gitea. Mọi org khác đều private. Trong 105 repo đó, chỉ duy nhất repo kia có nguồn private trên GitHub.&lt;/p&gt;
&lt;p&gt;Gốc rễ của chuyện bot thì đơn giản hơn: mọi record DNS của các app đều là &lt;code&gt;A&lt;/code&gt; record &lt;strong&gt;DNS only&lt;/strong&gt; (mây xám), nên bot đi thẳng vào origin, Cloudflare không hề thấy HTTP request nào để mà chặn.&lt;/p&gt;
&lt;h2 id="xử-lý"&gt;Xử lý
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Cầm máu trước.&lt;/strong&gt; Mình dừng Gitea và gitea-mirror, chuyển repo bị lộ về private.&lt;/p&gt;
&lt;p&gt;Phương án ban đầu là đưa toàn bộ app ra sau Cloudflare Tunnel và Cloudflare Access. Nghĩ kỹ thì hơi nặng: phải đổi domain trên Coolify sang &lt;code&gt;http://&lt;/code&gt;, cấu hình lại từng app, xử lý webhook&amp;hellip; Vì vậy mình tạm cất kế hoạch đó vào backlog và chọn cách nhẹ hơn: &lt;strong&gt;chỉ cần bật proxy (mây cam)&lt;/strong&gt; cho các record. Record vẫn trỏ về IP cũ, Traefik và Coolify giữ nguyên, nhưng giờ Cloudflare đứng giữa và có thể chặn bot.&lt;/p&gt;
&lt;p&gt;Thứ tự triển khai chiều 29/10:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SSL/TLS chuyển từ Full sang Full (strict).&lt;/strong&gt; Traefik vẫn giữ cert Let&amp;rsquo;s Encrypt, HTTP-01 renew vẫn đi qua proxy được. Không để Flexible, vì Traefik redirect HTTP sang HTTPS sẽ gây vòng lặp vô tận.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Thử trước trên một app ít rủi ro&lt;/strong&gt; (một web terminal): kiểm tra header &lt;code&gt;server: cloudflare&lt;/code&gt;, trang load được và WebSocket vẫn chạy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cấu hình chặn bot&lt;/strong&gt;, tất cả đều có trên gói Free:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AI bot policies&lt;/strong&gt;: Training, Agent và Search đều Block. App của mình không cần xuất hiện trong kết quả AI search.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bot Preference Sync&lt;/strong&gt; (managed &lt;code&gt;robots.txt&lt;/code&gt;): Cloudflare tự chèn các dòng &lt;code&gt;Disallow&lt;/code&gt; cho AI bot vào &lt;code&gt;robots.txt&lt;/code&gt;, hoặc tự phục vụ file này nếu app không có.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Một WAF custom rule&lt;/strong&gt; để bắt những gì policy bỏ sót:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(cf.verified_bot_category in {&amp;#34;AI Crawler&amp;#34; &amp;#34;AI Assistant&amp;#34; &amp;#34;AI Search&amp;#34;})
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;or (http.user_agent contains &amp;#34;Reflectionbot&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Proxy record wildcard&lt;/strong&gt; &lt;code&gt;*.miti99.dev&lt;/code&gt;. Một toggle là chuyển hết gần 20 app, app mới tạo sau này cũng được proxy mặc định. Rollback cũng chỉ là một toggle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Proxy Coolify sau cùng&lt;/strong&gt;, rồi kiểm tra lại GitHub webhook push deploy, metric của Sentinel từ server thứ hai, MCP và WebSocket realtime.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cho Traefik tin dải IP của Cloudflare&lt;/strong&gt; (&lt;code&gt;forwardedHeaders.trustedIPs&lt;/code&gt;) để app thấy IP thật của người dùng, thay vì IP của Cloudflare.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Một quyết định quan trọng: &lt;strong&gt;không bật Bot Fight Mode&lt;/strong&gt;. Trên gói Free, nó challenge mọi client không phải trình duyệt và không có cách nào exempt bằng WAF rule. Bật lên là hỏng webhook của GitHub, Sentinel, MCP, sync của Nextcloud và cả git client.&lt;/p&gt;
&lt;p&gt;Kết quả thử bằng &lt;code&gt;curl&lt;/code&gt;: user agent trình duyệt nhận 200, còn user agent GPTBot, ClaudeBot hay Reflectionbot nhận 403 ngay ở edge. Sau đó mình bật lại Gitea phía sau proxy.&lt;/p&gt;
&lt;p&gt;Có vài giới hạn cần biết khi proxy qua Cloudflare:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Request body trên 100 MB sẽ fail. Nextcloud upload theo chunk nên không sao.&lt;/li&gt;
&lt;li&gt;Response chậm hơn khoảng 100 giây sẽ trả về 524. Các call LLM dài mà không stream có thể dính.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Origin IP vẫn mở.&lt;/strong&gt; Bot nào đã biết IP vẫn có thể gọi thẳng vào Traefik. Đây là lớp chặn crawler, không phải access control.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="theo-dõi"&gt;Theo dõi
&lt;/h2&gt;&lt;p&gt;Điểm cuối ở trên được kiểm chứng ngay trong log. Gitea được proxy lúc 09:14 UTC (16:14 giờ Việt Nam). Grep access log ở origin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; ua in GPTBot ClaudeBot Reflectionbot&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$ua&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;grep -c &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$ua&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; access.log&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ClaudeBot&lt;/strong&gt; dừng hẳn lúc 09:14:20, gần như ngay khi đổi record.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reflectionbot&lt;/strong&gt; còn lai rai thêm khoảng 6 phút, chắc do DNS cache.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPTBot&lt;/strong&gt; thì vẫn gọi thẳng vào IP origin (&lt;code&gt;ClientAddr&lt;/code&gt; là IP của OpenAI, không phải của Cloudflare) thêm &lt;strong&gt;7.056 request trong một tiếng&lt;/strong&gt;, đến 10:14 mới dừng. Nhiều khả năng nó cache DNS lâu hơn TTL.&lt;/li&gt;
&lt;li&gt;Từ đó đến lúc viết bài (khoảng 4 tiếng), origin ghi nhận &lt;strong&gt;0 request&lt;/strong&gt; từ cả ba bot.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Những việc mình sẽ theo dõi tiếp:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Security → Events&lt;/strong&gt; trên Cloudflare: xem AI bot có bị block đều đặn không, và có user agent lạ nào cần thêm vào WAF rule không.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access log của Traefik ở origin&lt;/strong&gt;: grep như trên. Nếu crawler lại xuất hiện với &lt;code&gt;ClientAddr&lt;/code&gt; không thuộc dải Cloudflare, tức là nó đã biết IP origin, lúc đó phải tính đến firewall chỉ cho Cloudflare vào, hoặc quay lại phương án tunnel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;robots.txt&lt;/code&gt;&lt;/strong&gt; của từng host: &lt;code&gt;curl https://&amp;lt;app&amp;gt;.example.com/robots.txt&lt;/code&gt; phải có các dòng AI &lt;code&gt;Disallow&lt;/code&gt; của Cloudflare.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App mới&lt;/strong&gt;: Coolify tạo record DNS ở chế độ DNS only, nên host nào có record riêng phải tự bật proxy, không thì lại thành cửa sau.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dải IP của Cloudflare&lt;/strong&gt; ít khi đổi, nhưng nếu đổi thì phải cập nhật lại &lt;code&gt;trustedIPs&lt;/code&gt; của Traefik.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Còn tồn đọng: bật &lt;code&gt;REQUIRE_SIGNIN_VIEW&lt;/code&gt; để mọi trang Gitea đều phải đăng nhập (đây mới là cách sửa thật cho chuyện lộ repo, proxy chỉ là lớp phụ), dọn bỏ toàn bộ mirror, rotate GitHub token của gitea-mirror, và cân nhắc gửi yêu cầu xóa dữ liệu đã thu thập tới Reflection AI, OpenAI và Anthropic.&lt;/p&gt;
&lt;h2 id="bài-học"&gt;Bài học
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cái gì public sẽ bị crawl, và crawl rất kỹ.&lt;/strong&gt; Bot AI không chỉ đọc trang chủ mà đi qua từng commit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Đừng tin cờ visibility được sao chép từ hệ thống khác.&lt;/strong&gt; Một bản ghi cũ trùng tên là đủ biến repo private thành public.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNS only nghĩa là Cloudflare không giúp được gì.&lt;/strong&gt; Muốn chặn bot ở edge thì phải bật proxy, và với self-host nhỏ thì như vậy là đủ, chưa cần tunnel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Đừng bật Bot Fight Mode theo phản xạ&lt;/strong&gt; nếu server còn nhận webhook hay client không phải trình duyệt.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>