<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[AdminsForum - aaPanel Plugins & Integrations Guides]]></title>
		<link>https://adminsforum.com/</link>
		<description><![CDATA[AdminsForum - https://adminsforum.com]]></description>
		<pubDate>Thu, 15 Oct 2026 06:11:12 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Roll Back a Git Deployment in aaPanel and Verify Recovery]]></title>
			<link>https://adminsforum.com/Thread-guide-roll-back-a-git-deployment-in-aapanel-and-verify-recovery</link>
			<pubDate>Wed, 14 Oct 2026 01:44:45 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://adminsforum.com/member.php?action=profile&uid=2">DEV</a>]]></dc:creator>
			<guid isPermaLink="false">https://adminsforum.com/Thread-guide-roll-back-a-git-deployment-in-aapanel-and-verify-recovery</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">To return an aaPanel Git-managed website to a recorded deployment, open Git Manager → Deployments, locate the target commit and choose Rollback.</span> Back up first, complete the confirmation, then check the active commit and the actual website. A successful code rollback does not prove that an application's database or uploads were restored.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Tested environment and result</span><br />
Ubuntu 22.04, aaPanel 8.0.7 Free Edition, Nginx and a dedicated static demo website using MDN's beginner HTML/CSS repository. We started at commit <span style="font-weight: bold;" class="mycode_b">6c7a360</span>, deliberately deployed commit <span style="font-weight: bold;" class="mycode_b">16a0f38</span>, then used the native deployment-history <span style="font-weight: bold;" class="mycode_b">Rollback</span> action to return to <span style="font-weight: bold;" class="mycode_b">6c7a360</span>. The history recorded Success and Active for the restored commit. The sample page and its image loaded over HTTPS afterwards.<br />
<br />
These commits change repository administration files, so the page looked the same before and after. This rehearsal verifies the commit transition and the native recovery controls; it does not demonstrate fixing a visibly broken page, recovering database migrations or restoring a dynamic application.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Before starting</span><ul class="mycode_list"><li>Use a separate test site first. Complete <a href="https://adminsforum.com/Thread-guide-deploy-a-website-from-github-in-aapanel-step-by-step-guide" target="_blank" rel="noopener" class="mycode_url">the Git deployment guide</a> if the repository is not connected yet.<br />
</li>
<li>Record the current commit, branch and intended recovery commit. Use the commit identifier rather than relying on a message or timestamp alone.<br />
</li>
<li>Back up the site files and any separate database. Our demo's file-only backup completed before the rehearsal; restoration of that ZIP was not tested here.<br />
</li>
<li>Review runtime uploads, configuration and dependencies that sit outside the repository. Keep automatic deployment off during the exercise so it cannot immediately replace your selected version.<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">1. Inspect the current deployment</span><br />
Open <span style="font-weight: bold;" class="mycode_b">Website</span>, find the correct site, click <span style="font-weight: bold;" class="mycode_b">Conf</span> and select <span style="font-weight: bold;" class="mycode_b">Git Manager</span>. The Repository screen displays <span style="font-weight: bold;" class="mycode_b">Deployed commit</span> and the last deployment time. In our controlled test, the earlier sample commit 16a0f38 became the active version after we deployed it from Commit history.<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=153" target="_blank" title="">git-earlier-commit-20261013.jpg</a> (Size: 279.35 KB / Downloads: 5)
<!-- end: postbit_attachments_attachment --><br />
<span style="font-style: italic;" class="mycode_i">The test site at commit 16a0f38 before returning to the original recorded deployment.</span><br />
<br />
The Repository page's per-commit <span style="font-weight: bold;" class="mycode_b">Deploy</span> action deploys a selected remote commit. The <span style="font-weight: bold;" class="mycode_b">Rollback</span> action used below belongs to an existing deployment-history record. Do not confuse the two controls.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">2. Choose the recorded recovery target</span><br />
Select <span style="font-weight: bold;" class="mycode_b">Deployments</span>. Locate the record for the commit you want to restore. In our history, 16a0f38 was Current/Active, while the earlier successful deployment of 6c7a360 offered <span style="font-weight: bold;" class="mycode_b">Log</span> and <span style="font-weight: bold;" class="mycode_b">Rollback</span>.<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=154" target="_blank" title="">git-rollback-history-20261013.jpg</a> (Size: 230.07 KB / Downloads: 4)
<!-- end: postbit_attachments_attachment --><br />
<span style="font-style: italic;" class="mycode_i">Deployment history before recovery. The target is the existing 6c7a360 record.</span><br />
<br />
If you need to investigate a deployment first, open its <span style="font-weight: bold;" class="mycode_b">Log</span>. Check the result and commit carefully; a successful task is not proof that the application itself was healthy.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">3. Confirm the rollback</span><br />
Click <span style="font-weight: bold;" class="mycode_b">Rollback</span> on the intended record. Our panel warned that it would return the deployment to an earlier commit state and asked us to back up site files first. It also displayed an arithmetic verification field. Complete the check shown in your own panel and confirm only after checking the destination and target.<br />
<br />
Wait for the result. Do not repeatedly submit the action while it is running. If it fails, inspect the deployment log before making another change. The exact prompt can differ across panel versions.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">4. Verify the active version</span><br />
The history should now show a new successful record for the restored commit, marked <span style="font-weight: bold;" class="mycode_b">Active</span> and <span style="font-weight: bold;" class="mycode_b">Current</span>. In our lab that record was 6c7a360; the intermediate 16a0f38 record was no longer active. The operation took 1.05 seconds in this tiny sample; this is not a performance guarantee.<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=155" target="_blank" title="">git-rollback-completed-20261013.jpg</a> (Size: 240.11 KB / Downloads: 5)
<!-- end: postbit_attachments_attachment --><br />
<span style="font-style: italic;" class="mycode_i">The completed native rollback records 6c7a360 as Success, Active and Current.</span><br />
<br />
Reopen Repository and check the deployed commit if the history display is unclear. Then visit the website over HTTPS. Check the affected page and its assets, not just the homepage. For a dynamic application, also verify relevant login, read and write workflows without damaging production data.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">5. Know what this test does not recover</span><br />
Git deployment recovery is not a full server backup restore. A database schema change may be incompatible with older code. User-uploaded media, environment secrets, generated files and installed dependencies can need a separate recovery plan. Avoid assuming that every file on disk exactly matches the selected commit: the per-commit deployment warning in this installation said matching repository files would be overwritten and other site files retained. We did not independently test deletion or retention behaviour during rollback.<br />
<br />
Our static example had no database migration, custom build script or external application state. Those workflows need their own rehearsal before production use.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">History retention and troubleshooting</span><br />
The installed Free panel displays a limit of 5 deployment records. Keep an independent recovery record and backups; a short history is not a long-term backup strategy. Pro availability and limits are outside this hands-on Free test.<br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Target missing:</span> confirm the branch/filter and retained history. Do not assume every remote commit has a rollback record.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Task fails:</span> read the record's log and check repository access and disk space. Preserve useful errors before retrying.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Correct commit but wrong page:</span> check the document root, default document and application/CDN caches. Verify actual content before declaring recovery complete.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Application fails after rollback:</span> investigate database compatibility, configuration and dependencies rather than repeatedly selecting older commits.<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Our final lab state</span><br />
Original commit 6c7a360 restored; history Success/Active; demo website and image accessible over HTTPS; automatic deployment still Off. Existing WordPress and mail sites were outside this exercise.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Need help?</span> Include the aaPanel version, branch, current and target commit identifiers and the relevant deployment error in Plugins &amp; Integrations Support. Remove credentials and webhook secrets.]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">To return an aaPanel Git-managed website to a recorded deployment, open Git Manager → Deployments, locate the target commit and choose Rollback.</span> Back up first, complete the confirmation, then check the active commit and the actual website. A successful code rollback does not prove that an application's database or uploads were restored.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Tested environment and result</span><br />
Ubuntu 22.04, aaPanel 8.0.7 Free Edition, Nginx and a dedicated static demo website using MDN's beginner HTML/CSS repository. We started at commit <span style="font-weight: bold;" class="mycode_b">6c7a360</span>, deliberately deployed commit <span style="font-weight: bold;" class="mycode_b">16a0f38</span>, then used the native deployment-history <span style="font-weight: bold;" class="mycode_b">Rollback</span> action to return to <span style="font-weight: bold;" class="mycode_b">6c7a360</span>. The history recorded Success and Active for the restored commit. The sample page and its image loaded over HTTPS afterwards.<br />
<br />
These commits change repository administration files, so the page looked the same before and after. This rehearsal verifies the commit transition and the native recovery controls; it does not demonstrate fixing a visibly broken page, recovering database migrations or restoring a dynamic application.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Before starting</span><ul class="mycode_list"><li>Use a separate test site first. Complete <a href="https://adminsforum.com/Thread-guide-deploy-a-website-from-github-in-aapanel-step-by-step-guide" target="_blank" rel="noopener" class="mycode_url">the Git deployment guide</a> if the repository is not connected yet.<br />
</li>
<li>Record the current commit, branch and intended recovery commit. Use the commit identifier rather than relying on a message or timestamp alone.<br />
</li>
<li>Back up the site files and any separate database. Our demo's file-only backup completed before the rehearsal; restoration of that ZIP was not tested here.<br />
</li>
<li>Review runtime uploads, configuration and dependencies that sit outside the repository. Keep automatic deployment off during the exercise so it cannot immediately replace your selected version.<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">1. Inspect the current deployment</span><br />
Open <span style="font-weight: bold;" class="mycode_b">Website</span>, find the correct site, click <span style="font-weight: bold;" class="mycode_b">Conf</span> and select <span style="font-weight: bold;" class="mycode_b">Git Manager</span>. The Repository screen displays <span style="font-weight: bold;" class="mycode_b">Deployed commit</span> and the last deployment time. In our controlled test, the earlier sample commit 16a0f38 became the active version after we deployed it from Commit history.<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=153" target="_blank" title="">git-earlier-commit-20261013.jpg</a> (Size: 279.35 KB / Downloads: 5)
<!-- end: postbit_attachments_attachment --><br />
<span style="font-style: italic;" class="mycode_i">The test site at commit 16a0f38 before returning to the original recorded deployment.</span><br />
<br />
The Repository page's per-commit <span style="font-weight: bold;" class="mycode_b">Deploy</span> action deploys a selected remote commit. The <span style="font-weight: bold;" class="mycode_b">Rollback</span> action used below belongs to an existing deployment-history record. Do not confuse the two controls.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">2. Choose the recorded recovery target</span><br />
Select <span style="font-weight: bold;" class="mycode_b">Deployments</span>. Locate the record for the commit you want to restore. In our history, 16a0f38 was Current/Active, while the earlier successful deployment of 6c7a360 offered <span style="font-weight: bold;" class="mycode_b">Log</span> and <span style="font-weight: bold;" class="mycode_b">Rollback</span>.<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=154" target="_blank" title="">git-rollback-history-20261013.jpg</a> (Size: 230.07 KB / Downloads: 4)
<!-- end: postbit_attachments_attachment --><br />
<span style="font-style: italic;" class="mycode_i">Deployment history before recovery. The target is the existing 6c7a360 record.</span><br />
<br />
If you need to investigate a deployment first, open its <span style="font-weight: bold;" class="mycode_b">Log</span>. Check the result and commit carefully; a successful task is not proof that the application itself was healthy.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">3. Confirm the rollback</span><br />
Click <span style="font-weight: bold;" class="mycode_b">Rollback</span> on the intended record. Our panel warned that it would return the deployment to an earlier commit state and asked us to back up site files first. It also displayed an arithmetic verification field. Complete the check shown in your own panel and confirm only after checking the destination and target.<br />
<br />
Wait for the result. Do not repeatedly submit the action while it is running. If it fails, inspect the deployment log before making another change. The exact prompt can differ across panel versions.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">4. Verify the active version</span><br />
The history should now show a new successful record for the restored commit, marked <span style="font-weight: bold;" class="mycode_b">Active</span> and <span style="font-weight: bold;" class="mycode_b">Current</span>. In our lab that record was 6c7a360; the intermediate 16a0f38 record was no longer active. The operation took 1.05 seconds in this tiny sample; this is not a performance guarantee.<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=155" target="_blank" title="">git-rollback-completed-20261013.jpg</a> (Size: 240.11 KB / Downloads: 5)
<!-- end: postbit_attachments_attachment --><br />
<span style="font-style: italic;" class="mycode_i">The completed native rollback records 6c7a360 as Success, Active and Current.</span><br />
<br />
Reopen Repository and check the deployed commit if the history display is unclear. Then visit the website over HTTPS. Check the affected page and its assets, not just the homepage. For a dynamic application, also verify relevant login, read and write workflows without damaging production data.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">5. Know what this test does not recover</span><br />
Git deployment recovery is not a full server backup restore. A database schema change may be incompatible with older code. User-uploaded media, environment secrets, generated files and installed dependencies can need a separate recovery plan. Avoid assuming that every file on disk exactly matches the selected commit: the per-commit deployment warning in this installation said matching repository files would be overwritten and other site files retained. We did not independently test deletion or retention behaviour during rollback.<br />
<br />
Our static example had no database migration, custom build script or external application state. Those workflows need their own rehearsal before production use.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">History retention and troubleshooting</span><br />
The installed Free panel displays a limit of 5 deployment records. Keep an independent recovery record and backups; a short history is not a long-term backup strategy. Pro availability and limits are outside this hands-on Free test.<br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Target missing:</span> confirm the branch/filter and retained history. Do not assume every remote commit has a rollback record.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Task fails:</span> read the record's log and check repository access and disk space. Preserve useful errors before retrying.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Correct commit but wrong page:</span> check the document root, default document and application/CDN caches. Verify actual content before declaring recovery complete.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Application fails after rollback:</span> investigate database compatibility, configuration and dependencies rather than repeatedly selecting older commits.<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Our final lab state</span><br />
Original commit 6c7a360 restored; history Success/Active; demo website and image accessible over HTTPS; automatic deployment still Off. Existing WordPress and mail sites were outside this exercise.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Need help?</span> Include the aaPanel version, branch, current and target commit identifiers and the relevant deployment error in Plugins &amp; Integrations Support. Remove credentials and webhook secrets.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Deploy a Website from GitHub in aaPanel: Step-by-Step Guide]]></title>
			<link>https://adminsforum.com/Thread-guide-deploy-a-website-from-github-in-aapanel-step-by-step-guide</link>
			<pubDate>Wed, 14 Oct 2026 00:27:54 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://adminsforum.com/member.php?action=profile&uid=2">DEV</a>]]></dc:creator>
			<guid isPermaLink="false">https://adminsforum.com/Thread-guide-deploy-a-website-from-github-in-aapanel-step-by-step-guide</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">aaPanel's Git Manager can deploy a public repository to an existing website.</span> Open the website settings, choose Git Manager, enter the repository URL, test access, select its branch and use Save &amp; deploy. Saving immediately deploys files, so start with a separate test website and a backup.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Tested environment</span><br />
