<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Все публикации подряд на Хабре [expanded by feedex.net]</title><link>https://habr.com/ru/articles/</link><description>Все публикации подряд на Хабре</description><atom:link href="https://feedex.net/feed/habr.com/ru/rss/articles/all/" rel="self"/><lastBuildDate>Sun, 04 Oct 2026 01:44:58 +0000</lastBuildDate><item><title>Делаем RAG-систему с нуля</title><link>https://habr.com/ru/articles/1090066/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1090066</link><description>&lt;noscript&gt;&lt;img src="https://rap.skcrtxr.com/pub/pix/c070f1bc-f02e-4927-9142-269f6d8fb2ee" alt=""&gt;&lt;/noscript&gt;
&lt;noscript&gt;&lt;img src="https://rap.skcrtxr.com/pub/pix/c91b4648-0ac9-4841-8086-f64b0900950e" alt=""&gt;&lt;/noscript&gt;
&lt;noscript&gt;&lt;img src="https://rap.skcrtxr.com/pub/pix/e495267a-6de9-4879-8356-7ad2cb2831ab" alt=""&gt;&lt;/noscript&gt;
    &lt;div id="mount"&gt;&lt;div id="app"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;svg height="24" width="24"&gt;Обновить&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;article&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;a href="https://habr.com/ru/users/JBFW/" rel="nofollow"&gt;&lt;div&gt;&lt;img alt="" height="24" src="https://assets.habr.com/habr-web/release_2.352.2/client/img/avatars/098.png" width="24"&gt;&lt;/div&gt;&lt;/a&gt;&lt;span&gt;&lt;a href="https://habr.com/ru/users/JBFW/" rel="nofollow"&gt;JBFW&lt;/a&gt;&lt;span&gt;&lt;time datetime="2026-10-04T01:44:58.000Z" title="2026-10-04, 01:44"&gt;28 минут назад&lt;/time&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;svg height="24" width="24"&gt;Время на прочтение&lt;/svg&gt;&lt;/span&gt;&lt;span&gt;17 мин&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div lang="ru"&gt;&lt;div id="post-content-body"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;У меня с давних времен сохранилась куча всяких заметок, в основном в виде простых текстовых файлов.&lt;br&gt;Самых разных: от скриптов и конфигов до всяких рецептов, всё что когда-то пригодилось или могло пригодиться. &lt;/p&gt;&lt;p&gt;Хранение в виде файлов - это на самом деле очень удобно: их практически всегда можно прочитать, их легко создавать и редактировать, они не требуют установки каких-то специальных особых редакторов и информационных систем, при этом их легко копировать, добавлять в архивы и т.д. &lt;br&gt;И даже полнотекстовый поиск по ним организуется элементарно.  &lt;/p&gt;&lt;p&gt;Единственный минус, когда их много - для того чтобы что-то найти нужно пройтись по каталогам где они лежат и увидеть глазами. &lt;br&gt;Особенно - если их никто не пытался строго структурировать, и они лежат где-то так:&lt;br&gt;"Документы/старое/1/1/разобрать/старый диск/Документы/Работа/...". &lt;br&gt;Ну, это конечно запущенный случай, и надо бы разобрать, когда-нибудь, может быть - ну, собственно говоря, там так и написано...  &lt;/p&gt;&lt;p&gt;Что если попробовать прикрутить к этому поиск?  &lt;/p&gt;&lt;p&gt;Вот только нужно соблюсти несколько условий:  &lt;br&gt;1 - ничего не испортить. Информация хранится в файлах - и эти файлы-первоисточники не должны потеряться.&lt;br&gt;2 - только локальная обработка. Никаких облаков, подписок и прочего. &lt;br&gt;3 - не должны быть завышены системные требования, задача должна решаться как можно проще, без приобретения дорогостоящего оборудования, буквально на том что есть. &lt;br&gt;А есть машинки с 4 гигами памяти, с этим не проблема.  &lt;/p&gt;&lt;p&gt;И вот, исходя из таких предпосылок, начинаем... &lt;br&gt;Дисклеймер: &lt;em&gt;с нуля&lt;/em&gt; означает с нуля, то есть от "я читал про это" до более-менее работающей системы, и без претензий на продакшен, чисто для себя.&lt;br&gt;Инженерам по строительству RAG-систем тут вряд ли будет что-то интересно.&lt;/p&gt;&lt;p&gt;В соответствии с нормами текущего времени - базовые вопросы были адресованы LLM, а вот с ответами уже пришлось разбираться самому.&lt;/p&gt;&lt;p&gt;В теории это должно работать примерно так: в основе лежит некая ИИ-модель, которая умеет оценивать тексты.&lt;br&gt;Оценивает они их  по принципу "существует всего 768 тем, и вот &lt;em&gt;этот текст&lt;/em&gt; соответствует этим темам на [0.32, 0.522, 0.12, 0.023, ...]".&lt;br&gt;Полученный массив - 768-мерный вектор, который описывает данный кусочек текста.&lt;br&gt;Поисковой запрос в виде текста также оценивается этой же моделью, также формируется вектор, а потом этот вектор прогоняется по базе сохраненных векторов в поисках наиболее близких по теме, для чего нужна так называемая векторная БД. &lt;br&gt;Ищется не прямое совпадение, а "дистанция" между векторами: чем она меньше - тем больше тексты похожи.&lt;/p&gt;&lt;p&gt;В результате найденные куски текстов по идее должны более-менее соответствовать запросу, ну а по сохраненным метаданным можно найти тот документ, к которому данный текст относился.&lt;br&gt;Ну, в идеале сюда еще добавляется полнотекстовой поиск, для поиска отдельных ключевых слов и уточнения результатов поиска - но это уже примочки.&lt;/p&gt;&lt;p&gt;Также LLM предложил готовый пример скрипта, реализующего данную логику. Скрипт был, конечно же, на Python.&lt;/p&gt;&lt;details&gt;&lt;summary&gt;Python - язык №1 в топах, и почему я его не люблю&lt;/summary&gt;&lt;div&gt;&lt;p&gt;Есть такие языки программирования, которые &lt;em&gt;просто не нравятся&lt;/em&gt;. У меня это - Pascal и Python. Один к счастью сейчас почти не встречается, а вот второй занимает первые строчки всяческих рейтингов. &lt;br&gt;Не нравится же он по нескольким причинам, и сейчас первая, чисто вкусовщина:&lt;br&gt;он создает своеобразный вайб, как будто в институте на лекции очень пожилой профессор, прекрасный математик, но реально писавший программы последний раз 50 лет назад на PL/1 еще для ЕС, пытается обьяснить студентам &lt;em&gt;алгоритм&lt;/em&gt; с использованием &lt;em&gt;псевдокода&lt;/em&gt;.&lt;br&gt;А студенты потом тащат этот псевдокод в продакшен - работает же? &lt;br&gt;Работает, но есть нюансы...&lt;/p&gt;&lt;/div&gt;&lt;/details&gt;&lt;pre&gt;&lt;code&gt;import faiss
import numpy as np
from sentence_transformers import SentenceTransformer
embedder = SentenceTransformer(
    "intfloat/multilingual-e5-base"
)
chunks = [
        {
            "text": "Текст 1",
            "source": "/data/manual1.pdf",
        },
        {
            "text": "Текст 2",
            "source": "/data/manual2.pdf",
        }
]
texts = [chunk["text"] for chunk in chunks]
vectors = embedder.encode(
    texts,
    normalize_embeddings=True,
    show_progress_bar=True
)
vectors = np.asarray(vectors, dtype="float32")
dimension = vectors.shape[1]
index = faiss.IndexFlatIP(dimension)
index.add(vectors)
faiss.write_index(index, "documents.faiss")
import json
with open("chunks.json", "w", encoding="utf-8") as f:
    json.dump(chunks, f, ensure_ascii=False, indent=2)
def search(query, index, chunks, embedder, top_k=5):
    query_vector = embedder.encode(
        [query],
        normalize_embeddings=True
    ).astype("float32")
    scores, ids = index.search(query_vector, top_k)
    results = []
    for score, idx in zip(scores[0], ids[0]):
        if idx &amp;gt;= 0:
            item = chunks[idx].copy()
            item["score"] = float(score)
            results.append(item)
    return results
results = search(
    "текст запроса",
    index,
    chunks,
    embedder,
    top_k=5
)
for result in results:
    print(result["source"], result["score"])
    print(result["text"])
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;(скрипт не мой, но нужен тут для понимания откуда ног растут)&lt;/p&gt;&lt;p&gt;В данном случае вектора создаются с помощью модели "intfloat/multilingual-e5-base", записываются в векторную базу FAISS, а метаданные, что откуда взято - в JSON-файл.&lt;br&gt;ИМХО, неплохой учебный пример, демонстрирующий логику работы. &lt;br&gt;Исходные файлы разбиваются на чанки, чанки индексируются, по векторам находятся совпадения, результаты можно отсортировать по рейтингу, и в итоге уже выдать документы-первоисточники, откуда что взято.&lt;/p&gt;&lt;p&gt;После нескольких доработок скрипт превратился в первую версию: он реально читал файлы из заданного каталога и индексировал их, а второй скрипт (по сути часть исходного) - уже умел что-то искать в этой базе.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/dcc/b0f/fa4/dccb0ffa4b51df232f94635c16946fb3.jpg" width="500" height="160"&gt;&lt;/figure&gt;&lt;p&gt;Первая проблема была в том, что всё это было ОЧЕНЬ долго: и в основном время тратилось на загрузку модели. &lt;br&gt;Особенно при поиске: скрипт запускается, грузит модель, и только потом уже можно отправлять в нее запрос.  &lt;/p&gt;&lt;p&gt;Разумеется, о практическом использовании такого говорить нельзя, поэтому в очередной версии "поисковик" запускал http-сервер, который принимал поисковую строку,   отправлял ее в модель, и возвращал результаты.&lt;/p&gt;&lt;details&gt;&lt;summary&gt;Почему Python так любят многие?&lt;/summary&gt;&lt;div&gt;&lt;p&gt;Он простой с точки зрения установки: достаточно команды pip install something - оно будет где-то найдено, скачано и быстро установлено. &lt;br&gt;Сложности могут возникнуть только на самом первом этапе - &lt;s&gt;подготовки рабочего места студента&lt;/s&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;python3 -m venv .venv
source .venv/bin/activate &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;И всё скачанное будет устанавливаться в домашний каталог. В каких-то случаях это даже удобно, но в каких-то не очень.&lt;br&gt;А вот потом - всё просто и как бы само по себе. И экосистема обширная - модулей много понаписали.  &lt;br&gt;В частности, добавить в скрипт http-сервер - раз плюнуть. Удобно. &lt;/p&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;На этом этапе стало понятно, что клиентская сторона, собственно, отправка запросов, совсем не обязана быть на Python, запросы можно отправлять из чего угодно, хоть из шелла.&lt;br&gt;Стало гораздо лучше: скрипт-индексатор, скрипт-поисковик и внешний клиент для отправки запросов. &lt;br&gt;Первые два тормозили при запуске, а вот внешний клиент работал уже независимо от них. &lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/a46/ef6/da6/a46ef6da6ea18106c86ae619b1a7f004.jpg" width="500" height="142"&gt;&lt;/figure&gt;&lt;p&gt;В ходе экспериментов выяснилось, что держать индексы и метаданные необязательно в этих файлах, можно записывать их, ну например, в MongoDB по сети - но без специальных расширений для работы с векторами никакого преимущества оно не дает, просто &lt;em&gt;и так тоже можно&lt;/em&gt;. &lt;br&gt;Можно заменить FAISS на ChromaDB - кроме некоторого замедления эффекта нет.&lt;/p&gt;&lt;p&gt;Также возникло желание заменить эту модель на что-то более другое - тогда выяснилось, что модель может работать вообще отдельно, на llama.cpp или Ollama. &lt;br&gt;Порядок работы немного поменялся: Ollama запускалась на другом сервере в сети, скрипты обращались к ней за векторами по API, и вот только поиск шел уже в той же FAISS. &lt;/p&gt;&lt;pre&gt;&lt;code&gt;from  ollama import Client
ol_host = "http://ollama:11434"
oclient = Client(host=ol_host)
...
    #new_vector = embedder.encode(
    #    #[f"{content}"],
    #    normalize_embeddings=True,
    #    convert_to_numpy=True
    #).astype("float32")
    response = oclient.embed(
        model=model,
        input=content,
        dimensions=dimension
    )
    embeddings = response['embeddings']
    new_vector = np.array(embeddings, dtype=np.float32)
