dstack 0.19.4rc3__py3-none-any.whl → 0.19.6rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of dstack might be problematic. Click here for more details.

Files changed (183) hide show
  1. dstack/_internal/cli/commands/attach.py +22 -20
  2. dstack/_internal/cli/commands/offer.py +116 -0
  3. dstack/_internal/cli/main.py +2 -0
  4. dstack/_internal/cli/services/configurators/base.py +1 -2
  5. dstack/_internal/cli/services/configurators/fleet.py +43 -20
  6. dstack/_internal/cli/services/configurators/run.py +3 -3
  7. dstack/_internal/cli/utils/run.py +43 -38
  8. dstack/_internal/core/backends/aws/auth.py +1 -2
  9. dstack/_internal/core/backends/aws/compute.py +24 -9
  10. dstack/_internal/core/backends/aws/configurator.py +2 -3
  11. dstack/_internal/core/backends/aws/resources.py +10 -0
  12. dstack/_internal/core/backends/azure/auth.py +1 -2
  13. dstack/_internal/core/backends/azure/compute.py +15 -5
  14. dstack/_internal/core/backends/azure/configurator.py +4 -5
  15. dstack/_internal/core/backends/azure/resources.py +14 -0
  16. dstack/_internal/core/backends/base/compute.py +99 -31
  17. dstack/_internal/core/backends/gcp/auth.py +1 -2
  18. dstack/_internal/core/backends/gcp/compute.py +58 -14
  19. dstack/_internal/core/backends/gcp/configurator.py +2 -3
  20. dstack/_internal/core/backends/gcp/features/tcpx.py +31 -0
  21. dstack/_internal/core/backends/gcp/resources.py +10 -0
  22. dstack/_internal/core/backends/nebius/compute.py +6 -2
  23. dstack/_internal/core/backends/nebius/configurator.py +4 -10
  24. dstack/_internal/core/backends/nebius/models.py +14 -1
  25. dstack/_internal/core/backends/nebius/resources.py +91 -10
  26. dstack/_internal/core/backends/oci/auth.py +1 -2
  27. dstack/_internal/core/backends/oci/configurator.py +1 -2
  28. dstack/_internal/core/backends/runpod/compute.py +1 -1
  29. dstack/_internal/core/errors.py +4 -0
  30. dstack/_internal/core/models/common.py +2 -14
  31. dstack/_internal/core/models/configurations.py +24 -2
  32. dstack/_internal/core/models/envs.py +2 -2
  33. dstack/_internal/core/models/fleets.py +34 -3
  34. dstack/_internal/core/models/gateways.py +18 -4
  35. dstack/_internal/core/models/instances.py +2 -1
  36. dstack/_internal/core/models/profiles.py +12 -0
  37. dstack/_internal/core/models/runs.py +6 -0
  38. dstack/_internal/core/models/secrets.py +1 -1
  39. dstack/_internal/core/models/volumes.py +17 -1
  40. dstack/_internal/proxy/gateway/resources/nginx/service.jinja2 +3 -3
  41. dstack/_internal/proxy/gateway/services/nginx.py +0 -1
  42. dstack/_internal/proxy/gateway/services/registry.py +0 -1
  43. dstack/_internal/server/background/tasks/process_instances.py +12 -9
  44. dstack/_internal/server/background/tasks/process_running_jobs.py +66 -15
  45. dstack/_internal/server/routers/fleets.py +22 -0
  46. dstack/_internal/server/routers/runs.py +1 -0
  47. dstack/_internal/server/schemas/fleets.py +12 -2
  48. dstack/_internal/server/schemas/runner.py +6 -0
  49. dstack/_internal/server/schemas/runs.py +3 -0
  50. dstack/_internal/server/services/docker.py +1 -2
  51. dstack/_internal/server/services/fleets.py +30 -12
  52. dstack/_internal/server/services/gateways/__init__.py +1 -0
  53. dstack/_internal/server/services/instances.py +3 -1
  54. dstack/_internal/server/services/jobs/__init__.py +1 -2
  55. dstack/_internal/server/services/jobs/configurators/base.py +17 -8
  56. dstack/_internal/server/services/locking.py +16 -1
  57. dstack/_internal/server/services/projects.py +1 -2
  58. dstack/_internal/server/services/proxy/repo.py +1 -2
  59. dstack/_internal/server/services/runner/client.py +3 -0
  60. dstack/_internal/server/services/runs.py +19 -16
  61. dstack/_internal/server/services/services/__init__.py +1 -2
  62. dstack/_internal/server/services/volumes.py +29 -2
  63. dstack/_internal/server/statics/00a6e1fb461ed2929fb9.png +0 -0
  64. dstack/_internal/server/statics/0cae4d9f0a36034984a7.png +0 -0
  65. dstack/_internal/server/statics/391de232cc0e30cae513.png +0 -0
  66. dstack/_internal/server/statics/4e0eead8c1a73689ef9d.svg +1 -0
  67. dstack/_internal/server/statics/544afa2f63428c2235b0.png +0 -0
  68. dstack/_internal/server/statics/54a4f50f74c6b9381530.svg +7 -0
  69. dstack/_internal/server/statics/68dd1360a7d2611e0132.svg +4 -0
  70. dstack/_internal/server/statics/69544b4c81973b54a66f.png +0 -0
  71. dstack/_internal/server/statics/77a8b02b17af19e39266.png +0 -0
  72. dstack/_internal/server/statics/83a93a8871c219104367.svg +9 -0
  73. dstack/_internal/server/statics/8f28bb8e9999e5e6a48b.svg +4 -0
  74. dstack/_internal/server/statics/9124086961ab8c366bc4.svg +9 -0
  75. dstack/_internal/server/statics/9a9ebaeb54b025dbac0a.svg +5 -0
  76. dstack/_internal/server/statics/a3428392dc534f3b15c4.svg +7 -0
  77. dstack/_internal/server/statics/ae22625574d69361f72c.png +0 -0
  78. dstack/_internal/server/statics/assets/android-chrome-144x144.png +0 -0
  79. dstack/_internal/server/statics/assets/android-chrome-192x192.png +0 -0
  80. dstack/_internal/server/statics/assets/android-chrome-256x256.png +0 -0
  81. dstack/_internal/server/statics/assets/android-chrome-36x36.png +0 -0
  82. dstack/_internal/server/statics/assets/android-chrome-384x384.png +0 -0
  83. dstack/_internal/server/statics/assets/android-chrome-48x48.png +0 -0
  84. dstack/_internal/server/statics/assets/android-chrome-512x512.png +0 -0
  85. dstack/_internal/server/statics/assets/android-chrome-72x72.png +0 -0
  86. dstack/_internal/server/statics/assets/android-chrome-96x96.png +0 -0
  87. dstack/_internal/server/statics/assets/apple-touch-icon-1024x1024.png +0 -0
  88. dstack/_internal/server/statics/assets/apple-touch-icon-114x114.png +0 -0
  89. dstack/_internal/server/statics/assets/apple-touch-icon-120x120.png +0 -0
  90. dstack/_internal/server/statics/assets/apple-touch-icon-144x144.png +0 -0
  91. dstack/_internal/server/statics/assets/apple-touch-icon-152x152.png +0 -0
  92. dstack/_internal/server/statics/assets/apple-touch-icon-167x167.png +0 -0
  93. dstack/_internal/server/statics/assets/apple-touch-icon-180x180.png +0 -0
  94. dstack/_internal/server/statics/assets/apple-touch-icon-57x57.png +0 -0
  95. dstack/_internal/server/statics/assets/apple-touch-icon-60x60.png +0 -0
  96. dstack/_internal/server/statics/assets/apple-touch-icon-72x72.png +0 -0
  97. dstack/_internal/server/statics/assets/apple-touch-icon-76x76.png +0 -0
  98. dstack/_internal/server/statics/assets/apple-touch-icon-precomposed.png +0 -0
  99. dstack/_internal/server/statics/assets/apple-touch-icon.png +0 -0
  100. dstack/_internal/server/statics/assets/apple-touch-startup-image-1125x2436.png +0 -0
  101. dstack/_internal/server/statics/assets/apple-touch-startup-image-1136x640.png +0 -0
  102. dstack/_internal/server/statics/assets/apple-touch-startup-image-1170x2532.png +0 -0
  103. dstack/_internal/server/statics/assets/apple-touch-startup-image-1179x2556.png +0 -0
  104. dstack/_internal/server/statics/assets/apple-touch-startup-image-1242x2208.png +0 -0
  105. dstack/_internal/server/statics/assets/apple-touch-startup-image-1242x2688.png +0 -0
  106. dstack/_internal/server/statics/assets/apple-touch-startup-image-1284x2778.png +0 -0
  107. dstack/_internal/server/statics/assets/apple-touch-startup-image-1290x2796.png +0 -0
  108. dstack/_internal/server/statics/assets/apple-touch-startup-image-1334x750.png +0 -0
  109. dstack/_internal/server/statics/assets/apple-touch-startup-image-1488x2266.png +0 -0
  110. dstack/_internal/server/statics/assets/apple-touch-startup-image-1536x2048.png +0 -0
  111. dstack/_internal/server/statics/assets/apple-touch-startup-image-1620x2160.png +0 -0
  112. dstack/_internal/server/statics/assets/apple-touch-startup-image-1640x2160.png +0 -0
  113. dstack/_internal/server/statics/assets/apple-touch-startup-image-1668x2224.png +0 -0
  114. dstack/_internal/server/statics/assets/apple-touch-startup-image-1668x2388.png +0 -0
  115. dstack/_internal/server/statics/assets/apple-touch-startup-image-1792x828.png +0 -0
  116. dstack/_internal/server/statics/assets/apple-touch-startup-image-2048x1536.png +0 -0
  117. dstack/_internal/server/statics/assets/apple-touch-startup-image-2048x2732.png +0 -0
  118. dstack/_internal/server/statics/assets/apple-touch-startup-image-2160x1620.png +0 -0
  119. dstack/_internal/server/statics/assets/apple-touch-startup-image-2160x1640.png +0 -0
  120. dstack/_internal/server/statics/assets/apple-touch-startup-image-2208x1242.png +0 -0
  121. dstack/_internal/server/statics/assets/apple-touch-startup-image-2224x1668.png +0 -0
  122. dstack/_internal/server/statics/assets/apple-touch-startup-image-2266x1488.png +0 -0
  123. dstack/_internal/server/statics/assets/apple-touch-startup-image-2388x1668.png +0 -0
  124. dstack/_internal/server/statics/assets/apple-touch-startup-image-2436x1125.png +0 -0
  125. dstack/_internal/server/statics/assets/apple-touch-startup-image-2532x1170.png +0 -0
  126. dstack/_internal/server/statics/assets/apple-touch-startup-image-2556x1179.png +0 -0
  127. dstack/_internal/server/statics/assets/apple-touch-startup-image-2688x1242.png +0 -0
  128. dstack/_internal/server/statics/assets/apple-touch-startup-image-2732x2048.png +0 -0
  129. dstack/_internal/server/statics/assets/apple-touch-startup-image-2778x1284.png +0 -0
  130. dstack/_internal/server/statics/assets/apple-touch-startup-image-2796x1290.png +0 -0
  131. dstack/_internal/server/statics/assets/apple-touch-startup-image-640x1136.png +0 -0
  132. dstack/_internal/server/statics/assets/apple-touch-startup-image-750x1334.png +0 -0
  133. dstack/_internal/server/statics/assets/apple-touch-startup-image-828x1792.png +0 -0
  134. dstack/_internal/server/statics/assets/browserconfig.xml +12 -0
  135. dstack/_internal/server/statics/assets/favicon-16x16.png +0 -0
  136. dstack/_internal/server/statics/assets/favicon-32x32.png +0 -0
  137. dstack/_internal/server/statics/assets/favicon-48x48.png +0 -0
  138. dstack/_internal/server/statics/assets/favicon.ico +0 -0
  139. dstack/_internal/server/statics/assets/manifest.webmanifest +67 -0
  140. dstack/_internal/server/statics/assets/mstile-144x144.png +0 -0
  141. dstack/_internal/server/statics/assets/mstile-150x150.png +0 -0
  142. dstack/_internal/server/statics/assets/mstile-310x150.png +0 -0
  143. dstack/_internal/server/statics/assets/mstile-310x310.png +0 -0
  144. dstack/_internal/server/statics/assets/mstile-70x70.png +0 -0
  145. dstack/_internal/server/statics/assets/yandex-browser-50x50.png +0 -0
  146. dstack/_internal/server/statics/assets/yandex-browser-manifest.json +9 -0
  147. dstack/_internal/server/statics/b7ae68f44193474fc578.png +0 -0
  148. dstack/_internal/server/statics/d2f008c75b2b5b191f3f.png +0 -0
  149. dstack/_internal/server/statics/d44c33e1b92e05c379fd.png +0 -0
  150. dstack/_internal/server/statics/dd43ff0552815179d7ab.png +0 -0
  151. dstack/_internal/server/statics/dd4e7166c0b9aac197d7.png +0 -0
  152. dstack/_internal/server/statics/e30b27916930d43d2271.png +0 -0
  153. dstack/_internal/server/statics/e467d7d60aae81ab198b.svg +6 -0
  154. dstack/_internal/server/statics/eb9b344b73818fe2b71a.png +0 -0
  155. dstack/_internal/server/statics/f517dd626eb964120de0.png +0 -0
  156. dstack/_internal/server/statics/f958aecddee5d8e3222c.png +0 -0
  157. dstack/_internal/server/statics/index.html +3 -0
  158. dstack/_internal/server/statics/main-8f9c66f404e9c7e7e020.css +3 -0
  159. dstack/_internal/server/statics/main-b4f65323f5df007e1664.js +136480 -0
  160. dstack/_internal/server/statics/main-b4f65323f5df007e1664.js.map +1 -0
  161. dstack/_internal/server/statics/manifest.json +16 -0
  162. dstack/_internal/server/statics/robots.txt +3 -0
  163. dstack/_internal/server/statics/static/media/entraID.d65d1f3e9486a8e56d24fc07b3230885.svg +9 -0
  164. dstack/_internal/server/statics/static/media/github.1f7102513534c83a9d8d735d2b8c12a2.svg +3 -0
  165. dstack/_internal/server/statics/static/media/logo.f602feeb138844eda97c8cb641461448.svg +124 -0
  166. dstack/_internal/server/statics/static/media/okta.12f178e6873a1100965f2a4dbd18fcec.svg +2 -0
  167. dstack/_internal/server/statics/static/media/theme.3994c817bb7dda191c1c9640dee0bf42.svg +3 -0
  168. dstack/_internal/server/testing/common.py +10 -0
  169. dstack/_internal/utils/tags.py +42 -0
  170. dstack/api/server/__init__.py +3 -1
  171. dstack/api/server/_fleets.py +52 -9
  172. dstack/api/server/_gateways.py +17 -2
  173. dstack/api/server/_runs.py +34 -11
  174. dstack/api/server/_volumes.py +2 -3
  175. dstack/version.py +1 -1
  176. {dstack-0.19.4rc3.dist-info → dstack-0.19.6rc1.dist-info}/METADATA +2 -2
  177. {dstack-0.19.4rc3.dist-info → dstack-0.19.6rc1.dist-info}/RECORD +180 -76
  178. dstack-0.19.4rc3.data/data/dstack/_internal/proxy/gateway/resources/nginx/00-log-format.conf +0 -1
  179. dstack-0.19.4rc3.data/data/dstack/_internal/proxy/gateway/resources/nginx/entrypoint.jinja2 +0 -27
  180. dstack-0.19.4rc3.data/data/dstack/_internal/proxy/gateway/resources/nginx/service.jinja2 +0 -88
  181. {dstack-0.19.4rc3.dist-info → dstack-0.19.6rc1.dist-info}/WHEEL +0 -0
  182. {dstack-0.19.4rc3.dist-info → dstack-0.19.6rc1.dist-info}/entry_points.txt +0 -0
  183. {dstack-0.19.4rc3.dist-info → dstack-0.19.6rc1.dist-info}/licenses/LICENSE.md +0 -0