Ubuntu 22.04, aaPanel 8.0.7 Free Edition and Nginx 1.30.5. We deployed MDN's public beginner HTML/CSS example to a dedicated demo website. Repository access succeeded, commit 6c7a360 was deployed and recorded as Success/Active. The website returned HTTP 200 over HTTPS with certificate verification passing. We did not test private repositories, webhooks, custom build scripts or rollback in this walkthrough.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">1. Prepare a separate website</span><br />
Create a test website through Website → Add site. Use a domain or subdomain you control. If there are existing files, back them up before deployment. Our demo site's native backup completed successfully and produced an 86.97 KB file-only ZIP. Its restore was not tested here. A file backup does not include an application's database unless you explicitly include and verify that component.<br />
<br />
Create a DNS A record for the test hostname pointing to the server's public IPv4 address. Configure HTTPS through the site's SSL settings after DNS resolves. Our lab used DNS-only Cloudflare resolution and a Let's Encrypt certificate. Use your own IP and hostname; the demonstration hostname is not a shared deployment service.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">2. Choose a repository suitable for the first test</span><br />
For this rehearsal we used the public, static MDN sample:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>https://github.com/mdn/beginner-html-site-styled.git</code></div></div>It contains an index.html plus styles and images. This avoids a database or build step during the initial Git test. Use a trusted repository and inspect its contents before deployment. A framework application may also need dependency installation, a build command, runtime configuration and a different document root.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">3. Connect through Git Manager</span><br />
Open <span style="font-weight: bold;" class="mycode_b">Website</span>, find the demo site and click <span style="font-weight: bold;" class="mycode_b">Conf</span>. Select <span style="font-weight: bold;" class="mycode_b">Git Manager</span>, then <span style="font-weight: bold;" class="mycode_b">Repository URL</span>. Paste the repository address. For a public repository choose <span style="font-weight: bold;" class="mycode_b">Public</span> authentication. No GitHub account connection, token or SSH key was required for our public example.<br />
<br />
Click <span style="font-weight: bold;" class="mycode_b">Test connection</span>. Wait for the result. Our screen reported <span style="font-weight: bold;" class="mycode_b">Connection successful · 4 branches available</span>. Select the intended deployment branch; ours was <span style="font-weight: bold;" class="mycode_b">main</span>. Branch names vary by repository.<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=149" target="_blank" title="">git-repository-connection-20261013.jpg</a> (Size: 230.67 KB / Downloads: 10)
<!-- end: postbit_attachments_attachment --><br />
<span style="font-style: italic;" class="mycode_i">Successful public-repository connection, with main selected before deployment.</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">4. Save and deploy</span><br />
Check the destination site and branch again. Click <span style="font-weight: bold;" class="mycode_b">Save &amp; deploy</span> once. The panel states that saving deploys immediately; it is not merely saving connection preferences. Wait for the task result.<br />
<br />
After our successful deployment, reopening Git Manager showed the connected repository, deployed commit and last deployment time. Automatic deployment was <span style="font-weight: bold;" class="mycode_b">Off</span>; connecting a repository does not by itself configure a webhook.<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=150" target="_blank" title="">git-connected-20261013.jpg</a> (Size: 279.45 KB / Downloads: 7)
<!-- end: postbit_attachments_attachment --><br />
<span style="font-style: italic;" class="mycode_i">Connected repository and active commit after deployment.</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">5. Read deployment history</span><br />
Select <span style="font-weight: bold;" class="mycode_b">Deployments</span>. Confirm that the expected commit and branch appear, its result is <span style="font-weight: bold;" class="mycode_b">Success</span>, and the active version is marked. Use the record's <span style="font-weight: bold;" class="mycode_b">Log</span> action when diagnosing a failed deployment.<br />
<br />
Our installed Free panel says it retains <span style="font-weight: bold;" class="mycode_b">5 deployment records</span>, while its upgrade notice advertises 30 for Pro. This is the limit shown by this version, not a comparison test of Pro. The displayed 1.02-second duration applies only to this small sample and is not a deployment-speed benchmark.<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=151" target="_blank" title="">git-history-20261013.jpg</a> (Size: 219.5 KB / Downloads: 8)
<!-- end: postbit_attachments_attachment --><br />
<span style="font-style: italic;" class="mycode_i">Deployment history records the tested commit as Success and Active.</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">6. Verify the actual website</span><br />
Visit the hostname and check the expected page, stylesheet and images. A success notice alone is not proof that DNS, HTTPS or application configuration is correct. Our hostname initially had no DNS record. After adding it, the local browser retained an NXDOMAIN result temporarily. We first verified the origin over HTTPS using the hostname and explicit IP resolution; certificate checking stayed enabled. Once the resolver cache updated, a fresh browser request also displayed the deployed page and Firefox image over HTTPS.<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=152" target="_blank" title="">git-demo-live-20261013.jpg</a> (Size: 144.12 KB / Downloads: 5)
<!-- end: postbit_attachments_attachment --><br />
<span style="font-style: italic;" class="mycode_i">The deployed sample rendered in the browser after DNS propagation.</span><br />
<br />
Optional command for readers:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>curl --resolve YOUR_HOSTNAME:443:YOUR_SERVER_IP https://YOUR_HOSTNAME/</code></div></div>Replace both placeholders. Do not add -k to hide certificate failures. The response in our lab contained the sample's expected HTML and returned HTTP 200. A request for /.git/HEAD returned 404; that specific file was not publicly readable. This is a targeted check, not a comprehensive server security audit.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">7. Understand updates before automating</span><br />
The connected repository screen offers <span style="font-weight: bold;" class="mycode_b">Deploy latest</span> and per-commit deployment controls. Review the selected branch and changes, preserve a recovery copy and test an update on a staging site before using these on production. This guide directly verified the first deployment only. A Git rollback is not a database restore, and runtime uploads or secrets should not be treated as disposable repository files.<br />
<br />
Keep automatic deployment disabled until you deliberately configure and test the separate webhook workflow. Do not publish tokens or webhook secrets in screenshots.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Troubleshooting</span><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Connection fails:</span> confirm the repository URL, its visibility and outbound access. The public authentication option cannot authenticate to a private repository.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Wrong page:</span> check the site's document root, selected branch and default document order; existing index files can affect which page is served.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">404 or broken assets:</span> check filenames, asset paths and whether a build directory should be the document root.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Application error:</span> check the required PHP/Node version, dependencies and environment configuration. Copying repository files does not complete every application's installation.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">DNS error:</span> verify the A/AAAA records and allow resolver caches to refresh. Changing Git settings will not repair DNS.<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Reference sample:</span> <a href="https://github.com/mdn/beginner-html-site-styled" target="_blank" rel="noopener" class="mycode_url">MDN beginner HTML/CSS repository</a>. Its website files belong to the sample's authors; our screenshots document the aaPanel deployment workflow.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Need help?</span> Share the aaPanel version, repository visibility, branch and relevant deployment error in Plugins &amp; Integrations Support. Remove credentials and private configuration values first.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Tested follow-up:</span> <a href="https://adminsforum.com/Thread-guide-roll-back-a-git-deployment-in-aapanel-and-verify-recovery" target="_blank" rel="noopener" class="mycode_url">Roll Back a Git Deployment in aaPanel and Verify Recovery</a> — our separate native rollback rehearsal is now complete.]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">aaPanel's Git Manager can deploy a public repository to an existing website.</span> Open the website settings, choose Git Manager, enter the repository URL, test access, select its branch and use Save &amp; deploy. Saving immediately deploys files, so start with a separate test website and a backup.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Tested environment</span><br />
Ubuntu 22.04, aaPanel 8.0.7 Free Edition and Nginx 1.30.5. We deployed MDN's public beginner HTML/CSS example to a dedicated demo website. Repository access succeeded, commit 6c7a360 was deployed and recorded as Success/Active. The website returned HTTP 200 over HTTPS with certificate verification passing. We did not test private repositories, webhooks, custom build scripts or rollback in this walkthrough.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">1. Prepare a separate website</span><br />
Create a test website through Website → Add site. Use a domain or subdomain you control. If there are existing files, back them up before deployment. Our demo site's native backup completed successfully and produced an 86.97 KB file-only ZIP. Its restore was not tested here. A file backup does not include an application's database unless you explicitly include and verify that component.<br />
<br />
Create a DNS A record for the test hostname pointing to the server's public IPv4 address. Configure HTTPS through the site's SSL settings after DNS resolves. Our lab used DNS-only Cloudflare resolution and a Let's Encrypt certificate. Use your own IP and hostname; the demonstration hostname is not a shared deployment service.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">2. Choose a repository suitable for the first test</span><br />
For this rehearsal we used the public, static MDN sample:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>https://github.com/mdn/beginner-html-site-styled.git</code></div></div>It contains an index.html plus styles and images. This avoids a database or build step during the initial Git test. Use a trusted repository and inspect its contents before deployment. A framework application may also need dependency installation, a build command, runtime configuration and a different document root.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">3. Connect through Git Manager</span><br />
Open <span style="font-weight: bold;" class="mycode_b">Website</span>, find the demo site and click <span style="font-weight: bold;" class="mycode_b">Conf</span>. Select <span style="font-weight: bold;" class="mycode_b">Git Manager</span>, then <span style="font-weight: bold;" class="mycode_b">Repository URL</span>. Paste the repository address. For a public repository choose <span style="font-weight: bold;" class="mycode_b">Public</span> authentication. No GitHub account connection, token or SSH key was required for our public example.<br />
<br />
Click <span style="font-weight: bold;" class="mycode_b">Test connection</span>. Wait for the result. Our screen reported <span style="font-weight: bold;" class="mycode_b">Connection successful · 4 branches available</span>. Select the intended deployment branch; ours was <span style="font-weight: bold;" class="mycode_b">main</span>. Branch names vary by repository.<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=149" target="_blank" title="">git-repository-connection-20261013.jpg</a> (Size: 230.67 KB / Downloads: 10)
<!-- end: postbit_attachments_attachment --><br />
<span style="font-style: italic;" class="mycode_i">Successful public-repository connection, with main selected before deployment.</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">4. Save and deploy</span><br />
Check the destination site and branch again. Click <span style="font-weight: bold;" class="mycode_b">Save &amp; deploy</span> once. The panel states that saving deploys immediately; it is not merely saving connection preferences. Wait for the task result.<br />
<br />
After our successful deployment, reopening Git Manager showed the connected repository, deployed commit and last deployment time. Automatic deployment was <span style="font-weight: bold;" class="mycode_b">Off</span>; connecting a repository does not by itself configure a webhook.<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=150" target="_blank" title="">git-connected-20261013.jpg</a> (Size: 279.45 KB / Downloads: 7)
<!-- end: postbit_attachments_attachment --><br />
<span style="font-style: italic;" class="mycode_i">Connected repository and active commit after deployment.</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">5. Read deployment history</span><br />
Select <span style="font-weight: bold;" class="mycode_b">Deployments</span>. Confirm that the expected commit and branch appear, its result is <span style="font-weight: bold;" class="mycode_b">Success</span>, and the active version is marked. Use the record's <span style="font-weight: bold;" class="mycode_b">Log</span> action when diagnosing a failed deployment.<br />
<br />
Our installed Free panel says it retains <span style="font-weight: bold;" class="mycode_b">5 deployment records</span>, while its upgrade notice advertises 30 for Pro. This is the limit shown by this version, not a comparison test of Pro. The displayed 1.02-second duration applies only to this small sample and is not a deployment-speed benchmark.<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=151" target="_blank" title="">git-history-20261013.jpg</a> (Size: 219.5 KB / Downloads: 8)
<!-- end: postbit_attachments_attachment --><br />
<span style="font-style: italic;" class="mycode_i">Deployment history records the tested commit as Success and Active.</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">6. Verify the actual website</span><br />
Visit the hostname and check the expected page, stylesheet and images. A success notice alone is not proof that DNS, HTTPS or application configuration is correct. Our hostname initially had no DNS record. After adding it, the local browser retained an NXDOMAIN result temporarily. We first verified the origin over HTTPS using the hostname and explicit IP resolution; certificate checking stayed enabled. Once the resolver cache updated, a fresh browser request also displayed the deployed page and Firefox image over HTTPS.<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=152" target="_blank" title="">git-demo-live-20261013.jpg</a> (Size: 144.12 KB / Downloads: 5)
<!-- end: postbit_attachments_attachment --><br />
<span style="font-style: italic;" class="mycode_i">The deployed sample rendered in the browser after DNS propagation.</span><br />
<br />
Optional command for readers:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>curl --resolve YOUR_HOSTNAME:443:YOUR_SERVER_IP https://YOUR_HOSTNAME/</code></div></div>Replace both placeholders. Do not add -k to hide certificate failures. The response in our lab contained the sample's expected HTML and returned HTTP 200. A request for /.git/HEAD returned 404; that specific file was not publicly readable. This is a targeted check, not a comprehensive server security audit.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">7. Understand updates before automating</span><br />
The connected repository screen offers <span style="font-weight: bold;" class="mycode_b">Deploy latest</span> and per-commit deployment controls. Review the selected branch and changes, preserve a recovery copy and test an update on a staging site before using these on production. This guide directly verified the first deployment only. A Git rollback is not a database restore, and runtime uploads or secrets should not be treated as disposable repository files.<br />
<br />
Keep automatic deployment disabled until you deliberately configure and test the separate webhook workflow. Do not publish tokens or webhook secrets in screenshots.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Troubleshooting</span><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Connection fails:</span> confirm the repository URL, its visibility and outbound access. The public authentication option cannot authenticate to a private repository.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Wrong page:</span> check the site's document root, selected branch and default document order; existing index files can affect which page is served.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">404 or broken assets:</span> check filenames, asset paths and whether a build directory should be the document root.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Application error:</span> check the required PHP/Node version, dependencies and environment configuration. Copying repository files does not complete every application's installation.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">DNS error:</span> verify the A/AAAA records and allow resolver caches to refresh. Changing Git settings will not repair DNS.<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Reference sample:</span> <a href="https://github.com/mdn/beginner-html-site-styled" target="_blank" rel="noopener" class="mycode_url">MDN beginner HTML/CSS repository</a>. Its website files belong to the sample's authors; our screenshots document the aaPanel deployment workflow.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Need help?</span> Share the aaPanel version, repository visibility, branch and relevant deployment error in Plugins &amp; Integrations Support. Remove credentials and private configuration values first.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Tested follow-up:</span> <a href="https://adminsforum.com/Thread-guide-roll-back-a-git-deployment-in-aapanel-and-verify-recovery" target="_blank" rel="noopener" class="mycode_url">Roll Back a Git Deployment in aaPanel and Verify Recovery</a> — our separate native rollback rehearsal is now complete.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[aaPanel App Store Guide: Apps, Plugins and What to Install]]></title>
			<link>https://adminsforum.com/Thread-guide-aapanel-app-store-guide-apps-plugins-and-what-to-install</link>
			<pubDate>Tue, 13 Oct 2026 13:20:13 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://adminsforum.com/member.php?action=profile&uid=2">DEV</a>]]></dc:creator>
			<guid isPermaLink="false">https://adminsforum.com/Thread-guide-aapanel-app-store-guide-apps-plugins-and-what-to-install</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">You do not need every App Store app to host a website.</span> Start with the components your application requires, then add optional tools for a specific purpose. This reference explains all 98 rows visible in our lab's catalog on 13 October 2026. Availability, versions and prices can change. The descriptions below are our practical summaries, not claims that every plugin has been installed or tested.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">1. Find and understand the App Store</span><br />
