index.html 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta name="description"
  7. content="Container Image Selector - Generate Docker pull commands based on your hardware configuration.">
  8. <title data-i18n="title">Container Image Selector</title>
  9. <link rel="icon" type="image/png" href="assets/logo.png">
  10. <link rel="stylesheet" href="assets/style.css">
  11. </head>
  12. <body>
  13. <header>
  14. <div class="header-content">
  15. <div class="logo">
  16. <img src="assets/logo-white.png" alt="GPUStack" class="logo-wide">
  17. <span class="subtitle" data-i18n="subtitle"></span>
  18. </div>
  19. <div class="header-controls">
  20. <div class="official-link">
  21. <a href="https://docs.gpustack.ai/" target="_blank">
  22. <span data-i18n="back_to_docs"></span>
  23. <svg class="external-icon" width="12" height="12" viewBox="0 0 24 24" fill="none"
  24. stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  25. <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path>
  26. <polyline points="15 3 21 3 21 9"></polyline>
  27. <line x1="10" y1="14" x2="21" y2="3"></line>
  28. </svg>
  29. </a>
  30. </div>
  31. <div class="language-dropdown">
  32. <button class="dropbtn" id="current-lang">English</button>
  33. <div class="dropdown-content">
  34. <div class="dropdown-inner">
  35. <a href="#" data-lang="en">English</a>
  36. <a href="#" data-lang="zh">简体中文</a>
  37. </div>
  38. </div>
  39. </div>
  40. <div class="version-selector">
  41. <label class="version-label" data-i18n="version"></label>
  42. <select id="gpustack-version-select" class="version-select">
  43. <option value="" data-i18n="loading"></option>
  44. </select>
  45. </div>
  46. </div>
  47. </div>
  48. </header>
  49. <main>
  50. <div class="container">
  51. <div class="selector-panel">
  52. <h2 data-i18n="select_config"></h2>
  53. <!-- GPU Type Selection -->
  54. <div class="selector-group">
  55. <label class="selector-label" data-i18n="gpu_type"></label>
  56. <div class="card-grid" id="card-selector">
  57. <!-- Dynamic Generation -->
  58. </div>
  59. </div>
  60. <!-- Computing Framework Version -->
  61. <div class="selector-group" id="framework-version-group">
  62. <label class="selector-label" data-i18n="framework_version"></label>
  63. <select id="framework-version-select" class="select-input">
  64. <option value="" data-i18n="select_gpu_first"></option>
  65. </select>
  66. </div>
  67. <!-- Inference Backend -->
  68. <div class="selector-group" id="backend-group">
  69. <div class="label-with-tooltip">
  70. <label class="selector-label" data-i18n="inference_backend"></label>
  71. <span class="tooltip-icon">
  72. i
  73. <span class="tooltip-content" data-i18n="inference_backend_tooltip"></span>
  74. </span>
  75. </div>
  76. <div class="checkbox-group" id="backend-selector">
  77. <!-- Dynamic Generation -->
  78. </div>
  79. </div>
  80. <!-- Optional Images -->
  81. <div class="selector-group">
  82. <label class="selector-label" data-i18n="optional_images"></label>
  83. <div class="checkbox-group" id="optional-images">
  84. <div class="label-with-tooltip"><label class="checkbox-item" data-for-component="server">
  85. <input type="checkbox" id="postgres">
  86. <span data-i18n="postgres"></span>
  87. </label>
  88. <span class="tooltip-icon">
  89. i
  90. <span class="tooltip-content" data-i18n="optional_postgres_images_tooltip"></span>
  91. </span>
  92. </div>
  93. <div class="label-with-tooltip">
  94. <label class="checkbox-item" data-for-component="server">
  95. <input type="checkbox" id="monitoring">
  96. <span data-i18n="monitoring"></span>
  97. </label>
  98. <span class="tooltip-icon">
  99. i
  100. <span class="tooltip-content" data-i18n="optional_monitoring_images_tooltip"></span>
  101. </span>
  102. </div>
  103. </div>
  104. </div>
  105. </div>
  106. <!-- Image List Panel -->
  107. <div class="result-panel">
  108. <h2 data-i18n="required_images"></h2>
  109. <!-- Architecture -->
  110. <div class="selector-group-inline">
  111. <div class="selector-item flex-2">
  112. <label class="selector-label" data-i18n="architecture"></label>
  113. <div class="button-grid" id="arch-selector">
  114. <button class="option-button active" data-value="amd64">AMD64</button>
  115. <button class="option-button" data-value="arm64">ARM64</button>
  116. </div>
  117. </div>
  118. <div class="selector-item flex-4">
  119. <label class="selector-label" data-i18n="registry"></label>
  120. <div class="button-grid" id="registry-selector">
  121. <button class="option-button active" data-value="docker-hub">Docker Hub</button>
  122. <button class="option-button" data-value="quay">Quay.io</button>
  123. <button class="option-button" data-value="china" id="registry-china"
  124. data-i18n="china_registry"></button>
  125. </div>
  126. </div>
  127. </div>
  128. <!-- Image List Tab Component -->
  129. <div class="image-tabs-container">
  130. <div class="image-tabs-header">
  131. <button class="image-tab active" data-component="all" data-i18n="tab_all"></button>
  132. <button class="image-tab" data-component="server" data-i18n="tab_server"></button>
  133. <button class="image-tab" data-component="worker" data-i18n="tab_worker"></button>
  134. </div>
  135. <div class="image-tabs-content">
  136. <div class="commands-output">
  137. <div class="code-block-wrapper">
  138. <pre id="image-list" class="image-commands"><code class="placeholder"
  139. data-i18n="placeholder_select"></code></pre>
  140. <button id="copy-all-btn" class="copy-icon-btn" title="Copy all commands"
  141. style="display: none;">
  142. <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor"
  143. stroke-width="2">
  144. <rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
  145. <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
  146. </svg>
  147. </button>
  148. </div>
  149. </div>
  150. </div>
  151. </div>
  152. <!-- Offline Installation Guide Module -->
  153. <div class="offline-guide-module">
  154. <details>
  155. <summary class="guide-summary" data-i18n="offline_guide_title"></summary>
  156. <div class="guide-container">
  157. <div class="guide-header">
  158. <div class="guide-tabs">
  159. <button class="guide-tab active" data-guide="save-load"
  160. data-i18n="guide_tab_save"></button>
  161. <button class="guide-tab" data-guide="tag-push" data-i18n="guide_tab_tag"></button>
  162. <button class="guide-tab" data-guide="copy-images" data-i18n="guide_tab_auto"></button>
  163. </div>
  164. </div>
  165. <div class="guide-body">
  166. <div class="guide-content active" id="guide-save-load" data-i18n="guide_save_content"></div>
  167. <div class="guide-content" id="guide-tag-push" data-i18n="guide_tag_content"></div>
  168. <div class="guide-content" id="guide-copy-images" data-i18n="guide_auto_content"></div>
  169. </div>
  170. <div class="guide-footer">
  171. <a href="https://docs.gpustack.ai/latest/installation/air-gapped/" target="_blank"
  172. class="docs-link" data-i18n="view_full_docs"></a>
  173. </div>
  174. </div>
  175. </details>
  176. </div>
  177. </div>
  178. </div>
  179. </main>
  180. <script src="assets/app.js"></script>
  181. </body>
  182. </html>