mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2025-06-27 20:06:52 +00:00
Update RSS page
This commit is contained in:
parent
a7d84d27fd
commit
dcae6e1cd0
@ -10,58 +10,79 @@ export default function InstallCoralTPUHost() {
|
||||
return (
|
||||
<div className="max-w-3xl mx-auto">
|
||||
<h1 className="text-3xl font-bold mb-6">Install Coral TPU on the Host</h1>
|
||||
|
||||
<p className="mb-4"><strong>Before using Coral TPU inside an LXC container, the drivers must first be installed on the Proxmox VE host. This script automates that process, ensuring the necessary setup is completed.</strong><br/><br/>
|
||||
This guide explains how to install and configure Google Coral TPU drivers on a Proxmox VE host using <strong>ProxMenux</strong>.
|
||||
This setup enables hardware acceleration for AI-based applications that leverage Coral TPU.
|
||||
|
||||
<p className="mb-4">
|
||||
<strong>Before using Coral TPU inside an LXC container, the drivers must first be installed on the Proxmox VE host. This script automates that process, ensuring the necessary setup is completed.</strong>
|
||||
<br /><br />
|
||||
This guide explains how to install and configure Google Coral TPU drivers on a Proxmox VE host using <strong>ProxMenux</strong>. This setup enables hardware acceleration for AI-based applications that leverage Coral TPU.
|
||||
</p>
|
||||
|
||||
|
||||
<h2 className="text-2xl font-semibold mt-8 mb-4">Overview</h2>
|
||||
<p className="mb-4">The script automates the following steps:</p>
|
||||
<ol className="list-decimal pl-6 space-y-2 mb-6">
|
||||
<li>Prompts for confirmation before proceeding with installation.</li>
|
||||
<li>Verifies and configures necessary repositories on the host.</li>
|
||||
<li>Installs required dependencies for driver compilation.</li>
|
||||
<li>Installs required build dependencies and kernel headers for driver compilation.</li>
|
||||
<li>Clones the Coral TPU driver repository and builds the drivers.</li>
|
||||
<li>Installs the compiled Coral TPU drivers.</li>
|
||||
<li>Prompts for a system restart to apply changes.</li>
|
||||
</ol>
|
||||
|
||||
|
||||
<h2 className="text-2xl font-semibold mt-8 mb-4">Implementation Steps</h2>
|
||||
<Steps>
|
||||
<Steps.Step title="Pre-Installation Confirmation">
|
||||
<p>The script prompts the user for confirmation before proceeding, as a system restart is required after installation.</p>
|
||||
</Steps.Step>
|
||||
|
||||
<Steps.Step title="Repository Configuration">
|
||||
<p>The script verifies and configures required repositories:</p>
|
||||
<ul className="list-disc pl-6 space-y-1 mt-2">
|
||||
<li>Adds the <strong>pve-no-subscription</strong> repository if not present.</li>
|
||||
<li>Adds <strong>non-free-firmware</strong> repositories for required packages.</li>
|
||||
<li>Runs an update to fetch the latest package lists.</li>
|
||||
<li>Runs <code>apt-get update</code> to fetch the latest package lists.</li>
|
||||
</ul>
|
||||
</Steps.Step>
|
||||
|
||||
<Steps.Step title="Driver Installation">
|
||||
<p>The script installs and compiles the required drivers:</p>
|
||||
<p>The script installs and compiles the required Coral TPU drivers:</p>
|
||||
<ul className="list-disc pl-6 space-y-1 mt-2">
|
||||
<li>Installs dependencies such as <strong>git, dkms, devscripts</strong>, and kernel headers.</li>
|
||||
<li>Clones the <strong>gasket-driver</strong> repository from Google.</li>
|
||||
<li>Builds the Coral TPU driver packages.</li>
|
||||
<li>Installs the compiled drivers on the host.</li>
|
||||
<li>Installs the following packages:</li>
|
||||
<ul className="list-disc pl-10">
|
||||
<li><code>git</code></li>
|
||||
<li><code>devscripts</code></li>
|
||||
<li><code>dh-dkms</code></li>
|
||||
<li><code>dkms</code></li>
|
||||
<li><code>pve-headers-$(uname -r)</code> (Proxmox kernel headers)</li>
|
||||
</ul>
|
||||
<li>Clones the Coral TPU driver source from:</li>
|
||||
<ul className="list-disc pl-10">
|
||||
<li><code>https://github.com/google/gasket-driver</code></li>
|
||||
</ul>
|
||||
<li>Builds the driver using <code>debuild</code> and installs it using <code>dpkg -i</code>.</li>
|
||||
</ul>
|
||||
|
||||
<CopyableCode
|
||||
code={`# Commands used to build and install Coral TPU driver on host
|
||||
apt install -y git devscripts dh-dkms dkms pve-headers-$(uname -r)
|
||||
git clone https://github.com/google/gasket-driver.git
|
||||
cd gasket-driver
|
||||
debuild -us -uc -tc -b
|
||||
dpkg -i ../gasket-dkms_*.deb`}
|
||||
className="my-4"
|
||||
/>
|
||||
</Steps.Step>
|
||||
|
||||
<Steps.Step title="Post-Installation Confirmation">
|
||||
<p>The script prompts the user to restart the server to apply the changes.</p>
|
||||
</Steps.Step>
|
||||
</Steps>
|
||||
|
||||
|
||||
<h2 className="text-2xl font-semibold mt-8 mb-4">Expected Results</h2>
|
||||
<ul className="list-disc pl-6 space-y-2 mb-6">
|
||||
<li>The Coral TPU drivers are installed successfully on the Proxmox VE host.</li>
|
||||
<li>Required repositories and dependencies are configured properly.</li>
|
||||
<li>A system restart is performed to complete the installation.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
@ -10,6 +10,31 @@ interface ChangelogEntry {
|
||||
title: string
|
||||
}
|
||||
|
||||
// Function to clean and format markdown content for RSS
|
||||
function formatContentForRSS(content: string): string {
|
||||
return (
|
||||
content
|
||||
// Convert ### headers to bold text
|
||||
.replace(/^### (.+)$/gm, "**$1**")
|
||||
// Convert ** bold ** to simple bold
|
||||
.replace(/\*\*(.*?)\*\*/g, "$1")
|
||||
// Clean code blocks - remove ``` and format nicely
|
||||
.replace(/```[\s\S]*?```/g, (match) => {
|
||||
const code = match.replace(/```/g, "").trim()
|
||||
return `\n${code}\n`
|
||||
})
|
||||
// Convert - bullet points to •
|
||||
.replace(/^- /gm, "• ")
|
||||
// Clean up multiple newlines
|
||||
.replace(/\n{3,}/g, "\n\n")
|
||||
// Remove backslashes used for line breaks
|
||||
.replace(/\\\s*$/gm, "")
|
||||
// Clean up extra spaces
|
||||
.replace(/\s+/g, " ")
|
||||
.trim()
|
||||
)
|
||||
}
|
||||
|
||||
async function parseChangelog(): Promise<ChangelogEntry[]> {
|
||||
try {
|
||||
const changelogPath = path.join(process.cwd(), "..", "CHANGELOG.md")
|
||||
@ -21,45 +46,67 @@ async function parseChangelog(): Promise<ChangelogEntry[]> {
|
||||
const fileContents = fs.readFileSync(changelogPath, "utf8")
|
||||
const entries: ChangelogEntry[] = []
|
||||
|
||||
// Split by any heading (## or ###) to catch all changes, not just versions
|
||||
const sections = fileContents.split(/^(##\s+.*$)/gm).filter((section) => section.trim())
|
||||
// Split by ## headers (both versions and dates)
|
||||
const lines = fileContents.split("\n")
|
||||
let currentEntry: Partial<ChangelogEntry> | null = null
|
||||
let contentLines: string[] = []
|
||||
|
||||
for (let i = 0; i < sections.length - 1; i += 2) {
|
||||
const headerLine = sections[i]
|
||||
const content = sections[i + 1] || ""
|
||||
for (const line of lines) {
|
||||
// Check for version header: ## [1.1.1] - 2025-03-21
|
||||
const versionMatch = line.match(/^##\s+\[([^\]]+)\]\s*-\s*(\d{4}-\d{2}-\d{2})/)
|
||||
|
||||
// Check if it's a version header (## [version] - date)
|
||||
const versionMatch = headerLine.match(/##\s+\[([^\]]+)\]\s*-\s*(\d{4}-\d{2}-\d{2})/)
|
||||
// Check for date-only header: ## 2025-05-13
|
||||
const dateMatch = line.match(/^##\s+(\d{4}-\d{2}-\d{2})$/)
|
||||
|
||||
if (versionMatch) {
|
||||
const version = versionMatch[1]
|
||||
const date = versionMatch[2]
|
||||
if (versionMatch || dateMatch) {
|
||||
// Save previous entry if exists
|
||||
if (currentEntry && contentLines.length > 0) {
|
||||
const rawContent = contentLines.join("\n").trim()
|
||||
currentEntry.content = formatContentForRSS(rawContent)
|
||||
if (currentEntry.version && currentEntry.date && currentEntry.title) {
|
||||
entries.push(currentEntry as ChangelogEntry)
|
||||
}
|
||||
}
|
||||
|
||||
entries.push({
|
||||
version,
|
||||
date,
|
||||
content: content.trim(),
|
||||
url: `https://macrimi.github.io/ProxMenux/changelog#${version}`,
|
||||
title: `ProxMenux ${version}`,
|
||||
})
|
||||
} else {
|
||||
// Check for date-only headers (## 2025-05-13)
|
||||
const dateMatch = headerLine.match(/##\s+(\d{4}-\d{2}-\d{2})/)
|
||||
if (dateMatch) {
|
||||
// Start new entry
|
||||
if (versionMatch) {
|
||||
const version = versionMatch[1]
|
||||
const date = versionMatch[2]
|
||||
currentEntry = {
|
||||
version,
|
||||
date,
|
||||
url: `https://macrimi.github.io/ProxMenux/changelog#${version}`,
|
||||
title: `ProxMenux ${version}`,
|
||||
}
|
||||
} else if (dateMatch) {
|
||||
const date = dateMatch[1]
|
||||
|
||||
entries.push({
|
||||
currentEntry = {
|
||||
version: date,
|
||||
date,
|
||||
content: content.trim(),
|
||||
url: `https://macrimi.github.io/ProxMenux/changelog#${date}`,
|
||||
title: `ProxMenux Update ${date}`,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
contentLines = []
|
||||
} else if (currentEntry && line.trim()) {
|
||||
// Add content lines (skip empty lines at the beginning)
|
||||
if (contentLines.length > 0 || line.trim() !== "") {
|
||||
contentLines.push(line)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return entries.slice(0, 15) // Latest 15 entries
|
||||
// Don't forget the last entry
|
||||
if (currentEntry && contentLines.length > 0) {
|
||||
const rawContent = contentLines.join("\n").trim()
|
||||
currentEntry.content = formatContentForRSS(rawContent)
|
||||
if (currentEntry.version && currentEntry.date && currentEntry.title) {
|
||||
entries.push(currentEntry as ChangelogEntry)
|
||||
}
|
||||
}
|
||||
|
||||
return entries.slice(0, 20) // Latest 20 entries
|
||||
} catch (error) {
|
||||
console.error("Error parsing changelog:", error)
|
||||
return []
|
||||
@ -87,7 +134,7 @@ export async function GET() {
|
||||
(entry) => `
|
||||
<item>
|
||||
<title>${entry.title}</title>
|
||||
<description><![CDATA[${entry.content.substring(0, 500)}${entry.content.length > 500 ? "..." : ""}]]></description>
|
||||
<description><![CDATA[${entry.content.length > 1000 ? entry.content.substring(0, 1000) + "..." : entry.content}]]></description>
|
||||
<link>${entry.url}</link>
|
||||
<guid isPermaLink="true">${entry.url}</guid>
|
||||
<pubDate>${new Date(entry.date).toUTCString()}</pubDate>
|
||||
|
Loading…
x
Reference in New Issue
Block a user