Open <span style="font-weight: bold;" class="mycode_b">App Store → Official App</span>. Search by name. Use <span style="font-weight: bold;" class="mycode_b">ALL</span> for the catalog and <span style="font-weight: bold;" class="mycode_b">Installed</span> to see services already present. Deployment, Tools, Plug-ins and Professional narrow the list. <span style="font-weight: bold;" class="mycode_b">Setting</span> opens an installed component's controls; <span style="font-weight: bold;" class="mycode_b">Install</span> starts setup for an available component; paid entries may show a purchase action. Do not treat a catalog listing as proof that an app is running.<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=133" target="_blank" title="">appstore-branded-20261013.jpg</a> (Size: 239.23 KB / Downloads: 6)
<!-- end: postbit_attachments_attachment --><br />
<span style="font-style: italic;" class="mycode_i">Our Installed view contains ten components. The full 98-row catalog also includes optional and retired entries.</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">2. Choose a small starting stack</span><br />
For a typical PHP website, choose a supported web server, a PHP runtime compatible with the application and a database when required. phpMyAdmin is an optional administration interface, not the database itself. Redis is optional caching infrastructure. Mail Server and Pure-FTPd are separate services: install them only when you need to operate mail or FTP. Our lab includes multiple web servers to demonstrate hosting configurations; a beginner does not need to install all three.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">3. Before clicking Install</span><br />
Check operating-system and panel-version compatibility, memory/disk requirements and existing dependencies. Back up configuration and data. Review new ports and credentials. A plugin marked Free can still use a cloud account with quotas or charges. A Paid label below means the catalog listed a price; it does not define the terms of a subscription or guarantee current pricing. Review licensing in your own account. After installation, check service status, application behavior and firewall rules.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">4. Core hosting, database and runtime entries</span><br />
<span style="font-weight: bold;" class="mycode_b">Nginx 1.30.5 — Listed Free</span><br />
Serves websites and can reverse-proxy application backends.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Apache 2.4.62 — Listed Free</span><br />
Serves websites with Apache modules and per-site configuration.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">MySQL 10.11.10-MariaDB — Listed Free</span><br />
The lab catalog label refers to the installed MariaDB relational database; applications need compatible database settings.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Mail Server 7.4.1 — Listed Free</span><br />
Manages mail services; delivery also requires DNS, certificates, reverse DNS and provider connectivity.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Redis 7.4.11 — Listed Free</span><br />
Provides a key-value service used for caches and other applications; secure access and avoid shared-cache flushes.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Pure-Ftpd 1.0.49 — Listed Free</span><br />
Provides FTP/FTPS accounts and transfers; require encryption and restrict user folders.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">phpMyAdmin 5.2 — Listed Free</span><br />
Provides a browser interface for MySQL/MariaDB administration; protect access.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Node.js version manager — Listed Free</span><br />
Manages Node.js runtimes; check project compatibility and conflicts with older managers.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">ffmpeg manager — Listed Free</span><br />
Installs and manages FFmpeg for media conversion; resource use depends on the job.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">MongoDB — Listed Free</span><br />
Provides a document database for applications designed to use it.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Memcached — Listed Free</span><br />
Provides an in-memory cache; restrict network access and expect cache contents to be disposable.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">elasticsearch — Listed Free</span><br />
Provides search and analytics infrastructure; plan its memory and storage requirements.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Openlitespeed 1.8.5 — Listed Free</span><br />
Provides the OpenLiteSpeed web server; its PHP handling differs from Nginx/PHP-FPM.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">RabbitMQ — Listed Free</span><br />
Provides a message broker for applications that need queues.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PostgreSQL Manager — Listed Free</span><br />
Installs and manages PostgreSQL databases.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Supervisor — Listed Free</span><br />
Keeps configured application processes running; set the correct user and working directory.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Java Manager — Listed Free</span><br />
Supports Java/JSP deployment management; choose compatible runtimes.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Mariadb multi-version management (Docker) — Listed Free</span><br />
Runs multiple MariaDB versions in containers; separate ports, data and backups.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">5. PHP version entries</span><br />
The catalog lists PHP-8.5, PHP-8.4, PHP-8.3, PHP-8.2, PHP-8.1, PHP-8.0, PHP-7.4, PHP-7.3, PHP-7.2, PHP-7.1, PHP-7.0, PHP-5.6, PHP-5.5, PHP-5.4, PHP-5.3, PHP-5.2. All were listed Free. Each is a PHP runtime version, not a different website application. Select the version required by your software and still covered by appropriate security support. Old PHP 5.x and 7.x entries are legacy choices, not recommendations for a new site. Check the official support table before choosing or migrating a version. Installing a newer runtime does not automatically switch every existing website to it. Back up and test the site, required extensions and the selected web server before changing its runtime.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">6. Optional apps and plugins</span><br />
<span style="font-weight: bold;" class="mycode_b">Site Diagnosis — Listed Paid</span><br />
Helps investigate common website failures; verify its suggestions against the actual logs.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Network Threat Detection — Listed Paid</span><br />
Reviews network traffic for suspicious activity; check the supported OS before installing.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Website Analytics — Listed Paid</span><br />
Adds visitor analytics; review tracking, privacy and storage requirements.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Files Sync — Listed Paid</span><br />
Transfers files between locations on a schedule or continuously; test conflict and deletion behavior first.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Network Scan Detection — Listed Paid</span><br />
Looks for scanning activity against the server; alerts still need investigation.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">aaPanel Daily Report — Listed Paid</span><br />
Summarizes operational and security information for regular review.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Website statistics-v2 — Listed Paid</span><br />
Provides website traffic statistics for supported web servers.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Nginx WAF — Listed Paid</span><br />
Adds application-layer filtering for Nginx; tune rules to avoid blocking legitimate requests.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Tamper-proof for Enterprise — Listed Paid</span><br />
Restricts unwanted website file changes; review incompatibilities with other tamper protection.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Load Balance — Listed Paid</span><br />
Distributes requests across backends; requires healthy services and a tested routing plan.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">aaPanel Mobile — Listed Paid</span><br />
Provides mobile management access; protect the associated account.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Apache WAF — Listed Paid</span><br />
Adds application-layer filtering for Apache; review compatibility and false positives.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Microsoft OneDrive — Listed Free</span><br />
Stores backups in a Microsoft cloud account; account limits and charges are separate.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PHP code security — Listed Paid</span><br />
Adds PHP behavior checks; test application compatibility before enabling blocking.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Task manager — Listed Paid</span><br />
Provides controls for processes and other system tasks; stopping the wrong service can interrupt hosting.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Website Tamper-proof — Listed Paid</span><br />
Protects selected website files against changes; allow your legitimate deployment workflow.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">aaPanel user Manager — Listed Paid</span><br />
Manages panel users and menu permissions on supported panel versions; grant the minimum access needed.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">System hardening — Listed Paid</span><br />
Offers system protection settings; review each change and its recovery route.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">File monitor — Listed Paid</span><br />
Records file changes and offers related checks or backups.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Disk analysis — Listed Paid</span><br />
Helps locate large files and directories; review files before cleanup.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">aaCloud — Listed Free</span><br />
Connects servers to centralized management; review the access and data involved.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">OpenClaw(Docker) — Listed Free</span><br />
Runs a self-hosted AI assistant through Docker; plan disk, memory, model and integration requirements.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">OpenClaw — Listed Free</span><br />
Runs a self-hosted AI assistant; use a separate lab and review messaging integrations and credentials.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Tencent EdgeOne CDN — Listed Free</span><br />
Connects edge/CDN services; review the provider account, plan and DNS requirements.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Anti-intrusion — Listed Paid</span><br />
Adds protections around service and process activity; validate compatibility with your workloads.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Website basic Statistics — Listed Free</span><br />
Provides a basic view of website visits.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">CloudFlare free CDN — Listed Free</span><br />
Integrates Cloudflare website/CDN configuration; DNS and account requirements still apply.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Website Log Analyzer — Listed Free</span><br />
Analyzes selected Nginx access logs to help investigate traffic.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">WebSite Speed — Listed Free</span><br />
Offers website acceleration controls; review its current documentation and test before enabling.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">WebHook — Listed Free</span><br />
Runs configured actions on callbacks; protect webhook secrets and limit command privileges.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">DeepSeek-R1 — Listed Free</span><br />
Provides an AI model integration; review its current deployment, memory and model requirements.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">S3 Storage (AWS S3) — Listed Free</span><br />
Sends backups to S3-compatible storage; protect access keys and test recovery.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Google Drive — Listed Free</span><br />
Sends backups to Google Drive; verify account authorization and storage capacity.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Fail2ban Manager — Listed Free</span><br />
Manages bans triggered by repeated authentication failures; verify log paths and trusted-client access.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Cloud dns — Listed Free</span><br />
Manages supported DNS-provider records; use narrowly scoped provider tokens.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">DDNS Manager — Listed Free</span><br />
Updates supported DNS records when an address changes.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">One-click migration beta — Listed Free</span><br />
Helps migrate panel data; verify backups, compatibility and the destination before relying on it.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">one-click deployment — Listed Free</span><br />
Deploys supported applications; update and secure each application after installation.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Intrusion Detection — Listed Free</span><br />
Monitors for possible intrusion activity; review alerts instead of treating them as proof.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">FTP Storage — Listed Free</span><br />
Sends backups to an FTP destination; review encryption support before transmitting private data.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">ClamAV — Listed Free</span><br />
Scans files for malware signatures; scan results do not replace patching or incident review.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">frp manager — Listed Free</span><br />
Manages reverse-proxy tunnels; review which private services become reachable.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Platform Ops — Listed Paid</span><br />
Coordinates maintenance across servers; protect stored access and review batch operations.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Disk Mount Manager — Listed Free</span><br />
Manages disk mounts; back up first and distinguish mounting from formatting.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Google Cloud Storage — Listed Free</span><br />
Sends backups to Google Cloud Storage; provider permissions and charges are separate.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Performance testing — Listed Free</span><br />
Runs CPU, memory, disk and network benchmarks; schedule away from busy production periods.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">System boot items — Listed Free</span><br />
Manages startup services and environment settings; avoid disabling hosting dependencies.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">NFS Manager — Listed Paid</span><br />
Manages network file shares and mounts; restrict clients and export permissions.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Server performance testing — Listed Free</span><br />
Provides server benchmarking; tests can compete with live workloads.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Linux Tools — Listed Free</span><br />
Provides system utilities including DNS, swap and network settings; review disruptive changes.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PHP Guardian — Listed Free</span><br />
Monitors PHP-FPM availability; investigate the underlying failure rather than only restarting it.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Log cleanup — Listed Free</span><br />
Removes selected logs or temporary data; retain troubleshooting and audit evidence first.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Anti-Spam Gateway — Listed Free</span><br />
Filters mail through a gateway; review routing and false-positive behavior.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">IP setup tool — Listed Free</span><br />
Changes network address configuration; its listed OS support is old, so check compatibility and console recovery.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Nginx free firewall — Listed Free</span><br />
The catalog gives little detail; check maintenance and documentation before choosing it for protection.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">7. Retired or replaced catalog entries</span><br />
These rows were still visible but their catalog notices direct users to replacements. Do not use an old install guide without checking the current location and support status.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Dns Manager — Listed Free</span><br />
Retired catalog entry; use the panel Domains area indicated by the catalog.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">aaPanel AI Assistant — Listed Free</span><br />
Unmaintained plugin entry; use the current AI menu indicated by the catalog.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Sync Tool — Listed Paid</span><br />
Retired entry; the catalog directs users to Files Sync.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Abnormal Push — Listed Paid</span><br />
Retired entry; the catalog directs users to Settings → Alarm.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">SYS Firewall — Listed Free</span><br />
Retired entry; use the current Security area.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PM2 Manager — Listed Free</span><br />
Retired entry; use Website → Node Project as indicated by the catalog.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Docker Manager — Listed Free</span><br />
Retired entry; use the current Docker menu.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Python Manager — Listed Free</span><br />
Older entry marked for replacement; use Website → Python Project.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Website statistics — Listed Paid</span><br />
Retired entry; use Website statistics-v2.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">8. How to verify an installation</span><br />
Return to Installed, open Setting, confirm the service status and inspect logs. Test the actual function: load a website, connect to the database through the intended private route, transfer a file using encryption or restore a backup into an isolated environment. A green service indicator alone does not prove the application is configured correctly. If setup fails, record the app/version, OS, precise error and relevant redacted log lines when asking for support.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Lab scope</span><br />
The installed view shows Nginx, Apache, MariaDB, Mail Server, Redis, Pure-FTPd, phpMyAdmin, PHP 8.5, PHP 8.4 and OpenLiteSpeed. Our related guides demonstrate selected functions of this stack. The remaining catalog entries are explanations based on the visible catalog; they have not all been installed, audited or benchmarked.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Continue with focused guides</span><br />
<a href="https://adminsforum.com/Thread-guide-enable-redis-object-cache-for-wordpress-in-aapanel" target="_blank" rel="noopener" class="mycode_url">WordPress Redis object cache</a><br />
<a href="https://adminsforum.com/Thread-guide-install-pure-ftpd-in-aapanel-and-check-the-ftp-service" target="_blank" rel="noopener" class="mycode_url">Pure-FTPd installation and service checks</a><br />
<a href="https://adminsforum.com/Thread-guide-configure-aapanel-firewall-rules-without-losing-ssh-access" target="_blank" rel="noopener" class="mycode_url">Firewall rules after installing services</a><br />
<br />
<span style="font-weight: bold;" class="mycode_b">References:</span> <a href="https://www.aapanel.com/docs/Function/AppStore.html" target="_blank" rel="noopener" class="mycode_url">aaPanel App Store documentation</a> and <a href="https://www.php.net/supported-versions.php" target="_blank" rel="noopener" class="mycode_url">PHP supported versions</a>. Catalog review and original lab screenshot: © AdminsForum.]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">You do not need every App Store app to host a website.</span> Start with the components your application requires, then add optional tools for a specific purpose. This reference explains all 98 rows visible in our lab's catalog on 13 October 2026. Availability, versions and prices can change. The descriptions below are our practical summaries, not claims that every plugin has been installed or tested.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">1. Find and understand the App Store</span><br />
Open <span style="font-weight: bold;" class="mycode_b">App Store → Official App</span>. Search by name. Use <span style="font-weight: bold;" class="mycode_b">ALL</span> for the catalog and <span style="font-weight: bold;" class="mycode_b">Installed</span> to see services already present. Deployment, Tools, Plug-ins and Professional narrow the list. <span style="font-weight: bold;" class="mycode_b">Setting</span> opens an installed component's controls; <span style="font-weight: bold;" class="mycode_b">Install</span> starts setup for an available component; paid entries may show a purchase action. Do not treat a catalog listing as proof that an app is running.<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://adminsforum.com/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=133" target="_blank" title="">appstore-branded-20261013.jpg</a> (Size: 239.23 KB / Downloads: 6)
<!-- end: postbit_attachments_attachment --><br />
<span style="font-style: italic;" class="mycode_i">Our Installed view contains ten components. The full 98-row catalog also includes optional and retired entries.</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">2. Choose a small starting stack</span><br />
For a typical PHP website, choose a supported web server, a PHP runtime compatible with the application and a database when required. phpMyAdmin is an optional administration interface, not the database itself. Redis is optional caching infrastructure. Mail Server and Pure-FTPd are separate services: install them only when you need to operate mail or FTP. Our lab includes multiple web servers to demonstrate hosting configurations; a beginner does not need to install all three.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">3. Before clicking Install</span><br />
Check operating-system and panel-version compatibility, memory/disk requirements and existing dependencies. Back up configuration and data. Review new ports and credentials. A plugin marked Free can still use a cloud account with quotas or charges. A Paid label below means the catalog listed a price; it does not define the terms of a subscription or guarantee current pricing. Review licensing in your own account. After installation, check service status, application behavior and firewall rules.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">4. Core hosting, database and runtime entries</span><br />
<span style="font-weight: bold;" class="mycode_b">Nginx 1.30.5 — Listed Free</span><br />
Serves websites and can reverse-proxy application backends.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Apache 2.4.62 — Listed Free</span><br />
Serves websites with Apache modules and per-site configuration.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">MySQL 10.11.10-MariaDB — Listed Free</span><br />
The lab catalog label refers to the installed MariaDB relational database; applications need compatible database settings.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Mail Server 7.4.1 — Listed Free</span><br />
Manages mail services; delivery also requires DNS, certificates, reverse DNS and provider connectivity.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Redis 7.4.11 — Listed Free</span><br />
Provides a key-value service used for caches and other applications; secure access and avoid shared-cache flushes.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Pure-Ftpd 1.0.49 — Listed Free</span><br />
Provides FTP/FTPS accounts and transfers; require encryption and restrict user folders.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">phpMyAdmin 5.2 — Listed Free</span><br />
Provides a browser interface for MySQL/MariaDB administration; protect access.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Node.js version manager — Listed Free</span><br />
Manages Node.js runtimes; check project compatibility and conflicts with older managers.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">ffmpeg manager — Listed Free</span><br />
Installs and manages FFmpeg for media conversion; resource use depends on the job.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">MongoDB — Listed Free</span><br />
Provides a document database for applications designed to use it.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Memcached — Listed Free</span><br />
Provides an in-memory cache; restrict network access and expect cache contents to be disposable.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">elasticsearch — Listed Free</span><br />
Provides search and analytics infrastructure; plan its memory and storage requirements.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Openlitespeed 1.8.5 — Listed Free</span><br />
Provides the OpenLiteSpeed web server; its PHP handling differs from Nginx/PHP-FPM.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">RabbitMQ — Listed Free</span><br />
Provides a message broker for applications that need queues.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PostgreSQL Manager — Listed Free</span><br />
Installs and manages PostgreSQL databases.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Supervisor — Listed Free</span><br />
Keeps configured application processes running; set the correct user and working directory.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Java Manager — Listed Free</span><br />
Supports Java/JSP deployment management; choose compatible runtimes.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Mariadb multi-version management (Docker) — Listed Free</span><br />
Runs multiple MariaDB versions in containers; separate ports, data and backups.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">5. PHP version entries</span><br />
The catalog lists PHP-8.5, PHP-8.4, PHP-8.3, PHP-8.2, PHP-8.1, PHP-8.0, PHP-7.4, PHP-7.3, PHP-7.2, PHP-7.1, PHP-7.0, PHP-5.6, PHP-5.5, PHP-5.4, PHP-5.3, PHP-5.2. All were listed Free. Each is a PHP runtime version, not a different website application. Select the version required by your software and still covered by appropriate security support. Old PHP 5.x and 7.x entries are legacy choices, not recommendations for a new site. Check the official support table before choosing or migrating a version. Installing a newer runtime does not automatically switch every existing website to it. Back up and test the site, required extensions and the selected web server before changing its runtime.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">6. Optional apps and plugins</span><br />
<span style="font-weight: bold;" class="mycode_b">Site Diagnosis — Listed Paid</span><br />
Helps investigate common website failures; verify its suggestions against the actual logs.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Network Threat Detection — Listed Paid</span><br />
Reviews network traffic for suspicious activity; check the supported OS before installing.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Website Analytics — Listed Paid</span><br />
Adds visitor analytics; review tracking, privacy and storage requirements.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Files Sync — Listed Paid</span><br />
Transfers files between locations on a schedule or continuously; test conflict and deletion behavior first.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Network Scan Detection — Listed Paid</span><br />
Looks for scanning activity against the server; alerts still need investigation.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">aaPanel Daily Report — Listed Paid</span><br />
Summarizes operational and security information for regular review.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Website statistics-v2 — Listed Paid</span><br />
Provides website traffic statistics for supported web servers.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Nginx WAF — Listed Paid</span><br />
Adds application-layer filtering for Nginx; tune rules to avoid blocking legitimate requests.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Tamper-proof for Enterprise — Listed Paid</span><br />
Restricts unwanted website file changes; review incompatibilities with other tamper protection.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Load Balance — Listed Paid</span><br />
Distributes requests across backends; requires healthy services and a tested routing plan.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">aaPanel Mobile — Listed Paid</span><br />
Provides mobile management access; protect the associated account.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Apache WAF — Listed Paid</span><br />
Adds application-layer filtering for Apache; review compatibility and false positives.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Microsoft OneDrive — Listed Free</span><br />
Stores backups in a Microsoft cloud account; account limits and charges are separate.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PHP code security — Listed Paid</span><br />
Adds PHP behavior checks; test application compatibility before enabling blocking.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Task manager — Listed Paid</span><br />
Provides controls for processes and other system tasks; stopping the wrong service can interrupt hosting.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Website Tamper-proof — Listed Paid</span><br />
Protects selected website files against changes; allow your legitimate deployment workflow.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">aaPanel user Manager — Listed Paid</span><br />
Manages panel users and menu permissions on supported panel versions; grant the minimum access needed.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">System hardening — Listed Paid</span><br />
Offers system protection settings; review each change and its recovery route.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">File monitor — Listed Paid</span><br />
Records file changes and offers related checks or backups.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Disk analysis — Listed Paid</span><br />
Helps locate large files and directories; review files before cleanup.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">aaCloud — Listed Free</span><br />
Connects servers to centralized management; review the access and data involved.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">OpenClaw(Docker) — Listed Free</span><br />
Runs a self-hosted AI assistant through Docker; plan disk, memory, model and integration requirements.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">OpenClaw — Listed Free</span><br />
Runs a self-hosted AI assistant; use a separate lab and review messaging integrations and credentials.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Tencent EdgeOne CDN — Listed Free</span><br />
Connects edge/CDN services; review the provider account, plan and DNS requirements.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Anti-intrusion — Listed Paid</span><br />
Adds protections around service and process activity; validate compatibility with your workloads.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Website basic Statistics — Listed Free</span><br />
Provides a basic view of website visits.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">CloudFlare free CDN — Listed Free</span><br />
Integrates Cloudflare website/CDN configuration; DNS and account requirements still apply.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Website Log Analyzer — Listed Free</span><br />
Analyzes selected Nginx access logs to help investigate traffic.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">WebSite Speed — Listed Free</span><br />
Offers website acceleration controls; review its current documentation and test before enabling.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">WebHook — Listed Free</span><br />
Runs configured actions on callbacks; protect webhook secrets and limit command privileges.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">DeepSeek-R1 — Listed Free</span><br />
Provides an AI model integration; review its current deployment, memory and model requirements.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">S3 Storage (AWS S3) — Listed Free</span><br />
Sends backups to S3-compatible storage; protect access keys and test recovery.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Google Drive — Listed Free</span><br />
Sends backups to Google Drive; verify account authorization and storage capacity.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Fail2ban Manager — Listed Free</span><br />
Manages bans triggered by repeated authentication failures; verify log paths and trusted-client access.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Cloud dns — Listed Free</span><br />
Manages supported DNS-provider records; use narrowly scoped provider tokens.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">DDNS Manager — Listed Free</span><br />
Updates supported DNS records when an address changes.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">One-click migration beta — Listed Free</span><br />
Helps migrate panel data; verify backups, compatibility and the destination before relying on it.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">one-click deployment — Listed Free</span><br />
Deploys supported applications; update and secure each application after installation.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Intrusion Detection — Listed Free</span><br />
Monitors for possible intrusion activity; review alerts instead of treating them as proof.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">FTP Storage — Listed Free</span><br />
Sends backups to an FTP destination; review encryption support before transmitting private data.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">ClamAV — Listed Free</span><br />
Scans files for malware signatures; scan results do not replace patching or incident review.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">frp manager — Listed Free</span><br />
Manages reverse-proxy tunnels; review which private services become reachable.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Platform Ops — Listed Paid</span><br />
Coordinates maintenance across servers; protect stored access and review batch operations.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Disk Mount Manager — Listed Free</span><br />
Manages disk mounts; back up first and distinguish mounting from formatting.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Google Cloud Storage — Listed Free</span><br />
Sends backups to Google Cloud Storage; provider permissions and charges are separate.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Performance testing — Listed Free</span><br />
Runs CPU, memory, disk and network benchmarks; schedule away from busy production periods.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">System boot items — Listed Free</span><br />
Manages startup services and environment settings; avoid disabling hosting dependencies.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">NFS Manager — Listed Paid</span><br />
Manages network file shares and mounts; restrict clients and export permissions.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Server performance testing — Listed Free</span><br />
Provides server benchmarking; tests can compete with live workloads.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Linux Tools — Listed Free</span><br />
Provides system utilities including DNS, swap and network settings; review disruptive changes.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PHP Guardian — Listed Free</span><br />
Monitors PHP-FPM availability; investigate the underlying failure rather than only restarting it.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Log cleanup — Listed Free</span><br />
Removes selected logs or temporary data; retain troubleshooting and audit evidence first.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Anti-Spam Gateway — Listed Free</span><br />
Filters mail through a gateway; review routing and false-positive behavior.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">IP setup tool — Listed Free</span><br />
Changes network address configuration; its listed OS support is old, so check compatibility and console recovery.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Nginx free firewall — Listed Free</span><br />
The catalog gives little detail; check maintenance and documentation before choosing it for protection.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">7. Retired or replaced catalog entries</span><br />
These rows were still visible but their catalog notices direct users to replacements. Do not use an old install guide without checking the current location and support status.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Dns Manager — Listed Free</span><br />
Retired catalog entry; use the panel Domains area indicated by the catalog.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">aaPanel AI Assistant — Listed Free</span><br />
Unmaintained plugin entry; use the current AI menu indicated by the catalog.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Sync Tool — Listed Paid</span><br />
Retired entry; the catalog directs users to Files Sync.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Abnormal Push — Listed Paid</span><br />
Retired entry; the catalog directs users to Settings → Alarm.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">SYS Firewall — Listed Free</span><br />
Retired entry; use the current Security area.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PM2 Manager — Listed Free</span><br />
Retired entry; use Website → Node Project as indicated by the catalog.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Docker Manager — Listed Free</span><br />
Retired entry; use the current Docker menu.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Python Manager — Listed Free</span><br />
Older entry marked for replacement; use Website → Python Project.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Website statistics — Listed Paid</span><br />
Retired entry; use Website statistics-v2.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">8. How to verify an installation</span><br />
Return to Installed, open Setting, confirm the service status and inspect logs. Test the actual function: load a website, connect to the database through the intended private route, transfer a file using encryption or restore a backup into an isolated environment. A green service indicator alone does not prove the application is configured correctly. If setup fails, record the app/version, OS, precise error and relevant redacted log lines when asking for support.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Lab scope</span><br />
The installed view shows Nginx, Apache, MariaDB, Mail Server, Redis, Pure-FTPd, phpMyAdmin, PHP 8.5, PHP 8.4 and OpenLiteSpeed. Our related guides demonstrate selected functions of this stack. The remaining catalog entries are explanations based on the visible catalog; they have not all been installed, audited or benchmarked.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Continue with focused guides</span><br />
<a href="https://adminsforum.com/Thread-guide-enable-redis-object-cache-for-wordpress-in-aapanel" target="_blank" rel="noopener" class="mycode_url">WordPress Redis object cache</a><br />
<a href="https://adminsforum.com/Thread-guide-install-pure-ftpd-in-aapanel-and-check-the-ftp-service" target="_blank" rel="noopener" class="mycode_url">Pure-FTPd installation and service checks</a><br />
<a href="https://adminsforum.com/Thread-guide-configure-aapanel-firewall-rules-without-losing-ssh-access" target="_blank" rel="noopener" class="mycode_url">Firewall rules after installing services</a><br />
<br />
<span style="font-weight: bold;" class="mycode_b">References:</span> <a href="https://www.aapanel.com/docs/Function/AppStore.html" target="_blank" rel="noopener" class="mycode_url">aaPanel App Store documentation</a> and <a href="https://www.php.net/supported-versions.php" target="_blank" rel="noopener" class="mycode_url">PHP supported versions</a>. Catalog review and original lab screenshot: © AdminsForum.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Configure Cloudflare Tunnel in aaPanel]]></title>
			<link>https://adminsforum.com/Thread-guide-configure-cloudflare-tunnel-in-aapanel</link>
			<pubDate>Sun, 11 Oct 2026 21:02:29 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://adminsforum.com/member.php?action=profile&uid=2">DEV</a>]]></dc:creator>
			<guid isPermaLink="false">https://adminsforum.com/Thread-guide-configure-cloudflare-tunnel-in-aapanel</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">This is the next guide after <a href="https://adminsforum.com/Thread-guide-install-cloudflare-tunnel-plugin-in-aapanel-free-edition" target="_blank" rel="noopener" class="mycode_url">installing the Cloudflare Tunnel plugin in aaPanel</a>.</span><br />
