Linux && Windows


Установка веб-серверов Nginx и Apache.

Итоговая архитектура для разработки предполагается такая:

                Internet
                    ↓
        ┌─────────────────────┐
        │       Nginx         │  ← порт 8081 (вход)
        └─────────────────────┘
            ↓            ↓
     WordPress      .NET apps (опционально)
     (Apache)           (Kestrel)
            ↓
        MariaDB
        PostgreSQL

🥇 Роли компонентов

🌐 Nginx (front door)


🟦 Apache (только WordPress)

Apache HTTP Server

🚀 ШАГ 1 — установка пакетов

В Ubuntu:

sudo apt update

sudo apt install -y nginx

sudo apt install -y apache2

sudo apt install -y mariadb-server
sudo apt install -y postgresql


⚙️ ШАГ 2 — порты (ВАЖНО)

Apache уводим с 80:

sudo nano /etc/apache2/ports.conf

Примерное содержимое:

Listen 8082

<IfModule ssl_module>
	Listen 443
</IfModule>

<IfModule mod_gnutls.c>
	Listen 443
</IfModule>

И в site config:

sudo nano /etc/apache2/sites-available/000-default.conf

Примерное содержимое с учетом проекта на wordpress:

<VirtualHost *:8082>
	ServerAdmin webmaster@localhost
	DocumentRoot /var/www/html

	Alias /portfolio /mnt/d/Soft/Freelance/Wordpress/portfolio/site
	<Directory /mnt/d/Soft/Freelance/Wordpress/portfolio/site>
		Options Indexes FollowSymLinks Includes ExecCGI
		AllowOverride All
		Order allow,deny
		Allow from all
		Require all granted
	</Directory>

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
    
</VirtualHost>

Устанавливаем

sudo apt install -y php php-mysql libapache2-mod-php

Эта установка запустит триггеры, один из которых запустит Apache, теперь он будет на правильном порту, если запуска Apache не произойдет, перезапустим его вручную:

sudo systemctl restart apache2


🌐 ШАГ 3 — WordPress (Apache backend)

Документа root:

/var/www/html
Но выше в конфиге был определен алиас "portfolio", это папка, которая подмонтирована из windows и в ней установлен wordpress.

ШАГ 4 — включить mod_rewrite (нужно для WordPress)

sudo a2enmod rewrite


ШАГ 5 — права доступа (очень важно в WSL)

Иногда Apache не может читать Windows-диск:

sudo chmod -R 755 /mnt/d/Soft/Freelance/Wordpress/portfolio/site

База:

sudo mysql


CREATE USER 'dev'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'dev'@'%';
FLUSH PRIVILEGES;
Пользователь может иметь доступ к базе отвсюду.

Создайте базу данных и восстановите в нее дамп из вашего проекта на Wordpress.

🟨 ШАГ 6 — MariaDB

sudo systemctl enable mariadb
sudo systemctl start mariadb

Проброс порта 3306 наружу (в windows)

Пробрасываем на порт 3307, таким образом в windows может быть экземпляр базы  с портом по умолчанию, а к базе внутри WSL можно будет иметь доступ из таких приложений как DBeaver или MySQL Workbench.
При старте WSL он запускается в собственной сети, IP-адрес может меняться и лучше сделать стартовый скрипт, который будет это учитывать и пробрасывать порт наружу.
🧠 Что это за файл

fix-mysql-port.ps1 — это PowerShell-скрипт, который:

  • берёт актуальный IP WSL
  • пересоздаёт проброс порта 3307 → 3306
  • чтобы не зависеть от смены IP

🥇 ГДЕ СОЗДАТЬ

Создай его в любом удобном месте, например:

D:\Soft\DockerData\Scripts\fix-mysql-port.ps1

👉 главное — чтобы путь был простой


🧪 КАК СОЗДАТЬ
  1. Откройте Блокнот или VS Code
  2. Вставьте код:
$ip = (wsl hostname -I).Trim()

netsh interface portproxy delete v4tov4 listenport=3307 listenaddress=127.0.0.1 2>$null

netsh interface portproxy add v4tov4 `
listenport=3307 listenaddress=127.0.0.1 `
connectport=3306 connectaddress=$ip

Write-Host "WSL MariaDB → localhost:3307 → $ip"

  1. Сохраните как:
fix-mysql-port.ps1


🚀 КОГДА ЕГО ЗАПУСКАТЬ
✔ Вручную (пока проще всего)

Каждый раз:

  • после перезапуска WSL
  • после перезагрузки Windows
  • если не работает порт 3307

👉 запуск:

Откройте PowerShell:

powershell -ExecutionPolicy Bypass -File D:\Soft\DockerData\Scripts\fix-mysql-port.ps1
🧠 ПОЧЕМУ ЭТО НУЖНО

WSL меняет IP:

172.31.x.x → каждый запуск новый

👉 поэтому static portproxy НЕ работает стабильно


🧪 КАК ПРОВЕРИТЬ ЧТО ВСЁ ОК

После запуска скрипта:

netsh interface portproxy show all

Должно быть:

127.0.0.1:3307 → <WSL_IP>:3306


🧠 ВАЖНО (частая ошибка)

❌ НЕ подключайтесь в DBeaver к WSL IP
✔ всегда используйте:

127.0.0.1:3307

🟪 ШАГ 7 — PostgreSQL

sudo systemctl enable postgresql
sudo systemctl start postgresql
Проверка работы базы:
sudo systemctl status postgresql
Как и в случае с mySQL лучше сделать проброс порта наружу с другим номером. Postgres по умолчанию работает на порту 5432, делаем проброс на порт 5433. 
Сначала будет полезно добавить или поменять пароль у пользователя postgres базы:

Зайдите через системного пользователя:

sudo -u postgres psql

Потом:

ALTER USER postgres WITH PASSWORD 'StrongPassword123!';

И сразу:

\password postgres

(введите новый пароль вручную дважды)

Выйти:

\q

По умолчанию Postgres слушает localhost, поэтому нужно поправить конфиги, чтобы проброс порта был успешным.

✅ Проверить в WSL

Выполните:

sudo ss -tulpn | grep 5432


Что должно быть хорошо:
0.0.0.0:5432

или

*:5432


Если плохо:
127.0.0.1:5432

или

localhost:5432

Тогда внешний доступ из Windows через portproxy не работает.


🥇 Как исправить

1. Открыть конфиг PostgreSQL
sudo nano /etc/postgresql/*/main/postgresql.conf

Найдите:

#listen_addresses = 'localhost'

Замените на:

listen_addresses = '*'


2. Разрешить подключение

Откройте:

sudo nano /etc/postgresql/*/main/pg_hba.conf

Добавьте строку:


host all all 172.31.32.1/32 scram-sha-256

(если у вас в Windows есть уже запущенный Postgres и у него адрес именно такой)


3. Перезапустить PostgreSQL
sudo systemctl restart postgresql


🥇 Потом проверить снова

sudo ss -tulpn | grep 5432

Проброс порта:

По аналогии с mySql нужно внести изменения в файл start-dev-db.ps1

Вот полное содержимое файла для обоих серверов баз данных:

$ip = (wsl hostname -I).Trim()

# Удаляем старые правила (на всякий случай чистим и 127.0.0.1, и 0.0.0.0)
netsh interface portproxy delete v4tov4 listenaddress=127.0.0.1 listenport=3307
netsh interface portproxy delete v4tov4 listenaddress=127.0.0.1 listenport=5433
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=3307
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=5433

# Создаем новые правила с listenaddress=0.0.0.0
netsh interface portproxy add v4tov4 `
  listenport=3307 listenaddress=0.0.0.0 `
  connectport=3306 connectaddress=$ip

netsh interface portproxy add v4tov4 `
  listenport=5433 listenaddress=0.0.0.0 `
  connectport=5432 connectaddress=$ip

Write-Host ""
Write-Host "Portproxy rules:"
netsh interface portproxy show all

Write-Host ""
Write-Host "Ready:"
Write-Host "MariaDB    -> 0.0.0.0:3307"
Write-Host "PostgreSQL -> 0.0.0.0:5433"

В этой конфигурации предполагается, что обе базы могут прослушиваться не только с этого хоста, но и с внешних, это достигается через указание listenaddress=0.0.0.0, если нужно, чтобы базы были доступны только с этой машины, то нужно указать listenaddress=127.0.0.1

🌐 ШАГ 8 — Nginx (главный вход)

Конфиг:

sudo nano /etc/nginx/sites-available/default

📌 Конфигурация

Примерное содержимое файла:

server {
	listen 8081 default_server;
	listen [::]:8081 default_server;

	root /var/www/html;

	# Add index.php to the list if you are using PHP
	index index.html index.htm index.nginx-debian.html;

	server_name _;

	location / {
		proxy_pass http://127.0.0.1:8082;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}

}

Перезапуск Nginx:

sudo systemctl restart nginx

Windows Ubuntu WSL

Windows Ubuntu WSL

Установка Ubuntu через WSL под Windows.

Речь про WSL и дистрибутив Ubuntu.


🧱 ЧАСТЬ 1 — УСТАНОВКА WSL (правильно с нуля)

1. Установить WSL

Откройте PowerShell от администратора:

wsl --install

👉 Это:


2. Перезагрузка

После установки:
👉 обязательно перезагрузи ПК


3. Проверка

wsl -l -v

Ожидаемо:

Ubuntu    Stopped    2

4. Первый запуск Ubuntu

Запусти:

wsl -d Ubuntu

или через меню Пуск

👉 создаёшь:


5. Обновление системы

sudo apt update
sudo apt upgrade -y

⚙️ ЧАСТЬ 2 — ПОДГОТОВКА К ПЕРЕНОСУ НА D:

⚠️ Важно:
По умолчанию Ubuntu хранится на диске C:

Путь выглядит так:

C:\Users\<USER>\AppData\Local\Packages\...\LocalState\

🚚 ЧАСТЬ 3 — ПЕРЕНОС WSL НА ДИСК D (ПРАВИЛЬНЫЙ СПОСОБ)

1. Остановить WSL

wsl --shutdown

2. Экспорт Ubuntu (создание бэкапа)

wsl --export Ubuntu D:\wsl\ubuntu.tar

👉 создаётся резервная копия всей системы


3. Удаление старой Ubuntu из WSL

wsl --unregister Ubuntu

⚠️ Это удаляет привязку к старому ext4.vhdx


4. Импорт Ubuntu на диск D

wsl --import Ubuntu D:\wsl\Ubuntu D:\wsl\ubuntu.tar --version 2

👉 теперь система живёт на D:


5. Проверка

wsl -l -v

📍 ЧАСТЬ 4 — ПРОВЕРКА ПУТИ

Проверьте, где реально хранится система:

Get-ItemProperty HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss\* |
Select DistributionName, BasePath

👉 должно быть:

D:\wsl\Ubuntu\

🧹 ЧАСТЬ 5 — УДАЛЕНИЕ СЛЕДОВ НА C:

После успешного переноса:

Можно удалить:

C:\Users\<USER>\AppData\Local\Packages\...\LocalState\

(если осталась)


Также удалить архив:

D:\wsl\ubuntu.tar

(если перенос завершён успешно)


🧠 ЧАСТЬ 6 — ЧТО В ИТОГЕ ПОЛУЧАЕТЕ

Было:

Стало:


🚀 ЧАСТЬ 7 — РЕКОМЕНДАЦИИ (ВАЖНО)

После переноса:

включите systemd (для сервера):

sudo nano /etc/wsl.conf

Добавьте:

[boot]
systemd=true

Потом:

wsl --shutdown

Дополнительные сведения.

WSL запускается в окне Power Shell, после запуска вы попадаете в терминал, выйти из терминала можно через команду exit при этом WSL останется работающим, если же окно Power Shell закрыть, то WSL будет остановлен.

Если в системе есть еще установленные дистрибутивы WSL, то дистрибутив Ubuntu может оказаться не основным по умолчанию и команда 

wsl -l -v

может выдать примерно следующее:

NAME                   STATE           VERSION
  *docker-desktop        Stopped         2
  Ubuntu                 Stopped         2
  docker-desktop-data    Stopped         2

Чтобы сделать Ubuntu основным дистрибутивом по умолчанию выполните следующую команду:

wsl --set-default Ubuntu

В разных окнах Power Sell можно несколько раз выполнить команду wsl но среда WSL будет запущена только один раз, все остальные команды откроют терминалы к этой среде.

❌ Остановка WSL

wsl --shutdown

👉 тогда:

🎯 ИТОГ

✔ WSL ставится через wsl --install
✔ Ubuntu создаётся на C по умолчанию
✔ перенос делается через:

Windows Ubuntu WSL

Создание пользователя - администратора

Текущая работа от root в WSL неудобна и рискованна. Лучше создать обычного пользователя devadmin, дать ему sudo-права и перевести dev-среду на него. Создать пользователя admin не получится, так как уже есть группа с таким названием.


🏆 Что важно понять заранее

Не все сервисы нужно “переводить” на пользователя devadmin.

Системные сервисы уже работают правильно:

Это нормально и менять не надо.

Что реально перевести на admin

✔ вход в WSL
✔ твои проекты
✔ MinIO
✔ dotnet run / build / git / npm
✔ домашние папки


🥇 План действий

1. Создать devadmin
2. Дать sudo
3. Сделать default user
4. Перенести dev-файлы
5. MinIO запускать от admin
6. root оставить только для администрирования

🥇 ШАГ 1 — создать пользователя

Сейчас все работает под root, это удобно.

adduser devadmin

Задайте пароль.


🏆 ШАГ 2 — дать sudo права

usermod -aG sudo devadmin

Проверить:

id devadmin

Должно быть:

groups=...,sudo

🏆 ШАГ 3 — проверить домашнюю папку

ls /home

Должно появиться:

administrator
devadmin

🏆 ШАГ 4 — сделать default user для WSL

В Windows PowerShell:

ubuntu config --default-user devadmin

🏆 ШАГ 5 — проверить

Закройте WSL и снова откройте:

wsl -d Ubuntu

Потом:

whoami

Должно быть:

devadmin

🏆 ШАГ 6 — дать доступ к проектам

Если проекты лежат в:

/home/administrator

или на D: — отдельно настроим.

Создайте dev-папки:

mkdir -p /home/devadmin/projects
mkdir -p /home/devadmin/services
mkdir -p /home/devadmin/backups


🏆 ШАГ 7 — MinIO перевести на devadmin

Когда пользователь будет создан:

sudo mkdir -p /home/devadmin/minio-data
sudo mkdir -p /home/devadmin/minio-config
sudo chown -R devadmin:devadmin /home/devadmin/minio-data
sudo chown -R devadmin:devadmin /home/devadmin/minio-config

🧠 Что с nginx/apache/db

Оставляем как есть:

nginx -> www-data
apache -> www-data
MariaDB -> mysql
Postgres -> postgres

Это правильно.


Windows Ubuntu WSL

Что такое WSL

WSL (Windows Subsystem for Linux) — это подсистема Linux внутри Windows, которая позволяет запускать полноценное Linux-окружение без отдельной виртуальной машины.

Что даёт WSL

Linux-команды

Можно выполнять:

ls
grep
find
ssh
curl

как на обычном сервере Ubuntu.

Разработка как на сервере

Если ваш хостинг работает на Ubuntu, то WSL очень удобен:

Продакшен: Ubuntu
Разработка: Ubuntu (WSL)

Меньше различий между средами.

Docker

Большинство разработчиков под Windows используют Docker через WSL.

.NET

Можно поставить Linux-версию SDK:

dotnet --version

и собирать проект так же, как на сервере.

React / Node.js

Обычно работают быстрее и стабильнее в WSL, чем в некоторых конфигурациях Windows.

Как это устроено

В современных версиях используется лёгкая виртуализация.

У WSL есть собственная сеть:

Windows
  172.31.32.1

WSL
  172.31.xx.xx

Именно поэтому вы можете видеть:

cat /etc/resolv.conf
nameserver 172.31.32.1

Это адрес Windows, который виден из WSL.

 

Чем WSL отличается от виртуальной машины

Виртуальная машина

Например, через Oracle VM VirtualBox или VMware Workstation:

Windows
 └─ Полноценная VM
     └─ Ubuntu

Плюсы:

Минусы:

WSL

Windows
 └─ Ubuntu

Плюсы:

Почему VS Code любит WSL

Когда открываете проект через:

Remote - WSL

VS Code устанавливает внутри Linux свой сервер:

~/.vscode-server

Поэтому вы видели каталоги вроде:

~/.vscode-server/data/logs

Именно там лежат логи Copilot и Continue.

 

Windows Ubuntu WSL

Настройка Git в WSL-Ubuntu && Windows

Зайдите в папку проекта.

Проверка версии Git

Чтобы узнать, какая версия Git установлена в Ubuntu:

git --version

(Если нужно обновить Git до актуальной версии в Ubuntu: sudo apt update && sudo apt install git -y).

Проверить, установлена ли утилита GitHub CLI (gh) в вашей системе (в WSL Ubuntu, PowerShell на Windows или Linux), можно с помощью любой из следующих команд:

Проверка версии (Самый простой способ)

Выполните в терминале:

Bash
gh --version

Проверка пути к исполняемому файлу

Как быстро установить gh, если его нет:

В WSL / Ubuntu:

sudo apt update && sudo apt install gh -y

В Windows (через winget в PowerShell):

winget install --id GitHub.cli

Перед началом работы с репозиторием в GitHub вам нужно к нему подключиться с помощью команды 

gh auth login

Далее последует небольшой диалог, в приведенном примере я использую ключ GitHub для авторизации:

gh auth login
? What account do you want to log into? GitHub.com
? What is your preferred protocol for Git operations on this host? HTTPS
? Authenticate Git with your GitHub credentials? Yes
? How would you like to authenticate GitHub CLI? Paste an authentication token
Tip: you can generate a Personal Access Token here https://github.com/settings/tokens
The minimum required scopes are 'repo', 'read:org', 'workflow'.
? Paste your authentication token: **************************************************
- gh config set -h github.com git_protocol https
✓ Configured git protocol
! Authentication credentials saved in plain text
✓ Logged in as YourGitLogin

Чтобы склонировать репозиторий с GitHub со всеми ветками и полной историей, достаточно выполнить стандартную команду git clone:

git clone git@github.com:username/repository.git

(Или через HTTPS / GitHub CLI, например: gh repo clone username/repository).

Вопреки распространенному заблуждению, стандартный git clone по умолчанию скачивает абсолютно ВСЕ ветки, теги и всю историю проекта.

Однако локально Git сразу создает текстовую указательную ветку только для главной (обычно main или master). Остальные ветки остаются в так называемом режиме отслеживания (remote-tracking branches).

Как увидеть все забранные ветки и работать с ними

1. Посмотреть список всех веток

Перейдите в папку проекта (cd repository) и выполните:

git branch -a

Вы увидите список:

* main
  remotes/origin/HEAD -> origin/main
  remotes/origin/main
  remotes/origin/dev
  remotes/origin/feature-login

Все ветки с префиксом remotes/origin/ уже находятся на вашем компьютере, их не нужно скачивать заново из интернета.

2. Как переключиться на нужную ветку

Чтобы начать работать с любой из локально загруженных веток (например, dev), просто переключитесь на нее:

git checkout dev

(В современных версиях Git также можно использовать git switch dev).

Git автоматически создаст локальную ветку dev, свяжет ее с origin/dev и переключит ваш рабочий каталог.

Если вам нужно гарантированно развернуть ЛОКАЛЬНЫЕ копии ВСЕХ веток сразу

Если ваша цель — не просто скачать проект, а сделать так, чтобы команда git branch (без флага -a) сразу показывала полный список всех веток как локальных, используйте короткий однострочник прямо в терминале:

В WSL / Ubuntu (Bash):

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all

В Windows PowerShell:

git branch -r | Where-Object { $_ -notmatch '->' } | ForEach-Object {
    $branch = $_.Trim().Replace('origin/', '')
    git branch --track $branch $_.Trim()
}
git fetch --all

После выполнения этого скрипта каждая удаленная ветка превратится в полноценную локальную ветку.

Рекомендуемый файл .gitignore для проекта в связке с .NET и REACT:

# ==========================================
# .NET / C# (Правила сработают для любой подпапки)
# ==========================================
## --- Build & Output directories ---
bin/
obj/
out/
[Bb]in/
[Ob]j/

## --- Visual Studio & Rider temporary files ---
.vs/
.idea/
*.user
*.userosscache
*.sln.docstates
*.suo
*.userprefs

## --- NuGet Packages & Cache ---
*.nupkg
*.snupkg
**/packages/
project.lock.json
project.assets.json

## --- Local settings & Secrets ---
# Локальные пользовательские конфигурации (раскомментируйте, если не хотите коммитить appsettings.Development.json)
# appsettings.Development.json
# appsettings.*.local.json
secrets.json

## --- Test Results & Coverage ---
[Tt]est[Rr]esult*/
*.coverage
*.coveragexml

# ==========================================
# Node.js / Frontend (Vue, React и т.д.)
# ==========================================
node_modules/
dist/
.npm
*.log

# ==========================================
# Общие временные файлы ОС
# ==========================================
.DS_Store
Thumbs.db

 

 

Установка MinIO

Инструкция по установке под пользователем devadmin в WSL Ubuntu Windows с автозапуском через systemd.

🏆 Что получим

User: devadmin
Data: /home/devadmin/minio-data
Console: http://localhost:9001
API:     http://localhost:9000
Autostart: yes

🥇 ШАГ 0 — зайти под devadmin

Проверьте:

whoami

Должно быть:

devadmin

Если нет:

su - devadmin

🥇 ШАГ 1 — скачать MinIO

wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/

Проверка:

minio --version

🥇 ШАГ 2 — создать каталоги

mkdir -p /home/devadmin/minio-data
mkdir -p /home/devadmin/minio-config

🥇 ШАГ 3 — создать env файл

nano /home/devadmin/minio-config/minio.env

Вставьте:

MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=StrongPass123!
MINIO_VOLUMES=/home/devadmin/minio-data
MINIO_OPTS=--console-address :9001

Сохраните.

Нужно иметь в виду, что

MINIO_ROOT_USER=admin 

это пользователь-администратор внутри MinIO и к текущему пользователю devadmin отношения не имеет.


🥇 ШАГ 4 — создать systemd сервис

sudo nano /etc/systemd/system/minio.service

Вставьте:

[Unit]
Description=MinIO Object Storage
After=network.target

[Service]
User=devadmin
Group=devadmin
WorkingDirectory=/home/devadmin

Environment="MINIO_ROOT_USER=admin"
Environment="MINIO_ROOT_PASSWORD=StrongPass123!"

ExecStart=/usr/local/bin/minio server /home/devadmin/minio-data --console-address :9001

Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

🥇 ШАГ 5 — включить автозапуск

sudo systemctl daemon-reload
sudo systemctl enable minio
sudo systemctl start minio

🥇 ШАГ 6 — проверить статус

sudo systemctl status minio

Должно быть:

active (running)

🥇 ШАГ 7 — открыть в Windows

Браузер:

http://localhost:9001

Логин:

admin

Пароль:

StrongPass123!

🥇 ШАГ 8 — создать bucket

В UI:

uploads

🧠 Если localhost не открывается

Проверь:

sudo ss -tulpn | grep 900

🏆 После этого можно использовать в .NET

Endpoint: http://localhost:9000
AccessKey: admin
SecretKey: StrongPass123!
Bucket: uploads

🥇 Важно

Если systemd ещё не включён:

sudo nano /etc/wsl.conf

Добавить:

[boot]
systemd=true

Затем из Windows:

wsl --shutdown

 

Настройка VPN через туннель к VPS

Окружение для настройки.

Установка туннеля.

Нужно открыть windows PowerShell от лица администратора. 

В windows PowerShell нужно подключиться к вашему VPS:

ssh -D 0.0.0.0:1080 -N root@[IP_your_vps]

Windows может попросить подтвердить использование туннеля.

Если у вас нет ключа доступа к VPS, то потребуется ввести пароль для root.

Сессия откроется, это окно PowerShell нужно оставить открытым, оно "зависнет", то есть через туннель пойдет обмен.

Откройте другое окно PowerShell с обычными правами. Проверка соединения:

curl.exe --proxy socks5h://127.0.0.1:1080 https://api.ipify.org

Команда должна показать IP вашего VPS.

В настройках Windows есть раздел "proxy" его можно использовать  для включения обмена, но с оговорками. Нужно иметь в виду, что туннель открывается только для протокола socks, для протоколов http и https он не работает. В поле "Proxy IP address"  нужно прописать 

socks=127.0.0.1:1080

в поле для значения порта ничего быть не должно.

После того, как вы запишите эти настройки, они корректно пропишутся в реестр windows, но при редактировании оттуда будут взяты неверные значения. при повторной записи работа прокси сломается, ниже пример того, как интерпретирует эти настройки интерфейс windows:

proxy-2.jpg

для корректной настройки лучше пользоваться PowerShell, чтобы посмотреть настройки используйте команду

 Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings'

для установки протокола socks:

Set-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyServer 'socks=127.0.0.1:1080'

Нужно иметь в виду, что с таким proxy в вашем случае будут работать только те приложения, которые используют протокол socks. 

Не все приложения Windows используют системный SOCKS-прокси.

Например:

Для включения proxy используйте команду

Set-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyEnable 1

В обычном cmd.exe (или FAR например) аналог делается через reg add.

Включить прокси:

reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 1 /f

Отключить прокси:

reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 0 /f

Установить SOCKS-прокси:

reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /t REG_SZ /d "socks=127.0.0.1:1080" /f

Проверить текущие значения:

reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer

После изменения реестра некоторые программы сразу подхватывают настройки, а некоторые — только после перезапуска. Чтобы уведомить Windows о смене настроек прокси без выхода из системы, можно выполнить:

RUNDLL32.EXE inetcpl.cpl,LaunchConnectionDialog

или просто перезапустить приложение (браузер, VS Code и т.п.).

Пояснения по открытию туннеля от ChatGPT.

Вопрос:

что конкретно делает эта команда ssh -D 0.0.0.0:1080 -N root@[IP_your_vps]

На вашем компьютере запускается локальный SOCKS5-прокси на порту 1080.

Все программы, которые используют этот SOCKS-прокси, будут выходить в интернет через VPS.

Схема:

Приложение
    ↓
SOCKS5 127.0.0.1:1080
    ↓
SSH-соединение
    ↓
VPS
    ↓
Интернет

Разбор параметров

ssh

Запускает SSH-клиент.

root@IP_VPS

Подключается к VPS:

Пользователь: root
Сервер: IP_VPS

Например:

ssh root@38.242.220.114
-D

Означает Dynamic Port Forwarding.

То есть SSH создаёт SOCKS-прокси.

Например:

-D 1080

создаёт:

SOCKS5 localhost:1080

Любая программа, умеющая SOCKS5, может его использовать.

0.0.0.0:1080

Очень важный момент.

Если написать:

-D 1080

или

-D 127.0.0.1:1080

то SOCKS будет доступен только на локальном интерфейсе Windows.

WSL обычно не сможет к нему подключиться напрямую.

Если написать:

-D 0.0.0.0:1080

то SSH слушает на всех интерфейсах:

127.0.0.1
LAN IP
WSL gateway
и т.д.
-N

Означает:

Не запускать shell на VPS

То есть:

❌ не открывать консоль Linux

✅ только держать туннель

Окно просто висит:

ssh -D ...

и прокси работает.

Что НЕ делает эта команда

Она НЕ создаёт полноценный VPN.

Не происходит автоматического перенаправления всего трафика.

Например в WSL:

curl https://api.ipify.org

по умолчанию всё ещё идёт напрямую.

А вот:

curl --proxy socks5h://172.31.32.1:1080 https://api.ipify.org

идёт через VPS.

Чем отличается от VPN

VPN:

Весь трафик
    ↓
VPN
    ↓
VPS

SSH SOCKS:

Только программы,
которые настроены на SOCKS
    ↓
VPS

Почему это удобно

Для связки:

Windows
 └─ WSL
     └─ VS Code
         └─ Continue

достаточно настроить Continue, VS Code или переменные окружения на использование SOCKS.

Тогда:

будут работать через VPS,

а остальной интернет останется обычным.

Для дополнительной безопасности я бы рекомендовал использовать не root, а отдельного пользователя на VPS:

ssh -D 0.0.0.0:1080 -N devadmin@IP_VPS

Это не влияет на работу туннеля, но считается хорошей практикой администрирования.

Настройка SSH для VPS (Windows && Linux-WPS)

Настройка под Windows.

Для настройки соединения у вас обязательно должен быть файл с приватным ключом и желательно с публичным тоже. В моем примере я использую ключи в формате ED25519, которые приходят сейчас на смену ключам RSA. На VPS вы сгенирировали файлы с ключами, в моем случае они назывались id_ed25519 и id_ed25519.pub, лучше их переименовать в виде id_ed25519_myproxy и id_ed25519_myproxy,pub. Если у вас имеется несколько серверов с различными ключами, то названия файлов будут различаться и подключение будет управляться через файл config.

Положите файлы в папку C:\Users\[your_user_name]\.ssh\, в той же папке создайте файл config без расширения примерно с таким содержанием:

Host myproxy
    HostName 11.22.33.44                   # IP-адрес или домен вашего VPS
    User root                              # Логин для подключения
    IdentityFile ~/.ssh/id_ed25519_myproxy # Путь к файлу ключа
    DynamicForward 0.0.0.0:1080            
    IdentitiesOnly yes
    SessionType none
    Port 22                                # Порт (если меняли стандартный)
  

Строка DynamicForward 0.0.0.0:1080 это прямой аналог флага -D 0.0.0.0:1080 в файле конфигурации. Он включает локальный SOCKS5-прокси на порту 1080 для всех сетевых интерфейсов (0.0.0.0), строка SessionType none это директива RequestTTY no которая аналогична флагу -N и позволяет не выполнять команды на удаленном сервере, а только держать туннель.

Запуск туннеля на ваш сервер будет теперь выполняться одной командой:

ssh myproxy
Проверить, открыт ли порт 1080 и слушаются ли на нем подключения, можно прямо из консоли Windows (Command Prompt / PowerShell) или из среды WSL.

Ниже приведено несколько простых способов проверки работает ли соединение.

Способ 1. Проверка через PowerShell (Windows) — Самый удобный

Откройте PowerShell от имени администратора или обычного пользователя и выполните:

PowerShell
Get-NetTCPConnection -LocalPort 1080 -ErrorAction SilentlyContinue

Способ 2. Классическая команда netstat (Windows CMD / PowerShell)

Откройте командную строку или PowerShell и выполните:

DOS
netstat -ano | findstr :1080

Способ 3. Проверка через терминал WSL (Linux)

Если туннель или проверяемое приложение запущены внутри WSL, используйте стандартные утилиты Linux:

Bash
# Через ss (современный аналог netstat)
ss -tulpn | grep 1080

# Или через классический netstat
netstat -tulpn | grep 1080

Способ 4. Экспресс-проверка подключения (Test-NetConnection)

Если вы хотите убедиться, что порт не просто открыт, а к нему действительно можно успешно подключиться локально (например, со стороны браузера или приложения):

PowerShell
Test-NetConnection -ComputerName 127.0.0.1 -Port 1080
В ответ вы получите отчет. Обратите внимание на нижнюю строку:

Узнать, какая программа заняла порт:
Если порт 1080 занят, но вы не уверены, чем именно, узнайте PID из команды netstat (последнее число в строке) и выполните в PowerShell:
PowerShell
Get-Process -Id <PID>

Работа с MS Vs Code

Настройка, работа в Windows и Linux, подключение AI-агентов и плагинов.

Работа с MS Vs Code

Настройка VS Code для работы в WSL

WSL - это среда Linux под Windows подробнее о WSL.

Для стека Ubuntu-хостинг + .NET 10 + React + SSH-туннели VS Code через WSL обычно удобнее, чем запуск проекта напрямую в Windows.

1. Среда разработки совпадает с сервером

Если у вас продакшен на Ubuntu.

Когда VS Code открыт как:

WSL: Ubuntu

команды выполняются в Linux:

dotnet build
npm install
npm run dev

То есть почти в той же среде, что и сервер.

Меньше сюрпризов вида:

"На Windows работает, а на Ubuntu нет".

2. Лучше работает Node.js и React

Многие инструменты фронтенда изначально ориентированы на Linux/macOS.

Например:

обычно чувствуют себя в WSL стабильнее, чем при работе с проектом на диске Windows.

Особенно это заметно на больших проектах.

3. Нормальные Linux-инструменты

Сразу доступны:

grep
find
sed
awk
ssh
rsync
curl

Не нужно искать Windows-аналоги.

4. Удобнее работать с сервером

Если вы постоянно используете SSH к VPS.

В WSL можно:

ssh server
scp file
rsync project

без дополнительных утилит.

5. AI-инструменты работают рядом с кодом

Когда VS Code открыт в WSL:

VS Code
  ↓
VS Code Server (в WSL)
  ↓
Continue / Copilot
  ↓
Файлы проекта

AI видит проект напрямую в Linux-среде.

6. .NET ближе к реальному продакшену

Если сервер Ubuntu, то:

dotnet publish

в WSL собирает проект в Linux-окружении.

Легче ловить проблемы:

Когда лучше открывать через Windows

Есть случаи, когда удобнее работать напрямую из Windows:

Но если у вас:

React
ASP.NET Core
Ubuntu

то WSL выглядит более естественным вариантом.

Важный момент

Если вы используете WSL, держите проект внутри Linux-файловой системы:

/home/devadmin/projects/myapp

а не в:

/mnt/c/Users/...

На небольших проектах разница может быть незаметна, но на React-проектах с большим количеством файлов производительность и скорость работы инструментов обычно лучше внутри файловой системы WSL.

Для работы в WSL вам нужно выполнить сначала установку VS Code под Windows, скачайте его с официального сайта по ссылке.

После запуска установленного VS Code вам нужно установить расширение WSL. Перейдите на вкладку расширений и в строке поиска наберите:

wsl

В результатах поиска найдите расширение с названием WSL и примерно таким описанием:

Open any folder in the Windows Subsystem for Linux (WSL) and take advantage of Visual Studio Code's full feature set.

Установите это расширение. После установки вы сможете работать с WSL. Для этого нужно сделать к нему подключение. 

Нажмите Ctrl->Alt->O или кликните в нижнем левом углу по иконке "><",откроется Remote Menu, в нем выберите "Connect to WSL", после запуска будет загружен и запущен сервер VS Code в WSL, затем вы сможете работать в проводнике с папками в вашем WSL-хранилище.

Установка плагина Continue и настройка под ним AI-моделей.

 

 

-- Что ниже пока неизвестно, нужно или нет --

Откройте:

nano ~/.bashrc

добавьте в конец:

export ALL_PROXY=socks5://172.31.32.1:1080
export HTTP_PROXY=socks5://172.31.32.1:1080
export HTTPS_PROXY=socks5://172.31.32.1:1080

Сохраните:

Ctrl+O
Enter
Ctrl+X

Применить:

source ~/.bashrc
Для VS Code Remote WSL

В settings.json:

{
    "http.proxy": "socks5://172.31.32.1:1080",
    "http.proxySupport": "override",
    "http.proxyStrictSSL": false
}

После этого:

из WSL будут идти через VPS.


Ваша итоговая схема теперь:

Windows
   |
   | SSH -D 0.0.0.0:1080
   |
   v
VPS (38.242.221.111)
   |
   v
Internet

WSL
   |
   v
172.31.32.1:1080



Работа с AI

Работа с AI

Аккаунт DeepSeek

На момент написания этой статьи DeepSeek требует регистрации даже для использования бесплатного чата в веб-интерфейсе. В статье рассматривается работа с API DeepSeek. Ссылка на страницу:

https://platform.deepseek.com

Если у вас есть аккаунт, то укажите логин и пароль, если аккаунта нет, его нужно создать.

Для использования API DeepSeek вам нужно создать как минимум один ключ. Перейдите на страницу API Keys и создайте ключ. Для ключа нужно указать название. После создания ключа вам будет показано окно со значением ключа, ключ нужно скопировать в надежное место, после закрытия окна ключ вы больше увидеть не сможете. 

Я не рассматриваю в этой статье использование бесплатных моделей, поэтому для работы с платными вам нужно пополнить баланс. Если у вас есть банковская карта, выпущенная не в России, то баланс вы можете пополнить обычным способом. Если вы из России, то можно использовать платежные сервисы. Я не рекомендую никакие платежные сервисы, вы можете просмотреть их например вот здесь

https://sao-rating.ru/

и выбрать, какой вам понравится.

DeepSeek для API использует протоколы OpenAI/Anthropic, пока мной проверен только OpenAI. 

Самый простой способ - использовать переменные окружения.

Настройка переменных окружения

Для Windows (CMD):
cmd
set DEEPSEEK_API_KEY=ваш_ключ_здесь
set OPENAI_API_BASE=https://api.deepseek.com/v1
Для Windows (PowerShell):
powershell
$env:DEEPSEEK_API_KEY="ваш_ключ_здесь"
$env:OPENAI_API_BASE="https://api.deepseek.com/v1"
Для Linux/Mac:

bash

export DEEPSEEK_API_KEY="ваш_ключ_здесь"
export OPENAI_API_BASE="https://api.deepseek.com/v1"

В некоторых случаях ключ OPENAI_API_BASE не нужен, его наличие может внести путаницу при обращении к API моделей, которые могут работать одновременно с моделями DeepSeek, некоторые агенты для работы с AI моделями знают эти URL, поэтому попробуйте сначала устанавливать просто ключ DEEPSEEK_API_KEY.

У DeepSeek на момент написания этой статьи есть скидки на работу в часы off-peak, посмотрите актуальную информацию об этом в документации, сейчас она находится на странице
https://api-docs.deepseek.com/quick_start/pricing
Для экономии средств есть рекомендация писать промпты на английском языке, так как обработка английских букв примерно на 40% дешевле, чем, например, русских.

Работа с AI

Работа с AIDER

Aider — это Open Source CLI-инструмент (консольная утилита), созданный специально для парного программирования с LLM прямо в вашем терминале.

В отличие от классических плагинов для VS Code, Aider спроектирован вокруг глубокой интеграции с Git и концепции Репозиторной карты (Repository Map).

Как устроено общение с моделью в Aider

Процесс взаимодействия с моделью в Aider строится по схеме «Чат \ Понимание контекста \ Правка файлов \ Git Commit»:

  1. Контекст файлов (In-Chat Files):

    Вы явно добавляете в чат файлы, которые модель должна редактировать или читать, с помощью команды /add path/to/file.cs. Aider держит их содержимое в актуальном состоянии в окне контекста.

  2. Автоматическая карта репозитория (Repo Map):

    Даже если вы добавили в чат всего один файл, Aider сканирует весь ваш Git-репозиторий с помощью парсеров tree-sitter. Он строит компактную карту архитектуры: имена классов, методов, сигнатуры и их взаимосвязи по всему проекту. Эта карта автоматически передается модель в сжатом виде — нейросеть «знает» о существовании остальных сервисов и DTO, не перегружая контекстное окно лишним кодом.

  3. Специальный формат edits (Edit Formats):

    Aider не заставляет модель переписывать 500 строк файла целиком. В зависимости от выбранной модели он заставляет её отвечать в формате SEARCH/REPLACE блоков (показывает, какой кусок кода найти и на что заменить). Это резко снижает рассуждения и экономит токены.

  4. Автоматические Git-коммиты:

    Как только модель присылает правки, Aider сам применяет их к файлам на диске и автоматически делает аккуратный git commit с понятным описанием (например, git commit -m "Add UserDTO mapping"). Если результат вам не понравился, достаточно ввести /undo — и Aider откатит изменения.

Установка AIDER

Установка Aider через pipx — это официальный и наиболее рекомендуемый способ, так как он изолирует зависимости Aider от системного Python и других пакетов в WSL/Linux.

Описанные ниже действия проверялись мной в системе WSL.

Выполните следующие шаги в терминале WSL:

Шаг 1. Установите pipx (если он еще не установлен)

Bash
sudo apt update
sudo apt install -y pipx
pipx ensurepath
(После выполнения pipx ensurepath может потребоваться перезапустить терминал или выполнить source ~/.bashrc, чтобы пути к бинарникам обновились).

Шаг 2. Установите Aider

Выполните команду установки:

Bash
pipx install aider-chat

Шаг 3. Доустановите SOCKS и сетевые зависимости (Обязательно для OpenRouter / WSL)

Чтобы избежать ошибок вида Missing dependencies for SOCKS support при работе через OpenRouter или прокси, сразу внедрите сетевые пакеты в изолированное окружение Aider:

Bash
pipx inject aider-chat PySocks requests[socks] urllib3

Шаг 4. Проверьте установку

Проверьте, что Aider доступен в системе и выводит версию:

Bash
aider --version

Полезные команды для обслуживания pipx в будущем

Настройки proxy.

Если вы находитесь в России, то большинство AI моделей не будет работать с вашим регионом, если к ним обращаться напрямую. Ниже описан рабочий вариант при открытом туннеле на внешний VPS для порта 1080, используются SOCKS. Как настроить туннель на внешний VPS описано здесь и здесь.

Эти действия необходимо выполнить перед запуском оболочки AIDER, чтобы она подхватила эти переменные. 

Настройка AI моделей.

Aider работает с 3 моделями:

weak-model

В Aider концепция weak-model (слабая / вспомогательная модель) используется для экономии денег и токенов.

Главная модель (--model) выполняет «тяжелую» умственную работу: пишет код, строит архитектуру и анализирует сложные взаимосвязи. weak-model берет на себя рутинные служебные задачи, которые не требуют высокой экспертизы или сложного Reasoning.

Основные функции weak-model:
  1. Генерация сообщений для Git-коммитов (Commit Messages)

    • Когда Aider вносит изменения в файлы, он автоматически создает commit в вашем Git-репозитории.

    • weak-model смотрит на git diff и формирует короткое понятное описание изменений (например: feat: add FluentValidation for LoginRequest).

  2. Сжатие и саммаризация истории чата (Chat Summarization)

    • Когда диалог становится слишком длинным и подбирается к лимиту контекста, Aider автоматически сжимает старые сообщения.

    • weak-model пересказывает старую часть переписки краткой выжимкой, чтобы освободить место для нового кода.

  3. Оценка и фильтрация Repo Map (Карты репозитория)

    • При сборке дерева файлов проекта weak-model помогает отсеивать нерелевантные куски кода, не перегружая контекст основной модели.

  4. Простые вспомогательные проверки

    • Форматирование служебных ответов и обработка системных вызовов CLI.

Почему важно правильно настроить weak-model?

editor-model


В Aider концепция editor-model (модель-редактор) отвечает за непосредственное применение изменений к файлам вашего проекта.

В то время как главная модель (--model) придумывает что и как изменить в коде, editor-model занимается рутинной «хирургической» работой — она берет предложенный код и аккуратно вставляет его в нужные места исходных файлов.

Основные функции editor-model:
  1. Форматирование diff'ов и замена кода (Editing / Search-Replace)

    • Модель принимает инструкции от главной модели и переводит их в точный формат правок Aider (обычно блоки <<<<<<< SEARCH ... ======= ... >>>>>>> REPLACE).

    • Она находит нужные строки в файле и перезаписывает их, сохраняя форматирование, отступы и структуру вокруг.

  2. Работа в режиме Architect (/architect)

    • Это главный сценарий, где выделение editor-model раскрывает себя на 100%.

    • В режиме Архитектора Main model (например, deepseek-r1 или claude-3-5-sonnet) выступает в роли «мозга»: пишет план, проектирует архитектуру и описывает изменения на верхнем уровне.

    • Затем Editor model (более быстрая и дешевая модель) берет этот план и превращает его в реальные правки в файлах на диске.

  3. Исправление ошибок синтаксиса при записи

    • Если при применении изменений произошел сбой (например, не совпал фрагмент кода для поиска), editor-model пытается скорректировать замену, чтобы не сломать файл.

Зачем разделять Main Model и Editor Model?

model

Основная модель (Main Model / --model) — это главный «мозг» Aider. Она отвечает за весь высокий интеллект, понимание логики проекта и принятие архитектурных решений.

Все ваши запросы, вопросы по коду и задачи по рефакторингу в первую очередь поступают именно в неё.

Основные функции основной модели:
  1. Глубокий анализ и понимание кода

    • Разбирает структуру репозитория через карту Repo Map и контекст добавленных файлов.

    • Находит взаимосвязи между классами, методами, контроллерами и базой данных.

    • Диагностирует баги, утечки памяти, проблемы с производительностью и уязвимости.

  2. Проектирование и планирование (Reasoning & Architecture)

    • Составляет пошаговые планы рефакторинга и внедрения новых фич.

    • Принимает решения, какие именно файлы нужно изменить и какую архитектуру (SOLID, Clean Architecture и т.д.) использовать.

  3. Генерация нового кода и алгоритмов

    • Пишет сложную бизнес-логику, запросы к БД, обработчики ошибок и тесты.

  4. Управление другими моделями (в режиме /architect)

    • Выступает в роли Senior-разработчика: формирует детальную инструкцию по правке файлов и передаёт её модели-редактору (editor-model) для физического применения.

Сводная матрица всех трех ролей в Aider
Чтобы окончательно свести картину воедино:
Роль Главная задача Важные качества Пример модели
Main Model (--model) Придумывает что и как делать, проектирует код. Максимальный интеллект, логика (Reasoning), понимание контекста. deepseek-chat (V3), deepseek-r1, claude-3-5-sonnet, gemini-2.0-flash
Editor Model (--editor-model) Вставляет придуманный код в конкретные строки файлов. Строгое следование формату SEARCH/REPLACE, точность. deepseek-chat, gemini-2.0-flash
Weak Model (--weak-model) Пишет git commit, сжимает историю чата, фильтрует карту. Высокая скорость, минимальная стоимость / бесплатность. gemini-2.0-flash-exp:free, ox-alpha

Приведенные в таблице названия моделей могут быть неактуальны, лучше вам подобрать их самостоятельно, разобравшись со стоимостью.

Подключение моделей.

Ниже описан способ подключения моделей, который был мною протестирован. У каждой модели есть провайдер, одинаковые модели могут работать у разных провайдеров. Изначально я использовал провайдера OpenRouter, там у меня был небольшой баланс и он предлагал достаточно большой выбор моделей. Затем я немного изучил рынок и решил попробовать DeepSeek. DeepSeek был выбран потому что в России он работает без VPN и существуют вполне официальные способы пополнения баланса для аккаунтов на этой платформе, недорогие модели DeepSeek сопоставимы по эффективности с моделями флагманов индустрии.

Оба провайдера используют протокол обмена от OpenAI и aider не требует дополнительных настроек для его использования.

Подключение провайдеров производится через указание ключей в переменных окружения сессии:

export OPENROUTER_API_KEY="ваш_ключ_для_openrouter"

export DEEPSEEK_API_KEY="ваш_ключ_для_deepseek"

вы можете прописать эти команды в файл ~/.bashrc

Если вы определились с моделями и не собираетесь их менять в интерфейсе aider-a, то лучше запустить его сразу с указанием всех трех моделей

aider --model deepseek/deepseek-chat \
      --editor-model openrouter/google/gemini-2.0-flash \
      --weak-model openrouter/poolside/laguna-s-2.1:free 

Модель openrouter/poolside/laguna-s-2.1:free бесплатная и на момент написания статьи работает, остальные модели даны для примера.

Работа с интерфейсом aider

После запуска приложения в терминале вы увидите символ приглашения ">", внутренние команды вводятся через слэш, например "/exit", после ввода слэша вам будет предложено выпадающее меню из доступных команд, после набора первых букв команды количество команд будет уменьшатся в соответствии с первыми введенными буквами.

Не забывайте для указания команды сначала вводить слэш. Если вы забудете это сделать, то текущая модель, получив эту команду, начнет фантазировать, что ей делать в соответствии с предыдущей историей сообщений в сессии и вы гарантированно просто потратите деньги и время на вывод чуши, которую она придумает.

Если вы сначала хотите провести анализ проекта, то лучше отключить модель для редактирования, это можно сделать двумя способами:

Такое отключение я нахожу необходимым, потому что у меня не получалось дать команду главной модели просто сделать анализ и не делать правок, видимо это баг aider, сразу после анализа включается все равно редактирование и вы можете испортить проект, потратить деньги на редактирование и потом откатывать изменения в Git.

Основные режимы работы aider

Различие между тремя режимами заключается в степени предоставленных прав на изменение файлов, формате ответа модели и распределении ролей (Main/Editor model).

Сравнительная таблица
Характеристика /ask (Запрос / Консультация) /architect (Архитектор) /code (Редактирование)
Редактирование файлов ❌ Строго запрещено ✅ Запрашивает подтверждение перед записью ✅ Автоматически при согласии
Режим работы Текстовый диалог (Read-only) Двухэтапный (План $\rightarrow$ Правки) Прямой (Код $\rightarrow$ Файлы)
Используемые модели Только Main Model Main Model + Editor Model Main Model
Идеально для... Аудита, поиска багов, вопросов по коду Сложного рефакторинга, архитектурных фич Точечных правок, быстрых багфиксов
1. Режим /ask (Только чтение / Консультация)
В этом режиме Aider физически отключает механизмы записи в файлы. Модель видит ваш проект через карту репозитория Repo Map и добавленные файлы, но не генерирует инструкции редактирования (SEARCH/REPLACE).

2. Режим /architect (Проектирование + Применение)
Режим разделяет процесс написания кода на два независимых этапа и подключает две разные модели:

  1. Этап 1 (Планирование): Основная модель (--model, например, DeepSeek-R1 или Claude 3.5 Sonnet) анализирует задачу, проводит глубокие рассуждения и пишет подробный текстовый план решения.

  2. Этап 2 (Реализация): Модель-редактор (--editor-model, например, DeepSeek-Chat) берет предложенный план и переводит его в точечные блоки правок кода.

  3. Подтверждение: Aider показывает вам предложенный план и спрашивает: "Применить эти изменения в файлы?"

3. Режим /code (Стандартный / Прямое редактирование)
Основной рабочий режим Aider по умолчанию.

Рекомендуемый workflow при работе с проектом
  1. Анализ: Запустите /ask для безопасного аудита и составления списка проблем.

  2. Проектирование: Переключитесь в /architect для реализации сложных архитектурных изменений.

  3. Исправления: Используйте /code для быстрых точечных правок и написания валидаторов/тестов.

Общие сведения о командах aider

Все встроенные команды Aider начинаются с символа /. Их можно разделить на четыре группы по уровню критичности для повседневной работы.

1. Управление файлами и контекстом (Самый высокий приоритет)

Главный навык работы с Aider — точечное управление контекстом. Не перегружайте модель лишними файлами.

2. Режимы работы (Архитектура и Безопасность)

Определяют, как именно модель будет реагировать на ваши промпты.

3. Контроль изменений и история (Управление сессией)

Позволяют исправлять ошибки модели и следить за состоянием Git.

4. Настройка моделей и системные вызовы (Конфигурация)

Управление LLM-провайдерами и терминалом без выхода из Aider.

Полезная информация.

При работе с aider в терминале VS Code начинает теряться история.

Проблема с потерей истории в терминале VS Code при использовании Aider — классическая ситуация. Обычно она связана с тем, что встроенный терминал VS Code имеет ограниченный размер буфера прокрутки (scrollback buffer) или сбрасывает состояние при перезапуске сессии, в то время как Aider выводит много текста ( diff-ы, логов, ответы моделей).
Вот основные способы решить эту проблему и сделать работу с историей комфортной:
1. Увеличить размер буфера терминала в VS Code
По умолчанию VS Code сохраняет в истории терминала ограниченное число строк. Если вывод Aider превышает этот лимит, старые сообщения «улетают» вверх и стираются.

  1. Откройте настройки VS Code (Ctrl + , на Windows/Linux или Cmd + , на macOS).

  2. В поисковой строке введите: terminal.integrated.scrollback.

  3. Увеличьте значение (по умолчанию обычно стоит 1000 или 10000). Установите, например, 50000 или 100000 строк.

2. Использовать встроенную историю самого Aider
Сама утилита Aider сохраняет всю историю чатов независимо от того, что происходит с окном терминала. Вы можете в любой момент вернуться к прошлым диалогам:

3. Запускать Aider во внешнем терминале (или tmux)
Если встроенный терминал VS Code продолжает сбоить или сбрасывать сессию при переключении вкладок:

4. Использовать режим /clear или /undo
Иногда история в самом Aider «засоряется» старым контекстом, из-за чего модель начинает путаться.

Windows: чистка системного диска

Проблема: забился системный диск, далее у меня диск C:. Чистка кэшей браузеров и использование системной утилиты результатов не дало. Пришлось прибегнуть к развернутому анализу.

Установил WizTree, portable - версию. 

Сначала нашел все большие файлы, которые можно удалять безопасно, дальше начались сложности. Работаю с Gemini.

Вопрос: что находится в файле $MFT (трогать его не надо)?

Файл $MFT (Master File Table) — это не обычный файл с документами или программами, а главная служебная база данных файловой системы NTFS, которая хранит информацию абсолютно обо всех файлах и папках на диске.

Сам по себе $MFT тоже физически оформлен как файл, который лежит в начале каждого диска NTFS.

Что именно записано внутри $MFT?

Каждому файлу и папке на диске (включая скрытые и системные) выделяется отдельная запись в этой таблице размером обычно 1 КБ. Внутри этой записи хранится вся метаинформация:

  1. Атрибуты файла: Полное имя файла, путь к нему и родительский каталог.

  2. Временные метки (Timestamps): Точное время создания, последнего изменения, доступа и модификации файла (поэтому этот файл так любят программы для цифровой криминалистики).

  3. Права доступа (Security Descriptors): Информация о том, какому пользователю или группе разрешено открывать или менять этот файл.

  4. Физическое расположение (Указатели/Pointers):

    • Если файл очень маленький (например, текстовый файл на пару строчек), то его содержимое может поместиться прямо внутри самой записи $MFT.

    • Если файл большой, $MFT хранит карту секторов (кластеров) диска, где физически разбросаны кусочки этого файла.

Почему программы вроде WizTree используют $MFT?

Обычные программы при сканировании диска поочередно заходят в каждую папку, запрашивают у Windows список файлов, переходят дальше и т.д. Это долго.

Утилиты вроде WizTree поступают хитрее: они напрямую считывают весь файл $MFT целиком. Поскольку $MFT — это уже готовая, структурированная таблица, где собраны размеры и имена всех файлов на диске, программа мгновенно «видит» всю структуру за пару секунд и сразу понимает, какие папки занимают больше всего места.

Вопрос: файл $MFT заполнен на 25%, можно ли его сжать (я не сжимал, оставил как есть)?

Нет, штатно средствами Windows уменьшить (сжать) физический размер файла $MFT на работающем диске нельзя.

Почему так происходит?

  1. Архитектура NTFS: Когда файловая система Windows создает новые файлы, $MFT автоматически расширяется под их количество. Однако когда вы удаляете файлы, их записи в таблице помечаются как «пустые» и могут использоваться заново, но физически выделенное под $MFT дисковое пространство назад не возвращается и размер файла не уменьшается.

  2. Ограничения ОС: Windows не умеет «усекать» (shrink) занятые зоны $MFT "на лету", так как этот файл критически важен для работы всей файловой системы и закреплен за определенными областями диска.

Что можно сделать?

Примечание: Если $MFT заполнен всего на 25%, это абсолютно нормальное рабочее состояние (система держит большой запас на будущее, чтобы избежать сильной фрагментации таблицы при создании новых файлов). Сами по себе эти «пустые» 75% внутри $MFT не блокируют свободное место на диске критическим образом, если у вас не стоит задача высвободить каждый мегабайт под сжатие самого раздела.

Вопрос: в папке с MS SQLServer есть папка PYTHON_SERVICES_20f02472-8f99-49e8-b8c0-5059b8cf545b большого размера, что это такое?

Папка PYTHON_SERVICES_<уникальный_id> связана с компонентом SQL Server Machine Learning Services.

Что это такое?

Этот каталог создается службой расширения SQL Server (Launchpad). Когда в базе данных запускаются скрипты на Python (например, через процедуру sp_execute_external_script), SQL Server изолирует выполнение кода и автоматически создает временные рабочие директории для каждого сеанса или задачи.

Почему папка стала большого размера?

  1. Зависание сеансов или утечка данных: Иногда при выполнении тяжелых скриптов (обработка больших датафреймов через Pandas/NumPy, сохранение моделей машинного обучения или кэширование) временные файлы не удаляются автоматически после завершения скрипта.

  2. Накопление мусора: Со временем в таких папках могут оставаться временные файлы сессий, лог-файлы или кэш пакетного менеджера, если скрипты выполнялись часто.

Что с этим делать?

  1. Безопасная очистка: Сначала убедитесь, что в данный момент не выполняются активные расчеты или хранимые процедуры с использованием Python.

  2. Перезапуск службы: Перезапустите службу SQL Server Launchpad (через оснастку services.msc), чтобы она сбросила текущие активные процессы.

  3. Удаление: Если служба остановлена и файлы не заблокированы системой, содержимое старых неактивных папок с длинными GUID-номерами можно удалить вручную для освобождения места на диске.

Вопрос: для чего нужна служба SQL Server Launchpad (я остановил службу и отключил)

Служба SQL Server Launchpad (её системное имя в Windows — MSSQLLaunchpad) — это специальный менеджер изоляции и запуска внешних скриптов.

Она появилась в SQL Server вместе с компонентом Machine Learning Services и выполняет следующие задачи:

1. Безопасный запуск внешнего кода

Когда вы пишете хранимую процедуру в базе данных с использованием языков Python или R, SQL Server сам по себе не умеет их выполнять. Вместо этого он обращается к службе Launchpad, а та берет на себя всю работу по запуску интерпретатора.

2. Изоляция процессов (Песочница)

Чтобы сторонний код на Python или R не мог «уронить» сам сервер баз данных или получить несанкционированный доступ к файловой системе, Launchpad создает для каждого выполнения изолированные рабочие процессы (отдельные учетные записи-изоляторы и те самые временные папки с длинными ID).

3. Контроль ресурсов

Служба следит за тем, сколько памяти и процессорного времени потребляют скрипты машинного обучения, чтобы они не исчерпали все ресурсы, предназначенные для самого SQL Server.

Нужно ли она вам?

Вопрос: в папке PYTHON_SERVICES_20f02472-8f99-49e8-b8c0-5059b8cf545b большую часть места занимают библиотеки, можно как-то отказаться от этой службы?

Да, от этой службы можно полностью отказаться, если вы не используете Python или R внутри баз данных MS SQL.

Поскольку стандартные библиотеки Python (особенно для машинного обучения, такие как NumPy, Pandas, Scikit-learn и т.д.) весят несколько гигабайт, отключение этой службы и удаление компонента поможет существенно разгрузить диск C:.

Как полностью отключить и удалить этот компонент:

1. Остановка и отключение службы
Сначала остановите службу, чтобы она перестала занимать файлы и ресурсы:

  1. Нажмите комбинацию клавиш Win + R, введите services.msc и нажмите Enter.

  2. Найдите в списке службу SQL Server Launchpad (MSSQLLaunchpad) (она может содержать имя вашего экземпляра SQL Server, например, MSSQLLaunchpad$SQLEXPRESS).

  3. Нажмите по ней правой кнопкой мыши -> «Остановить» (Stop).

  4. Затем зайдите в её «Свойства» и измените «Тип запуска» с Автоматически на «Отключено» (Disabled).

2. Удаление компонента через установщик MS SQL
Чтобы папки и тяжелые библиотеки больше не создавались при обновлениях, лучше официально удалить Machine Learning Services через официальный деинсталлятор:

  1. Откройте Панель управления -> Установка и удаление программ (или «Установленные приложения» в Windows 10/11).

  2. Найдите в списке Microsoft SQL Server (версия) и нажмите «Изменить / Удалить» (Uninstall/Change).

  3. В появившемся окне мастера установки выберите пункт «Удалить» (Remove).

  4. Выберите нужный экземпляр SQL Server.

  5. На шаге выбора компонентов найдите и снимите галочку с Machine Learning Services (Database In-Database) (или компонента интеграции Python/R).

  6. Завершите работу мастера.

3. Ручная очистка хвостов
После удаления службы и компонента вы можете вручную удалить оставшуюся папку PYTHON_SERVICES_... (и аналогичные ей, если их несколько), чтобы вернуть свободное место на диске C:. Если система напишет, что файлы заняты, перезагрузите компьютер и повторите удаление.

Я остановил и отключил службу и вручную удалил папку через проводник. Через MS SQL Installer удалить не получилось.

Вопрос: у MS SQL Server есть папка Upate Cache, что в ней находится (я почистил)?

Папка Update Cache (обычно находится по пути вроде C:\Program Files\Microsoft SQL Server\140\Setup Bootstrap\Update Cache для SQL Server 2017) хранит резервные копии файлов обновлений (кумулятивных патчей и пакетов исправлений), которые когда-либо устанавливались на ваш сервер.

Зачем она нужна?

Каждый раз, когда вы ставите патч (Cumulative Update или Service Pack), установщик сохраняет в эту папку старые версии файлов. Это делается для того, чтобы в будущем администратор мог:

  1. Корректно откатить обновление (удалить конкретный патч через Панель управления, если он вызвал сбой).

  2. Вернуть систему к предыдущей сборке (build).

Можно ли её удалить?

Если вы решите её почистить ради освобождения места, учтите, что при установке следующих новых кумулятивных патчей для SQL Server эта папка снова начнет заполняться новыми данными.

Вопрос: имеется docker под windows, несколько контейнеров, томов и образов находится на диске C:, как перенести все на другой диск

В итоге я перенес через настройки Docker Desktop. Папки хранилища почистились при переносе.

Перенести Docker с диска C: на другой диск (например, D:) можно двумя способами в зависимости от версии Docker Desktop.

Способ 1. Через настройки Docker Desktop (Самый простой и официальный)

В относительно свежих версиях Docker Desktop разработчики добавили удобную кнопку переноса прямо в интерфейсе.

  1. Откройте Docker Desktop.

  2. Нажмите на иконку шестеренки (Settings) в правом верхнем углу.

  3. В левом меню выберите раздел Resources (Ресурсы) -> вкладка Advanced.

  4. Найдите поле Disk image location.

  5. Нажмите кнопку Browse и выберите пустую папку на другом диске (например, D:\DockerData).

  6. Нажмите Apply & restart.

    • Примечание: Docker сам автоматически скопирует все ваши виртуальные диски (ext4.vhdx), контейнеры и образы в новое место и переключит пути. Это может занять некоторое время в зависимости от объема данных.

Способ 2. Через терминал WSL (Если первая кнопка недоступна или зависает)

Если интерфейс не позволяет сделать перенос автоматически, можно перенести данные вручную с помощью встроенного механизма WSL 2, на котором работает Docker.

  1. Полностью закройте Docker Desktop: кликните правой кнопкой мыши по иконке Docker в трее (возле часов) и выберите Quit Docker Desktop.

  2. Откройте PowerShell от имени администратора.

  3. Убедитесь, что WSL полностью остановлен:

    PowerShell
    wsl --shutdown
    
  4. Экспортируйте данные основных виртуальных машин Docker в архивные .tar файлы на другой диск (замените D:\Docker на ваш реальный путь, предварительно создав эту папку):

    PowerShell
    wsl --export docker-desktop-data D:\Docker\docker-desktop-data.tar
    wsl --export docker-desktop D:\Docker\docker-desktop.tar
    
    (Процесс экспорта может занять несколько минут, так как файлы образов и томов обычно весят много).

  5. Удалите (отвяжите) старые дистрибутивы из WSL (это удалит старые тяжелые файлы с диска C:, но ваши данные уже сохранены в .tar архивах):

    PowerShell
    wsl --unregister docker-desktop-data
    wsl --unregister docker-desktop
    
  6. Импортируйте их заново, указав новый путь на другом диске:

    PowerShell
    wsl --import docker-desktop-data D:\Docker\data D:\Docker\docker-desktop-data.tar --version 2
    wsl --import docker-desktop D:\Docker\distro D:\Docker\docker-desktop.tar --version 2
    
  7. Запустите Docker Desktop заново. Все ваши контейнеры, тома (volumes) и образы появятся на новом диске.

После того как вы убедитесь, что всё работает корректно, архивные файлы .tar из папки D:\Docker можно удалить, чтобы они не занимали место.

Вопрос: папка C:\Users\[your_user]\AppData\Local\Microsoft\Terminal Server Client\Cache занимает больше 300 Mb, как ее почистить?

Папка Cache в директории Terminal Server Client принадлежит клиенту службы удаленных рабочих столов (RDP / Remote Desktop Connection). В ней хранятся растровые изображения (скриншоты элементов интерфейса, иконки, фоновые картинки), которые клиент сохраняет при подключении к удаленным серверам или ПК, чтобы каждый раз не подгружать их заново.

Со временем этот кэш разрастается (файлы с расширением .bmc), и его абсолютно безопасно можно очистить.

Как очистить кэш RDP:

  1. Закройте все активные окна подключения к удаленному рабочему столу (приложение mstsc.exe).

  2. Нажмите комбинацию клавиш Win + R, введите путь:

    Plaintext
    %LocalAppData%\Microsoft\Terminal Server Client\Cache
    
    и нажмите Enter.

  3. Выделяйте все файлы внутри этой папки (.bmc и .bin файлы) и удаляйте их обычным способом (Delete или Shift + Delete).

Примечание: Сама папка Cache и служебные файлы индексации могут остаться, это нормально. Система просто начнет формировать новый чистый кэш по мере того, как вы будете снова подключаться к удаленным рабочим столам. На работоспособность RDP это никак не повлияет.

Вопрос: в папке C:\Users\[your_user]\AppData\Local\Google\Chrome\User Data\Default\Code Cache более 300 Mb

Папка Code Cache в профиле браузера Chrome содержит скомпилированный JavaScript-код сайтов, которые вы посещали. Браузер сохраняет его, чтобы сайты открывались быстрее и не тратили ресурсы процессора на повторную компиляцию скриптов при каждом визите.

Для кэша 300 МБ — это вполне нормальный и даже скромный размер (со временем он может вырастать до нескольких гигабайт). Однако его можно полностью и абсолютно безопасно очистить, чтобы освободить место на диске.

Как безопасно очистить Code Cache:

Способ 1. Через настройки самого браузера (Самый правильный)
  1. Откройте Google Chrome.

  2. Нажмите комбинацию клавиш Ctrl + Shift + Delete (откроется окно очистки истории).

  3. Перейдите на вкладку «Дополнительно» (Advanced).

  4. Выберите временной диапазон «За все время» (All time).

  5. Установите галочку «Файлы кэшированные и другие данные» (Cached images and files) — обратите внимание: остальные галочки (пароли, история, файлы cookie) лучше снять, чтобы не потерять нужные данные.

  6. Нажмите кнопку «Удалить данные» (Clear data).

Способ 2. Вручную через проводник (Если нужно точечно сбросить именно эту папку)
  1. Полностью закройте Google Chrome (убедитесь, что в трее возле часов нет иконки Chrome и в диспетчере задач не висят его фоновые процессы).

  2. Нажмите Win + R, вставьте путь:

    Plaintext
    %LocalAppData%\Google\Chrome\User Data\Default\Code Cache
    
    и нажмите Enter.

  3. Выделите все файлы и папки внутри этой директории и удалите их (Shift + Delete).

Что произойдет после удаления? Браузер не сломается. При самых первых заходах на часто посещаемые сайты страницы могут открываться на долю секунды медленнее (пока Chrome заново компилирует скрипты), но папка очистится, а система вернет занятое место.

Вопрос: есть более 300 Mb здесь: C:\Users\[your_user]\AppData\Local\WhatsApp\app-2.2149.4

Я просто удалил WhatsApp

Папка C:\Users\nik-v\AppData\Local\WhatsApp\app-2.2149.4 — это устаревшая версия приложения WhatsApp.

Что это такое?

Когда настольный клиент WhatsApp обновляется, он не всегда удаляет файлы старых версий. В данном случае у вас осталась папка от версии 2.2149.4, которая вышла довольно давно (судя по индексу версии). Новые версии приложения скачиваются и распаковываются в соседние папки с актуальными номерами, а эта старая просто лежит мертвым грузом и занимает место.

Можно ли её удалить?

Да, эту папку можно смело удалить целиком вместе со всем содержимым.

Главное правило перед удалением:

  1. Убедитесь, что сам WhatsApp в данный момент закрыт.

  2. Проверьте, что вы удаляете именно папку со старым номером версии (app-2.2149.4), а не корневую папку WhatsApp и не папку с текущей рабочей версией (актуальную версию можно посмотреть в соседних папках внутри %LocalAppData%\WhatsApp).

После удаления старой версии приложение продолжит работать на актуальном релизе, а вы освободите занятое дисковое пространство.

Вопрос: вот здесь C:\Users\[your_user]\AppData\Local\Temp 2 Gb

Папка C:\Users\[your_user]\AppData\Local\Temp — это главное хранилище временных файлов для Windows и всех установленных программ. 2 гигабайта для этой папки — это даже относительно немного (часто она разрастается до десятков гигабайт), но очистить её можно и нужно.

Безопасно ли её чистить?

Да, абсолютно. Здесь хранятся хвосты от установки программ, распакованные архивы, кэш браузеров и временные документы, которые были нужны приложениям в прошлом, но о которых они уже забыли.

Как правильно очистить папку Temp:

  1. Закройте все запущенные приложения (особенно браузеры, редакторы кода и тяжелые программы), чтобы они не удерживали блокировки на свои временные файлы.

  2. Нажмите Win + R, введите:

    Plaintext
    %LocalAppData%\Temp
    
    и нажмите Enter (откроется та самая папка).

  3. Выделите все файлы и папки внутри (Ctrl + A) и нажмите Delete (или Shift + Delete, чтобы обойти корзину).

  4. Что делать с неудаляемыми файлами?
    Часть файлов операционная система или фоновые службы (например, антивирус или активные программы) могут не дать удалить, выдав сообщение вроде "Файл занят другим приложением". Это нормально. Просто поставьте галочку «Выполнить для всех текущих элементов» и нажмите «Пропустить» (Skip). Всё остальное мусорное содержимое удалится без проблем.

В моем случае не все файлы удалились вручную, но места освободилось много.

Вопрос: вот тут C:\Windows\Installer более 6 Gb

Папка C:\Windows\Installer (весом более 6 ГБ) — это системное хранилище кэша установщика Windows (Windows Installer Cache). В ней хранятся файлы установочных пакетов с расширениями .msi и .msp от программ, которые установлены на вашем компьютере.

Зачем нужна эта папка?

Windows использует этот кэш для:

  1. Удаления или изменения программ (когда вы заходите в «Установку и удаление программ», мастеру требуются оригинальные .msi файлы для корректной очистки).

  2. Установки обновлений и патчей для уже имеющегося софта (например, пакетов Office или некоторых тяжелых приложений).

Можно ли её чистить и как это сделать безопасно?

Удалять файлы из этой папки вручную через проводник категорически нельзя (если вы просто сотрете оттуда файлы, вы потеряете возможность удалять, обновлять или исправлять соответствующий софт, и система будет выдавать ошибки).

Однако существуют специальные безопасные утилиты, которые умеют вычищать из этой папки «сиротские» файлы — остатки от программ, которые давно удалены, но чей кэш остался лежать мертвым грузом:

  1. PatchCleaner — одна из самых известных и безопасных бесплатных программ для этих целей. Она сканирует папку C:\Windows\Installer, сверяет её содержимое с реальным списком установленного софта и находит те .msi/.msp файлы, которые никому больше не нужны.

  2. Программа дает возможность безопасно удалить только этот мусор или переместить его в другую папку (на случай, если захотите перестраховаться).

Если вы решите воспользоваться PatchCleaner:

Как скачать правильный PatchCleaner:

Чтобы не наткнуться на рекламу, лучше скачивать утилиту напрямую с проверенного репозитория открытого ПО SourceForge:

  1. Перейдите по прямой ссылке на проект: https://sourceforge.net/projects/patchcleaner/

  2. Нажмите зеленую кнопку Download (файл должен называться именно PatchCleaner_1.4.2.0.exe (название актуально на момент написания этой статьи) размером около 1.3 MB).

С официального сайта программы скачивается реклама, не используйте его.

Страховка от ошибок (как сделать на 100% безопасно):

Даже несмотря на то, что программа толковая, с системными каталогами лучше перестраховаться. Когда PatchCleaner завершит сканирование и покажет вам «сиротские» файлы (Orphaned files), не спешите нажимать Delete.

Используйте функцию «Move» (Переместить) вместо удаления:

  1. Укажите программе любую другую папку (например, создайте временную папку D:\InstallerBackup).

  2. Нажмите кнопку переноса. Программа сама аккуратно переместит эти 6 ГБ на диск D:.

  3. После этого поработайте за компьютером пару дней: пооткрывайте нужные программы, проверьте, всё ли запускается и удаляется.

  4. Если за пару дней всё работает штатно и никаких сбоев нет, вы сможете просто удалить эту резервную папку с диска D:, окончательно освободив место на диске C:. Если вдруг какой-то редкой программе неожиданно понадобится старый инсталлятор, вы всегда сможете вернуть файлы обратно в C:\Windows\Installer.

Вопрос: что находится здесь: C:\Windows\WinSxS

Папка C:\Windows\WinSxS (Windows Side-by-Side) — это одно из самых больших и важных хранилищ в операционной системе Windows. В ней находится база данных и файлы практически всех компонентов системы, обновлений, драйверов и библиотек (DLL), которые когда-либо устанавливались в Windows.

Зачем нужна эта папка?

  1. Защита от сбоев и конфликтов (DLL Hell): В ней хранятся разные версии одних и тех же системных библиотек. Если какая-то программа запрашивает старую версию компонента, Windows берет её из WinSxS, поэтому приложения не ломаются при обновлениях.

  2. Хранилище обновлений: Когда Windows скачивает патчи, она складывает новые версии файлов сюда, а старые сохраняет на случай отката или восстановления системы.

Можно ли её удалять или чистить вручную?

Как уменьшить размер WinSxS безопасным путем?

Windows умеет сама очищать эту папку от устаревших дубликатов и компонентов с помощью встроенного механизма Очистки диска:

  1. Нажмите Win + R, введите cleanmgr и нажмите Enter.

  2. В появившемся окне выберите системный диск (C:) и нажмите OK.

  3. Когда сканирование завершится, нажмите кнопку «Очистить системные файлы» (Clean up system files) и снова выберите диск C:.

  4. В списке найдите и отметьте галочкой пункт «Очистка обновлений Windows» (Windows Update Cleanup).

  5. Нажмите OK, чтобы система удалила старые резервные копии обновлений из WinSxS без риска повредить систему.

Вопрос: что хранится здесь: C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache

Папка INetCache, расположенная по столь глубокому системному пути (C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache), — это скрытый кэш временных интернет-файлов, принадлежащий системной учетной записи (Local System / SYSTEM), а не вашему личному профилю пользователя.

Что в ней хранится?

Здесь оседают временные файлы, кэш браузера Internet Explorer (который глубоко интегрирован в ядро Windows), а также данные, которые скачивают фоновые системные службы или компоненты операционной системы при обращении к веб-ресурсам (например, при проверке обновлений, работе встроенных модулей активации или стороннего софта, запущенного от имени системного администратора/службы).

Можно ли её чистить?

Вопрос: вот здесь C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache\IE более 2 миллионов файлов

Более 2 миллионов файлов в папке IE системного профиля — это типичный баг или застарелая проблема Windows.

Такое огромное количество мелких файлов (обычно это миллионы крошечных объектов кэша Internet Explorer) возникает из-за того, что фоновые службы Windows или сторонний софт (работающий от системной учетной записи) постоянно пишут туда данные, но встроенный механизм очистки никогда их не удаляет. Из-за этого файловая система начинает страдать от фрагментации, а проводник или антивирус могут намертво зависать при попытке зайти в эту папку.

Я использовал вариант 2. Работает очень долго. Перед запуском нужно закрыть WizTree.

Как это исправить и безопасно очистить?

Просто выделить их и нажать Delete вручную через Проводник не получится: Windows выдаст ошибку о слишком длинных путях, либо процесс будет идти сутками из-за колоссального количества мелких объектов.

Лучший способ очистить этот системный кэш — воспользоваться встроенной утилитой командной строки DISM или запустить автоматическую очистку.

Вариант 1. Автоматическая очистка через «Очистку диска»
  1. Нажмите Win + R, введите cleanmgr и нажмите Enter.

  2. Выберите диск C:.

  3. Обязательно нажмите кнопку «Очистить системные файлы» внизу окна и снова выберите диск C:.

  4. В списке найдите галочку «Временные файлы Интернета» (Temporary Internet Files) и убедитесь, что она отмечена. Нажмите OK. (Система сама умеет безопасно вычищать этот каталог через свои API).

Вариант 2. Экстренная очистка через PowerShell (если cleanmgr не помог)
Если файлов миллионы и стандартная утилита их не трогает, можно быстро очистить папку через PowerShell от имени администратора, используя утилиту rd (удаление дерева каталогов):

  1. Нажмите Win + X и выберите Терминал (Администратор) или PowerShell (Администратор).

  2. Выполните команду для принудительного удаления содержимого кэша:

    PowerShell
    Remove-Item -Path "C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache\IE\*" -Recurse -Force -ErrorAction SilentlyContinue
    
    (Команда победит ограничение на длину путей и молча удалит весь накопившийся мусор, пропуская то, что в данный момент занято процессами).

После этого миллионы мелких файлов исчезнут, освободив гигабайты пространства и избавив файловую систему от лишней нагрузки.

Команда работает очень долго, может зависнуть. При работе она расходует очень много оперативной памяти (у меня доходило до 7Gb на процесс), освобождение места идет также медленно. Если программу прервать все освободившееся место снова будет занято. При завершении работы команда может подвиснуть и не выйти в командную строку, в моем случае переход туда произошел по клику на экране PowerShell.

Windows: установка системного времени

В какой-то момент я обнаружил, что на одной из моих домашних машин с Windows 10 установлено некорректное время, часы отставали. Я проверил службу Windows Time, она была запущена, но, судя по всему, не работала. Затем я проверил вторую машину (ноутбук) и там ситуация оказалась аналогичной, то есть время не устанавливалось. 

Сначала я попробовал решить проблему с помощью Gemini, тот довольно быстро сдался и предложил устанавливать время с помощью скрипта, время предполагалось получать через HTTP с одной из общедоступных служб. Тогда я обратился к ChatGPT, тот оказался гораздо более умным и мы провели исследования в результате которых он пришел к выводу, что не работает что-то именно в самой службе Windows. Мы проверяли обе машины, отпали блокировки портов и протокола UDP, был проверен мой роутер, все было в рабочем состоянии. После того как я потратил на решение проблемы целый день, я решил остановиться и таки да, подключил скрипт в планировщик для установки времени при запуске компьютера.

Фиксирую ряд моментов об этой службе.

В Windows за синхронизацию времени отвечает служба Windows Time (W32Time). В упрощённом виде она работает так:

Аппаратные часы компьютера
          │
          ▼
      W32Time
          │
          │ NTP/UDP 123
          ▼
   NTP-сервер
   time.windows.com
   pool.ntp.org
   и т.д.
          │
          ▼
     NTP-ответ
          │
          ▼
   расчёт смещения
          │
          ▼
  корректировка часов

Но внутри есть несколько важных механизмов.

1. При загрузке Windows

Компьютер получает первоначальное время из RTC/CMOS — аппаратных часов материнской платы.

Именно поэтому при:

w32tm /query /source

можно увидеть:

Local CMOS Clock

Это не означает, что CMOS является настроенным NTP-сервером. Это означает: последнего пригодного внешнего источника времени нет, поэтому система использует локальные часы.


2. W32Time выбирает источник

Настройка:

w32tm /query /configuration

показывает, например:

Type: NTP
NtpServer: time.windows.com,0x8

То есть W32Time должна обращаться к:

time.windows.com

по протоколу NTP.

Можно указать несколько серверов:

time.windows.com,0x8 pool.ntp.org,0x8 time.nist.gov,0x8

3. Используется UDP/123

Классический NTP использует:

UDP source port: 123
UDP destination port: 123

То есть W32Time создаёт NTP-сокет и отправляет примерно:

PC 192.168.0.103:123
        │
        │ UDP
        ▼
NTP 213.239.234.28:123

Сервер отвечает:

NTP 213.239.234.28:123
        │
        ▼
PC 192.168.0.103:123

Обычный NTP-клиент может работать иначе:

192.168.0.103:59882 → 185.125.190.57:123
185.125.190.57:123 → 192.168.0.103:59882

А W32Time использует локальный порт 123.


4. W32Time не просто спрашивает «который час?»

NTP-пакет содержит временные метки.

Упрощённо:

T1 = время отправки запроса клиентом
T2 = время получения запроса сервером
T3 = время отправки ответа сервером
T4 = время получения ответа клиентом

По этим четырём значениям можно оценить:

задержку сети:

delay ≈ (T4 - T1) - (T3 - T2)

и смещение часов клиента:

offset ≈ ((T2 - T1) + (T3 - T4)) / 2

Поэтому NTP значительно сложнее простого:

«отправил запрос → получил время сервера → поставил его себе».


5. W32Time собирает несколько измерений

Windows не обязательно корректирует часы после одного ответа.

Она собирает NTP samples:

sample 1
sample 2
sample 3
...

Затем отбрасывает плохие/аномальные измерения и пытается получить надёжную оценку смещения.

6. Затем Windows корректирует часы

Если расхождение небольшое, Windows может плавно изменить скорость хода часов, чтобы постепенно привести их к правильному времени.

Если расхождение достаточно большое, возможна ступенчатая коррекция (step).

Поэтому W32Time — это не просто:

получил время → SetSystemTime()

а полноценный механизм регулирования системных часов.


7. Существует период опроса

В конфигурации можно увидеть:

MinPollInterval: 10
MaxPollInterval: 15

Это степени двойки:

2^10 = 1024 секунд
2^15 = 32768 секунд

То есть интервал может динамически изменяться примерно от:

17 минут

до:

9 часов

Кроме того, может быть:

SpecialPollInterval: 16384

Это примерно:

4 часа 33 минуты

Конкретное поведение зависит от режима и флагов peer'а.


Что происходит при w32tm /resync

Когда мы выполняем:

w32tm /resync

это не просто команда "скажи серверу время".

Она заставляет службу попытаться выполнить новую синхронизацию.

Упрощённо:

w32tm /resync
       │
       ▼
    W32Time
       │
       ▼
выбрать peer
       │
       ▼
отправить NTP-запрос
       │
       ▼
получить ответ
       │
       ▼
создать NTP sample
       │
       ▼
проверить sample
       │
       ▼
рассчитать offset
       │
       ▼
скорректировать системные часы

Почему stripchart здесь очень важен

Команда:

w32tm /stripchart /computer:213.239.234.28 /dataonly /samples:3

тоже использует NTP, но это не тот же самый механизм синхронизации, что W32Time service.

Например:

19:58:08, +09.6895857s
19:58:10, +09.6929900s
19:58:12, +09.6926500s

Это доказывает:

DNS              ✓
маршрутизация    ✓
UDP/123          ✓
NTP-сервер       ✓
ответ сервера    ✓

Но это не доказывает, что W32Time сможет использовать этот ответ для собственной синхронизации.

И ещё одна важная деталь

W32Time создаёт сокеты:

[::]:123
0.0.0.0:123

То есть сама служба слушает порт UDP 123 на компьютере.

А stripchart может использовать другой сетевой путь/сокет.

Поэтому принципиальная разница сейчас выглядит так:

                 W32Time
                    │
             source port 123
                    │
                    ▼
              router/NAT
                    │
                    ▼
             NTP server
                    │
                    ▼
              ??? :123
                    │
                    ▼
                 W32Time

против:

              stripchart
                    │
             ephemeral port
                    │
                    ▼
              router/NAT
                    │
                    ▼
             NTP server
                    │
                    ▼
          ephemeral port
                    │
                    ▼
              stripchart

Установка времени скриптом.

Создайте папку для скриптов, например C:\Scripts и в ней файл SyncTime.ps1 со следующим содержимым:

try {
    $res = Invoke-WebRequest -Uri "https://ya.ru" -Method Head -TimeoutSec 5 -UseBasicParsing
    $serverTime = [datetime]$res.Headers.Date
    Set-Date $serverTime
} catch {
    $res = Invoke-WebRequest -Uri "https://www.google.com" -Method Head -TimeoutSec 5 -UseBasicParsing
    $serverTime = [datetime]$res.Headers.Date
    Set-Date $serverTime
}

Сначала будет попытка получить время от Яндекса, если не получится, то от Google.