docs: impl dynamic installation guide component

This commit is contained in:
dyzulk
2026-01-08 16:00:16 +07:00
parent 6c83996967
commit 696a4c53d1
2 changed files with 216 additions and 71 deletions

View File

@@ -0,0 +1,212 @@
import useSWR from 'swr'
import axios from 'axios'
import { Tab } from '@headlessui/react' // Nextra uses headlessui usually, or we can build simple tabs
import { useState } from 'react'
// Interface matching the API response
interface CaCertificate {
name: string;
type: string;
serial: string;
family_id?: string | null;
expires_at: string;
cdn_url?: string | null;
linux_cdn_url?: string | null;
der_cdn_url?: string | null;
bat_cdn_url?: string | null;
mac_cdn_url?: string | null;
}
const fetcher = (url: string) => axios.get(url).then(res => res.data.data)
export function DynamicInstallationGuide() {
const { data: certificates, error, isLoading } = useSWR<CaCertificate[]>('https://api.trustlab.dyzulk.com/api/public/ca-certificates', fetcher)
const [selectedIndex, setSelectedIndex] = useState(0)
if (error) return <div className="p-4 border border-red-200 bg-red-50 text-red-600 rounded-lg">Failed to load live certificates. CLI: <code>curl -sL https://cdn.trustlab.dyzulk.com/ca/bundles/trustlab-all.sh | sudo bash</code></div>
if (isLoading || !certificates) return <div className="p-4 text-gray-500 animate-pulse bg-gray-50 rounded-lg">Loading dynamic installer links...</div>
const root = certificates.find(c => c.type === 'root')
const intermediates = certificates.filter(c => c.type !== 'root')
// Helper to format the table rows
const renderTable = (os: 'windows' | 'mac' | 'linux' | 'android') => {
return (
<div className="overflow-x-auto my-4 border rounded-lg">
<table className="w-full text-sm text-left">
<thead className="text-xs uppercase bg-gray-50 dark:bg-neutral-900 text-gray-700 dark:text-gray-300">
<tr>
<th className="px-6 py-3">Certificate</th>
<th className="px-6 py-3">Raw File</th>
<th className="px-6 py-3">
{os === 'windows' ? 'Auto-Installer Script' :
os === 'mac' ? 'Configuration Profile' :
os === 'linux' ? 'One-Liner Installer' : 'Alternative Format'}
</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200 dark:divide-gray-800">
{/* ROOT CA */}
{root && (
<tr className="bg-white dark:bg-neutral-950">
<td className="px-6 py-4 font-medium text-gray-900 dark:text-gray-100 flex flex-col">
<span>Root CA</span>
<span className="text-xs text-gray-500 font-mono">{root.name}</span>
</td>
<td className="px-6 py-4">
<a href={root.cdn_url || '#'} className="text-blue-600 hover:underline font-semibold" target="_blank" rel="noopener noreferrer">
Download .crt
</a>
</td>
<td className="px-6 py-4">
{os === 'windows' && root.bat_cdn_url && (
<a href={root.bat_cdn_url} className="text-blue-600 hover:underline">Download .bat</a>
)}
{os === 'mac' && root.mac_cdn_url && (
<a href={root.mac_cdn_url} className="text-blue-600 hover:underline">Download .mobileconfig</a>
)}
{os === 'android' && root.der_cdn_url && (
<a href={root.der_cdn_url} className="text-blue-600 hover:underline">Download .der</a>
)}
{os === 'linux' && root.linux_cdn_url && (
<code className="bg-gray-100 dark:bg-gray-800 px-2 py-1 rounded text-xs select-all">
curl -sL {root.linux_cdn_url} | sudo bash
</code>
)}
</td>
</tr>
)}
{/* INTERMEDIATES */}
{intermediates.map(cert => (
<tr key={cert.serial} className="bg-white dark:bg-neutral-950">
<td className="px-6 py-4 font-medium text-gray-900 dark:text-gray-100 flex flex-col">
<span>Intermediate</span>
<span className="text-xs text-gray-500 font-mono">{cert.name}</span>
</td>
<td className="px-6 py-4">
<a href={cert.cdn_url || '#'} className="text-blue-600 hover:underline" target="_blank" rel="noopener noreferrer">
Download .crt
</a>
</td>
<td className="px-6 py-4">
{os === 'windows' && cert.bat_cdn_url && (
<a href={cert.bat_cdn_url} className="text-blue-600 hover:underline">Download .bat</a>
)}
{os === 'mac' && cert.mac_cdn_url && (
<a href={cert.mac_cdn_url} className="text-blue-600 hover:underline">Download .mobileconfig</a>
)}
{os === 'linux' && cert.linux_cdn_url && (
<code className="bg-gray-100 dark:bg-gray-800 px-2 py-1 rounded text-xs select-all">
curl -sL {cert.linux_cdn_url} | sudo bash
</code>
)}
{os === 'android' && cert.der_cdn_url && (
<a href={cert.der_cdn_url} className="text-blue-600 hover:underline">Download .der</a>
)}
</td>
</tr>
))}
</tbody>
</table>
</div>
)
}
const tabs = [
{ id: 'windows', label: 'Windows' },
{ id: 'mac', label: 'macOS' },
{ id: 'android', label: 'Android' },
{ id: 'linux', label: 'Linux (CLI)' },
]
return (
<div className="mt-6">
<div className="flex space-x-2 border-b border-gray-200 dark:border-gray-800 mb-4 overflow-x-auto">
{tabs.map((tab, idx) => (
<button
key={tab.id}
onClick={() => setSelectedIndex(idx)}
className={`px-4 py-2 text-sm font-medium transition-colors border-b-2 whitespace-nowrap ${
selectedIndex === idx
? 'border-blue-500 text-blue-600 dark:text-blue-400'
: 'border-transparent text-gray-500 hover:text-gray-700 dark:hover:text-gray-300 hover:border-gray-300'
}`}
>
{tab.label}
</button>
))}
</div>
<div className="min-h-[300px]">
{/* Windows Tab */}
{selectedIndex === 0 && (
<div className="animate-in fade-in slide-in-from-bottom-2 duration-300">
{renderTable('windows')}
<div className="space-y-4 text-gray-800 dark:text-gray-200 text-sm mt-4 p-4 bg-gray-50 dark:bg-white/5 rounded-lg border dark:border-white/10">
<h4 className="font-bold">Installation Steps (Raw File)</h4>
<ol className="list-decimal pl-5 space-y-1">
<li>Double-click the downloaded <code>.crt</code> file.</li>
<li>Click <strong>Install Certificate</strong>.</li>
<li>Select <strong>Local Machine</strong> (requires Admin).</li>
<li>Choose "Place all certificates in the following store".</li>
<li>Select <strong>Trusted Root Certification Authorities</strong> (for Root) or <strong>Intermediate Certification Authorities</strong> (for Intermediates).</li>
<li>FInish.</li>
</ol>
<p className="text-xs text-gray-500 italic mt-2">*Note: Using the Auto-Installer Script (.bat) handles all of this automatically.*</p>
</div>
</div>
)}
{/* macOS Tab */}
{selectedIndex === 1 && (
<div className="animate-in fade-in slide-in-from-bottom-2 duration-300">
{renderTable('mac')}
<div className="space-y-4 text-gray-800 dark:text-gray-200 text-sm mt-4 p-4 bg-gray-50 dark:bg-white/5 rounded-lg border dark:border-white/10">
<h4 className="font-bold">Installation Steps</h4>
<ul className="list-disc pl-5 space-y-1">
<li><strong>Option 1 (Profile):</strong> Download <code>.mobileconfig</code>, go to <em>System Settings &gt; Privacy & Security &gt; Profiles</em> to install.</li>
<li><strong>Option 2 (Raw):</strong> Download <code>.crt</code>, open in <strong>Keychain Access</strong>, then set Trust settings to <strong>Always Trust</strong>.</li>
</ul>
</div>
</div>
)}
{/* Android Tab */}
{selectedIndex === 2 && (
<div className="animate-in fade-in slide-in-from-bottom-2 duration-300">
{renderTable('android')}
<div className="space-y-4 text-gray-800 dark:text-gray-200 text-sm mt-4 p-4 bg-gray-50 dark:bg-white/5 rounded-lg border dark:border-white/10">
<h4 className="font-bold">Installation Steps</h4>
<ol className="list-decimal pl-5 space-y-1">
<li>Download the <code>.crt</code> (or <code>.der</code> if required by your device).</li>
<li>Go to <strong>Settings &gt; Security &gt; Encryption & Credentials</strong>.</li>
<li>Tap <strong>Install a certificate &gt; CA Certificate</strong>.</li>
<li>Select "Install anyway" and choose the file.</li>
</ol>
</div>
</div>
)}
{/* Linux Tab */}
{selectedIndex === 3 && (
<div className="animate-in fade-in slide-in-from-bottom-2 duration-300">
{renderTable('linux')}
<div className="space-y-4 text-gray-800 dark:text-gray-200 text-sm mt-4 p-4 bg-gray-50 dark:bg-white/5 rounded-lg border dark:border-white/10">
<h4 className="font-bold">Manual Installation (If not using One-Liner)</h4>
<pre className="bg-gray-900 text-gray-100 p-3 rounded-md overflow-x-auto text-xs">
<code>
{`# Copy certificates
sudo cp *.crt /usr/local/share/ca-certificates/
# Update Store
sudo update-ca-certificates`}
</code>
</pre>
</div>
</div>
)}
</div>
</div>
)
}