<br />
We will connect one test website to a public hostname using fdciabdul's community plugin. The example hostname is tunnel-test.example.com: replace it everywhere with a subdomain of your own Cloudflare-managed domain.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Verification scope:</span> Plugin controls and behavior are based on source commit ff0c7359f050fbca2b9efab11b61aa462d65b2d0 (metadata 1.3.0), checked against Cloudflare's documentation. Live plugin installation, account authorization and end-to-end screenshots remain pending. This is a written setup walkthrough, not a claim that our lab tunnel is already running.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. Prepare the test website first</span></span><br />
Open aaPanel → Website and create or select a harmless test website bound to your chosen hostname. Put an identifiable test page in its document root, for example “AdminsForum tunnel test.” Use the web server and listening port that actually serve this website.<br />
<br />
For a local HTTP origin on port 80, open Terminal and check:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>curl -I -H 'Host: tunnel-test.example.com' http://127.0.0.1:80</code></div></div>Replace the hostname. The response must belong to the intended site. A connection refusal means the local server/port needs fixing first. A default website means its hostname binding needs checking. An unexpected redirect needs investigating before adding the tunnel.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Why this comes first:</span> Cloudflare forwards requests to the origin you configure. It cannot repair an incorrect local website or missing web server.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. Check the Cloudflare zone</span></span><br />
Your domain must be active in Cloudflare with its authoritative nameservers set correctly. Decide on a dedicated unused test subdomain. Inspect its DNS records before proceeding and record any existing values you need to preserve.<br />
<br />
Do not reuse a hostname serving an existing website or mail service. The reviewed plugin has DNS conflict and cleanup limitations described in our <a href="https://adminsforum.com/Thread-guide-fix-cloudflare-tunnel-profile-not-found-in-aapanel" target="_blank" rel="noopener" class="mycode_url">plugin review and fixes</a>.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. Configure the account profile and credentials</span></span><br />
Open Cloudflare Tunnel in aaPanel, then its credentials/profile section. Give the profile a recognizable name, such as AdminsLab.<br />
<br />
There are two separate credentials in this locally managed workflow:<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Browser-login certificate:</span> supports the cloudflared CLI operations used to create/manage tunnels.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">DNS API token:</span> lets the plugin discover the zone and automate its CNAME record.<br />
</li>
</ul>
Saving a DNS token is not proof that tunnel CLI login is ready. Likewise, browser authorization does not prove the token can edit DNS.<br />
<br />
For the DNS token, use zone-scoped permissions suitable for the plugin's zone lookup and DNS edits, limited to the intended test zone. Its code lists zones and modifies records; verify both operations instead of relying only on a token-valid response. Avoid giving unrelated domains to the token.<br />
<br />
Use the plugin's Login/Get login URL control for the intended profile, follow the Cloudflare browser authorization, then return and check the result. Protect tokens, login links and certificate files; redact them in screenshots.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">If Login reports “Profile not found”:</span> an empty profile is filtered out by the reviewed upstream lookup. Stop and follow the version-specific fix article linked above. Do not keep creating duplicate profiles.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">4. Create a locally managed tunnel</span></span><br />
In the tunnel section, select the authorized profile and enter a unique name such as adminsforum-lab. Use Create &amp; use, or Create followed by Use if your installed build separates those actions.<br />
<br />
Record the returned tunnel UUID and confirm the selected profile. Tunnel creation generates credentials; it does not by itself establish a running connector.<br />
<br />
Start with a fresh locally managed test tunnel. A tunnel managed through the Cloudflare dashboard can obtain its ingress remotely and ignore the local configuration this plugin writes. Mixing both management approaches makes troubleshooting confusing.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">5. Add the hostname mapping</span></span><br />
In the hostnames/ingress section:<br />
<ol type="1" class="mycode_list"><li>Enter your dedicated hostname, such as tunnel-test.example.com.<br />
</li>
<li>Set the local service to <a href="http://127.0.0.1:80" target="_blank" rel="noopener" class="mycode_url">http://127.0.0.1:80</a> only if that is the origin verified in step 1. Use the actual port for your website.<br />
</li>
<li>Select the Cloudflare zone that owns the hostname and the appropriate profile where offered.<br />
</li>
<li>Enable automatic CNAME creation only after checking that the hostname has no conflicting records.<br />
</li>
<li>Save the mapping and read the complete result.<br />
</li>
</ol>
A local HTTP service behind the connector is different from the public HTTPS address visitors use. If you choose an HTTPS origin, validate its certificate and hostname/SNI rather than disabling certificate verification as a default fix.<br />
<br />
In Cloudflare DNS, verify a proxied CNAME for the chosen hostname pointing to the selected UUID's cfargotunnel.com target. Do not create a second competing A/AAAA record for that same tunnel hostname.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">6. Verify configuration and the connector service</span></span><br />
The plugin writes its local configuration to /etc/cloudflared/config.yml. Review the tunnel ID, credentials path, intended hostname/service and final fallback rule. Avoid posting the credentials file itself.<br />
<br />
Validate the generated ingress:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>cloudflared tunnel --config /etc/cloudflared/config.yml ingress validate</code></div></div>Use the Advanced service controls to install/start the service when needed, then check its actual state:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>systemctl is-active cloudflared
journalctl -u cloudflared -n 50 --no-pager</code></div></div><span style="font-weight: bold;" class="mycode_b">Expected checkpoint:</span> ingress validation succeeds, the intended service is active and its logs show successful connector registration. A saved row or an “apply succeeded” message alone is insufficient: the reviewed upstream code can miss restart failures.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">7. Open the public website</span></span><br />
Open <a href="https://tunnel-test.example.com" target="_blank" rel="noopener" class="mycode_url">https://tunnel-test.example.com</a> using your own hostname. Verify the identifiable page from step 1, not merely a response from any website.<br />
<br />
Check these independently:<ul class="mycode_list"><li>The correct local origin responds.<br />
</li>
<li>The intended tunnel/profile is selected.<br />
</li>
<li>DNS points to that tunnel.<br />
</li>
<li>Ingress maps the hostname to the correct origin.<br />
</li>
<li>The connector is actually running.<br />
</li>
<li>The public page is the intended website.<br />
</li>
</ul>
Publishing a website through a tunnel does not automatically create a Cloudflare Access login policy. This walkthrough maps a public test website; administration/private applications need a separate access-control design.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">8. Troubleshoot the failing checkpoint</span></span><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">No zone listed:</span> check account ownership and the token's zone scope/permissions, then refresh the zone list.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Wrong website:</span> check the aaPanel site binding and Host header. Use httpHostHeader only when deliberately required by the origin.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Origin connection error:</span> repeat the local request and check the service port.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Certificate error for HTTPS origin:</span> check certificate trust and SNI.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Connector not connected:</span> inspect service logs and outbound connectivity.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Save/apply failed:</span> inspect both DNS and configuration. Upstream rollback does not reliably restore every changed component.<br />
</li>
</ul>
Restore recorded DNS/configuration values deliberately if abandoning the test. Do not delete unrelated records to clear an error.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Guide sequence:</span> <a href="https://adminsforum.com/Thread-guide-install-cloudflare-tunnel-plugin-in-aapanel-free-edition" target="_blank" rel="noopener" class="mycode_url">Installation</a> → this configuration walkthrough → <a href="https://adminsforum.com/Thread-guide-fix-cloudflare-tunnel-profile-not-found-in-aapanel" target="_blank" rel="noopener" class="mycode_url">version-specific fixes</a>.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">References:</span> <a href="https://github.com/fdciabdul/Cloudflare-Tunnel-aaPanel" target="_blank" rel="noopener" class="mycode_url">Plugin source and author instructions</a> · <a href="https://developers.cloudflare.com/tunnel/features/locally-managed-tunnels/create-local-tunnel/" target="_blank" rel="noopener" class="mycode_url">Cloudflare locally managed tunnel guide</a> · <a href="https://developers.cloudflare.com/tunnel/features/locally-managed-tunnels/tunnel-permissions/" target="_blank" rel="noopener" class="mycode_url">Cloudflare credential permissions</a>.]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">This is the next guide after <a href="https://adminsforum.com/Thread-guide-install-cloudflare-tunnel-plugin-in-aapanel-free-edition" target="_blank" rel="noopener" class="mycode_url">installing the Cloudflare Tunnel plugin in aaPanel</a>.</span><br />
<br />
We will connect one test website to a public hostname using fdciabdul's community plugin. The example hostname is tunnel-test.example.com: replace it everywhere with a subdomain of your own Cloudflare-managed domain.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Verification scope:</span> Plugin controls and behavior are based on source commit ff0c7359f050fbca2b9efab11b61aa462d65b2d0 (metadata 1.3.0), checked against Cloudflare's documentation. Live plugin installation, account authorization and end-to-end screenshots remain pending. This is a written setup walkthrough, not a claim that our lab tunnel is already running.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. Prepare the test website first</span></span><br />
Open aaPanel → Website and create or select a harmless test website bound to your chosen hostname. Put an identifiable test page in its document root, for example “AdminsForum tunnel test.” Use the web server and listening port that actually serve this website.<br />
<br />
For a local HTTP origin on port 80, open Terminal and check:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>curl -I -H 'Host: tunnel-test.example.com' http://127.0.0.1:80</code></div></div>Replace the hostname. The response must belong to the intended site. A connection refusal means the local server/port needs fixing first. A default website means its hostname binding needs checking. An unexpected redirect needs investigating before adding the tunnel.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Why this comes first:</span> Cloudflare forwards requests to the origin you configure. It cannot repair an incorrect local website or missing web server.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. Check the Cloudflare zone</span></span><br />
Your domain must be active in Cloudflare with its authoritative nameservers set correctly. Decide on a dedicated unused test subdomain. Inspect its DNS records before proceeding and record any existing values you need to preserve.<br />
<br />
Do not reuse a hostname serving an existing website or mail service. The reviewed plugin has DNS conflict and cleanup limitations described in our <a href="https://adminsforum.com/Thread-guide-fix-cloudflare-tunnel-profile-not-found-in-aapanel" target="_blank" rel="noopener" class="mycode_url">plugin review and fixes</a>.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. Configure the account profile and credentials</span></span><br />
Open Cloudflare Tunnel in aaPanel, then its credentials/profile section. Give the profile a recognizable name, such as AdminsLab.<br />
<br />
There are two separate credentials in this locally managed workflow:<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Browser-login certificate:</span> supports the cloudflared CLI operations used to create/manage tunnels.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">DNS API token:</span> lets the plugin discover the zone and automate its CNAME record.<br />
</li>
</ul>
Saving a DNS token is not proof that tunnel CLI login is ready. Likewise, browser authorization does not prove the token can edit DNS.<br />
<br />
For the DNS token, use zone-scoped permissions suitable for the plugin's zone lookup and DNS edits, limited to the intended test zone. Its code lists zones and modifies records; verify both operations instead of relying only on a token-valid response. Avoid giving unrelated domains to the token.<br />
<br />
Use the plugin's Login/Get login URL control for the intended profile, follow the Cloudflare browser authorization, then return and check the result. Protect tokens, login links and certificate files; redact them in screenshots.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">If Login reports “Profile not found”:</span> an empty profile is filtered out by the reviewed upstream lookup. Stop and follow the version-specific fix article linked above. Do not keep creating duplicate profiles.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">4. Create a locally managed tunnel</span></span><br />
In the tunnel section, select the authorized profile and enter a unique name such as adminsforum-lab. Use Create &amp; use, or Create followed by Use if your installed build separates those actions.<br />
<br />
Record the returned tunnel UUID and confirm the selected profile. Tunnel creation generates credentials; it does not by itself establish a running connector.<br />
<br />
Start with a fresh locally managed test tunnel. A tunnel managed through the Cloudflare dashboard can obtain its ingress remotely and ignore the local configuration this plugin writes. Mixing both management approaches makes troubleshooting confusing.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">5. Add the hostname mapping</span></span><br />
In the hostnames/ingress section:<br />
<ol type="1" class="mycode_list"><li>Enter your dedicated hostname, such as tunnel-test.example.com.<br />
</li>
<li>Set the local service to <a href="http://127.0.0.1:80" target="_blank" rel="noopener" class="mycode_url">http://127.0.0.1:80</a> only if that is the origin verified in step 1. Use the actual port for your website.<br />
</li>
<li>Select the Cloudflare zone that owns the hostname and the appropriate profile where offered.<br />
</li>
<li>Enable automatic CNAME creation only after checking that the hostname has no conflicting records.<br />
</li>
<li>Save the mapping and read the complete result.<br />
</li>
</ol>
A local HTTP service behind the connector is different from the public HTTPS address visitors use. If you choose an HTTPS origin, validate its certificate and hostname/SNI rather than disabling certificate verification as a default fix.<br />
<br />
In Cloudflare DNS, verify a proxied CNAME for the chosen hostname pointing to the selected UUID's cfargotunnel.com target. Do not create a second competing A/AAAA record for that same tunnel hostname.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">6. Verify configuration and the connector service</span></span><br />
The plugin writes its local configuration to /etc/cloudflared/config.yml. Review the tunnel ID, credentials path, intended hostname/service and final fallback rule. Avoid posting the credentials file itself.<br />
<br />
Validate the generated ingress:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>cloudflared tunnel --config /etc/cloudflared/config.yml ingress validate</code></div></div>Use the Advanced service controls to install/start the service when needed, then check its actual state:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>systemctl is-active cloudflared
journalctl -u cloudflared -n 50 --no-pager</code></div></div><span style="font-weight: bold;" class="mycode_b">Expected checkpoint:</span> ingress validation succeeds, the intended service is active and its logs show successful connector registration. A saved row or an “apply succeeded” message alone is insufficient: the reviewed upstream code can miss restart failures.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">7. Open the public website</span></span><br />
Open <a href="https://tunnel-test.example.com" target="_blank" rel="noopener" class="mycode_url">https://tunnel-test.example.com</a> using your own hostname. Verify the identifiable page from step 1, not merely a response from any website.<br />
<br />
Check these independently:<ul class="mycode_list"><li>The correct local origin responds.<br />
</li>
<li>The intended tunnel/profile is selected.<br />
</li>
<li>DNS points to that tunnel.<br />
</li>
<li>Ingress maps the hostname to the correct origin.<br />
</li>
<li>The connector is actually running.<br />
</li>
<li>The public page is the intended website.<br />
</li>
</ul>
Publishing a website through a tunnel does not automatically create a Cloudflare Access login policy. This walkthrough maps a public test website; administration/private applications need a separate access-control design.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">8. Troubleshoot the failing checkpoint</span></span><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">No zone listed:</span> check account ownership and the token's zone scope/permissions, then refresh the zone list.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Wrong website:</span> check the aaPanel site binding and Host header. Use httpHostHeader only when deliberately required by the origin.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Origin connection error:</span> repeat the local request and check the service port.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Certificate error for HTTPS origin:</span> check certificate trust and SNI.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Connector not connected:</span> inspect service logs and outbound connectivity.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Save/apply failed:</span> inspect both DNS and configuration. Upstream rollback does not reliably restore every changed component.<br />
</li>
</ul>
Restore recorded DNS/configuration values deliberately if abandoning the test. Do not delete unrelated records to clear an error.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Guide sequence:</span> <a href="https://adminsforum.com/Thread-guide-install-cloudflare-tunnel-plugin-in-aapanel-free-edition" target="_blank" rel="noopener" class="mycode_url">Installation</a> → this configuration walkthrough → <a href="https://adminsforum.com/Thread-guide-fix-cloudflare-tunnel-profile-not-found-in-aapanel" target="_blank" rel="noopener" class="mycode_url">version-specific fixes</a>.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">References:</span> <a href="https://github.com/fdciabdul/Cloudflare-Tunnel-aaPanel" target="_blank" rel="noopener" class="mycode_url">Plugin source and author instructions</a> · <a href="https://developers.cloudflare.com/tunnel/features/locally-managed-tunnels/create-local-tunnel/" target="_blank" rel="noopener" class="mycode_url">Cloudflare locally managed tunnel guide</a> · <a href="https://developers.cloudflare.com/tunnel/features/locally-managed-tunnels/tunnel-permissions/" target="_blank" rel="noopener" class="mycode_url">Cloudflare credential permissions</a>.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Install Cloudflare Tunnel Plugin in aaPanel]]></title>
			<link>https://adminsforum.com/Thread-guide-install-cloudflare-tunnel-plugin-in-aapanel</link>
			<pubDate>Sun, 11 Oct 2026 20:54:06 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://adminsforum.com/member.php?action=profile&uid=2">DEV</a>]]></dc:creator>
			<guid isPermaLink="false">https://adminsforum.com/Thread-guide-install-cloudflare-tunnel-plugin-in-aapanel</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">Start here: install the community Cloudflare Tunnel plugin before configuring a tunnel or applying bug fixes.</span><br />