@@ -18,7 +18,6 @@ from dstack._internal.core.errors import (
18
18
  ServerClientError,
19
19
  SSHError,
20
20
  )
21
- from dstack._internal.core.models.common import is_core_model_instance
22
21
  from dstack._internal.core.models.configurations import SERVICE_HTTPS_DEFAULT, ServiceConfiguration
23
22
  from dstack._internal.core.models.gateways import GatewayConfiguration, GatewayStatus
24
23
  from dstack._internal.core.models.instances import SSHConnectionParams
@@ -38,7 +37,7 @@ logger = get_logger(__name__)
38
37
 
39
38
 
40
39
  async def register_service(session: AsyncSession, run_model: RunModel, run_spec: RunSpec):
41
- assert is_core_model_instance(run_spec.configuration, ServiceConfiguration)
40
+ assert isinstance(run_spec.configuration, ServiceConfiguration)
42
41
 
43
42
  if isinstance(run_spec.configuration.gateway, str):
44
43
  gateway = await get_project_gateway_model_by_name(
@@ -1,5 +1,5 @@
1
1
  import uuid
2
- from datetime import datetime, timezone
2
+ from datetime import datetime, timedelta, timezone
3
3
  from typing import List, Optional
4
4
 
5
5
  from sqlalchemy import and_, func, or_, select, update
@@ -309,22 +309,29 @@ def volume_model_to_volume(volume_model: VolumeModel) -> Volume:
309
309
  attachment_data=get_attachment_data(volume_attachment_model),
310
310
  )