View File

@@ -42,77 +42,10 @@ Select your distribution to get the optimized installation command:
---
import { DynamicInstallationGuide } from '../../../components/DynamicInstallationGuide'
## Individual Certificate Installation
If you need to install specific certificates individually (e.g. only Root, or specific Intermediate), use the options below.
If you need to install specific certificates individually (e.g. only Root, or specific Intermediate), use the live guide below.
<Tabs items={['Windows', 'macOS', 'Android', 'Linux']}>
<Tabs.Tab>
<Steps>
### Download Certificate
Choose the format that works best for you:
| Certificate | Raw File | Auto-Installer Script |
| :--- | :--- | :--- |
| **Root CA** | **[dydev-its-true.crt](https://cdn.trustlab.dyzulk.com/ca/dydev-its-true.crt)** | **[Installer (.bat)](https://cdn.trustlab.dyzulk.com/ca/installers/trustlab-dydev-its-true.bat)** |
| **Intermediate (4096)** | [trustlab-intermediate-ca-4096.crt](https://cdn.trustlab.dyzulk.com/ca/trustlab-intermediate-ca-4096.crt) | [Installer (.bat)](https://cdn.trustlab.dyzulk.com/ca/installers/trustlab-trustlab-intermediate-ca-4096.bat) |
| **Intermediate (2048)** | [trustlab-intermediate-ca-2048.crt](https://cdn.trustlab.dyzulk.com/ca/trustlab-intermediate-ca-2048.crt) | [Installer (.bat)](https://cdn.trustlab.dyzulk.com/ca/installers/trustlab-trustlab-intermediate-ca-2048.bat) |
*For Scripts: Right-click the `.bat` file and select "Run as Administrator".*
### Manual Install (Raw File)
1. Double-click the `.crt` file -> **Install Certificate**.
2. Select **Local Machine**.
3. For Root: Place in **Trusted Root Certification Authorities**.
4. For Intermediate: Place in **Intermediate Certification Authorities**.
</Steps>
</Tabs.Tab>
<Tabs.Tab>
<Steps>
### Download
| Certificate | Raw File | Profile |
| :--- | :--- | :--- |
| **Root CA** | **[dydev-its-true.crt](https://cdn.trustlab.dyzulk.com/ca/dydev-its-true.crt)** | **[Profile (.mobileconfig)](https://cdn.trustlab.dyzulk.com/ca/installers/trustlab-dydev-its-true.mobileconfig)** |
| **Intermediate (4096)** | [4096.crt](https://cdn.trustlab.dyzulk.com/ca/trustlab-intermediate-ca-4096.crt) | [Profile (.mobileconfig)](https://cdn.trustlab.dyzulk.com/ca/installers/trustlab-trustlab-intermediate-ca-4096.mobileconfig) |
| **Intermediate (2048)** | [2048.crt](https://cdn.trustlab.dyzulk.com/ca/trustlab-intermediate-ca-2048.crt) | [Profile (.mobileconfig)](https://cdn.trustlab.dyzulk.com/ca/installers/trustlab-trustlab-intermediate-ca-2048.mobileconfig) |
### Install
* **Profile**: Double-click `.mobileconfig` -> Go to System Settings -> Privacy & Security -> Profiles -> Install.
* **Raw**: Double-click `.crt` -> Keychain Access -> System -> **Always Trust**.
</Steps>
</Tabs.Tab>
<Tabs.Tab>
<Steps>
### Download
| Certificate | Raw File | DER Format |
| :--- | :--- | :--- |
| **Root CA** | **[dydev-its-true.crt](https://cdn.trustlab.dyzulk.com/ca/dydev-its-true.crt)** | **[dydev-its-true.der](https://cdn.trustlab.dyzulk.com/ca/dydev-its-true.der)** |
| **Intermediate (4096)** | [4096.crt](https://cdn.trustlab.dyzulk.com/ca/trustlab-intermediate-ca-4096.crt) | [4096.der](https://cdn.trustlab.dyzulk.com/ca/trustlab-intermediate-ca-4096.der) |
| **Intermediate (2048)** | [2048.crt](https://cdn.trustlab.dyzulk.com/ca/trustlab-intermediate-ca-2048.crt) | [2048.der](https://cdn.trustlab.dyzulk.com/ca/trustlab-intermediate-ca-2048.der) |
### Install
Settings -> Security -> Encryption & Credentials -> Install a certificate -> CA Certificate.
</Steps>
</Tabs.Tab>
<Tabs.Tab>
<Steps>
### Download & Install (CLI)
You can download the raw file or run the installer script directly:
| Certificate | Raw File | One-Liner Installer |
| :--- | :--- | :--- |
| **Root CA** | [dydev-its-true.crt](https://cdn.trustlab.dyzulk.com/ca/dydev-its-true.crt) | `curl -sL https://cdn.trustlab.dyzulk.com/ca/installers/trustlab-dydev-its-true.sh | sudo bash` |
| **Intermediate (4096)** | [4096.crt](https://cdn.trustlab.dyzulk.com/ca/trustlab-intermediate-ca-4096.crt) | `curl -sL https://cdn.trustlab.dyzulk.com/ca/installers/trustlab-trustlab-intermediate-ca-4096.sh | sudo bash` |
| **Intermediate (2048)** | [2048.crt](https://cdn.trustlab.dyzulk.com/ca/trustlab-intermediate-ca-2048.crt) | `curl -sL https://cdn.trustlab.dyzulk.com/ca/installers/trustlab-trustlab-intermediate-ca-2048.sh | sudo bash` |
### Manual Place
If using raw file:
```bash
sudo cp *.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
```
</Steps>
</Tabs.Tab>
</Tabs>
<DynamicInstallationGuide />