<br />
This plugin adds a Cloudflare Tunnel wizard to aaPanel. It is maintained by fdciabdul and is a third-party extension. The plugin interface and the cloudflared connector are separate components: importing the ZIP installs the interface; the first wizard step installs the connector.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Verification scope:</span> These steps follow the author's installation instructions and our source review of commit ff0c7359f050fbca2b9efab11b61aa462d65b2d0 (source metadata 1.3.0). We have not yet completed a live import and end-to-end Cloudflare test. Screenshots will be added after that test; this article does not claim a lab-tested installation.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. What you need</span></span><ul class="mycode_list"><li>An aaPanel installation and access to its App Store as an administrator.<br />
</li>
<li>A disposable Linux lab server for your first attempt.<br />
</li>
<li>Outbound internet access for downloading cloudflared.<br />
</li>
<li>For the later configuration guide: a Cloudflare account, a domain using Cloudflare DNS and a working local test website.<br />
</li>
</ul>
You do not need to create a tunnel or change website DNS just to import the plugin. A domain becomes necessary when you connect a public hostname to your website.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. Check existing tunnels and make a backup</span></span><br />
If cloudflared already runs on this server, record its service and configuration before proceeding. The plugin manages /etc/cloudflared/config.yml and the cloudflared service; do not use an existing production connector as a learning environment.<br />
<br />
For a read-only check in aaPanel's Terminal:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>command -v cloudflared
systemctl status cloudflared --no-pager</code></div></div>A missing binary or service on a fresh server is expected. If a service is present, inspect who manages it before importing another controller. Back up an existing /www/server/panel/plugin/cloudflare_tunnel directory, its data subdirectory, /etc/cloudflared and any associated service configuration before upgrading. Store credential backups outside public website folders.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. Download the author's plugin archive</span></span><br />
Open the <a href="https://github.com/fdciabdul/Cloudflare-Tunnel-aaPanel" target="_blank" rel="noopener" class="mycode_url">author's repository</a> and use its Releases link to choose the intended plugin release. Download the plugin ZIP asset rather than GitHub's generic “Source code” archive.<br />
<br />
The README names a 1.2.0 archive, while the source we reviewed identifies itself as 1.3.0. Check the actual release asset and info.json; do not assume an old filename is the newest version. If no suitable plugin archive is available, stop at this step rather than importing the entire repository ZIP.<br />
<br />
Open the downloaded archive locally before uploading it. The author's packaging instructions put info.json, install.sh, index.html, icon.png and the Python modules at the archive root. A repository wrapper folder is different from this import format. The archive must not contain another user's API tokens, certificates or runtime data.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">4. Import the ZIP into aaPanel</span></span><br />
<ol type="1" class="mycode_list"><li>Sign into aaPanel on the lab server.<br />
</li>
<li>Open <span style="font-weight: bold;" class="mycode_b">App Store</span> in the sidebar.<br />
</li>
<li>Locate the <span style="font-weight: bold;" class="mycode_b">Import</span> or upload control; the author describes it at the top right. Its placement can vary between panel versions.<br />
</li>
<li>Choose the plugin ZIP downloaded in step 3.<br />
</li>
<li>Submit the import and wait for the installation result.<br />
</li>
<li>Find <span style="font-weight: bold;" class="mycode_b">Cloudflare Tunnel</span> in the installed applications and open it.<br />
</li>
</ol>
Do not search for an official Cloudflare Tunnel product and assume it is the same extension. This guide refers specifically to fdciabdul's plugin.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Expected checkpoint:</span> The Cloudflare Tunnel interface opens with sections for the binary, credentials/profiles, tunnel and hostnames. Record the installed version and compare it with your downloaded archive.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">5. Install the cloudflared connector</span></span><br />
<ol type="1" class="mycode_list"><li>Open the first wizard section for the cloudflared binary.<br />
</li>
<li>Use <span style="font-weight: bold;" class="mycode_b">Install / Update</span>.<br />
</li>
<li>Read the complete result and allow the download/install operation to finish.<br />
</li>
<li>Use <span style="font-weight: bold;" class="mycode_b">Recheck</span> if available.<br />
</li>
<li>Confirm the binary version, either in the interface or with the command below.<br />
</li>
</ol>
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>cloudflared --version</code></div></div>The reviewed implementation returns “already installed” when the binary exists. The button label therefore does not prove that an existing binary was upgraded. Record the reported version instead of repeatedly pressing Install / Update.<br />
<br />
If the download fails, check outbound HTTPS access, the server's architecture and the installation error. Keep certificate verification enabled. Import success alone does not prove the connector was installed.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">6. Stop at the installation checkpoint</span></span><br />
At this point the plugin should open and cloudflared should report its version. A public website is not expected to work yet: account authorization, tunnel creation, hostname mapping and service verification are later configuration steps.<br />
<br />
The plugin exposes separate credential mechanisms. A browser-login certificate supports tunnel CLI operations; an API token is used for Cloudflare DNS automation. Do not assume that saving a DNS token completes browser authorization.<br />
<br />
If you add an empty profile in the reviewed 1.3.0 source and Login returns “Profile not found,” read <a href="https://adminsforum.com/Thread-guide-fix-cloudflare-tunnel-profile-not-found-in-aapanel" target="_blank" rel="noopener" class="mycode_url">Fix Cloudflare Tunnel Profile Not Found in aaPanel</a>. Match the installed source version before applying a code change. That article also describes other limitations; it is not a certified plugin release.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Common installation problems</span></span><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">ZIP import fails:</span> confirm that this is the plugin asset with the required files at its root, not the generic repository archive. Save the exact error.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Plugin opens with missing methods:</span> check for mismatched old and new files. Back up runtime data before replacing anything. The author's source installation notes call for a panel restart after first install or Python changes; a restart briefly interrupts panel sessions.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Binary missing after import:</span> complete the separate connector installation in step 5.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Service is not active:</span> installation alone does not create a configured working tunnel. Continue with account/tunnel configuration before treating this as a fault.<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Guide order:</span> Install plugin → configure account and test website → verify tunnel/service/DNS → troubleshoot any errors.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Source:</span> <a href="https://github.com/fdciabdul/Cloudflare-Tunnel-aaPanel" target="_blank" rel="noopener" class="mycode_url">Cloudflare Tunnel aaPanel plugin repository and installation instructions</a>. Credit belongs to the original author. No reviewed source bundle is being publicly distributed with this article.]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">Start here: install the community Cloudflare Tunnel plugin before configuring a tunnel or applying bug fixes.</span><br />
<br />
This plugin adds a Cloudflare Tunnel wizard to aaPanel. It is maintained by fdciabdul and is a third-party extension. The plugin interface and the cloudflared connector are separate components: importing the ZIP installs the interface; the first wizard step installs the connector.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Verification scope:</span> These steps follow the author's installation instructions and our source review of commit ff0c7359f050fbca2b9efab11b61aa462d65b2d0 (source metadata 1.3.0). We have not yet completed a live import and end-to-end Cloudflare test. Screenshots will be added after that test; this article does not claim a lab-tested installation.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. What you need</span></span><ul class="mycode_list"><li>An aaPanel installation and access to its App Store as an administrator.<br />
</li>
<li>A disposable Linux lab server for your first attempt.<br />
</li>
<li>Outbound internet access for downloading cloudflared.<br />
</li>
<li>For the later configuration guide: a Cloudflare account, a domain using Cloudflare DNS and a working local test website.<br />
</li>
</ul>
You do not need to create a tunnel or change website DNS just to import the plugin. A domain becomes necessary when you connect a public hostname to your website.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. Check existing tunnels and make a backup</span></span><br />
If cloudflared already runs on this server, record its service and configuration before proceeding. The plugin manages /etc/cloudflared/config.yml and the cloudflared service; do not use an existing production connector as a learning environment.<br />
<br />
For a read-only check in aaPanel's Terminal:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>command -v cloudflared
systemctl status cloudflared --no-pager</code></div></div>A missing binary or service on a fresh server is expected. If a service is present, inspect who manages it before importing another controller. Back up an existing /www/server/panel/plugin/cloudflare_tunnel directory, its data subdirectory, /etc/cloudflared and any associated service configuration before upgrading. Store credential backups outside public website folders.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. Download the author's plugin archive</span></span><br />
Open the <a href="https://github.com/fdciabdul/Cloudflare-Tunnel-aaPanel" target="_blank" rel="noopener" class="mycode_url">author's repository</a> and use its Releases link to choose the intended plugin release. Download the plugin ZIP asset rather than GitHub's generic “Source code” archive.<br />
<br />
The README names a 1.2.0 archive, while the source we reviewed identifies itself as 1.3.0. Check the actual release asset and info.json; do not assume an old filename is the newest version. If no suitable plugin archive is available, stop at this step rather than importing the entire repository ZIP.<br />
<br />
Open the downloaded archive locally before uploading it. The author's packaging instructions put info.json, install.sh, index.html, icon.png and the Python modules at the archive root. A repository wrapper folder is different from this import format. The archive must not contain another user's API tokens, certificates or runtime data.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">4. Import the ZIP into aaPanel</span></span><br />
<ol type="1" class="mycode_list"><li>Sign into aaPanel on the lab server.<br />
</li>
<li>Open <span style="font-weight: bold;" class="mycode_b">App Store</span> in the sidebar.<br />
</li>
<li>Locate the <span style="font-weight: bold;" class="mycode_b">Import</span> or upload control; the author describes it at the top right. Its placement can vary between panel versions.<br />
</li>
<li>Choose the plugin ZIP downloaded in step 3.<br />
</li>
<li>Submit the import and wait for the installation result.<br />
</li>
<li>Find <span style="font-weight: bold;" class="mycode_b">Cloudflare Tunnel</span> in the installed applications and open it.<br />
</li>
</ol>
Do not search for an official Cloudflare Tunnel product and assume it is the same extension. This guide refers specifically to fdciabdul's plugin.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Expected checkpoint:</span> The Cloudflare Tunnel interface opens with sections for the binary, credentials/profiles, tunnel and hostnames. Record the installed version and compare it with your downloaded archive.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">5. Install the cloudflared connector</span></span><br />
<ol type="1" class="mycode_list"><li>Open the first wizard section for the cloudflared binary.<br />
</li>
<li>Use <span style="font-weight: bold;" class="mycode_b">Install / Update</span>.<br />
</li>
<li>Read the complete result and allow the download/install operation to finish.<br />
</li>
<li>Use <span style="font-weight: bold;" class="mycode_b">Recheck</span> if available.<br />
</li>
<li>Confirm the binary version, either in the interface or with the command below.<br />
</li>
</ol>
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>cloudflared --version</code></div></div>The reviewed implementation returns “already installed” when the binary exists. The button label therefore does not prove that an existing binary was upgraded. Record the reported version instead of repeatedly pressing Install / Update.<br />
<br />
If the download fails, check outbound HTTPS access, the server's architecture and the installation error. Keep certificate verification enabled. Import success alone does not prove the connector was installed.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">6. Stop at the installation checkpoint</span></span><br />
At this point the plugin should open and cloudflared should report its version. A public website is not expected to work yet: account authorization, tunnel creation, hostname mapping and service verification are later configuration steps.<br />
<br />
The plugin exposes separate credential mechanisms. A browser-login certificate supports tunnel CLI operations; an API token is used for Cloudflare DNS automation. Do not assume that saving a DNS token completes browser authorization.<br />
<br />
If you add an empty profile in the reviewed 1.3.0 source and Login returns “Profile not found,” read <a href="https://adminsforum.com/Thread-guide-fix-cloudflare-tunnel-profile-not-found-in-aapanel" target="_blank" rel="noopener" class="mycode_url">Fix Cloudflare Tunnel Profile Not Found in aaPanel</a>. Match the installed source version before applying a code change. That article also describes other limitations; it is not a certified plugin release.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Common installation problems</span></span><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">ZIP import fails:</span> confirm that this is the plugin asset with the required files at its root, not the generic repository archive. Save the exact error.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Plugin opens with missing methods:</span> check for mismatched old and new files. Back up runtime data before replacing anything. The author's source installation notes call for a panel restart after first install or Python changes; a restart briefly interrupts panel sessions.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Binary missing after import:</span> complete the separate connector installation in step 5.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Service is not active:</span> installation alone does not create a configured working tunnel. Continue with account/tunnel configuration before treating this as a fault.<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Guide order:</span> Install plugin → configure account and test website → verify tunnel/service/DNS → troubleshoot any errors.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Source:</span> <a href="https://github.com/fdciabdul/Cloudflare-Tunnel-aaPanel" target="_blank" rel="noopener" class="mycode_url">Cloudflare Tunnel aaPanel plugin repository and installation instructions</a>. Credit belongs to the original author. No reviewed source bundle is being publicly distributed with this article.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Fix Cloudflare Tunnel Profile Not Found in aaPanel]]></title>
			<link>https://adminsforum.com/Thread-guide-fix-cloudflare-tunnel-profile-not-found-in-aapanel</link>
			<pubDate>Sun, 11 Oct 2026 20:48:38 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://adminsforum.com/member.php?action=profile&uid=2">DEV</a>]]></dc:creator>
			<guid isPermaLink="false">https://adminsforum.com/Thread-guide-fix-cloudflare-tunnel-profile-not-found-in-aapanel</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">New to this plugin? Start with <a href="https://adminsforum.com/Thread-guide-install-cloudflare-tunnel-plugin-in-aapanel-free-edition" target="_blank" rel="noopener" class="mycode_url">Install Cloudflare Tunnel Plugin in aaPanel Free Edition</a>, then use this article if you encounter the profile error.</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">A newly created Cloudflare Tunnel profile can return “Profile not found” before its first browser login. This article explains the confirmed cause and the local code fix, plus the other issues found during review.</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Reviewed build:</span> Community plugin by fdciabdul, source commit ff0c7359f050fbca2b9efab11b61aa462d65b2d0; info.json version 1.3.0. This is a source-level review with isolated tests. Live plugin installation and Cloudflare end-to-end verification are pending. The fixes below do not make the whole plugin a certified or production-tested release.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. Fix “Profile not found” on first login</span></span><br />
