docs(catalog): add full install guides for all 77 app templates
Generate one dedicated install page per template in /docs/catalog/<id>/. Each page covers: - Prerequisites (with claim-token reminders where applicable) - Three install paths: dashboard UI, REST API (with curl), AI Intent Router - Post-install first-run checklist (from the template metadata) - Volume mounts and persistent data - Environment variables - Watchtower auto-update behavior - Backup inclusion - Common troubleshooting - Related services (category-aware cross-links) Also add /docs/catalog index page grouping all 77 templates by 17 categories, with difficulty badges and popularity-sorted entries. Sidebar updated to show the new App Catalog entry. Generated by /tmp/generate-template-docs.js (run from /opt/dashcaddy in a follow-up to keep content in sync with app-templates.js).
This commit is contained in:
@@ -0,0 +1,128 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Actual Budget — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Actual Budget via DashCaddy. Privacy-focused budgeting app with envelope budgeting',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function actualBudgetDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Actual Budget"
|
||||||
|
intro="Privacy-focused budgeting app with envelope budgeting"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Productivity</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">actualbudget/actual-server:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Actual Budget?</h2>
|
||||||
|
<p>Privacy-focused budgeting app with envelope budgeting</p>
|
||||||
|
<p>Actual Budget ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Actual Budget, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Actual Budget</strong> from the <em>Productivity</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>actualbudget/actual-server:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>budget.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "actual-budget",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "budget",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Actual Budget on my home host and expose it at <code>budget.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Create your first budget in the web interface</li>
|
||||||
|
<li>Import transactions from your bank (OFX, QFX, CSV)</li>
|
||||||
|
<li>Set up envelope categories for spending control</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/actual-budget/data:/data</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>actualbudget/actual-server:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Actual Budget → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Actual Budget is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Actual Budget:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Actual Budget is in the <strong>Productivity</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/nextcloud" className="text-brand-400 underline">Nextcloud</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>actual-budget</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Adminer — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Adminer via DashCaddy. Lightweight database management in single PHP file',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function adminerDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Adminer"
|
||||||
|
intro="Lightweight database management in single PHP file"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Database</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">adminer:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Adminer?</h2>
|
||||||
|
<p>Lightweight database management in single PHP file</p>
|
||||||
|
<p>Adminer ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Adminer, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Adminer</strong> from the <em>Database</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>adminer:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>adminer.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "adminer",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "adminer",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"ADMINER_DEFAULT_SERVER": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Adminer on my home host and expose it at <code>adminer.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Connect to your database servers</li>
|
||||||
|
<li>Supports MySQL, PostgreSQL, SQLite, etc.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/adminer:/var/www/html</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>ADMINER_DEFAULT_SERVER</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>adminer:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Adminer → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Adminer is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Adminer:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Adminer is in the <strong>Database</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/adminer" className="text-brand-400 underline">Adminer</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>adminer</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Airsonic Advanced — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Airsonic Advanced via DashCaddy. Free web-based media streamer',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function airsonicDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Airsonic Advanced"
|
||||||
|
intro="Free web-based media streamer"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Media</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">linuxserver/airsonic-advanced:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Airsonic Advanced?</h2>
|
||||||
|
<p>Free web-based media streamer</p>
|
||||||
|
<p>Airsonic Advanced ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Airsonic Advanced, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Airsonic Advanced</strong> from the <em>Media</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>linuxserver/airsonic-advanced:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>airsonic.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "airsonic",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "airsonic",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PUID": "",
|
||||||
|
"PGID": "",
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Airsonic Advanced on my home host and expose it at <code>airsonic.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Default login: admin/admin</li>
|
||||||
|
<li>Configure media folders</li>
|
||||||
|
<li>Set up transcoding</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/airsonic/config:/config</code></li>
|
||||||
|
<li><code>/music:/music</code></li>
|
||||||
|
<li><code>/podcasts:/podcasts</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PUID</code></li>
|
||||||
|
<li><code>PGID</code></li>
|
||||||
|
<li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>linuxserver/airsonic-advanced:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Airsonic Advanced → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Airsonic Advanced is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Airsonic Advanced:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Airsonic Advanced is in the <strong>Media</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>airsonic</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Audiobookshelf — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Audiobookshelf via DashCaddy. Self-hosted audiobook and podcast server',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function audiobookshelfDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Audiobookshelf"
|
||||||
|
intro="Self-hosted audiobook and podcast server"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Media</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">ghcr.io/advplyr/audiobookshelf:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Audiobookshelf?</h2>
|
||||||
|
<p>Self-hosted audiobook and podcast server</p>
|
||||||
|
<p>Audiobookshelf ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Audiobookshelf, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>A host path to mount as the <strong>media library</strong> (default: <code>/media/audiobooks</code>).</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Audiobookshelf</strong> from the <em>Media</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>ghcr.io/advplyr/audiobookshelf:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>audiobooks.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "audiobookshelf",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "audiobooks",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Audiobookshelf on my home host and expose it at <code>audiobooks.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Create your account on first access</li>
|
||||||
|
<li>Add your audiobook library folders</li>
|
||||||
|
<li>Download the mobile app for offline listening</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Media library path notes</h2>
|
||||||
|
<p>The media mount path you set at deploy time is what Audiobookshelf will see as <code>/audiobooks</code>. For multi-library setups (movies + TV + music), bind the parent folder and let Audiobookshelf discover subfolders automatically.</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Permissions:</strong> Audiobookshelf runs as a non-root user. Make sure your media files are readable by UID <code>1000</code> (or whichever the container expects — check the <em>Logs</em> tab on first run).</li>
|
||||||
|
<li><strong>Performance:</strong> Put the media library on the same storage pool as DashCaddy itself; cross-pool mounts add 10–30% latency on first scan.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/audiobookshelf/config:/config</code></li>
|
||||||
|
<li><code>/opt/audiobookshelf/metadata:/metadata</code></li>
|
||||||
|
<li><code>MEDIA_PATH:/audiobooks</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>ghcr.io/advplyr/audiobookshelf:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Audiobookshelf → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Audiobookshelf is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Audiobookshelf:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
<li><strong>Library shows empty:</strong> confirm the media mount path is readable by the container UID and that the directory contains the file extensions Audiobookshelf indexes.</li>
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Audiobookshelf is in the <strong>Media</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>audiobookshelf</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,135 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Authentik — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Authentik via DashCaddy. Identity provider and single sign-on platform',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function authentikDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Authentik"
|
||||||
|
intro="Identity provider and single sign-on platform"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Security</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#f5a62322', color: '#f5a623' }}>Difficulty: Advanced</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">ghcr.io/goauthentik/server:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Authentik?</h2>
|
||||||
|
<p>Identity provider and single sign-on platform</p>
|
||||||
|
<p>Authentik ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Authentik, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Authentik</strong> from the <em>Security</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>ghcr.io/goauthentik/server:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>auth.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/-/health/live/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "authentik",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "auth",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"AUTHENTIK_SECRET_KEY": "",
|
||||||
|
"AUTHENTIK_ERROR_REPORTING__ENABLED": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Authentik on my home host and expose it at <code>auth.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Requires a PostgreSQL database and Redis instance</li>
|
||||||
|
<li>Consider deploying via the Dev Environment recipe for full stack</li>
|
||||||
|
<li>Set up flows for authentication, enrollment, and recovery</li>
|
||||||
|
<li>Configure OAuth2/OIDC providers for SSO with other apps</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/authentik/media:/media</code></li>
|
||||||
|
<li><code>/opt/authentik/templates:/templates</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>AUTHENTIK_SECRET_KEY</code></li>
|
||||||
|
<li><code>AUTHENTIK_ERROR_REPORTING__ENABLED</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>ghcr.io/goauthentik/server:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Authentik → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Authentik is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Authentik:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Authentik is in the <strong>Security</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/vaultwarden" className="text-brand-400 underline">Vaultwarden</a></li>
|
||||||
|
<li><a href="/docs/catalog/dashca" className="text-brand-400 underline">DashCA</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>authentik</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Bazarr — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Bazarr via DashCaddy. Automatic subtitle downloader for Sonarr and Radarr',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function bazarrDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Bazarr"
|
||||||
|
intro="Automatic subtitle downloader for Sonarr and Radarr"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Media Management</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">linuxserver/bazarr:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Bazarr?</h2>
|
||||||
|
<p>Automatic subtitle downloader for Sonarr and Radarr</p>
|
||||||
|
<p>Bazarr ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Bazarr, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Bazarr</strong> from the <em>Media Management</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>linuxserver/bazarr:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>bazarr.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "bazarr",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "bazarr",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PUID": "",
|
||||||
|
"PGID": "",
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Bazarr on my home host and expose it at <code>bazarr.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Connect to Sonarr and Radarr</li>
|
||||||
|
<li>Configure subtitle providers</li>
|
||||||
|
<li>Set language preferences</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/bazarr/config:/config</code></li>
|
||||||
|
<li><code>/movies:/movies</code></li>
|
||||||
|
<li><code>/tv:/tv</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PUID</code></li>
|
||||||
|
<li><code>PGID</code></li>
|
||||||
|
<li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>linuxserver/bazarr:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Bazarr → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Bazarr is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Bazarr:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Bazarr is in the <strong>Media Management</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/sonarr" className="text-brand-400 underline">Sonarr</a></li>
|
||||||
|
<li><a href="/docs/catalog/radarr" className="text-brand-400 underline">Radarr</a></li>
|
||||||
|
<li><a href="/docs/catalog/bazarr" className="text-brand-400 underline">Bazarr</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>bazarr</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install BIND9 DNS Server — DashCaddy Docs',
|
||||||
|
description: 'Install and configure BIND9 DNS Server via DashCaddy. Industry-standard DNS server - powerful and flexible',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function bind9DocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install BIND9 DNS Server"
|
||||||
|
intro="Industry-standard DNS server - powerful and flexible"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: DNS</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#f5a62322', color: '#f5a623' }}>Difficulty: Advanced</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">ubuntu/bind9:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is BIND9 DNS Server?</h2>
|
||||||
|
<p>Industry-standard DNS server - powerful and flexible</p>
|
||||||
|
<p>BIND9 DNS Server ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using BIND9 DNS Server, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>BIND9 DNS Server</strong> from the <em>DNS</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>ubuntu/bind9:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>dns2.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>tcp://localhost:53</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "bind9",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "dns2",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"BIND9_USER": "",
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy BIND9 DNS Server on my home host and expose it at <code>dns2.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Configure zone files in /opt/bind9/config/</li>
|
||||||
|
<li>Create named.conf.local for your .sami zone</li>
|
||||||
|
<li>Add zone file: /opt/bind9/records/db.sami</li>
|
||||||
|
<li>Restart container to apply changes</li>
|
||||||
|
<li>Test with: dig @localhost sami</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/bind9/config:/etc/bind</code></li>
|
||||||
|
<li><code>/opt/bind9/cache:/var/cache/bind</code></li>
|
||||||
|
<li><code>/opt/bind9/records:/var/lib/bind</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>BIND9_USER</code></li>
|
||||||
|
<li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>ubuntu/bind9:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → BIND9 DNS Server → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for BIND9 DNS Server is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with BIND9 DNS Server:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>BIND9 DNS Server is in the <strong>DNS</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>bind9</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install BookStack — DashCaddy Docs',
|
||||||
|
description: 'Install and configure BookStack via DashCaddy. Simple wiki and documentation platform',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function bookstackDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install BookStack"
|
||||||
|
intro="Simple wiki and documentation platform"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Productivity</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">linuxserver/bookstack:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is BookStack?</h2>
|
||||||
|
<p>Simple wiki and documentation platform</p>
|
||||||
|
<p>BookStack ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using BookStack, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>BookStack</strong> from the <em>Productivity</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>linuxserver/bookstack:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>wiki.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "bookstack",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "wiki",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PUID": "",
|
||||||
|
"PGID": "",
|
||||||
|
"APP_URL": "",
|
||||||
|
"DB_HOST": "",
|
||||||
|
"DB_DATABASE": "",
|
||||||
|
"DB_USERNAME": "",
|
||||||
|
"DB_PASSWORD": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy BookStack on my home host and expose it at <code>wiki.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Requires MariaDB/MySQL database</li>
|
||||||
|
<li>Default login: admin@admin.com / password</li>
|
||||||
|
<li>Change default credentials</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/bookstack/config:/config</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PUID</code></li>
|
||||||
|
<li><code>PGID</code></li>
|
||||||
|
<li><code>APP_URL</code></li>
|
||||||
|
<li><code>DB_HOST</code></li>
|
||||||
|
<li><code>DB_DATABASE</code></li>
|
||||||
|
<li><code>DB_USERNAME</code></li>
|
||||||
|
<li><code>DB_PASSWORD</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>linuxserver/bookstack:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → BookStack → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for BookStack is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with BookStack:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>BookStack is in the <strong>Productivity</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/nextcloud" className="text-brand-400 underline">Nextcloud</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>bookstack</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,141 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Calibre-Web — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Calibre-Web via DashCaddy. Web-based ebook manager and reader',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function calibreWebDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Calibre-Web"
|
||||||
|
intro="Web-based ebook manager and reader"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Media</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">lscr.io/linuxserver/calibre-web:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Calibre-Web?</h2>
|
||||||
|
<p>Web-based ebook manager and reader</p>
|
||||||
|
<p>Calibre-Web ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Calibre-Web, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>A host path to mount as the <strong>media library</strong> (default: <code>/media/books</code>).</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Calibre-Web</strong> from the <em>Media</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>lscr.io/linuxserver/calibre-web:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>books.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "calibre-web",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "books",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PUID": "",
|
||||||
|
"PGID": "",
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Calibre-Web on my home host and expose it at <code>books.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Default login: admin / admin123</li>
|
||||||
|
<li>Point to your Calibre database location on first setup</li>
|
||||||
|
<li>Supports EPUB, PDF, MOBI, and more formats</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Media library path notes</h2>
|
||||||
|
<p>The media mount path you set at deploy time is what Calibre-Web will see as <code>/books</code>. For multi-library setups (movies + TV + music), bind the parent folder and let Calibre-Web discover subfolders automatically.</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Permissions:</strong> Calibre-Web runs as a non-root user. Make sure your media files are readable by UID <code>1000</code> (or whichever the container expects — check the <em>Logs</em> tab on first run).</li>
|
||||||
|
<li><strong>Performance:</strong> Put the media library on the same storage pool as DashCaddy itself; cross-pool mounts add 10–30% latency on first scan.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/calibre-web/config:/config</code></li>
|
||||||
|
<li><code>MEDIA_PATH:/books</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PUID</code></li>
|
||||||
|
<li><code>PGID</code></li>
|
||||||
|
<li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>lscr.io/linuxserver/calibre-web:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Calibre-Web → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Calibre-Web is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Calibre-Web:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
<li><strong>Library shows empty:</strong> confirm the media mount path is readable by the container UID and that the directory contains the file extensions Calibre-Web indexes.</li>
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Calibre-Web is in the <strong>Media</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>calibre-web</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,128 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Change Detection — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Change Detection via DashCaddy. Monitor websites for changes',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function changedetectionDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Change Detection"
|
||||||
|
intro="Monitor websites for changes"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Utilities</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">ghcr.io/dgtlmoon/changedetection.io:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Change Detection?</h2>
|
||||||
|
<p>Monitor websites for changes</p>
|
||||||
|
<p>Change Detection ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Change Detection, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Change Detection</strong> from the <em>Utilities</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>ghcr.io/dgtlmoon/changedetection.io:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>watch.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "changedetection",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "watch",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Change Detection on my home host and expose it at <code>watch.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Add URLs to monitor</li>
|
||||||
|
<li>Configure check frequency</li>
|
||||||
|
<li>Set up notifications</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/changedetection/data:/datastore</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>ghcr.io/dgtlmoon/changedetection.io:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Change Detection → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Change Detection is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Change Detection:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Change Detection is in the <strong>Utilities</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>changedetection</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install CoreDNS — DashCaddy Docs',
|
||||||
|
description: 'Install and configure CoreDNS via DashCaddy. Cloud-native DNS server - lightweight and flexible',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function corednsDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install CoreDNS"
|
||||||
|
intro="Cloud-native DNS server - lightweight and flexible"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: DNS</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">coredns/coredns:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is CoreDNS?</h2>
|
||||||
|
<p>Cloud-native DNS server - lightweight and flexible</p>
|
||||||
|
<p>CoreDNS ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using CoreDNS, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>CoreDNS</strong> from the <em>DNS</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>coredns/coredns:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>dns4.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>tcp://localhost:53</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "coredns",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "dns4",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy CoreDNS on my home host and expose it at <code>dns4.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Create Corefile in /opt/coredns/config/</li>
|
||||||
|
<li>Define .sami zone with file plugin</li>
|
||||||
|
<li>Create zone file with your records</li>
|
||||||
|
<li>Restart container to load config</li>
|
||||||
|
<li>Test with: dig @localhost test.sami</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/coredns/config:/etc/coredns</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>coredns/coredns:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → CoreDNS → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for CoreDNS is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with CoreDNS:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>CoreDNS is in the <strong>DNS</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>coredns</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install CrowdSec — DashCaddy Docs',
|
||||||
|
description: 'Install and configure CrowdSec via DashCaddy. Collaborative intrusion prevention system',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function crowdsecDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install CrowdSec"
|
||||||
|
intro="Collaborative intrusion prevention system"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Security</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">crowdsecurity/crowdsec:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is CrowdSec?</h2>
|
||||||
|
<p>Collaborative intrusion prevention system</p>
|
||||||
|
<p>CrowdSec ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using CrowdSec, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>CrowdSec</strong> from the <em>Security</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>crowdsecurity/crowdsec:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>crowdsec.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/health</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "crowdsec",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "crowdsec",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy CrowdSec on my home host and expose it at <code>crowdsec.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Register at app.crowdsec.net for community threat intelligence</li>
|
||||||
|
<li>Install bouncers on your reverse proxy for active blocking</li>
|
||||||
|
<li>CrowdSec analyzes logs and shares threat data with the community</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/crowdsec/config:/etc/crowdsec</code></li>
|
||||||
|
<li><code>/opt/crowdsec/data:/var/lib/crowdsec/data</code></li>
|
||||||
|
<li><code>/var/log:/var/log:ro</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>crowdsecurity/crowdsec:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → CrowdSec → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for CrowdSec is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with CrowdSec:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>CrowdSec is in the <strong>Security</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/vaultwarden" className="text-brand-400 underline">Vaultwarden</a></li>
|
||||||
|
<li><a href="/docs/catalog/dashca" className="text-brand-400 underline">DashCA</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>crowdsec</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install DashCA — DashCaddy Docs',
|
||||||
|
description: 'Install and configure DashCA via DashCaddy. One-click root CA certificate installer for your network',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function dashcaDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install DashCA"
|
||||||
|
intro="One-click root CA certificate installer for your network"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Security</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">N/A</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is DashCA?</h2>
|
||||||
|
<p>One-click root CA certificate installer for your network</p>
|
||||||
|
<p>DashCA ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using DashCA, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>DashCA</strong> from the <em>Security</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>N/A</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>ca.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/healthz</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "dashca",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "ca",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy DashCA on my home host and expose it at <code>ca.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>New devices: visit http://ca.sami (HTTP, no certificate needed)</li>
|
||||||
|
<li>Click the 'Install Certificate' button for your platform</li>
|
||||||
|
<li>Follow platform-specific instructions</li>
|
||||||
|
<li>Verify all *.sami domains now show secure connections</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>N/A</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → DashCA → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for DashCA is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with DashCA:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>DashCA is in the <strong>Security</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/vaultwarden" className="text-brand-400 underline">Vaultwarden</a></li>
|
||||||
|
<li><a href="/docs/catalog/dashca" className="text-brand-400 underline">DashCA</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>dashca</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Digital Clock — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Digital Clock via DashCaddy. Live digital clock with time, date, and day of week',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function digitalClockDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Digital Clock"
|
||||||
|
intro="Live digital clock with time, date, and day of week"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Utilities</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">N/A</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Digital Clock?</h2>
|
||||||
|
<p>Live digital clock with time, date, and day of week</p>
|
||||||
|
<p>Digital Clock ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Digital Clock, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Digital Clock</strong> from the <em>Utilities</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>N/A</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>digital-clock.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/healthz</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "digital-clock",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "digital-clock",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Digital Clock on my home host and expose it at <code>digital-clock.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Clock appears in the top bar to the right of the weather widget</li>
|
||||||
|
<li>No configuration needed — runs automatically</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>N/A</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Digital Clock → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Digital Clock is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Digital Clock:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Digital Clock is in the <strong>Utilities</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>digital-clock</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Dozzle — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Dozzle via DashCaddy. Real-time Docker container log viewer',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function dozzleDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Dozzle"
|
||||||
|
intro="Real-time Docker container log viewer"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Monitoring</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">amir20/dozzle:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Dozzle?</h2>
|
||||||
|
<p>Real-time Docker container log viewer</p>
|
||||||
|
<p>Dozzle ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Dozzle, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Dozzle</strong> from the <em>Monitoring</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>amir20/dozzle:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>logs.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "dozzle",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "logs",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Dozzle on my home host and expose it at <code>logs.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>View real-time logs from all running containers</li>
|
||||||
|
<li>Filter and search across container logs</li>
|
||||||
|
<li>No configuration needed - auto-discovers containers</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/var/run/docker.sock:/var/run/docker.sock:ro</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>amir20/dozzle:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Dozzle → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Dozzle is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Dozzle:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Dozzle is in the <strong>Monitoring</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/uptime-kuma" className="text-brand-400 underline">Uptime Kuma</a></li>
|
||||||
|
<li><a href="/docs/catalog/dozzle" className="text-brand-400 underline">Dozzle</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>dozzle</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Drone CI — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Drone CI via DashCaddy. Container-native continuous delivery platform',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function droneDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Drone CI"
|
||||||
|
intro="Container-native continuous delivery platform"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Development</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">drone/drone:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Drone CI?</h2>
|
||||||
|
<p>Container-native continuous delivery platform</p>
|
||||||
|
<p>Drone CI ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Drone CI, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Drone CI</strong> from the <em>Development</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>drone/drone:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>drone.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "drone",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "drone",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"DRONE_GITEA_SERVER": "",
|
||||||
|
"DRONE_RPC_SECRET": "",
|
||||||
|
"DRONE_SERVER_HOST": "",
|
||||||
|
"DRONE_SERVER_PROTO": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Drone CI on my home host and expose it at <code>drone.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Configure Git provider integration</li>
|
||||||
|
<li>Set up shared secret</li>
|
||||||
|
<li>Deploy Drone runners</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/drone/data:/data</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>DRONE_GITEA_SERVER</code></li>
|
||||||
|
<li><code>DRONE_RPC_SECRET</code></li>
|
||||||
|
<li><code>DRONE_SERVER_HOST</code></li>
|
||||||
|
<li><code>DRONE_SERVER_PROTO</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>drone/drone:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Drone CI → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Drone CI is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Drone CI:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Drone CI is in the <strong>Development</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/gitea" className="text-brand-400 underline">Gitea</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>drone</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,141 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Emby — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Emby via DashCaddy. Personal media server with apps for all devices',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function embyDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Emby"
|
||||||
|
intro="Personal media server with apps for all devices"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Media</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">emby/embyserver:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Emby?</h2>
|
||||||
|
<p>Personal media server with apps for all devices</p>
|
||||||
|
<p>Emby ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Emby, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>A host path to mount as the <strong>media library</strong> (default: <code>/media</code>).</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Emby</strong> from the <em>Media</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>emby/embyserver:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>emby.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/emby/web/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "emby",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "emby",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"UID": "",
|
||||||
|
"GID": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Emby on my home host and expose it at <code>emby.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Complete the initial setup wizard at the web interface</li>
|
||||||
|
<li>Add your media libraries (Movies, TV Shows, Music)</li>
|
||||||
|
<li>Configure user accounts and permissions</li>
|
||||||
|
<li>Install Emby apps on your devices for remote access</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Media library path notes</h2>
|
||||||
|
<p>The media mount path you set at deploy time is what Emby will see as <code>/media</code>. For multi-library setups (movies + TV + music), bind the parent folder and let Emby discover subfolders automatically.</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Permissions:</strong> Emby runs as a non-root user. Make sure your media files are readable by UID <code>1000</code> (or whichever the container expects — check the <em>Logs</em> tab on first run).</li>
|
||||||
|
<li><strong>Performance:</strong> Put the media library on the same storage pool as DashCaddy itself; cross-pool mounts add 10–30% latency on first scan.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/emby/config:/config</code></li>
|
||||||
|
<li><code>/opt/emby/cache:/cache</code></li>
|
||||||
|
<li><code>MEDIA_PATH:/media</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>UID</code></li>
|
||||||
|
<li><code>GID</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>emby/embyserver:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Emby → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Emby is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Emby:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
<li><strong>Library shows empty:</strong> confirm the media mount path is readable by the container UID and that the directory contains the file extensions Emby indexes.</li>
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Emby is in the <strong>Media</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>emby</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,128 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Excalidraw — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Excalidraw via DashCaddy. Collaborative virtual whiteboard for sketching and diagrams',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function excalidrawDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Excalidraw"
|
||||||
|
intro="Collaborative virtual whiteboard for sketching and diagrams"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Productivity</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">excalidraw/excalidraw:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Excalidraw?</h2>
|
||||||
|
<p>Collaborative virtual whiteboard for sketching and diagrams</p>
|
||||||
|
<p>Excalidraw ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Excalidraw, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Excalidraw</strong> from the <em>Productivity</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>excalidraw/excalidraw:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>draw.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "excalidraw",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "draw",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Excalidraw on my home host and expose it at <code>draw.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Start drawing immediately - no account needed</li>
|
||||||
|
<li>Share drawings via link for real-time collaboration</li>
|
||||||
|
<li>Export as PNG, SVG, or Excalidraw file</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/excalidraw/data:/var/lib/excalidraw</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>excalidraw/excalidraw:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Excalidraw → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Excalidraw is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Excalidraw:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Excalidraw is in the <strong>Productivity</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/nextcloud" className="text-brand-400 underline">Nextcloud</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>excalidraw</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install FileBrowser — DashCaddy Docs',
|
||||||
|
description: 'Install and configure FileBrowser via DashCaddy. Web-based file manager with sharing capabilities',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function filebrowserDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install FileBrowser"
|
||||||
|
intro="Web-based file manager with sharing capabilities"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Files</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">filebrowser/filebrowser:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is FileBrowser?</h2>
|
||||||
|
<p>Web-based file manager with sharing capabilities</p>
|
||||||
|
<p>FileBrowser ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using FileBrowser, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>FileBrowser</strong> from the <em>Files</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>filebrowser/filebrowser:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>files.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "filebrowser",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "files",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy FileBrowser on my home host and expose it at <code>files.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Default login: admin/admin</li>
|
||||||
|
<li>Change default password immediately</li>
|
||||||
|
<li>Configure user permissions and shares</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/filebrowser/data:/srv</code></li>
|
||||||
|
<li><code>/opt/filebrowser/database:/database</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>filebrowser/filebrowser:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → FileBrowser → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for FileBrowser is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with FileBrowser:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>FileBrowser is in the <strong>Files</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>filebrowser</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,135 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Gitea — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Gitea via DashCaddy. Lightweight self-hosted Git service',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function giteaDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Gitea"
|
||||||
|
intro="Lightweight self-hosted Git service"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Development</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">gitea/gitea:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Gitea?</h2>
|
||||||
|
<p>Lightweight self-hosted Git service</p>
|
||||||
|
<p>Gitea ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Gitea, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Gitea</strong> from the <em>Development</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>gitea/gitea:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>gitea.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "gitea",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "gitea",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"USER_UID": "",
|
||||||
|
"USER_GID": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Gitea on my home host and expose it at <code>gitea.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Complete initial setup wizard</li>
|
||||||
|
<li>Create admin account</li>
|
||||||
|
<li>Configure SSH access</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/gitea/data:/data</code></li>
|
||||||
|
<li><code>/etc/timezone:/etc/timezone:ro</code></li>
|
||||||
|
<li><code>/etc/localtime:/etc/localtime:ro</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>USER_UID</code></li>
|
||||||
|
<li><code>USER_GID</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>gitea/gitea:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Gitea → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Gitea is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Gitea:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Gitea is in the <strong>Development</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/drone" className="text-brand-400 underline">Drone CI</a></li>
|
||||||
|
<li><a href="/docs/catalog/jenkins" className="text-brand-400 underline">Jenkins</a> (alt CI)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>gitea</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Grafana — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Grafana via DashCaddy. Analytics and interactive visualization platform',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function grafanaDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Grafana"
|
||||||
|
intro="Analytics and interactive visualization platform"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Monitoring</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#f5a62322', color: '#f5a623' }}>Difficulty: Advanced</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">grafana/grafana:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Grafana?</h2>
|
||||||
|
<p>Analytics and interactive visualization platform</p>
|
||||||
|
<p>Grafana ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Grafana, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Grafana</strong> from the <em>Monitoring</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>grafana/grafana:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>grafana.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/api/health</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "grafana",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "grafana",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"GF_SECURITY_ADMIN_PASSWORD": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Grafana on my home host and expose it at <code>grafana.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Open the new <code>grafana.<your-domain></code> URL.</li>
|
||||||
|
<li>Complete the upstream Grafana setup wizard (create admin user, accept EULA, etc.).</li>
|
||||||
|
<li>Configure backups from <strong>Settings → Backups</strong> — the default daily snapshot will capture the data volume.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/grafana/data:/var/lib/grafana</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>GF_SECURITY_ADMIN_PASSWORD</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>grafana/grafana:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Grafana → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Grafana is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Grafana:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Grafana is in the <strong>Monitoring</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/uptime-kuma" className="text-brand-400 underline">Uptime Kuma</a></li>
|
||||||
|
<li><a href="/docs/catalog/dozzle" className="text-brand-400 underline">Dozzle</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>grafana</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Homarr — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Homarr via DashCaddy. Sleek dashboard for all your services',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function homarrDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Homarr"
|
||||||
|
intro="Sleek dashboard for all your services"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Utilities</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">ghcr.io/ajnart/homarr:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Homarr?</h2>
|
||||||
|
<p>Sleek dashboard for all your services</p>
|
||||||
|
<p>Homarr ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Homarr, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Homarr</strong> from the <em>Utilities</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>ghcr.io/ajnart/homarr:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>homarr.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "homarr",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "homarr",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Homarr on my home host and expose it at <code>homarr.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Add your services via UI</li>
|
||||||
|
<li>Configure integrations</li>
|
||||||
|
<li>Customize layout and appearance</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/homarr/configs:/app/data/configs</code></li>
|
||||||
|
<li><code>/opt/homarr/icons:/app/public/icons</code></li>
|
||||||
|
<li><code>/var/run/docker.sock:/var/run/docker.sock:ro</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>ghcr.io/ajnart/homarr:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Homarr → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Homarr is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Homarr:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Homarr is in the <strong>Utilities</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>homarr</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Home Assistant — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Home Assistant via DashCaddy. Open source home automation platform',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function homeassistantDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Home Assistant"
|
||||||
|
intro="Open source home automation platform"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Home Automation</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">homeassistant/home-assistant:stable</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Home Assistant?</h2>
|
||||||
|
<p>Open source home automation platform</p>
|
||||||
|
<p>Home Assistant ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Home Assistant, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Home Assistant</strong> from the <em>Home Automation</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>homeassistant/home-assistant:stable</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>home.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/api/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "homeassistant",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "home",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Home Assistant on my home host and expose it at <code>home.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Complete onboarding wizard</li>
|
||||||
|
<li>Add integrations for your smart devices</li>
|
||||||
|
<li>Create automations and dashboards</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/homeassistant/config:/config</code></li>
|
||||||
|
<li><code>/etc/localtime:/etc/localtime:ro</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>homeassistant/home-assistant:stable</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Home Assistant → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Home Assistant is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Home Assistant:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Home Assistant is in the <strong>Home Automation</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/nodered" className="text-brand-400 underline">Node-RED</a> (automation)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>homeassistant</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Homepage — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Homepage via DashCaddy. Highly customizable application dashboard',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function homepageDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Homepage"
|
||||||
|
intro="Highly customizable application dashboard"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Utilities</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">ghcr.io/gethomepage/homepage:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Homepage?</h2>
|
||||||
|
<p>Highly customizable application dashboard</p>
|
||||||
|
<p>Homepage ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Homepage, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Homepage</strong> from the <em>Utilities</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>ghcr.io/gethomepage/homepage:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>dashboard.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "homepage",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "dashboard",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Homepage on my home host and expose it at <code>dashboard.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Edit config files to add services</li>
|
||||||
|
<li>Configure widgets</li>
|
||||||
|
<li>Customize appearance</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/homepage/config:/app/config</code></li>
|
||||||
|
<li><code>/var/run/docker.sock:/var/run/docker.sock:ro</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>ghcr.io/gethomepage/homepage:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Homepage → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Homepage is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Homepage:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Homepage is in the <strong>Utilities</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>homepage</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,140 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Immich — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Immich via DashCaddy. Self-hosted Google Photos alternative',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function immichDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Immich"
|
||||||
|
intro="Self-hosted Google Photos alternative"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Photos</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">ghcr.io/immich-app/immich-server:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Immich?</h2>
|
||||||
|
<p>Self-hosted Google Photos alternative</p>
|
||||||
|
<p>Immich ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Immich, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Immich</strong> from the <em>Photos</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>ghcr.io/immich-app/immich-server:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>photos.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/api/server-info/ping</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "immich",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "photos",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"DB_HOSTNAME": "",
|
||||||
|
"DB_USERNAME": "",
|
||||||
|
"DB_PASSWORD": "",
|
||||||
|
"DB_DATABASE_NAME": "",
|
||||||
|
"REDIS_HOSTNAME": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Immich on my home host and expose it at <code>photos.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Requires PostgreSQL and Redis</li>
|
||||||
|
<li>Install mobile apps for backup</li>
|
||||||
|
<li>Configure machine learning for face detection</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/immich/upload:/usr/src/app/upload</code></li>
|
||||||
|
<li><code>/opt/immich/library:/usr/src/app/library</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>DB_HOSTNAME</code></li>
|
||||||
|
<li><code>DB_USERNAME</code></li>
|
||||||
|
<li><code>DB_PASSWORD</code></li>
|
||||||
|
<li><code>DB_DATABASE_NAME</code></li>
|
||||||
|
<li><code>REDIS_HOSTNAME</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>ghcr.io/immich-app/immich-server:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Immich → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Immich is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Immich:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Immich is in the <strong>Photos</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/photoprism" className="text-brand-400 underline">PhotoPrism</a> (alternative)</li>
|
||||||
|
<li><a href="/docs/catalog/postgres" className="text-brand-400 underline">PostgreSQL</a> (external DB)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>immich</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,128 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install IT Tools — DashCaddy Docs',
|
||||||
|
description: 'Install and configure IT Tools via DashCaddy. Collection of handy developer and IT tools in one place',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function itToolsDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install IT Tools"
|
||||||
|
intro="Collection of handy developer and IT tools in one place"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Utilities</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">corentinth/it-tools:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is IT Tools?</h2>
|
||||||
|
<p>Collection of handy developer and IT tools in one place</p>
|
||||||
|
<p>IT Tools ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using IT Tools, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>IT Tools</strong> from the <em>Utilities</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>corentinth/it-tools:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>tools.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "it-tools",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "tools",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy IT Tools on my home host and expose it at <code>tools.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Access the web interface for instant tools access</li>
|
||||||
|
<li>Includes: hash generators, UUID, JWT decoder, base64, regex tester, and 70+ more</li>
|
||||||
|
<li>No configuration needed</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/it-tools/config:/config</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>corentinth/it-tools:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → IT Tools → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for IT Tools is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with IT Tools:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>IT Tools is in the <strong>Utilities</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>it-tools</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install JDownloader 2 — DashCaddy Docs',
|
||||||
|
description: 'Install and configure JDownloader 2 via DashCaddy. Download manager for file hosting sites',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function jdownloaderDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install JDownloader 2"
|
||||||
|
intro="Download manager for file hosting sites"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Downloads</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">jlesage/jdownloader-2:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is JDownloader 2?</h2>
|
||||||
|
<p>Download manager for file hosting sites</p>
|
||||||
|
<p>JDownloader 2 ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using JDownloader 2, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>JDownloader 2</strong> from the <em>Downloads</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>jlesage/jdownloader-2:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>jdownloader.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "jdownloader",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "jdownloader",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy JDownloader 2 on my home host and expose it at <code>jdownloader.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Access web interface to configure</li>
|
||||||
|
<li>Link to MyJDownloader account</li>
|
||||||
|
<li>Configure download paths</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/jdownloader/config:/config</code></li>
|
||||||
|
<li><code>/downloads:/output</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>jlesage/jdownloader-2:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → JDownloader 2 → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for JDownloader 2 is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with JDownloader 2:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>JDownloader 2 is in the <strong>Downloads</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/qbittorrent" className="text-brand-400 underline">qBittorrent</a></li>
|
||||||
|
<li><a href="/docs/catalog/sabnzbd" className="text-brand-400 underline">SABnzbd</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>jdownloader</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,139 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Jellyfin — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Jellyfin via DashCaddy. Free software media system - alternative to Plex',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function jellyfinDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Jellyfin"
|
||||||
|
intro="Free software media system - alternative to Plex"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Media</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">jellyfin/jellyfin:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Jellyfin?</h2>
|
||||||
|
<p>Free software media system - alternative to Plex</p>
|
||||||
|
<p>Jellyfin ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Jellyfin, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>A host path to mount as the <strong>media library</strong> (default: <code>/media</code>).</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Jellyfin</strong> from the <em>Media</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>jellyfin/jellyfin:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>jellyfin.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/health</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "jellyfin",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "jellyfin",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"JELLYFIN_PublishedServerUrl": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Jellyfin on my home host and expose it at <code>jellyfin.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Complete the initial setup wizard</li>
|
||||||
|
<li>Add your media libraries</li>
|
||||||
|
<li>Configure user accounts and permissions</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Media library path notes</h2>
|
||||||
|
<p>The media mount path you set at deploy time is what Jellyfin will see as <code>/media</code>. For multi-library setups (movies + TV + music), bind the parent folder and let Jellyfin discover subfolders automatically.</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Permissions:</strong> Jellyfin runs as a non-root user. Make sure your media files are readable by UID <code>1000</code> (or whichever the container expects — check the <em>Logs</em> tab on first run).</li>
|
||||||
|
<li><strong>Performance:</strong> Put the media library on the same storage pool as DashCaddy itself; cross-pool mounts add 10–30% latency on first scan.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/jellyfin/config:/config</code></li>
|
||||||
|
<li><code>/opt/jellyfin/cache:/cache</code></li>
|
||||||
|
<li><code>MEDIA_PATH:/media</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>JELLYFIN_PublishedServerUrl</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>jellyfin/jellyfin:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Jellyfin → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Jellyfin is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Jellyfin:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
<li><strong>Library shows empty:</strong> confirm the media mount path is readable by the container UID and that the directory contains the file extensions Jellyfin indexes.</li>
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Jellyfin is in the <strong>Media</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/plex" className="text-brand-400 underline">Plex</a> (managed alternative)</li>
|
||||||
|
<li><a href="/docs/catalog/tautulli" className="text-brand-400 underline">Tautulli</a> (monitoring)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>jellyfin</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,128 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Jenkins — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Jenkins via DashCaddy. Automation server for CI/CD pipelines',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function jenkinsDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Jenkins"
|
||||||
|
intro="Automation server for CI/CD pipelines"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Development</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#f5a62322', color: '#f5a623' }}>Difficulty: Advanced</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">jenkins/jenkins:lts</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Jenkins?</h2>
|
||||||
|
<p>Automation server for CI/CD pipelines</p>
|
||||||
|
<p>Jenkins ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Jenkins, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Jenkins</strong> from the <em>Development</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>jenkins/jenkins:lts</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>jenkins.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/login</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "jenkins",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "jenkins",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Jenkins on my home host and expose it at <code>jenkins.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Get initial admin password from logs</li>
|
||||||
|
<li>Install suggested plugins</li>
|
||||||
|
<li>Create admin user</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/jenkins/data:/var/jenkins_home</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>jenkins/jenkins:lts</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Jenkins → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Jenkins is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Jenkins:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Jenkins is in the <strong>Development</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/gitea" className="text-brand-400 underline">Gitea</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>jenkins</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,135 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Kavita — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Kavita via DashCaddy. Digital reading platform for manga, comics, and books',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function kavitaDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Kavita"
|
||||||
|
intro="Digital reading platform for manga, comics, and books"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Media</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">jvmilazz0/kavita:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Kavita?</h2>
|
||||||
|
<p>Digital reading platform for manga, comics, and books</p>
|
||||||
|
<p>Kavita ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Kavita, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>A host path to mount as the <strong>media library</strong> (default: <code>/media/reading</code>).</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Kavita</strong> from the <em>Media</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>jvmilazz0/kavita:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>kavita.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "kavita",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "kavita",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Kavita on my home host and expose it at <code>kavita.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Create admin account on first access</li>
|
||||||
|
<li>Add library folders for manga, comics, or books</li>
|
||||||
|
<li>Supports EPUB, PDF, CBZ, CBR formats</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Media library path notes</h2>
|
||||||
|
<p>The media mount path you set at deploy time is what Kavita will see as <code>/data</code>. For multi-library setups (movies + TV + music), bind the parent folder and let Kavita discover subfolders automatically.</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Permissions:</strong> Kavita runs as a non-root user. Make sure your media files are readable by UID <code>1000</code> (or whichever the container expects — check the <em>Logs</em> tab on first run).</li>
|
||||||
|
<li><strong>Performance:</strong> Put the media library on the same storage pool as DashCaddy itself; cross-pool mounts add 10–30% latency on first scan.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/kavita/config:/kavita/config</code></li>
|
||||||
|
<li><code>MEDIA_PATH:/data</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>jvmilazz0/kavita:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Kavita → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Kavita is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Kavita:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
<li><strong>Library shows empty:</strong> confirm the media mount path is readable by the container UID and that the directory contains the file extensions Kavita indexes.</li>
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Kavita is in the <strong>Media</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>kavita</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Komga — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Komga via DashCaddy. Comic and manga media server with web reader',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function komgaDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Komga"
|
||||||
|
intro="Comic and manga media server with web reader"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Media</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">gotson/komga:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Komga?</h2>
|
||||||
|
<p>Comic and manga media server with web reader</p>
|
||||||
|
<p>Komga ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Komga, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>A host path to mount as the <strong>media library</strong> (default: <code>/media/comics</code>).</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Komga</strong> from the <em>Media</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>gotson/komga:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>komga.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "komga",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "komga",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Komga on my home host and expose it at <code>komga.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Create admin account on first access</li>
|
||||||
|
<li>Add your comic libraries (CBZ, CBR, PDF supported)</li>
|
||||||
|
<li>Use OPDS for third-party reader apps</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Media library path notes</h2>
|
||||||
|
<p>The media mount path you set at deploy time is what Komga will see as <code>/data</code>. For multi-library setups (movies + TV + music), bind the parent folder and let Komga discover subfolders automatically.</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Permissions:</strong> Komga runs as a non-root user. Make sure your media files are readable by UID <code>1000</code> (or whichever the container expects — check the <em>Logs</em> tab on first run).</li>
|
||||||
|
<li><strong>Performance:</strong> Put the media library on the same storage pool as DashCaddy itself; cross-pool mounts add 10–30% latency on first scan.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/komga/config:/config</code></li>
|
||||||
|
<li><code>MEDIA_PATH:/data</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>gotson/komga:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Komga → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Komga is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Komga:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
<li><strong>Library shows empty:</strong> confirm the media mount path is readable by the container UID and that the directory contains the file extensions Komga indexes.</li>
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Komga is in the <strong>Media</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>komga</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Lidarr — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Lidarr via DashCaddy. Music collection manager for Usenet and BitTorrent',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function lidarrDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Lidarr"
|
||||||
|
intro="Music collection manager for Usenet and BitTorrent"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Media Management</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">linuxserver/lidarr:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Lidarr?</h2>
|
||||||
|
<p>Music collection manager for Usenet and BitTorrent</p>
|
||||||
|
<p>Lidarr ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Lidarr, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Lidarr</strong> from the <em>Media Management</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>linuxserver/lidarr:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>lidarr.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/api/v1/system/status</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "lidarr",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "lidarr",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PUID": "",
|
||||||
|
"PGID": "",
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Lidarr on my home host and expose it at <code>lidarr.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Configure download clients</li>
|
||||||
|
<li>Add indexers</li>
|
||||||
|
<li>Set up root folders for music</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/lidarr/config:/config</code></li>
|
||||||
|
<li><code>/downloads:/downloads</code></li>
|
||||||
|
<li><code>/music:/music</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PUID</code></li>
|
||||||
|
<li><code>PGID</code></li>
|
||||||
|
<li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>linuxserver/lidarr:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Lidarr → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Lidarr is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Lidarr:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Lidarr is in the <strong>Media Management</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/sonarr" className="text-brand-400 underline">Sonarr</a></li>
|
||||||
|
<li><a href="/docs/catalog/radarr" className="text-brand-400 underline">Radarr</a></li>
|
||||||
|
<li><a href="/docs/catalog/bazarr" className="text-brand-400 underline">Bazarr</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>lidarr</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,141 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Docker Mailserver — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Docker Mailserver via DashCaddy. Full-featured email server with SMTP, IMAP, spam filtering',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function mailserverDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Docker Mailserver"
|
||||||
|
intro="Full-featured email server with SMTP, IMAP, spam filtering"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Communication</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#f5a62322', color: '#f5a623' }}>Difficulty: Advanced</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">mailserver/docker-mailserver:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Docker Mailserver?</h2>
|
||||||
|
<p>Full-featured email server with SMTP, IMAP, spam filtering</p>
|
||||||
|
<p>Docker Mailserver ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Docker Mailserver, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Docker Mailserver</strong> from the <em>Communication</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>mailserver/docker-mailserver:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>mail.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "mailserver",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "mail",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"ENABLE_SPAMASSASSIN": "",
|
||||||
|
"ENABLE_CLAMAV": "",
|
||||||
|
"ENABLE_FAIL2BAN": "",
|
||||||
|
"ONE_DIR": "",
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Docker Mailserver on my home host and expose it at <code>mail.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Configure DNS records (MX, SPF, DKIM, DMARC)</li>
|
||||||
|
<li>Create email accounts using setup.sh</li>
|
||||||
|
<li>Set up SSL certificates for secure connections</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/mailserver/data:/var/mail</code></li>
|
||||||
|
<li><code>/opt/mailserver/state:/var/mail-state</code></li>
|
||||||
|
<li><code>/opt/mailserver/logs:/var/log/mail</code></li>
|
||||||
|
<li><code>/opt/mailserver/config:/tmp/docker-mailserver</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>ENABLE_SPAMASSASSIN</code></li>
|
||||||
|
<li><code>ENABLE_CLAMAV</code></li>
|
||||||
|
<li><code>ENABLE_FAIL2BAN</code></li>
|
||||||
|
<li><code>ONE_DIR</code></li>
|
||||||
|
<li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>mailserver/docker-mailserver:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Docker Mailserver → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Docker Mailserver is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Docker Mailserver:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Docker Mailserver is in the <strong>Communication</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>mailserver</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Matrix Synapse — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Matrix Synapse via DashCaddy. Decentralized, secure messaging and collaboration',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function matrixDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Matrix Synapse"
|
||||||
|
intro="Decentralized, secure messaging and collaboration"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Communication</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#f5a62322', color: '#f5a623' }}>Difficulty: Advanced</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">matrixdotorg/synapse:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Matrix Synapse?</h2>
|
||||||
|
<p>Decentralized, secure messaging and collaboration</p>
|
||||||
|
<p>Matrix Synapse ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Matrix Synapse, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Matrix Synapse</strong> from the <em>Communication</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>matrixdotorg/synapse:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>matrix.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/_matrix/client/versions</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "matrix",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "matrix",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"SYNAPSE_SERVER_NAME": "",
|
||||||
|
"SYNAPSE_REPORT_STATS": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Matrix Synapse on my home host and expose it at <code>matrix.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Generate initial config with --generate</li>
|
||||||
|
<li>Configure homeserver.yaml</li>
|
||||||
|
<li>Set up federation if needed</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/matrix/data:/data</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>SYNAPSE_SERVER_NAME</code></li>
|
||||||
|
<li><code>SYNAPSE_REPORT_STATS</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>matrixdotorg/synapse:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Matrix Synapse → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Matrix Synapse is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Matrix Synapse:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Matrix Synapse is in the <strong>Communication</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>matrix</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Mealie — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Mealie via DashCaddy. Recipe manager and meal planner with grocery lists',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function mealieDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Mealie"
|
||||||
|
intro="Recipe manager and meal planner with grocery lists"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Productivity</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">ghcr.io/mealie-recipes/mealie:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Mealie?</h2>
|
||||||
|
<p>Recipe manager and meal planner with grocery lists</p>
|
||||||
|
<p>Mealie ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Mealie, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Mealie</strong> from the <em>Productivity</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>ghcr.io/mealie-recipes/mealie:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>mealie.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "mealie",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "mealie",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"ALLOW_SIGNUP": "",
|
||||||
|
"MAX_WORKERS": "",
|
||||||
|
"WEB_CONCURRENCY": "",
|
||||||
|
"BASE_URL": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Mealie on my home host and expose it at <code>mealie.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Default login: changeme@example.com / MyPassword</li>
|
||||||
|
<li>Import recipes from URLs or add them manually</li>
|
||||||
|
<li>Create meal plans and generate shopping lists</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/mealie/data:/app/data</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>ALLOW_SIGNUP</code></li>
|
||||||
|
<li><code>MAX_WORKERS</code></li>
|
||||||
|
<li><code>WEB_CONCURRENCY</code></li>
|
||||||
|
<li><code>BASE_URL</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>ghcr.io/mealie-recipes/mealie:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Mealie → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Mealie is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Mealie:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Mealie is in the <strong>Productivity</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/nextcloud" className="text-brand-400 underline">Nextcloud</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>mealie</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,141 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Minecraft Server — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Minecraft Server via DashCaddy. Minecraft Java Edition dedicated server',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function minecraftDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Minecraft Server"
|
||||||
|
intro="Minecraft Java Edition dedicated server"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Gaming</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">itzg/minecraft-server:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Minecraft Server?</h2>
|
||||||
|
<p>Minecraft Java Edition dedicated server</p>
|
||||||
|
<p>Minecraft Server ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Minecraft Server, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Minecraft Server</strong> from the <em>Gaming</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>itzg/minecraft-server:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>mc.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>tcp://localhost:25565</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "minecraft",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "mc",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"EULA": "",
|
||||||
|
"TYPE": "",
|
||||||
|
"VERSION": "",
|
||||||
|
"MEMORY": "",
|
||||||
|
"MAX_PLAYERS": "",
|
||||||
|
"MOTD": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Minecraft Server on my home host and expose it at <code>mc.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Server accepts the Minecraft EULA automatically</li>
|
||||||
|
<li>Connect with your Minecraft client to the server IP:port</li>
|
||||||
|
<li>Configure server.properties in the data volume for customization</li>
|
||||||
|
<li>Supports Vanilla, Paper, Forge, Fabric via TYPE environment variable</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/minecraft/data:/data</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>EULA</code></li>
|
||||||
|
<li><code>TYPE</code></li>
|
||||||
|
<li><code>VERSION</code></li>
|
||||||
|
<li><code>MEMORY</code></li>
|
||||||
|
<li><code>MAX_PLAYERS</code></li>
|
||||||
|
<li><code>MOTD</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>itzg/minecraft-server:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Minecraft Server → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Minecraft Server is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Minecraft Server:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Minecraft Server is in the <strong>Gaming</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>minecraft</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install MongoDB — DashCaddy Docs',
|
||||||
|
description: 'Install and configure MongoDB via DashCaddy. Document-oriented NoSQL database',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function mongodbDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install MongoDB"
|
||||||
|
intro="Document-oriented NoSQL database"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Database</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">mongo:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is MongoDB?</h2>
|
||||||
|
<p>Document-oriented NoSQL database</p>
|
||||||
|
<p>MongoDB ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using MongoDB, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>MongoDB</strong> from the <em>Database</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>mongo:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>mongo.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "mongodb",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "mongo",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"MONGO_INITDB_ROOT_USERNAME": "",
|
||||||
|
"MONGO_INITDB_ROOT_PASSWORD": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy MongoDB on my home host and expose it at <code>mongo.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Change default admin password</li>
|
||||||
|
<li>Create application databases and users</li>
|
||||||
|
<li>Configure replica set if needed</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/mongodb/data:/data/db</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>MONGO_INITDB_ROOT_USERNAME</code></li>
|
||||||
|
<li><code>MONGO_INITDB_ROOT_PASSWORD</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>mongo:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → MongoDB → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for MongoDB is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with MongoDB:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>MongoDB is in the <strong>Database</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/adminer" className="text-brand-400 underline">Adminer</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>mongodb</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Navidrome — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Navidrome via DashCaddy. Modern music server and streamer',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function navidromeDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Navidrome"
|
||||||
|
intro="Modern music server and streamer"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Media</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">deluan/navidrome:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Navidrome?</h2>
|
||||||
|
<p>Modern music server and streamer</p>
|
||||||
|
<p>Navidrome ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Navidrome, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Navidrome</strong> from the <em>Media</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>deluan/navidrome:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>music.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "navidrome",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "music",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"ND_SCANSCHEDULE": "",
|
||||||
|
"ND_LOGLEVEL": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Navidrome on my home host and expose it at <code>music.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Point to your music library</li>
|
||||||
|
<li>Create user accounts</li>
|
||||||
|
<li>Install Subsonic-compatible apps</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/navidrome/data:/data</code></li>
|
||||||
|
<li><code>/music:/music:ro</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>ND_SCANSCHEDULE</code></li>
|
||||||
|
<li><code>ND_LOGLEVEL</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>deluan/navidrome:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Navidrome → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Navidrome is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Navidrome:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Navidrome is in the <strong>Media</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>navidrome</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Nextcloud — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Nextcloud via DashCaddy. Self-hosted productivity platform and file sync',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function nextcloudDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Nextcloud"
|
||||||
|
intro="Self-hosted productivity platform and file sync"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Productivity</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">nextcloud:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Nextcloud?</h2>
|
||||||
|
<p>Self-hosted productivity platform and file sync</p>
|
||||||
|
<p>Nextcloud ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Nextcloud, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Nextcloud</strong> from the <em>Productivity</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>nextcloud:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>cloud.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/status.php</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "nextcloud",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "cloud",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"NEXTCLOUD_ADMIN_USER": "",
|
||||||
|
"NEXTCLOUD_ADMIN_PASSWORD": "",
|
||||||
|
"NEXTCLOUD_TRUSTED_DOMAINS": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Nextcloud on my home host and expose it at <code>cloud.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Change the default admin password</li>
|
||||||
|
<li>Configure trusted domains</li>
|
||||||
|
<li>Install recommended apps</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/nextcloud/html:/var/www/html</code></li>
|
||||||
|
<li><code>/opt/nextcloud/data:/var/www/html/data</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>NEXTCLOUD_ADMIN_USER</code></li>
|
||||||
|
<li><code>NEXTCLOUD_ADMIN_PASSWORD</code></li>
|
||||||
|
<li><code>NEXTCLOUD_TRUSTED_DOMAINS</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>nextcloud:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Nextcloud → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Nextcloud is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Nextcloud:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Nextcloud is in the <strong>Productivity</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/adminer" className="text-brand-400 underline">Adminer</a> (DB admin)</li>
|
||||||
|
<li><a href="/docs/catalog/postgres" className="text-brand-400 underline">PostgreSQL</a> (external DB)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>nextcloud</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Node-RED — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Node-RED via DashCaddy. Flow-based programming for IoT and automation',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function noderedDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Node-RED"
|
||||||
|
intro="Flow-based programming for IoT and automation"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Home Automation</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">nodered/node-red:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Node-RED?</h2>
|
||||||
|
<p>Flow-based programming for IoT and automation</p>
|
||||||
|
<p>Node-RED ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Node-RED, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Node-RED</strong> from the <em>Home Automation</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>nodered/node-red:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>nodered.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "nodered",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "nodered",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Node-RED on my home host and expose it at <code>nodered.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Install additional nodes from palette</li>
|
||||||
|
<li>Create flows for automation</li>
|
||||||
|
<li>Connect to Home Assistant or MQTT</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/nodered/data:/data</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>nodered/node-red:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Node-RED → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Node-RED is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Node-RED:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Node-RED is in the <strong>Home Automation</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>nodered</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install NZBGet — DashCaddy Docs',
|
||||||
|
description: 'Install and configure NZBGet via DashCaddy. Efficient Usenet downloader',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function nzbgetDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install NZBGet"
|
||||||
|
intro="Efficient Usenet downloader"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Downloads</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">linuxserver/nzbget:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is NZBGet?</h2>
|
||||||
|
<p>Efficient Usenet downloader</p>
|
||||||
|
<p>NZBGet ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using NZBGet, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>NZBGet</strong> from the <em>Downloads</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>linuxserver/nzbget:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>nzbget.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "nzbget",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "nzbget",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PUID": "",
|
||||||
|
"PGID": "",
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy NZBGet on my home host and expose it at <code>nzbget.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Default login: nzbget/tegbzn6789</li>
|
||||||
|
<li>Configure news servers</li>
|
||||||
|
<li>Set up categories and paths</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/nzbget/config:/config</code></li>
|
||||||
|
<li><code>/downloads:/downloads</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PUID</code></li>
|
||||||
|
<li><code>PGID</code></li>
|
||||||
|
<li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>linuxserver/nzbget:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → NZBGet → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for NZBGet is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with NZBGet:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>NZBGet is in the <strong>Downloads</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/qbittorrent" className="text-brand-400 underline">qBittorrent</a></li>
|
||||||
|
<li><a href="/docs/catalog/sabnzbd" className="text-brand-400 underline">SABnzbd</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>nzbget</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Outline — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Outline via DashCaddy. Modern team knowledge base and wiki',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function outlineDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Outline"
|
||||||
|
intro="Modern team knowledge base and wiki"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Productivity</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#f5a62322', color: '#f5a623' }}>Difficulty: Advanced</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">outlinewiki/outline:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Outline?</h2>
|
||||||
|
<p>Modern team knowledge base and wiki</p>
|
||||||
|
<p>Outline ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Outline, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Outline</strong> from the <em>Productivity</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>outlinewiki/outline:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>outline.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "outline",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "outline",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"URL": "",
|
||||||
|
"SECRET_KEY": "",
|
||||||
|
"DATABASE_URL": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Outline on my home host and expose it at <code>outline.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Requires PostgreSQL and Redis</li>
|
||||||
|
<li>Configure OAuth provider</li>
|
||||||
|
<li>Set up S3-compatible storage</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/outline/data:/var/lib/outline/data</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>URL</code></li>
|
||||||
|
<li><code>SECRET_KEY</code></li>
|
||||||
|
<li><code>DATABASE_URL</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>outlinewiki/outline:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Outline → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Outline is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Outline:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Outline is in the <strong>Productivity</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/nextcloud" className="text-brand-400 underline">Nextcloud</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>outline</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,638 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'App Catalog — DashCaddy Docs',
|
||||||
|
description: 'Browse all 77 one-click installable apps supported by DashCaddy, organized by category with install instructions for each.',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function DocsCatalogPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="App Catalog"
|
||||||
|
intro="DashCaddy ships with 77 pre-configured application templates. Every template in this catalog can be deployed with a single click from the dashboard, called via the REST API, or invoked through the AI Intent Router. This page is the index — click any app for its dedicated install guide, environment variables, post-install checklist, and troubleshooting tips."
|
||||||
|
>
|
||||||
|
<div className="mb-8 rounded-xl border border-brand-500/30 bg-brand-500/5 p-5">
|
||||||
|
<p className="text-sm text-surface-200">
|
||||||
|
<strong className="text-brand-400">77 apps</strong> across <strong>17 categories</strong>. New templates are added whenever the upstream Docker image gains traction. The canonical source is <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Media</h2>
|
||||||
|
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||||
|
<a href="/docs/catalog/plex" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Plex</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Stream your personal media collection anywhere</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/jellyfin" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Jellyfin</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Free software media system - alternative to Plex</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/emby" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Emby</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Personal media server with apps for all devices</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/audiobookshelf" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Audiobookshelf</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Self-hosted audiobook and podcast server</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/navidrome" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Navidrome</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Modern music server and streamer</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/calibre-web" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Calibre-Web</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Web-based ebook manager and reader</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/kavita" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Kavita</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Digital reading platform for manga, comics, and books</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/vintage-radio" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Vintage Stereo</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Glass-front console stereo that tunes curated real internet stations (SomaFM, KEXP, Radio Paradise, and more) through a beautiful analog UI</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/komga" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Komga</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Comic and manga media server with web reader</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/airsonic" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Airsonic Advanced</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Free web-based media streamer</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Media Management</h2>
|
||||||
|
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||||
|
<a href="/docs/catalog/seerr" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Seerr</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Media request and discovery manager for Plex, Jellyfin, and Emby</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/sonarr" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Sonarr</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Smart PVR for newsgroup and bittorrent users</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/radarr" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Radarr</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Movie collection manager for Usenet and BitTorrent</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/tautulli" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Tautulli</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Plex media server monitoring and statistics</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/prowlarr" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Prowlarr</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#f5a62322', color: '#f5a623' }}>Advanced</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Indexer manager/proxy for *arr applications</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/bazarr" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Bazarr</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Automatic subtitle downloader for Sonarr and Radarr</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/lidarr" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Lidarr</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Music collection manager for Usenet and BitTorrent</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/readarr" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Readarr</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Book and audiobook collection manager</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Downloads</h2>
|
||||||
|
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||||
|
<a href="/docs/catalog/qbittorrent" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">qBittorrent</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Lightweight BitTorrent client with web UI</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/transmission" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Transmission</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Lightweight BitTorrent client</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/sabnzbd" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">SABnzbd</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Binary newsreader for Usenet downloads</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/jdownloader" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">JDownloader 2</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Download manager for file hosting sites</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/nzbget" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">NZBGet</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Efficient Usenet downloader</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Productivity</h2>
|
||||||
|
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||||
|
<a href="/docs/catalog/nextcloud" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Nextcloud</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Self-hosted productivity platform and file sync</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/paperless-ngx" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Paperless-ngx</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Document management system - scan, organize, and search documents</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/bookstack" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">BookStack</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Simple wiki and documentation platform</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/actual-budget" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Actual Budget</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Privacy-focused budgeting app with envelope budgeting</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/mealie" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Mealie</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Recipe manager and meal planner with grocery lists</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/outline" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Outline</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#f5a62322', color: '#f5a623' }}>Advanced</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Modern team knowledge base and wiki</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/trilium" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Trilium Notes</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Hierarchical knowledge base and note-taking app</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/excalidraw" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Excalidraw</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Collaborative virtual whiteboard for sketching and diagrams</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/standardnotes" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Standard Notes</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">End-to-end encrypted notes app</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Development</h2>
|
||||||
|
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||||
|
<a href="/docs/catalog/gitea" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Gitea</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Lightweight self-hosted Git service</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/vscode-server" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">VS Code Server</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Visual Studio Code in your browser</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/jenkins" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Jenkins</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#f5a62322', color: '#f5a623' }}>Advanced</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Automation server for CI/CD pipelines</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/drone" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Drone CI</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Container-native continuous delivery platform</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Management</h2>
|
||||||
|
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||||
|
<a href="/docs/catalog/portainer" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Portainer</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Docker container management UI</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/watchtower" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Watchtower</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Automatic Docker container image updates</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Monitoring</h2>
|
||||||
|
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||||
|
<a href="/docs/catalog/uptime-kuma" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Uptime Kuma</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Self-hosted monitoring tool like Uptime Robot</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/grafana" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Grafana</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#f5a62322', color: '#f5a623' }}>Advanced</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Analytics and interactive visualization platform</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/dozzle" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Dozzle</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Real-time Docker container log viewer</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/speedtest" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Speedtest Tracker</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Internet speed monitoring over time</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Networking</h2>
|
||||||
|
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||||
|
<a href="/docs/catalog/pihole" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Pi-hole</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Network-wide ad blocker and DNS sinkhole</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/wireguard" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">WireGuard VPN</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#f5a62322', color: '#f5a623' }}>Advanced</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Fast, modern, secure VPN tunnel</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>DNS</h2>
|
||||||
|
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||||
|
<a href="/docs/catalog/technitium" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Technitium DNS Server</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Modern DNS server with web UI for managing private zones</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/bind9" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">BIND9 DNS Server</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#f5a62322', color: '#f5a623' }}>Advanced</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Industry-standard DNS server - powerful and flexible</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/powerdns" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">PowerDNS</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">High-performance DNS server with SQL backend</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/coredns" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">CoreDNS</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Cloud-native DNS server - lightweight and flexible</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Files</h2>
|
||||||
|
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||||
|
<a href="/docs/catalog/filebrowser" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">FileBrowser</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Web-based file manager with sharing capabilities</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/syncthing" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Syncthing</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Continuous file synchronization between devices</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/sami-files" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Sami Files</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Multi-server SSH file manager — browse, edit, upload, and exec across all your machines from one browser tab</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Communication</h2>
|
||||||
|
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||||
|
<a href="/docs/catalog/rocketchat" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Rocket.Chat</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Team collaboration platform like Slack</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/matrix" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Matrix Synapse</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#f5a62322', color: '#f5a623' }}>Advanced</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Decentralized, secure messaging and collaboration</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/roundcube" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Roundcube</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Modern webmail client with rich features</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/mailserver" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Docker Mailserver</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#f5a62322', color: '#f5a623' }}>Advanced</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Full-featured email server with SMTP, IMAP, spam filtering</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Home Automation</h2>
|
||||||
|
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||||
|
<a href="/docs/catalog/homeassistant" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Home Assistant</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Open source home automation platform</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/nodered" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Node-RED</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Flow-based programming for IoT and automation</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Database</h2>
|
||||||
|
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||||
|
<a href="/docs/catalog/postgres" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">PostgreSQL</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Advanced open-source relational database</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/redis" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Redis</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">In-memory data structure store and cache</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/mongodb" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">MongoDB</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Document-oriented NoSQL database</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/adminer" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Adminer</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Lightweight database management in single PHP file</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Security</h2>
|
||||||
|
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||||
|
<a href="/docs/catalog/dashca" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">DashCA</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">One-click root CA certificate installer for your network</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/vaultwarden" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Vaultwarden</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Lightweight Bitwarden-compatible password manager</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/authentik" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Authentik</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#f5a62322', color: '#f5a623' }}>Advanced</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Identity provider and single sign-on platform</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/crowdsec" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">CrowdSec</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Collaborative intrusion prevention system</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Photos</h2>
|
||||||
|
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||||
|
<a href="/docs/catalog/immich" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Immich</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Self-hosted Google Photos alternative</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/photoprism" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">PhotoPrism</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Intermediate</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">AI-powered photo management</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Utilities</h2>
|
||||||
|
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||||
|
<a href="/docs/catalog/homepage" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Homepage</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Highly customizable application dashboard</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/stirling-pdf" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Stirling PDF</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Self-hosted PDF manipulation tool - merge, split, convert, and more</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/weather" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Weather</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Live weather widget with temperature, conditions, and wind</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/homarr" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Homarr</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Sleek dashboard for all your services</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/digital-clock" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Digital Clock</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Live digital clock with time, date, and day of week</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/it-tools" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">IT Tools</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Collection of handy developer and IT tools in one place</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/changedetection" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Change Detection</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Monitor websites for changes</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/whoami" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Whoami</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Simple HTTP request debugging service</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Gaming</h2>
|
||||||
|
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||||
|
<a href="/docs/catalog/minecraft" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Minecraft Server</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Minecraft Java Edition dedicated server</p>
|
||||||
|
</a>
|
||||||
|
<a href="/docs/catalog/valheim" className="block rounded-xl border border-surface-700/50 bg-surface-900/40 p-4 transition-colors hover:border-brand-500/50 hover:bg-surface-800/50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<h3 className="text-base font-semibold text-surface-50">Valheim Server</h3>
|
||||||
|
<span className="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Easy</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-surface-300">Valheim dedicated server for multiplayer Viking adventures</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<hr className="my-10 border-surface-700" />
|
||||||
|
<h2>Adding your own template</h2>
|
||||||
|
<p>DashCaddy accepts custom templates via the same REST API used to deploy the built-in ones. Submit a template JSON via <code>POST /api/v1/apps/templates</code> with the schema documented in the <a href="/docs/api" className="text-brand-400 underline">API guide</a>, or fork <code>dashcaddy-api/src/docker/app-templates.js</code> and add your template to the catalog for everyone.</p>
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Paperless-ngx — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Paperless-ngx via DashCaddy. Document management system - scan, organize, and search documents',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function paperlessNgxDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Paperless-ngx"
|
||||||
|
intro="Document management system - scan, organize, and search documents"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Productivity</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">ghcr.io/paperless-ngx/paperless-ngx:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Paperless-ngx?</h2>
|
||||||
|
<p>Document management system - scan, organize, and search documents</p>
|
||||||
|
<p>Paperless-ngx ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Paperless-ngx, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Paperless-ngx</strong> from the <em>Productivity</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>ghcr.io/paperless-ngx/paperless-ngx:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>paperless.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "paperless-ngx",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "paperless",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PAPERLESS_URL": "",
|
||||||
|
"USERMAP_UID": "",
|
||||||
|
"USERMAP_GID": "",
|
||||||
|
"PAPERLESS_TIME_ZONE": "",
|
||||||
|
"PAPERLESS_OCR_LANGUAGE": "",
|
||||||
|
"PAPERLESS_SECRET_KEY": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Paperless-ngx on my home host and expose it at <code>paperless.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Create admin account via: docker exec -it <container> python3 manage.py createsuperuser</li>
|
||||||
|
<li>Drop documents into the consume folder for automatic import</li>
|
||||||
|
<li>Configure tags and correspondents for organization</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/paperless/data:/usr/src/paperless/data</code></li>
|
||||||
|
<li><code>/opt/paperless/media:/usr/src/paperless/media</code></li>
|
||||||
|
<li><code>/opt/paperless/consume:/usr/src/paperless/consume</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PAPERLESS_URL</code></li>
|
||||||
|
<li><code>USERMAP_UID</code></li>
|
||||||
|
<li><code>USERMAP_GID</code></li>
|
||||||
|
<li><code>PAPERLESS_TIME_ZONE</code></li>
|
||||||
|
<li><code>PAPERLESS_OCR_LANGUAGE</code></li>
|
||||||
|
<li><code>PAPERLESS_SECRET_KEY</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>ghcr.io/paperless-ngx/paperless-ngx:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Paperless-ngx → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Paperless-ngx is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Paperless-ngx:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Paperless-ngx is in the <strong>Productivity</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/nextcloud" className="text-brand-400 underline">Nextcloud</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>paperless-ngx</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,135 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install PhotoPrism — DashCaddy Docs',
|
||||||
|
description: 'Install and configure PhotoPrism via DashCaddy. AI-powered photo management',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function photoprismDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install PhotoPrism"
|
||||||
|
intro="AI-powered photo management"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Photos</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">photoprism/photoprism:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is PhotoPrism?</h2>
|
||||||
|
<p>AI-powered photo management</p>
|
||||||
|
<p>PhotoPrism ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using PhotoPrism, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>PhotoPrism</strong> from the <em>Photos</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>photoprism/photoprism:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>gallery.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/api/v1/status</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "photoprism",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "gallery",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PHOTOPRISM_ADMIN_PASSWORD": "",
|
||||||
|
"PHOTOPRISM_SITE_URL": "",
|
||||||
|
"PHOTOPRISM_DATABASE_DRIVER": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy PhotoPrism on my home host and expose it at <code>gallery.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Change admin password</li>
|
||||||
|
<li>Import your photos</li>
|
||||||
|
<li>Run indexing for AI features</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/photoprism/storage:/photoprism/storage</code></li>
|
||||||
|
<li><code>/opt/photoprism/originals:/photoprism/originals</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PHOTOPRISM_ADMIN_PASSWORD</code></li>
|
||||||
|
<li><code>PHOTOPRISM_SITE_URL</code></li>
|
||||||
|
<li><code>PHOTOPRISM_DATABASE_DRIVER</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>photoprism/photoprism:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → PhotoPrism → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for PhotoPrism is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with PhotoPrism:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>PhotoPrism is in the <strong>Photos</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>photoprism</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Pi-hole — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Pi-hole via DashCaddy. Network-wide ad blocker and DNS sinkhole',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function piholeDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Pi-hole"
|
||||||
|
intro="Network-wide ad blocker and DNS sinkhole"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Networking</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">pihole/pihole:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Pi-hole?</h2>
|
||||||
|
<p>Network-wide ad blocker and DNS sinkhole</p>
|
||||||
|
<p>Pi-hole ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Pi-hole, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Pi-hole</strong> from the <em>Networking</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>pihole/pihole:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>pihole.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/admin/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "pihole",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "pihole",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"WEBPASSWORD": "",
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Pi-hole on my home host and expose it at <code>pihole.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Open the new <code>pihole.<your-domain></code> URL.</li>
|
||||||
|
<li>Complete the upstream Pi-hole setup wizard (create admin user, accept EULA, etc.).</li>
|
||||||
|
<li>Configure backups from <strong>Settings → Backups</strong> — the default daily snapshot will capture the data volume.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/pihole/etc:/etc/pihole</code></li>
|
||||||
|
<li><code>/opt/pihole/dnsmasq:/etc/dnsmasq.d</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>WEBPASSWORD</code></li>
|
||||||
|
<li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>pihole/pihole:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Pi-hole → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Pi-hole is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Pi-hole:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Pi-hole is in the <strong>Networking</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/technitium" className="text-brand-400 underline">Technitium DNS</a> (more powerful DNS)</li>
|
||||||
|
<li><a href="/docs/catalog/wireguard" className="text-brand-400 underline">WireGuard</a> (private DNS over VPN)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>pihole</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,155 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Plex — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Plex via DashCaddy. Stream your personal media collection anywhere',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function plexDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Plex"
|
||||||
|
intro="Stream your personal media collection anywhere"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Media</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">plexinc/pms-docker:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Plex?</h2>
|
||||||
|
<p>Stream your personal media collection anywhere</p>
|
||||||
|
<p>Plex ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Plex, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>A host path to mount as the <strong>media library</strong> (default: <code>/media</code>).</li>
|
||||||
|
<li>A <strong>Plex Claim Token</strong> — get one from <a href="https://plex.tv/claim" className="text-brand-400 underline">https://plex.tv/claim</a> before you start.</li>
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Plex</strong> from the <em>Media</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>plexinc/pms-docker:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>plex.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/web/index.html</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "plex",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "plex",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PLEX_CLAIM": "",
|
||||||
|
"ADVERTISE_IP": "",
|
||||||
|
"PLEX_UID": "",
|
||||||
|
"PLEX_GID": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Plex on my home host and expose it at <code>plex.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Get your claim token from https://plex.tv/claim</li>
|
||||||
|
<li>Add your media libraries in the web interface</li>
|
||||||
|
<li>Configure remote access settings</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Media library path notes</h2>
|
||||||
|
<p>The media mount path you set at deploy time is what Plex will see as <code>/data</code>. For multi-library setups (movies + TV + music), bind the parent folder and let Plex discover subfolders automatically.</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Permissions:</strong> Plex runs as a non-root user. Make sure your media files are readable by UID <code>1000</code> (or whichever the container expects — check the <em>Logs</em> tab on first run).</li>
|
||||||
|
<li><strong>Performance:</strong> Put the media library on the same storage pool as DashCaddy itself; cross-pool mounts add 10–30% latency on first scan.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Plex Claim Token</h2>
|
||||||
|
<p>Get from https://plex.tv/claim - expires in 4 minutes!</p>
|
||||||
|
<blockquote className="border-l-4 border-yellow-500/50 bg-yellow-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-yellow-200">
|
||||||
|
<strong>Heads up:</strong> Plex Claim Token expires after a few minutes. Get a fresh one from
|
||||||
|
<a href="https://plex.tv/claim" className="underline"> https://plex.tv/claim</a>
|
||||||
|
right before you click <em>Deploy</em>.
|
||||||
|
</p>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/plex/config:/config</code></li>
|
||||||
|
<li><code>/opt/plex/transcode:/transcode</code></li>
|
||||||
|
<li><code>MEDIA_PATH:/data</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PLEX_CLAIM</code></li>
|
||||||
|
<li><code>ADVERTISE_IP</code></li>
|
||||||
|
<li><code>PLEX_UID</code></li>
|
||||||
|
<li><code>PLEX_GID</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>plexinc/pms-docker:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Plex → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Plex is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Plex:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
<li><strong>Library shows empty:</strong> confirm the media mount path is readable by the container UID and that the directory contains the file extensions Plex indexes.</li>
|
||||||
|
<li><strong>Account linking fails:</strong> your claim token probably expired. Get a new one and re-deploy.</li>
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Plex is in the <strong>Media</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/jellyfin" className="text-brand-400 underline">Jellyfin</a> (free alternative)</li>
|
||||||
|
<li><a href="/docs/catalog/tautulli" className="text-brand-400 underline">Tautulli</a> (Plex statistics)</li>
|
||||||
|
<li><a href="/docs/catalog/sonarr" className="text-brand-400 underline">Sonarr</a> + <a href="/docs/catalog/radarr" className="text-brand-400 underline">Radarr</a> (automation)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>plex</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Portainer — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Portainer via DashCaddy. Docker container management UI',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function portainerDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Portainer"
|
||||||
|
intro="Docker container management UI"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Management</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">portainer/portainer-ce:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Portainer?</h2>
|
||||||
|
<p>Docker container management UI</p>
|
||||||
|
<p>Portainer ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Portainer, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Portainer</strong> from the <em>Management</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>portainer/portainer-ce:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>portainer.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/api/status</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "portainer",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "portainer",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Portainer on my home host and expose it at <code>portainer.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Open the new <code>portainer.<your-domain></code> URL.</li>
|
||||||
|
<li>Complete the upstream Portainer setup wizard (create admin user, accept EULA, etc.).</li>
|
||||||
|
<li>Configure backups from <strong>Settings → Backups</strong> — the default daily snapshot will capture the data volume.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/var/run/docker.sock:/var/run/docker.sock</code></li>
|
||||||
|
<li><code>/opt/portainer/data:/data</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>portainer/portainer-ce:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Portainer → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Portainer is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Portainer:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Portainer is in the <strong>Management</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>portainer</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install PostgreSQL — DashCaddy Docs',
|
||||||
|
description: 'Install and configure PostgreSQL via DashCaddy. Advanced open-source relational database',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function postgresDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install PostgreSQL"
|
||||||
|
intro="Advanced open-source relational database"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Database</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">postgres:16-alpine</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is PostgreSQL?</h2>
|
||||||
|
<p>Advanced open-source relational database</p>
|
||||||
|
<p>PostgreSQL ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using PostgreSQL, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>PostgreSQL</strong> from the <em>Database</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>postgres:16-alpine</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>postgres.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "postgres",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "postgres",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"POSTGRES_USER": "",
|
||||||
|
"POSTGRES_PASSWORD": "",
|
||||||
|
"POSTGRES_DB": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy PostgreSQL on my home host and expose it at <code>postgres.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Change default password immediately</li>
|
||||||
|
<li>Create databases and users as needed</li>
|
||||||
|
<li>Configure pg_hba.conf for remote access</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/postgres/data:/var/lib/postgresql/data</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>POSTGRES_USER</code></li>
|
||||||
|
<li><code>POSTGRES_PASSWORD</code></li>
|
||||||
|
<li><code>POSTGRES_DB</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>postgres:16-alpine</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → PostgreSQL → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for PostgreSQL is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with PostgreSQL:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>PostgreSQL is in the <strong>Database</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/adminer" className="text-brand-400 underline">Adminer</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>postgres</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install PowerDNS — DashCaddy Docs',
|
||||||
|
description: 'Install and configure PowerDNS via DashCaddy. High-performance DNS server with SQL backend',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function powerdnsDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install PowerDNS"
|
||||||
|
intro="High-performance DNS server with SQL backend"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: DNS</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">pschiffe/pdns-mysql:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is PowerDNS?</h2>
|
||||||
|
<p>High-performance DNS server with SQL backend</p>
|
||||||
|
<p>PowerDNS ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using PowerDNS, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>PowerDNS</strong> from the <em>DNS</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>pschiffe/pdns-mysql:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>dns3.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/api/v1/servers</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "powerdns",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "dns3",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PDNS_api": "",
|
||||||
|
"PDNS_api_key": "",
|
||||||
|
"PDNS_webserver": "",
|
||||||
|
"PDNS_webserver_address": "",
|
||||||
|
"PDNS_webserver_allow_from": "",
|
||||||
|
"MYSQL_ROOT_PASSWORD": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy PowerDNS on my home host and expose it at <code>dns3.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Access API at https://dns3.sami:8081</li>
|
||||||
|
<li>Use API key for authentication</li>
|
||||||
|
<li>Create zone via API or PowerDNS Admin</li>
|
||||||
|
<li>Add records for your .sami domain</li>
|
||||||
|
<li>Configure devices to use DNS server</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/powerdns/data:/var/lib/mysql</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PDNS_api</code></li>
|
||||||
|
<li><code>PDNS_api_key</code></li>
|
||||||
|
<li><code>PDNS_webserver</code></li>
|
||||||
|
<li><code>PDNS_webserver_address</code></li>
|
||||||
|
<li><code>PDNS_webserver_allow_from</code></li>
|
||||||
|
<li><code>MYSQL_ROOT_PASSWORD</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>pschiffe/pdns-mysql:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → PowerDNS → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for PowerDNS is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with PowerDNS:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>PowerDNS is in the <strong>DNS</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>powerdns</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Prowlarr — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Prowlarr via DashCaddy. Indexer manager/proxy for *arr applications',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function prowlarrDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Prowlarr"
|
||||||
|
intro="Indexer manager/proxy for *arr applications"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Media Management</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#f5a62322', color: '#f5a623' }}>Difficulty: Advanced</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">linuxserver/prowlarr:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Prowlarr?</h2>
|
||||||
|
<p>Indexer manager/proxy for *arr applications</p>
|
||||||
|
<p>Prowlarr ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Prowlarr, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Prowlarr</strong> from the <em>Media Management</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>linuxserver/prowlarr:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>prowlarr.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/api/v1/system/status</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "prowlarr",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "prowlarr",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PUID": "",
|
||||||
|
"PGID": "",
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Prowlarr on my home host and expose it at <code>prowlarr.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Open the new <code>prowlarr.<your-domain></code> URL.</li>
|
||||||
|
<li>Complete the upstream Prowlarr setup wizard (create admin user, accept EULA, etc.).</li>
|
||||||
|
<li>Configure backups from <strong>Settings → Backups</strong> — the default daily snapshot will capture the data volume.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/prowlarr/config:/config</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PUID</code></li>
|
||||||
|
<li><code>PGID</code></li>
|
||||||
|
<li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>linuxserver/prowlarr:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Prowlarr → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Prowlarr is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Prowlarr:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Prowlarr is in the <strong>Media Management</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/sonarr" className="text-brand-400 underline">Sonarr</a></li>
|
||||||
|
<li><a href="/docs/catalog/radarr" className="text-brand-400 underline">Radarr</a></li>
|
||||||
|
<li><a href="/docs/catalog/bazarr" className="text-brand-400 underline">Bazarr</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>prowlarr</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install qBittorrent — DashCaddy Docs',
|
||||||
|
description: 'Install and configure qBittorrent via DashCaddy. Lightweight BitTorrent client with web UI',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function qbittorrentDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install qBittorrent"
|
||||||
|
intro="Lightweight BitTorrent client with web UI"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Downloads</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">linuxserver/qbittorrent:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is qBittorrent?</h2>
|
||||||
|
<p>Lightweight BitTorrent client with web UI</p>
|
||||||
|
<p>qBittorrent ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using qBittorrent, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>qBittorrent</strong> from the <em>Downloads</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>linuxserver/qbittorrent:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>torrent.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "qbittorrent",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "torrent",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PUID": "",
|
||||||
|
"PGID": "",
|
||||||
|
"TZ": "",
|
||||||
|
"WEBUI_PORT": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy qBittorrent on my home host and expose it at <code>torrent.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Default login: admin/adminadmin</li>
|
||||||
|
<li>Change default password immediately</li>
|
||||||
|
<li>Configure download paths</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/qbittorrent/config:/config</code></li>
|
||||||
|
<li><code>/downloads:/downloads</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PUID</code></li>
|
||||||
|
<li><code>PGID</code></li>
|
||||||
|
<li><code>TZ</code></li>
|
||||||
|
<li><code>WEBUI_PORT</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>linuxserver/qbittorrent:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → qBittorrent → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for qBittorrent is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with qBittorrent:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>qBittorrent is in the <strong>Downloads</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/qbittorrent" className="text-brand-400 underline">qBittorrent</a></li>
|
||||||
|
<li><a href="/docs/catalog/sabnzbd" className="text-brand-400 underline">SABnzbd</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>qbittorrent</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Radarr — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Radarr via DashCaddy. Movie collection manager for Usenet and BitTorrent',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function radarrDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Radarr"
|
||||||
|
intro="Movie collection manager for Usenet and BitTorrent"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Media Management</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">linuxserver/radarr:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Radarr?</h2>
|
||||||
|
<p>Movie collection manager for Usenet and BitTorrent</p>
|
||||||
|
<p>Radarr ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Radarr, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Radarr</strong> from the <em>Media Management</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>linuxserver/radarr:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>radarr.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/api/v3/system/status</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "radarr",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "radarr",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PUID": "",
|
||||||
|
"PGID": "",
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Radarr on my home host and expose it at <code>radarr.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Open the new <code>radarr.<your-domain></code> URL.</li>
|
||||||
|
<li>Complete the upstream Radarr setup wizard (create admin user, accept EULA, etc.).</li>
|
||||||
|
<li>Configure backups from <strong>Settings → Backups</strong> — the default daily snapshot will capture the data volume.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/radarr/config:/config</code></li>
|
||||||
|
<li><code>/downloads:/downloads</code></li>
|
||||||
|
<li><code>/movies:/movies</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PUID</code></li>
|
||||||
|
<li><code>PGID</code></li>
|
||||||
|
<li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>linuxserver/radarr:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Radarr → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Radarr is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Radarr:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Radarr is in the <strong>Media Management</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/sonarr" className="text-brand-400 underline">Sonarr</a> (TV)</li>
|
||||||
|
<li><a href="/docs/catalog/prowlarr" className="text-brand-400 underline">Prowlarr</a> (indexers)</li>
|
||||||
|
<li><a href="/docs/catalog/bazarr" className="text-brand-400 underline">Bazarr</a> (subtitles)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>radarr</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Readarr — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Readarr via DashCaddy. Book and audiobook collection manager',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function readarrDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Readarr"
|
||||||
|
intro="Book and audiobook collection manager"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Media Management</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">linuxserver/readarr:develop</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Readarr?</h2>
|
||||||
|
<p>Book and audiobook collection manager</p>
|
||||||
|
<p>Readarr ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Readarr, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Readarr</strong> from the <em>Media Management</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>linuxserver/readarr:develop</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>readarr.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/api/v1/system/status</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "readarr",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "readarr",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PUID": "",
|
||||||
|
"PGID": "",
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Readarr on my home host and expose it at <code>readarr.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Configure download clients</li>
|
||||||
|
<li>Add indexers for books</li>
|
||||||
|
<li>Set up root folders</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/readarr/config:/config</code></li>
|
||||||
|
<li><code>/downloads:/downloads</code></li>
|
||||||
|
<li><code>/books:/books</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PUID</code></li>
|
||||||
|
<li><code>PGID</code></li>
|
||||||
|
<li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>linuxserver/readarr:develop</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Readarr → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Readarr is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Readarr:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Readarr is in the <strong>Media Management</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/sonarr" className="text-brand-400 underline">Sonarr</a></li>
|
||||||
|
<li><a href="/docs/catalog/radarr" className="text-brand-400 underline">Radarr</a></li>
|
||||||
|
<li><a href="/docs/catalog/bazarr" className="text-brand-400 underline">Bazarr</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>readarr</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,128 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Redis — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Redis via DashCaddy. In-memory data structure store and cache',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function redisDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Redis"
|
||||||
|
intro="In-memory data structure store and cache"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Database</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">redis:alpine</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Redis?</h2>
|
||||||
|
<p>In-memory data structure store and cache</p>
|
||||||
|
<p>Redis ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Redis, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Redis</strong> from the <em>Database</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>redis:alpine</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>redis.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "redis",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "redis",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Redis on my home host and expose it at <code>redis.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Configure redis.conf for persistence</li>
|
||||||
|
<li>Set up authentication if needed</li>
|
||||||
|
<li>Configure maxmemory policy</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/redis/data:/data</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>redis:alpine</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Redis → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Redis is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Redis:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Redis is in the <strong>Database</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/adminer" className="text-brand-400 underline">Adminer</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>redis</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Rocket.Chat — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Rocket.Chat via DashCaddy. Team collaboration platform like Slack',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function rocketchatDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Rocket.Chat"
|
||||||
|
intro="Team collaboration platform like Slack"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Communication</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">rocket.chat:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Rocket.Chat?</h2>
|
||||||
|
<p>Team collaboration platform like Slack</p>
|
||||||
|
<p>Rocket.Chat ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Rocket.Chat, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Rocket.Chat</strong> from the <em>Communication</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>rocket.chat:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>chat.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/api/info</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "rocketchat",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "chat",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"ROOT_URL": "",
|
||||||
|
"MONGO_URL": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Rocket.Chat on my home host and expose it at <code>chat.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Requires MongoDB - deploy mongo container first</li>
|
||||||
|
<li>Complete admin setup wizard</li>
|
||||||
|
<li>Configure OAuth and integrations</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/rocketchat/uploads:/app/uploads</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>ROOT_URL</code></li>
|
||||||
|
<li><code>MONGO_URL</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>rocket.chat:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Rocket.Chat → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Rocket.Chat is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Rocket.Chat:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Rocket.Chat is in the <strong>Communication</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>rocketchat</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Roundcube — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Roundcube via DashCaddy. Modern webmail client with rich features',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function roundcubeDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Roundcube"
|
||||||
|
intro="Modern webmail client with rich features"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Communication</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">roundcube/roundcubemail:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Roundcube?</h2>
|
||||||
|
<p>Modern webmail client with rich features</p>
|
||||||
|
<p>Roundcube ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Roundcube, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Roundcube</strong> from the <em>Communication</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>roundcube/roundcubemail:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>webmail.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "roundcube",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "webmail",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"ROUNDCUBEMAIL_DEFAULT_HOST": "",
|
||||||
|
"ROUNDCUBEMAIL_SMTP_SERVER": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Roundcube on my home host and expose it at <code>webmail.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Configure IMAP/SMTP server settings</li>
|
||||||
|
<li>Set up database connection</li>
|
||||||
|
<li>Customize appearance and plugins</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/roundcube/config:/var/roundcube/config</code></li>
|
||||||
|
<li><code>/opt/roundcube/db:/var/roundcube/db</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>ROUNDCUBEMAIL_DEFAULT_HOST</code></li>
|
||||||
|
<li><code>ROUNDCUBEMAIL_SMTP_SERVER</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>roundcube/roundcubemail:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Roundcube → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Roundcube is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Roundcube:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Roundcube is in the <strong>Communication</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>roundcube</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install SABnzbd — DashCaddy Docs',
|
||||||
|
description: 'Install and configure SABnzbd via DashCaddy. Binary newsreader for Usenet downloads',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function sabnzbdDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install SABnzbd"
|
||||||
|
intro="Binary newsreader for Usenet downloads"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Downloads</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">linuxserver/sabnzbd:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is SABnzbd?</h2>
|
||||||
|
<p>Binary newsreader for Usenet downloads</p>
|
||||||
|
<p>SABnzbd ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using SABnzbd, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>SABnzbd</strong> from the <em>Downloads</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>linuxserver/sabnzbd:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>sabnzbd.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "sabnzbd",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "sabnzbd",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PUID": "",
|
||||||
|
"PGID": "",
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy SABnzbd on my home host and expose it at <code>sabnzbd.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Configure Usenet server credentials</li>
|
||||||
|
<li>Set up download categories</li>
|
||||||
|
<li>Configure post-processing scripts</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/sabnzbd/config:/config</code></li>
|
||||||
|
<li><code>/downloads:/downloads</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PUID</code></li>
|
||||||
|
<li><code>PGID</code></li>
|
||||||
|
<li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>linuxserver/sabnzbd:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → SABnzbd → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for SABnzbd is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with SABnzbd:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>SABnzbd is in the <strong>Downloads</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/qbittorrent" className="text-brand-400 underline">qBittorrent</a></li>
|
||||||
|
<li><a href="/docs/catalog/sabnzbd" className="text-brand-400 underline">SABnzbd</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>sabnzbd</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Sami Files — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Sami Files via DashCaddy. Multi-server SSH file manager — browse, edit, upload, and exec across all your machines from one browser tab',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function samiFilesDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Sami Files"
|
||||||
|
intro="Multi-server SSH file manager — browse, edit, upload, and exec across all your machines from one browser tab"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Files</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">N/A</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Sami Files?</h2>
|
||||||
|
<p>Multi-server SSH file manager — browse, edit, upload, and exec across all your machines from one browser tab</p>
|
||||||
|
<p>Sami Files ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Sami Files, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Sami Files</strong> from the <em>Files</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>N/A</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>files.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>http://127.0.0.1:8765/api/health</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "sami-files",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "files",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Sami Files on my home host and expose it at <code>files.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Clone the repo: git clone http://100.81.59.99:3030/sami7777/sami-files.git /opt/sami-files</li>
|
||||||
|
<li>Create venv and install deps: /usr/local/lib/hermes-agent/venv/bin/pip install fastapi uvicorn asyncssh pyyaml python-multipart</li>
|
||||||
|
<li>Copy deploy/sami-files.service to /etc/systemd/system/ and `systemctl daemon-reload`</li>
|
||||||
|
<li>Enable + start: systemctl enable --now sami-files.service</li>
|
||||||
|
<li>Edit /opt/sami-files/config/servers.yaml to add your SSH targets</li>
|
||||||
|
<li>Add the Caddy snippet (above) to your Caddyfile and reload Caddy</li>
|
||||||
|
<li>Mount the log dir into DashCaddy: add `-v /opt/sami-files/logs:/opt/sami-files/logs:ro` to start.sh, then recreate the container</li>
|
||||||
|
<li>Browse to https://files.sami — log in via DashCaddy SSO</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>N/A</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Sami Files → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Sami Files is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Sami Files:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Sami Files is in the <strong>Files</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>sami-files</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Seerr — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Seerr via DashCaddy. Media request and discovery manager for Plex, Jellyfin, and Emby',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function seerrDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Seerr"
|
||||||
|
intro="Media request and discovery manager for Plex, Jellyfin, and Emby"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Media Management</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">ghcr.io/seerr-team/seerr:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Seerr?</h2>
|
||||||
|
<p>Media request and discovery manager for Plex, Jellyfin, and Emby</p>
|
||||||
|
<p>Seerr ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Seerr, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Seerr</strong> from the <em>Media Management</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>ghcr.io/seerr-team/seerr:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>requests.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/api/v1/status</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "seerr",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "requests",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Seerr on my home host and expose it at <code>requests.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Connect to Plex, Jellyfin, or Emby server</li>
|
||||||
|
<li>Link Sonarr and Radarr</li>
|
||||||
|
<li>Configure user permissions</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/seerr/config:/app/config</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>ghcr.io/seerr-team/seerr:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Seerr → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Seerr is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Seerr:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Seerr is in the <strong>Media Management</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/sonarr" className="text-brand-400 underline">Sonarr</a></li>
|
||||||
|
<li><a href="/docs/catalog/radarr" className="text-brand-400 underline">Radarr</a></li>
|
||||||
|
<li><a href="/docs/catalog/bazarr" className="text-brand-400 underline">Bazarr</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>seerr</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Sonarr — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Sonarr via DashCaddy. Smart PVR for newsgroup and bittorrent users',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function sonarrDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Sonarr"
|
||||||
|
intro="Smart PVR for newsgroup and bittorrent users"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Media Management</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">linuxserver/sonarr:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Sonarr?</h2>
|
||||||
|
<p>Smart PVR for newsgroup and bittorrent users</p>
|
||||||
|
<p>Sonarr ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Sonarr, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Sonarr</strong> from the <em>Media Management</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>linuxserver/sonarr:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>sonarr.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/api/v3/system/status</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "sonarr",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "sonarr",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PUID": "",
|
||||||
|
"PGID": "",
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Sonarr on my home host and expose it at <code>sonarr.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Configure download clients (qBittorrent, etc.)</li>
|
||||||
|
<li>Add indexers for content discovery</li>
|
||||||
|
<li>Set up root folders for TV shows</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/sonarr/config:/config</code></li>
|
||||||
|
<li><code>/downloads:/downloads</code></li>
|
||||||
|
<li><code>/tv:/tv</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PUID</code></li>
|
||||||
|
<li><code>PGID</code></li>
|
||||||
|
<li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>linuxserver/sonarr:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Sonarr → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Sonarr is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Sonarr:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Sonarr is in the <strong>Media Management</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/radarr" className="text-brand-400 underline">Radarr</a> (movies)</li>
|
||||||
|
<li><a href="/docs/catalog/prowlarr" className="text-brand-400 underline">Prowlarr</a> (indexers)</li>
|
||||||
|
<li><a href="/docs/catalog/bazarr" className="text-brand-400 underline">Bazarr</a> (subtitles)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>sonarr</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,135 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Speedtest Tracker — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Speedtest Tracker via DashCaddy. Internet speed monitoring over time',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function speedtestDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Speedtest Tracker"
|
||||||
|
intro="Internet speed monitoring over time"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Monitoring</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">ghcr.io/alexjustesen/speedtest-tracker:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Speedtest Tracker?</h2>
|
||||||
|
<p>Internet speed monitoring over time</p>
|
||||||
|
<p>Speedtest Tracker ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Speedtest Tracker, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Speedtest Tracker</strong> from the <em>Monitoring</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>ghcr.io/alexjustesen/speedtest-tracker:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>speedtest.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "speedtest",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "speedtest",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PUID": "",
|
||||||
|
"PGID": "",
|
||||||
|
"DB_CONNECTION": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Speedtest Tracker on my home host and expose it at <code>speedtest.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Configure test schedule</li>
|
||||||
|
<li>View historical data</li>
|
||||||
|
<li>Set up notifications for slow speeds</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/speedtest/config:/config</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PUID</code></li>
|
||||||
|
<li><code>PGID</code></li>
|
||||||
|
<li><code>DB_CONNECTION</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>ghcr.io/alexjustesen/speedtest-tracker:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Speedtest Tracker → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Speedtest Tracker is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Speedtest Tracker:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Speedtest Tracker is in the <strong>Monitoring</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/uptime-kuma" className="text-brand-400 underline">Uptime Kuma</a></li>
|
||||||
|
<li><a href="/docs/catalog/dozzle" className="text-brand-400 underline">Dozzle</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>speedtest</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Standard Notes — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Standard Notes via DashCaddy. End-to-end encrypted notes app',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function standardnotesDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Standard Notes"
|
||||||
|
intro="End-to-end encrypted notes app"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Productivity</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#68a4ff22', color: '#68a4ff' }}>Difficulty: Intermediate</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">standardnotes/server:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Standard Notes?</h2>
|
||||||
|
<p>End-to-end encrypted notes app</p>
|
||||||
|
<p>Standard Notes ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Standard Notes, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Standard Notes</strong> from the <em>Productivity</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>standardnotes/server:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>notes.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "standardnotes",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "notes",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"RAILS_ENV": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Standard Notes on my home host and expose it at <code>notes.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Configure environment variables</li>
|
||||||
|
<li>Set up database connection</li>
|
||||||
|
<li>Install Standard Notes apps</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/standardnotes/data:/var/lib/server</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>RAILS_ENV</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>standardnotes/server:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Standard Notes → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Standard Notes is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Standard Notes:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Standard Notes is in the <strong>Productivity</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/nextcloud" className="text-brand-400 underline">Nextcloud</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>standardnotes</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Stirling PDF — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Stirling PDF via DashCaddy. Self-hosted PDF manipulation tool - merge, split, convert, and more',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function stirlingPdfDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Stirling PDF"
|
||||||
|
intro="Self-hosted PDF manipulation tool - merge, split, convert, and more"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Utilities</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">frooodle/s-pdf:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Stirling PDF?</h2>
|
||||||
|
<p>Self-hosted PDF manipulation tool - merge, split, convert, and more</p>
|
||||||
|
<p>Stirling PDF ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Stirling PDF, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Stirling PDF</strong> from the <em>Utilities</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>frooodle/s-pdf:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>pdf.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "stirling-pdf",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "pdf",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"DOCKER_ENABLE_SECURITY": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Stirling PDF on my home host and expose it at <code>pdf.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Access the web interface to start manipulating PDFs</li>
|
||||||
|
<li>Supports merge, split, rotate, convert, compress, and more</li>
|
||||||
|
<li>Optional OCR support via Tesseract</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/stirling-pdf/data:/usr/share/tessdata</code></li>
|
||||||
|
<li><code>/opt/stirling-pdf/config:/configs</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>DOCKER_ENABLE_SECURITY</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>frooodle/s-pdf:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Stirling PDF → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Stirling PDF is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Stirling PDF:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Stirling PDF is in the <strong>Utilities</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>stirling-pdf</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,135 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Syncthing — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Syncthing via DashCaddy. Continuous file synchronization between devices',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function syncthingDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Syncthing"
|
||||||
|
intro="Continuous file synchronization between devices"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Files</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">linuxserver/syncthing:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Syncthing?</h2>
|
||||||
|
<p>Continuous file synchronization between devices</p>
|
||||||
|
<p>Syncthing ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Syncthing, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Syncthing</strong> from the <em>Files</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>linuxserver/syncthing:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>sync.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "syncthing",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "sync",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PUID": "",
|
||||||
|
"PGID": "",
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Syncthing on my home host and expose it at <code>sync.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Add devices using their Device IDs</li>
|
||||||
|
<li>Configure shared folders</li>
|
||||||
|
<li>Set up folder synchronization</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/syncthing/config:/config</code></li>
|
||||||
|
<li><code>/opt/syncthing/data:/data</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PUID</code></li>
|
||||||
|
<li><code>PGID</code></li>
|
||||||
|
<li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>linuxserver/syncthing:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Syncthing → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Syncthing is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Syncthing:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Syncthing is in the <strong>Files</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>syncthing</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Tautulli — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Tautulli via DashCaddy. Plex media server monitoring and statistics',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function tautulliDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Tautulli"
|
||||||
|
intro="Plex media server monitoring and statistics"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Media Management</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">linuxserver/tautulli:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Tautulli?</h2>
|
||||||
|
<p>Plex media server monitoring and statistics</p>
|
||||||
|
<p>Tautulli ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Tautulli, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Tautulli</strong> from the <em>Media Management</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>linuxserver/tautulli:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>tautulli.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "tautulli",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "tautulli",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PUID": "",
|
||||||
|
"PGID": "",
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Tautulli on my home host and expose it at <code>tautulli.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Connect to Plex server</li>
|
||||||
|
<li>Configure notifications</li>
|
||||||
|
<li>Set up newsletters</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/tautulli/config:/config</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PUID</code></li>
|
||||||
|
<li><code>PGID</code></li>
|
||||||
|
<li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>linuxserver/tautulli:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Tautulli → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Tautulli is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Tautulli:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Tautulli is in the <strong>Media Management</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/sonarr" className="text-brand-400 underline">Sonarr</a></li>
|
||||||
|
<li><a href="/docs/catalog/radarr" className="text-brand-400 underline">Radarr</a></li>
|
||||||
|
<li><a href="/docs/catalog/bazarr" className="text-brand-400 underline">Bazarr</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>tautulli</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Technitium DNS Server — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Technitium DNS Server via DashCaddy. Modern DNS server with web UI for managing private zones',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function technitiumDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Technitium DNS Server"
|
||||||
|
intro="Modern DNS server with web UI for managing private zones"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: DNS</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">technitium/dns-server:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Technitium DNS Server?</h2>
|
||||||
|
<p>Modern DNS server with web UI for managing private zones</p>
|
||||||
|
<p>Technitium DNS Server ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Technitium DNS Server, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Technitium DNS Server</strong> from the <em>DNS</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>technitium/dns-server:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>dns1.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "technitium",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "dns1",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"DNS_SERVER_DOMAIN": "",
|
||||||
|
"DNS_SERVER_ADMIN_PASSWORD": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Technitium DNS Server on my home host and expose it at <code>dns1.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Access web interface at https://dns1.sami</li>
|
||||||
|
<li>Login with admin credentials</li>
|
||||||
|
<li>Create a primary zone for 'sami' domain</li>
|
||||||
|
<li>Add A records for your services (e.g., plex.sami -> 192.168.1.100)</li>
|
||||||
|
<li>Configure your devices to use this DNS server</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/technitium/config:/etc/dns</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>DNS_SERVER_DOMAIN</code></li>
|
||||||
|
<li><code>DNS_SERVER_ADMIN_PASSWORD</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>technitium/dns-server:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Technitium DNS Server → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Technitium DNS Server is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Technitium DNS Server:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Technitium DNS Server is in the <strong>DNS</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>technitium</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Transmission — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Transmission via DashCaddy. Lightweight BitTorrent client',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function transmissionDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Transmission"
|
||||||
|
intro="Lightweight BitTorrent client"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Downloads</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">linuxserver/transmission:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Transmission?</h2>
|
||||||
|
<p>Lightweight BitTorrent client</p>
|
||||||
|
<p>Transmission ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Transmission, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Transmission</strong> from the <em>Downloads</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>linuxserver/transmission:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>transmission.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/transmission/web/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "transmission",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "transmission",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PUID": "",
|
||||||
|
"PGID": "",
|
||||||
|
"TZ": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Transmission on my home host and expose it at <code>transmission.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Configure download paths</li>
|
||||||
|
<li>Set bandwidth limits</li>
|
||||||
|
<li>Configure blocklists if needed</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/transmission/config:/config</code></li>
|
||||||
|
<li><code>/downloads:/downloads</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PUID</code></li>
|
||||||
|
<li><code>PGID</code></li>
|
||||||
|
<li><code>TZ</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>linuxserver/transmission:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Transmission → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Transmission is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Transmission:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Transmission is in the <strong>Downloads</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/qbittorrent" className="text-brand-400 underline">qBittorrent</a></li>
|
||||||
|
<li><a href="/docs/catalog/sabnzbd" className="text-brand-400 underline">SABnzbd</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>transmission</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,128 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Trilium Notes — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Trilium Notes via DashCaddy. Hierarchical knowledge base and note-taking app',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function triliumDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Trilium Notes"
|
||||||
|
intro="Hierarchical knowledge base and note-taking app"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Productivity</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">zadam/trilium:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Trilium Notes?</h2>
|
||||||
|
<p>Hierarchical knowledge base and note-taking app</p>
|
||||||
|
<p>Trilium Notes ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Trilium Notes, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Trilium Notes</strong> from the <em>Productivity</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>zadam/trilium:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>notes.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "trilium",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "notes",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Trilium Notes on my home host and expose it at <code>notes.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Set your password on first access</li>
|
||||||
|
<li>Organize notes in a tree hierarchy</li>
|
||||||
|
<li>Supports rich text, code blocks, math equations, and diagrams</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/trilium/data:/home/node/trilium-data</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>zadam/trilium:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Trilium Notes → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Trilium Notes is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Trilium Notes:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Trilium Notes is in the <strong>Productivity</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/nextcloud" className="text-brand-400 underline">Nextcloud</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>trilium</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Uptime Kuma — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Uptime Kuma via DashCaddy. Self-hosted monitoring tool like Uptime Robot',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function uptimeKumaDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Uptime Kuma"
|
||||||
|
intro="Self-hosted monitoring tool like Uptime Robot"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Monitoring</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">louislam/uptime-kuma:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Uptime Kuma?</h2>
|
||||||
|
<p>Self-hosted monitoring tool like Uptime Robot</p>
|
||||||
|
<p>Uptime Kuma ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Uptime Kuma, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Uptime Kuma</strong> from the <em>Monitoring</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>louislam/uptime-kuma:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>uptime.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "uptime-kuma",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "uptime",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Uptime Kuma on my home host and expose it at <code>uptime.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Open the new <code>uptime.<your-domain></code> URL.</li>
|
||||||
|
<li>Complete the upstream Uptime Kuma setup wizard (create admin user, accept EULA, etc.).</li>
|
||||||
|
<li>Configure backups from <strong>Settings → Backups</strong> — the default daily snapshot will capture the data volume.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/uptime-kuma:/app/data</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>louislam/uptime-kuma:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Uptime Kuma → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Uptime Kuma is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Uptime Kuma:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Uptime Kuma is in the <strong>Monitoring</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/grafana" className="text-brand-400 underline">Grafana</a> (analytics)</li>
|
||||||
|
<li><a href="/docs/catalog/dozzle" className="text-brand-400 underline">Dozzle</a> (logs)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>uptime-kuma</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Valheim Server — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Valheim Server via DashCaddy. Valheim dedicated server for multiplayer Viking adventures',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function valheimDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Valheim Server"
|
||||||
|
intro="Valheim dedicated server for multiplayer Viking adventures"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Gaming</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">lloesche/valheim-server:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Valheim Server?</h2>
|
||||||
|
<p>Valheim dedicated server for multiplayer Viking adventures</p>
|
||||||
|
<p>Valheim Server ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Valheim Server, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Valheim Server</strong> from the <em>Gaming</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>lloesche/valheim-server:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>valheim.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>tcp://localhost:2456</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "valheim",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "valheim",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"SERVER_NAME": "",
|
||||||
|
"WORLD_NAME": "",
|
||||||
|
"SERVER_PASS": "",
|
||||||
|
"SERVER_PUBLIC": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Valheim Server on my home host and expose it at <code>valheim.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Connect via Steam: Add Server > IP:2456</li>
|
||||||
|
<li>Default server password is auto-generated (check environment variables)</li>
|
||||||
|
<li>World data is persisted in the data volume</li>
|
||||||
|
<li>Requires at least 4GB RAM for smooth operation</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/valheim/config:/config</code></li>
|
||||||
|
<li><code>/opt/valheim/data:/opt/valheim</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>SERVER_NAME</code></li>
|
||||||
|
<li><code>WORLD_NAME</code></li>
|
||||||
|
<li><code>SERVER_PASS</code></li>
|
||||||
|
<li><code>SERVER_PUBLIC</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>lloesche/valheim-server:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Valheim Server → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Valheim Server is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Valheim Server:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Valheim Server is in the <strong>Gaming</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>valheim</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Vaultwarden — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Vaultwarden via DashCaddy. Lightweight Bitwarden-compatible password manager',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function vaultwardenDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Vaultwarden"
|
||||||
|
intro="Lightweight Bitwarden-compatible password manager"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Security</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">vaultwarden/server:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Vaultwarden?</h2>
|
||||||
|
<p>Lightweight Bitwarden-compatible password manager</p>
|
||||||
|
<p>Vaultwarden ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Vaultwarden, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Vaultwarden</strong> from the <em>Security</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>vaultwarden/server:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>vault.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "vaultwarden",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "vault",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"DOMAIN": "",
|
||||||
|
"ADMIN_TOKEN": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Vaultwarden on my home host and expose it at <code>vault.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Change admin token immediately</li>
|
||||||
|
<li>Create your account</li>
|
||||||
|
<li>Install browser extensions and mobile apps</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/vaultwarden/data:/data</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>DOMAIN</code></li>
|
||||||
|
<li><code>ADMIN_TOKEN</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>vaultwarden/server:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Vaultwarden → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Vaultwarden is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Vaultwarden:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Vaultwarden is in the <strong>Security</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/authentik" className="text-brand-400 underline">Authentik</a> (SSO)</li>
|
||||||
|
<li><a href="/docs/catalog/dashca" className="text-brand-400 underline">DashCA</a> (private CA)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>vaultwarden</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Vintage Stereo — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Vintage Stereo via DashCaddy. Glass-front console stereo that tunes curated real internet stations (SomaFM, KEXP, Radio Paradise, and more) through a beautiful analog UI',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function vintageRadioDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Vintage Stereo"
|
||||||
|
intro="Glass-front console stereo that tunes curated real internet stations (SomaFM, KEXP, Radio Paradise, and more) through a beautiful analog UI"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Media</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">nginx:alpine</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Vintage Stereo?</h2>
|
||||||
|
<p>Glass-front console stereo that tunes curated real internet stations (SomaFM, KEXP, Radio Paradise, and more) through a beautiful analog UI</p>
|
||||||
|
<p>Vintage Stereo ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Vintage Stereo, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Vintage Stereo</strong> from the <em>Media</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>nginx:alpine</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>radio.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "vintage-radio",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "radio",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Vintage Stereo on my home host and expose it at <code>radio.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Run `bash /usr/local/bin/vintage-radio-install.sh` once before starting the container — copies the bundled web assets (index.html, radio.css, radio.js, stations.json) from the DashCaddy repo (dashcaddy-api/static-sites/vintage-radio/web) into /opt/vintage-radio/web</li>
|
||||||
|
<li>Open radio.sami (or your configured subdomain)</li>
|
||||||
|
<li>Press the PWR knob, drag the dial or click a station card</li>
|
||||||
|
<li>Cycle the MODE knob to filter by genre (ALL / AMBIENT / ROCK / MIXED)</li>
|
||||||
|
<li>To add stations, edit /opt/vintage-radio/web/stations.json on the host and restart the container</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/vintage-radio/web:/usr/share/nginx/html:ro</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>nginx:alpine</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Vintage Stereo → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Vintage Stereo is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Vintage Stereo:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Vintage Stereo is in the <strong>Media</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>vintage-radio</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install VS Code Server — DashCaddy Docs',
|
||||||
|
description: 'Install and configure VS Code Server via DashCaddy. Visual Studio Code in your browser',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function vscodeServerDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install VS Code Server"
|
||||||
|
intro="Visual Studio Code in your browser"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Development</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">codercom/code-server:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is VS Code Server?</h2>
|
||||||
|
<p>Visual Studio Code in your browser</p>
|
||||||
|
<p>VS Code Server ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using VS Code Server, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>VS Code Server</strong> from the <em>Development</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>codercom/code-server:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>code.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/healthz</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "vscode-server",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "code",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PASSWORD": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy VS Code Server on my home host and expose it at <code>code.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Open the new <code>code.<your-domain></code> URL.</li>
|
||||||
|
<li>Complete the upstream VS Code Server setup wizard (create admin user, accept EULA, etc.).</li>
|
||||||
|
<li>Configure backups from <strong>Settings → Backups</strong> — the default daily snapshot will capture the data volume.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/vscode/config:/home/coder/.config</code></li>
|
||||||
|
<li><code>/opt/vscode/projects:/home/coder/projects</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PASSWORD</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>codercom/code-server:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → VS Code Server → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for VS Code Server is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with VS Code Server:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>VS Code Server is in the <strong>Development</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/gitea" className="text-brand-400 underline">Gitea</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>vscode-server</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Watchtower — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Watchtower via DashCaddy. Automatic Docker container image updates',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function watchtowerDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Watchtower"
|
||||||
|
intro="Automatic Docker container image updates"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Management</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">containrrr/watchtower:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Watchtower?</h2>
|
||||||
|
<p>Automatic Docker container image updates</p>
|
||||||
|
<p>Watchtower ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Watchtower, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Watchtower</strong> from the <em>Management</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>containrrr/watchtower:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>watchtower.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/v1/update</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "watchtower",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "watchtower",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"WATCHTOWER_CLEANUP": "",
|
||||||
|
"WATCHTOWER_SCHEDULE": "",
|
||||||
|
"WATCHTOWER_HTTP_API_METRICS": "",
|
||||||
|
"WATCHTOWER_HTTP_API_TOKEN": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Watchtower on my home host and expose it at <code>watchtower.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Watchtower checks for image updates daily at 4 AM by default</li>
|
||||||
|
<li>Customize schedule via WATCHTOWER_SCHEDULE (cron format)</li>
|
||||||
|
<li>Add labels to exclude specific containers from updates</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/var/run/docker.sock:/var/run/docker.sock</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>WATCHTOWER_CLEANUP</code></li>
|
||||||
|
<li><code>WATCHTOWER_SCHEDULE</code></li>
|
||||||
|
<li><code>WATCHTOWER_HTTP_API_METRICS</code></li>
|
||||||
|
<li><code>WATCHTOWER_HTTP_API_TOKEN</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>containrrr/watchtower:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Watchtower → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Watchtower is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Watchtower:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Watchtower is in the <strong>Management</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>watchtower</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Weather — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Weather via DashCaddy. Live weather widget with temperature, conditions, and wind',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function weatherDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Weather"
|
||||||
|
intro="Live weather widget with temperature, conditions, and wind"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Utilities</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">N/A</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Weather?</h2>
|
||||||
|
<p>Live weather widget with temperature, conditions, and wind</p>
|
||||||
|
<p>Weather ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Weather, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Weather</strong> from the <em>Utilities</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>N/A</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>weather.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/healthz</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "weather",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "weather",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Weather on my home host and expose it at <code>weather.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Click the gear icon on the widget to set your ZIP code</li>
|
||||||
|
<li>Weather appears in the top bar next to the logo</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>N/A</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Weather → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Weather is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Weather:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Weather is in the <strong>Utilities</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>weather</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Whoami — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Whoami via DashCaddy. Simple HTTP request debugging service',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function whoamiDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Whoami"
|
||||||
|
intro="Simple HTTP request debugging service"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Utilities</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">traefik/whoami:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Whoami?</h2>
|
||||||
|
<p>Simple HTTP request debugging service</p>
|
||||||
|
<p>Whoami ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using Whoami, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>Whoami</strong> from the <em>Utilities</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>traefik/whoami:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>whoami.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "whoami",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "whoami",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy Whoami on my home host and expose it at <code>whoami.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Useful for testing reverse proxy setup</li>
|
||||||
|
<li>Shows request headers and info</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/whoami/config:/config</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>None. The container runs with its upstream defaults.</p>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>traefik/whoami:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → Whoami → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for Whoami is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with Whoami:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>Whoami is in the <strong>Utilities</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog" className="text-brand-400 underline">Browse the catalog</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>whoami</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,141 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install WireGuard VPN — DashCaddy Docs',
|
||||||
|
description: 'Install and configure WireGuard VPN via DashCaddy. Fast, modern, secure VPN tunnel',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function wireguardDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install WireGuard VPN"
|
||||||
|
intro="Fast, modern, secure VPN tunnel"
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Networking</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#f5a62322', color: '#f5a623' }}>Difficulty: Advanced</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">linuxserver/wireguard:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is WireGuard VPN?</h2>
|
||||||
|
<p>Fast, modern, secure VPN tunnel</p>
|
||||||
|
<p>WireGuard VPN ships as a self-contained Docker image that DashCaddy provisions with one click. The platform handles the container lifecycle, DNS, reverse proxy, HTTPS certificate, and persistent storage so you can focus on using WireGuard VPN, not installing it.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible.</li>
|
||||||
|
<li>No special host paths required.</li>
|
||||||
|
|
||||||
|
<li>If you want a stable subdomain: Technitium DNS recommended (otherwise DashCaddy will use direct IP access).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Open <strong>Apps → Catalog</strong> and select <strong>WireGuard VPN</strong> from the <em>Networking</em> category.</li>
|
||||||
|
<li>Choose your host (or pick <em>Local</em> if you have one host).</li>
|
||||||
|
<li>Fill in any required fields (notably the media library path and any claim token).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will:
|
||||||
|
<ol>
|
||||||
|
<li>Pull the <code>linuxserver/wireguard:latest</code> image.</li>
|
||||||
|
<li>Create persistent volumes for config and data.</li>
|
||||||
|
<li>Reserve a host port and wire it through Caddy.</li>
|
||||||
|
<li>Issue a Let's Encrypt certificate for <code>vpn.<your-domain></code>.</li>
|
||||||
|
<li>Wait for the container health check (<code>/</code>) to pass.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>After ~30–60 seconds the dashboard will turn the row <strong>Running</strong> and the URL will become clickable.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>If you script deployments or use the MCP / AI Intent Router, install with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://your-dashcaddy-host/api/v1/apps/deploy \\
|
||||||
|
-H "Authorization: Bearer $DASHCADDY_API_TOKEN" \\
|
||||||
|
-H "Content-Type: application/json" \\
|
||||||
|
-d '{
|
||||||
|
"template": "wireguard",
|
||||||
|
"host": "local",
|
||||||
|
"subdomain": "vpn",
|
||||||
|
"port": "{{PORT}}",
|
||||||
|
"environment": {
|
||||||
|
"PUID": "",
|
||||||
|
"PGID": "",
|
||||||
|
"TZ": "",
|
||||||
|
"SERVERURL": "",
|
||||||
|
"SERVERPORT": "",
|
||||||
|
"PEERS": ""
|
||||||
|
},
|
||||||
|
"labels": { "managed-by": "dashcaddy" }
|
||||||
|
}'</code></pre>
|
||||||
|
<p>Response returns a deployment ID. Poll <code>GET /api/v1/apps/{id}/status</code> until <code>state === "running"</code>.</p>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router</h2>
|
||||||
|
<p>From any chat surface wired to DashCaddy's MCP server, just say:</p>
|
||||||
|
<blockquote className="border-l-4 border-brand-500/50 bg-brand-500/5 p-4 rounded-r-lg">
|
||||||
|
<p className="text-surface-300">"Deploy WireGuard VPN on my home host and expose it at <code>vpn.sami</code>"</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>The Intent Router will pick the right template, prompt you for any missing fields, and start the deployment.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Configure your external IP/domain</li>
|
||||||
|
<li>Set up port forwarding on router</li>
|
||||||
|
<li>Download client configs from /config/peer1/</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/wireguard/config:/config</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are absolute host paths; the left side is the container-side mount. Restarting the container never deletes the data; reinstalling the template preserves it unless you explicitly check <em>Wipe data</em> on the deploy form.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<ul><li><code>PUID</code></li>
|
||||||
|
<li><code>PGID</code></li>
|
||||||
|
<li><code>TZ</code></li>
|
||||||
|
<li><code>SERVERURL</code></li>
|
||||||
|
<li><code>SERVERPORT</code></li>
|
||||||
|
<li><code>PEERS</code></li></ul>
|
||||||
|
<p>Override any of these from the deploy form's <em>Environment</em> panel, or programmatically in the API <code>environment</code> object.</p>
|
||||||
|
|
||||||
|
<h2>Updating</h2>
|
||||||
|
<p>DashCaddy's built-in Watchtower integration will pull <code>linuxserver/wireguard:latest</code> every 24 hours and restart your container with zero downtime if the image digest changes. To force an update immediately, click <strong>Apps → WireGuard VPN → Update</strong>.</p>
|
||||||
|
|
||||||
|
<h2>Backups</h2>
|
||||||
|
<p>The config volume for WireGuard VPN is included in DashCaddy's default nightly snapshot. To restore on a fresh host, redeploy the same template and DashCaddy will prompt to restore from the most recent snapshot during install.</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>Common issues with WireGuard VPN:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Container won't start:</strong> check the dashboard's <em>Logs</em> tab. Most startup failures are permission errors on the media/config volume.</li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><strong>Slow first scan:</strong> expected for large libraries on first run. Subsequent restarts are fast.</li>
|
||||||
|
</ul>
|
||||||
|
<p>For layer-by-layer diagnostics, see the <a href="/docs/troubleshooting" className="text-brand-400 underline">Troubleshooting guide</a>.</p>
|
||||||
|
|
||||||
|
<h2>Related services</h2>
|
||||||
|
<p>WireGuard VPN is in the <strong>Networking</strong> category. Common pairings:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/catalog/pihole" className="text-brand-400 underline">Pi-hole</a> (private DNS)</li>
|
||||||
|
<li><a href="/docs/catalog/technitium" className="text-brand-400 underline">Technitium DNS</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr className="my-8 border-surface-700" />
|
||||||
|
<p className="text-sm text-surface-400">
|
||||||
|
Last reviewed against DashCaddy product version in <code>dashcaddy-api/src/docker/app-templates.js</code>.
|
||||||
|
Template ID: <code>wireguard</code>. If anything here looks wrong, edit the file and the change will appear in the next docs rebuild.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -8,6 +8,7 @@ const docsLinks = [
|
|||||||
{ href: '/docs/premium', label: 'Premium Features' },
|
{ href: '/docs/premium', label: 'Premium Features' },
|
||||||
{ href: '/docs/api', label: 'API and Automation' },
|
{ href: '/docs/api', label: 'API and Automation' },
|
||||||
{ href: '/docs/troubleshooting', label: 'Troubleshooting' },
|
{ href: '/docs/troubleshooting', label: 'Troubleshooting' },
|
||||||
|
{ href: '/docs/catalog', label: 'App Catalog (77 apps)' },
|
||||||
];
|
];
|
||||||
|
|
||||||
export default function DocsLayout({
|
export default function DocsLayout({
|
||||||
|
|||||||
Reference in New Issue
Block a user