...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Теперь обработкой занималась модель в Ollama, выбор вариантов увеличился.&lt;br&gt;Но по-прежнему не нравилось, что ради этого приходится отдельно устанавливать скрипты на Python. &lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/e41/a26/4a4/e41a264a40ed77f67e789dde8f600898.jpg" width="499" height="224"&gt;&lt;/figure&gt;&lt;details&gt;&lt;summary&gt;Python - технические моменты&lt;/summary&gt;&lt;div&gt;&lt;p&gt;Во-первых, ужасно неудобный (для меня) синтаксис. &lt;br&gt;При всей легкости установки чужих готовых модулей - писать на этом самому совершенно не хотелось. &lt;br&gt;Почти как в старом анекдоте: "Ты C знаешь? Вот вообще на него не похоже!"&lt;/p&gt;&lt;p&gt;Во-вторых - он тормоз. &lt;br&gt;Простейшие вещи, которые к примеру, на Perl, отрабатывают мгновенно - тут раздражающе тормозили. &lt;/p&gt;&lt;p&gt;И в третьих - ну вот, допустим, допустили вы очепятку. Переменная не так называется, как должна. &lt;br&gt;Что делает perl-скрипт при запуске? Он сразу ругается: в строке такой-то переменная "anme" не была обьявлена / не используется, проверьте! &lt;br&gt;Что делает python-скрипт при запуске? Он запускается, работает, и только при обращении к проблемному коду &lt;em&gt;почему-то&lt;/em&gt; происходит ошибка, хорошо если в лог напишет.&lt;/p&gt;&lt;p&gt;А с учетом того что он тормоз, и до нужного места может дойти не сразу - приятного мало. &lt;/p&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;В общем, возникло сильное желание переписать все на &lt;s&gt;Rust&lt;/s&gt; Perl.&lt;br&gt;К сожалению, экосистема Perl сейчас действительно беднее чем Python: аналогов FAISS нет, модели локально запускать не умеет. А некоторые и вовсе считают, что он &lt;em&gt;был популярным языком для веб в начале 90-х&lt;/em&gt;, да весь вышел. &lt;/p&gt;&lt;p&gt;Тем не менее, и для него есть модули работы с векторными БД, а модель мы уже вынесли за скобки, в Ollama. &lt;br&gt;Можно было конечно сразу начать с Qdrant, а можно попроще, с sqlite3 с векторным модулем.  &lt;/p&gt;&lt;p&gt;Называется это SQLite::VecDB, и как большинство Perl-модулей устанавливается через CPAN: &lt;/p&gt;&lt;pre&gt;&lt;code&gt;cpan SQLite::VecDB&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Но есть нюанс...&lt;/p&gt;&lt;details&gt;&lt;summary&gt;Почему Perl быстрый и почему он сегодня проигрывает&lt;/summary&gt;&lt;div&gt;&lt;p&gt;Система установки Perl-модулей CPAN сделана с расчетом на то, что модули могут быть написаны как на чистом Perl (PurePerl, PP), так и с использованием вставок на C/C++.&lt;br&gt;Самые распространенные модули входят в дистрибутив ОС и могут быть скачаны в виде готовых архивов, нестандартные - скачиваются исходниками. &lt;br&gt;Если с PP всё понятно - модуль скачался и записан в определенный каталог модулей - то те, которые требуют компиляции - должны быть скомпилированы на целевой системе,  с подключением нужных библиотек. &lt;br&gt;Всё это происходит автоматически, нужно только установить необходимое, типа исходников этих библиотек.  Как правило, они есть в дистрибутиве, нужно только их найти.  &lt;/p&gt;&lt;p&gt;Все модули плотно покрыты автотестами - поэтому если уж у вас установился какой-нибудь XXXXX - это значит, он точно будет работать и будет совместим со всем тем, что у вас понаустановлено. &lt;br&gt;Это хорошо - но это долго. Но зато хорошо.  &lt;/p&gt;&lt;p&gt;В частности, упомянутый модуль требует исходников векторного расширения sqlite3 - и они тоже есть в дистрибутиве, но нужно их найти, установить через пакетный менеджер, вместе с gcc/g++ и прочим. &lt;br&gt;Получается очень быстрая реализация, по факту на С с оберткой на Perl, но всё это требует несколько больше знаний и движений, чем pip install.  &lt;/p&gt;&lt;p&gt;И второй нюанс, на примере этого же пакета: согласно документации (man SQLite::VecDB) есть вариант запуска с использованием специального модуля для работы с Ollama. &lt;br&gt;Теоретически это должно бы упростить работу - но по факту этот самый "упрощающий модуль" требует предустановки еще 100500 других, которые вероятно уже были установлены у разработчика, и он не задумываясь использовал готовые блоки. Code reuse, вот это всё.  &lt;/p&gt;&lt;p&gt;Поэтому, несмотря на то что всё происходит автоматически - оно происходит очень долго (автотесты же, на каждый пакет и чих). &lt;br&gt;Иногда быстрее написать самому вручную - но это всё еще сложнее pip install.&lt;/p&gt;&lt;p&gt;Итог немного предсказуем: быстрый, но более сложный Perl проигрывает... &lt;/p&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;Возвращаясь к нашим баранам: SQLite::VecDB позволяет хранить базу векторов и метаданных в файле sqlite3, а также выполнять по ней поиск.&lt;br&gt;Вектора рассчитывает Ollama, и таким образом удалось наконец всё "переписать на Perl".&lt;/p&gt;&lt;p&gt;Упомянутый модуль для работы с Ollama по сути должен был всего лишь запросить вектор и подставить его куда нужно. &lt;br&gt;Как и говорил - оказалось быстрее написать свой вариант запроса:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;#!/usr/bin/perl
use SQLite::VecDB;
use HTTP::Tiny;
use JSON;
my $dim = 768;
my $model = 'snowflake-arctic-embed2';
my $url = 'http://ollama:11434/api/embed';
my $vdb = SQLite::VecDB-&amp;gt;new(
  db_file    =&amp;gt; '/data/vectors.db',
  dimensions =&amp;gt; $dim,
);
my $coll = $vdb-&amp;gt;collection('documents');
# сохранение в базу
sub add_vector {
  my ($id, $vector, $data, $content) = @_;
  $coll-&amp;gt;add(
    id       =&amp;gt; $id,
    vector   =&amp;gt; $vector,
    metadata =&amp;gt; $data,
    content  =&amp;gt; $content,
  );
}
my $http = HTTP::Tiny-&amp;gt;new(timeout =&amp;gt; 30);
# запрос вектора у Ollama
sub get_vector {
  my ($text) = @_;
  my $payload = {
    model =&amp;gt; $model,
    input =&amp;gt; $text,
    dimensions =&amp;gt; $dim,
  };
  my $json = to_json($payload);
  my $response = $http-&amp;gt;post(
    $url,
    {
        headers =&amp;gt; { 'Content-Type' =&amp;gt; 'application/json' },
        content =&amp;gt; $json,
    }
  );
  if ($response-&amp;gt;{success}) {
    my $data = from_json($response-&amp;gt;{content});
    my $vector = $data-&amp;gt;{embeddings}[0];
    return $vector;
  }
  else{
    print STDERR "Error: $response-&amp;gt;{status} $response-&amp;gt;{reason}\n$response-&amp;gt;{content}\n";
    return undef;
  }
}
# поиск по вектору в базе
sub search_vector {
  my ($vector) = @_;
  my @results = $coll-&amp;gt;search(
    vector =&amp;gt; $vector,
    limit  =&amp;gt; 10,
  );
  my $ret = [];
  for my $r (@results) {
    my $t = {
      id       =&amp;gt; $r-&amp;gt;{id},
      distance =&amp;gt; $r-&amp;gt;{distance},
      content  =&amp;gt; $r-&amp;gt;{content},
      metadata =&amp;gt; $r-&amp;gt;{metadata},
    };
    push(@$ret, $t);
  }
  return $ret;
}
# пример запроса вектора
# my $vector = get_vector('Text1');
# сохранение вектора, метаданных и текста для полнотектового поиска, если надо
# add_vector('ID1', $vector, {file =&amp;gt; 'file1', page =&amp;gt; 12}, 'Text1');
# пример поиска
# my $query = get_vector('Search string');
# search_vector($query);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;И опять прикрутим HTTP-сервер, чтобы можно было к поисковому скрипту, привязанному к файлу sqllite3 и модулям, обращаться из любого места в сети.&lt;br&gt;В Perl, конечно же, есть готовые модули, в том числе достаточно серьезные фреймворки - но тут нужен простой, примитивный веб-сервис, для которого тащить что-то большое - всё равно что стрелять по воробьям из Царь-пушки.&lt;/p&gt;&lt;p&gt;Зато такое можно написать самому как нравится, это довольно просто: &lt;/p&gt;&lt;pre&gt;&lt;code&gt;#!/usr/bin/perl
package MicroHTTPD;
use strict;
use warnings;
use IO::Socket::INET;
use URI::Escape qw(uri_unescape);
use JSON;
# хардкод, но можно переназначить
our $port = 8080;
our $iface = '0.0.0.0';
our $routes = {
  'get'  =&amp;gt; {},         # сюда добавляем функции, вызываемые по GET
  'post' =&amp;gt; {},         # сюда - вызываемые через POST
  'any'  =&amp;gt; {},         # сюда - те, которые можно и так и так.
};
# запуск сервера
sub serve {
  my $server = IO::Socket::INET-&amp;gt;new(
    Local      =&amp;gt; $iface,
    LocalPort  =&amp;gt; $port,
    Listen     =&amp;gt; 10,
    Reuse      =&amp;gt; 1,
  ) or die "Startup error: $!\n";
  print "Server started: http://$iface:$port/\n";
  while (my $client = $server-&amp;gt;accept()) {
    $client-&amp;gt;autoflush(1);
    my $headers = '';
    while (my $line = &amp;lt;$client&amp;gt;) {
      $headers .= $line;
      last if $line eq "\r\n";
    }
    my ($request_line, @header_lines) = split /\r\n/, $headers;
    my ($method, $path, $http_version) =
      $request_line =~ /^(\S+)\s+(\S+)\s+(HTTP\/\d\.\d)$/;
    unless ($method &amp;amp;&amp;amp; $path) {
      send_response($client, 400, "Bad Request", "Incorrect HTTP-request");
      close $client;
      next;
    }
    my %headers;
    for my $line (@header_lines) {
      next unless $line =~ /^([^:]+):\s*(.*)$/;
      $headers{lc $1} = $2;
    }
    my $body = '';
    if ($method eq 'POST') {
     my $content_length = $headers{'content-length'} || 0;
      if ($content_length &amp;gt; 1024 * 1024) {
        send_response($client, 413, "Payload Too Large", "Request body too large");
        close $client;
        next;
      }
      read($client, $body, $content_length);
    }
    if ($method eq 'GET') {
      my ($route, $query_string) = split /\?/, $path, 2;
      my %params = parse_params($query_string || '');
      my $processed = 0;
      for my $r (keys( %{ $routes-&amp;gt;{get} } )){
        if ($route eq $r) {
          my ($ret_body, $ret_headers) = $routes-&amp;gt;{get}-&amp;gt;{ $r }-&amp;gt;( \%params, \%headers );
          send_response($client, 200, "OK", $ret_body, $ret_headers);
          $processed = 1;
          last;
        }
      }
      for my $r (keys( %{ $routes-&amp;gt;{any} } )){
        if ($route eq $r) {
          my ($ret_body, $ret_headers) = $routes-&amp;gt;{any}-&amp;gt;{ $r }-&amp;gt;( \%params, \%headers );
          send_response($client, 200, "OK", $ret_body, $ret_headers);
          $processed = 1;
          last;
        }
      }
      if(!$processed){
        send_response($client, 404, "Not Found", "Method not found");
      }
    }
    elsif ($method eq 'POST') {
      my ($route) = split /\?/, $path, 2;
      my %params = ();
      if($headers{'content-type'} eq 'application/x-www-form-urlencoded'){
        %params = parse_params($body || '');
      }
      if($headers{'content-type'} eq 'application/json' ){
        my $t = from_json($body||'{}');
        %params = %$t;
      }
      my $processed = 0;
      for my $r (keys( %{ $routes-&amp;gt;{post} } )){
        if ($route eq $r) {
          my ($ret_body, $ret_headers) = $routes-&amp;gt;{post}-&amp;gt;{ $r }-&amp;gt;( \%params, \%headers );
          send_response($client, 200, "OK", $ret_body, $ret_headers);
          $processed = 1;
          last;
        }
      }
      for my $r (keys( %{ $routes-&amp;gt;{any} } )){
        if ($route eq $r) {
          my ($ret_body, $ret_headers) = $routes-&amp;gt;{any}-&amp;gt;{ $r }-&amp;gt;( \%params, \%headers );
          send_response($client, 200, "OK", $ret_body, $ret_headers);
          $processed = 1;
          last;
        }
      }
      if(!$processed){
        send_response($client, 404, "Not Found", "Method not found");
      }
    }
    else {
      send_response(
        $client,
        405,
        "Method Not Allowed",
        "Method Not Allowed",
        {
          'Content-Type' =&amp;gt; "text/plain; charset=utf-8",
          'Allow' =&amp;gt; "GET, POST",
        }
      );
    }
    close $client;
  }
}
sub parse_params {
  my ($data) = @_;
  my %params;
  for my $pair (split /&amp;amp;/, $data) {
    my ($key, $value) = split /=/, $pair, 2;
    $key   = uri_unescape($key   // '');
    $value = uri_unescape($value // '');
    $key   =~ tr/+/ /;
    $value =~ tr/+/ /;
    $params{$key} = $value;
  }
  return %params;
}
sub send_response {
  my ($client, $status, $status_text, $body, $headers) = @_;
  $headers-&amp;gt;{'Content-Type'} ||= 'text/plain; charset=utf-8';
  my $response =
      "HTTP/1.1 $status $status_text\r\n"
    . "Content-Length: " . length($body) . "\r\n";
  for my $x (keys(%$headers)){
    $response .= "$x:$headers-&amp;gt;{$x}\r\n";
  }
  $response .=
    "Connection: close\r\n"
    . "\r\n"
    . $body;
  print $client $response;
}
1;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Это модуль микро-HTTP сервера, к которому можно подключить методы на GET и POST запросы. Что и как они будут выполнять - на усмотрение того кто их напишет. Поддерживается параллельное исполнение - в общем, для вебсервиса сойдет.&lt;/p&gt;&lt;p&gt;Подключаем его к поисковому скрипту:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;#!/usr/bin/perl
use lib ".";
use MicroHTTPD;
# $MicroHTTPD::port = 8080;
....
....
# обработчик http для добавления в базу
sub add_text {
  my ($params, $headers) = @_;
  my $text = $params-&amp;gt;{text};
  my $id   = $params-&amp;gt;{id};
  my $data = $params-&amp;gt;{data};
  my $vector = get_vector($text);
  if(defined $vector){
    add_vector($id, $vector, $data, $text);
    return ("OK add vector", {} );
  }else{
    return ("ERR no vector", {} );
  }
}
# обработчик http для поиска по базе
sub search_text {
  my ($params, $headers) = @_;
  my $text = $params-&amp;gt;{text};
  my $vector = get_vector($text);
  if(defined $vector){
    my $ret = search_vector($vector);
    my $json = to_json($ret);
    return ($json, { 'Content-Type' =&amp;gt; 'application/json' } );
  }else{
    return ("[]", { 'Content-Type' =&amp;gt; 'application/json' } );
  }
}
$MicroHTTPD::routes-&amp;gt;{post}-&amp;gt;{'/load'} = \&amp;amp;add_text;
$MicroHTTPD::routes-&amp;gt;{post}-&amp;gt;{'/query'} = \&amp;amp;search_text;
MicroHTTPD::serve();
                                                                             &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Всё это запускается в докер-контейнере, и схема работы получается примерно такая:&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/599/3d9/0c1/5993d90c1174860fd2bb49c23dddfb04.jpg" width="442" height="279"&gt;&lt;/figure&gt;&lt;p&gt;И вот теперь это уже можно подключать куда угодно, хоть написать утилиту командной строки, хоть встроить в вебсистему. &lt;br&gt;Насколько быстро оно работает - за это отвечает Ollama, которая в свою очередь ограничена железом и выбранной моделью.  &lt;br&gt;Но это только программная часть - оказалось, что тут важнее подготовка данных.&lt;/p&gt;&lt;p&gt;Данные&lt;/p&gt;&lt;p&gt; В качестве подопытных были взяты файлы с рецептами, сохраненные примерно сто лет назад, по сути просто копипаста постов с форума.&lt;br&gt;В качестве "поисковых запросов" - несколько коротких фраз, примерно таких, какие я использую в поисковиках.  &lt;/p&gt;&lt;p&gt;Общий принцип: сначала загружаем информацию некоторым образом, затем пытаемся что-то найти. &lt;br&gt;Потом меняем способ загрузки, модели, параметры - и пробуем снова, тот же набор фраз - чтобы потом оценить наглядно разницу. &lt;br&gt;Для еще большей наглядности добавлено что-то типа ASCII-графиков.  &lt;/p&gt;&lt;p&gt;Теория говорит нам, что входящие файлы надо разбить на чанки, и загружать их. &lt;br&gt;Первый вариант - разбить текст на абзацы. &lt;br&gt;Скрипт читает, разбивает, загружает - ОК. &lt;br&gt;Второй скрипт запускает поисковые фразы и сохраняет результаты. &lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/5d4/ac3/1ee/5d4ac31ee2a15dccdec87925165cd6ea.png" width="1099" height="197"&gt;&lt;/figure&gt;&lt;p&gt;Вот например, "хлеб" найден в Чебуреках (0.45), в Картошке в духовке (0.53), в Бисквите (0.63). Чем больше цифра - тем хуже. &lt;br&gt;А "Ремонт велосипедов" - в "Картошке в духовке" несколько раз (0.29-0.39) - хотя оно вообще не по теме. &lt;br&gt;Зато "Шашлык изз баранины" в Бисквите и Чебуреках, и немного найден в Баранине (0.50), хотя там и про баранину и про шашлык. &lt;br&gt;В общем, велосипедов в Картошке с духовкой оказалось больше, чем шашлыка в шашлыке, а "Творожная запеканка" в "Творожной запеканке" вообще не обнаружена. &lt;br&gt;Так-то логично: индексирована живая речь, с эмоциями, восклицаниями и балабольством, что пониманию контекста не способствует.  &lt;/p&gt;&lt;p&gt;Ок, пробуем разбить на предложения. &lt;br&gt;Результат - лучше смотреть на сравнении (слева - по абзацам, справа - по предложениям):&lt;br&gt;Чуть лучше теперь найден шашлык, всё остальное примерно так же или хуже. Тоже логично, шума стало меньше, но контекста больше не стало. &lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/29c/329/e2a/29c329e2a29cfc8546296dabeeb52857.png" width="897" height="570"&gt;&lt;/figure&gt;&lt;p&gt;Но был еще список файлов с описаниями! &lt;br&gt;И вот тут-то оно заработало: ремонт велосипедов остался примерно так же, зато нашлась Баранина и особенно - Творожная запеканка.&lt;br&gt;Ну с ней понятно, там было полное совпадение описания с поисковой фразой. &lt;/p&gt;&lt;p&gt;В общем, результаты последующих опытов показали, что лучше всего работают описания и комментарии, размер которых примерно соответствует размеру поисковой фразы: меньше смыслового шума. &lt;br&gt;На практике же это означает, что нельзя вот так просто взять и всё проиндексировать, нужно сделать краткие аннотации, вот тогда оно работает. &lt;br&gt;Ну или в тексте должны быть постоянные упоминания &lt;em&gt;тематических&lt;/em&gt; слов. &lt;/p&gt;&lt;p&gt;Качество угадывания темы и скорость сильно зависят от модели: одни показывают максимум 4-5 секунд на анализ, другие думают больше 30 секунд. &lt;br&gt;Так же, радикальное уменьшение размерности вектора, с 768 до 256, на тех же данных и тех же запросах дает совсем какую-то незначительную разницу, во втором-третьем знаке после запятой.  &lt;/p&gt;&lt;p&gt;Что ж, это тоже результат: если поиск лучше всего делать по аннотациям - то аннотации можно писать ко всему: к тексту, к документам разных там Вордов, к картинкам, к программным пакетам. &lt;br&gt;Вообще-то некоторые странные люди для этого используют осмысленные имена файлов и каталогов... &lt;/p&gt;&lt;p&gt;Можно прикрутить LLM для того, чтобы он оценивал файлы и давал им имена/описания, но тут упираемся в первоначальное требование: работать локально на том железе которое есть. &lt;br&gt;Протестированные модели хоть и справлялись в принципе с подобной задачей, но результаты сильно напоминали мемные "носки белосвежного вида" или "светчики лампады нити праздника": если знать контекст - можно понять почему так написано, но задача-то наоборот: понять контекст, читая &lt;em&gt;это&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Более-менее с задачей справилась qwen2:    &lt;/p&gt;&lt;p&gt;Скрипт анализа файла &lt;/p&gt;&lt;pre&gt;&lt;code&gt;#!/bin/sh
if [ "x$1" = "x" ] ; then
        exit
fi
fname=$1
text=$(head -15 $fname)
# model: "granite4:350m",
# model: "llama3.2:latest",
jq -n --arg text "$text" '{
  model: "qwen2:1.5b",
  stream: false,
  prompt: (
    "Прочитай этот файл, опиши о чем в нем написано, на русском языке, не будь многословным, составь ответ от 2 до 7 слов, не больше:\n\n" + $text
  )
}'  curl 'http://ollama:11434/api/generate' \
        -H "Content-Type: application/json" \
        -d @-  \
         jq -r '.response'
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Вызываем его примерно таким образом:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash
ROOT_DIR=/source_directory
find "$ROOT_DIR" \
    -type f -print0
while IFS= read -r -d '' file; do
    mime_type=$(file --brief --mime-type -- "$file")
    case "$mime_type" in
        text/* )
            echo "$file"
            info=$( ./describe "$file")
            (
              echo "FILE $file : $mime_type"
              echo "$info"
              echo "========================================"
            ) &amp;gt;&amp;gt; FILE_ID.DIZ
            ;;
        *)
            printf 'Пропуск: %s [%s]\n' "$file" "$mime_type" &amp;gt;&amp;amp;2
            ;;
    esac
done
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Историческая справка: во времена FIDO и BBS пользователи обменивались файлами, заливая на BBS архивы. Чтобы как-то описать, что это там такое в архиве - создавался специальный файл FILE_ID.DIZ, в котором и было написано, что там внутри. &lt;/p&gt;&lt;p&gt;Поскольку тут по сути примерно то же самое - описание файла, данное моделью - его надо было куда-то записать, так почему бы не сюда? Его можно потом смотреть, корректировать и т.д. &lt;br&gt;И храниться оно будет вместе с файлами, а не где-то в базе.  &lt;/p&gt;&lt;p&gt;Остается только прочитать его в систему, для того чтобы искать потом:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;#!/usr/bin/perl
#
use Data::Dumper;
use JSON;
use HTTP::Tiny;
my $url = 'http://dataserver:3333/load';
my $http = HTTP::Tiny-&amp;gt;new(timeout =&amp;gt; 30);
my $file='FILE_ID.DIZ';
open(my $in, $file);
exit if(!defined $in);
my $fname = undef;
my $info = '';
my $id = 0;
while(my $str = &amp;lt;$in&amp;gt;){
  $str =~ s/[\r\n]+/ /gm;
  if(!defined $fname &amp;amp;&amp;amp; $str =~ /^FILE (.+) :/){
    $fname = $1;
  }
  elsif(defined $fname &amp;amp;&amp;amp; $str ne ' '){
    if($str =~ /^=+ $/){
    if($info ne ''){
      $id ++;
      my $d = {
        id   =&amp;gt; $id,
        data =&amp;gt; { file =&amp;gt; $fname},
        text =&amp;gt; $info,
        collection =&amp;gt; 'texts',
      };
      my $json = to_json($d);
      my $response = $http-&amp;gt;post(
        $url,
        {
          headers =&amp;gt; { 'Content-Type' =&amp;gt; 'application/json' },
          content =&amp;gt; $json,
        }
      );
      if ($response-&amp;gt;{success}) {
         print "$response-&amp;gt;{content}\n";
      }
      else{
         print STDERR "Error: $response-&amp;gt;{status} $response-&amp;gt;{reason}\n$response-&amp;gt;{content}\n";
      }
    }
    $fname = undef;
    $info = '';
    }else{
      $info .= $str;
    }
  }
}
close($in);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Теперь достаточно натравить эти скрипты на каталог с какими-то записями, файлам дадут аннотации и загрузят в поисковую систему.&lt;/p&gt;&lt;p&gt;Простейший вариант запроса - ну например, так:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;curl -s -X POST -d text="микроконтроллер stm32" -d collection='texts' 'http://dataserver:3333/query'&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;В результате будет выведен список найденных записей в виде JSON-массива:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;[{"metadata":{"file":"/srv/raid/stm32/README"},"distance":0.409470826387405,"content":"Данный файл содержит команда openocd для загрузки программы на микроконтроллер STM32. Он указывает на использование различных типов транспортных средств, включая DAPdirect SWD и HLA-USB SWD. Загруженный файл firmware.bin находится в диапазоне 0x08000000 и проверяется после его загрузки. ","id":"13"},
{"id":"17","content":"Безуспешная установка драйвера CMSIS-DAP для F0xx с ПИСО, указание скорости адаптера на 1000, создание ПИСО $_CHIPNAME.cpu в сеть Cortex-M. Инициализация памяти устройства с областью 0x20000000 до 0x1000 для восстановления области обновления, установка Flash banks на Flash0 STM32F1x. ","metadata":{"file":"/srv/raid/OCD/OpenOCD"},"distance":0.490307033061981},
...
]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Это можно интегрировать в веб-систему, а можно сделать, например, и такое:&lt;/p&gt;&lt;p&gt;Вот пользуюсь я, скажем, консолью и MidnightCommander в нем, а у MC есть такая фишка - ExternalPanelize, &lt;strong&gt;Ctrl-x !&lt;/strong&gt;: можно вызвать внешнюю команду, которая вернет некоторый список файлов, который в свою очередь будет отображен в окне MC как каталог.  &lt;/p&gt;&lt;p&gt;Если при загрузке файлов в поисковую систему сохраняется также путь к файлу, и файлы эти доступны с машины, например по NFS - то можно написать такой скрипт, который в ответ на запрос выведет список файлов. &lt;br&gt;Тогда они все появятся в одной панели, их можно будет легко просматривать или копировать. &lt;/p&gt;&lt;p&gt;Кроме того, есть еще одна фишка - быстрый просмотр, &lt;strong&gt;Ctrl-x q&lt;/strong&gt; - тогда во второй панели показывается часть содержимого текстового файла. &lt;br&gt;Можно быстро посмотреть, то или не то - прежде чем уже полноценно открывать файл.&lt;/p&gt;&lt;p&gt;К сожалению, вот тут MC не всесилен: в ExternalPanelize можно ввести свою команду, но нельзя сохранить ее так, чтобы она запрашивала строку. &lt;br&gt;Придется вводить вместе со строкой. &lt;/p&gt;&lt;p&gt;Пишем скрипт, назовем его просто Q:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;#!/bin/sh
curl -s -X POST -d text="$@" -d collection='texts' 'http://dataserver:3333/query'  jq -r '.[].metadata.file'&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Теперь при поиске в ExternalPanelize пишем команду, например, &lt;strong&gt;"Q микропроцессор stm32"&lt;/strong&gt; - и получаем список файлов... &lt;br&gt;Не идеально, но &lt;em&gt;и так тоже можно&lt;/em&gt;.
Ну и наконец, про скорость работы всего этого. &lt;br&gt;Самое медленное - работа моделей, тут всё упирается в железо и память. &lt;br&gt;Но вот у меня, в качестве эсперимента, всё работает вообще на дешевом одноплатнике - по скорости сопоставимо с "найти в Гугле". &lt;br&gt;Конечно, несколько параллельных запросов заставят систему выполнять их по очереди, но поскольку всё работает через HTTP - при желании можно разнести несколько запросов по нескольким машинам, отправляя разные на разные. &lt;br&gt;Другой вопрос, что мне дома это не нужно, да и вообще больше эксперимент.&lt;/p&gt;&lt;p&gt;Пока просматривается несколько сценариев применения, где такой поиск может быть удобен...&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/article&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;img alt="Хабр Карьера Курсы" src="https://habrastorage.org/webt/97/0d/9d/970d9d74094c58a7ed44dda9c1d40875.png"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;Хабр Курсы для всех&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt; Большая витрина: от крупнейших школ до частных авторов. Сравнивайте по цене, длительности, формату и выбирайте самый подходящий курс! &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
  &lt;noscript&gt;&lt;p&gt;&lt;img src="https://habr.com/mt/e?idsite=7&amp;amp;rec=1" alt=""&gt;&lt;/p&gt;&lt;/noscript&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">JBFW</dc:creator><pubDate>Sun, 04 Oct 2026 01:44:58 +0000</pubDate><guid>https://habr.com/ru/articles/1090066/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1090066</guid><category>rag</category><category>поиск</category><category>ollama</category><category>perl</category><category>эксперименты</category></item><item><title>От bare metal до managed Kubernetes: разбираем архитектуру Cozystack. Расшифровка митапа в Дубае</title><link>https://habr.com/ru/companies/aenix/articles/1090064/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1090064</link><description>&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;article&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;time datetime="2026-10-04T01:01:27.000Z" title="2026-10-04, 01:01"&gt;1 час назад&lt;/time&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;28 мин&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Репортаж&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div lang="ru"&gt;&lt;div id="post-content-body"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;Как устроен Cozystack и managed Kubernetes на собственном железе&lt;/p&gt;&lt;p&gt;Во время поездки в ОАЭ я случайно попал в &lt;a href="https://t.me/RussianDubaiIT" rel="nofollow"&gt;дубайское IT-комьюнити в Telegram&lt;/a&gt;. Там мы внезапно скоординировались и собрали незапланированный митап. 3 октября встретились в небольшой переговорке в Дубае — получилось душевно, и мы успели обсудить много интересных тем: от Talos и хранилища до сетей и устройства managed Kubernetes.&lt;/p&gt;&lt;p&gt;За помощь с организацией большое спасибо члену нашего комьюнити Artem Goncharenko — &lt;a href="https://t.me/roysbike" rel="nofollow"&gt;@roysbike&lt;/a&gt;. Артём нашёл локацию и скоординировал встречу.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/613/20b/82e/61320b82e08e2cb3bcdb52ed39ab22b7.png" alt="Участники экспромт-митапа Cozystack в Дубае" width="1605" height="980"&gt;&lt;div&gt;&lt;figcaption&gt;Участники экспромт-митапа Cozystack в Дубае&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Экспромт-митап 3 октября 2026 года в Дубае.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;На митапе я рассказывал о Cozystack — открытой платформе для предоставления managed-сервисов на собственном железе. Начали с обзорной презентации, но довольно быстро перешли к вопросам: почему выбрали именно такой storage, зачем нам одновременно Kube-OVN и Cilium, как устроен Kubernetes внутри Kubernetes и где проходит граница между облачной платформой и обычной виртуализацией.&lt;/p&gt;&lt;p&gt;Ниже — отредактированная техническая расшифровка доклада и обсуждения. Я разберу, как связаны Talos, Flux, LINSTOR, Kube-OVN, Cilium, KubeVirt, Kamaji и Cluster API; как пользовательский ресурс превращается в работающий сервис; и почему для managed Kubernetes важно отдельно обслуживать control plane, вычислительные узлы и хранилище.&lt;/p&gt;&lt;h2&gt;Пользователю нужен работающий сервис&lt;/h2&gt;&lt;p&gt;Традиционный сценарий выглядит знакомо: пользователь получает виртуальную машину, устанавливает на неё базу данных, настраивает резервное копирование, мониторинг и всё остальное. Инфраструктура предоставляет вычислительные ресурсы, а эксплуатация приложения остаётся задачей пользователя.&lt;/p&gt;&lt;p&gt;Мы хотим поднять эту абстракцию на уровень выше. Человек заказывает PostgreSQL, Kubernetes-кластер или другой готовый сервис, а платформа берёт на себя его развёртывание и обслуживание.&lt;/p&gt;&lt;p&gt;При этом виртуальные машины никуда не исчезают. Они нужны и как самостоятельный продукт, и как строительный материал для других сервисов. Например, рабочие узлы пользовательского Kubernetes-кластера у нас работают в виртуальных машинах. Но базу данных не обязательно помещать в отдельную VM только потому, что так исторически принято в облаках. Её можно запускать непосредственно в контейнерах, используя операторы и реплицируемое хранилище.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/b9d/8d6/6fe/b9d8d66fe40b001b34127af22298f5f7.png" alt="Каталог приложений Cozystack" width="2046" height="1151"&gt;&lt;div&gt;&lt;figcaption&gt;Каталог приложений Cozystack&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Пользователь выбирает сервис в каталоге; низкоуровневые ресурсы создаёт платформа.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Сложность здесь в слове managed. Установить приложение — только начало. Нужно обеспечить резервное копирование, мониторинг, восстановление после отказов и понятный жизненный цикл. И всё это должно воспроизводимо работать в разных окружениях.&lt;/p&gt;&lt;p&gt;Поэтому Cozystack мы рассматриваем как платформу для managed-сервисов. Kubernetes даёт нам основу, но пользовательский сервис появляется только после того, как мы связываем все необходимые механизмы между собой.&lt;/p&gt;&lt;h2&gt;Самая дорогая часть интеграции&lt;/h2&gt;&lt;p&gt;Когда приходит заказчик, его задача обычно звучит вполне конкретно: нужен сервис, нужна инфраструктура, нужно решить определённую проблему. А самая трудоёмкая часть решения часто прячется между компонентами.&lt;/p&gt;&lt;p&gt;Хранилище должно правильно взаимодействовать с виртуализацией. Сеть — поддерживать миграцию виртуальных машин. Пользовательский Kubernetes — получать диски и балансировщики из нижележащей платформы. Система доступа должна позволять управлять сервисом, не открывая при этом административные возможности всего management-кластера.&lt;/p&gt;&lt;p&gt;Каждая внешняя интеграция увеличивает количество вариантов, которые нужно поддерживать. Поэтому одна из наших целей — уменьшать число внешних зависимостей и собирать платформу так, чтобы её поведение было максимально предсказуемым.&lt;/p&gt;&lt;p&gt;Интеграции с сетью избежать невозможно: платформу в любом случае нужно подключить к сети заказчика. А вот зависимость от внешнего хранилища можно убрать. Если готового storage нет, мы приносим свой LINSTOR и строим хранилище на доступных дисках. Если хранилище уже есть, подключаем его через стандартный механизм CSI. Это позволяет использовать существующую инфраструктуру и при этом не делать её обязательным условием установки.&lt;/p&gt;&lt;p&gt;Это не означает, что мы пишем всё самостоятельно. Наоборот, мы стараемся переиспользовать стандартные Kubernetes-операторы и существующие технологии. Собственная работа сосредоточена на том, как сделать из них единую систему.&lt;/p&gt;&lt;p&gt;На обзорной схеме архитектура разделена на четыре уровня:&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p&gt;&lt;strong&gt;Уровень&lt;/strong&gt;&lt;/p&gt;&lt;/th&gt;&lt;th&gt;&lt;p&gt;&lt;strong&gt;Что на нём находится&lt;/strong&gt;&lt;/p&gt;&lt;/th&gt;&lt;th&gt;&lt;p&gt;&lt;strong&gt;Какую задачу решает&lt;/strong&gt;&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="left"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;Операционная система и железо, Talos Linux&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;Даёт воспроизводимую основу для работы узлов&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="left"&gt;2&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;LINSTOR, сеть, KubeVirt&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;Предоставляет хранение, связность и виртуальные машины&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="left"&gt;3&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;Операторы, Cluster API, мониторинг&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;Обслуживает жизненный цикл приложений и кластеров&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="left"&gt;4&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;Managed Kubernetes, базы данных и пользовательский Kubernetes API&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;Предоставляет готовые сервисы клиенту&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/54e/980/6e7/54e9806e72c150803254ad85df6ab0f3.png" alt="Четыре уровня архитектуры Cozystack" width="2046" height="1151"&gt;&lt;div&gt;&lt;figcaption&gt;Четыре уровня архитектуры Cozystack&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Архитектура Cozystack: от операционной системы и железа до пользовательских managed-сервисов.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="https://github.com/fluxcd/flux2" rel="nofollow"&gt;Flux CD&lt;/a&gt; отвечает за доставку и согласование конфигурации компонентов. Эта схема помогает объяснить, почему интерфейс заказа базы данных — только верхушка системы: ниже должны согласованно работать ещё несколько уровней.&lt;/p&gt;&lt;h2&gt;Talos Linux и конфигурация узлов&lt;/h2&gt;&lt;p&gt;Одна из задач платформы — одинаково работать на разных серверах. Если каждый узел настроен вручную, со временем они начинают различаться: версии пакетов, модули ядра, сетевые настройки. Приходится поддерживать не только платформу, но и историю каждого сервера.&lt;/p&gt;&lt;p&gt;Поэтому мы используем &lt;a href="https://github.com/siderolabs/talos" rel="nofollow"&gt;Talos Linux&lt;/a&gt;. Для нас здесь важна воспроизводимость. Система состоит из подготовленного образа и декларативной конфигурации. Вместо последовательности ручных действий мы описываем состояние, к которому нужно привести машину.&lt;/p&gt;&lt;p&gt;На вопрос «это прежде всего про security?» я отвечал, что для нас ключевой эффект — управляемость и воспроизводимость. Внутри системы работают контроллеры, которые приводят её состояние к заданному. Это та же идея reconciliation, на которой построен Kubernetes.&lt;/p&gt;&lt;h3&gt;Две части конфигурации&lt;/h3&gt;&lt;p&gt;В показанном на слайде YAML есть две основные секции: machine и cluster.&lt;/p&gt;&lt;p&gt;machine описывает конкретную машину: её роль, параметры доступа к Talos API, настройки сети, интерфейсы и диск для установки. На слайде это узел типа control-plane, интерфейс eth0 и установка на /dev/sda.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/576/e3d/652/576e3d6528f5484a07b2f2c4c549aa85.png" alt="Секция machine в конфигурации Talos" width="2046" height="1151"&gt;&lt;div&gt;&lt;figcaption&gt;Секция machine в конфигурации Talos&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;На слайде выделены параметры конкретного узла. Это иллюстрация структуры конфигурации, а не готовый конфиг для копирования.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;cluster описывает Kubernetes-кластер: endpoint control plane, параметры удостоверяющего центра и настройки компонентов Kubernetes. На слайде endpoint — &lt;a href="https://192.168.100.10:6443" rel="nofollow"&gt;https://192.168.100.10:6443&lt;/a&gt;; тот же адрес фигурирует в настройке виртуального IP. Другим узлам нужно знать, к какому кластеру подключаться.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/f6e/f62/5c2/f6ef625c2b7c9c5b9c5d68d2ca34d6c3.png" alt="Секция cluster в конфигурации Talos" width="2046" height="1151"&gt;&lt;div&gt;&lt;figcaption&gt;Секция cluster в конфигурации Talos&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Иллюстрация структуры конфигурации, а не реальный конфиг: сертификаты и ключи заменены пустыми строками, часть секций сокращена. Общие параметры cluster дополняются настройками конкретной machine.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос из зала: как узлы находят друг друга и нужно ли делать bootstrap на каждом?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Bootstrap выполняется один раз, на одном control-plane узле. Остальные машины получают конфигурацию того же кластера и присоединяются к нему. Независимо инициализировать кластер на каждой машине не нужно.&lt;/p&gt;&lt;p&gt;Здесь важно разделять общий адрес API и discovery узлов. В показанной конфигурации VIP 192.168.100.10 даёт устойчивый адрес Kubernetes API: его обслуживает один из control-plane узлов, а при переключении адрес переходит к другому. Discovery через Kubernetes API позволяет Talos получать сведения об участниках уже работающего кластера. Это не заменяет первоначальный bootstrap: сначала должна появиться управляющая часть, к которой можно обращаться.&lt;/p&gt;&lt;h3&gt;Зачем мы сделали Talm&lt;/h3&gt;&lt;p&gt;В виртуальных машинах аппаратная среда относительно однообразна. На bare metal у серверов могут отличаться диски, названия и количество сетевых интерфейсов, схема подключения. Применить одну конфигурацию ко всем узлам без учёта этих различий не всегда получится.&lt;/p&gt;&lt;p&gt;Поэтому мы сделали &lt;a href="https://talm.cozystack.io" rel="nofollow"&gt;Talm&lt;/a&gt;, исходники которого находятся в &lt;a href="https://github.com/cozystack/talm" rel="nofollow"&gt;cozystack/talm&lt;/a&gt;. В описанном на митапе процессе он сначала опрашивает узлы и собирает сведения о машинах, а затем помогает подготовить их конфигурации. Результат можно посмотреть, поправить и применить обратно к узлам.&lt;/p&gt;&lt;p&gt;Таким образом, аппаратные различия учитываются при подготовке конфигурации, а сама установка остаётся воспроизводимой. Мы не исправляем сервер вручную после каждого развёртывания.&lt;/p&gt;&lt;h3&gt;Образ системы и настройки меняются по-разному&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Вопрос из зала: при изменении конфигурации Talos нужно перезагружать узел? А как добавлять модули ядра?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Изменение конфигурации не всегда требует перезагрузки: многие настройки Talos применяет в работающей системе. Обновление образа ОС и состава расширений — другая операция, которая может требовать перезапуска.&lt;/p&gt;&lt;p&gt;Talos использует immutable-образ: системная основа заранее собрана, а нужные для нашей платформы модули подготавливаются вместе с образом. В обычном Linux storage-компонент может запускать DKMS и собирать модуль на каждом узле в рантайме под установленное ядро. Здесь мы переносим эту работу на этап подготовки образа. В результате узлы получают один и тот же проверенный набор компонентов, вместо того чтобы каждый раз собирать его независимо при установке.&lt;/p&gt;&lt;p&gt;Отдельная сложность возникла с проприетарными драйверами NVIDIA. В нашей конфигурации Talos нельзя просто загрузить нужные модули в рантайме: чтобы добавить эти драйверы, приходится перекомпилировать сам Talos. Поэтому сейчас для таких задач мы используем Ubuntu.&lt;/p&gt;&lt;h2&gt;Почему мы выбрали LINSTOR и DRBD&lt;/h2&gt;&lt;p&gt;При выборе хранилища нам была важна не только автоматизация, но и понятная модель того, где находятся данные и как их можно восстановить в случае чего.&lt;/p&gt;&lt;p&gt;Мы используем LINSTOR и DRBD; развёртывание LINSTOR в Kubernetes обслуживает &lt;a href="https://github.com/piraeusdatastore/piraeus-operator" rel="nofollow"&gt;Piraeus Operator&lt;/a&gt;. Здесь полезно разделять их роли. LINSTOR управляет размещением и жизненным циклом томов, а DRBD обеспечивает репликацию блочных устройств. Под ними находятся привычные механизмы хранения, такие как LVM или ZFS.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/89e/4fc/843/89e4fc843da66e91e4aac8092a7ea955.png" alt="Слои хранения LINSTOR" width="2046" height="1151"&gt;&lt;div&gt;&lt;figcaption&gt;Слои хранения LINSTOR&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;LINSTOR управляет стеком хранения, а репликация DRBD работает на уровне ядра.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Поэтому LINSTOR я бы не описывал как прямой аналог Ceph. Это другой подход: управление томами и их репликами поверх стандартных технологий хранения.&lt;/p&gt;&lt;p&gt;Для меня у такой схемы есть существенное преимущество. Даже если сломалась управляющая часть, данные остаются на понятных блочных устройствах. Их восстановление не обязательно начинается с восстановления всей платформы управления. В разговоре я приводил пример с dd: для извлечения данных доступны обычные инструменты работы с блочными устройствами. Это не универсальная инструкция аварийного восстановления, а объяснение того, почему мне важна прозрачная структура хранения. Мне нравится опираться на технологии, поведение которых можно изучить и проверить обычными системными инструментами.&lt;/p&gt;&lt;p&gt;У этого подхода есть ограничения. Например, отдельный том должен помещаться в доступное хранилище узла, на котором размещается его реплика. Нельзя считать суммарное свободное место всех серверов одним большим диском для любого тома.&lt;/p&gt;&lt;p&gt;Зато мы можем выбирать разные варианты хранения для разных нагрузок. Где-то нужна репликация, где-то достаточно локального тома. Пользователю это предоставляется через классы хранения, а платформа решает, как разместить конкретные ресурсы.&lt;/p&gt;&lt;h3&gt;Данные и вычисления нужно размещать вместе&lt;/h3&gt;&lt;p&gt;На митапе спросили: что происходит, если реплики диска находятся на одних серверах, а виртуальная машина запускается на другом?&lt;/p&gt;&lt;p&gt;Это важный вопрос. Такая схема может работать, но создаёт лишний сетевой трафик. Поэтому мало просто иметь реплицируемое хранилище — нужно согласовать размещение данных и вычислительной нагрузки.&lt;/p&gt;&lt;p&gt;У этого два уровня. Сначала планировщик учитывает, где уже находятся реплики тома, и старается разместить Pod или VM на подходящем узле. Для этой задачи используется &lt;a href="https://github.com/piraeusdatastore/linstor-scheduler-extender" rel="nofollow"&gt;LINSTOR scheduler extender&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;В обратную сторону работает &lt;a href="https://linbit.com/drbd-user-guide/linstor-guide-1_0-en/" rel="nofollow"&gt;auto-diskful в LINSTOR&lt;/a&gt;. Если ресурс достаточно долго находится в роли Primary на узле без локальной реплики, LINSTOR может создать там дисковую реплику и синхронизировать данные. Порог задаётся параметром DrbdOptions/auto-diskful. При включённом auto-diskful-allow-cleanup после синхронизации можно удалить лишнюю Secondary-реплику, соблюдая заданное количество копий.&lt;/p&gt;&lt;p&gt;Так мы можем размещать вычисления ближе к существующим данным, а затем адаптировать размещение данных к тому, где действительно работает нагрузка.&lt;/p&gt;&lt;p&gt;Кроме того, требования клиентов бывают разными. Одному нужно разместить всё в пределах одной площадки. Другому — распределить ресурсы между дата-центрами. Это уже часть политики размещения сервиса. Для таких требований у нас есть &lt;a href="https://github.com/cozystack/cozystack-scheduler" rel="nofollow"&gt;cozystack-scheduler&lt;/a&gt; и абстракция SchedulingClass. Требование к размещению задаётся на уровне сервиса; дальше его должен реализовать механизм планирования.&lt;/p&gt;&lt;p&gt;Такие компоненты мы стараемся делать пригодными для отдельного использования. Если решённая задача полезна и за пределами Cozystack, хочется, чтобы результат можно было переиспользовать.&lt;/p&gt;&lt;h2&gt;Виртуальные машины заставили пересмотреть сеть&lt;/h2&gt;&lt;p&gt;Изначально мы пробовали строить сеть на &lt;a href="https://github.com/cilium/cilium" rel="nofollow"&gt;Cilium&lt;/a&gt;. Он хорошо закрывает многие задачи Kubernetes, но при работе с KubeVirt мы столкнулись с требованиями, которые отличаются от обычного контейнерного сценария.&lt;/p&gt;&lt;p&gt;Виртуальная машина — это полноценная гостевая операционная система. Она может сохранять настройки интерфейсов и ожидать стабильную сетевую идентичность. Например, гостевая Ubuntu после первого запуска может привязать конфигурацию к MAC-адресу. Если после перезапуска окружение интерфейса изменилось, внутри VM появляются проблемы, которых пользователь облака совершенно не ожидает.&lt;/p&gt;&lt;p&gt;Другая задача — live migration. Виртуальная машина должна переехать на другой физический сервер, сохранив сетевую связность. Сеть должна позволять это сделать без привязки адреса VM к конкретному узлу.&lt;/p&gt;&lt;p&gt;Для этой части нам подошёл &lt;a href="https://github.com/kubeovn/kube-ovn" rel="nofollow"&gt;Kube-OVN&lt;/a&gt;. Он даёт необходимые механизмы работы с адресами и MAC-адресами и позволяет организовать сеть для перемещения виртуальных машин между узлами.&lt;/p&gt;&lt;p&gt;В отличие от модели с отдельными диапазонами Pod IP, закреплёнными за узлами, нам нужна адресация, допускающая перемещение нагрузки между серверами. Kube-OVN мы используем как сетевой транспорт для Pod'ов и виртуальных машин. Он позволяет сохранить нужную VM сетевую идентичность при её перемещении.&lt;/p&gt;&lt;p&gt;Cilium при этом остаётся для других функций, включая работу с политиками и сервисной сетью. Смысл комбинации — получить подходящий транспорт для виртуальных машин и сохранить полезные механизмы Kubernetes вокруг него.&lt;/p&gt;&lt;h3&gt;Почему нам важно сохранить модель Kubernetes&lt;/h3&gt;&lt;p&gt;Можно было бы объявить стандартную сеть Kubernetes служебной, а всю пользовательскую сеть построить отдельно: через дополнительные интерфейсы и независимые механизмы управления.&lt;/p&gt;&lt;p&gt;Но для нас ценно, чтобы виртуальные машины и сервисы оставались частью общей сетевой модели. Тогда можно переиспользовать политики доступа, обнаружение сервисов и привычные механизмы Kubernetes.&lt;/p&gt;&lt;p&gt;Для нас важно, чтобы управление сетью оставалось частью стандартного Kubernetes API. Мы не хотим изобретать параллельный API, который работает в обход привычных инструментов. Пользователь должен иметь возможность управлять сетевыми ресурсами теми же средствами, которыми он уже управляет остальной инфраструктурой Kubernetes.&lt;/p&gt;&lt;p&gt;Отдельное направление — собственные пользовательские сети с выбираемой адресацией. Здесь недостаточно разрешить клиенту указать любой диапазон IP. У разных клиентов диапазоны могут пересекаться, а нижележащая сеть должна понимать, как доставлять трафик и обеспечивать изоляцию.&lt;/p&gt;&lt;p&gt;На митапе я упоминал CozyPlane — наш проект в этом направлении. Его смысл в том, чтобы предоставить дополнительную сетевую абстракцию, сохранив работоспособность основной сети Kubernetes. На уровне гостевой машины или пользовательской сети может быть собственная адресация, а на уровне хоста — механизм, который связывает её с внешней сетью. На митапе я упоминал трансляцию адресов. Суть в том, чтобы пересекающиеся адреса клиентов не делали маршрутизацию основной сети неоднозначной.&lt;/p&gt;&lt;p&gt;Это развивающаяся часть архитектуры; не все обсуждавшиеся возможности уже доступны пользователям.&lt;/p&gt;&lt;p&gt;Исходники — &lt;a href="https://github.com/lllamnyp/cozyplane" rel="nofollow"&gt;lllamnyp/cozyplane&lt;/a&gt;, пример работы — &lt;a href="https://youtu.be/48GQd6f_t_g" rel="nofollow"&gt;демонстрация CozyPlane&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Как я разделяю сеть Kubernetes&lt;/h2&gt;&lt;p&gt;Вопрос из зала: если пользователь создаёт Service типа LoadBalancer во вложенном Kubernetes, каким образом туда придёт трафик? Чтобы ответить, сначала полезно разделить четыре разных сетевых механизма.&lt;/p&gt;&lt;h3&gt;Сеть физических узлов&lt;/h3&gt;&lt;p&gt;Первый уровень — Node network. Узлы должны обмениваться трафиком через физическую сеть. Это может быть сеть провайдера или собственная схема коммутации и маршрутизации.&lt;/p&gt;&lt;p&gt;Если серверы не могут связаться друг с другом, CNI не исправит саму инфраструктурную проблему. И наоборот: наличие связи между узлами ещё не доказывает, что работает сеть Pod'ов.&lt;/p&gt;&lt;h3&gt;Сеть Pod и роль CNI&lt;/h3&gt;&lt;p&gt;При запуске Pod создаётся отдельное сетевое пространство имён. В типичном показанном на слайде сценарии оно связано с хостом через пару veth. CNI настраивает подключение нагрузки и необходимую связность.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/7d2/c7b/c7f/7d2c7bc7fd4dbecb30a4dab851565290.png" alt="Сеть узлов и сеть Pod" width="900" height="507"&gt;&lt;div&gt;&lt;figcaption&gt;Сеть узлов и сеть Pod&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Физическая связность узлов и связность Pod — два разных уровня. CNI связывает сетевые пространства нагрузок с кластерной сетью.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;В объяснении я отдельно обращал внимание на направления: Pod должен достигать другого Pod, в том числе на другом узле; узлы и Pod'ы также должны взаимодействовать в рамках сетевой модели кластера. Этим Kubernetes отличается от привычной схемы, где гипервизор и гостевые машины живут в полностью отдельных сетях.&lt;/p&gt;&lt;p&gt;Это не означает, что любому источнику разрешён любой доступ. Связность задаёт техническую возможность доставки, а политики ограничивают разрешённые взаимодействия.&lt;/p&gt;&lt;p&gt;Важны и системные нагрузки с hostNetwork. Не всё в Kubernetes запускается в обычной сети Pod'ов: отдельные компоненты используют сеть узла. Поэтому связность между этими уровнями нужна для штатной работы платформы.&lt;/p&gt;&lt;h3&gt;Services не являются отдельной физической сетью&lt;/h3&gt;&lt;p&gt;Теперь представим, что приложение работало в pod3. Pod удалили, на его месте появился pod5, и адрес нового экземпляра изменился. Использовать IP конкретного Pod как постоянный адрес приложения нельзя.&lt;/p&gt;&lt;p&gt;Для этого существует Service: он даёт стабильную точку обращения, а сервисный механизм направляет трафик к актуальным экземплярам приложения. В обычной реализации эту роль выполняет kube-proxy; в другой конфигурации — соответствующий механизм Cilium.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/268/3a3/121/2683a312123085fc93a3f6a47e24be7a.png" alt="Обработка сервиса на узле" width="900" height="507"&gt;&lt;div&gt;&lt;figcaption&gt;Обработка сервиса на узле&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Сервисный механизм работает на узлах и направляет трафик к выбранным Pod. Он не требует единственного центрального сервера для всех Services.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;На слайде эта часть называется Service network. Но это не ещё один физический интерфейс или отдельный VLAN. Это слой адресации и обработки пакетов. Он работает поверх уже существующей связности и позволяет отделить адрес сервиса от жизненного цикла конкретного Pod.&lt;/p&gt;&lt;h3&gt;Как трафик приходит снаружи&lt;/h3&gt;&lt;p&gt;Четвёртая задача — внешняя балансировка. Работающий ClusterIP внутри кластера сам по себе не обеспечивает доступ внешнему клиенту.&lt;/p&gt;&lt;p&gt;В облаке пользователь заказывает Service типа LoadBalancer, а cloud-интеграция создаёт или настраивает внешний балансировщик. Затем трафик направляется в кластер и доставляется к нагрузке.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/cc9/e80/662/cc9e80662fefb166b580f687c1ed140a.png" alt="Внешний балансировщик и сервисный слой" width="900" height="507"&gt;&lt;div&gt;&lt;figcaption&gt;Внешний балансировщик и сервисный слой&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Внешняя балансировка доставляет трафик к кластеру; сервисный слой направляет его к нужной нагрузке.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;На собственном железе такую функцию тоже нужно реализовать. Мы используем MetalLB и интегрируем его с сетью площадки. Внешние адреса могут приходить через L2 или маршрутизируемую схему; это зависит от окружения.&lt;/p&gt;&lt;p&gt;Для вложенного Kubernetes эта задача связывается с нижележащей платформой через cloud controller manager. Пользователь создаёт LoadBalancer в своём API, а управляющий компонент обеспечивает соответствующий ресурс в инфраструктуре. Поэтому «запустить API-сервер Kubernetes» и «предоставить managed Kubernetes с работающим LoadBalancer» — разные объёмы работы.&lt;/p&gt;&lt;p&gt;Проверять эти четыре уровня нужно отдельно: связь узлов, связь Pod'ов, обработку Services и доставку внешнего трафика. Успешная проверка одного уровня ещё не доказывает работоспособность следующего.&lt;/p&gt;&lt;h3&gt;Входящий и исходящий трафик разные истории&lt;/h3&gt;&lt;p&gt;Особенно интересные проблемы появляются, когда у сервера несколько интерфейсов: один для внутренних коммуникаций, другой для хранения, третий для внешней сети.&lt;/p&gt;&lt;p&gt;Входящий пакет может прийти через нужный интерфейс, а ответ — уйти по маршруту по умолчанию через другой. Сам факт успешной доставки запроса ещё не означает, что обратный путь устроен правильно.&lt;/p&gt;&lt;p&gt;Для таких сценариев мы используем policy routing. У нас есть контроллер, который помогает настраивать соответствующие правила на узлах: определённый трафик должен выходить через определённый маршрут и интерфейс.&lt;/p&gt;&lt;p&gt;На узле это означает работу с правилами выбора таблицы маршрутизации и самими маршрутами. Входящий путь и выход по default route не обязаны совпадать, поэтому несколько интерфейсов нельзя считать решённой задачей только после проверки входящего соединения.&lt;/p&gt;&lt;p&gt;Сам контроллер — проприетарный. Механизмы source-based и policy-based routing я раньше разбирал в статье &lt;a href="https://habr.com/ru/companies/aenix/articles/501842/" rel="nofollow"&gt;«Тонкая настройка маршрутизации для MetalLB в режиме L2»&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Пользовательский API поверх Flux&lt;/h2&gt;&lt;p&gt;Следующий вопрос — как дать пользователю возможность заказывать сервисы.&lt;/p&gt;&lt;p&gt;Можно открыть ему ресурсы всех установленных операторов. Но тогда у каждого сервиса будет собственный интерфейс, собственный набор настроек и собственные особенности. Кроме того, некоторые настройки нельзя безопасно отдавать клиенту.&lt;/p&gt;&lt;p&gt;Например, возможность изменить образ контейнера у управляемой базы данных фактически может превратиться в возможность запустить произвольный код в management-кластере. Для внутреннего администратора это обычная настройка, для пользователя облака — уже нарушение границы доступа.&lt;/p&gt;&lt;p&gt;Поэтому мы предоставляем отдельный верхнеуровневый API. В нём пользователь описывает сервис и выбирает те параметры, которые платформа разрешает менять. А низкоуровневые ресурсы операторов остаются частью реализации.&lt;/p&gt;&lt;p&gt;В Kubernetes есть разные способы расширить API. Один из самых известных — CRD и контроллеры. Мы также используем механизм агрегации API: регистрируем собственный API-сервер, который обслуживает определённую группу ресурсов.&lt;/p&gt;&lt;p&gt;Здесь полезная аналогия — metrics-server. Ресурсы его API доступны через Kubernetes API, но обслуживает запросы отдельный компонент. Аналогично мы регистрируем свою API-группу через APIService, и kube-apiserver перенаправляет запросы соответствующему серверу.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/83f/64d/4df/83f64d4df57a39d72b4d47332a39567d.png" alt="Cozystack API Server в Kubernetes Aggregation Layer" width="2046" height="1151"&gt;&lt;div&gt;&lt;figcaption&gt;Cozystack API Server в Kubernetes Aggregation Layer&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Группа &lt;/em&gt;&lt;/strong&gt;&lt;a href="http://apps.cozystack.io" rel="nofollow"&gt;&lt;strong&gt;&lt;em&gt;apps.cozystack.io&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt; обслуживается отдельным API-сервером, который работает с HelmRelease. Операторы и Helm controller продолжают выполнять свои задачи через Kubernetes API.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Поэтому отсутствие CRD для конкретного ресурса в нашей группе не означает, что этот ресурс не существует. В демонстрации я как раз показывал различие: нужно смотреть не только CustomResourceDefinition, но и зарегистрированные APIService.&lt;/p&gt;&lt;p&gt;Пользователь видит обычные Kubernetes-объекты. С ними можно работать привычными инструментами и применять стандартную модель разграничения доступа. Но за ними стоит наша логика представления приложений поверх Flux и HelmRelease.&lt;/p&gt;&lt;p&gt;Путь запроса выглядит так: пользователь создаёт объект сервиса в API Cozystack; наш API связывает его с параметрами приложения и ресурсом Flux; Helm chart разворачивает низкоуровневые объекты; их жизненный цикл обслуживают специализированные операторы.&lt;/p&gt;&lt;p&gt;Это разделение ответственности: API Cozystack определяет, что пользователь вправе заказать, Flux доставляет описание, а оператор приложения отвечает за специфическую логику самого сервиса. Исходный код платформы доступен в &lt;a href="https://github.com/cozystack/cozystack" rel="nofollow"&gt;cozystack/cozystack&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Подробное объяснение этой модели — в &lt;a href="https://habr.com/ru/companies/aenix/articles/832824/" rel="nofollow"&gt;статье о Cozystack API и Kubernetes Aggregation Layer&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Это позволяет не писать отдельный полноценный контроллер развёртывания для каждого нового сервиса. Мы описываем приложение, его допустимые параметры и связь с нижележащими компонентами, а дальше переиспользуем существующие механизмы.&lt;/p&gt;&lt;h3&gt;Каталог приложений должен расширяться независимо от платформы&lt;/h3&gt;&lt;p&gt;Из этого следует ещё одна идея: каталог сервисов не должен навсегда оставаться жёстко зашитым в платформу.&lt;/p&gt;&lt;p&gt;Мы движемся к модели подключаемых репозиториев приложений. Хочется, чтобы можно было собрать собственный набор сервисов, подключить его к Cozystack и предоставлять пользователям через тот же API.&lt;/p&gt;&lt;p&gt;Тогда развитие платформы не сводится к тому, что наша команда самостоятельно добавляет каждое приложение. Появляется основа для экосистемы, в которой другие участники могут упаковывать и предоставлять свои сервисы.&lt;/p&gt;&lt;p&gt;Здесь важно сохранить целостность пользовательского интерфейса. Подключение нового оператора должно сопровождаться описанием того, что именно пользователь заказывает и какие гарантии платформа готова дать.&lt;/p&gt;&lt;h2&gt;Мониторинг и доступ часть готового сервиса&lt;/h2&gt;&lt;p&gt;На обзорных слайдах мониторинг вынесен в отдельный блок, потому что для managed-сервиса он должен появляться вместе с приложением.&lt;/p&gt;&lt;p&gt;Мы предоставляем заранее подготовленные дашборды Grafana, собираем логи и события, интегрируем механизмы реагирования на инциденты. Пользователю не нужно каждый раз начинать с установки системы наблюдения и выяснения, какие метрики вообще есть у заказанного сервиса.&lt;/p&gt;&lt;p&gt;Для базы данных в эту же модель входят управление пользователями и правами, настройка автоматических резервных копий и оповещений. Именно такие возможности превращают установленный оператор в сервис, которым можно пользоваться.&lt;/p&gt;&lt;p&gt;Отдельная часть — управление идентификацией и доступом. В презентации показана интеграция с Keycloak, LDAP, Active Directory и OIDC-провайдерами. Пользователь может иметь доступ к нескольким тенантам, поэтому учётная запись и границы инфраструктурных ресурсов не должны быть одной и той же сущностью.&lt;/p&gt;&lt;p&gt;Это ещё один пример интеграционной работы: мало, чтобы каждое приложение само по себе поддерживало авторизацию. Нужно связать вход пользователя, его права и доступ к нужным сервисам в общую модель платформы.&lt;/p&gt;&lt;h2&gt;Тенанты рекурсивная модель и разные границы изоляции&lt;/h2&gt;&lt;p&gt;В Cozystack мы используем рекурсивную модель тенантов. Есть корневой тенант, внутри него можно создавать другие, разграничивать доступ и размещать приложения.&lt;/p&gt;&lt;p&gt;На уровне реализации тенант связан с Kubernetes namespace. Но namespace сам по себе не отвечает на все вопросы изоляции.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/61e/758/2ca/61e7582ca9841332a80328add4a60d8e.png" alt="Рекурсивная структура тенантов и их компонентов" width="2046" height="1151"&gt;&lt;div&gt;&lt;figcaption&gt;Рекурсивная структура тенантов и их компонентов&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Компоненты могут выделяться на разных уровнях дерева тенантов.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;На слайдах это показано деревом: tenant-root, вложенный tenant-foo и ещё один уровень — tenant-bar. Рядом с тенантами размещены инфраструктурные компоненты и приложения. Так можно показать одновременно организационную структуру и то, какие сервисы выделены на конкретном уровне.&lt;/p&gt;&lt;p&gt;Здесь важно различать &lt;strong&gt;soft multitenancy&lt;/strong&gt; и &lt;strong&gt;hard multitenancy&lt;/strong&gt; — разные требования к границе между тенантами.&lt;/p&gt;&lt;p&gt;В сценарии soft multitenancy пользователи разделяют общую инфраструктуру, а доступ и ресурсы разграничиваются на уровне Kubernetes: namespace, RBAC, квоты и сетевые политики. Например, пользователь заказывает управляемую базу данных. Он управляет разрешёнными параметрами, а платформа запускает известную нам нагрузку с контролируемой конфигурацией.&lt;/p&gt;&lt;p&gt;В сценарии hard multitenancy мы исходим из того, что независимые пользователи могут запускать собственный код: произвольные контейнеры, GitLab или любое другое приложение. Здесь нужна более строгая граница изоляции. Для этого пользователь получает отдельный Kubernetes-кластер с worker-узлами в виртуальных машинах либо отдельную виртуальную машину.&lt;/p&gt;&lt;p&gt;Мы не считаем контейнерную изоляцию достаточной универсальной границей между независимыми пользователями, которым разрешено запускать что угодно. Поэтому административные права внутри пользовательского Kubernetes не означают административных прав в management-кластере.&lt;/p&gt;&lt;h3&gt;Общие сервисы и выделенные компоненты&lt;/h3&gt;&lt;p&gt;Некоторые инфраструктурные функции можно использовать совместно, а некоторые — выделять конкретному тенанту. Например, возникает вопрос: нужен ли ему собственный ingress или отдельная система мониторинга?&lt;/p&gt;&lt;p&gt;Пользователь при этом должен видеть услугу на соответствующем уровне абстракции. Заказывая S3 bucket, он не обязан разбираться, какой именно компонент реализует объектное хранилище. Это решение платформы.&lt;/p&gt;&lt;p&gt;Сетевая изоляция и разрешённые взаимодействия между тенантами обеспечиваются политиками. Здесь снова становится полезной единая сетевая модель: её можно использовать для управления доступом между сервисами.&lt;/p&gt;&lt;h2&gt;Proxmox и модель managed Kubernetes в облаке&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Вопрос из зала: как ты относишься к Talos в виртуальных машинах на Proxmox?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Я много раз видел такой сетап, и мне он нравится. Это вполне рабочая связка, с которой можно идти в production.&lt;/p&gt;&lt;p&gt;Что мне не нравится — когда внутри этих VM появляется инфраструктурное состояние, например SDS-хранилище. В моём понимании Kubernetes-машины должны быть эфемерными: их можно удалить и пересоздать, сохранив данные отдельно. Proxmox ближе к pet-модели, в которой конкретную VM обслуживают как отдельный сервер. Поэтому вопрос не столько в возможности запустить Talos, сколько в том, какие жизненные циклы и зависимости мы создаём.&lt;/p&gt;&lt;p&gt;В традиционной виртуализации администратор часто работает с конкретными физическими серверами и VM. Он видит топологию, выбирает размещение, устанавливает гостевую ОС и дальше обслуживает её как отдельный сервер.&lt;/p&gt;&lt;p&gt;В облачной модели пользователь заказывает ресурсы и сервисы. Ему нужно определённое количество CPU, памяти и диска, а решение о конкретном физическом размещении принимает платформа. При необходимости пользователь задаёт ограничения — например, площадку или класс хранения, — но не обязан вручную связывать каждую VM с дисками и серверами.&lt;/p&gt;&lt;p&gt;Из Proxmox можно строить интеграции для Kubernetes. В разговоре я упоминал CSI-драйвер, который позволяет Kubernetes заказывать тома в такой инфраструктуре. Сам по себе этот драйвер, однако, закрывает только storage-интеграцию: для облачной модели нужны и остальные механизмы.&lt;/p&gt;&lt;p&gt;Упомянутый драйвер — &lt;a href="https://github.com/sergelogvinov/proxmox-csi-plugin" rel="nofollow"&gt;sergelogvinov/proxmox-csi-plugin&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Control plane compute и storage обслуживаются отдельно&lt;/h3&gt;&lt;p&gt;На слайде с типичной схемой Kubernetes в облаке control plane нарисован отдельным блоком, рабочие узлы — отдельными машинами, PersistentVolume — отдельно от них. Внешний балансировщик тоже имеет собственный жизненный цикл.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/1ae/c20/7ed/1aec207edab8ab18fff279add557f599.png" alt="Типичная схема managed Kubernetes в облаке" width="2046" height="1151"&gt;&lt;div&gt;&lt;figcaption&gt;Типичная схема managed Kubernetes в облаке&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Control plane, рабочие узлы, постоянные тома и внешний балансировщик — разные обслуживаемые сущности.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;«Отдельно» здесь означает прежде всего разные жизненные циклы и границы ответственности. Пользовательские данные не должны исчезать при замене worker-ноды, а control plane не должен требовать существования конкретной рабочей машины. Это не требование купить физически отдельное железо для каждого блока схемы.&lt;/p&gt;&lt;p&gt;На слайдах я показывал, что рабочие узлы могут исчезнуть: сначала одна нода, затем несколько, затем все. В облачной модели это штатная ситуация. Control plane и постоянные тома при этом продолжают существовать независимо от worker-нод.&lt;/p&gt;&lt;p&gt;После появления новых worker-нод кластер может снова исполнять нагрузки, используя сохранившиеся данные. Пользовательские приложения, конечно, не работают, пока нет вычислительных узлов, но потеря workers сама по себе не должна означать потерю кластера и его дисков.&lt;/p&gt;&lt;p&gt;Именно поэтому я говорю, что worker-ноды managed Kubernetes должны быть заменяемыми. На них не должно находиться единственное состояние, без которого кластер нельзя восстановить.&lt;/p&gt;&lt;h3&gt;Почему на bare metal сложнее&lt;/h3&gt;&lt;p&gt;В самостоятельном bare-metal кластере легко совместить на одних узлах control plane, пользовательские приложения и локальное хранилище. Такой дизайн может быть оправдан, но при отказе сервера затрагивает сразу несколько уровней системы.&lt;/p&gt;&lt;p&gt;Для managed Kubernetes хотелось бы дать пользователю другую модель: управление кластером обслуживается отдельно, вычислительные узлы можно заменить, а постоянные диски предоставляет нижележащая инфраструктура. Это позволяет обновлять, добавлять и удалять ноды, не превращая каждую операцию в ручное спасение приложения.&lt;/p&gt;&lt;p&gt;У самой платформы всё равно есть физические узлы и связанные с ними отказы. Но мы контролируем набор нагрузок management-кластера и проектируем их под эти условия. А внутри пользовательского кластера предоставляем обычные Kubernetes-интерфейсы: Node, PersistentVolumeClaim, Service, группы рабочих узлов.&lt;/p&gt;&lt;h2&gt;Cluster API и Kubernetes внутри Kubernetes&lt;/h2&gt;&lt;p&gt;Теперь посмотрим, как из одного приложения в каталоге получается пользовательский Kubernetes-кластер.&lt;/p&gt;&lt;p&gt;В Cozystack есть management-кластер, внутри которого работают управляющие компоненты платформы. Пользовательский кластер имеет собственный Kubernetes API и собственные worker-ноды. Административные права пользователя распространяются на его кластер.&lt;/p&gt;&lt;p&gt;Control plane пользовательского кластера мы запускаем с помощью &lt;a href="https://github.com/clastix/kamaji" rel="nofollow"&gt;Kamaji&lt;/a&gt;. Это оператор hosted control planes: компоненты control plane работают как Pod'ы внутри management-кластера. На митапе я показывал такие Pod'ы с контейнерами управляющей части.&lt;/p&gt;&lt;p&gt;Worker-ноды создаются как виртуальные машины через &lt;a href="https://github.com/kubevirt/kubevirt" rel="nofollow"&gt;KubeVirt&lt;/a&gt;. Для пользователя это обычные Kubernetes-ноды, к которым подключается kubelet. Снаружи мы можем видеть соответствующую VM, подключаться к её консоли и управлять её жизненным циклом.&lt;/p&gt;&lt;h3&gt;Приложение создаёт набор декларативных ресурсов&lt;/h3&gt;&lt;p&gt;Пользовательский ресурс Kubernetes в каталоге — верхнеуровневое описание. За ним стоит Helm chart, создающий набор ресурсов, в том числе объекты &lt;a href="https://github.com/kubernetes-sigs/cluster-api" rel="nofollow"&gt;Cluster API&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Cluster API — проект управления жизненным циклом кластеров через Kubernetes API. Его контроллеры работают в management-кластере и следят за декларативными объектами кластеров и машин.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/377/03b/359/37703b359eaadc1947ac588c6009501d.png" alt="Объекты Cluster API и три группы провайдеров" width="2046" height="1151"&gt;&lt;div&gt;&lt;figcaption&gt;Объекты Cluster API и три группы провайдеров&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;На слайде показаны KamajiControlPlane, KubevirtCluster, KubevirtMachineTemplate и KubeadmConfigTemplate. Каждый провайдер обслуживает свою часть модели.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;h3&gt;Три роли провайдеров&lt;/h3&gt;&lt;p&gt;У Cluster API есть три важных для этого объяснения типа провайдеров.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Control plane provider&lt;/strong&gt; отвечает за управляющую часть кластера. В показанной схеме это KamajiControlPlane. Соответствующий &lt;a href="https://github.com/clastix/cluster-api-control-plane-provider-kamaji" rel="nofollow"&gt;провайдер Kamaji&lt;/a&gt; связывает модель Cluster API с hosted control plane.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Infrastructure provider&lt;/strong&gt; отвечает за инфраструктурные объекты — например, виртуальные машины. В нашем случае на схеме показаны KubevirtCluster и KubevirtMachineTemplate, а реализацию предоставляет &lt;a href="https://github.com/kubernetes-sigs/cluster-api-provider-kubevirt" rel="nofollow"&gt;Cluster API Provider KubeVirt&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Bootstrap provider&lt;/strong&gt; подготавливает конфигурацию, с которой созданная машина сможет стать узлом нужного Kubernetes-кластера. На этих слайдах показан KubeadmConfigTemplate.&lt;/p&gt;&lt;p&gt;Именно эту последнюю часть легко пропустить. Создать VM недостаточно: её гостевой системе нужно знать endpoint API-сервера, параметры подключения и способ инициализации kubelet. Bootstrap provider формирует необходимые данные и сохраняет их в Secret, который затем используется при создании машины.&lt;/p&gt;&lt;p&gt;В зависимости от ОС bootstrap-механизм может отличаться. На слайдах я объяснял вариант с kubeadm; у Talos есть &lt;a href="https://github.com/siderolabs/cluster-api-bootstrap-provider-talos" rel="nofollow"&gt;отдельный bootstrap provider&lt;/a&gt;. Эти варианты нельзя смешивать в одну конфигурацию только потому, что сверху у них одинаковый объект Cluster.&lt;/p&gt;&lt;p&gt;В этом и смысл провайдерной модели. Верхние абстракции сохраняются, а реализация нижних уровней меняется. Можно отдельно выбирать, кто обслуживает control plane, где создаются машины и как они подключаются к кластеру.&lt;/p&gt;&lt;h3&gt;MachineDeployment MachineSet и Machine&lt;/h3&gt;&lt;p&gt;Дальше на слайдах я раскрывал цепочку управления рабочими узлами.&lt;/p&gt;&lt;p&gt;MachineDeployment описывает группу машин и желаемое состояние этой группы. Под ним появляется MachineSet, а тот управляет отдельными объектами Machine.&lt;/p&gt;&lt;p&gt;Связь похожа на знакомую модель Deployment → ReplicaSet → Pod, только предмет управления здесь — машины Kubernetes-кластера.&lt;/p&gt;&lt;p&gt;Machine связан с инфраструктурным объектом провайдера. В случае KubeVirt дальше появляются объекты виртуализации: VirtualMachine, работающий экземпляр VirtualMachineInstance и Pod, в котором исполняется виртуальная машина.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/159/a3e/6e4/159a3e6e465a2c17c84ced02b8e8e123.png" alt="От MachineDeployment к Pod виртуальной машины" width="2046" height="1151"&gt;&lt;div&gt;&lt;figcaption&gt;От MachineDeployment к Pod виртуальной машины&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Верхняя цепочка управляет группой Kubernetes-машин; нижняя показывает, как конкретная машина исполняется через KubeVirt.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Это не означает, что гостевой Kubernetes считает свой worker обычным Pod management-кластера. У каждого уровня собственное представление. В management-кластере мы видим объекты Cluster API и виртуализации, а внутри пользовательского — объект Node.&lt;/p&gt;&lt;p&gt;Так можно менять количество машин или их конфигурацию через API, а контроллеры будут приводить инфраструктуру к описанному состоянию. Важно, что сама VM и настройка её присоединения создаются согласованно.&lt;/p&gt;&lt;h3&gt;Один management-кластер обслуживает несколько пользовательских&lt;/h3&gt;&lt;p&gt;На следующей схеме один management-кластер через Cluster API управляет несколькими tenant Kubernetes-кластерами.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/f56/ff8/8e6/f56ff88e69580999bda226c87e17bd7a.png" alt="Management-кластер и пользовательские кластеры" width="2046" height="1151"&gt;&lt;div&gt;&lt;figcaption&gt;Management-кластер и пользовательские кластеры&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Cluster API управляет жизненным циклом кластеров, но cloud-интеграции и дополнительные компоненты нужно настроить отдельно.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;После создания нод работа ещё не закончена. Требуются как минимум cloud controller manager, CSI и Cluster Autoscaler. На слайде они перечислены рядом с вопросом о настройке пользовательских кластеров.&lt;/p&gt;&lt;p&gt;Cluster API создаёт и обслуживает кластерные машины. Но он сам по себе не гарантирует, что пользовательский Service типа LoadBalancer получит внешний адрес или что PVC будет обеспечен диском нижележащей платформы. Для этого нужны соответствующие интеграции.&lt;/p&gt;&lt;h3&gt;Что делают CCM CSI и Cluster Autoscaler&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Cloud controller manager&lt;/strong&gt;, или CCM, связывает Kubernetes с инфраструктурой. В обсуждении мы говорили о двух конкретных задачах: обслуживании LoadBalancer и согласовании состояния нод с существованием виртуальных машин. Если VM больше не существует, соответствующая нода не должна бесконечно оставаться в кластере как потерянный объект. Для KubeVirt есть &lt;a href="https://github.com/kubevirt/cloud-provider-kubevirt" rel="nofollow"&gt;cloud-provider-kubevirt&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;CSI&lt;/strong&gt; обеспечивает работу с постоянными дисками. Пользователь создаёт PVC внутри своего кластера, а интеграция должна выделить и подключить том, предоставляемый нижележащей инфраструктурой. Здесь используется &lt;a href="https://github.com/kubevirt/csi-driver" rel="nofollow"&gt;KubeVirt CSI driver&lt;/a&gt;. На митапе я также упоминал файловые тома ReadWriteMany: для них используется схема с NFS-сервером, которую обслуживает платформа.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Cluster Autoscaler&lt;/strong&gt; меняет количество worker-нод в соответствии с потребностями кластера и возможностями групп машин. Чтобы пользователь получил реальное увеличение вычислительных ресурсов, он должен быть связан с механизмом создания нод, а не просто видеть неразмещённые Pod'ы.&lt;/p&gt;&lt;p&gt;Это разные контроллеры и разные задачи. Они вместе превращают запущенный Kubernetes в облачный сервис.&lt;/p&gt;&lt;h3&gt;Где исполняются управляющие компоненты&lt;/h3&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/785/b1c/cd7/785b1ccd751fc35ff792d233bdd2d8b4.png" alt="Размещение компонентов managed Kubernetes" width="2046" height="1151"&gt;&lt;div&gt;&lt;figcaption&gt;Размещение компонентов managed Kubernetes&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Управляющие компоненты располагаются со стороны платформы; CNI и node-часть CSI работают на пользовательском worker.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Такое размещение важно для границы доступа. Пользователь является администратором своего Kubernetes. Если принести туда секреты для управления management-кластером, он потенциально сможет ими воспользоваться.&lt;/p&gt;&lt;p&gt;Поэтому компонент, которому нужны права на нижележащую инфраструктуру, можно оставить снаружи пользовательского кластера. Он обращается к нужным API, но его инфраструктурные credentials не становятся обычным Secret в среде, полностью подконтрольной клиенту.&lt;/p&gt;&lt;p&gt;Node-часть CSI при этом должна работать рядом с workload и подключать диски на узле. CNI тоже настраивает сеть на worker. То есть «вынести контроллеры наружу» не означает, что внутри пользовательского кластера вообще нет служебных компонентов.&lt;/p&gt;&lt;p&gt;Доставку конфигурации и компонентов мы связываем через Flux. На слайдах отдельно показано, что часть ресурсов применяется в management-кластере, а часть — в tenant-кластере. Место выполнения определяется тем, какие API и какие права нужны компоненту.&lt;/p&gt;&lt;p&gt;Пользователь в итоге получает kubeconfig, обычный Kubernetes API, постоянные тома и работающие балансировщики. А платформа обслуживает цепочку от его декларативного заказа до Pod'ов control plane, рабочих VM и инфраструктурных интеграций.&lt;/p&gt;&lt;h2&gt;Установка в закрытом контуре&lt;/h2&gt;&lt;p&gt;Ещё один практический вопрос — можно ли установить платформу без доступа к внешним сервисам.&lt;/p&gt;&lt;p&gt;Для деплоя платформы в air-gap единственная внешняя зависимость — хранилище образов и артефактов, например Nexus. «Внешняя» здесь означает внешняя по отношению к Cozystack: сам registry может находиться внутри закрытого контура и не иметь доступа в интернет.&lt;/p&gt;&lt;p&gt;Мы заранее доставляем туда необходимые образы и артефакты, а конфигурацию направляем на этот источник. Talos поддерживает зеркала registry, а артефакты развёртывания можно распространять через OCI registry. Так установка не зависит от доступности набора внешних репозиториев и сервисов.&lt;/p&gt;&lt;h2&gt;Учёт ресурсов отдельный слой&lt;/h2&gt;&lt;p&gt;Для хостинга и сервис-провайдера мало дать пользователю возможность заказать VM или базу данных. Нужно ещё понимать, сколько ресурсов он использовал.&lt;/p&gt;&lt;p&gt;В Enterprise-версии у нас есть компонент учёта потребления, который предоставляет отчёты через Kubernetes API. На слайдах видно, как это устроено: клиент отправляет UsageReport в группе billing.aenix.io/v1alpha1, а billing-apiserver обращается к VictoriaMetrics.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/e7c/571/f89/e7c571f89ce1f965771a2520727088b5.png" alt="Запрос отчёта о потреблении ресурсов" width="2046" height="1151"&gt;&lt;div&gt;&lt;figcaption&gt;Запрос отчёта о потреблении ресурсов&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Запрос задаёт tenant, workload и временной интервал через startTimestamp и endTimestamp.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;В ответе появляется report.consumers: записи связаны с тенантом, конкретной нагрузкой, её типом и интервалом. Внутри consumptions перечислены количества ресурсов. В примере это vCPUHours, MemoryGiBHours и EphemeralStorageGiBHours — ресурсы с учётом времени, а не просто мгновенный снимок CPU и памяти.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/b20/179/0af/b201790afc70d90beff18c31e785fcf1.png" alt="Ответ API с потреблением отдельных нагрузок" width="2046" height="1151"&gt;&lt;div&gt;&lt;figcaption&gt;Ответ API с потреблением отдельных нагрузок&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Отчёт содержит потребление ClickHouse и worker-машины managed Kubernetes.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;На митапе я отдельно оговорил: учёт потребления и полноценный финансовый биллинг — не одно и то же. Компонент может сообщить, какие ресурсы существовали и использовались за определённое время. Но тарифы, выставление счетов и расчёты с клиентами — следующий слой.&lt;/p&gt;&lt;p&gt;Такое разделение позволяет использовать одни и те же данные в разных коммерческих моделях, не встраивая всю бизнес-логику оплаты в управление инфраструктурой.&lt;/p&gt;&lt;p&gt;Также мы обсуждали возможность предоставлять больше компонентов непосредственно внутри пользовательских кластеров через аналогичный каталог. Это продолжение той же идеи: описывать сервисы единообразно и переиспользовать механизм их предоставления на разных уровнях.&lt;/p&gt;&lt;h2&gt;Bare-metal provisioning&lt;/h2&gt;&lt;p&gt;Для предоставления физических серверов рассматриваем &lt;a href="https://github.com/tinkerbell/tinkerbell" rel="nofollow"&gt;Tinkerbell&lt;/a&gt;. Это отдельная задача: управлять подготовкой машины, установкой системы и передачей её пользователю. На момент разговора этот сценарий не был готовой реализованной функцией платформы.&lt;/p&gt;&lt;h2&gt;GPU проброс, контейнеры и совместное использование&lt;/h2&gt;&lt;p&gt;В задачах с GPU важно различать проброс устройства в виртуальную машину, использование GPU контейнерными нагрузками и разделение устройства на части. В разговоре я упоминал &lt;a href="https://github.com/Project-HAMi/HAMi" rel="nofollow"&gt;HAMi&lt;/a&gt;: он предоставляет механизмы совместного использования GPU контейнерными нагрузками через Kubernetes. Это другой уровень, чем передача GPU виртуальной машине. Наличие одного механизма не означает автоматической поддержки всех остальных. Здесь остаются вопросы к драйверам, аппаратным возможностям и конкретному способу интеграции.&lt;/p&gt;&lt;p&gt;Практические шаги описаны в документации Cozystack: &lt;a href="https://cozystack.io/docs/v1.6/virtualization/gpu/" rel="nofollow"&gt;GPU passthrough для виртуальных машин&lt;/a&gt; и &lt;a href="https://cozystack.io/docs/v1.6/operations/gpu-container-workloads/" rel="nofollow"&gt;GPU для контейнерных нагрузок&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Как мы работаем с заказчиками&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Вопрос из зала: что именно вы поддерживаете и как устроена работа с заказчиком?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Мы предоставляем поддержку решения целиком: Cozystack, его компонентов и их интеграции в инфраструктуру заказчика. Нас интересует работоспособность всей системы, поэтому поддержка охватывает и то, как платформа взаимодействует с хранилищем, сетью и остальным окружением.&lt;/p&gt;&lt;p&gt;При этом мы заранее разделяем ответственность: договариваемся, какую часть инфраструктуры обслуживаем мы, а какая остаётся у команды заказчика. Для согласованного объёма предоставляем поддержку с гарантиями по SLA — SLA-guaranteed support.&lt;/p&gt;&lt;p&gt;Задача такой модели — закрыть инфраструктурные вопросы, чтобы инженеры заказчика могли сосредоточиться на бизнес-логике своих приложений. Мы занимаемся внедрением, адаптацией решения и его поддержкой, а команда развивает продукт, ради которого эта инфраструктура и нужна.&lt;/p&gt;&lt;h2&gt;AI ускорил разработку. Как теперь проверять результат &lt;/h2&gt;&lt;p&gt;В конце митапа разговор неожиданно ушёл от сетей и хранилища к организации разработки. Но для инфраструктурного проекта это вполне связанная тема.&lt;/p&gt;&lt;p&gt;Мы активно используем AI-инструменты, и это очень сильно повысило производительность команды.&lt;/p&gt;&lt;p&gt;Вместе со скоростью изменилось и узкое место. Написать код становится проще, а определить, что именно нужно сделать, правильно спроектировать изменение и проверить результат — по-прежнему сложно.&lt;/p&gt;&lt;p&gt;Особенно в инфраструктуре. Ошибка здесь может проявиться только при отказе узла, редкой последовательности событий или восстановлении после сбоя. Убедительный код и успешный простой запуск ещё не доказывают, что механизм корректен.&lt;/p&gt;&lt;p&gt;Мы используем несколько способов проверки: ревью людьми, проверки с помощью AI, анализ бизнес-логики и отдельную проверку самого кода. Также экспериментируем с сочетанием агентного ревью и статического анализа. Но я не могу сказать, что у нас уже есть окончательное решение проблемы AI-ревью. Мы тоже продолжаем искать работающий процесс.&lt;/p&gt;&lt;p&gt;Один из упомянутых открытых проектов — &lt;a href="https://github.com/lexfrei/ccc" rel="nofollow"&gt;lexfrei/ccc&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Ответственность при этом остаётся у людей. Автор изменения и тот, кто его проверяет, должны понимать, почему решение корректно. Если код написан с помощью агента, это не освобождает от необходимости проверить интерфейсы, поведение и последствия изменения.&lt;/p&gt;&lt;p&gt;Внутри команды есть люди, отвечающие за определённые направления. Например, важно, чтобы кто-то последовательно следил за устройством API и соответствием его Kubernetes-модели, а не только за тем, решает ли отдельный патч локальную задачу.&lt;/p&gt;&lt;p&gt;Мы также смотрим в сторону организации работы через Special Interest Groups (SIG) по постоянным направлениям и временные Working Groups под конкретные бизнес-задачи. У направления есть ответственность за свою часть системы; у проекта — задача собрать нужных участников и довести изменение до результата.&lt;/p&gt;&lt;p&gt;Для планирования работы мы используем &lt;a href="https://aeman.aenix.io/" rel="nofollow"&gt;Aeman&lt;/a&gt; — нашу доску поверх GitHub Projects. Она помогает видеть задачи конкретного инженера и команды, определять приоритеты и связывать ежедневную работу с бизнес-задачами.&lt;/p&gt;&lt;p&gt;У Aeman есть MCP-интерфейс, поэтому в планировании участвуют и AI-агенты: через него можно работать с задачами и обновлять план. Подробнее о том, как мы это устроили, рассказали в &lt;a href="https://habr.com/ru/companies/aenix/articles/1062562/" rel="nofollow"&gt;статье на Хабре&lt;/a&gt;; исходный код доступен на &lt;a href="https://github.com/aenix-io/aeman" rel="nofollow"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Где посмотреть код и продолжить обсуждение&lt;/h2&gt;&lt;p&gt;Платформа развивается открыто. Cozystack находится в CNCF Sandbox, и для нас важно участие других компаний и независимых разработчиков. Хочется, чтобы продукт мог развиваться шире одной команды и одного коммерческого предложения.&lt;/p&gt;&lt;p&gt;Исходный код платформы — &lt;a href="https://github.com/cozystack/cozystack" rel="nofollow"&gt;github.com/cozystack/cozystack&lt;/a&gt;, сайт проекта — &lt;a href="http://cozystack.io" rel="nofollow"&gt;cozystack.io&lt;/a&gt;. В тексте выше оставлены ссылки на отдельные технологии и провайдеры, чтобы можно было перейти от схемы к их реализации.&lt;/p&gt;&lt;p&gt;Присоединиться к встречам и найти  можно на &lt;a href="https://cozystack.io/community/" rel="nofollow"&gt;странице сообщества Cozystack&lt;/a&gt;. Формат встреч и порядок добавления тем описаны в &lt;a href="https://github.com/cozystack/community/blob/main/community_meeting.md" rel="nofollow"&gt;community_&lt;/a&gt;&lt;a href="http://meeting.md" rel="nofollow"&gt;meeting.md&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/article&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;Хабр Курсы для бэкендеров&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">kvaps (Ænix)</dc:creator><pubDate>Sun, 04 Oct 2026 01:01:27 +0000</pubDate><guid>https://habr.com/ru/companies/aenix/articles/1090064/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1090064</guid><category>cozystack</category><category>kubernetes</category><category>linstor</category><category>baremetal</category><category>sds</category><category>sdn</category><category>управление разработкой</category><category>opensourse</category><category>talos linux</category><category>cilium</category></item><item><title>Сколько же близких звёзд мы проглядели?</title><link>https://habr.com/ru/articles/1090062/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1090062</link><description>&lt;noscript&gt;&lt;img src="https://rap.skcrtxr.com/pub/pix/6d50f267-2651-4124-9cd9-efe28260780b" alt=""&gt;&lt;/noscript&gt;
&lt;noscript&gt;&lt;img src="https://rap.skcrtxr.com/pub/pix/eb6dfc0d-e790-4b42-80f5-37bc1011fed5" alt=""&gt;&lt;/noscript&gt;
&lt;noscript&gt;&lt;img src="https://rap.skcrtxr.com/pub/pix/11eaa56c-381b-421c-a6c9-b9d15c17c3b9" alt=""&gt;&lt;/noscript&gt;
    &lt;div id="mount"&gt;&lt;div id="app"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;svg height="24" width="24"&gt;Обновить&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;article&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;a href="https://habr.com/ru/users/wmlab/" rel="nofollow"&gt;&lt;div&gt;&lt;img alt="" height="24" src="https://assets.habr.com/habr-web/release_2.352.2/client/img/avatars/132.png" width="24"&gt;&lt;/div&gt;&lt;/a&gt;&lt;span&gt;&lt;a href="https://habr.com/ru/users/wmlab/" rel="nofollow"&gt;wmlab&lt;/a&gt;&lt;span&gt;&lt;time datetime="2026-10-04T00:38:57.000Z" title="2026-10-04, 00:38"&gt;1 час назад&lt;/time&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;svg height="24" width="24"&gt;Уровень сложности&lt;/svg&gt;&lt;/span&gt;&lt;span&gt;Простой&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;svg height="24" width="24"&gt;Время на прочтение&lt;/svg&gt;&lt;/span&gt;&lt;span&gt;7 мин&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div lang="ru"&gt;&lt;div id="post-content-body"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/32a/923/94c/32a92394c6b89b805bdd5be6c264d8ee.webp" alt="инфракрасный обзор неба, WISE" title="инфракрасный обзор неба, WISE" width="780" height="373"&gt;&lt;div&gt;&lt;figcaption&gt;инфракрасный обзор неба, WISE&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Спросите любого образованного человека, далёкого от астрономии, какая звезда ближайшая к Солнцу, и он ответит, не задумываясь: «Альфа Центавра, конечно!» Воспетая фантастами и популяризаторами науки первая остановка за пределами Солнечной системы! Те, кто в теме, уточнят, что это не одна звезда, а три: A, B и Проксима, или «Ближайшая» на латыни. А какая вторая? Навскидку, без гугла, википедии и ChatGPT, немногие вспомнят звезду Барнарда, самую быстродвижущуюся звёздочку на нашем небосводе, хотя и очень тусклую. А какая третья? Кто-то вытащит из закоулков памяти Вольф 359, упомянутый в «Стартреке», и ошибётся. Потому что Вольф уже не третий и даже не четвёртый. Вот только-только обнаружены почти невидимые в оптические телескопы чёрные солнца — «коричневые карлики», как их называют астрономы, которые не светят, но греют. Обнаружены случайно, среди старых инфракрасных панорам неба, на домашних ноутбуках. А ведь писали фантасты про них, давно писали: и Ефремов в «Туманности Андромеды» (помните Железную звезду?), и Гуревич в «Инфра Дракона». Пусть в этих системах почти нет света, зато тепло, а где есть тепло, может существовать и жизнь. И кто его знает, сколько ещё чёрных звёзд в окрестностях Солнца прячется до поры? Может, они совсем рядом, ближе Ближайшей, и лететь далеко не придётся?&lt;/p&gt;&lt;p&gt;Главу о звёздах в учебниках астрономии не переписывали почти век. С 1916 года, когда Эдвард Барнард открыл свою «летящую звезду», список ближайших соседей Солнца казался отлитым в бронзе: тройная Альфа Центавра (4,37 светового года), одинокий тусклый красный карлик Барнарда (5,96) и Вольф 359 (7,86). Если что-то и могло прятаться у нас под носом незамеченным, то разве что ледяные булыжники облака Оорта.&lt;/p&gt;&lt;p&gt;И вдруг в марте 2013 года, прямо между звездой Барнарда и Вольфом 359, на дистанции 6,5 светового года (всего два парсека, Карл!), обнаружили новую звёздную систему. Это было всё равно что посреди оживлённого Ла-Манша наткнуться на неупомянутый в лоциях архипелаг. Кевин Луман из Пенсильванского университета методично перелопачивал терабайты архивов инфракрасного телескопа WISE. WISE крутился на околоземной орбите с декабря 2009-го по февраль 2011 года и дважды отснял всё небо в среднем инфракрасном диапазоне. Луман сравнивал снимки, сделанные с разницей в полгода. Из-за параллакса и собственного движения близкие к нам звёзды ползут по небесной сфере заметно быстрее далёких. В созвездии Парусов Луман засёк тусклый объект, который нёсся по небу со скоростью 2,79 угловой секунды в год. Просто чтобы оценить скорость: открытое небесное тело пересекло бы видимый диск Луны всего за 650 лет. Быстрее на всём небосводе несутся лишь считанные единицы звёзд во главе со звездой Барнарда.&lt;/p&gt;&lt;p&gt;Почему же мы его не замечали? В оптическом диапазоне объект практически невидим. Когда, уже зная точные координаты, астрономы подняли старые фотопластинки, вскрылся конфуз: система десятилетиями позировала на обзорных снимках! Её нашли и на фотопластинках Паломарского обзора 1978 года, и в коллекциях Schmidt, DENIS и 2MASS. Призрак маячил у нас перед глазами тридцать пять лет, но на него никто не обращал внимания, он выглядел слабой точкой на пределе видимости, больше похожей на дефект эмульсии.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/824/9b4/9c8/8249b49c8a73aae926d564045e4c9d81.jpg" alt="Luhman 16 A&amp;amp;B" title="Luhman 16 A&amp;amp;B" width="2233" height="2236"&gt;&lt;div&gt;&lt;figcaption&gt;Luhman 16 A&amp;amp;B&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Когда на объект навели тяжеловес VLT, точка распалась надвое. Так мы познакомились с нашими соседями — двойной системой Luhman 16 (A и B). Строго говоря, это не совсем звёзды. Это пара коричневых карликов — космических неудачников, застрявших между планетами-гигантами и настоящими звёздами. Больший в паре весит как 35 Юпитеров, его меньший брат тянет на 29. Чтобы в недрах протозвезды запустился термоядерный синтез, газовому шару требуется накопить минимум 75–80 масс Юпитера. Братья не собрали и половины нужного веса. Единственное, на что их хватило в ранней юности, так это на короткую вспышку горения дейтерия. Но его запасы ничтожны, они прогорели за считанные миллионы лет, слегка подогрев обоих, и на этом всё.&lt;/p&gt;&lt;p&gt;В их спектрах чётко прорисовались линии поглощения лития. В настоящих звёздах конвекция уносит литий в ядро, где он мгновенно сгорает. Если в спектре карлика есть литий, значит, термоядерный реактор в его недрах так и не заработал. Тем не менее холодными эти миры назвать нельзя. Температура поверхности 16A — примерно 1000 °C, 16B — около 900 °C. Вблизи они выглядят как слабо тлеющие угли размером с Юпитер. Среди коричневых карликов вообще не принято расти в размерах при увеличении массы, они просто становятся плотнее.&lt;/p&gt;&lt;p&gt;На телескопе VLT удалось составить даже первую в истории карту погоды за пределами Солнечной системы. Атмосферы коричневых карликов оказались бурлящим адом: там бушуют циклопические ураганы размером с земные материки, небо затянуто облаками из силикатов, паров железа и расплавленного энстатита, в верхних слоях атмосферы металл остывает, конденсируется и выпадает чугунными ливнями.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/bbd/b09/d18/bbdb09d1891fb18d68c9ee3e9ccc821a.jpg" alt="реальный скан облачности" title="реальный скан облачности" width="700" height="495"&gt;&lt;div&gt;&lt;figcaption&gt;реальный скан облачности&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;И эта система была только первой ласточкой в серии открытий. Спустя всего год, в апреле 2014-го, окрылённый успехом Луман в тех же данных WISE отыскал четвёртого по близости соседа Солнца — объект WISE 0855−0714 на расстоянии 7,2 светового года. Это одинокий коричневый карлик массой всего 10 Юпитеров, чья температура колеблется от –50 до –10 °C, а, скорее, планета-гигант, летящая в межзвёздной пустоте и укутанная облаками из настоящего водяного льда.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/getpro/habr/upload_files/7ee/f5f/b3b/7eef5fb3b06399b1109ce079925de822.gif" alt="WISE 0855−0714" title="WISE 0855−0714" width="960" height="626"&gt;&lt;div&gt;&lt;figcaption&gt;WISE 0855−0714&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Окрестности Солнца оказались набиты призрачными мирами. Казалось бы, раз уж мы проморгали пару звёздных систем в двух шагах от дома, пора расчехлить наш флагман — «Джеймс Уэбб», тем более что он как раз специализируется на инфракрасном диапазоне. Пусть он методично осмотрит ближний космос! Но вот парадокс: наш самый продвинутый телескоп для этой задачи непригоден. «Уэбб» — это снайперская винтовка, а не радар кругового обзора. Его камера NIRCam видит лишь крошечный пятачок неба размером в две с половиной угловые минуты; это всё равно что разглядывать ночной небосвод через соломинку для коктейля. «Уэбб» уже наблюдал Luhman 16, зная его точные координаты: анализировал спектры бегущих облаков и пытался разглядеть экзопланеты. Чтобы просканировать «Уэббом» всё небо в поисках неизвестных соседей, потребовались бы тысячи лет непрерывных наблюдений.&lt;/p&gt;&lt;p&gt;У нас уже есть архив телескопа WISE, успевшего перед поломкой охладителя отснять почти 8 миллионов кадров по всему небосводу. Беда в другом: данных на серверах осело под сто терабайт, а профессиональных астрофизиков на планете всего несколько тысяч. Прогнать весь этот океан снимков через алгоритмы распознавания пытались не раз, но неудачно: слишком много было ложных срабатываний от шумов матрицы, дифракционных лучей ярких звёзд и оптических бликов.&lt;/p&gt;&lt;p&gt;Тогда NASA решилось на беспрецедентный шаг: позвало на помощь армию любителей. В феврале 2017 года агентство запустило проект Backyard Worlds: Planet 9 («Миры на наших задворках: Девятая планета»). Скачанное приложение показывало короткую анимацию из четырёх инфракрасных кадров одного и того же участка неба. Фон из сотен неподвижных звёзд вычитался, а пользователю оставалось лишь вглядываться в экран и искать точку, которая слегка смещалась между кадрами. Это был триумф распределённого анализа. Армия из 150 тысяч энтузиастов со всего мира, школьников, пенсионеров, бухгалтеров, таксистов, всех, кто хоть немного интересовался космосом, сделала то, на что у профессионалов ушли бы десятилетия.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/60e/65c/fb6/60e65cfb6f5ea83a826da6880c6c3a13.jpg" alt="интерфейс приложения" title="интерфейс приложения" width="1181" height="479"&gt;&lt;div&gt;&lt;figcaption&gt;интерфейс приложения&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Листая снимки в свободное время, энтузиасты открыли больше 4000 невидимых глазу объектов. Один из них, холодный субкарлик Ross 19B, нашли одновременно четверо — обычные парни, никогда не смотревшие в телескоп, в одночасье стали соавторами статьи в The Astrophysical Journal. Другой любитель выловил уникальный объект, получивший прозвище «Случайный» — древнейший коричневый карлик возрастом в 10 миллиардов лет, несущийся сквозь нашу Галактику со скоростью 200 километров в секунду.&lt;/p&gt;&lt;p&gt;Значит ли это, что теперь-то окрестности Солнца тщательно осмотрены? Ничуть. Даже меньше, чем на четверть. Ведь метод сравнительных снимков держится на двух фундаментальных допущениях: тело обязано излучать достаточно тепла и обязано быстро смещаться. А если звезда холодная? А если звезда несётся не поперёк нашего взгляда, а почти вдоль луча зрения — прямо на нас или от нас? Тогда на покадровой анимации такой объект не сдвинется вовсе и не продемонстрирует тот единственный признак, по которому его ищут.&lt;/p&gt;&lt;p&gt;Когда-то, совсем недавно, в восьмидесятых, подозревали наличие у Солнца невидимого компаньона — гипотетической Немезиды, тусклого коричневого или красного карлика, гравитационно связанного с нашей звездой и кружащего где-то на далёких задворках, в облаке Оорта, на расстоянии в один-два световых года. Была популярна гипотеза, что именно Немезида раз в 26 миллионов лет, ныряя в рой комет, выбивает их в сторону Земли и устраивает нам очередное великое вымирание.&lt;/p&gt;&lt;p&gt;Поиск по инфракрасным картам эту гипотезу опроверг: нет, столь массивного спутника у Солнца нет. Любой газовый гигант массой с Юпитер исключён вплоть до расстояния в 82 000 а.е. (примерно 1,3 светового года). Объект поменьше, размером с Сатурн, не может прятаться ближе 28 000 а.е. (0,44 светового года). &lt;/p&gt;&lt;p&gt;Но между внешней границей этого поиска и Проксимой лежит бездна протяжённостью в три световых года, и там добровольцы на снимках WISE не разглядели ничего. Пара Luhman 16, находящаяся гораздо дальше, весит как три десятка Юпитеров и всё ещё пылает жаром в тысячу градусов, сияя в инфракрасных лучах как маяк. А вот холодные или небольшие миры, тела, летящие вдоль луча зрения, с помощью архива WISE не отыскать. И там, дальше светового года от нас, может скрываться всё что угодно.&lt;/p&gt;&lt;p&gt;Небо с тех пор не переснималось ни разу, все что у нас есть, это снимки этого уже исторического WISE/NEOWISE. За эти годы чувствительность детекторов выросла в разы, методы обработки сигнала тоже ушли вперёд, а вот основной источник данных для поиска тёмных соседей остался прежним. А значит, мы судим о наших окрестностях по железке пятнадцатилетней давности. Что изменилось бы, если бы тот же поиск провести сегодня, с более чувствительным приёмником или с более длинной базой наблюдений, растянутой не на полгода, а на несколько лет сразу? Сдвинулась бы граница в 26 000 астрономических единиц до 50 000? До 100 000? Никто пока не повторил поиск с новым оборудованием. Метод работает, а инструмент давно устарел.&lt;/p&gt;&lt;p&gt;А что, если в этой слепой зоне, втрое ближе распиаренной Проксимы, прячется во тьме чей-то дом? Мы привыкли думать, что жизнь непременно требует яркого солнца в небе. Да, коричневый карлик почти не светит, зато исправно греет. И если вокруг него кружит землеподобная планета, жара чёрного солнца вполне хватит, чтобы не дать океанам замёрзнуть. А жизнь, если верить земному опыту, в видимых лучах и вовсе не нуждается: на дне земных океанов живут и процветают целые экосистемы, не видевшие ни единого кванта света с момента сотворения мира.&lt;/p&gt;&lt;p&gt;Четыре с лишним световых года до системы Альфы Центавра непреодолимы с современными технологиями. Даже для полуфантастических проектов вроде Breakthrough Starshot, планирующих разогнать микрозонды лазерами до 20% скорости света, это путь длиной в четверть века плюс гора нерешенных технических проблем. Но если тёмное солнце с тёплой планетой прячется в дальних окресностях Солнца, вся бухгалтерия межзвёздных путешествий меняется на глазах. И увидеть чужой мир на снимках имеем шанс если не мы, то наши праправнуки. И если в следующий раз, услышав уверенное «Альфа Центавра, конечно!», не спешите соглашаться. Возможно, первая остановка за пределами Солнечной системы ждёт нас прямо за порогом, в темноте, где мы еще не пошарили как следует.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/article&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;img alt="Хабр Карьера Курсы" src="https://habrastorage.org/webt/97/0d/9d/970d9d74094c58a7ed44dda9c1d40875.png"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;Хабр Курсы для всех&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt; Большая витрина: от крупнейших школ до частных авторов. Сравнивайте по цене, длительности, формату и выбирайте самый подходящий курс! &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
  &lt;noscript&gt;&lt;p&gt;&lt;img src="https://habr.com/mt/e?idsite=7&amp;amp;rec=1" alt=""&gt;&lt;/p&gt;&lt;/noscript&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">wmlab</dc:creator><pubDate>Sun, 04 Oct 2026 00:38:57 +0000</pubDate><guid>https://habr.com/ru/articles/1090062/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1090062</guid><category>научно-популярное</category><category>астрономия</category><category>коричневый карлик</category></item><item><title>Налоги для ИТ-компаний в 2027 году: что меняет новый законопроект для ИТ-льгот, КИК и цифровых платформ</title><link>https://habr.com/ru/articles/1090058/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1090058</link><description>&lt;noscript&gt;&lt;img src="https://rap.skcrtxr.com/pub/pix/e7d9ddbf-b8e9-4bda-8c67-3b177612a410" alt=""&gt;&lt;/noscript&gt;
&lt;noscript&gt;&lt;img src="https://rap.skcrtxr.com/pub/pix/a5d039c3-4139-4f54-b1e9-cf23acc241c6" alt=""&gt;&lt;/noscript&gt;
&lt;noscript&gt;&lt;img src="https://rap.skcrtxr.com/pub/pix/2a6f9685-d3e4-49c0-9b43-86d146bed54e" alt=""&gt;&lt;/noscript&gt;
    &lt;div id="mount"&gt;&lt;div id="app"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;svg height="24" width="24"&gt;Обновить&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;article&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;a href="https://habr.com/ru/users/Jul_tsal/" rel="nofollow"&gt;&lt;div&gt;&lt;img alt="" height="24" src="https://habrastorage.org/r/w48/getpro/habr/avatars/7f0/708/f02/7f0708f025cc30213e94b74a474f257d.jpeg" width="24"&gt;&lt;/div&gt;&lt;/a&gt;&lt;span&gt;&lt;a href="https://habr.com/ru/users/Jul_tsal/" rel="nofollow"&gt;Jul_tsal&lt;/a&gt;&lt;span&gt;&lt;time datetime="2026-10-03T23:23:52.000Z" title="2026-10-03, 23:23"&gt;1 час назад&lt;/time&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;svg height="24" width="24"&gt;Уровень сложности&lt;/svg&gt;&lt;/span&gt;&lt;span&gt;Средний&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;svg height="24" width="24"&gt;Время на прочтение&lt;/svg&gt;&lt;/span&gt;&lt;span&gt;14 мин&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Обзор&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div lang="ru"&gt;&lt;div id="post-content-body"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;30 сентября Правительство направило в Государственную Думу масштабный законопроект, состоящий из 204 страниц поправок в Налоговый кодекс. Документ охватывает широкий спектр вопросов: от НДФЛ и налога на прибыль до регулирования контролируемых иностранных компаний (КИК), трансфертного ценообразования (ТЦО), деятельности цифровых платформ и страховых взносов, а также содержит множество узкоспециализированных изменений.&lt;/p&gt;&lt;p&gt;На первый взгляд, для ИТ-отрасли нововведения не кажутся критическими, ведь ставка налога на прибыль и тарифы страховых взносов для аккредитованных компаний остаются неизменными. Однако при системном анализе документа картина выглядит интереснее.&lt;/p&gt;&lt;p&gt;Государство смещает фокус, связывая право на налоговые льготы не только с формальным статусом компании как ит, но и с качеством финансовой отчетности, структурой бизнес-групп, поведением аффилированных лиц и общим цифровым следом компании. &lt;/p&gt;&lt;p&gt;Важно отметить, что речь идет о законопроекте, а не об уже действующем законе, поэтому текст может претерпеть изменения. Более того, в части ИТ-льгот уже сейчас наблюдается существенное расхождение между пояснительной запиской и самим проектом нормативного акта, что будет рассмотрено далее.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Что я бы вынесла уже сейчас к обсуждению на уровень CEO, CFO и собственников ит-бизнеса&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="left"&gt;&lt;strong&gt;Изменение&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;&lt;strong&gt;Кого касается&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;&lt;strong&gt;Что меняется для бизнеса&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="left"&gt;Новый вид профильного ИТ-дохода&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;провайдеры цифрового контента&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;продажи электронных книг, публикаций и   изображений смогут попадать в 70% профильную выручку&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="left"&gt;Бухгалтерская отчетность становится условием ИТ-льгот&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;все ИТ-компании, использующие налоговые   ит-льготы&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;ошибки в бухгалтерской отчетности создают прямой налоговый риск, так как соблюдение порядка отчетности   становится обязательным условием &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="left"&gt;В пояснительной записке заявлена борьба с искусственным цвеличением 70% внутри группы компаний&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;Дочерние ит-структуры в группах компаний&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;необходимо проверять насколько налоговые ит-льготы зависят от внутригрупповой выручки&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="left"&gt;Платформы включаются непосредственно в   налоговое администрирование&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;маркетплейсы и посреднические цифровые   платформы&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;соблюдение налоговых требований становится частью ИТ-продукта и ИТ-инфраструктуры&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="left"&gt;Меняются правила КИК&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;владельцы международных ИТ-холдингов&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;формальный порог владения смягчается, однако порог прибыли КИК предлагается исключить&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="left"&gt;Консолидация (объединение) доходов   физлица под шкалу 13–22%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;собственники и топ-менеджмент&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;зарплата, дивиденды, инвестиционные и часть иных доходов начинают суммироваться для расчета НДФЛ&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="left"&gt;Растут налоговые штрафы&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;весь бизнес&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;стоимость нарушения налоговых обязанностей увеличивается&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;1. ИТ-льготы сохраняются. Но появляется новое условие&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;На текущий момент аккредитованные российские IT-компании, соответствующие установленным критериям, имеют право использовать пониженную ставку налога на прибыль, где основным условием является доля профильного дохода от ИТ-деятельности не менее 70%.&lt;/p&gt;&lt;p&gt;Предлагаемый законопроект не предусматривает отмену данных льгот. Дополняют виды профильной ит-выручки.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Электронные книги и другой цифровой контент смогут попасть в профильную выручку&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Законопроект дополняет профильную деятельность предоставлением доступа к:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;электронным книгам;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;другим электронным публикациям;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;графическим изображениям.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Поправка одновременно вносится в статью о налоге на прибыль и страховых взносах. Таким образом законодатель фактически расширяет круг цифровых моделей, которые могут использовать ИТ-льготы.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. Бухгалтерская отчетность становится элементом ИТ-льготы&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Гораздо интереснее вторая поправка. Законопроект предусматривает лишение ИТ-компаний льготных преференций в случае непредставления годовой бухгалтерской отчетности в налоговую инспекцию в шестимесячный срок по итогам отчетного периода. Данное ограничение распространяется как на налог на прибыль, так и на страховые взносы. Это существенная трансформация подхода.&lt;/p&gt;&lt;p&gt;Ранее при проверке соответствия льготной деятельности фокус смещался преимущественно на наличие аккредитации, характер деятельности, профиль продукта, условия договоров и долю доходов, превышающую 70%. То есть схема проверки выглядела так: &lt;/p&gt;&lt;p&gt;&lt;strong&gt;аккредитация → деятельность → продукт → договор → 70% доходов.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Теперь в эту цепочку добавляется еще один элемент: &lt;strong&gt;качество налоговой и бухгалтерской дисциплины.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Для зрелой компании сама по себе своевременная сдача отчетности кажется технической задачей. Однако, учитывая, что статус ИТ-резидента способен приносить экономический эффект в десятки миллионов рублей ежегодно, любые неточности в отчетах перестают быть лишь внутренней проблемой бухгалтерского отдела. Эти проблемы становятся явным &lt;strong&gt;финансовым риском для топ-менеджмента и CFO&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Поэтому контроль ИТ-льгот постепенно должен выглядеть не как: «В конце квартала бухгалтер проверит 70%», а эволюционировать в комплексную систему контроля:&lt;/p&gt;&lt;p&gt;аккредитация → квалификация доходов → отчетность → подтверждающие документы → регулярная проверка → передача критических вопросов руководству.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. Самая интересная поправка, которой пока нет в тексте закона&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Для группы компаний это положение имеет особое значение.&lt;/p&gt;&lt;p&gt;В пояснительной записке Правительство декларирует еще одну цель: предотвратить искусственное завышение доли льготируемых доходов за счет сделок между аффилированными лицами. Аналогичная формулировка приведена и в разделе, посвященном страховым взносам ИТ-организаций. &lt;/p&gt;&lt;p&gt;Механизм действий здесь очевиден. Представим типичную группу компаний:&lt;/p&gt;&lt;p&gt;             Материнская компания (80 млн руб. ИТ-услуг)&lt;/p&gt;&lt;p&gt;                                                 ↓&lt;/p&gt;&lt;p&gt;                                                 ИТ-дочка&lt;/p&gt;&lt;p&gt;                                        /                                           \&lt;/p&gt;&lt;p&gt;      внешние ИТ-доходы                                 прочие доходы&lt;/p&gt;&lt;p&gt;          10 млн                                                                10 млн&lt;/p&gt;&lt;p&gt;Формально у ИТ-дочки образуется &lt;strong&gt;90 млн профильных доходов  (100 млн всех доходов = 90%.&lt;/strong&gt; И конечно же условие 70% выполняется с запасом. Но 80% всей экономики ИТ-компании сформировано внутри группы.&lt;/p&gt;&lt;p&gt;Согласно ожидаемым изменениям, возникает очевидный вопрос: «Существует ли здесь самостоятельный ИТ-бизнес или группа сформировала необходимую долю выручки с помощью внутригрупповых операций?»&lt;/p&gt;&lt;p&gt;Судя по пояснительной записке, именно такие конструкции находятся в поле внимания законодателя.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Обратите внимание на существенную деталь!&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;В текущей версии законопроекта отсутствует прямая норма, устанавливающая требуемое ограничение для взаимозависимых лиц. В актуальных поправках к правилам ИТ-льгот фигурируют лишь два пункта: &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;- новый цифровой контент&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;- требование о предоставлении бухгалтерской отчетности. &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Механизма расчета 70% с учетом операций между взаимозависимыми лицами в тексте законопроекта пока не прописано. Это имеет ключевое значение, так как пояснительная записка - не Налоговый кодекс. Поэтому утверждать, что с 2027 года внутригрупповая выручка исключится из расчета 70%, преждевременно, такой нормы в внесенной редакции нет. Однако игнорировать формулировки в записке также нельзя, так как они указывают вектор законодательных изменений. Соответствующая конструкция, вероятнее всего, появится на этапе доработки проекта.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Какие последствия это несет для ИТ-компаний в текущий момент?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Если более 70% выручки формируется за счет материнской структуры или аффилированных лиц, целесообразно уже сейчас просчитать несколько сценариев.&lt;/p&gt;&lt;p&gt;Например: Общая выручка ИТ-компании 100 млн руб.&lt;br&gt; В том числе:&lt;br&gt; - профильные внешние клиенты 15 млн руб.;&lt;br&gt; - профильные сделки внутри группы 70 млн руб.;&lt;br&gt; - прочие доходы 15 млн руб.&lt;/p&gt;&lt;p&gt;Текущая доля профильной деятельности составляет 85%. Однако, если законодатель ограничит учет внутригрупповых операций, итоговый показатель может существенно измениться.&lt;/p&gt;&lt;p&gt;В настоящее время остаются открытыми следующие вопросы:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;исключаются ли связанные доходы исключительно из числителя;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;одновременно ли они вычитаются и из числителя, и из знаменателя;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;распространяется ли ограничение на все виды сделок или только на определенные;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;будут ли предусмотрены безопасные исключения;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;будет ли учитываться рыночный уровень цен;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;необходимо ли подтверждать деловую цель операций.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Поэтому задача финансового директора сейчас не в том, чтобы срочно перестраивать группу, а оценить степень зависимости права на получение льготы от объема внутригрупповой выручки. Задача &lt;strong&gt;понять, насколько право на льготу зависит от внутригрупповой выручки&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. Для маркетплейсов происходит изменение гораздо масштабнее&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Если прошлые поправки лишь уточняли правила применения налоговых льгот, то данный законопроект фундаментально трансформирует статус ИТ-продуктов на посреднических цифровых площадках. Платформа теперь интегрируется в систему налогового контроля. &lt;/p&gt;&lt;p&gt;Проект предлагает новую ст. 86.6 НК РФ, согласно которой оператор платформы должен будет:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;выявлять налоговые риски партнеров по перечню ФНС;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;размещать сообщение о риске в личном кабинете продавца;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;принимать документы, которыми продавец опровергает риск;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;передавать сведения о риске и документы в налоговый орган;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;доставлять документы ФНС партнеру;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;обеспечивать информационный обмен с налоговой службой.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;При этом продавцу дается срок до 30 календарных дней для предоставления доказательств, опровергающих выявленный риск. &lt;/p&gt;&lt;p&gt;Таким образом, формируется новый алгоритм налогового администрирования:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ФНС &lt;/strong&gt;(направляет запрос о налоговом риске / требование / вызов)&lt;/p&gt;&lt;p&gt; ↓&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Цифровая платформа&lt;/strong&gt; (передает уведомление и запрашивает документы)&lt;/p&gt;&lt;p&gt; ↓&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Продавец &lt;/strong&gt;(предоставляет пояснения и доказательства)&lt;/p&gt;&lt;p&gt; ↓&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Цифровая платформа&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; ↓&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ФНС&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Это выходит за рамки стандартного документооборота между бухгалтерией компании и налоговой. Цифровая платформа превращается в полноценного участника процесса налогового контроля, выступая связующим звеном.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5. Через платформу можно будет остановить продажи&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Данная норма считается одной из самых строгих в рамках законопроекта.&lt;br&gt; В случае, если продавец:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;откажется явиться в налоговую инспекцию для дачи объяснений;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;или не предоставит запрошенные документы,&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Федеральная налоговая служба (ФНС) сможет обязать оператора маркетплейса временно &lt;strong&gt;прекратить прием новых заказов и скрыть карточки товаров, работ или услуг&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Причем поручение будет распространяться на все площадки, где ведет деятельность нарушитель. Оператор обязан выполнить это требование в течение 48 часов. После выполнения задачи налоговый орган обязан выдать указание о возобновлении работы карточек и приема заказов.&lt;/p&gt;&lt;p&gt;Для продавца на маркетплейсе цепочка налоговых рисков выглядит следующим образом:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;требование налогового органа &lt;/strong&gt;→&lt;strong&gt; нет реакции &lt;/strong&gt;→&lt;strong&gt; поручение ФНС &lt;/strong&gt;→&lt;strong&gt; приостановление карточек и приема заказов &lt;/strong&gt;→&lt;strong&gt; остановка поступления выручки&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Таким образом, выполнение налоговых обязательств напрямую влияет на бесперебойность бизнес-процессов. Это выходит за рамки компетенции исключительно налогового отдела вашей компании.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6. Для самой платформы налоговый контроль становится частью продукта&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Этому аспекту необходимо уделить особое внимание CTO и CPO. В случае принятия законодательных изменений делегирование задач исключительно юристам или бухгалтерии станет недостаточным. Платформам потребуется внедрить комплекс технических решений, включающий:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;интеграцию с ФНС;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;идентификацию партнера;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;фиксацию налоговых рисков;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;систему уведомлений;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;фиксацию момента получения сообщения;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;хранение подтверждающих документов;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;порядок подготовки и передачи ответа;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;нормативы сроков обработки;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;журналирование действий;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;порядок передачи критических ситуаций ответственным руководителям;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;механизм приостановления и возобновления продаж.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Проект предусматривает специальный штраф &lt;strong&gt;100 тыс. рублей&lt;/strong&gt; за неисполнение оператором поручения ФНС или обязанностей налогового контроля.&lt;/p&gt;&lt;p&gt;Хотя для крупного сервиса эта сумма не является критической, гораздо важнее то, что налоговые функции интегрируются в основной рабочий контур программного обеспечения. Следовательно, проектирование архитектуры должно носить междисциплинарный характер, объединяя усилия налоговых экспертов, юристов, продуктовых команд, IT-специалистов, служб информационной безопасности и операционного блока. &lt;/p&gt;&lt;p&gt;Внедрение соответствующих изменений запланировано &lt;strong&gt;через девять месяцев после официального опубликования нормативного акта&lt;/strong&gt;. Для масштабных платформ этот период может оказаться недостаточным при необходимости глубокой переработки IT-инфраструктуры.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;7. Для ИТ-групп с иностранными компаниями меняются правила КИК&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Для владельцев международных структур, включающих компании из ОАЭ, Казахстана, Кипра и других юрисдикций, подготовлен специфический пакет поправок, который вызывает неоднозначные оценки.&lt;/p&gt;&lt;p&gt;С одной стороны, законопроект смягчает один из формальных критериев: порог прямого или косвенного участия для определения контролирующего лица повышается с 25% до 50%. Это должно сократить число миноритарных акционеров, автоматически признаваемых контролирующими. &lt;/p&gt;&lt;p&gt;Однако нельзя делать вывод, что при доле владения 49% статус КИК автоматически теряется. Налоговый кодекс РФ предусматривает и иные основания для признания контроля. Более того, закон прямо приравнивает единоличный контроль над иностранной организацией к 100% участию. &lt;/p&gt;&lt;p&gt;Таким образом, ключевым фактором становится реальное влияние на компанию, а не только формальный процент акций.&lt;/p&gt;&lt;p&gt;С другой стороны, проект закона предлагает отменить текущий необлагаемый порог прибыли КИК в размере 10 млн рублей. Пояснительная записка прямо указывает на необходимость исключения этого лимита. &lt;/p&gt;&lt;p&gt;В результате формируется логичная система: формальное количество случаев признания контроля по доле владения снижается, но налоговое бремя ужесточается в ситуациях реального контроля. &lt;/p&gt;&lt;p&gt;Для международных ИТ-групп это сигнал к &lt;strong&gt;своевременному пересмотру структуры владения&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;8. Трансфертное ценообразование станет административно дороже&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Есть еще одно изменение, которое несложно упустить из виду. Законопроект обязывает нотариально заверять перевод на русский язык документов по трансфертному ценообразованию, если они составлены на иностранном языке. Это требование планируется зафиксировать сразу в нескольких статьях Налогового кодекса РФ, касающихся документации по контролируемым сделкам и международным операциям.&lt;/p&gt;&lt;p&gt;Хотя экономическая суть сделки от этого не меняется, для международных технологических групп это означает дополнительные:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;расходы;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;сроки;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;требования к документообороту;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;требования к хранению документов.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Особенно если договоры разработки, передачи прав на интеллектуальную собственность, внутригруппового финансирования или оказания услуг заключены на английском языке. &lt;/p&gt;&lt;p&gt;Нормы по КИК и трансфертному ценообразованию проект предлагает &lt;strong&gt;вводить с 1 января 2027 года.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;9. У собственников ИТ-компаний меняется логика НДФЛ&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Значимые нововведения касаются не только специальных льгот для IT-сектора, но и общих правил налогообложения физических лиц. Законопроект предусматривает консолидацию различных видов доходов граждан для применения прогрессивной налоговой шкалы в диапазоне от &lt;strong&gt;13% до 22%.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;В единую совокупность доходов, подлежащих обложению по новым правилам, войдут:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;зарплату и иные обычные доходы;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;дивиденды;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;доходы по ценным бумагам;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;доходы от реализации долей;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;проценты по банковским вкладам;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;прибыль КИК;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;доходы от майнинга;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;операции с цифровой валютой.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Для обычных сотрудников IT-предприятий такие изменения могут пройти практически незаметно. Однако для владельцев бизнеса с высоким уровнем дохода, включающим дивиденды и инвестиционные поступления, последствия будут ощутимыми. Это означает, что налоговая оптимизация деятельности компании и личное налоговое планирование собственника перестают быть изолированными процессами и требуют комплексного подхода.&lt;/p&gt;&lt;p&gt;Визуально это выглядит так:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Зарплата + Дивиденды + Продажа долей / ценных бумаг + Проценты + Прибыль КИК + Цифровая валюта = Совокупность налоговых баз&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;        ↓&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;13% → 15% → 18% → 20% → 22%&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Таким образом, владельцу IT-компании необходимо рассчитывать не только объем налогов, уплачиваемых самой организацией, но и определять реальную эффективную налоговую нагрузку на себя лично после вывода прибыли из бизнеса.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;10. Дорожает сама налоговая ошибка&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Законопроект предусматривает существенное повышение размеров финансовых санкций за различные налоговые проступки. Например:&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="left"&gt;&lt;strong&gt;Нарушение&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;&lt;strong&gt;Действующий размер&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;&lt;strong&gt;Предлагаемый&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="left"&gt;нарушение срока постановки на учет&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;10 000&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;30 000&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="left"&gt;деятельность без постановки на учет&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;40 000&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;121 000&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="left"&gt;минимальный штраф за непредставление   декларации&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;1 000&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="left"&gt;отдельные нарушения по представлению   документов&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;200&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="left"&gt;560&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Также возрастут штрафы за международные налоговые правонарушения: суммы увеличатся с 500 тысяч до 754 тысяч рублей, а также с 1 миллиона до 1,51 миллиона рублей.&lt;/p&gt;&lt;p&gt;В большинстве случаев новые, более строгие санкции вступят в силу с 1 января 2027 года.&lt;/p&gt;&lt;p&gt;На фоне потенциальных многомиллионных рисков отдельные фиксированные штрафы могут казаться незначительными. Тем не менее, общая тенденция очевидна: &lt;strong&gt;нарушение налоговых обязанностей становится дороже одновременно с расширением объема данных, доступных ФНС.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Какие последствия скрываются за этими поправками?&lt;br&gt; &lt;/strong&gt;Если исключить ссылки на конкретные статьи Налогового кодекса, картина изменений системы выглядит довольно логичной.&lt;/p&gt;&lt;p&gt;Ранее схема была прямой:&lt;br&gt;Наличие ИТ-аккредитации? → Доля профильных доходов превышает 70% → Применяется льготный режим.&lt;/p&gt;&lt;p&gt;В будущем процесс усложнится и станет многоуровневым:&lt;br&gt;Какая реальная деятельность ведется бизнесом? → Происхождение выручки → Идентификация контрагентов? → Архитектура холдинговой структуры? → Содержание бухгалтерской и налоговой отчетности? → Информация из цифровых источников? →  Наличие подтверждающих доказательств? → И лишь затем определяется&lt;br&gt; налоговый режим.&lt;/p&gt;&lt;p&gt;Поэтому я не считаю этот законопроект простым очередным налоговым пакетом.&lt;br&gt;Для технологического сектора из него следует иной ключевой вывод. &lt;strong&gt;Налоговый контроль все больше строится на данных&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;ФНС наращивает возможности для сверки:&lt;br&gt;договоров ↔ денежных потоков ↔ бухгалтерского учета ↔ структуры группы ↔ данных цифровых платформ ↔ реальной хозяйственной деятельности.&lt;br&gt; &lt;br&gt;Таким образом, налоговая конструкция должна быть устойчивой не только к проверке юридическими документами. Она должна &lt;strong&gt;выдерживать проверку фактическими данными&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Стратегические шаги для руководства ИТ-бизнеса в преддверии законодательных изменений&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Несмотря на то, что окончательное принятие закона еще не состоялось, начинать глобальную трансформацию бизнеса преждевременно. Однако проактивный аудит устойчивости компании к будущим нормам уже сейчас является разумной мерой.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. Детализация расчета 70%-ного порога&lt;/strong&gt;&lt;br&gt; Вместо единого показателя необходимо сегментировать профильную выручку как минимум на три категории: доход от внешних клиентов, внутренняя выручка группы и средства от непрофильной деятельности. Особое внимание следует уделить сценарию, при котором исключение внутригруппового оборота приводит к резкому падению основного показателя ниже 70%, так как это прямой сигнал о потенциальных рисках.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. Аудит процесса сдачи бухгалтерской отчетности&lt;/strong&gt;&lt;br&gt; Критически важно формализовать процедуру, четко определив:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;ответственного исполнителя;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;жесткие сроки;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;механизм подтверждения факта отправки документов;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;алгоритм эскалации проблем к топ-менеджменту&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Экономия на налоговых льготах слишком велика, чтобы доверять контроль над ними исключительно календарю бухгалтера без системного менеджмента.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. Интеграция налоговых требований в продукт для цифровых платформ&lt;/strong&gt;&lt;br&gt; Командам по налогам, юридическому сопровождению, продукту и ИТ необходимо разработать единый регламент, который охватывает:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;текущий объем собираемых данных и выявление пробелов;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;механизмы идентификации налоговых рисков;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;процессы уведомления продавцов и фиксации их получения;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;правила архивного хранения документации;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;распределение зон ответственности за передачу информации;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;технические и организационные процедуры приостановки и возобновления продаж.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;4. Ревизия зарубежной структуры владения&lt;/strong&gt;&lt;br&gt; Для каждой иностранной юрисдикции требуется провести углубленный анализ по следующим параметрам:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;доля участия;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;уровень фактического контроля;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;финансовая прибыль;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;наличие льготных режимов;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;статус КИК;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;перечень контролируемых сделок;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;язык оригиналов документов.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Особый приоритет следует уделить компаниям, чья прибыль находится на уровне ниже 10 млн рублей, так как именно этот фактор часто служит основанием для невключения данных средств в налогооблагаемую базу контролирующего лица.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5. Комплексный расчет налоговой нагрузки собственника&lt;br&gt; &lt;/strong&gt;Анализ должен выходить за рамки исключительно корпоративных налогов ИТ-компании. Необходимо суммировать все фактические выплаты государству со стороны собственника, включая налоги с зарплаты, дивидендов, инвестиционных поступлений, доходов от КИК и от реализации долей в бизнесе. Для современных технологических предприятий эти два финансовых контура все труднее рассматривать изолированно, требуя единого подхода к планированию.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Вместо вывода.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Главная интрига законопроекта № 617-9 кроется вовсе не в электронных книгах или росте штрафных санкций. Для меня существеннее иной аспект: налоговые преференции утрачивают статус простого атрибута юридического лица, превращаясь в следствие комплексной системы. &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Этот процесс можно проследить через цепочку: бизнес-модель формирует договоры, те генерируют выручку, которая отражается в бухучете, определяя структуру группы, что влияет на данные, затем на доказательства и, в конечном итоге, на налоги. &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Когда различные уровни этой цепи описывают разные аспекты деятельности компании, проблема выходит за рамки корректности налоговой декларации. &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Истинная сложность заключается в архитектуре самого бизнеса.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/article&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;img alt="Хабр Карьера Курсы" src="https://habrastorage.org/webt/97/0d/9d/970d9d74094c58a7ed44dda9c1d40875.png"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;Хабр Курсы для всех&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt; Большая витрина: от крупнейших школ до частных авторов. Сравнивайте по цене, длительности, формату и выбирайте самый подходящий курс! &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
  &lt;noscript&gt;&lt;p&gt;&lt;img src="https://habr.com/mt/e?idsite=7&amp;amp;rec=1" alt=""&gt;&lt;/p&gt;&lt;/noscript&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jul_tsal</dc:creator><pubDate>Sat, 03 Oct 2026 23:23:52 +0000</pubDate><guid>https://habr.com/ru/articles/1090058/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1090058</guid><category>ит-льготы</category><category>ит-компании</category><category>налоговый контроль</category><category>цифровые платформы</category><category>кик</category><category>трансфертное ценообразование</category><category>налог на прибыль</category></item><item><title>[Перевод] 18 изображений раскроют нам, как безмерно велик наш космос</title><link>https://habr.com/ru/articles/1089804/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1089804</link><description>&lt;noscript&gt;&lt;img src="https://rap.skcrtxr.com/pub/pix/eb6dfc0d-e790-4b42-80f5-37bc1011fed5" alt=""&gt;&lt;/noscript&gt;
&lt;noscript&gt;&lt;img src="https://rap.skcrtxr.com/pub/pix/6d50f267-2651-4124-9cd9-efe28260780b" alt=""&gt;&lt;/noscript&gt;
&lt;noscript&gt;&lt;img src="https://rap.skcrtxr.com/pub/pix/11eaa56c-381b-421c-a6c9-b9d15c17c3b9" alt=""&gt;&lt;/noscript&gt;
    &lt;div id="mount"&gt;&lt;div id="app"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;svg height="24" width="24"&gt;Обновить&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;article&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;a href="https://habr.com/ru/users/avshkol/" rel="nofollow"&gt;&lt;div&gt;&lt;img alt="" height="24" src="https://assets.habr.com/habr-web/release_2.352.2/client/img/avatars/161.png" width="24"&gt;&lt;/div&gt;&lt;/a&gt;&lt;span&gt;&lt;a href="https://habr.com/ru/users/avshkol/" rel="nofollow"&gt;avshkol&lt;/a&gt;&lt;span&gt;&lt;time datetime="2026-10-03T21:06:14.000Z" title="2026-10-03, 21:06"&gt;1 час назад&lt;/time&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;svg height="24" width="24"&gt;Уровень сложности&lt;/svg&gt;&lt;/span&gt;&lt;span&gt;Простой&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;svg height="24" width="24"&gt;Время на прочтение&lt;/svg&gt;&lt;/span&gt;&lt;span&gt;8 мин&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Обзор&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Перевод&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div lang="ru"&gt;&lt;div id="post-content-body"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/edb/03e/ba9/edb03eba9b27c9456c8b1616af482d37.webp" alt="По мере развития инфляции будет порождена серия вселенных, причем каждая из них будет полностью отрезана от всех остальных, разделенных продолжающимся расширением пространства. Один из этих «пузырей», где инфляция закончилась, дал начало нашей Вселенной около 13,8 миллиардов лет назад, с очень низкой плотностью энтропии, но без какого-либо нарушения второго начала термодинамики. Источник: Николл Рейджер Фуллер" title="По мере развития инфляции будет порождена серия вселенных, причем каждая из них будет полностью отрезана от всех остальных, разделенных продолжающимся расширением пространства. Один из этих «пузырей», где инфляция закончилась, дал начало нашей Вселенной около 13,8 миллиардов лет назад, с очень низкой плотностью энтропии, но без какого-либо нарушения второго начала термодинамики. Источник: Николл Рейджер Фуллер" width="912" height="513"&gt;&lt;div&gt;&lt;figcaption&gt;По мере развития инфляции будет порождена серия вселенных, причем каждая из них будет полностью отрезана от всех остальных, разделенных продолжающимся расширением пространства. Один из этих «пузырей», где инфляция закончилась, дал начало нашей Вселенной около 13,8 миллиардов лет назад, с очень низкой плотностью энтропии, но без какого‑либо нарушения второго начала термодинамики. &lt;a href="https://www.sciencenews.org/article/entanglement-gravitys-long-distance-connection" rel="noopener nofollow"&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: Николл Рейджер Фуллер&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;em&gt;Наблюдаемая Вселенная имеет диаметр 92 миллиарда световых лет. Эти изображения помогают осознать, насколько она огромна.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="https://bigthink.com/starts-with-a-bang/how-large-universe/" rel="noopener nofollow"&gt;Итан Сигел, 28 сентября 2026&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Ключевые тезисы:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Здесь, на Земле, диаметр нашей планеты составляет чуть менее 13 000 километров, или примерно на семь порядков больше размера отдельного человеческого существа. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Но по мере того, как мы поднимаемся ко все более крупным масштабам, мы обнаруживаем, что звезды, звездные системы, звездные скопления, галактики, скопления галактик и многое другое показывают нам, насколько незначительными на самом деле являются человеческие и даже планетарные масштабы.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Даже при всем том, что мы знаем, огромная бездна ненаблюдаемой Вселенной больше, чем совокупность всего, что мы можем видеть. Эти изображения показывают, насколько велика наша Вселенная в истинно космических масштабах.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;В космическом масштабе человечество — всего лишь капля в огромном океане Вселенной.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/909/e7b/2aa/909e7b2aa83980fd5d49e8f65c4f5677.webp" alt="Это изображение, сделанное с Международной космической станции астронавтом Карен Найберг в 2013 году, показывает два крупнейших острова в южной части Маскаренского плато: Реюньон на переднем плане и Маврикий, частично покрытый облаками. Чтобы увидеть человека на Земле с высоты МКС, потребовался бы телескоп размером с «Хаббл». Масштаб человека составляет менее 1/5 000 000 масштаба Земли, но Земля — всего лишь капля в космическом океане, ее диаметр составляет чуть более 10 000 километров. Источник: NASA/Karen Nyberg" title="Это изображение, сделанное с Международной космической станции астронавтом Карен Найберг в 2013 году, показывает два крупнейших острова в южной части Маскаренского плато: Реюньон на переднем плане и Маврикий, частично покрытый облаками. Чтобы увидеть человека на Земле с высоты МКС, потребовался бы телескоп размером с «Хаббл». Масштаб человека составляет менее 1/5 000 000 масштаба Земли, но Земля — всего лишь капля в космическом океане, ее диаметр составляет чуть более 10 000 километров. Источник: NASA/Karen Nyberg" width="1363" height="2048"&gt;&lt;div&gt;&lt;figcaption&gt;Это изображение, сделанное с Международной космической станции астронавтом Карен Найберг в 2013 году, показывает два крупнейших острова в южной части Маскаренского плато: Реюньон на переднем плане и Маврикий, частично покрытый облаками. Чтобы увидеть человека на Земле с высоты МКС, потребовался бы телескоп размером с «Хаббл». Масштаб человека составляет менее 1/5 000 000 масштаба Земли, но Земля — всего лишь капля в космическом океане, ее диаметр составляет чуть более 10 000 километров. &lt;a href="https://commons.wikimedia.org/wiki/File:Mauritius_and_R%C3%A9union_at_night.jpg" rel="noopener nofollow"&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: NASA/Karen Nyberg&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Весь опыт нашей цивилизации, за исключением космических полетов, ограничен нашей планетой: 13 000 км в поперечнике.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/8a9/5b9/778/8a95b9778bc571eda42fb0a2b014509b.webp" alt="Этот вид Земли предоставлен нам космическим аппаратом NASA MESSENGER, которому пришлось совершить облеты Земли и Венеры, чтобы сбросить достаточно энергии для достижения конечной цели: Меркурия. Несколько сотен изображений, сделанных широкоугольной камерой в системе визуализации Меркурия (MDIS) аппарата MESSENGER, были смонтированы в фильм, документирующий вид с MESSENGER при его удалении от Земли. Земля, сплюснутый сфероид, вращается примерно один раз каждые 24 часа вокруг своей оси и движется в пространстве по эллиптической орбите вокруг нашего Солнца. Источник: NASA/MESSENGER" title="Этот вид Земли предоставлен нам космическим аппаратом NASA MESSENGER, которому пришлось совершить облеты Земли и Венеры, чтобы сбросить достаточно энергии для достижения конечной цели: Меркурия. Несколько сотен изображений, сделанных широкоугольной камерой в системе визуализации Меркурия (MDIS) аппарата MESSENGER, были смонтированы в фильм, документирующий вид с MESSENGER при его удалении от Земли. Земля, сплюснутый сфероид, вращается примерно один раз каждые 24 часа вокруг своей оси и движется в пространстве по эллиптической орбите вокруг нашего Солнца. Источник: NASA/MESSENGER" width="780" height="713"&gt;&lt;div&gt;&lt;figcaption&gt;Этот вид Земли предоставлен нам космическим аппаратом NASA MESSENGER, которому пришлось совершить облеты Земли и Венеры, чтобы сбросить достаточно энергии для достижения конечной цели: Меркурия. Несколько сотен изображений, сделанных широкоугольной камерой в системе визуализации Меркурия (MDIS) аппарата MESSENGER, были смонтированы в фильм, документирующий вид с MESSENGER при его удалении от Земли. Земля, сплюснутый сфероид, вращается примерно один раз каждые 24 часа вокруг своей оси и движется в пространстве по эллиптической орбите вокруг нашего Солнца. &lt;a href="https://www.youtube.com/watch?v=48-XvX5VfxI" rel="noopener nofollow"&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: NASA/MESSENGER&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Даже другие планеты обычно занимают объем, в тысячи раз превышающий объем Земли.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/09b/040/038/09b0400381fe9d4f02e402d0aaf76099.webp" alt="Из восьми планет нашей Солнечной системы четыре газовых гиганта обладают наименьшей плотностью, менее половины от плотности наименее плотной каменистой планеты (Марса), а Сатурн даже менее плотный, чем вода. Источник: NASA/Lunar and Planetary Institute" title="Из восьми планет нашей Солнечной системы четыре газовых гиганта обладают наименьшей плотностью, менее половины от плотности наименее плотной каменистой планеты (Марса), а Сатурн даже менее плотный, чем вода. Источник: NASA/Lunar and Planetary Institute" width="960" height="313"&gt;&lt;div&gt;&lt;figcaption&gt;Из восьми планет нашей Солнечной системы четыре газовых гиганта обладают наименьшей плотностью, менее половины от плотности наименее плотной каменистой планеты (Марса), а Сатурн даже менее плотный, чем вода. &lt;a href="https://solarsystem.nasa.gov/resources/686/solar-system-sizes/" rel="noopener nofollow"&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: NASA/Lunar and Planetary Institute&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Многие звезды едва превышают размеры крупнейших планет, но часто попадаются звезды гораздо б&lt;em&gt;о&lt;/em&gt;льших размеров.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/624/ee2/2c3/624ee22c33b20c963a88854d7a5a5549.webp" alt="Коричневые карлики, с массами от примерно 0,013 до 0,080 массы Солнца, будут синтезировать протоны+дейтроны или дейтроны+дейтроны в гелий-3 или тритий, оставаясь примерно того же размера, что и Юпитер, но достигая гораздо больших масс. Красные карлики лишь немного крупнее, но они действительно запускают протон-протонную реакцию синтеза, однако даже показанная здесь звезда, подобная Солнцу, изображена не в масштабе; она имела бы диаметр примерно в 7 раз больше, чем звезда малой массы. В нашей Вселенной звезды могут достигать почти 2000-кратного диаметра нашего Солнца . Источник: NASA/JPL-Caltech/UCC" title="Коричневые карлики, с массами от примерно 0,013 до 0,080 массы Солнца, будут синтезировать протоны+дейтроны или дейтроны+дейтроны в гелий-3 или тритий, оставаясь примерно того же размера, что и Юпитер, но достигая гораздо больших масс. Красные карлики лишь немного крупнее, но они действительно запускают протон-протонную реакцию синтеза, однако даже показанная здесь звезда, подобная Солнцу, изображена не в масштабе; она имела бы диаметр примерно в 7 раз больше, чем звезда малой массы. В нашей Вселенной звезды могут достигать почти 2000-кратного диаметра нашего Солнца . Источник: NASA/JPL-Caltech/UCC" width="720" height="540"&gt;&lt;div&gt;&lt;figcaption&gt;Коричневые карлики, с массами от примерно 0,013 до 0,080 массы Солнца, будут синтезировать протоны+дейтроны или дейтроны+дейтроны в гелий-3 или тритий, оставаясь примерно того же размера, что и Юпитер, но достигая гораздо больших масс. Красные карлики лишь немного крупнее, но они действительно запускают протон‑протонную реакцию синтеза, однако даже показанная здесь звезда, подобная Солнцу, изображена не в масштабе; она имела бы диаметр примерно в 7 раз больше, чем звезда малой массы. В нашей Вселенной звезды могут достигать почти 2000-кратного диаметра нашего Солнца. &lt;a href="https://www.jpl.nasa.gov/images/pia12462-brown-dwarf-comparison" rel="noopener nofollow"&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: NASA/JPL‑Caltech/UCC&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Диаметры &lt;a href="https://en.wikipedia.org/wiki/List_of_largest_known_stars" rel="noopener nofollow"&gt;крупнейших звезд‑сверхгигантов&lt;/a&gt; превышают миллиарды километров.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/f6e/e88/496/f6ee88496d36118741221588587ffb1e.webp" alt="Эта иллюстрация показывает некоторые из крупнейших звезд Вселенной вместе с орбитами Сатурна (коричневый эллипс) и Нептуна (синий эллипс) для сравнения. Звезды, слева направо: крупнейший голубой гипергигант, желтый гипергигант, оранжевый гипергигант, а затем две самые большие звезды из всех: красные гипергиганты UY Щита и Stephenson 2-18. Крупнейшие звезды примерно в 2000 раз превышают диаметр нашего Солнца, но температуры на поверхностях этих звезд варьируются от всего нескольких тысяч К вплоть до звезд Вольфа-Райе с температурами ~200 000 К. Источник: SkyFlubler/Wikimedia Commons" title="Эта иллюстрация показывает некоторые из крупнейших звезд Вселенной вместе с орбитами Сатурна (коричневый эллипс) и Нептуна (синий эллипс) для сравнения. Звезды, слева направо: крупнейший голубой гипергигант, желтый гипергигант, оранжевый гипергигант, а затем две самые большие звезды из всех: красные гипергиганты UY Щита и Stephenson 2-18. Крупнейшие звезды примерно в 2000 раз превышают диаметр нашего Солнца, но температуры на поверхностях этих звезд варьируются от всего нескольких тысяч К вплоть до звезд Вольфа-Райе с температурами ~200 000 К. Источник: SkyFlubler/Wikimedia Commons" width="1536" height="1211"&gt;&lt;div&gt;&lt;figcaption&gt;Эта иллюстрация показывает некоторые из крупнейших звезд Вселенной вместе с орбитами Сатурна (коричневый эллипс) и Нептуна (синий эллипс) для сравнения. Звезды, слева направо: крупнейший голубой гипергигант, желтый гипергигант, оранжевый гипергигант, а затем две самые большие звезды из всех: красные гипергиганты UY Щита и Stephenson 2–18. Крупнейшие звезды примерно в 2000 раз превышают диаметр нашего Солнца, но температуры на поверхностях этих звезд варьируются от всего нескольких тысяч К вплоть до звезд Вольфа‑Райе с температурами ~200 000 К. &lt;a href="https://en.wikipedia.org/wiki/File:Star_Sizes_Comparison_update_2021.png" rel="noopener nofollow"&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: SkyFlubler/Wikimedia Commons&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;По масштабу они сравнимы с горизонтами событий самых тяжелых сверхмассивных черных дыр.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/3f2/56a/ffc/3f256affc9de88b2827ea1839fa818ad.webp" alt="Эта диаграмма показывает относительные размеры горизонтов событий двух сверхмассивных черных дыр, обращающихся друг вокруг друга в системе OJ 287. Большая из них, с массой ~18 миллиардов масс Солнца, в 12 раз превышает размер орбиты Нептуна; меньшая, с массой 150 миллионов масс Солнца, примерно равна размеру орбиты астероида Церера вокруг Солнца. Самая тяжелая известная черная дыра лишь в несколько раз массивнее (а значит, и в несколько раз больше по радиусу), чем большая в OJ 287. Источник: NASA/JPL-Caltech/R. Hurt (IPAC)" title="Эта диаграмма показывает относительные размеры горизонтов событий двух сверхмассивных черных дыр, обращающихся друг вокруг друга в системе OJ 287. Большая из них, с массой ~18 миллиардов масс Солнца, в 12 раз превышает размер орбиты Нептуна; меньшая, с массой 150 миллионов масс Солнца, примерно равна размеру орбиты астероида Церера вокруг Солнца. Самая тяжелая известная черная дыра лишь в несколько раз массивнее (а значит, и в несколько раз больше по радиусу), чем большая в OJ 287. Источник: NASA/JPL-Caltech/R. Hurt (IPAC)" width="1536" height="864"&gt;&lt;div&gt;&lt;figcaption&gt;Эта диаграмма показывает относительные размеры горизонтов событий двух сверхмассивных черных дыр, обращающихся друг вокруг друга в системе OJ 287. Б&lt;em&gt;о&lt;/em&gt;льшая из них, с массой ~18 миллиардов масс Солнца, в 12 раз превышает размер орбиты Нептуна; меньшая, с массой 150 миллионов масс Солнца, примерно равна размеру орбиты астероида Церера вокруг Солнца. Самая тяжелая известная черная дыра лишь в несколько раз массивнее (а значит, и в несколько раз больше по радиусу), чем б&lt;em&gt;о&lt;/em&gt;льшая в OJ 287. &lt;a href="https://www.spitzer.caltech.edu/image/ssc2020-11b-sizes-of-black-holes-in-galaxy-oj-287-relative-to-the-solar-system" rel="noopener nofollow"&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: NASA/JPL‑Caltech/R. Hurt (IPAC)&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Но даже самые крупные отдельные объекты не идут ни в какое сравнение с протяженными, составными системами.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/e82/0f3/e62/e820f3e62cc62d6dbd76226fdb73ce88.webp" alt="Логарифмическая диаграмма расстояний, показывающая планеты, космические аппараты «Вояджер», облако Оорта и нашу ближайшую звезду, Проксиму Центавра. Если мы представим строительство все более крупных ускорителей частиц, каждый десятикратный рост радиуса дает нам еще один десятикратный рост энергии, но обычно за счет стократного увеличения стоимости. В планетарных и звездных масштабах это может очень быстро стать запретительно большим. Источник: NASA/JPL-Caltech" title="Логарифмическая диаграмма расстояний, показывающая планеты, космические аппараты «Вояджер», облако Оорта и нашу ближайшую звезду, Проксиму Центавра. Если мы представим строительство все более крупных ускорителей частиц, каждый десятикратный рост радиуса дает нам еще один десятикратный рост энергии, но обычно за счет стократного увеличения стоимости. В планетарных и звездных масштабах это может очень быстро стать запретительно большим. Источник: NASA/JPL-Caltech" width="1536" height="855"&gt;&lt;div&gt;&lt;figcaption&gt;Логарифмическая диаграмма расстояний, показывающая планеты, космические аппараты «Вояджер», облако Оорта и нашу ближайшую звезду, Проксиму Центавра. Если мы представим строительство все более крупных ускорителей частиц, каждый десятикратный рост радиуса дает нам еще один десятикратный рост энергии, но обычно за счет стократного увеличения стоимости. В планетарных и звездных масштабах это может очень быстро стать запретительно большим. &lt;a href="https://www.jpl.nasa.gov/infographics/voyager-1-goes-interstellar" rel="noopener nofollow"&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: NASA/JPL‑Caltech&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Вокруг каждой звездной системы облака, подобные облаку Оорта, простираются на несколько световых лет: десятки триллионов километров.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/7b7/9a4/b84/7b79a4b847bf031e6df29074a844e972.webp" alt="Иллюстрация формы внутреннего и внешнего облака Оорта, окружающего наше Солнце. В то время как внутреннее облако Оорта имеет тороидальную форму, внешнее облако Оорта сферическое. Истинная протяженность внешнего облака Оорта может быть менее 1 светового года или более 3 световых лет, здесь существует огромная неопределенность. Любой массивный объект, проходящий через облако Оорта, имеет большую вероятность возмутить объекты в его окрестностях. Источник: Pablo Carlos Budassi/Wikimedia Commons" title="Иллюстрация формы внутреннего и внешнего облака Оорта, окружающего наше Солнце. В то время как внутреннее облако Оорта имеет тороидальную форму, внешнее облако Оорта сферическое. Истинная протяженность внешнего облака Оорта может быть менее 1 светового года или более 3 световых лет, здесь существует огромная неопределенность. Любой массивный объект, проходящий через облако Оорта, имеет большую вероятность возмутить объекты в его окрестностях. Источник: Pablo Carlos Budassi/Wikimedia Commons" width="1280" height="960"&gt;&lt;div&gt;&lt;figcaption&gt;Иллюстрация формы внутреннего и внешнего облака Оорта, окружающего наше Солнце. В то время как внутреннее облако Оорта имеет тороидальную форму, внешнее облако Оорта сферическое. Истинная протяженность внешнего облака Оорта может быть менее 1 светового года или более 3 световых лет, здесь существует огромная неопределенность. Любой массивный объект, проходящий через облако Оорта, имеет большую вероятность возмутить объекты в его окрестностях. &lt;a href="https://commons.wikimedia.org/wiki/File:Oort_cloud.png" rel="noopener nofollow"&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: Pablo Carlos Budassi/Wikimedia Commons&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Сами же звезды собираются вместе в огромные галактические скопления.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/7fc/a88/fc9/7fca88fc98450ab7d24d2eb709f6f5de.webp" alt="В этом плотном звездном поле слева можно выделить несколько вероятных членов отдельной структуры — либо остатка шарового скопления, либо очень маломассивной карликовой галактики, путем сортировки звездных свойств объектов внутри нее. Источник: CFHT / S. Gwyn / S. Smith" title="В этом плотном звездном поле слева можно выделить несколько вероятных членов отдельной структуры — либо остатка шарового скопления, либо очень маломассивной карликовой галактики, путем сортировки звездных свойств объектов внутри нее. Источник: CFHT / S. Gwyn / S. Smith" width="1200" height="727"&gt;&lt;div&gt;&lt;figcaption&gt;В этом плотном звездном поле слева можно выделить несколько вероятных членов отдельной структуры — либо остатка шарового скопления, либо очень маломассивной карликовой галактики, путем сортировки звездных свойств объектов внутри нее. &lt;a href="https://dailygalaxy.com/2025/05/astronomers-discovered-smallest-galaxy/" rel="noopener nofollow"&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: CFHT / S. Gwyn / S. Smith&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Крошечные галактики содержат тысячи звезд и простираются на сотни световых лет.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/490/472/7ea/4904727eaa7331077b578d1e3b76d51a.webp" alt="Гигантское скопление галактик Abell 2029 содержит в своем ядре галактику IC 1101. При поперечнике от 5,5 до 6,0 миллионов световых лет, более 100 триллионах звезд и массе почти квадриллион солнц, это крупнейшая известная галактика по многим параметрам. Обзор самой яркой галактики во всех скоплениях Abell выявляет космическое движение, которое не согласуется с диполем реликтового излучения. Источник: Digitized Sky Survey 2; NASA" title="Гигантское скопление галактик Abell 2029 содержит в своем ядре галактику IC 1101. При поперечнике от 5,5 до 6,0 миллионов световых лет, более 100 триллионах звезд и массе почти квадриллион солнц, это крупнейшая известная галактика по многим параметрам. Обзор самой яркой галактики во всех скоплениях Abell выявляет космическое движение, которое не согласуется с диполем реликтового излучения. Источник: Digitized Sky Survey 2; NASA" width="960" height="720"&gt;&lt;div&gt;&lt;figcaption&gt;Гигантское скопление галактик Abell 2029 содержит в своем ядре галактику IC 1101. При поперечнике от 5,5 до 6,0 миллионов световых лет, более 100 триллионах звезд и массе почти квадриллион солнц, это крупнейшая известная галактика по многим параметрам. Обзор самой яркой галактики во всех скоплениях Abell выявляет космическое движение, которое не согласуется с диполем реликтового излучения. &lt;a href="https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%BC:IC_1101_dss2.jpg" rel="noopener nofollow"&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: Digitized Sky Survey 2; NASA&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Крупнейшие галактики содержат более 100 триллионов звезд.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/684/be2/c9c/684be2c9cb82c46d81c2c9be7789ea71.webp" alt="Композиция из галактик от самой маленькой до самой большой, показанных (приблизительно) в реальном размере. Гигантская эллиптическая галактика в сердце скопления Abell 2029, IC 1101, является крупнейшей известной галактикой во Вселенной, по крайней мере, по звездной протяженности. Она гораздо, гораздо больше Млечного Пути или Андромеды (или любой спиральной галактики), и возвышается даже над другими типичными гигантскими эллиптическими галактиками. Источник: E. Siegel" title="Композиция из галактик от самой маленькой до самой большой, показанных (приблизительно) в реальном размере. Гигантская эллиптическая галактика в сердце скопления Abell 2029, IC 1101, является крупнейшей известной галактикой во Вселенной, по крайней мере, по звездной протяженности. Она гораздо, гораздо больше Млечного Пути или Андромеды (или любой спиральной галактики), и возвышается даже над другими типичными гигантскими эллиптическими галактиками. Источник: E. Siegel" width="959" height="539"&gt;&lt;div&gt;&lt;figcaption&gt;Композиция из галактик от самой маленькой до самой большой, показанных (приблизительно) в реальном размере. Гигантская эллиптическая галактика в сердце скопления Abell 2029, IC 1101, является крупнейшей известной галактикой во Вселенной, по крайней мере, по звездной протяженности. Она гораздо, гораздо больше Млечного Пути или Андромеды (или любой спиральной галактики), и возвышается даже над другими типичными гигантскими эллиптическими галактиками. &lt;em&gt;Источник: E. Siegel&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Джеты квазаров имеют еще б&lt;em&gt;о&lt;/em&gt;льшие размеры: &lt;a href="https://bigthink.com/starts-with-a-bang/longest-strongest-black-hole-jets-of-all-time-discovered/" rel="noopener nofollow"&gt;Парфирион простирается на беспрецедентные 24 миллиона световых лет&lt;/a&gt;.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/1e1/f6f/d33/1e1f6fd33a46ef330646a8237d35e4d1.webp" alt="Эта анимация демонстрирует Парфирион, его протяженность и особенности, наблюдаемые в радиодиапазоне с помощью LOFAR и GMRT. Это крупнейшая система джетов черной дыры, обнаруженная на сегодняшний день. Источник: Susanne Landis &amp;amp; Konrad Rappaport (Science Communication Lab)" title="Эта анимация демонстрирует Парфирион, его протяженность и особенности, наблюдаемые в радиодиапазоне с помощью LOFAR и GMRT. Это крупнейшая система джетов черной дыры, обнаруженная на сегодняшний день. Источник: Susanne Landis &amp;amp; Konrad Rappaport (Science Communication Lab)" width="800" height="548"&gt;&lt;div&gt;&lt;figcaption&gt;Эта анимация демонстрирует Парфирион, его протяженность и особенности, наблюдаемые в радиодиапазоне с помощью LOFAR и GMRT. Это крупнейшая система джетов черной дыры, обнаруженная на сегодняшний день. &lt;a href="https://sciencecommunicationlab.org/" rel="noopener nofollow"&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: Susanne Landis &amp;amp; Konrad Rappaport (Science Communication Lab)&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;В еще более крупных масштабах галактики собираются вместе, образуя структуры поперечником до сотен миллионов световых лет.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/501/e78/6fd/501e786fd3bcdb41fad412e485186f2d.webp" alt="Впечатляюще огромное скопление галактик MACS J1149.5+223, свет от которого шел до нас более 5 миллиардов лет, является одной из крупнейших связанных структур во всей Вселенной. В более крупных масштабах близлежащие галактики, группы и скопления могут казаться связанными с ним, но из-за темной энергии они удаляются от этого скопления; сверхскопления — это лишь кажущиеся структуры, но крупнейшие связанные скопления галактик все еще могут достигать сотен миллионов и, возможно, даже миллиарда световых лет в поперечнике. Источник: NASA, ESA, and S. Rodney (JHU) and the FrontierSN team; T. Treu (UCLA), P. Kelly (UC Berkeley), and the GLASS team; J. Lotz (STScI) and the Frontier Fields team; M. Postman (STScI) and the CLASH team; and Z. Levay (STScI)" title="Впечатляюще огромное скопление галактик MACS J1149.5+223, свет от которого шел до нас более 5 миллиардов лет, является одной из крупнейших связанных структур во всей Вселенной. В более крупных масштабах близлежащие галактики, группы и скопления могут казаться связанными с ним, но из-за темной энергии они удаляются от этого скопления; сверхскопления — это лишь кажущиеся структуры, но крупнейшие связанные скопления галактик все еще могут достигать сотен миллионов и, возможно, даже миллиарда световых лет в поперечнике. Источник: NASA, ESA, and S. Rodney (JHU) and the FrontierSN team; T. Treu (UCLA), P. Kelly (UC Berkeley), and the GLASS team; J. Lotz (STScI) and the Frontier Fields team; M. Postman (STScI) and the CLASH team; and Z. Levay (STScI)" width="960" height="960"&gt;&lt;div&gt;&lt;figcaption&gt;Впечатляюще огромное скопление галактик MACS J1149.5+223, свет от которого шел до нас более 5 миллиардов лет, является одной из крупнейших связанных структур во всей Вселенной. В более крупных масштабах близлежащие галактики, группы и скопления могут казаться связанными с ним, но из‑за темной энергии они удаляются от этого скопления; сверхскопления — это лишь кажущиеся структуры, но крупнейшие связанные скопления галактик все еще могут достигать сотен миллионов и, возможно, даже миллиарда световых лет в поперечнике. &lt;a href="https://hubblesite.org/contents/media/images/2015/08/3496-Image.html" rel="noopener nofollow"&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: NASA, ESA, and S. Rodney (JHU) and the FrontierSN team; T. Treu (UCLA), P. Kelly (UC Berkeley), and the GLASS team; J. Lotz (STScI) and the Frontier Fields team; M. Postman (STScI) and the CLASH team; and Z. Levay (STScI)&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/List_of_largest_cosmic_structures" rel="noopener nofollow"&gt;Крупнейшие сверхскопления, войды и филаменты&lt;/a&gt; (хотя и не будучи связанными гравитационно) простираются на 1,4 миллиарда световых лет.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/f14/66c/d35/f1466cd35b2b4bb322a3fa2c3206887c.webp" alt="Великая стена Слоуна — одна из крупнейших кажущихся, хотя, вероятно, временных структур во Вселенной, ее поперечник составляет около 1,37 миллиарда световых лет. Возможно, это просто случайное выравнивание нескольких сверхскоплений, но наблюдения определенно указывают на то, что это не единая гравитационно связанная структура, поскольку темная энергия разрывает ее. Галактики Великой стены Слоуна изображены справа. Источник: Willem Schaap (L); Pablo Carlos Budassi (R)/Wikimedia Commons" title="Великая стена Слоуна — одна из крупнейших кажущихся, хотя, вероятно, временных структур во Вселенной, ее поперечник составляет около 1,37 миллиарда световых лет. Возможно, это просто случайное выравнивание нескольких сверхскоплений, но наблюдения определенно указывают на то, что это не единая гравитационно связанная структура, поскольку темная энергия разрывает ее. Галактики Великой стены Слоуна изображены справа. Источник: Willem Schaap (L); Pablo Carlos Budassi (R)/Wikimedia Commons" width="1536" height="867"&gt;&lt;div&gt;&lt;figcaption&gt;Великая стена Слоуна — одна из крупнейших кажущихся, хотя, вероятно, временных структур во Вселенной, ее поперечник составляет около 1,37 миллиарда световых лет. Возможно, это просто случайное выравнивание нескольких сверхскоплений, но наблюдения определенно указывают на то, что это не единая гравитационно связанная структура, поскольку темная энергия разрывает ее. Галактики Великой стены Слоуна изображены справа. &lt;a href="https://en.wikipedia.org/wiki/File:2dfdtfe.gif" rel="noopener nofollow"&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: Willem Schaap (L); Pablo Carlos Budassi ®/Wikimedia Commons&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;В целом, наша наблюдаемая Вселенная имеет размер 92 миллиарда световых лет.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/732/73f/697/73273f697906b09203421fe10772a438.webp" alt="Размер нашей видимой Вселенной (желтый), а также область, которую мы можем достичь (пурпурный), если бы мы отправились сегодня в путешествие со скоростью света. Предел видимой Вселенной составляет 46,1 миллиарда световых лет, так как это предел того, насколько далеко находился бы объект, испустивший свет, который только сейчас доходит до нас, после расширения Вселенной в течение 13,8 миллиардов лет. Все, что происходит прямо сейчас в пределах радиуса 18 миллиардов световых лет от нас, в конечном итоге достигнет и повлияет на нас; все, что за этой точкой, — нет. Каждый год еще около 20 миллионов звезд пересекают этот порог достижимости. Источник: Andrew Z. Colvin and Frederic Michel, Wikimedia Commons; Annotations: E. Siegel" title="Размер нашей видимой Вселенной (желтый), а также область, которую мы можем достичь (пурпурный), если бы мы отправились сегодня в путешествие со скоростью света. Предел видимой Вселенной составляет 46,1 миллиарда световых лет, так как это предел того, насколько далеко находился бы объект, испустивший свет, который только сейчас доходит до нас, после расширения Вселенной в течение 13,8 миллиардов лет. Все, что происходит прямо сейчас в пределах радиуса 18 миллиардов световых лет от нас, в конечном итоге достигнет и повлияет на нас; все, что за этой точкой, — нет. Каждый год еще около 20 миллионов звезд пересекают этот порог достижимости. Источник: Andrew Z. Colvin and Frederic Michel, Wikimedia Commons; Annotations: E. Siegel" width="800" height="678"&gt;&lt;div&gt;&lt;figcaption&gt;Размер нашей видимой Вселенной (желтый), а также область, которую мы можем достичь (пурпурный), если бы мы отправились сегодня в путешествие со скоростью света. Предел видимой Вселенной составляет 46,1 миллиарда световых лет, так как это предел того, насколько далеко находился бы объект, испустивший свет, который только сейчас доходит до нас, после расширения Вселенной в течение 13,8 миллиардов лет. Все, что происходит прямо сейчас в пределах радиуса 18 миллиардов световых лет от нас, в конечном итоге достигнет и повлияет на нас; все, что за этой точкой, — нет. Каждый год еще около 20 миллионов звезд пересекают этот порог достижимости. &lt;a href="https://commons.wikimedia.org/wiki/User:Azcolvin429#Astronomy_Images_Created" rel="noopener nofollow"&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: Andrew Z. Colvin and Frederic Michel, Wikimedia Commons; Annotations: E. Siegel&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Но ненаблюдаемая Вселенная должна быть, &lt;a href="https://bigthink.com/starts-with-a-bang/universe-infinite/" rel="noopener nofollow"&gt;по крайней мере, в сотни раз больше&lt;/a&gt;.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/e3a/a9a/983/e3aa9a9834cf3efd19e47d1d3198a5ba.webp" alt="Эта симуляция показывает крупномасштабную структуру Вселенной в масштабах фактического космического горизонта: примерно 93 миллиарда световых лет в поперечнике. На этом уровне даже крупнейшие космические структуры сводятся к простым точкам, демонстрируя, насколько однородна, гладка и равномерна Вселенная в самых крупных космических масштабах. Источник: The Millennium Simulation, V. Springel et al.; Modifications: E. Siegel" title="Эта симуляция показывает крупномасштабную структуру Вселенной в масштабах фактического космического горизонта: примерно 93 миллиарда световых лет в поперечнике. На этом уровне даже крупнейшие космические структуры сводятся к простым точкам, демонстрируя, насколько однородна, гладка и равномерна Вселенная в самых крупных космических масштабах. Источник: The Millennium Simulation, V. Springel et al.; Modifications: E. Siegel" width="1337" height="1341"&gt;&lt;div&gt;&lt;figcaption&gt;Эта симуляция показывает крупномасштабную структуру Вселенной в масштабах фактического космического горизонта: примерно 93 миллиарда световых лет в поперечнике. На этом уровне даже крупнейшие космические структуры сводятся к простым точкам, демонстрируя, насколько однородна, гладка и равномерна Вселенная в самых крупных космических масштабах. &lt;a href="https://wwwmpa.mpa-garching.mpg.de/galform/virgo/millennium/" rel="noopener nofollow"&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: The Millennium Simulation, V. Springel et al.; Modifications: E. Siegel&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Насколько нам известно, &lt;a href="https://bigthink.com/starts-with-a-bang/cosmic-inflation-criticism-success/" rel="noopener nofollow"&gt;Вселенная может быть даже бесконечной&lt;/a&gt;.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/f80/c16/998/f80c16998d55a2869878752e04d40687.webp" alt="Мы можем представить себе очень большое число возможных исходов, которые могли бы возникнуть из условий, с которыми родилась наша Вселенная. Тот факт, что все 1090 частиц, содержащихся в нашей Вселенной, с взаимодействиями, которые они испытали, и результатами, к которым они пришли за последние 13,8 миллиардов лет, привел ко всем тонкостям нашего опыта, включая само наше существование. Возможно, если бы было достаточно шансов, это могло бы произойти много раз, приводя к сценарию, который мы называем «бесконечными параллельными Вселенными», содержащими все возможные исходы, включая пути, по которым наша Вселенная не пошла. Источник: MUSTAFABULENT / Adobe Stock" title="Мы можем представить себе очень большое число возможных исходов, которые могли бы возникнуть из условий, с которыми родилась наша Вселенная. Тот факт, что все 1090 частиц, содержащихся в нашей Вселенной, с взаимодействиями, которые они испытали, и результатами, к которым они пришли за последние 13,8 миллиардов лет, привел ко всем тонкостям нашего опыта, включая само наше существование. Возможно, если бы было достаточно шансов, это могло бы произойти много раз, приводя к сценарию, который мы называем «бесконечными параллельными Вселенными», содержащими все возможные исходы, включая пути, по которым наша Вселенная не пошла. Источник: MUSTAFABULENT / Adobe Stock" width="1536" height="864"&gt;&lt;div&gt;&lt;figcaption&gt;Мы можем представить себе очень большое число возможных исходов, которые могли бы возникнуть из условий, с которыми родилась наша Вселенная. Тот факт, что все 10&lt;sup&gt;90&lt;/sup&gt; частиц, содержащихся в нашей Вселенной, с взаимодействиями, которые они испытали, и результатами, к которым они пришли за последние 13,8 миллиардов лет, привел ко всем тонкостям нашего опыта, включая само наше существование. Возможно, если бы было достаточно шансов, это могло бы произойти много раз, приводя к сценарию, который мы называем «бесконечными параллельными Вселенными», содержащими все возможные исходы, включая пути, по которым наша Вселенная не пошла. &lt;em&gt;Источник: MUSTAFABULENT / Adobe Stock&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;em&gt;Mostly Mute Monday рассказывает астрономическую историю в изображениях, визуальных материалах и не более чем 200 словах.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Эта статья была опубликована в мае 2022 года. Обновлена в сентябре 2026 года.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Только зарегистрированные пользователи могут участвовать в опросе. &lt;a rel="nofollow" href="https://habr.com/kek/v1/auth/habrahabr/?back=&amp;amp;hl=ru"&gt;Войдите&lt;/a&gt;, пожалуйста.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Что вы думаете об истинных размерах Вселенной?&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;0%&lt;/span&gt;&lt;span&gt;Наша Вселенная конечна и единственна (Мультивселенной не существует)&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Наша Вселенная конечна, но не единственна (Мультивселенная существует)&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;50%&lt;/span&gt;&lt;span&gt;Наша Вселенная бесконечна, но единственна (Мультивселенной не существует)&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;25%&lt;/span&gt;&lt;span&gt;Наша Вселенная бесконечна, но не единственна (Мультивселенная существует)&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Свой вариант в комментариях&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt; Проголосовали 8 пользователей.   Воздержавшихся нет. &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/article&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;img alt="Хабр Карьера Курсы" src="https://habrastorage.org/webt/97/0d/9d/970d9d74094c58a7ed44dda9c1d40875.png"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;Хабр Курсы для всех&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt; Большая витрина: от крупнейших школ до частных авторов. Сравнивайте по цене, длительности, формату и выбирайте самый подходящий курс! &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
  &lt;noscript&gt;&lt;p&gt;&lt;img src="https://habr.com/mt/e?idsite=7&amp;amp;rec=1" alt=""&gt;&lt;/p&gt;&lt;/noscript&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">avshkol</dc:creator><pubDate>Sat, 03 Oct 2026 21:06:14 +0000</pubDate><guid>https://habr.com/ru/articles/1089804/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1089804</guid><category>Итан</category><category>Спросите Итана</category><category>Астрономия</category><category>Вселенная</category><category>Галактика</category><category>Размеры вселенной</category></item></channel></rss>