The UI allows adding a profile without an API token. However, DnsManager.find_profile() looks in _all_profiles(), which intentionally hides profiles that have neither token nor cert_path. That filter is useful for choosing working DNS credentials, but wrong for resolving the profile that is about to receive its first browser-login certificate.<br />
<br />
In dns_manager.py, change find_profile() to check the saved profiles first:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>def find_profile(self, profile_id):
    for p in self._read_profiles():
        if isinstance(p, dict) and p.get("id") == profile_id:
            return dict(p, virtual=False)
    for p in self._all_profiles():
        if p["id"] == profile_id:
            return p
    return None</code></div></div>Keep the empty-profile filter in _all_profiles(). Do not broadly treat an empty profile as valid API credentials. Our regression test creates an empty saved profile, supplies no usable profiles and verifies that find_profile still returns the intended profile for login. It passes with this change.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. Fix unsafe UI string encoding</span></span><br />
Profile names are inserted into single-quoted JavaScript onclick arguments using an HTML-only encoder. An ordinary apostrophe can break an action; crafted text can introduce script in the authenticated panel UI. Encode for the JavaScript string context first, then the surrounding HTML attribute. The reviewed patch uses a separate jsesc helper for those action arguments, and escapes names/errors in HTML-rendered dialogs. HTML escaping alone is insufficient here.<br />
<br />
Do not test script injection on a live shared panel. Our six isolated JavaScript tests round-trip apostrophes, backslashes, quotes, newlines and markup without executing injected instructions. The entire UI script also parses successfully. We have not demonstrated unauthenticated panel compromise.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. Protect installer staging and credentials</span></span><br />
The original binary installer downloads into one predictable file under /tmp. A privileged process should use a unique private temporary directory, invoke curl/install with argument arrays, restrict download redirects to HTTPS and check command results. The review patch implements that approach. Independent checksum verification and release pinning remain future work.<br />
<br />
Validate tunnel IDs as UUIDs before saving them or constructing credential paths. Apply mode 0600 to existing and newly relocated tunnel JSON credentials, and report relocation failures. Keep credentials out of public web directories, screenshots and support replies.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">4. Fix configuration encoding and restart reporting</span></span><br />
In ingress_manager.py, use proper quoted YAML scalar encoding rather than only replacing quotation marks. JSON-quoted strings are valid YAML scalars and handle backslashes/control characters:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>def _yaml_escape(s):
    return json.dumps(str(s), ensure_ascii=True)</code></div></div>The source also ignores the exit status of systemctl restart. Check it and return a failure when the restart fails:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>restarted = subprocess.run(
    ["systemctl", "restart", SERVICE_NAME],
    capture_output=True, text=True, timeout=30,
)
if restarted.returncode != 0:
    return public.returnMsg(
        False,
        "Config written, but service restart failed: "
        + (restarted.stderr or restarted.stdout),
    )</code></div></div>This change reports a real failure; it does not undo every previous DNS/config change. Do not describe it as complete transactional rollback.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">5. Avoid DNS data loss</span></span><br />