311
311
  )
312
- return Volume(
312
+ deleted_at = None
313
+ if volume_model.deleted_at is not None:
314
+ deleted_at = volume_model.deleted_at.replace(tzinfo=timezone.utc)
315
+ volume = Volume(
313
316
  name=volume_model.name,
314
317
  project_name=volume_model.project.name,
315
318
  user=volume_model.user.name,
316
319
  configuration=configuration,
317
320
  external=configuration.volume_id is not None,
318
321
  created_at=volume_model.created_at.replace(tzinfo=timezone.utc),
322
+ last_processed_at=volume_model.last_processed_at.replace(tzinfo=timezone.utc),
319
323
  status=volume_model.status,
320
324
  status_message=volume_model.status_message,
321
325
  deleted=volume_model.deleted,
326
+ deleted_at=deleted_at,
322
327
  volume_id=vpd.volume_id if vpd is not None else None,
323
328
  provisioning_data=vpd,
324
329
  attachments=attachments,
325
330
  attachment_data=vad,
326
331
  id=volume_model.id,
327
332
  )
333
+ volume.cost = _get_volume_cost(volume)
334
+ return volume
328
335
 
329
336
 
330
337
  def get_volume_configuration(volume_model: VolumeModel) -> VolumeConfiguration:
@@ -417,3 +424,23 @@ async def _delete_volume(session: AsyncSession, project: ProjectModel, volume_mo
417
424
  compute.delete_volume,
418
425
  volume=volume,
419
426
  )
427
+
428
+
429
+ # Clouds charge volumes assuming 30-day months, e.g. https://aws.amazon.com/ebs/pricing/
430
+ _VOLUME_PRICING_PERIOD = timedelta(days=30)
431
+
432
+
433
+ def _get_volume_cost(volume: Volume) -> float:
434
+ if volume.provisioning_data is None or volume.provisioning_data.price is None:
435
+ return 0.0
436
+ finished_at = common.get_current_datetime()
437
+ if volume.deleted_at:
438
+ finished_at = volume.deleted_at
439
+ elif not volume.status.is_active():
440
+ finished_at = volume.last_processed_at
441
+ volume_age = finished_at - volume.created_at
442
+ return (
443
+ volume_age.total_seconds()
444
+ * volume.provisioning_data.price
445
+ / _VOLUME_PRICING_PERIOD.total_seconds()
446
+ )
@@ -0,0 +1 @@
1
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M5.83701 15L4.58751 13.7155L10.1468 8L4.58751 2.28446L5.83701 1L12.6465 8L5.83701 15Z" fill="black"/></svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 16">
2
+ <g stroke-width="2" stroke="darkorange" shape-rendering="geometricPrecision">
3
+ <polygon stroke-linejoin="round" fill="none" points="8 1 15 15 1 15 8 1"/>
4
+ <rect x="8" y="12" width="0.01" height="0.01"/>
5
+ <line x1="8" y1="6" x2="8" y2="10"/>
6
+ </g>
7
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg width="20" height="16" viewBox="0 0 20 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M14.7769 14.7337L8.65192 2.48369C8.32946 1.83877 7.40913 1.83877 7.08667 2.48369L0.961669 14.7337C0.670775 15.3155 1.09383 16 1.74429 16H13.9943C14.6448 16 15.0678 15.3155 14.7769 14.7337ZM3.16007 14.25L7.86929 4.83156L12.5785 14.25H3.16007ZM8.74429 11.625V13.375H6.99429V11.625H8.74429ZM6.99429 10.75V7.25H8.74429V10.75H6.99429Z" fill="#EC7211"/>
3
+ <path d="M11.1991 2.95238C10.8809 2.31467 10.3537 1.80526 9.7055 1.509L11.041 1.06978C11.6883 0.949814 12.337 1.27263 12.6317 1.86141L17.6136 11.8161C18.3527 13.2929 17.5938 15.0804 16.018 15.5745C16.4044 14.4507 16.3231 13.2188 15.7924 12.1555L11.1991 2.95238Z" fill="#EC7211"/>
4
+ </svg>
@@ -0,0 +1,9 @@
1
+ <svg viewBox="0 0 20 16" xmlns="http://www.w3.org/2000/svg">
2
+ <g stroke-width="2" stroke="darkorange" fill="none" shape-rendering="geometricPrecision">
3
+ <path class="stroke-linejoin-round" d="M8 14.8307C8 14.8307 2 12.9047 2 8.08992V3.26548C5.31 3.26548 7.98999 1.34918 7.98999 1.34918C7.98999 1.34918 10.69 3.26548 14 3.26548V8.08992C14 12.9047 8 14.8307 8 14.8307Z"/>
4
+ <path d="M2 8.08992V3.26548C5.31 3.26548 7.98999 1.34918 7.98999 1.34918"/>
5
+ <path d="M13.99 8.08992V3.26548C10.68 3.26548 8 1.34918 8 1.34918"/>
6
+ <path class="stroke-linejoin-round" d="M8 4V9"/>
7
+ <path class="stroke-linejoin-round" d="M8 10V12"/>
8
+ </g>
9
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 16" fill="none">
2
+ <path d="m 18.929851,7.8298076 c 0.146353,6.3374604 -6.323147,7.7778444 -7.477912,7.7778444 -2.1072726,-0.12875 5.117678,0.356249 5.051698,-7.8700618 -0.604672,-8.00397349 -7.0772706,-7.5631189 -4.8573,-7.43039556 1.606,-0.11514225 6.897485,1.26254596 7.283514,7.52261296 z" fill="crimson" stroke-width="2"/>
3
+ <path fill-rule="evenodd" clip-rule="evenodd" d="m 8.1147562,2.0529828 c 3.3491698,0 6.0641328,2.6768627 6.0641328,5.978953 0,3.3021122 -2.714963,5.9789202 -6.0641328,5.9789202 -3.3491473,0 -6.0641772,-2.676808 -6.0641772,-5.9789202 0.00539,-3.2998861 2.7172656,-5.9736408 6.0641772,-5.978953 z m 0,-1.73582719 c -4.3214836,0 -7.82474038,3.45401849 -7.82474038,7.71478019 0,4.2607282 3.50325678,7.7147452 7.82474038,7.7147452 4.3214498,0 7.8246998,-3.454017 7.8246998,-7.7147452 0,-2.0460914 -0.824392,-4.0083672 -2.291756,-5.4551746 C 12.180225,1.1299648 10.190013,0.31715561 8.1147562,0.31715561 Z M 6.9374563,8.2405985 4.6718685,10.485852 6.0086814,11.876728 8.3170035,9.6007911 10.625337,11.876728 11.962138,10.485852 9.6965508,8.2405985 11.962138,6.0068066 10.573246,4.6374335 8.3170035,6.8734297 6.0607607,4.6374335 4.6718685,6.0068066 Z" fill="crimson" stroke-width="2"/>
4
+ </svg>
@@ -0,0 +1,9 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 16">
2
+ <g stroke-width="2" stroke="blue" shape-rendering="geometricPrecision">
3
+ <circle fill="none" cx="8" cy="8" r="7" stroke-linejoin="round"/>
4
+ <polyline points="8 11 8 8"/>
5
+ <polyline points="9 8 6 8"/>
6
+ <line x1="10" y1="11" x2="6" y2="11"/>
7
+ <rect x="8" y="5" width="0.01" height="0.01"/>
8
+ </g>
9
+ </svg>
@@ -0,0 +1,5 @@
1
+
2
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 17 14" fill="none">
3
+ <path d="M10.0001 13.6992C10.0001 13.6992 11.9241 13.4763 13 12.6992C14.4139 11.6781 16 10.5 16.1251 6.81126V2.58987C16.1251 2.54768 16.1221 2.50619 16.1164 2.46559V1.71485H15.2414L15.2307 1.71484L14.6251 1.69922V6.81123C14.6251 8.51061 14.6251 9.46461 12.7824 11.721C12.1586 12.4848 10.0001 13.6992 10.0001 13.6992Z" fill="crimson" stroke-width="2"/>
4
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M7.33609 0.367475C7.03214 0.152652 6.62548 0.153614 6.32253 0.369997L6.30869 0.379554C6.29553 0.388588 6.27388 0.403266 6.24417 0.422789C6.18471 0.46186 6.09321 0.520171 5.97313 0.591373C5.73251 0.734059 5.3799 0.926864 4.94279 1.12009C4.06144 1.5097 2.87541 1.88377 1.58984 1.88377H0.714844V2.75877V6.98015C0.714844 9.49374 2.28866 11.1973 3.70254 12.2185C4.41845 12.7355 5.12874 13.1053 5.65733 13.3457C5.92284 13.4664 6.14566 13.5559 6.30465 13.6161C6.38423 13.6462 6.44805 13.669 6.49349 13.6848C6.51622 13.6927 6.53438 13.6989 6.54764 13.7033L6.56382 13.7087L6.56908 13.7104L6.57099 13.711L6.83984 13.7533L6.57242 13.7115C6.74633 13.7673 6.93335 13.7673 7.10727 13.7115L7.1087 13.711L7.11061 13.7104L7.11587 13.7087L7.13205 13.7033C7.14531 13.6989 7.16346 13.6927 7.18619 13.6848C7.23164 13.669 7.29546 13.6462 7.37503 13.6161C7.53403 13.5559 7.75685 13.4664 8.02236 13.3457C8.55095 13.1053 9.26123 12.7355 9.97715 12.2185C11.391 11.1973 12.9648 9.49377 12.9648 6.98018V2.7588C12.9648 2.7166 12.9619 2.67511 12.9561 2.63451V1.88377H12.0811C12.0775 1.88377 12.074 1.88377 12.0704 1.88377C10.7979 1.88004 9.61962 1.51102 8.73894 1.12486C8.73534 1.12327 8.73174 1.12168 8.72814 1.12009C8.29103 0.926864 7.93842 0.734059 7.69779 0.591373C7.57772 0.520171 7.48622 0.46186 7.42676 0.422789C7.39705 0.403266 7.37539 0.388588 7.36224 0.379554L7.34896 0.37035C7.34896 0.37035 7.34847 0.37002 7.34563 0.374054L7.33779 0.368659L7.33609 0.367475ZM8.03471 2.72691C8.8604 3.09063 9.96066 3.46309 11.2061 3.58907V6.98015H11.2148C11.2148 8.67953 10.1637 9.92507 8.95254 10.7998C8.35595 11.2306 7.75374 11.5454 7.29796 11.7527C7.11671 11.8351 6.96062 11.8996 6.83984 11.9469C6.71906 11.8996 6.56297 11.8351 6.38173 11.7527C5.92595 11.5454 5.32373 11.2306 4.72715 10.7998C3.51603 9.92507 2.46484 8.67955 2.46484 6.98018V3.58909C3.71738 3.46239 4.82308 3.08639 5.65033 2.72071C6.14228 2.50324 6.54485 2.28537 6.83254 2.11624C7.12181 2.28535 7.527 2.50352 8.02196 2.72131C8.0262 2.72317 8.03045 2.72504 8.03471 2.72691ZM5.96484 3.40147V7.77647H7.71484V3.40147H5.96484ZM5.96484 10.4015V8.65147H7.71484V10.4015H5.96484Z" fill="crimson" stroke-width="2"/>
5
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 16">
2
+ <g stroke-width="2" stroke="red" shape-rendering="geometricPrecision">
3
+ <circle fill="none" cx="8" cy="8" r="7" stroke-linejoin="round"/>
4
+ <line x1="11" y1="5" x2="5" y2="11"/>
5
+ <line x1="11" y1="11" x2="5" y2="5"/>
6
+ </g>
7
+ </svg>
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <browserconfig>
3
+ <msapplication>
4
+ <tile>
5
+ <square70x70logo src="mstile-70x70.png"/>
6
+ <square150x150logo src="mstile-150x150.png"/>
7
+ <wide310x150logo src="mstile-310x150.png"/>
8
+ <square310x310logo src="mstile-310x310.png"/>
9
+ <TileColor>#fff</TileColor>
10
+ </tile>
11
+ </msapplication>
12
+ </browserconfig>
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "dstackai",
3
+ "short_name": "dstackai",
4
+ "dir": "auto",
5
+ "lang": "en-US",
6
+ "display": "standalone",
7
+ "orientation": "any",
8
+ "start_url": "/?homescreen=1",
9
+ "background_color": "#fff",
10
+ "theme_color": "#fff",
11
+ "icons": [
12
+ {
13
+ "src": "android-chrome-36x36.png",
14
+ "sizes": "36x36",
15
+ "type": "image/png",
16
+ "purpose": "any"
17
+ },
18
+ {
19
+ "src": "android-chrome-48x48.png",
20
+ "sizes": "48x48",
21
+ "type": "image/png",
22
+ "purpose": "any"
23
+ },
24
+ {
25
+ "src": "android-chrome-72x72.png",
26
+ "sizes": "72x72",
27
+ "type": "image/png",
28
+ "purpose": "any"
29
+ },
30
+ {
31
+ "src": "android-chrome-96x96.png",
32
+ "sizes": "96x96",
33
+ "type": "image/png",
34
+ "purpose": "any"
35
+ },
36
+ {
37
+ "src": "android-chrome-144x144.png",
38
+ "sizes": "144x144",
39
+ "type": "image/png",
40
+ "purpose": "any"
41
+ },
42
+ {
43
+ "src": "android-chrome-192x192.png",
44
+ "sizes": "192x192",
45
+ "type": "image/png",
46
+ "purpose": "any"
47
+ },
48
+ {
49
+ "src": "android-chrome-256x256.png",
50
+ "sizes": "256x256",
51
+ "type": "image/png",
52
+ "purpose": "any"
53
+ },
54
+ {
55
+ "src": "android-chrome-384x384.png",
56
+ "sizes": "384x384",
57
+ "type": "image/png",
58
+ "purpose": "any"
59
+ },
60
+ {
61
+ "src": "android-chrome-512x512.png",
62
+ "sizes": "512x512",
63
+ "type": "image/png",
64
+ "purpose": "any"
65
+ }
66
+ ]
67
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": "2.0.0",
3
+ "api_version": 1,
4
+ "layout": {
5
+ "logo": "yandex-browser-50x50.png",
6
+ "color": "#fff",
7
+ "show_title": true
8
+ }
9
+ }
@@ -0,0 +1,6 @@
1
+ <svg viewBox="0 0 20 16" xmlns="http://www.w3.org/2000/svg">
2
+ <g stroke-width="2" stroke="silver" fill="none" shape-rendering="geometricPrecision">
3
+ <path class="stroke-linejoin-round" d="M6 14H10"/>
4
+ <path d="M8 11H9C9 9.47002 12 8.54002 12 5.76002C12.02 4.40002 11.39 3.36002 10.43 2.67002C9 1.64002 7.00001 1.64002 5.57001 2.67002C4.61001 3.36002 3.98 4.40002 4 5.76002C4 8.54002 7.00001 9.47002 7.00001 11H8Z"/>
5
+ </g>
6
+ </svg>
@@ -0,0 +1,3 @@
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><title>dstack</title><meta name="description" content="Get GPUs at the best prices and availability from a wide range of providers. No cloud account of your own is required.
2
+ "/><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel="stylesheet"><meta name="og:title" content="dstack"><meta name="og:type" content="article"><meta name="og:image" content="/splash_thumbnail.png"><meta name="og:description" content="Get GPUs at the best prices and availability from a wide range of providers. No cloud account of your own is required.
3
+ "><link rel="icon" type="image/x-icon" href="/assets/favicon.ico"><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"><link rel="icon" type="image/png" sizes="48x48" href="/assets/favicon-48x48.png"><link rel="manifest" href="/assets/manifest.webmanifest"><meta name="mobile-web-app-capable" content="yes"><meta name="theme-color" content="#fff"><meta name="application-name" content="dstackai"><link rel="apple-touch-icon" sizes="57x57" href="/assets/apple-touch-icon-57x57.png"><link rel="apple-touch-icon" sizes="60x60" href="/assets/apple-touch-icon-60x60.png"><link rel="apple-touch-icon" sizes="72x72" href="/assets/apple-touch-icon-72x72.png"><link rel="apple-touch-icon" sizes="76x76" href="/assets/apple-touch-icon-76x76.png"><link rel="apple-touch-icon" sizes="114x114" href="/assets/apple-touch-icon-114x114.png"><link rel="apple-touch-icon" sizes="120x120" href="/assets/apple-touch-icon-120x120.png"><link rel="apple-touch-icon" sizes="144x144" href="/assets/apple-touch-icon-144x144.png"><link rel="apple-touch-icon" sizes="152x152" href="/assets/apple-touch-icon-152x152.png"><link rel="apple-touch-icon" sizes="167x167" href="/assets/apple-touch-icon-167x167.png"><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon-180x180.png"><link rel="apple-touch-icon" sizes="1024x1024" href="/assets/apple-touch-icon-1024x1024.png"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><meta name="apple-mobile-web-app-title" content="dstackai"><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-640x1136.png"><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-1136x640.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-750x1334.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-1334x750.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1125x2436.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2436x1125.png"><link rel="apple-touch-startup-image" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1170x2532.png"><link rel="apple-touch-startup-image" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2532x1170.png"><link rel="apple-touch-startup-image" media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1179x2556.png"><link rel="apple-touch-startup-image" media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2556x1179.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-828x1792.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-1792x828.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1242x2688.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2688x1242.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1242x2208.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2208x1242.png"><link rel="apple-touch-startup-image" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1284x2778.png"><link rel="apple-touch-startup-image" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2778x1284.png"><link rel="apple-touch-startup-image" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1290x2796.png"><link rel="apple-touch-startup-image" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2796x1290.png"><link rel="apple-touch-startup-image" media="(device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1488x2266.png"><link rel="apple-touch-startup-image" media="(device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2266x1488.png"><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1536x2048.png"><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2048x1536.png"><link rel="apple-touch-startup-image" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1620x2160.png"><link rel="apple-touch-startup-image" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2160x1620.png"><link rel="apple-touch-startup-image" media="(device-width: 820px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1640x2160.png"><link rel="apple-touch-startup-image" media="(device-width: 820px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2160x1640.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1668x2388.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2388x1668.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1668x2224.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2224x1668.png"><link rel="apple-touch-startup-image" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-2048x2732.png"><link rel="apple-touch-startup-image" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2732x2048.png"><meta name="msapplication-TileColor" content="#fff"><meta name="msapplication-TileImage" content="/assets/mstile-144x144.png"><meta name="msapplication-config" content="/assets/browserconfig.xml"><link rel="yandex-tableau-widget" href="/assets/yandex-browser-manifest.json"><script defer="defer" src="/main-b4f65323f5df007e1664.js"></script><link href="/main-8f9c66f404e9c7e7e020.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div class="b-page-header" id="header"></div><div id="root"></div></body></html>