documentation.tsx 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import { Link, useParams } from "react-router";
  2. import { useEffect, useState } from "react";
  3. import classNames from "classnames";
  4. import Title from "~/components/shared/title/title";
  5. import ContentBlock from "~/components/shared/content-block/content-block";
  6. import PageLayoutNav from "~/components/shared/layout/page-layout-nav";
  7. import NavLink from "~/components/shared/nav/nav-link";
  8. export function meta() {
  9. return [
  10. { title: "Documentation" },
  11. { name: "description", content: "Apt Mirror Documentation" },
  12. ];
  13. }
  14. const sections = [
  15. { id: "file-structure", linkName: "File Structure", title: "File Structure" },
  16. { id: "commands", linkName: "Commands", title: "Commands" }
  17. ];
  18. export default function Documentation() {
  19. const [activeSection, setActiveSection] = useState<string>("file-structure");
  20. const { section } = useParams();
  21. useEffect(() => {
  22. if (section) {
  23. setActiveSection(section);
  24. }
  25. }, [section]);
  26. const renderFileStructure = () => (
  27. <div className="space-y-6">
  28. <div>
  29. <h3 className="text-lg font-semibold mb-4">Data Directory Structure</h3>
  30. <div className="bg-gray-50 p-4 rounded-lg font-mono text-sm">
  31. <pre className="whitespace-pre-wrap">
  32. {`data/
  33. ├── conf/
  34. │ ├── apt-mirror/
  35. │ │ └── mirror.list # apt-mirror2 configuration
  36. │ └── nginx/
  37. │ ├── .htpasswd # Admin authentication file
  38. │ └── sites-available/ # Nginx site configurations
  39. │ ├── mirror.intra.conf
  40. │ ├── admin.mirror.intra.conf
  41. │ └── files.mirror.intra.conf
  42. ├── data/
  43. │ ├── apt-mirror/ # apt-mirror2 working directory
  44. │ │ ├── mirror/ # Downloaded package mirrors
  45. │ │ ├── skel/ # Skeleton files
  46. │ │ └── var/ # Variable data
  47. │ └── files/ # Custom file repository
  48. └── logs/
  49. ├── apt-mirror/ # apt-mirror2 logs
  50. │ └── apt-mirror.log # Main apt-mirror2 log file
  51. └── nginx/ # Nginx access and error logs`}
  52. </pre>
  53. </div>
  54. </div>
  55. <div>
  56. <h3 className="text-lg font-semibold mb-4">Description</h3>
  57. <div className="space-y-4">
  58. <div>
  59. <h4 className="font-semibold text-blue-600">conf/</h4>
  60. <p className="text-gray-700">Configuration files for apt-mirror and nginx. Contains mirror settings, authentication, and web server configurations.</p>
  61. </div>
  62. <div>
  63. <h4 className="font-semibold text-blue-600">data/</h4>
  64. <p className="text-gray-700">Main data storage directory. apt-mirror/ contains downloaded package repositories, files/ contains custom file repository.</p>
  65. </div>
  66. <div>
  67. <h4 className="font-semibold text-blue-600">logs/</h4>
  68. <p className="text-gray-700">Log files from apt-mirror synchronization and nginx web server operations.</p>
  69. </div>
  70. </div>
  71. </div>
  72. </div>
  73. );
  74. const renderCommands = () => (
  75. <div className="space-y-8">
  76. <div>
  77. <h3 className="text-lg font-semibold mb-4">Build Process</h3>
  78. <div className="bg-gray-50 p-4 rounded-lg">
  79. <h4 className="font-semibold text-blue-600 mb-2">./build.sh</h4>
  80. <p className="text-gray-700 mb-3">Builds Docker images for multiple architectures (amd64, arm64).</p>
  81. <div className="bg-white p-3 rounded border-l-4 border-blue-500">
  82. <h5 className="font-semibold mb-2">Operations:</h5>
  83. <ul className="list-disc list-inside space-y-1 text-sm">
  84. <li>Checks Docker and buildx prerequisites</li>
  85. <li>Sets up multi-platform builder</li>
  86. <li>Builds images for both amd64 and arm64 architectures</li>
  87. <li>Saves compressed tar files to dist/ directory</li>
  88. <li>Installs required packages: apt-mirror, nginx, openssl, curl, wget, xz-utils, nodejs, npm</li>
  89. </ul>
  90. </div>
  91. </div>
  92. </div>
  93. <div>
  94. <h3 className="text-lg font-semibold mb-4">Initial Setup</h3>
  95. <div className="bg-gray-50 p-4 rounded-lg">
  96. <h4 className="font-semibold text-blue-600 mb-2">./setup.sh</h4>
  97. <p className="text-gray-700 mb-3">Performs initial deployment and configuration of the apt-mirror container.</p>
  98. <div className="bg-white p-3 rounded border-l-4 border-green-500">
  99. <h5 className="font-semibold mb-2">Operations:</h5>
  100. <ul className="list-disc list-inside space-y-1 text-sm">
  101. <li>Detects system architecture (amd64/arm64)</li>
  102. <li>Validates required image files exist in dist/</li>
  103. <li>Prompts for custom configuration (domain, sync frequency, admin password)</li>
  104. <li>Generates nginx htpasswd file for authentication</li>
  105. <li>Cleans up previous installations</li>
  106. <li>Creates data directories structure</li>
  107. <li>Generates apt-mirror configuration</li>
  108. <li>Creates docker-compose.yml from template</li>
  109. <li>Calls start.sh to load image and start container</li>
  110. </ul>
  111. </div>
  112. </div>
  113. </div>
  114. <div>
  115. <h3 className="text-lg font-semibold mb-4">Starting and Restarting</h3>
  116. <div className="bg-gray-50 p-4 rounded-lg">
  117. <h4 className="font-semibold text-blue-600 mb-2">./start.sh</h4>
  118. <p className="text-gray-700 mb-3">Loads Docker image and starts the container. Used by setup.sh and for manual restarts.</p>
  119. <div className="bg-white p-3 rounded border-l-4 border-blue-500">
  120. <h5 className="font-semibold mb-2">Operations:</h5>
  121. <ul className="list-disc list-inside space-y-1 text-sm">
  122. <li>Detects system architecture (amd64/arm64)</li>
  123. <li>Validates required image files exist in dist/</li>
  124. <li>Loads appropriate Docker image</li>
  125. <li>Starts the container using docker-compose</li>
  126. </ul>
  127. </div>
  128. <h4 className="font-semibold text-blue-600 mb-2 mt-4">After Initial Setup</h4>
  129. <p className="text-gray-700 mb-3">Commands for managing the running container.</p>
  130. <div className="bg-white p-3 rounded border-l-4 border-orange-500">
  131. <h5 className="font-semibold mb-2">Operations:</h5>
  132. <ul className="list-disc list-inside space-y-1 text-sm">
  133. <li><code className="bg-gray-100 px-1 rounded">./start.sh</code> - Load image and start container</li>
  134. <li><code className="bg-gray-100 px-1 rounded">docker compose up -d</code> - Start container</li>
  135. <li><code className="bg-gray-100 px-1 rounded">docker compose down</code> - Stop container</li>
  136. <li><code className="bg-gray-100 px-1 rounded">docker compose restart</code> - Restart container</li>
  137. <li><code className="bg-gray-100 px-1 rounded">docker logs ui-apt-mirror</code> - View container logs</li>
  138. <li><code className="bg-gray-100 px-1 rounded">docker compose logs</code> - View compose logs</li>
  139. </ul>
  140. </div>
  141. </div>
  142. </div>
  143. </div>
  144. );
  145. return (
  146. <PageLayoutNav
  147. nav={
  148. <>
  149. {sections.map((section) => (
  150. <NavLink
  151. key={section.id}
  152. to={`/documentation/${section.id}`}
  153. isActive={activeSection === section.id}
  154. >
  155. {section.linkName}
  156. </NavLink>
  157. ))}
  158. </>
  159. }
  160. >
  161. <>
  162. <Title title={sections.find((section) => section.id === activeSection)?.title || "Documentation"} />
  163. <ContentBlock className="flex-1">
  164. {activeSection === "file-structure" && renderFileStructure()}
  165. {activeSection === "commands" && renderCommands()}
  166. </ContentBlock>
  167. </>
  168. </PageLayoutNav>
  169. );
  170. }