Before an automatic CNAME upsert, inspect every record returned for the hostname. Our patch refuses conflicting non-CNAME or multiple-record responses instead of replacing the first record. A user-selected zone must also match the hostname; stale/unavailable zone selections are rejected rather than silently redirected to another zone.<br />
<br />
For removal, refuse records that are not tunnel-target CNAMEs and check each Cloudflare deletion response. Do not delete A, AAAA, MX or TXT records simply because they share a hostname. Our tests verify these refusal paths and confirm API errors are returned.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Remaining limitation:</span> the patch recognizes tunnel CNAMEs by target suffix, not an ownership manifest for the particular tunnel. Full DNS/config/service rollback and concurrent-write locking are also still needed.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">6. Validate before applying to a server</span></span><br />
Back up the installed plugin directory, runtime data and /etc/cloudflared first. Match the exact source version; do not paste partial changes into an unrelated older release. Check Python syntax and run the isolated tests. Our local review passed <span style="font-weight: bold;" class="mycode_b">13 backend tests and six UI string-encoding checks</span>, plus script parsing and diff whitespace checks.<br />
<br />
Then use a disposable lab server to verify import, empty-profile login, account selection, credentials, origin response, generated ingress, DNS changes and actual service state. An API token accepted by the verification endpoint does not prove the zone permissions needed by this plugin. Browser login for tunnel CLI operations and the DNS API token serve different purposes.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">7. What is not yet fixed or verified</span></span><ul class="mycode_list"><li>Complete rollback across DNS, JSON state, config and service.<br />
</li>
<li>Concurrent profile login and re-login certificate isolation.<br />
</li>
<li>Shared locking and atomic persistence across all managers.<br />
</li>
<li>Independent checksum verification and a real binary update operation.<br />
</li>
<li>aaPanel dispatcher authentication/CSRF behavior and live end-to-end operation.<br />
</li>
</ul>
No public exploit demonstration is needed to explain these fixes. The patched download is not publicly released yet; the written changes above are available for maintainer review.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Credits and references:</span> <a href="https://github.com/fdciabdul/Cloudflare-Tunnel-aaPanel" target="_blank" rel="noopener" class="mycode_url">Original plugin repository</a> · <a href="https://www.aapanel.com/forum/d/25982-plugin-cloudflare-tunnel-manage-cloudflared-ingress-from-the-aapanel-ui" target="_blank" rel="noopener" class="mycode_url">Author's aaPanel thread</a> · <a href="https://developers.cloudflare.com/tunnel/features/locally-managed-tunnels/tunnel-permissions/" target="_blank" rel="noopener" class="mycode_url">Cloudflare tunnel permissions</a>]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">New to this plugin? Start with <a href="https://adminsforum.com/Thread-guide-install-cloudflare-tunnel-plugin-in-aapanel-free-edition" target="_blank" rel="noopener" class="mycode_url">Install Cloudflare Tunnel Plugin in aaPanel Free Edition</a>, then use this article if you encounter the profile error.</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">A newly created Cloudflare Tunnel profile can return “Profile not found” before its first browser login. This article explains the confirmed cause and the local code fix, plus the other issues found during review.</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Reviewed build:</span> Community plugin by fdciabdul, source commit ff0c7359f050fbca2b9efab11b61aa462d65b2d0; info.json version 1.3.0. This is a source-level review with isolated tests. Live plugin installation and Cloudflare end-to-end verification are pending. The fixes below do not make the whole plugin a certified or production-tested release.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. Fix “Profile not found” on first login</span></span><br />
The UI allows adding a profile without an API token. However, DnsManager.find_profile() looks in _all_profiles(), which intentionally hides profiles that have neither token nor cert_path. That filter is useful for choosing working DNS credentials, but wrong for resolving the profile that is about to receive its first browser-login certificate.<br />
<br />
In dns_manager.py, change find_profile() to check the saved profiles first:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>def find_profile(self, profile_id):
    for p in self._read_profiles():
        if isinstance(p, dict) and p.get("id") == profile_id:
            return dict(p, virtual=False)
    for p in self._all_profiles():
        if p["id"] == profile_id:
            return p
    return None</code></div></div>Keep the empty-profile filter in _all_profiles(). Do not broadly treat an empty profile as valid API credentials. Our regression test creates an empty saved profile, supplies no usable profiles and verifies that find_profile still returns the intended profile for login. It passes with this change.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. Fix unsafe UI string encoding</span></span><br />
Profile names are inserted into single-quoted JavaScript onclick arguments using an HTML-only encoder. An ordinary apostrophe can break an action; crafted text can introduce script in the authenticated panel UI. Encode for the JavaScript string context first, then the surrounding HTML attribute. The reviewed patch uses a separate jsesc helper for those action arguments, and escapes names/errors in HTML-rendered dialogs. HTML escaping alone is insufficient here.<br />
<br />
Do not test script injection on a live shared panel. Our six isolated JavaScript tests round-trip apostrophes, backslashes, quotes, newlines and markup without executing injected instructions. The entire UI script also parses successfully. We have not demonstrated unauthenticated panel compromise.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. Protect installer staging and credentials</span></span><br />
The original binary installer downloads into one predictable file under /tmp. A privileged process should use a unique private temporary directory, invoke curl/install with argument arrays, restrict download redirects to HTTPS and check command results. The review patch implements that approach. Independent checksum verification and release pinning remain future work.<br />
<br />
Validate tunnel IDs as UUIDs before saving them or constructing credential paths. Apply mode 0600 to existing and newly relocated tunnel JSON credentials, and report relocation failures. Keep credentials out of public web directories, screenshots and support replies.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">4. Fix configuration encoding and restart reporting</span></span><br />
In ingress_manager.py, use proper quoted YAML scalar encoding rather than only replacing quotation marks. JSON-quoted strings are valid YAML scalars and handle backslashes/control characters:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>def _yaml_escape(s):
    return json.dumps(str(s), ensure_ascii=True)</code></div></div>The source also ignores the exit status of systemctl restart. Check it and return a failure when the restart fails:<br />
<div class="codeblock"><div class="title af-code-title"><span>Code:</span><button type="button" class="af-code-copy" aria-label="Copy code" title="Copy code"><i class="far fa-copy" aria-hidden="true"></i><span>Copy</span></button><span class="af-code-status" role="status" aria-live="polite"></span></div><div class="body" dir="ltr"><code>restarted = subprocess.run(
    ["systemctl", "restart", SERVICE_NAME],
    capture_output=True, text=True, timeout=30,
)
if restarted.returncode != 0:
    return public.returnMsg(
        False,
        "Config written, but service restart failed: "
        + (restarted.stderr or restarted.stdout),
    )</code></div></div>This change reports a real failure; it does not undo every previous DNS/config change. Do not describe it as complete transactional rollback.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">5. Avoid DNS data loss</span></span><br />
Before an automatic CNAME upsert, inspect every record returned for the hostname. Our patch refuses conflicting non-CNAME or multiple-record responses instead of replacing the first record. A user-selected zone must also match the hostname; stale/unavailable zone selections are rejected rather than silently redirected to another zone.<br />
<br />
For removal, refuse records that are not tunnel-target CNAMEs and check each Cloudflare deletion response. Do not delete A, AAAA, MX or TXT records simply because they share a hostname. Our tests verify these refusal paths and confirm API errors are returned.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Remaining limitation:</span> the patch recognizes tunnel CNAMEs by target suffix, not an ownership manifest for the particular tunnel. Full DNS/config/service rollback and concurrent-write locking are also still needed.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">6. Validate before applying to a server</span></span><br />
Back up the installed plugin directory, runtime data and /etc/cloudflared first. Match the exact source version; do not paste partial changes into an unrelated older release. Check Python syntax and run the isolated tests. Our local review passed <span style="font-weight: bold;" class="mycode_b">13 backend tests and six UI string-encoding checks</span>, plus script parsing and diff whitespace checks.<br />
<br />
Then use a disposable lab server to verify import, empty-profile login, account selection, credentials, origin response, generated ingress, DNS changes and actual service state. An API token accepted by the verification endpoint does not prove the zone permissions needed by this plugin. Browser login for tunnel CLI operations and the DNS API token serve different purposes.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">7. What is not yet fixed or verified</span></span><ul class="mycode_list"><li>Complete rollback across DNS, JSON state, config and service.<br />
</li>
<li>Concurrent profile login and re-login certificate isolation.<br />
</li>
<li>Shared locking and atomic persistence across all managers.<br />
</li>
<li>Independent checksum verification and a real binary update operation.<br />
</li>
<li>aaPanel dispatcher authentication/CSRF behavior and live end-to-end operation.<br />
</li>
</ul>
No public exploit demonstration is needed to explain these fixes. The patched download is not publicly released yet; the written changes above are available for maintainer review.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Credits and references:</span> <a href="https://github.com/fdciabdul/Cloudflare-Tunnel-aaPanel" target="_blank" rel="noopener" class="mycode_url">Original plugin repository</a> · <a href="https://www.aapanel.com/forum/d/25982-plugin-cloudflare-tunnel-manage-cloudflared-ingress-from-the-aapanel-ui" target="_blank" rel="noopener" class="mycode_url">Author's aaPanel thread</a> · <a href="https://developers.cloudflare.com/tunnel/features/locally-managed-tunnels/tunnel-permissions/" target="_blank" rel="noopener" class="mycode_url">Cloudflare tunnel permissions</a>]]></content:encoded>
		</item>
	</channel>
</rss>