# Linux && Windows

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

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

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

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

#### 🌐 Nginx (front door)

- SSL (HTTPS)
- маршрутизация
- защита
- статика

---

#### 🟦 Apache (только WordPress)

**<span class="hover:entity-accent entity-underline inline cursor-pointer align-baseline"><span class="whitespace-normal">Apache HTTP Server</span></span>**

- PHP обработка
- WordPress
- .htaccess

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

В **<span class="hover:entity-accent entity-underline inline cursor-pointer align-baseline"><span class="whitespace-normal">Ubuntu</span></span>**:

<div class="relative w-full mt-4 mb-1" id="bkmrk-sudo-apt-updatesudo-"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo-apt-updatesudo--1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> apt update  
  
<span class="ͼd">sudo</span> apt install <span class="ͼf">-y</span> nginx</div><div class="cm-content q9tKkq_readonly">  
<span class="ͼd">sudo</span> apt install <span class="ͼf">-y</span> apache2</div><div class="cm-content q9tKkq_readonly">  
<span class="ͼd">sudo</span> apt install <span class="ͼf">-y</span> mariadb-server  
<span class="ͼd">sudo</span> apt install <span class="ͼf">-y</span> postgresql  
</div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

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

#### Apache уводим с 80:

<div class="relative w-full mt-4 mb-1" id="bkmrk-sudo-nano-%2Fetc%2Fapach"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo-nano-%2Fetc%2Fapach-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> nano /etc/apache2/ports.conf</div></div></div></div></div></div></div></div></div></div><div class="">  
</div></div></div></div>Примерное содержимое:

```
Listen 8082

<IfModule ssl_module>
	Listen 443
</IfModule>

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

```

И в site config:

<div class="relative w-full mt-4 mb-1" id="bkmrk-sudo-nano-%2Fetc%2Fapach-2"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo-nano-%2Fetc%2Fapach-3"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> nano /etc/apache2/sites-available/000-default.conf</div></div></div></div></div></div></div></div></div></div><div class="">  
</div></div></div></div>Примерное содержимое с учетом проекта на 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>

```

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

<div class="h-full min-h-0 min-w-0" id="bkmrk-sudo-apt-install--y-"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo-apt-install--y--1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> apt install <span class="ͼf">-y</span> php php-mysql libapache2-mod-php</div></div></div></div></div></div></div></div></div></div>Эта установка запустит триггеры, один из которых запустит Apache, теперь он будет на правильном порту, если запуска Apache не произойдет, перезапустим его вручную:

<div class="relative w-full mt-4 mb-1" id="bkmrk-sudo-systemctl-resta"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo-systemctl-resta-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> systemctl <span class="ͼd">restart</span> apache2</div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

### 🌐 ШАГ 3 — WordPress (Apache backend)

Документа root:

<div class="relative w-full mt-4 mb-1" id="bkmrk-%2Fvar%2Fwww%2Fhtml"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-%2Fvar%2Fwww%2Fhtml-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">/var/www/html</div></div></div></div></div></div></div></div></div></div><div class="">Но выше в конфиге был определен алиас "portfolio", это папка, которая подмонтирована из windows и в ней установлен wordpress.</div></div></div></div>### ШАГ 4 — включить mod\_rewrite (нужно для WordPress)

<div class="" id="bkmrk-sudo-a2enmod-rewrite"><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo-a2enmod-rewrite-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> a2enmod rewrite</div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

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

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

<div class="" id="bkmrk-sudo-chmod--r-755-%2Fm"><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo-chmod--r-755-%2Fm-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> <span class="ͼd">chmod</span> <span class="ͼf">-R</span> <span class="ͼb">755</span> /mnt/d/Soft/Freelance/Wordpress/portfolio/site</div></div></div></div></div></div></div></div></div></div></div></div></div></div>**База:**

<div class="relative w-full mt-4 mb-1" id="bkmrk-sudo-mysql"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo-mysql-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> mysql</div></div></div></div></div></div></div></div></div></div><div class="">  
</div></div></div></div><div class="relative w-full mt-4 mb-1" id="bkmrk-create-database-word"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-create-database-word-1"><div class="cm-scroller">  
</div><div class="cm-content q9tKkq_readonly"><span class="ͼ8">CREATE</span> <span class="ͼ8">USER</span> <span class="ͼc">'dev'</span>@<span class="ͼc">'%'</span> IDENTIFIED <span class="ͼ8">BY</span> <span class="ͼc">'password'</span>;  
<span class="ͼ8">GRANT</span> <span class="ͼ8">ALL</span> <span class="ͼ8">PRIVILEGES</span> <span class="ͼ8">ON</span> <span class="ͼ8">\*</span>.<span class="ͼ8">\*</span> <span class="ͼ8">TO</span> <span class="ͼc">'dev'</span>@<span class="ͼc">'%'</span>;  
FLUSH <span class="ͼ8">PRIVILEGES</span>;</div></div></div></div></div></div></div></div></div><div class=""><div class="">Пользователь может иметь доступ к базе отвсюду.</div><div class="">  
</div><div class="">Создайте базу данных и восстановите в нее дамп из вашего проекта на Wordpress.</div></div></div></div></div>### 🟨 ШАГ 6 — MariaDB

<div class="relative w-full mt-4 mb-1" id="bkmrk-sudo-systemctl-enabl"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo-systemctl-enabl-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> systemctl enable mariadb  
<span class="ͼd">sudo</span> systemctl <span class="ͼd">start</span> mariadb</div></div></div></div></div></div></div></div></div></div></div></div></div>#### Проброс порта 3306 наружу (в windows)

<div class="relative w-full mt-4 mb-1" id="bkmrk-%D0%9F%D1%80%D0%BE%D0%B1%D1%80%D0%B0%D1%81%D1%8B%D0%B2%D0%B0%D0%B5%D0%BC-%D0%BD%D0%B0-%D0%BF%D0%BE%D1%80%D1%82"><div class=""><div class="relative"><div class=""><div class="">Пробрасываем на порт 3307, таким образом в windows может быть экземпляр базы с портом по умолчанию, а к базе внутри WSL можно будет иметь доступ из таких приложений как DBeaver или MySQL Workbench.</div><div class="">При старте WSL он запускается в собственной сети, IP-адрес может меняться и лучше сделать стартовый скрипт, который будет это учитывать и пробрасывать порт наружу.</div></div></div></div></div>##### 🧠 Что это за файл

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

<div class="relative w-full mt-4 mb-1" id="bkmrk-%D0%B1%D0%B5%D1%80%D1%91%D1%82-%D0%B0%D0%BA%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-ip-"><div class=""><div class="relative"><div class=""><div class="">- берёт актуальный IP WSL
- пересоздаёт проброс порта 3307 → 3306
- чтобы не зависеть от смены IP

---

</div></div></div></div></div>##### 🥇 ГДЕ СОЗДАТЬ

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

<div class="relative w-full mt-4 mb-1" id="bkmrk-d%3A%5Csoft%5Cdockerdata%5Cs"><div class=""><div class="relative"><div class=""><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-d%3A%5Csoft%5Cdockerdata%5Cs-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">D:\Soft\DockerData\Scripts\fix-mysql-port.ps1</div></div></div></div></div></div></div></div></div></div><div class="">  
</div></div></div></div></div></div></div></div></div>👉 главное — чтобы путь был простой

<div class="relative w-full mt-4 mb-1" id="bkmrk--3"><div class=""><div class="relative"><div class=""><div class="">---

</div></div></div></div></div>##### 🧪 КАК СОЗДАТЬ

<div class="relative w-full mt-4 mb-1" id="bkmrk-%D0%9E%D1%82%D0%BA%D1%80%D0%BE%D0%B9%D1%82%D0%B5-%D0%91%D0%BB%D0%BE%D0%BA%D0%BD%D0%BE%D1%82-%D0%B8%D0%BB%D0%B8"><div class=""><div class="relative"><div class=""><div class="">1. Откройте Блокнот или VS Code
2. Вставьте код:

</div></div></div></div></div>```
$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"
```

<div class="relative w-full mt-4 mb-1" id="bkmrk-%D0%A1%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82%D0%B5-%D0%BA%D0%B0%D0%BA%3A-fix-m"><div class=""><div class="relative"><div class=""><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full">  
</div></div></div></div></div></div></div></div></div></div>3. Сохраните как:

<div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-fix-mysql-port.ps1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">fix-mysql-port.ps1</div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

</div></div></div></div></div>##### 🚀 КОГДА ЕГО ЗАПУСКАТЬ

##### ✔ Вручную (пока проще всего)

Каждый раз:

<div class="relative w-full mt-4 mb-1" id="bkmrk-%D0%BF%D0%BE%D1%81%D0%BB%D0%B5-%D0%BF%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0-ws"><div class=""><div class="relative"><div class=""><div class="">- после перезапуска WSL
- после перезагрузки Windows
- если не работает порт 3307

---

</div></div></div></div></div>##### 👉 запуск:

Откройте PowerShell:

<div class="relative w-full mt-4 mb-1" id="bkmrk-powershell--executio"><div class=""><div class="relative"><div class=""><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-powershell--executio-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼe">powershell</span> <span class="ͼ8">-</span><span class="ͼe">ExecutionPolicy</span> <span class="ͼe">Bypass</span> <span class="ͼ8">-</span><span class="ͼe">File</span> D:\Soft\DockerData\Scripts\fix-mysql-port.ps1</div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div>##### 🧠 ПОЧЕМУ ЭТО НУЖНО

<span class="hover:entity-accent entity-underline inline cursor-pointer align-baseline"><span class="whitespace-normal">WSL</span></span> меняет IP:

<div class="relative w-full mt-4 mb-1" id="bkmrk-172.31.x.x-%E2%86%92-%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9-"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-172.31.x.x-%E2%86%92-%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9--1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">172.31.x.x → каждый запуск новый</div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>👉 поэтому static portproxy НЕ работает стабильно

---

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

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

<div class="relative w-full mt-4 mb-1" id="bkmrk-netsh-interface-port"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-netsh-interface-port-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼe">netsh</span> <span class="ͼe">interface</span> <span class="ͼe">portproxy</span> <span class="ͼe">show</span> <span class="ͼe">all</span></div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Должно быть:

<div class="relative w-full mt-4 mb-1" id="bkmrk-127.0.0.1%3A3307-%E2%86%92-%3Cws"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-127.0.0.1%3A3307-%E2%86%92-%3Cws-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">127.0.0.1:3307 → &lt;WSL_IP&gt;:3306</div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

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

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

<div class="relative w-full mt-4 mb-1" id="bkmrk-127.0.0.1%3A3307"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-127.0.0.1%3A3307-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">127.0.0.1:3307</div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>### 🟪 ШАГ 7 — PostgreSQL

<div class="relative w-full mt-4 mb-1" id="bkmrk-sudo-systemctl-enabl-2"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo-systemctl-enabl-3"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> systemctl enable postgresql  
<span class="ͼd">sudo</span> systemctl <span class="ͼd">start</span> postgresql</div></div></div></div></div></div></div></div></div></div><div class="">Проверка работы базы:</div></div></div></div><div class="relative w-full mt-4 mb-1" id="bkmrk-sudo-systemctl-statu"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo-nano-%2Fetc%2Fnginx-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> systemctl <span class="ͼd">status</span> postgresql</div></div></div></div></div></div></div></div></div></div><div class="">Как и в случае с mySQL лучше сделать проброс порта наружу с другим номером. Postgres по умолчанию работает на порту 5432, делаем проброс на порт 5433. </div><div class="">Сначала будет полезно добавить или поменять пароль у пользователя postgres базы:</div></div></div></div></div></div></div></div>Зайдите через системного пользователя:

<div class="relative w-full mt-4 mb-1" id="bkmrk-sudo--u-postgres-psq"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo--u-postgres-psq-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> <span class="ͼf">-u</span> postgres psql</div></div></div></div></div></div></div></div></div></div><div class="">  
</div></div></div></div></div></div></div></div></div></div></div></div>Потом:

<div class="relative w-full mt-4 mb-1" id="bkmrk-alter-user-postgres-"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-alter-user-postgres--1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼ8">ALTER</span> <span class="ͼ8">USER</span> postgres <span class="ͼ8">WITH</span> PASSWORD <span class="ͼc">'StrongPassword123!'</span>;</div></div></div></div></div></div></div></div></div></div><div class="">  
</div></div></div></div></div></div></div></div></div></div></div></div>И сразу:

<div class="relative w-full mt-4 mb-1" id="bkmrk-%5Cpassword-postgres"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-%5Cpassword-postgres-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">\password postgres</div></div></div></div></div></div></div></div></div></div><div class="">  
</div></div></div></div></div></div></div></div></div></div></div></div>(введите новый пароль вручную дважды)

Выйти:

<div class="relative w-full mt-4 mb-1" id="bkmrk-%5Cq"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1" id="bkmrk-sudo-nano-%2Fetc%2Fnginx"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-%5Cq-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">\q</div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div>
<div class="relative w-full mt-4 mb-1" id="bkmrk-%D0%9F%D0%BE-%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E-postgre"><div class=""><div class="relative"><div class="">По умолчанию Postgres слушает localhost, поэтому нужно поправить конфиги, чтобы проброс порта был успешным.</div><div class="">  
</div></div></div></div>#### ✅ Проверить в WSL

Выполните:

<div class="relative w-full mt-4 mb-1" id="bkmrk-sudo-ss--tulpn-%7C-gre"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo-ss--tulpn-%7C-gre-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> ss <span class="ͼf">-tulpn</span> | <span class="ͼd">grep</span> <span class="ͼb">5432</span></div></div></div></div></div></div></div></div></div></div><div class="">  
</div></div></div></div>  
</div></div></div></div>##### Что должно быть хорошо:

<div class="relative w-full mt-4 mb-1" id="bkmrk-0.0.0.0%3A5432"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-0.0.0.0%3A5432-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">0.0.0.0:5432</div></div></div></div></div></div></div></div></div></div><div class="">  
</div></div></div></div></div></div></div></div>или

<div class="relative w-full mt-4 mb-1" id="bkmrk-%2A%3A5432"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-%2A%3A5432-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">*:5432</div></div></div></div></div></div></div></div></div></div><div class="">  
</div></div></div></div>  
</div></div></div></div>##### Если плохо:

<div class="relative w-full mt-4 mb-1" id="bkmrk-127.0.0.1%3A5432"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-127.0.0.1%3A5432-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">127.0.0.1:5432</div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div></div></div></div></div>или

<div class="relative w-full mt-4 mb-1" id="bkmrk-localhost%3A5432"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-localhost%3A5432-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">localhost:5432</div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div></div></div></div></div>Тогда внешний доступ из Windows через portproxy не работает.

<div class="relative w-full mt-4 mb-1" id="bkmrk--6"><div class=""><div class="relative"><div class="">---

</div></div></div></div>#### 🥇 Как исправить

##### 1. Открыть конфиг PostgreSQL

<div class="relative w-full mt-4 mb-1" id="bkmrk-sudo-nano-%2Fetc%2Fpostg"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo-nano-%2Fetc%2Fpostg-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> nano /etc/postgresql/*/main/postgresql.conf</div></div></div></div></div></div></div></div></div></div><div class="">  
</div></div></div></div></div></div></div></div>Найдите:

<div class="relative w-full mt-4 mb-1" id="bkmrk-%23listen_addresses-%3D-"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-%23listen_addresses-%3D--1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">\#listen_addresses = 'localhost'</div></div></div></div></div></div></div></div></div></div><div class="">  
</div></div></div></div></div></div></div></div>Замените на:

<div class="relative w-full mt-4 mb-1" id="bkmrk-listen_addresses-%3D-%27"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-listen_addresses-%3D-%27-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">listen_addresses = '*'</div></div></div></div></div></div></div></div></div></div><div class="">  
</div></div></div></div>  
</div></div></div></div>##### 2. Разрешить подключение

Откройте:

<div class="relative w-full mt-4 mb-1" id="bkmrk-sudo-nano-%2Fetc%2Fpostg-2"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo-nano-%2Fetc%2Fpostg-3"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> nano /etc/postgresql/*/main/pg_hba.conf</div></div></div></div></div></div></div></div></div></div><div class="">  
</div></div></div></div></div></div></div></div>Добавьте строку:

<div class="relative w-full mt-4 mb-1" id="bkmrk--7"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk--8"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><div class="relative w-full mt-4 mb-1" id="bkmrk-host-all-all-172.31."><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-host-all-all-172.31.-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">host all all 172.31.32.1/32 scram-sha-256</div></div></div></div></div></div></div></div></div></div><div class="">  
</div></div></div></div></div></div></div></div>(если у вас в Windows есть уже запущенный Postgres и у него адрес именно такой)

<div class="relative w-full mt-4 mb-1" id="bkmrk--9"><div class=""><div class="relative"><div class="">  
</div></div></div></div>##### 3. Перезапустить PostgreSQL

<div class="relative w-full mt-4 mb-1" id="bkmrk-sudo-systemctl-resta-2"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo-systemctl-resta-3"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> systemctl <span class="ͼd">restart</span> postgresql</div></div></div></div></div></div></div></div></div></div><div class="">  
</div></div></div></div>  
</div></div></div></div>#### 🥇 Потом проверить снова

<div class="relative w-full mt-4 mb-1" id="bkmrk-sudo-ss--tulpn-%7C-gre-2"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo-ss--tulpn-%7C-gre-3"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> ss <span class="ͼf">-tulpn</span> | <span class="ͼd">grep</span> <span class="ͼb">5432</span></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div>#### Проброс порта:

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

<div class="relative w-full mt-4 mb-1" id="bkmrk-%D0%92%D0%BE%D1%82-%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B5-%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class=""><div class="">Вот полное содержимое файла для обоих серверов баз данных:</div><div class="">  
</div></div></div></div></div></div></div>```
$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"
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--10"><div class=""><div class="relative"><div class=""><div class="relative w-full mt-4 mb-1"><div class="">  
</div></div>В этой конфигурации предполагается, что обе базы могут прослушиваться не только с этого хоста, но и с внешних, это достигается через указание **listenaddress=<span class="hljs-number">0.0</span>.<span class="hljs-number">0.0, </span>**<span class="hljs-number">если нужно, чтобы базы были доступны только с этой машины, то нужно указать **listenaddress=127.0.0.1**</span></div></div></div><div class="">  
</div></div>### 🌐 ШАГ 8 — Nginx (главный вход)

Конфиг:

<div class="relative w-full mt-4 mb-1" id="bkmrk-sudo-nano-%2Fetc%2Fnginx-2"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo-nano-%2Fetc%2Fnginx-3"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> nano /etc/nginx/sites-available/default</div></div></div></div></div></div></div></div></div></div></div></div></div>#### 📌 Конфигурация

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

```
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;
	}

}

```

<div class="relative w-full mt-4 mb-1" id="bkmrk--11"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative">  
</div></div></div></div></div></div></div></div>#### Перезапуск Nginx:

<div class="relative w-full mt-4 mb-1" id="bkmrk-sudo-systemctl-resta-4"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo-systemctl-resta-5"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> systemctl <span class="ͼd">restart</span> nginx</div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>

# Windows Ubuntu WSL

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

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

---

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

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

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

```bash
wsl --install

```

👉 Это:

- включает WSL
- включает WSL2
- устанавливает Ubuntu (по умолчанию)

---

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

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

---

#### 3. Проверка

```bash
wsl -l -v

```

Ожидаемо:

```text
Ubuntu    Stopped    2

```

---

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

Запусти:

```bash
wsl -d Ubuntu

```

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

👉 создаёшь:

- username
- password

---

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

```bash
sudo apt update
sudo apt upgrade -y

```

---

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

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

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

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

```

---

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

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

```bash
wsl --shutdown

```

---

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

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

```

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

---

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

```bash
wsl --unregister Ubuntu

```

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

---

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

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

```

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

---

#### 5. Проверка

```bash
wsl -l -v

```

---

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

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

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

```

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

```text
D:\wsl\Ubuntu\

```

---

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

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

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

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

```

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

---

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

```text
D:\wsl\ubuntu.tar

```

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

---

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

#### Было:

- Ubuntu на C ❌
- диск быстро забивается

#### Стало:

- Ubuntu на D ✅
- C освобождён
- можно ставить:
    
    
    - nginx
    - MariaDB
    - PostgreSQL
    - GitLab
    - .NET

---

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

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

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

```bash
sudo nano /etc/wsl.conf

```

Добавьте:

```ini
[boot]
systemd=true

```

---

Потом:

```bash
wsl --shutdown

```

---

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

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

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

<p class="callout info">**wsl -l -v**</p>

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

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

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

<p class="callout info">**<span class="ͼe">wsl</span> <span class="ͼ8">--</span><span class="ͼe">set-default</span> <span class="ͼe">Ubuntu</span>**</p>

<span class="ͼe">В разных окнах Power Sell можно несколько раз выполнить команду wsl но среда WSL будет запущена только один раз, все остальные команды откроют терминалы к этой среде.</span>

#### <span role="text">❌ Остановка WSL</span>

<div class="relative w-full mt-4 mb-1" id="bkmrk-wsl---shutdown-2"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-wsl---shutdown-3"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">wsl --shutdown</div></div></div></div></div></div></div></div></div></div><div class=""></div></div></div></div>👉 тогда:

- ВСЕ процессы останавливаются
- WSL полностью выгружается

### 🎯 ИТОГ

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

- `export`
- `unregister`
- `import`  
    ✔ после этого ext4.vhdx на C больше не нужен

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

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

---

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

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

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

- nginx → пользователь `www-data`
- Apache HTTP Server → `www-data`
- MariaDB → `mysql`
- PostgreSQL → `postgres`

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

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

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

---

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

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

```

---

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

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

```bash
adduser devadmin

```

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

---

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

<div class="relative w-full mt-4 mb-1" id="bkmrk-usermod--ag-sudo-dev"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-usermod--ag-sudo-dev-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">usermod <span class="ͼf">-aG</span> <span class="ͼd">sudo</span> devadmin</div></div></div></div></div></div></div></div></div></div><div class=""></div></div></div></div>Проверить:

<div class="relative w-full mt-4 mb-1" id="bkmrk-id-devadmin"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-id-devadmin-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">id devadmin</div></div></div></div></div></div></div></div></div></div><div class=""></div></div></div></div>Должно быть:

<div class="relative w-full mt-4 mb-1" id="bkmrk-groups%3D...%2Csudo"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-groups%3D...%2Csudo-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">groups=...,sudo</div></div></div></div></div></div></div></div></div></div><div class=""><div class=""></div></div></div></div></div>### 🏆 ШАГ 3 — проверить домашнюю папку

<div class="relative w-full mt-4 mb-1" id="bkmrk-ls-%2Fhome"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-ls-%2Fhome-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">ls</span> /home</div></div></div></div></div></div></div></div></div></div><div class=""></div></div></div></div>Должно появиться:

<div class="relative w-full mt-4 mb-1" id="bkmrk-administratordevadmi"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-administratordevadmi-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">administrator  
devadmin</div></div></div></div></div></div></div></div></div></div><div class=""><div class=""></div></div></div></div></div>### 🏆 ШАГ 4 — сделать default user для WSL

В Windows PowerShell:

<div class="relative w-full mt-4 mb-1" id="bkmrk-ubuntu-config---defa"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-ubuntu-config---defa-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼe">ubuntu</span> <span class="ͼe">config</span> <span class="ͼ8">--</span><span class="ͼe">default-user</span> <span class="ͼe">devadmin</span></div></div></div></div></div></div></div></div></div></div></div></div></div>### 🏆 ШАГ 5 — проверить

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

<div class="relative w-full mt-4 mb-1" id="bkmrk-wsl--d-ubuntu"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-wsl--d-ubuntu-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼe">wsl</span> <span class="ͼ8">-</span><span class="ͼe">d</span> <span class="ͼe">Ubuntu</span></div></div></div></div></div></div></div></div></div></div><div class=""></div></div></div></div>Потом:

<div class="relative w-full mt-4 mb-1" id="bkmrk-whoami"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-whoami-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">whoami</div></div></div></div></div></div></div></div></div></div><div class=""></div></div></div></div>Должно быть:

<div class="relative w-full mt-4 mb-1" id="bkmrk-devadmin"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-devadmin-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">devadmin</div></div></div></div></div></div></div></div></div></div><div class=""><div class=""></div></div></div></div></div>### 🏆 ШАГ 6 — дать доступ к проектам

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

<div class="relative w-full mt-4 mb-1" id="bkmrk-%2Fhome%2Fadministrator"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-%2Fhome%2Fadministrator-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">/home/administrator</div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>или на `D:` — отдельно настроим.

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

<div class="relative w-full mt-4 mb-1" id="bkmrk-mkdir--p-%2Fhome%2Fdevad"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-mkdir--p-%2Fhome%2Fdevad-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">mkdir</span> <span class="ͼf">-p</span> /home/devadmin/projects  
<span class="ͼd">mkdir</span> <span class="ͼf">-p</span> /home/devadmin/services  
<span class="ͼd">mkdir</span> <span class="ͼf">-p</span> /home/devadmin/backups</div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

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

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

<div class="relative w-full mt-4 mb-1" id="bkmrk-sudo-mkdir--p-%2Fhome%2F"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-sudo-mkdir--p-%2Fhome%2F-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼd">sudo</span> <span class="ͼd">mkdir</span> <span class="ͼf">-p</span> /home/devadmin/minio-data  
<span class="ͼd">sudo</span> <span class="ͼd">mkdir</span> <span class="ͼf">-p</span> /home/devadmin/minio-config  
<span class="ͼd">sudo</span> <span class="ͼd">chown</span> <span class="ͼf">-R</span> devadmin:devadmin /home/devadmin/minio-data  
<span class="ͼd">sudo</span> <span class="ͼd">chown</span> <span class="ͼf">-R</span> devadmin:devadmin /home/devadmin/minio-config</div></div></div></div></div></div></div></div></div></div><div class=""><div class=""></div></div></div></div></div>### 🧠 Что с nginx/apache/db

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

<div class="relative w-full mt-4 mb-1" id="bkmrk-nginx--%3E-www-dataapa"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj" dir="ltr" id="bkmrk-nginx--%3E-www-dataapa-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">nginx -&gt; www-data  
apache -&gt; www-data  
MariaDB -&gt; mysql  
Postgres -&gt; postgres</div></div></div></div></div></div></div></div></div></div><div class=""></div></div></div></div>Это правильно.

# Что такое WSL

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

### Что даёт WSL

#### Linux-команды

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

```bash
ls
grep
find
ssh
curl

```

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

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

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

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

```

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

#### Docker

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

#### .NET

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

```bash
dotnet --version

```

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

#### React / Node.js

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

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

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

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

```text
Windows
  172.31.32.1

WSL
  172.31.xx.xx

```

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

```bash
cat /etc/resolv.conf
nameserver 172.31.32.1

```

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

###  

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

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

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

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

```

Плюсы:

- полная изоляция

Минусы:

- больше памяти
- больше диска
- медленнее старт

#### WSL

```text
Windows
 └─ Ubuntu

```

Плюсы:

- быстрый запуск
- меньше ресурсов
- интеграция с Windows

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

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

```text
Remote - WSL

```

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

```text
~/.vscode-server

```

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

```text
~/.vscode-server/data/logs

```

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

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

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

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

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

```
git --version

```

<div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-329 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwi6k8jGoo6WAxUAAAAAHQAAAAAQ5QQ" decode-data-ved="1" id="bkmrk--1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_797ae71846097008","c_e95c9efc50ee6e3f",null,"rc_b3562b1054356755",null,null,"ru",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-329"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-329"></div></div></div>*(Если нужно обновить Git до актуальной версии в Ubuntu: `sudo apt update && sudo apt install git -y`).*

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

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

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

<div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-355 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwi6k8jGoo6WAxUAAAAAHQAAAAAQlgU" decode-data-ved="1" id="bkmrk-bash-1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_cf330d4f6e7c1c4c","c_e95c9efc50ee6e3f",null,"rc_91ad23e6a6b661bd",null,null,"uk",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-355"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-355"><div _ngcontent-ng-c2111435165="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2111435165-355 ng-star-inserted"><span class="ng-tns-c2111435165-355">Bash</span><div _ngcontent-ng-c2111435165="" class="buttons ng-tns-c2111435165-355 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
gh --version

```

<div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-355 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwi6k8jGoo6WAxUAAAAAHQAAAAAQlgU" decode-data-ved="1" id="bkmrk--3" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_cf330d4f6e7c1c4c","c_e95c9efc50ee6e3f",null,"rc_91ad23e6a6b661bd",null,null,"uk",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-355"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-355"></div></div></div>- **Если `gh` установлен:** Вы увидите версию утилиты и архитектуру, например:
    
    `gh version 2.52.0 (2024-06-20)`
- **Если `gh` НЕ установлен:**
    
    
    - В **WSL / Ubuntu** вы получите сообщение: `Command 'gh' not found...`
    - В **Windows PowerShell** вы получите ошибку: `gh : Имя "gh" не распознано как имя командлета...`

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

- **В WSL / Ubuntu / Linux:**
    
    <div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-356 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwi6k8jGoo6WAxUAAAAAHQAAAAAQlwU" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_cf330d4f6e7c1c4c","c_e95c9efc50ee6e3f",null,"rc_91ad23e6a6b661bd",null,null,"uk",null,1,null,null,1,0]]"></div>```
    which gh
    
    ```
    
    <div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-356 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwi6k8jGoo6WAxUAAAAAHQAAAAAQlwU" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_cf330d4f6e7c1c4c","c_e95c9efc50ee6e3f",null,"rc_91ad23e6a6b661bd",null,null,"uk",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-356"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-356"></div></div></div>*(Если установлен, вернет путь вида `/usr/bin/gh` или `/usr/local/bin/gh`).*
- **В Windows PowerShell:**
    
    <div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-357 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwi6k8jGoo6WAxUAAAAAHQAAAAAQmAU" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_cf330d4f6e7c1c4c","c_e95c9efc50ee6e3f",null,"rc_91ad23e6a6b661bd",null,null,"uk",null,1,null,null,1,0]]"></div>```
    Get-Command gh
    
    ```
    
    <div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-357 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwi6k8jGoo6WAxUAAAAAHQAAAAAQmAU" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_cf330d4f6e7c1c4c","c_e95c9efc50ee6e3f",null,"rc_91ad23e6a6b661bd",null,null,"uk",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-357"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-357"></div></div></div>

#### Как быстро установить `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

```

<div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-430 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwi6k8jGoo6WAxUAAAAAHQAAAAAQ7QU" decode-data-ved="1" id="bkmrk--4" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_b5f604c1686bc56d","c_e95c9efc50ee6e3f",null,"rc_eee06e98e3aa2217",null,null,"ru",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-430"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-430"></div></div></div>*(Или через HTTPS / GitHub CLI, например: `gh repo clone username/repository`).*

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

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

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

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

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

```
git branch -a

```

<div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-431 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwi6k8jGoo6WAxUAAAAAHQAAAAAQ7gU" decode-data-ved="1" id="bkmrk--7" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_b5f604c1686bc56d","c_e95c9efc50ee6e3f",null,"rc_eee06e98e3aa2217",null,null,"ru",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-431"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-431"></div></div></div>Вы увидите список:

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

```

<div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-432 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwi6k8jGoo6WAxUAAAAAHQAAAAAQ7wU" decode-data-ved="1" id="bkmrk--10" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_b5f604c1686bc56d","c_e95c9efc50ee6e3f",null,"rc_eee06e98e3aa2217",null,null,"ru",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-432"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-432"></div></div></div>Все ветки с префиксом `remotes/origin/` **уже находятся на вашем компьютере**, их не нужно скачивать заново из интернета.

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

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

```
git checkout dev

```

<div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-433 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwi6k8jGoo6WAxUAAAAAHQAAAAAQ8AU" decode-data-ved="1" id="bkmrk--13" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_b5f604c1686bc56d","c_e95c9efc50ee6e3f",null,"rc_eee06e98e3aa2217",null,null,"ru",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-433"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-433"></div></div></div>*(В современных версиях 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

```

<div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-434 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwi6k8jGoo6WAxUAAAAAHQAAAAAQ8QU" decode-data-ved="1" id="bkmrk--16" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_b5f604c1686bc56d","c_e95c9efc50ee6e3f",null,"rc_eee06e98e3aa2217",null,null,"ru",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-434"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-434"></div></div></div>**В Windows PowerShell:**

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

```

<div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-435 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwi6k8jGoo6WAxUAAAAAHQAAAAAQ8gU" decode-data-ved="1" id="bkmrk--18" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_b5f604c1686bc56d","c_e95c9efc50ee6e3f",null,"rc_eee06e98e3aa2217",null,null,"ru",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-435"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-435"></div></div></div>После выполнения этого скрипта каждая удаленная ветка превратится в полноценную локальную ветку.

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

```bash
# ==========================================
# .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.

### 🏆 Что получим

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

```

---

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

Проверьте:

```bash
whoami

```

Должно быть:

```text
devadmin

```

Если нет:

```bash
su - devadmin

```

---

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

```bash
wget https://dl.min.io/server/minio/release/linux-amd64/minio

```

```bash
chmod +x minio

```

```bash
sudo mv minio /usr/local/bin/

```

Проверка:

```bash
minio --version

```

---

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

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

```

---

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

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

```

Вставьте:

```ini
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 сервис

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

```

Вставьте:

```ini
[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 — включить автозапуск

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

```

---

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

```bash
sudo systemctl status minio

```

Должно быть:

```text
active (running)

```

---

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

Браузер:

```text
http://localhost:9001

```

Логин:

```text
admin

```

Пароль:

```text
StrongPass123!

```

---

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

В UI:

```text
uploads

```

---

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

Проверь:

```bash
sudo ss -tulpn | grep 900

```

---

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

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

```

---

### 🥇 Важно

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

```bash
sudo nano /etc/wsl.conf

```

Добавить:

```ini
[boot]
systemd=true

```

Затем из Windows:

```powershell
wsl --shutdown

```

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

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

- Имеется VPS с выделенным IP где-то в Европе. Там стоит Linux, в моем случае это Ubuntu. Нужно иметь на сервер права администратора. Сервер должен принимать соединения по ssh.
- Машина с Windows 10 или 11.
- VPS должен быть виден через ваше интернет-соединение. В моем случае у меня было два интернет-подключения: через мобильное соединение VPS виден не был, через проводное соединение видимость была.
- Не должно быть работающих VPN-соединений.

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

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

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

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

```

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

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

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

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

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

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

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

```bash
socks=127.0.0.1:1080
```

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

<p class="callout warning">После того, как вы запишите эти настройки, они корректно пропишутся в реестр windows, но при редактировании оттуда будут взяты неверные значения. при повторной записи работа прокси сломается, ниже пример того, как интерпретирует эти настройки интерфейс windows:</p>

[![proxy-2.jpg](https://docs.consulting-plus.com/uploads/images/gallery/2026-06/scaled-1680-/proxy-2.jpg)](https://docs.consulting-plus.com/uploads/images/gallery/2026-06/proxy-2.jpg)

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

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

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

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

<p class="callout info">Нужно иметь в виду, что с таким proxy в вашем случае будут работать только те приложения, которые используют протокол socks. </p>

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

Например:

- браузеры обычно умеют
- некоторые программы используют WinINET/WinHTTP
- некоторые (включая часть Electron/Node-приложений) игнорируют системный SOCKS и требуют отдельной настройки

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

```bash
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
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--1"><div class=""><div class="contents"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class=""></div></div></div></div></div></div></div></div>Проверить текущие значения:

```
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.

Вопрос:

<p class="callout info">что конкретно делает эта команда ssh -D 0.0.0.0:1080 -N root@\[IP\_your\_vps\]</p>

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

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

Схема:

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

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

##### <span role="text">`ssh`</span>

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

##### <span role="text">`root@IP_VPS`</span>

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

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

Например:

```
ssh root@38.242.220.114
```

##### <span role="text">`-D`</span>

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

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

Например:

```
-D 1080
```

создаёт:

```
SOCKS5 localhost:1080
```

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

##### <span role="text">`0.0.0.0:1080`</span>

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

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

```
-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
и т.д.
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--2"><div class=""><div class="contents"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""></div></div></div></div></div></div></div>##### <span role="text">`-N`</span>

Означает:

```
Не запускать 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.

Тогда:

- Continue
- OpenAI API
- Gemini API
- GitHub Copilot

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

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

<p class="callout warning">Для дополнительной безопасности я бы рекомендовал использовать не `root`, а отдельного пользователя на VPS:</p>

```
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** без расширения примерно с таким содержанием:

```bash
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

```

<div _ngcontent-ng-c1365522812="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C%2C-%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82-%D0%BB%D0%B8" inline-copy-host=""><div class="" dir="">Проверить, открыт ли порт **1080** и слушаются ли на нем подключения, можно прямо из консоли Windows (Command Prompt / PowerShell) или из среды WSL.</div>  
<div class="" dir="">Ниже приведено несколько простых способов проверки работает ли соединение.</div>  
</div>#### Способ 1. Проверка через PowerShell (Windows) — *Самый удобный*

<div _ngcontent-ng-c1365522812="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9E%D1%82%D0%BA%D1%80%D0%BE%D0%B9%D1%82%D0%B5-powershell-" inline-copy-host=""><div class="" dir="">Откройте **PowerShell** от имени администратора или обычного пользователя и выполните:</div>  
</div><div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-91 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwi6k8jGoo6WAxUAAAAAHQAAAAAQdQ" decode-data-ved="1" id="bkmrk-powershell" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_196d036afd43e43b","c_e95c9efc50ee6e3f",null,"rc_b0d5dfbf42033120",null,null,"sr",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-91"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-91"><div _ngcontent-ng-c2111435165="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2111435165-91 ng-star-inserted"><span class="ng-tns-c2111435165-91">PowerShell</span><div _ngcontent-ng-c2111435165="" class="buttons ng-tns-c2111435165-91 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
Get-NetTCPConnection -LocalPort 1080 -ErrorAction SilentlyContinue

```

<div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-91 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwi6k8jGoo6WAxUAAAAAHQAAAAAQdQ" decode-data-ved="1" id="bkmrk-" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_196d036afd43e43b","c_e95c9efc50ee6e3f",null,"rc_b0d5dfbf42033120",null,null,"sr",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-91"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-91"></div></div></div><div _ngcontent-ng-c1365522812="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%95%D1%81%D0%BB%D0%B8-%D0%BF%D0%BE%D1%80%D1%82-%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82-%D0%B8-%D0%BF" inline-copy-host="">- <div class="" dir="">**Если порт открыт и прослушивается:** Команда выведет таблицу с состоянием подключения (`State: Listen`), а в колонке `OwningProcess` будет указан PID (идентификатор процесса, например, вашего `ssh.exe`).</div>
- <div class="" dir="">**Если порт закрыт:** Команда ничего не выведет (вернется пустая строка).</div>

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

<div _ngcontent-ng-c1365522812="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9E%D1%82%D0%BA%D1%80%D0%BE%D0%B9%D1%82%D0%B5-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D1%83%D1%8E-%D1%81" inline-copy-host=""><div class="" dir="">Откройте командную строку или PowerShell и выполните:</div>  
</div><div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-92 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwi6k8jGoo6WAxUAAAAAHQAAAAAQdg" decode-data-ved="1" id="bkmrk-dos" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_196d036afd43e43b","c_e95c9efc50ee6e3f",null,"rc_b0d5dfbf42033120",null,null,"sr",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-92"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-92"><div _ngcontent-ng-c2111435165="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2111435165-92 ng-star-inserted"><span class="ng-tns-c2111435165-92">DOS</span><div _ngcontent-ng-c2111435165="" class="buttons ng-tns-c2111435165-92 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
netstat -ano | findstr :1080

```

<div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-92 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwi6k8jGoo6WAxUAAAAAHQAAAAAQdg" decode-data-ved="1" id="bkmrk--1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_196d036afd43e43b","c_e95c9efc50ee6e3f",null,"rc_b0d5dfbf42033120",null,null,"sr",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-92"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-92"></div></div></div><div _ngcontent-ng-c1365522812="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9E%D0%B6%D0%B8%D0%B4%D0%B0%D0%B5%D0%BC%D1%8B%D0%B9-%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82-" inline-copy-host="">- <div class="" dir="">**Ожидаемый результат (порт открыт):**</div>  
    <div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-93 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwi6k8jGoo6WAxUAAAAAHQAAAAAQdw" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_196d036afd43e43b","c_e95c9efc50ee6e3f",null,"rc_b0d5dfbf42033120",null,null,"sr",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-93"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-93"><div _ngcontent-ng-c2111435165="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2111435165-93 ng-star-inserted"><span class="ng-tns-c2111435165-93">Plaintext</span><div _ngcontent-ng-c2111435165="" class="buttons ng-tns-c2111435165-93 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
    TCP    0.0.0.0:1080           0.0.0.0:0              LISTENING       1234
    
    ```
    
    <div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-93 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwi6k8jGoo6WAxUAAAAAHQAAAAAQdw" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_196d036afd43e43b","c_e95c9efc50ee6e3f",null,"rc_b0d5dfbf42033120",null,null,"sr",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-93"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-93"></div></div></div><div class="" dir="">*(Значение `LISTENING` означает, что SOCKS-туннель успешно поднят и ждет подключений, а `1234` в конце — это PID процесса SSH).*</div>
- <div class="" dir="">**Если порт закрыт:** Вывод будет абсолютно пустым.</div>

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

<div _ngcontent-ng-c1365522812="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%95%D1%81%D0%BB%D0%B8-%D1%82%D1%83%D0%BD%D0%BD%D0%B5%D0%BB%D1%8C-%D0%B8%D0%BB%D0%B8-%D0%BF%D1%80%D0%BE" inline-copy-host=""><div class="" dir="">Если туннель или проверяемое приложение запущены внутри WSL, используйте стандартные утилиты Linux:</div>  
</div><div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-94 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwi6k8jGoo6WAxUAAAAAHQAAAAAQeA" decode-data-ved="1" id="bkmrk-bash" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_196d036afd43e43b","c_e95c9efc50ee6e3f",null,"rc_b0d5dfbf42033120",null,null,"sr",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-94"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-94"><div _ngcontent-ng-c2111435165="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2111435165-94 ng-star-inserted"><span class="ng-tns-c2111435165-94">Bash</span><div _ngcontent-ng-c2111435165="" class="buttons ng-tns-c2111435165-94 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
# Через ss (современный аналог netstat)
ss -tulpn | grep 1080

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

```

<div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-94 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwi6k8jGoo6WAxUAAAAAHQAAAAAQeA" decode-data-ved="1" id="bkmrk--2" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_196d036afd43e43b","c_e95c9efc50ee6e3f",null,"rc_b0d5dfbf42033120",null,null,"sr",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-94"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-94"></div></div></div><div _ngcontent-ng-c1365522812="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--3" inline-copy-host=""></div>#### Способ 4. Экспресс-проверка подключения (Test-NetConnection)

<div _ngcontent-ng-c1365522812="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%95%D1%81%D0%BB%D0%B8-%D0%B2%D1%8B-%D1%85%D0%BE%D1%82%D0%B8%D1%82%D0%B5-%D1%83%D0%B1%D0%B5%D0%B4%D0%B8" inline-copy-host=""><div class="" dir="">Если вы хотите убедиться, что порт не просто открыт, а к нему действительно можно успешно подключиться локально (например, со стороны браузера или приложения):</div>  
</div><div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-95 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwi6k8jGoo6WAxUAAAAAHQAAAAAQeQ" decode-data-ved="1" id="bkmrk-powershell-1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_196d036afd43e43b","c_e95c9efc50ee6e3f",null,"rc_b0d5dfbf42033120",null,null,"sr",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-95"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-95"><div _ngcontent-ng-c2111435165="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2111435165-95 ng-star-inserted"><span class="ng-tns-c2111435165-95">PowerShell</span><div _ngcontent-ng-c2111435165="" class="buttons ng-tns-c2111435165-95 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
Test-NetConnection -ComputerName 127.0.0.1 -Port 1080

```

<div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-95 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwi6k8jGoo6WAxUAAAAAHQAAAAAQeQ" decode-data-ved="1" id="bkmrk--4" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_196d036afd43e43b","c_e95c9efc50ee6e3f",null,"rc_b0d5dfbf42033120",null,null,"sr",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-95"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-95"></div></div></div><div _ngcontent-ng-c1365522812="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%92-%D0%BE%D1%82%D0%B2%D0%B5%D1%82-%D0%B2%D1%8B-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D0%B5-" inline-copy-host=""><div class="" dir="">В ответ вы получите отчет. Обратите внимание на нижнюю строку:</div>  
- <div class="" dir="">`TcpTestSucceeded : True` — порт открыт и принимает соединения.</div>
- <div class="" dir="">`TcpTestSucceeded : False` — порт закрыт (SSH-туннель не запущен или упал).</div>

</div>> <div class="" dir="">**Узнать, какая программа заняла порт:**</div><div class="" dir="">Если порт 1080 занят, но вы не уверены, чем именно, узнайте PID из команды `netstat` (последнее число в строке) и выполните в PowerShell:</div><div _ngcontent-ng-c2111435165="" class="code-block ng-tns-c2111435165-96 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwi6k8jGoo6WAxUAAAAAHQAAAAAQeg" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_196d036afd43e43b","c_e95c9efc50ee6e3f",null,"rc_b0d5dfbf42033120",null,null,"sr",null,1,null,null,1,0]]"><div _ngcontent-ng-c2111435165="" class="formatted-code-block-internal-container ng-tns-c2111435165-96"><div _ngcontent-ng-c2111435165="" class="animated-opacity ng-tns-c2111435165-96"><div _ngcontent-ng-c2111435165="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2111435165-96 ng-star-inserted"><span class="ng-tns-c2111435165-96">PowerShell</span></div></div></div></div>```
> Get-Process -Id <PID>
> 
> ```

<div _ngcontent-ng-c1365522812="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--5" inline-copy-host=""></div>

# Работа с MS Vs Code

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

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

WSL - это среда Linux под Windows [подробнее о WSL](https://docs.consulting-plus.com/books/linux-windows/page/cto-takoe-wsl "Что такое WSL").

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

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

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

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

```text
WSL: Ubuntu

```

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

```bash
dotnet build
npm install
npm run dev

```

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

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

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

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

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

Например:

- Vite
- Webpack
- ESLint
- npm
- pnpm

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

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

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

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

```bash
grep
find
sed
awk
ssh
rsync
curl

```

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

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

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

В WSL можно:

```bash
ssh server
scp file
rsync project

```

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

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

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

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

```

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

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

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

```bash
dotnet publish

```

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

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

- путей (`/` против `\`)
- регистра файлов
- прав доступа
- конфигурации Linux

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

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

- WinForms
- WPF
- MAUI под Windows
- COM-компоненты
- специфичные Windows SDK

Но если у вас:

```text
React
ASP.NET Core
Ubuntu

```

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

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

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

```text
/home/devadmin/projects/myapp

```

а не в:

```text
/mnt/c/Users/...

```

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

Для работы в WSL вам нужно выполнить сначала установку VS Code под Windows, скачайте его с официального сайта по [ссылке](https://code.visualstudio.com/download).

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

```
wsl
```

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

<p class="callout info">Open any folder in the Windows Subsystem for Linux (WSL) and take advantage of Visual Studio Code's full feature set.</p>

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

Нажмите Ctrl-&gt;Alt-&gt;O или кликните в нижнем левом углу по иконке "&gt;&lt;",откроется 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
}
```

После этого:

- Continue
- Copilot
- npm
- dotnet restore
- git clone
- curl

из 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
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--1"><div class=""><div class="contents"><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼd ͼr" dir="ltr" id="bkmrk--2"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div></div>

# Работа с AI

# Аккаунт DeepSeek

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

[https://platform.deepseek.com](https://platform.deepseek.com)

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

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

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

[https://sao-rating.ru/](https://sao-rating.ru/)

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

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

<span class="">Самый простой способ - использовать переменные окружения.</span>

#### **<span class="">Настройка переменных окружения</span>**

##### <span class="">Для Windows (CMD):</span>

<div class="md-code-block md-code-block-light" id="bkmrk-cmd"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">cmd</span></div></div></div></div></div>```
set DEEPSEEK_API_KEY=ваш_ключ_здесь
set OPENAI_API_BASE=https://api.deepseek.com/v1
```

<div class="md-code-block md-code-block-light" id="bkmrk-"><svg class="_9bc997d _33882ae" fill="none" height="12" viewbox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="M-5.24537e-07 0C-2.34843e-07 6.62742 5.37258 12 12 12L0 12L-5.24537e-07 0Z" fill="currentColor"></path></svg><svg class="_9bc997d _28d7e84" fill="none" height="12" viewbox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="M-5.24537e-07 0C-2.34843e-07 6.62742 5.37258 12 12 12L0 12L-5.24537e-07 0Z" fill="currentColor"></path></svg></div>##### <span class="">Для Windows (PowerShell):</span>

<div class="md-code-block md-code-block-light" id="bkmrk-powershell"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">powershell</span></div></div></div></div></div>```
$env:DEEPSEEK_API_KEY="ваш_ключ_здесь"
$env:OPENAI_API_BASE="https://api.deepseek.com/v1"
```

<div class="md-code-block md-code-block-light" id="bkmrk--1"><svg class="_9bc997d _33882ae" fill="none" height="12" viewbox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="M-5.24537e-07 0C-2.34843e-07 6.62742 5.37258 12 12 12L0 12L-5.24537e-07 0Z" fill="currentColor"></path></svg><svg class="_9bc997d _28d7e84" fill="none" height="12" viewbox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="M-5.24537e-07 0C-2.34843e-07 6.62742 5.37258 12 12 12L0 12L-5.24537e-07 0Z" fill="currentColor"></path></svg></div>##### <span class="">Для Linux/Mac:</span>

<span class=""><span class="d813de27">bash</span></span>

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

<div class="md-code-block md-code-block-light" id="bkmrk--2"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384">  
</div></div></div></div><p class="callout warning">В некоторых случаях ключ OPENAI\_API\_BASE не нужен, его наличие может внести путаницу при обращении к API моделей, которые могут работать одновременно с моделями DeepSeek, некоторые агенты для работы с AI моделями знают эти URL, поэтому попробуйте сначала устанавливать просто ключ DEEPSEEK\_API\_KEY.</p>

<p class="callout info">У DeepSeek на момент написания этой статьи есть скидки на работу в часы off-peak, посмотрите актуальную информацию об этом в документации, сейчас она находится на странице   
[https://api-docs.deepseek.com/quick\_start/pricing](https://api-docs.deepseek.com/quick_start/pricing)   
Для экономии средств есть рекомендация писать промпты на английском языке, так как обработка английских букв примерно на 40% дешевле, чем, например, русских.</p>

# Работа с AIDER

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

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

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

Процесс взаимодействия с моделью в Aider строится по схеме «Чат <span class="math-inline" data-index-in-node="64" data-math="\rightarrow">\\</span> Понимание контекста <span class="math-inline" data-index-in-node="96" data-math="\rightarrow">\\ </span>Правка файлов <span class="math-inline" data-index-in-node="122" data-math="\rightarrow">\\</span> 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

<div _ngcontent-ng-c3844624135="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-aider-%D1%87%D0%B5%D1%80%D0%B5" inline-copy-host=""><div>Установка Aider через `pipx` — это официальный и наиболее рекомендуемый способ, так как он изолирует зависимости Aider от системного Python и других пакетов в WSL/Linux.</div><div>  
</div></div><p class="callout warning">Описанные ниже действия проверялись мной в системе WSL.</p>

<div _ngcontent-ng-c3844624135="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%92%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5-%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B8%D0%B5-" inline-copy-host="">Выполните следующие шаги в терминале WSL:</div>#### Шаг 1. Установите `pipx` (если он еще не установлен)

<div _ngcontent-ng-c3844624135="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-" inline-copy-host=""></div><div _ngcontent-ng-c1961595714="" class="code-block ng-tns-c1961595714-704 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwijnevAgdyWAxUAAAAAHQAAAAAQhwc" decode-data-ved="1" id="bkmrk-bash" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_7341ed3c7c76dc9c","c_ce28b2606abd0396",null,"rc_28fe767c4be03ad7",null,null,"ru",null,1,null,null,1,0]]"><div _ngcontent-ng-c1961595714="" class="formatted-code-block-internal-container ng-tns-c1961595714-704"><div _ngcontent-ng-c1961595714="" class="animated-opacity ng-tns-c1961595714-704"><div _ngcontent-ng-c1961595714="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c1961595714-704 ng-star-inserted"><span class="ng-tns-c1961595714-704">Bash</span><div _ngcontent-ng-c1961595714="" class="buttons ng-tns-c1961595714-704 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
sudo apt update
sudo apt install -y pipx
pipx ensurepath

```

<div _ngcontent-ng-c1961595714="" class="code-block ng-tns-c1961595714-704 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwijnevAgdyWAxUAAAAAHQAAAAAQhwc" decode-data-ved="1" id="bkmrk--1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_7341ed3c7c76dc9c","c_ce28b2606abd0396",null,"rc_28fe767c4be03ad7",null,null,"ru",null,1,null,null,1,0]]"><div _ngcontent-ng-c1961595714="" class="formatted-code-block-internal-container ng-tns-c1961595714-704"><div _ngcontent-ng-c1961595714="" class="animated-opacity ng-tns-c1961595714-704"></div></div></div><div _ngcontent-ng-c3844624135="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%28%D0%9F%D0%BE%D1%81%D0%BB%D0%B5-%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F-pi" inline-copy-host=""><div>*(После выполнения `pipx ensurepath` может потребоваться перезапустить терминал или выполнить `source ~/.bashrc`, чтобы пути к бинарникам обновились).*</div>  
</div>#### Шаг 2. Установите Aider

<div _ngcontent-ng-c3844624135="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%92%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%83-%D1%83%D1%81" inline-copy-host=""><div>Выполните команду установки:</div>  
</div><div _ngcontent-ng-c1961595714="" class="code-block ng-tns-c1961595714-705 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwijnevAgdyWAxUAAAAAHQAAAAAQiAc" decode-data-ved="1" id="bkmrk-bash-1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_7341ed3c7c76dc9c","c_ce28b2606abd0396",null,"rc_28fe767c4be03ad7",null,null,"ru",null,1,null,null,1,0]]"><div _ngcontent-ng-c1961595714="" class="formatted-code-block-internal-container ng-tns-c1961595714-705"><div _ngcontent-ng-c1961595714="" class="animated-opacity ng-tns-c1961595714-705"><div _ngcontent-ng-c1961595714="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c1961595714-705 ng-star-inserted"><span class="ng-tns-c1961595714-705">Bash</span><div _ngcontent-ng-c1961595714="" class="buttons ng-tns-c1961595714-705 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
pipx install aider-chat

```

<div _ngcontent-ng-c1961595714="" class="code-block ng-tns-c1961595714-705 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwijnevAgdyWAxUAAAAAHQAAAAAQiAc" decode-data-ved="1" id="bkmrk--2" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_7341ed3c7c76dc9c","c_ce28b2606abd0396",null,"rc_28fe767c4be03ad7",null,null,"ru",null,1,null,null,1,0]]"><div _ngcontent-ng-c1961595714="" class="formatted-code-block-internal-container ng-tns-c1961595714-705"><div _ngcontent-ng-c1961595714="" class="animated-opacity ng-tns-c1961595714-705"></div></div></div><div _ngcontent-ng-c3844624135="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--3" inline-copy-host=""></div>#### Шаг 3. Доустановите SOCKS и сетевые зависимости (Обязательно для OpenRouter / WSL)

<div _ngcontent-ng-c3844624135="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%A7%D1%82%D0%BE%D0%B1%D1%8B-%D0%B8%D0%B7%D0%B1%D0%B5%D0%B6%D0%B0%D1%82%D1%8C-%D0%BE%D1%88%D0%B8%D0%B1%D0%BE" inline-copy-host=""><div>Чтобы избежать ошибок вида `Missing dependencies for SOCKS support` при работе через OpenRouter или прокси, сразу внедрите сетевые пакеты в изолированное окружение Aider:</div>  
</div><div _ngcontent-ng-c1961595714="" class="code-block ng-tns-c1961595714-706 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwijnevAgdyWAxUAAAAAHQAAAAAQiQc" decode-data-ved="1" id="bkmrk-bash-2" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_7341ed3c7c76dc9c","c_ce28b2606abd0396",null,"rc_28fe767c4be03ad7",null,null,"ru",null,1,null,null,1,0]]"><div _ngcontent-ng-c1961595714="" class="formatted-code-block-internal-container ng-tns-c1961595714-706"><div _ngcontent-ng-c1961595714="" class="animated-opacity ng-tns-c1961595714-706"><div _ngcontent-ng-c1961595714="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c1961595714-706 ng-star-inserted"><span class="ng-tns-c1961595714-706">Bash</span><div _ngcontent-ng-c1961595714="" class="buttons ng-tns-c1961595714-706 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
pipx inject aider-chat PySocks requests[socks] urllib3

```

<div _ngcontent-ng-c1961595714="" class="code-block ng-tns-c1961595714-706 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwijnevAgdyWAxUAAAAAHQAAAAAQiQc" decode-data-ved="1" id="bkmrk--4" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_7341ed3c7c76dc9c","c_ce28b2606abd0396",null,"rc_28fe767c4be03ad7",null,null,"ru",null,1,null,null,1,0]]"><div _ngcontent-ng-c1961595714="" class="formatted-code-block-internal-container ng-tns-c1961595714-706"><div _ngcontent-ng-c1961595714="" class="animated-opacity ng-tns-c1961595714-706"></div></div></div><div _ngcontent-ng-c3844624135="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--5" inline-copy-host=""></div>#### Шаг 4. Проверьте установку

<div _ngcontent-ng-c3844624135="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D1%8C%D1%82%D0%B5%2C-%D1%87%D1%82%D0%BE-aider" inline-copy-host=""><div>Проверьте, что Aider доступен в системе и выводит версию:</div>  
</div><div _ngcontent-ng-c1961595714="" class="code-block ng-tns-c1961595714-707 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwijnevAgdyWAxUAAAAAHQAAAAAQigc" decode-data-ved="1" id="bkmrk-bash-3" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_7341ed3c7c76dc9c","c_ce28b2606abd0396",null,"rc_28fe767c4be03ad7",null,null,"ru",null,1,null,null,1,0]]"><div _ngcontent-ng-c1961595714="" class="formatted-code-block-internal-container ng-tns-c1961595714-707"><div _ngcontent-ng-c1961595714="" class="animated-opacity ng-tns-c1961595714-707"><div _ngcontent-ng-c1961595714="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c1961595714-707 ng-star-inserted"><span class="ng-tns-c1961595714-707">Bash</span><div _ngcontent-ng-c1961595714="" class="buttons ng-tns-c1961595714-707 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
aider --version

```

<div _ngcontent-ng-c1961595714="" class="code-block ng-tns-c1961595714-707 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwijnevAgdyWAxUAAAAAHQAAAAAQigc" decode-data-ved="1" id="bkmrk--6" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_7341ed3c7c76dc9c","c_ce28b2606abd0396",null,"rc_28fe767c4be03ad7",null,null,"ru",null,1,null,null,1,0]]"><div _ngcontent-ng-c1961595714="" class="formatted-code-block-internal-container ng-tns-c1961595714-707"><div _ngcontent-ng-c1961595714="" class="animated-opacity ng-tns-c1961595714-707"></div></div></div><div _ngcontent-ng-c3844624135="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--7" inline-copy-host=""></div>#### Полезные команды для обслуживания `pipx` в будущем

<div _ngcontent-ng-c3844624135="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9E%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C-aider-%D0%B4%D0%BE-%D0%BF%D0%BE" inline-copy-host="">- <div>**Обновить Aider до последней версии:**</div>  
    <div _ngcontent-ng-c1961595714="" class="code-block ng-tns-c1961595714-708 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwijnevAgdyWAxUAAAAAHQAAAAAQiwc" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_7341ed3c7c76dc9c","c_ce28b2606abd0396",null,"rc_28fe767c4be03ad7",null,null,"ru",null,1,null,null,1,0]]"><div _ngcontent-ng-c1961595714="" class="formatted-code-block-internal-container ng-tns-c1961595714-708"><div _ngcontent-ng-c1961595714="" class="animated-opacity ng-tns-c1961595714-708"><div _ngcontent-ng-c1961595714="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c1961595714-708 ng-star-inserted"><span class="ng-tns-c1961595714-708">Bash</span><div _ngcontent-ng-c1961595714="" class="buttons ng-tns-c1961595714-708 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
    pipx upgrade aider-chat
    
    ```
    
    <div _ngcontent-ng-c1961595714="" class="code-block ng-tns-c1961595714-708 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwijnevAgdyWAxUAAAAAHQAAAAAQiwc" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_7341ed3c7c76dc9c","c_ce28b2606abd0396",null,"rc_28fe767c4be03ad7",null,null,"ru",null,1,null,null,1,0]]"><div _ngcontent-ng-c1961595714="" class="formatted-code-block-internal-container ng-tns-c1961595714-708"><div _ngcontent-ng-c1961595714="" class="animated-opacity ng-tns-c1961595714-708"></div></div></div>
- <div>**Переустановить с нуля:**</div><div _ngcontent-ng-c1961595714="" class="code-block ng-tns-c1961595714-709 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwijnevAgdyWAxUAAAAAHQAAAAAQjAc" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_7341ed3c7c76dc9c","c_ce28b2606abd0396",null,"rc_28fe767c4be03ad7",null,null,"ru",null,1,null,null,1,0]]"><div _ngcontent-ng-c1961595714="" class="formatted-code-block-internal-container ng-tns-c1961595714-709"><div _ngcontent-ng-c1961595714="" class="animated-opacity ng-tns-c1961595714-709"><div _ngcontent-ng-c1961595714="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c1961595714-709 ng-star-inserted"><span class="ng-tns-c1961595714-709">Bash</span><div _ngcontent-ng-c1961595714="" class="buttons ng-tns-c1961595714-709 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
    pipx reinstall aider-chat
    
    ```
    
    <div _ngcontent-ng-c1961595714="" class="code-block ng-tns-c1961595714-709 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwijnevAgdyWAxUAAAAAHQAAAAAQjAc" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_7341ed3c7c76dc9c","c_ce28b2606abd0396",null,"rc_28fe767c4be03ad7",null,null,"ru",null,1,null,null,1,0]]"><div _ngcontent-ng-c1961595714="" class="formatted-code-block-internal-container ng-tns-c1961595714-709"><div _ngcontent-ng-c1961595714="" class="animated-opacity ng-tns-c1961595714-709"></div></div></div>

</div>### Настройки proxy.

Если вы находитесь в России, то большинство AI моделей не будет работать с вашим регионом, если к ним обращаться напрямую. Ниже описан рабочий вариант при открытом туннеле на внешний VPS для порта 1080, используются SOCKS. Как настроить туннель на внешний VPS описано [здесь](https://docs.consulting-plus.com/books/linux-windows/page/nastroika-vpn-cerez-tunnel-k-vps) и [здесь](https://docs.consulting-plus.com/books/linux-windows/page/nastroika-ssh-dlia-vps-windows-linux-wps).

- Запустите туннель в отдельном окне терминала WSL на порту 1080
- Настройте переменные окружения для работы с proxy: ```
    export ALL_PROXY=socks5h://127.0.0.1:[ваш порт SOCKS]
    export HTTP_PROXY=socks5h://127.0.0.1:[ваш порт SOCKS]
    export HTTPS_PROXY=socks5h://127.0.0.1:[ваш порт SOCKS]
    ```
    
    Если вы планируете постоянно использовать прокси, то можете прописать эти команды в файл ~/.bashrc

<div _ngcontent-ng-c3844624135="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--8" inline-copy-host=""></div><div _ngcontent-ng-c3844624135="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%AD%D1%82%D0%B8-%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D1%8F-%D0%BD%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4" inline-copy-host="">Эти действия необходимо выполнить перед запуском оболочки AIDER, чтобы она подхватила эти переменные. </div>### Настройка AI моделей.

<div _ngcontent-ng-c3844624135="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-aider-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82-%D1%81-3-%D0%BC" inline-copy-host="">Aider работает с 3 моделями:</div><div _ngcontent-ng-c3844624135="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-weak-model---%D1%81%D0%BB%D0%B0%D0%B1%D0%B0%D1%8F-" inline-copy-host="">- **weak-model** - слабая / вспомогательная модель, используется для экономии денег и токенов
- **editor-model** - модель-редактор) отвечает за непосредственное применение изменений к файлам вашего проекта
- **model** - главная модель выполняет «тяжелую» умственную работу: пишет код, строит архитектуру и анализирует сложные взаимосвязи.

</div>#### **weak-model**

<div _ngcontent-ng-c3844624135="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%92-aider-%D0%BA%D0%BE%D0%BD%D1%86%D0%B5%D0%BF%D1%86%D0%B8%D1%8F-we" inline-copy-host=""><div>В Aider концепция **`weak-model`** (слабая / вспомогательная модель) используется для экономии денег и токенов.</div>  
<div>Главная модель (`--model`) выполняет «тяжелую» умственную работу: пишет код, строит архитектуру и анализирует сложные взаимосвязи. `weak-model` берет на себя **рутинные служебные задачи**, которые не требуют высокой экспертизы или сложного Reasoning.</div>  
</div>##### Основные функции `weak-model`:

<div _ngcontent-ng-c3844624135="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B9-" inline-copy-host="">1. <div>**Генерация сообщений для Git-коммитов (Commit Messages)**</div>  
    
    - <div>Когда Aider вносит изменения в файлы, он автоматически создает commit в вашем Git-репозитории.</div>
    - <div>`weak-model` смотрит на `git diff` и формирует короткое понятное описание изменений (например: `feat: add FluentValidation for LoginRequest`).</div>
2. <div>**Сжатие и саммаризация истории чата (Chat Summarization)**</div>  
    
    - <div>Когда диалог становится слишком длинным и подбирается к лимиту контекста, Aider автоматически сжимает старые сообщения.</div>
    - <div>`weak-model` пересказывает старую часть переписки краткой выжимкой, чтобы освободить место для нового кода.</div>
3. <div>**Оценка и фильтрация Repo Map (Карты репозитория)**</div>  
    
    - <div>При сборке дерева файлов проекта `weak-model` помогает отсеивать нерелевантные куски кода, не перегружая контекст основной модели.</div>
4. <div>**Простые вспомогательные проверки**</div>  
    
    - <div>Форматирование служебных ответов и обработка системных вызовов CLI.</div>

</div>##### Почему важно правильно настроить `weak-model`?

<div _ngcontent-ng-c3844624135="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%AD%D0%BA%D0%BE%D0%BD%D0%BE%D0%BC%D0%B8%D1%8F-%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2%3A-%D0%95%D1%81" inline-copy-host="">- <div>**Экономия средств:** Если ваша главная модель — дорогая (например, Claude 3.5 Sonnet или GPT-4o), использование её же для написания строчки `git commit` — это пустая трата денег.</div>
- <div>**Скорость:** Легкие модели (вроде `gemini-2.0-flash`, `deepseek-chat` или `ox-alpha`) генерируют коммиты и сжимают контекст за доли секунды, не заставляя вас ждать.</div>

</div>#### **editor-model**

<div _ngcontent-ng-c3844624135="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--9" inline-copy-host="">  
</div><div _ngcontent-ng-c521702338="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%92-aider-%D0%BA%D0%BE%D0%BD%D1%86%D0%B5%D0%BF%D1%86%D0%B8%D1%8F-ed" inline-copy-host=""><div>В Aider концепция **`editor-model`** (модель-редактор) отвечает за **непосредственное применение изменений к файлам вашего проекта**.</div>  
<div>В то время как главная модель (`--model`) придумывает *что* и *как* изменить в коде, `editor-model` занимается **рутинной «хирургической» работой** — она берет предложенный код и аккуратно вставляет его в нужные места исходных файлов.</div>  
</div>##### Основные функции `editor-model`:

<div _ngcontent-ng-c521702338="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-diff%27" inline-copy-host="">1. <div>**Форматирование diff'ов и замена кода (Editing / Search-Replace)**</div>  
    
    - <div>Модель принимает инструкции от главной модели и переводит их в точный формат правок Aider (обычно блоки `<<<<<<< SEARCH` ... `=======` ... `>>>>>>> REPLACE`).</div>
    - <div>Она находит нужные строки в файле и перезаписывает их, сохраняя форматирование, отступы и структуру вокруг.</div>
2. <div>**Работа в режиме Architect (`/architect`)**</div>  
    
    - <div>Это главный сценарий, где выделение `editor-model` раскрывает себя на 100%.</div>
    - <div>В режиме Архитектора **Main model** (например, `deepseek-r1` или `claude-3-5-sonnet`) выступает в роли «мозга»: пишет план, проектирует архитектуру и описывает изменения на верхнем уровне.</div>
    - <div>Затем **Editor model** (более быстрая и дешевая модель) берет этот план и превращает его в реальные правки в файлах на диске.</div>
3. <div>**Исправление ошибок синтаксиса при записи**</div>  
    
    - <div>Если при применении изменений произошел сбой (например, не совпал фрагмент кода для поиска), `editor-model` пытается скорректировать замену, чтобы не сломать файл.</div>

</div>##### Зачем разделять Main Model и Editor Model?

<div _ngcontent-ng-c521702338="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%AD%D0%BA%D0%BE%D0%BD%D0%BE%D0%BC%D0%B8%D1%8F-%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%BE%D0%B2-%D0%B8-" inline-copy-host="">- <div>**Экономия ресурсов и денег:** Вы можете использовать супер-интеллектуальную (и дорогую) модель для рассуждений как Main Model, а для утилитарной задачи «найти строку X и заменить на Y» назначить гораздо более дешевую или бесплатную модель.</div>
- <div>**Повышение надежности:** Не все «рассуждающие» модели (Reasoning Models, такие как `deepseek-r1`) хорошо умеют строго следовать синтаксису блоков замены файлов Aider. Назначение отдельной `editor-model` (например, `deepseek-chat` или `gemini-2.0-flash`) гарантирует, что файлы будут отредактированы без синтаксических сбоев.</div>

</div>#### **model**

<div _ngcontent-ng-c521702338="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C-%28mai" inline-copy-host=""><div>**Основная модель (Main Model / `--model`)** — это главный «мозг» Aider. Она отвечает за весь высокий интеллект, понимание логики проекта и принятие архитектурных решений.</div>  
<div>Все ваши запросы, вопросы по коду и задачи по рефакторингу в первую очередь поступают именно в неё.</div>  
</div>##### Основные функции основной модели:

<div _ngcontent-ng-c521702338="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%B8%D0%B9-%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7-%D0%B8-%D0%BF%D0%BE" inline-copy-host="">1. <div>**Глубокий анализ и понимание кода**</div>  
    
    - <div>Разбирает структуру репозитория через карту `Repo Map` и контекст добавленных файлов.</div>
    - <div>Находит взаимосвязи между классами, методами, контроллерами и базой данных.</div>
    - <div>Диагностирует баги, утечки памяти, проблемы с производительностью и уязвимости.</div>
2. <div>**Проектирование и планирование (Reasoning &amp; Architecture)**</div>  
    
    - <div>Составляет пошаговые планы рефакторинга и внедрения новых фич.</div>
    - <div>Принимает решения, какие именно файлы нужно изменить и какую архитектуру (SOLID, Clean Architecture и т.д.) использовать.</div>
3. <div>**Генерация нового кода и алгоритмов**</div>  
    
    - <div>Пишет сложную бизнес-логику, запросы к БД, обработчики ошибок и тесты.</div>
4. <div>**Управление другими моделями (в режиме `/architect`)**</div>  
    
    - <div>Выступает в роли Senior-разработчика: формирует детальную инструкцию по правке файлов и передаёт её модели-редактору (`editor-model`) для физического применения.</div>

</div>##### Сводная матрица всех трех ролей в Aider

<div _ngcontent-ng-c521702338="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%A7%D1%82%D0%BE%D0%B1%D1%8B-%D0%BE%D0%BA%D0%BE%D0%BD%D1%87%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE-%D1%81" inline-copy-host=""><div>Чтобы окончательно свести картину воедино:</div><table data-path-to-node="8"><thead><tr><td>**Роль**</td><td>**Главная задача**</td><td>**Важные качества**</td><td>**Пример модели**</td></tr></thead><tbody><tr><td><span data-path-to-node="8,1,0,0">**Main Model** (`--model`)</span></td><td><span data-path-to-node="8,1,1,0">Придумывает *что* и *как* делать, проектирует код.</span></td><td><span data-path-to-node="8,1,2,0">Максимальный интеллект, логика (Reasoning), понимание контекста.</span></td><td><span data-path-to-node="8,1,3,0">`deepseek-chat` (V3), `deepseek-r1`, `claude-3-5-sonnet`, `gemini-2.0-flash`</span></td></tr><tr><td><span data-path-to-node="8,2,0,0">**Editor Model** (`--editor-model`)</span></td><td><span data-path-to-node="8,2,1,0">Вставляет придуманный код в конкретные строки файлов.</span></td><td><span data-path-to-node="8,2,2,0">Строгое следование формату `SEARCH/REPLACE`, точность.</span></td><td><span data-path-to-node="8,2,3,0">`deepseek-chat`, `gemini-2.0-flash`</span></td></tr><tr><td><span data-path-to-node="8,3,0,0">**Weak Model** (`--weak-model`)</span></td><td><span data-path-to-node="8,3,1,0">Пишет `git commit`, сжимает историю чата, фильтрует карту.</span></td><td><span data-path-to-node="8,3,2,0">Высокая скорость, минимальная стоимость / бесплатность.</span></td><td><span data-path-to-node="8,3,3,0">`gemini-2.0-flash-exp:free`, `ox-alpha`</span></td></tr></tbody></table>

</div><p class="callout warning">Приведенные в таблице названия моделей могут быть неактуальны, лучше вам подобрать их самостоятельно, разобравшись со стоимостью.</p>

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

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

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

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

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

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

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

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

```bash
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

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

<p class="callout warning">Не забывайте для указания команды сначала вводить слэш. Если вы забудете это сделать, то текущая модель, получив эту команду, начнет фантазировать, что ей делать в соответствии с предыдущей историей сообщений в сессии и вы гарантированно просто потратите деньги и время на вывод чуши, которую она придумает.</p>

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

- команда **/ask**
- команда **/editor-model none**

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

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

<div _ngcontent-ng-c521702338="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%A0%D0%B0%D0%B7%D0%BB%D0%B8%D1%87%D0%B8%D0%B5-%D0%BC%D0%B5%D0%B6%D0%B4%D1%83-%D1%82%D1%80%D0%B5%D0%BC%D1%8F" inline-copy-host=""><div>Различие между тремя режимами заключается в **степени предоставленных прав на изменение файлов**, **формате ответа модели** и **распределении ролей (Main/Editor model)**.</div>  
</div>##### Сравнительная таблица

<div _ngcontent-ng-c521702338="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%A5%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0-%2Fask-" inline-copy-host=""><table data-path-to-node="3"><thead><tr><td>**Характеристика**</td><td>**/ask (Запрос / Консультация)**</td><td>**/architect (Архитектор)**</td><td>**/code (Редактирование)**</td></tr></thead><tbody><tr><td><span data-path-to-node="3,1,0,0">**Редактирование файлов**</span></td><td><span data-path-to-node="3,1,1,0">❌ **Строго запрещено**</span></td><td><span data-path-to-node="3,1,2,0">✅ Запрашивает подтверждение перед записью</span></td><td><span data-path-to-node="3,1,3,0">✅ **Автоматически** при согласии</span></td></tr><tr><td><span data-path-to-node="3,2,0,0">**Режим работы**</span></td><td><span data-path-to-node="3,2,1,0">Текстовый диалог (Read-only)</span></td><td><span data-path-to-node="3,2,2,0">Двухэтапный (План <span class="math-inline" data-index-in-node="18" data-math="\rightarrow">$\\rightarrow$</span> Правки)</span></td><td><span data-path-to-node="3,2,3,0">Прямой (Код <span class="math-inline" data-index-in-node="12" data-math="\rightarrow">$\\rightarrow$</span> Файлы)</span></td></tr><tr><td><span data-path-to-node="3,3,0,0">**Используемые модели**</span></td><td><span data-path-to-node="3,3,1,0">Только Main Model</span></td><td><span data-path-to-node="3,3,2,0">Main Model + Editor Model</span></td><td><span data-path-to-node="3,3,3,0">Main Model</span></td></tr><tr><td><span data-path-to-node="3,4,0,0">**Идеально для...**</span></td><td><span data-path-to-node="3,4,1,0">Аудита, поиска багов, вопросов по коду</span></td><td><span data-path-to-node="3,4,2,0">Сложного рефакторинга, архитектурных фич</span></td><td><span data-path-to-node="3,4,3,0">Точечных правок, быстрых багфиксов</span></td></tr></tbody></table>

</div>##### 1. Режим `/ask` (Только чтение / Консультация)

<div _ngcontent-ng-c521702338="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%92-%D1%8D%D1%82%D0%BE%D0%BC-%D1%80%D0%B5%D0%B6%D0%B8%D0%BC%D0%B5-aider-" inline-copy-host=""><div>В этом режиме Aider **физически отключает механизмы записи в файлы**. Модель видит ваш проект через карту репозитория `Repo Map` и добавленные файлы, но не генерирует инструкции редактирования (`SEARCH/REPLACE`).</div>  
- <div>**Что делает:** Отвечает на вопросы, объясняет логику работы кода, проводит статический аудит и поиск ошибок.</div>
- <div>**Главный плюс:** Абсолютная безопасность. Вы гарантированы от того, что модель случайно изменит или испортит код.</div>
- <div>**Пример использования:**</div>  
    <div _ngcontent-ng-c3845250377="" class="code-block ng-tns-c3845250377-158 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiJto6l2dyWAxUAAAAAHQAAAAAQ5AE" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl80NWFlMWNhNTIxNWY4ZjRkIiwiY19jZTI4YjI2MDZhYmQwMzk2IixudWxsLCJyY180ZTExODc3NmRjMWNjMjE0IixudWxsLG51bGwsInJ1IixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c3845250377="" class="formatted-code-block-internal-container ng-tns-c3845250377-158"><div _ngcontent-ng-c3845250377="" class="animated-opacity ng-tns-c3845250377-158"><div _ngcontent-ng-c3845250377="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c3845250377-158 ng-star-inserted"><span class="ng-tns-c3845250377-158">Plaintext</span><div _ngcontent-ng-c3845250377="" class="buttons ng-tns-c3845250377-158 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
    /ask Как устроена авторизация в этом проекте и где слабые места в защите?
    
    ```
    
    <div _ngcontent-ng-c3845250377="" class="code-block ng-tns-c3845250377-158 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiJto6l2dyWAxUAAAAAHQAAAAAQ5AE" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl80NWFlMWNhNTIxNWY4ZjRkIiwiY19jZTI4YjI2MDZhYmQwMzk2IixudWxsLCJyY180ZTExODc3NmRjMWNjMjE0IixudWxsLG51bGwsInJ1IixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c3845250377="" class="formatted-code-block-internal-container ng-tns-c3845250377-158"><div _ngcontent-ng-c3845250377="" class="animated-opacity ng-tns-c3845250377-158"></div></div></div>

</div>##### 2. Режим `/architect` (Проектирование + Применение)

<div _ngcontent-ng-c521702338="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%A0%D0%B5%D0%B6%D0%B8%D0%BC-%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B5%D1%82-%D0%BF%D1%80%D0%BE%D1%86" inline-copy-host=""><div>Режим разделяет процесс написания кода на **два независимых этапа** и подключает две разные модели:</div>  
1. <div>**Этап 1 (Планирование):** Основная модель (`--model`, например, *DeepSeek-R1* или *Claude 3.5 Sonnet*) анализирует задачу, проводит глубокие рассуждения и пишет подробный текстовый план решения.</div>
2. <div>**Этап 2 (Реализация):** Модель-редактор (`--editor-model`, например, *DeepSeek-Chat*) берет предложенный план и переводит его в точечные блоки правок кода.</div>
3. <div>**Подтверждение:** Aider показывает вам предложенный план и спрашивает: *"Применить эти изменения в файлы?"*</div>

- <div>**Главный плюс:** Высокое качество кода при сложных задачах. Умная модель не отвлекается на синтаксис файлов, а модель-редактор гарантирует точное нанесение правок.</div>
- <div>**Пример использования:**</div>  
    <div _ngcontent-ng-c3845250377="" class="code-block ng-tns-c3845250377-159 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiJto6l2dyWAxUAAAAAHQAAAAAQ5QE" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl80NWFlMWNhNTIxNWY4ZjRkIiwiY19jZTI4YjI2MDZhYmQwMzk2IixudWxsLCJyY180ZTExODc3NmRjMWNjMjE0IixudWxsLG51bGwsInJ1IixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c3845250377="" class="formatted-code-block-internal-container ng-tns-c3845250377-159"><div _ngcontent-ng-c3845250377="" class="animated-opacity ng-tns-c3845250377-159"><div _ngcontent-ng-c3845250377="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c3845250377-159 ng-star-inserted"><span class="ng-tns-c3845250377-159">Plaintext</span><div _ngcontent-ng-c3845250377="" class="buttons ng-tns-c3845250377-159 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
    /architect Переведи авторизацию с JWT-токенов в localStorage на httpOnly Cookie с защитой от CSRF.
    
    ```
    
    <div _ngcontent-ng-c3845250377="" class="code-block ng-tns-c3845250377-159 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiJto6l2dyWAxUAAAAAHQAAAAAQ5QE" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl80NWFlMWNhNTIxNWY4ZjRkIiwiY19jZTI4YjI2MDZhYmQwMzk2IixudWxsLCJyY180ZTExODc3NmRjMWNjMjE0IixudWxsLG51bGwsInJ1IixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c3845250377="" class="formatted-code-block-internal-container ng-tns-c3845250377-159"><div _ngcontent-ng-c3845250377="" class="animated-opacity ng-tns-c3845250377-159"></div></div></div>

</div>##### 3. Режим `/code` (Стандартный / Прямое редактирование)

<div _ngcontent-ng-c521702338="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%BE%D0%B9-%D1%80%D0%B0%D0%B1%D0%BE%D1%87%D0%B8%D0%B9-%D1%80%D0%B5%D0%B6" inline-copy-host=""><div>Основной рабочий режим Aider по умолчанию.</div>  
- <div>**Что делает:** Основная модель сразу пытается сгенерировать готовые блоки кода (`SEARCH/REPLACE`) и записать их в файлы.</div>
- <div>**Главный плюс:** Максимальная скорость при простых и понятных задачах.</div>
- <div>**Пример использования:**</div>  
    <div _ngcontent-ng-c3845250377="" class="code-block ng-tns-c3845250377-160 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiJto6l2dyWAxUAAAAAHQAAAAAQ5gE" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl80NWFlMWNhNTIxNWY4ZjRkIiwiY19jZTI4YjI2MDZhYmQwMzk2IixudWxsLCJyY180ZTExODc3NmRjMWNjMjE0IixudWxsLG51bGwsInJ1IixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c3845250377="" class="formatted-code-block-internal-container ng-tns-c3845250377-160"><div _ngcontent-ng-c3845250377="" class="animated-opacity ng-tns-c3845250377-160"><div _ngcontent-ng-c3845250377="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c3845250377-160 ng-star-inserted"><span class="ng-tns-c3845250377-160">Plaintext</span><div _ngcontent-ng-c3845250377="" class="buttons ng-tns-c3845250377-160 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
    /code Добавь проверку на null в контроллере LoginRequest и верни BadRequest 400.
    
    ```
    
    <div _ngcontent-ng-c3845250377="" class="code-block ng-tns-c3845250377-160 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiJto6l2dyWAxUAAAAAHQAAAAAQ5gE" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl80NWFlMWNhNTIxNWY4ZjRkIiwiY19jZTI4YjI2MDZhYmQwMzk2IixudWxsLCJyY180ZTExODc3NmRjMWNjMjE0IixudWxsLG51bGwsInJ1IixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c3845250377="" class="formatted-code-block-internal-container ng-tns-c3845250377-160"><div _ngcontent-ng-c3845250377="" class="animated-opacity ng-tns-c3845250377-160"></div></div></div>

</div>##### Рекомендуемый workflow при работе с проектом

<div _ngcontent-ng-c521702338="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%3A-%D0%97%D0%B0%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D0%B5-%2Fa" inline-copy-host="">1. <div>**Анализ:** Запустите `/ask` для безопасного аудита и составления списка проблем.</div>
2. <div>**Проектирование:** Переключитесь в `/architect` для реализации сложных архитектурных изменений.</div>
3. <div>**Исправления:** Используйте `/code` для быстрых точечных правок и написания валидаторов/тестов.</div>

</div>### Общие сведения о командах aider

<div _ngcontent-ng-c521702338="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%92%D1%81%D0%B5-%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD" inline-copy-host=""><div>Все встроенные команды Aider начинаются с символа `/`. Их можно разделить на четыре группы по уровню критичности для повседневной работы.</div>  
</div>#### 1. Управление файлами и контекстом *(Самый высокий приоритет)*

<div _ngcontent-ng-c521702338="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%93%D0%BB%D0%B0%D0%B2%D0%BD%D1%8B%D0%B9-%D0%BD%D0%B0%D0%B2%D1%8B%D0%BA-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B" inline-copy-host=""><div>Главный навык работы с Aider — точечное управление контекстом. Не перегружайте модель лишними файлами.</div>  
- <div>**`/add <files>`** — добавляет файлы в контекст. Модель видит их содержимое целиком. Работает по автодополнению (`Tab`) и маскам (`/add src/*.cs`).</div>
- <div>**`/drop <files>`** — удаляет конкретный файл из контекста. Без параметров (`/drop`) очищает весь список файлов.</div>
- <div>**`/ls`** — выводит список всех файлов, которые находятся в контексте прямо сейчас.</div>

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

<div _ngcontent-ng-c521702338="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%8F%D1%8E%D1%82%2C-%D0%BA%D0%B0%D0%BA-%D0%B8%D0%BC%D0%B5%D0%BD" inline-copy-host=""><div>Определяют, как именно модель будет реагировать на ваши промпты.</div>  
- <div>**`/code`** — стандартный режим прямого редактирования. Модель сразу создает правки в виде блоков `SEARCH/REPLACE` и записывает их в файлы.</div>
- <div>**`/architect`** — двухэтапный режим. Модель сначала пишет подробный текстовый план решения, а затем переводит его в код. Идеально для сложного рефакторинга.</div>
- <div>**`/ask`** — режим консультации и аудита (Read-Only). Запрещает модели изменять файлы. Безопасен для анализа базы кода.</div>

</div>#### 3. Контроль изменений и история *(Управление сессией)*

<div _ngcontent-ng-c521702338="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9F%D0%BE%D0%B7%D0%B2%D0%BE%D0%BB%D1%8F%D1%8E%D1%82-%D0%B8%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D1%8F%D1%82%D1%8C" inline-copy-host=""><div>Позволяют исправлять ошибки модели и следить за состоянием Git.</div>  
- <div>**`/undo`** — отменяет последний коммит и все изменения файлов, сделанные Aider за предыдущий шаг.</div>
- <div>**`/diff`** — показывает разницу между текущим состоянием файлов и последним коммитом Git.</div>
- <div>**`/clear`** — очищает историю текстового диалога, сохраняя при этом добавленные файлы в контексте. Помогает, когда чат переполняется.</div>

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

<div _ngcontent-ng-c521702338="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-llm-%D0%BF%D1%80%D0%BE%D0%B2%D0%B0" inline-copy-host=""><div>Управление LLM-провайдерами и терминалом без выхода из Aider.</div>  
- <div>**`/model <name>`** — меняет основную модель (например, `/model openrouter/deepseek/deepseek-chat`).</div>
- **`/editor-model <name>`** — меняет модель для редактирования и внесения правок в файлы
- <div>**`/weak-model <name>`** — назначает легкую модель для служебных задач (генерация коммитов, сжатие контекста).</div>
- <div>**`/run <command>`** (или **`!<command>`**) — выполняет bash-команду в системе прямо из чата (например, `/run dotnet build` или `/run npm test`).</div>
- <div>**`/exit`** — завершает работу Aider.</div>

</div>### Полезная информация.

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

<div _ngcontent-ng-c3622667873="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color tutor-markdown-rendering" dir="ltr" id="bkmrk-%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0-%D1%81-%D0%BF%D0%BE%D1%82%D0%B5%D1%80%D0%B5%D0%B9-%D0%B8" inline-copy-host=""><div>Проблема с потерей истории в терминале VS Code при использовании **Aider** — классическая ситуация. Обычно она связана с тем, что встроенный терминал VS Code имеет ограниченный размер буфера прокрутки (scrollback buffer) или сбрасывает состояние при перезапуске сессии, в то время как Aider выводит много текста ( diff-ы, логов, ответы моделей).</div></div><div _ngcontent-ng-c3622667873="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color tutor-markdown-rendering" dir="ltr" id="bkmrk--11" inline-copy-host=""></div><div _ngcontent-ng-c3622667873="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color tutor-markdown-rendering" dir="ltr" id="bkmrk-%D0%92%D0%BE%D1%82-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5-%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D1%8B" inline-copy-host="">Вот основные способы решить эту проблему и сделать работу с историей комфортной:</div>##### 1. Увеличить размер буфера терминала в VS Code

<div _ngcontent-ng-c3622667873="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color tutor-markdown-rendering" dir="ltr" id="bkmrk-%D0%9F%D0%BE-%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E-vs-code" inline-copy-host=""><div>По умолчанию VS Code сохраняет в истории терминала ограниченное число строк. Если вывод Aider превышает этот лимит, старые сообщения «улетают» вверх и стираются.</div>  
1. <div>Откройте настройки VS Code (`Ctrl + ,` на Windows/Linux или `Cmd + ,` на macOS).</div>
2. <div>В поисковой строке введите: `terminal.integrated.scrollback`.</div>
3. <div>Увеличьте значение (по умолчанию обычно стоит 1000 или 10000). Установите, например, **`50000`** или **`100000` строк**.</div>

</div>##### 2. Использовать встроенную историю самого Aider

<div _ngcontent-ng-c3622667873="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color tutor-markdown-rendering" dir="ltr" id="bkmrk-%D0%A1%D0%B0%D0%BC%D0%B0-%D1%83%D1%82%D0%B8%D0%BB%D0%B8%D1%82%D0%B0-aider-%D1%81" inline-copy-host=""><div>Сама утилита Aider сохраняет **всю историю чатов** независимо от того, что происходит с окном терминала. Вы можете в любой момент вернуться к прошлым диалогам:</div>  
- <div>**Файлы истории:** Aider по умолчанию сохраняет логи сессий в скрытой папке `.aider.chat.history.md` (в корне вашего проекта или в домашней директории). Вы можете открыть этот файл и посмотреть весь текст прошлых сессий.</div>
- <div>**Перезапуск с историей:** При повторном запуске Aider подхватывает контекст из git-репозитория и файлов, но если нужно восстановить именно диалог, можно использовать флаги запуска или посмотреть упомянутый выше файл логов.</div>

</div>##### 3. Запускать Aider во внешнем терминале (или tmux)

<div _ngcontent-ng-c3622667873="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color tutor-markdown-rendering" dir="ltr" id="bkmrk-%D0%95%D1%81%D0%BB%D0%B8-%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D1%82%D0%B5%D1%80%D0%BC" inline-copy-host=""><div>Если встроенный терминал VS Code продолжает сбоить или сбрасывать сессию при переключении вкладок:</div>  
- <div>Попробуйте запускать Aider в **отдельном окне терминала** (например, в системном PowerShell / Windows Terminal на Windows или во внешнем терминале на Linux/macOS). У внешних терминалов буфер прокрутки часто работает стабильнее.</div>
- <div>Если вы работаете в **WSL Ubuntu**, отлично помогает связка с **`tmux`**. Запустив сессию `tmux` внутри WSL перед вызовом Aider, вы гарантируете, что история сохранится даже при случайном закрытии вкладки или обрыве связи с терминалом.</div>

</div>##### 4. Использовать режим `/clear` или `/undo`

<div _ngcontent-ng-c3622667873="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color tutor-markdown-rendering" dir="ltr" id="bkmrk-%D0%98%D0%BD%D0%BE%D0%B3%D0%B4%D0%B0-%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F-%D0%B2-%D1%81%D0%B0%D0%BC" inline-copy-host=""><div>Иногда история в самом Aider «засоряется» старым контекстом, из-за чего модель начинает путаться.</div>  
- <div>Вместо бесконечной прокрутки вниз используйте команды внутри Aider:</div>  
    
    - <div>`/undo` — отменить последние изменения в коде и в диалоге.</div>
    - <div>`/clear` — очистит текущий контекст чата (при этом файлы на диске останутся измененными), начав чистый лист, но сохранив историю в файл логов.</div>

</div><div _ngcontent-ng-c521702338="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--12" inline-copy-host=""></div>

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

<p class="callout danger">Проблема: забился системный диск, далее у меня диск C:. Чистка кэшей браузеров и использование системной утилиты результатов не дало. Пришлось прибегнуть к развернутому анализу.</p>

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

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

### <span style="color: rgb(224, 62, 45);">Вопрос: что находится в файле $MFT (трогать его не надо)?</span>

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%A4%D0%B0%D0%B9%D0%BB-%24mft-%28master-fi" inline-copy-host=""><div><span class="citation-77">Файл </span>**`<span class="citation-77">$MFT</span>`**<span class="citation-77"> (Master File Table) — это не обычный файл с документами или программами, а </span>**<span class="citation-77">главная служебная база данных файловой системы NTFS</span>**<span class="citation-77 citation-end-77">, которая хранит информацию абсолютно обо всех файлах и папках на диске.<sup class="superscript" data-turn-source-index="1"></sup></span> </div>  
<div><span class="citation-76">Сам по себе </span>`<span class="citation-76">$MFT</span>`<span class="citation-76 citation-end-76"> тоже физически оформлен как файл, который лежит в начале каждого диска NTFS.<sup class="superscript" data-turn-source-index="2"></sup></span> </div>  
</div>#### <span class="citation-75">Что именно записано внутри </span>`<span class="citation-75">$MFT</span>`<span class="citation-75 citation-end-75">?<sup class="superscript" data-turn-source-index="3"></sup></span> 

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9A%D0%B0%D0%B6%D0%B4%D0%BE%D0%BC%D1%83-%D1%84%D0%B0%D0%B9%D0%BB%D1%83-%D0%B8-%D0%BF%D0%B0%D0%BF%D0%BA" inline-copy-host=""><div>Каждому файлу и папке на диске (включая скрытые и системные) выделяется отдельная запись в этой таблице размером обычно 1 КБ. Внутри этой записи хранится вся метаинформация:</div>  
1. <div>**Атрибуты файла:** Полное имя файла, путь к нему и родительский каталог.</div>
2. <div>**<span class="citation-74 citation-end-74">Временные метки (Timestamps):<sup class="superscript" data-turn-source-index="4"></sup></span>** Точное время создания, последнего изменения, доступа и модификации файла (поэтому этот файл так любят программы для цифровой криминалистики). </div>
3. <div>**<span class="citation-73 citation-end-73">Права доступа (Security Descriptors):<sup class="superscript" data-turn-source-index="5"></sup></span>** Информация о том, какому пользователю или группе разрешено открывать или менять этот файл. </div>
4. <div>**Физическое расположение (Указатели/Pointers):**</div>  
    
    - <div>Если файл **очень маленький** (например, текстовый файл на пару строчек), то его содержимое может поместиться **прямо внутри** самой записи `$MFT`.</div>
    - <div>Если файл **большой**, `$MFT` хранит карту секторов (кластеров) диска, где физически разбросаны кусочки этого файла.</div>

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

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9E%D0%B1%D1%8B%D1%87%D0%BD%D1%8B%D0%B5-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B-%D0%BF%D1%80" inline-copy-host=""><div>Обычные программы при сканировании диска поочередно заходят в каждую папку, запрашивают у Windows список файлов, переходят дальше и т.д. Это долго.</div>  
<div>Утилиты вроде **WizTree** поступают хитрее: они напрямую считывают весь файл `$MFT` целиком. <span class="citation-72">Поскольку </span>`<span class="citation-72">$MFT</span>`<span class="citation-72"> — это уже готовая, структурированная таблица, где собраны размеры и имена </span>*<span class="citation-72">всех</span>*<span class="citation-72 citation-end-72"> файлов на диске, программа мгновенно «видит» всю структуру за пару секунд и сразу понимает, какие папки занимают больше всего места.</span></div></div><div id="bkmrk-"></div>### <span class="citation-72 citation-end-72">Вопрос: файл $MFT заполнен на 25%, можно ли его сжать (я не сжимал, оставил как есть)?</span>

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9D%D0%B5%D1%82%2C-%D1%88%D1%82%D0%B0%D1%82%D0%BD%D0%BE-%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%B0" inline-copy-host=""><div>**<span class="citation-83">Нет, штатно средствами Windows уменьшить (сжать) физический размер файла </span>`<span class="citation-83">$MFT</span>`<span class="citation-83 citation-end-83"> на работающем диске нельзя.<sup class="superscript" data-turn-source-index="1"></sup></span>** </div>  
</div>#### Почему так происходит?

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-ntfs%3A-%D0%9A%D0%BE" inline-copy-host="">1. <div>**<span class="citation-82 citation-end-82">Архитектура NTFS:<sup class="superscript" data-turn-source-index="2"></sup></span>** Когда файловая система Windows создает новые файлы, `$MFT` автоматически расширяется под их количество. Однако когда вы удаляете файлы, их записи в таблице помечаются как «пустые» и могут использоваться заново, но **физически выделенное под `$MFT` дисковое пространство назад не возвращается** и размер файла не уменьшается. </div>
2. <div>**Ограничения ОС:** Windows не умеет «усекать» (shrink) занятые зоны `$MFT` "на лету", так как этот файл критически важен для работы всей файловой системы и закреплен за определенными областями диска.</div>

</div>#### <span class="citation-81 citation-end-81">Что можно сделать?<sup class="superscript" data-turn-source-index="3"></sup></span> 

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%A1%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D0%B5%D0%B5-%D0%9F%D0%9E%3A-%D0%A1%D1%83%D1%89%D0%B5%D1%81%D1%82" inline-copy-host="">- <div>**Стороннее ПО:** Существуют специализированные утилиты для работы с разметкой дисков (например, *Paragon Hard Disk Manager*), в которых есть функции оптимизации и дефрагментации/сжатия `$MFT`. Они умеют переносить служебные записи и усекать пустые хвосты.</div>
- <div>**Радикальный способ:** Полное уменьшение физического размера `$MFT` без сторонних рискованных утилит достигается только одним путем — полным форматированием раздела или переустановкой системы, после чего размер таблицы сбросится до минимального начального значения.</div>

<div>*Примечание:* Если `$MFT` заполнен всего на 25%, это абсолютно нормальное рабочее состояние (система держит большой запас на будущее, чтобы избежать сильной фрагментации таблицы при создании новых файлов). Сами по себе эти «пустые» 75% внутри `$MFT` не блокируют свободное место на диске критическим образом, если у вас не стоит задача высвободить каждый мегабайт под сжатие самого раздела.</div></div>### Вопрос: в папке с MS SQLServer есть папка PYTHON\_SERVICES\_20f02472-8f99-49e8-b8c0-5059b8cf545b большого размера, что это такое?

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9F%D0%B0%D0%BF%D0%BA%D0%B0-python_service" inline-copy-host=""><div>Папка `PYTHON_SERVICES_<уникальный_id>` связана с компонентом **SQL Server Machine Learning Services**.</div>  
</div>#### Что это такое?

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%AD%D1%82%D0%BE%D1%82-%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%B5%D1%82" inline-copy-host=""><div>Этот каталог создается службой расширения SQL Server (Launchpad). Когда в базе данных запускаются скрипты на Python (например, через процедуру `sp_execute_external_script`), SQL Server изолирует выполнение кода и автоматически создает временные рабочие директории для каждого сеанса или задачи.</div>  
</div>#### Почему папка стала большого размера?

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%97%D0%B0%D0%B2%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D0%B5%D0%B0%D0%BD%D1%81%D0%BE%D0%B2-%D0%B8%D0%BB" inline-copy-host="">1. <div>**Зависание сеансов или утечка данных:** <span class="citation-85 citation-end-85">Иногда при выполнении тяжелых скриптов (обработка больших датафреймов через Pandas/NumPy, сохранение моделей машинного обучения или кэширование) временные файлы не удаляются автоматически после завершения скрипта.<sup class="superscript" data-turn-source-index="1"></sup></span> </div>
2. <div>**Накопление мусора:** Со временем в таких папках могут оставаться временные файлы сессий, лог-файлы или кэш пакетного менеджера, если скрипты выполнялись часто.</div>

</div>#### Что с этим делать?

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%91%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%B0%D1%8F-%D0%BE%D1%87%D0%B8%D1%81%D1%82%D0%BA%D0%B0%3A-" inline-copy-host="">1. <div>**Безопасная очистка:** Сначала убедитесь, что в данный момент не выполняются активные расчеты или хранимые процедуры с использованием Python.</div>
2. <div>**Перезапуск службы:** Перезапустите службу **SQL Server Launchpad** (через оснастку `services.msc`), чтобы она сбросила текущие активные процессы.</div>
3. <div>**Удаление:** Если служба остановлена и файлы не заблокированы системой, содержимое старых неактивных папок с длинными GUID-номерами можно удалить вручную для освобождения места на диске.</div>

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

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%A1%D0%BB%D1%83%D0%B6%D0%B1%D0%B0-sql-server-la" inline-copy-host=""><div>Служба **SQL Server Launchpad** (её системное имя в Windows — `MSSQLLaunchpad`) — это специальный менеджер изоляции и запуска внешних скриптов.</div>  
<div>Она появилась в SQL Server вместе с компонентом *Machine Learning Services* и выполняет следующие задачи:</div>  
</div>#### 1. Безопасный запуск внешнего кода

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0-%D0%B2%D1%8B-%D0%BF%D0%B8%D1%88%D0%B5%D1%82%D0%B5-%D1%85%D1%80%D0%B0%D0%BD" inline-copy-host=""><div>Когда вы пишете хранимую процедуру в базе данных с использованием языков **Python** или **R**, SQL Server сам по себе не умеет их выполнять. Вместо этого он обращается к службе Launchpad, а та берет на себя всю работу по запуску интерпретатора.</div>  
</div>#### 2. Изоляция процессов (Песочница)

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%A7%D1%82%D0%BE%D0%B1%D1%8B-%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D0%B8%D0%B9-%D0%BA%D0%BE%D0%B4-" inline-copy-host=""><div>Чтобы сторонний код на Python или R не мог «уронить» сам сервер баз данных или получить несанкционированный доступ к файловой системе, Launchpad создает для каждого выполнения изолированные рабочие процессы (отдельные учетные записи-изоляторы и те самые временные папки с длинными ID).</div>  
</div>#### 3. Контроль ресурсов

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%A1%D0%BB%D1%83%D0%B6%D0%B1%D0%B0-%D1%81%D0%BB%D0%B5%D0%B4%D0%B8%D1%82-%D0%B7%D0%B0-%D1%82%D0%B5%D0%BC" inline-copy-host=""><div>Служба следит за тем, сколько памяти и процессорного времени потребляют скрипты машинного обучения, чтобы они не исчерпали все ресурсы, предназначенные для самого SQL Server.</div>  
</div>#### Нужно ли она вам?

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%95%D1%81%D0%BB%D0%B8-%D0%B2%D1%8B-%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE-%D0%B8%D1%81%D0%BF%D0%BE" inline-copy-host="">- <div>**Если вы активно используете Machine Learning Services** в базах данных (например, запускаете сложные математические модели, анализ данных или нейросети прямо внутри SQL): служба **нужна**, отключать её нельзя.</div>
- <div>**Если вы не используете Python или R** в SQL Server, но эта служба установлена и работает (или даже запускается автоматически при старте Windows), она просто тратит оперативную память. Её можно перевести в **«Ручной» (Manual)** режим запуска в диспетчере служб (`services.msc`), чтобы она не запускалась зря и не плодила временные файлы.</div>

</div>### Вопрос: в папке PYTHON\_SERVICES\_20f02472-8f99-49e8-b8c0-5059b8cf545b большую часть места занимают библиотеки, можно как-то отказаться от этой службы?

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%94%D0%B0%2C-%D0%BE%D1%82-%D1%8D%D1%82%D0%BE%D0%B9-%D1%81%D0%BB%D1%83%D0%B6%D0%B1%D1%8B-%D0%BC" inline-copy-host=""><div>**Да, от этой службы можно полностью отказаться**, если вы не используете Python или R внутри баз данных MS SQL.</div>  
<div>Поскольку стандартные библиотеки Python (особенно для машинного обучения, такие как NumPy, Pandas, Scikit-learn и т.д.) весят несколько гигабайт, отключение этой службы и удаление компонента поможет существенно разгрузить диск C:.</div>  
</div>#### Как полностью отключить и удалить этот компонент:

##### 1. Остановка и отключение службы

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%A1%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B0-%D0%BE%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D0%B5-%D1%81" inline-copy-host=""><div>Сначала остановите службу, чтобы она перестала занимать файлы и ресурсы:</div>  
1. <div>Нажмите комбинацию клавиш **`Win + R`**, введите **`services.msc`** и нажмите `Enter`.</div>
2. <div>Найдите в списке службу **`SQL Server Launchpad (MSSQLLaunchpad)`** (она может содержать имя вашего экземпляра SQL Server, например, `MSSQLLaunchpad$SQLEXPRESS`).</div>
3. <div>Нажмите по ней правой кнопкой мыши -&gt; **«Остановить»** (Stop).</div>
4. <div>Затем зайдите в её **«Свойства»** и измените «Тип запуска» с Автоматически на **«Отключено»** (Disabled).</div>

</div>##### 2. Удаление компонента через установщик MS SQL

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%A7%D1%82%D0%BE%D0%B1%D1%8B-%D0%BF%D0%B0%D0%BF%D0%BA%D0%B8-%D0%B8-%D1%82%D1%8F%D0%B6%D0%B5%D0%BB%D1%8B" inline-copy-host=""><div>Чтобы папки и тяжелые библиотеки больше не создавались при обновлениях, лучше официально удалить Machine Learning Services через официальный деинсталлятор:</div>  
1. <div>Откройте **Панель управления** -&gt; **Установка и удаление программ** (или «Установленные приложения» в Windows 10/11).</div>
2. <div>Найдите в списке **Microsoft SQL Server (версия)** и нажмите **«Изменить / Удалить»** (Uninstall/Change).</div>
3. <div>В появившемся окне мастера установки выберите пункт **«Удалить»** (Remove).</div>
4. <div>Выберите нужный экземпляр SQL Server.</div>
5. <div>На шаге выбора компонентов найдите и снимите галочку с **Machine Learning Services (Database In-Database)** (или компонента интеграции Python/R).</div>
6. <div>Завершите работу мастера.</div>

</div>##### 3. Ручная очистка хвостов

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9F%D0%BE%D1%81%D0%BB%D0%B5-%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-%D1%81%D0%BB%D1%83%D0%B6%D0%B1" inline-copy-host=""><div>После удаления службы и компонента вы можете вручную удалить оставшуюся папку `PYTHON_SERVICES_...` (и аналогичные ей, если их несколько), чтобы вернуть свободное место на диске C:. Если система напишет, что файлы заняты, перезагрузите компьютер и повторите удаление.</div></div><div id="bkmrk--2"></div><p class="callout info">Я остановил и отключил службу и вручную удалил папку через проводник. Через MS SQL Installer удалить не получилось.</p>

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

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9F%D0%B0%D0%BF%D0%BA%D0%B0-update-cache-%28" inline-copy-host=""><div>Папка **Update Cache** (обычно находится по пути вроде `C:\Program Files\Microsoft SQL Server\140\Setup Bootstrap\Update Cache` для SQL Server 2017) хранит **резервные копии файлов обновлений (кумулятивных патчей и пакетов исправлений)**, которые когда-либо устанавливались на ваш сервер.</div>  
</div>#### Зачем она нужна?

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9A%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9-%D1%80%D0%B0%D0%B7%2C-%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0-%D0%B2%D1%8B" inline-copy-host=""><div>Каждый раз, когда вы ставите патч (Cumulative Update или Service Pack), установщик сохраняет в эту папку старые версии файлов. Это делается для того, чтобы в будущем администратор мог:</div>  
1. <div>Корректно **откатить обновление** (удалить конкретный патч через Панель управления, если он вызвал сбой).</div>
2. <div>Вернуть систему к предыдущей сборке (build).</div>

</div>#### Можно ли её удалить?

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9E%D1%84%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F-%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D1%8F-" inline-copy-host="">- <div>**Официальная позиция Microsoft:** Удалять эту папку **не рекомендуется**. Если вы её очистите, то пункт «Удалить обновление» для SQL Server в панели управления перестанет работать, так как установщик больше не найдет файлы для отката. Сама база данных и текущая версия SQL Server от этого не сломаются и работать хуже не станут.</div>
- <div>**На практике для экономии места:** Многие администраторы удаляют содержимое этой папки, если на диске критически мало места и они точно уверены, что откатывать установленные обновления назад никто не планирует.</div>

<div>Если вы решите её почистить ради освобождения места, учтите, что при установке *следующих* новых кумулятивных патчей для SQL Server эта папка снова начнет заполняться новыми данными.</div></div>### Вопрос: имеется docker под windows, несколько контейнеров, томов и образов находится на диске C:, как перенести все на другой диск

<p class="callout info">В итоге я перенес через настройки Docker Desktop. Папки хранилища почистились при переносе.</p>

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9F%D0%B5%D1%80%D0%B5%D0%BD%D0%B5%D1%81%D1%82%D0%B8-docker-%D1%81-%D0%B4" inline-copy-host=""><div>Перенести Docker с диска C: на другой диск (например, D:) можно двумя способами в зависимости от версии Docker Desktop.</div>  
</div>#### Способ 1. Через настройки Docker Desktop (Самый простой и официальный)

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%92-%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE-%D1%81%D0%B2%D0%B5%D0%B6%D0%B8" inline-copy-host=""><div><span class="citation-43 citation-end-43">В относительно свежих версиях Docker Desktop разработчики добавили удобную кнопку переноса прямо в интерфейсе.<sup class="superscript" data-turn-source-index="1"></sup></span> </div>  
1. <div><span class="citation-42">Откройте </span>**<span class="citation-42">Docker Desktop</span>**<span class="citation-42 citation-end-42">.<sup class="superscript" data-turn-source-index="2"></sup></span> </div>
2. <div><span class="citation-41">Нажмите на иконку </span>**<span class="citation-41">шестеренки (Settings)</span>**<span class="citation-41 citation-end-41"> в правом верхнем углу.<sup class="superscript" data-turn-source-index="3"></sup></span> </div>
3. <div><span class="citation-40">В левом меню выберите раздел </span>**<span class="citation-40">Resources</span>**<span class="citation-40"> (Ресурсы) -&gt; вкладка </span>**<span class="citation-40">Advanced</span>**<span class="citation-40 citation-end-40">.<sup class="superscript" data-turn-source-index="4"></sup></span> </div>
4. <div><span class="citation-39">Найдите поле </span>**<span class="citation-39">Disk image location</span>**<span class="citation-39 citation-end-39">.<sup class="superscript" data-turn-source-index="5"></sup></span> </div>
5. <div><span class="citation-38">Нажмите кнопку </span>**<span class="citation-38">Browse</span>**<span class="citation-38"> и выберите пустую папку на другом диске (например, </span>`<span class="citation-38">D:\DockerData</span>`<span class="citation-38 citation-end-38">).<sup class="superscript" data-turn-source-index="6"></sup></span> </div>
6. <div><span class="citation-37">Нажмите </span>**<span class="citation-37">Apply &amp; restart</span>**<span class="citation-37 citation-end-37">.<sup class="superscript" data-turn-source-index="7"></sup></span> </div>  
    
    - <div>*Примечание:* Docker сам автоматически скопирует все ваши виртуальные диски (`ext4.vhdx`), контейнеры и образы в новое место и переключит пути. Это может занять некоторое время в зависимости от объема данных.</div>

</div>#### <span class="citation-36 citation-end-36">Способ 2. Через терминал WSL (Если первая кнопка недоступна или зависает)<sup class="superscript" data-turn-source-index="8"></sup></span> 

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%95%D1%81%D0%BB%D0%B8-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81-%D0%BD%D0%B5-%D0%BF%D0%BE" inline-copy-host=""><div>Если интерфейс не позволяет сделать перенос автоматически, можно перенести данные вручную с помощью встроенного механизма WSL 2, на котором работает Docker.</div>  
1. <div>**<span class="citation-35 citation-end-35">Полностью закройте Docker Desktop:</span>** кликните правой кнопкой мыши по иконке Docker в трее (возле часов) и выберите **Quit Docker Desktop**.</div>
2. <div><span class="citation-34">Откройте </span>**<span class="citation-34">PowerShell</span>**<span class="citation-34 citation-end-34"> от имени администратора.</span></div>
3. <div>Убедитесь, что WSL полностью остановлен:</div>  
    <div _ngcontent-ng-c2344738136="" class="code-block ng-tns-c2344738136-65 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="3" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8xMDk3ZDdiYmZmZjdjYzg0IiwiY18yYmIwYzUzOWEzMTA5NWNjIixudWxsLCJyY19kOGFkNmI1MzEyNTAyNjRmIixudWxsLG51bGwsInJ1IixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2344738136="" class="formatted-code-block-internal-container ng-tns-c2344738136-65"><div _ngcontent-ng-c2344738136="" class="animated-opacity ng-tns-c2344738136-65"><div _ngcontent-ng-c2344738136="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2344738136-65 ng-star-inserted"><span class="ng-tns-c2344738136-65">PowerShell</span></div></div></div></div>```
    wsl --shutdown
    
    ```
4. <div>Экспортируйте данные основных виртуальных машин Docker в архивные `.tar` файлы на другой диск (замените `D:\Docker` на ваш реальный путь, предварительно создав эту папку):</div>  
    <div _ngcontent-ng-c2344738136="" class="code-block ng-tns-c2344738136-66 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="6" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8xMDk3ZDdiYmZmZjdjYzg0IiwiY18yYmIwYzUzOWEzMTA5NWNjIixudWxsLCJyY19kOGFkNmI1MzEyNTAyNjRmIixudWxsLG51bGwsInJ1IixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2344738136="" class="formatted-code-block-internal-container ng-tns-c2344738136-66"><div _ngcontent-ng-c2344738136="" class="animated-opacity ng-tns-c2344738136-66"><div _ngcontent-ng-c2344738136="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2344738136-66 ng-star-inserted"><span class="ng-tns-c2344738136-66">PowerShell</span></div></div></div></div>```
    wsl --export docker-desktop-data D:\Docker\docker-desktop-data.tar
    wsl --export docker-desktop D:\Docker\docker-desktop.tar
    
    ```
    
    <div>*(Процесс экспорта может занять несколько минут, так как файлы образов и томов обычно весят много).*</div>
5. <div>Удалите (отвяжите) старые дистрибутивы из WSL (это удалит старые тяжелые файлы с диска C:, но ваши данные уже сохранены в `.tar` архивах):</div>  
    <div _ngcontent-ng-c2344738136="" class="code-block ng-tns-c2344738136-67 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="9" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8xMDk3ZDdiYmZmZjdjYzg0IiwiY18yYmIwYzUzOWEzMTA5NWNjIixudWxsLCJyY19kOGFkNmI1MzEyNTAyNjRmIixudWxsLG51bGwsInJ1IixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2344738136="" class="formatted-code-block-internal-container ng-tns-c2344738136-67"><div _ngcontent-ng-c2344738136="" class="animated-opacity ng-tns-c2344738136-67"><div _ngcontent-ng-c2344738136="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2344738136-67 ng-star-inserted"><span class="ng-tns-c2344738136-67">PowerShell</span></div></div></div></div>```
    wsl --unregister docker-desktop-data
    wsl --unregister docker-desktop
    
    ```
6. <div>Импортируйте их заново, указав новый путь на другом диске:</div>  
    <div _ngcontent-ng-c2344738136="" class="code-block ng-tns-c2344738136-68 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="12" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8xMDk3ZDdiYmZmZjdjYzg0IiwiY18yYmIwYzUzOWEzMTA5NWNjIixudWxsLCJyY19kOGFkNmI1MzEyNTAyNjRmIixudWxsLG51bGwsInJ1IixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2344738136="" class="formatted-code-block-internal-container ng-tns-c2344738136-68"><div _ngcontent-ng-c2344738136="" class="animated-opacity ng-tns-c2344738136-68"><div _ngcontent-ng-c2344738136="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2344738136-68 ng-star-inserted"><span class="ng-tns-c2344738136-68">PowerShell</span></div></div></div></div>```
    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. <div>Запустите **Docker Desktop** заново. Все ваши контейнеры, тома (volumes) и образы появятся на новом диске.</div>

<div>После того как вы убедитесь, что всё работает корректно, архивные файлы `.tar` из папки `D:\Docker` можно удалить, чтобы они не занимали место.</div></div>### Вопрос: папка C:\\Users\\\[your\_user\]\\AppData\\Local\\Microsoft\\Terminal Server Client\\Cache занимает больше 300 Mb, как ее почистить?

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9F%D0%B0%D0%BF%D0%BA%D0%B0-cache-%D0%B2-%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82" inline-copy-host=""><div>Папка **`Cache`** в директории `Terminal Server Client` принадлежит клиенту службы удаленных рабочих столов (**RDP / Remote Desktop Connection**). В ней хранятся растровые изображения (скриншоты элементов интерфейса, иконки, фоновые картинки), которые клиент сохраняет при подключении к удаленным серверам или ПК, чтобы каждый раз не подгружать их заново.</div>  
<div>Со временем этот кэш разрастается (файлы с расширением `.bmc`), и его абсолютно безопасно можно очистить.</div>  
</div>#### Как очистить кэш RDP:

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%97%D0%B0%D0%BA%D1%80%D0%BE%D0%B9%D1%82%D0%B5-%D0%B2%D1%81%D0%B5-%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B" inline-copy-host="">1. <div>**Закройте все активные окна подключения к удаленному рабочему столу** (приложение `mstsc.exe`).</div>
2. <div>Нажмите комбинацию клавиш **`Win + R`**, введите путь:</div>  
    <div _ngcontent-ng-c2344738136="" class="code-block ng-tns-c2344738136-30 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="3" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl9jZDBjZDZiNWNlMTVkZDkwIiwiY18yYmIwYzUzOWEzMTA5NWNjIixudWxsLCJyY19iZTk5YWRhYmZlZDljODBhIixudWxsLG51bGwsInJ1IixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2344738136="" class="formatted-code-block-internal-container ng-tns-c2344738136-30"><div _ngcontent-ng-c2344738136="" class="animated-opacity ng-tns-c2344738136-30"><div _ngcontent-ng-c2344738136="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2344738136-30 ng-star-inserted"><span class="ng-tns-c2344738136-30">Plaintext</span><div _ngcontent-ng-c2344738136="" class="buttons ng-tns-c2344738136-30 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
    %LocalAppData%\Microsoft\Terminal Server Client\Cache
    
    ```
    
    <div _ngcontent-ng-c2344738136="" class="code-block ng-tns-c2344738136-30 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="3" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl9jZDBjZDZiNWNlMTVkZDkwIiwiY18yYmIwYzUzOWEzMTA5NWNjIixudWxsLCJyY19iZTk5YWRhYmZlZDljODBhIixudWxsLG51bGwsInJ1IixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2344738136="" class="formatted-code-block-internal-container ng-tns-c2344738136-30"><div _ngcontent-ng-c2344738136="" class="animated-opacity ng-tns-c2344738136-30"></div></div></div><div>и нажмите **`Enter`**.</div>
3. <div>Выделяйте все файлы внутри этой папки (`.bmc и .bin` файлы) и **удаляйте** их обычным способом (`Delete` или `Shift + Delete`).</div>

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

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

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9F%D0%B0%D0%BF%D0%BA%D0%B0-code-cache-%D0%B2-%D0%BF" inline-copy-host=""><div>Папка **`Code Cache`** в профиле браузера Chrome содержит скомпилированный JavaScript-код сайтов, которые вы посещали. Браузер сохраняет его, чтобы сайты открывались быстрее и не тратили ресурсы процессора на повторную компиляцию скриптов при каждом визите.</div>  
<div>Для кэша 300 МБ — это вполне нормальный и даже скромный размер (со временем он может вырастать до нескольких гигабайт). Однако его можно **полностью и абсолютно безопасно очистить**, чтобы освободить место на диске.</div>  
</div>#### Как безопасно очистить Code Cache:

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

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9E%D1%82%D0%BA%D1%80%D0%BE%D0%B9%D1%82%D0%B5-google-chro" inline-copy-host="">1. <div>Откройте **Google Chrome**.</div>
2. <div>Нажмите комбинацию клавиш **`Ctrl + Shift + Delete`** (откроется окно очистки истории).</div>
3. <div>Перейдите на вкладку **«Дополнительно»** (Advanced).</div>
4. <div>Выберите временной диапазон **«За все время»** (All time).</div>
5. <div>Установите галочку **«Файлы кэшированные и другие данные»** (Cached images and files) — *обратите внимание: остальные галочки (пароли, история, файлы cookie) лучше снять, чтобы не потерять нужные данные*.</div>
6. <div>Нажмите кнопку **«Удалить данные»** (Clear data).</div>

</div>##### Способ 2. Вручную через проводник (Если нужно точечно сбросить именно эту папку)

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9F%D0%BE%D0%BB%D0%BD%D0%BE%D1%81%D1%82%D1%8C%D1%8E-%D0%B7%D0%B0%D0%BA%D1%80%D0%BE%D0%B9%D1%82%D0%B5-g" inline-copy-host="">1. <div>**Полностью закройте Google Chrome** (убедитесь, что в трее возле часов нет иконки Chrome и в диспетчере задач не висят его фоновые процессы).</div>
2. <div>Нажмите **`Win + R`**, вставьте путь:</div>  
    <div _ngcontent-ng-c2344738136="" class="code-block ng-tns-c2344738136-32 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="3" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl82Y2ZjNDI1MGM0YWVkZjVlIiwiY18yYmIwYzUzOWEzMTA5NWNjIixudWxsLCJyY184NzBlYjU2NjQ2YTczZWI3IixudWxsLG51bGwsInJ1IixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2344738136="" class="formatted-code-block-internal-container ng-tns-c2344738136-32"><div _ngcontent-ng-c2344738136="" class="animated-opacity ng-tns-c2344738136-32"><div _ngcontent-ng-c2344738136="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2344738136-32 ng-star-inserted"><span class="ng-tns-c2344738136-32">Plaintext</span><div _ngcontent-ng-c2344738136="" class="buttons ng-tns-c2344738136-32 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
    %LocalAppData%\Google\Chrome\User Data\Default\Code Cache
    
    ```
    
    <div _ngcontent-ng-c2344738136="" class="code-block ng-tns-c2344738136-32 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="3" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl82Y2ZjNDI1MGM0YWVkZjVlIiwiY18yYmIwYzUzOWEzMTA5NWNjIixudWxsLCJyY184NzBlYjU2NjQ2YTczZWI3IixudWxsLG51bGwsInJ1IixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2344738136="" class="formatted-code-block-internal-container ng-tns-c2344738136-32"><div _ngcontent-ng-c2344738136="" class="animated-opacity ng-tns-c2344738136-32"></div></div></div><div>и нажмите `Enter`.</div>
3. <div>Выделите **все файлы и папки внутри** этой директории и удалите их (`Shift + Delete`).</div>

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

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--3" inline-copy-host=""></div>### Вопрос: есть более 300 Mb здесь: C:\\Users\\\[your\_user\]\\AppData\\Local\\WhatsApp\\app-2.2149.4

<p class="callout info">Я просто удалил WhatsApp</p>

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9F%D0%B0%D0%BF%D0%BA%D0%B0-c%3A%5Cusers%5Cnik-v" inline-copy-host=""><div>Папка `C:\Users\nik-v\AppData\Local\WhatsApp\app-2.2149.4` — это **устаревшая версия приложения WhatsApp**.</div>  
</div>#### Что это такое?

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0-%D0%BD%D0%B0%D1%81%D1%82%D0%BE%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-%D0%BA%D0%BB%D0%B8" inline-copy-host=""><div>Когда настольный клиент WhatsApp обновляется, он не всегда удаляет файлы старых версий. В данном случае у вас осталась папка от версии `2.2149.4`, которая вышла довольно давно (судя по индексу версии). Новые версии приложения скачиваются и распаковываются в *соседние* папки с актуальными номерами, а эта старая просто лежит мертвым грузом и занимает место.</div>  
</div>#### Можно ли её удалить?

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%94%D0%B0%2C-%D1%8D%D1%82%D1%83-%D0%BF%D0%B0%D0%BF%D0%BA%D1%83-%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE-" inline-copy-host=""><div>**Да, эту папку можно смело удалить целиком вместе со всем содержимым.**</div>  
<div>Главное правило перед удалением:</div>  
1. <div>Убедитесь, что сам WhatsApp в данный момент закрыт.</div>
2. <div>Проверьте, что вы удаляете именно папку со старым номером версии (`app-2.2149.4`), а не корневую папку WhatsApp и не папку с текущей рабочей версией (актуальную версию можно посмотреть в соседних папках внутри `%LocalAppData%\WhatsApp`).</div>

<div>После удаления старой версии приложение продолжит работать на актуальном релизе, а вы освободите занятое дисковое пространство.</div></div>### Вопрос: вот здесь C:\\Users\\\[your\_user\]\\AppData\\Local\\Temp 2 Gb

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9F%D0%B0%D0%BF%D0%BA%D0%B0-c%3A%5Cusers%5C%5Byour" inline-copy-host=""><div>Папка **`C:\Users\<strong>[your_user]</strong>``\AppData\Local\Temp`** — это главное хранилище временных файлов для Windows и всех установленных программ. 2 гигабайта для этой папки — это даже относительно немного (часто она разрастается до десятков гигабайт), но очистить её можно и нужно.</div></div>#### Безопасно ли её чистить?

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%94%D0%B0%2C-%D0%B0%D0%B1%D1%81%D0%BE%D0%BB%D1%8E%D1%82%D0%BD%D0%BE.-%D0%97%D0%B4%D0%B5%D1%81%D1%8C" inline-copy-host=""><div>**Да, абсолютно.** Здесь хранятся хвосты от установки программ, распакованные архивы, кэш браузеров и временные документы, которые были нужны приложениям в прошлом, но о которых они уже забыли.</div>  
</div>#### Как правильно очистить папку Temp:

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%97%D0%B0%D0%BA%D1%80%D0%BE%D0%B9%D1%82%D0%B5-%D0%B2%D1%81%D0%B5-%D0%B7%D0%B0%D0%BF%D1%83%D1%89%D0%B5%D0%BD" inline-copy-host="">1. <div>**Закройте все запущенные приложения** (особенно браузеры, редакторы кода и тяжелые программы), чтобы они не удерживали блокировки на свои временные файлы.</div>
2. <div>Нажмите **`Win + R`**, введите:</div>  
    <div _ngcontent-ng-c2344738136="" class="code-block ng-tns-c2344738136-33 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="3" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl82NDM1Y2IzMDA5YzU1ZjQ5IiwiY18yYmIwYzUzOWEzMTA5NWNjIixudWxsLCJyY185MTE4Y2E1NzM1ZWE3OWJjIixudWxsLG51bGwsInJ1IixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2344738136="" class="formatted-code-block-internal-container ng-tns-c2344738136-33"><div _ngcontent-ng-c2344738136="" class="animated-opacity ng-tns-c2344738136-33"><div _ngcontent-ng-c2344738136="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2344738136-33 ng-star-inserted"><span class="ng-tns-c2344738136-33">Plaintext</span><div _ngcontent-ng-c2344738136="" class="buttons ng-tns-c2344738136-33 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
    %LocalAppData%\Temp
    
    ```
    
    <div _ngcontent-ng-c2344738136="" class="code-block ng-tns-c2344738136-33 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="3" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl82NDM1Y2IzMDA5YzU1ZjQ5IiwiY18yYmIwYzUzOWEzMTA5NWNjIixudWxsLCJyY185MTE4Y2E1NzM1ZWE3OWJjIixudWxsLG51bGwsInJ1IixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2344738136="" class="formatted-code-block-internal-container ng-tns-c2344738136-33"><div _ngcontent-ng-c2344738136="" class="animated-opacity ng-tns-c2344738136-33"></div></div></div><div>и нажмите `Enter` (откроется та самая папка).</div>
3. <div>Выделите **все файлы и папки** внутри (`Ctrl + A`) и нажмите **`Delete`** (или `Shift + Delete`, чтобы обойти корзину).</div>
4. <div>**Что делать с неудаляемыми файлами?**</div><div>Часть файлов операционная система или фоновые службы (например, антивирус или активные программы) могут не дать удалить, выдав сообщение вроде *"Файл занят другим приложением"*. **Это нормально.** Просто поставьте галочку «Выполнить для всех текущих элементов» и нажмите **«Пропустить» (Skip)**. Всё остальное мусорное содержимое удалится без проблем.</div>

</div><p class="callout info">В моем случае не все файлы удалились вручную, но места освободилось много.</p>

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

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9F%D0%B0%D0%BF%D0%BA%D0%B0-c%3A%5Cwindows%5Cins" inline-copy-host=""><div>Папка **`C:\Windows\Installer`** (весом более 6 ГБ) — это системное хранилище кэша установщика Windows (Windows Installer Cache). В ней хранятся файлы установочных пакетов с расширениями `.msi` и `.msp` от программ, которые установлены на вашем компьютере.</div>  
</div>#### Зачем нужна эта папка?

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-windows-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B5%D1%82-%D1%8D" inline-copy-host=""><div>Windows использует этот кэш для:</div>  
1. <div>**Удаления или изменения программ** (когда вы заходите в «Установку и удаление программ», мастеру требуются оригинальные `.msi` файлы для корректной очистки).</div>
2. <div>**Установки обновлений и патчей** для уже имеющегося софта (например, пакетов Office или некоторых тяжелых приложений).</div>

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

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%A3%D0%B4%D0%B0%D0%BB%D1%8F%D1%82%D1%8C-%D1%84%D0%B0%D0%B9%D0%BB%D1%8B-%D0%B8%D0%B7-%D1%8D%D1%82%D0%BE" inline-copy-host=""><div>Удалять файлы из этой папки **вручную через проводник категорически нельзя** (если вы просто сотрете оттуда файлы, вы потеряете возможность удалять, обновлять или исправлять соответствующий софт, и система будет выдавать ошибки).</div>  
<div>Однако существуют специальные безопасные утилиты, которые умеют вычищать из этой папки **«сиротские» файлы** — остатки от программ, которые давно удалены, но чей кэш остался лежать мертвым грузом:</div>  
1. <div>**PatchCleaner** — одна из самых известных и безопасных бесплатных программ для этих целей. Она сканирует папку `C:\Windows\Installer`, сверяет её содержимое с реальным списком установленного софта и находит те `.msi`/`.msp` файлы, которые никому больше не нужны.</div>
2. <div>Программа дает возможность **безопасно удалить** только этот мусор или переместить его в другую папку (на случай, если захотите перестраховаться).</div>

<div>Если вы решите воспользоваться PatchCleaner:</div>  
- <div>Скачайте её из проверенного источника.</div>
- <div>Запустите сканирование.</div>
- <div>Посмотрите на объем найденных «сиротских» файлов (Orphaned files) и нажмите кнопку удаления/переноса. Это позволит вернуть значительную часть места на диске C: без риска повредить рабочие программы.</div>

</div>#### Как скачать правильный PatchCleaner:

<span class="citation-11">Чтобы не наткнуться на рекламу, лучше скачивать утилиту напрямую с проверенного репозитория открытого ПО </span>**<span class="citation-11">SourceForge</span>**<span class="citation-11 citation-end-11">:<sup class="superscript" data-turn-source-index="1"></sup></span>

1. Перейдите по прямой ссылке на проект: `https://sourceforge.net/projects/patchcleaner/`
2. <span class="citation-10">Нажмите зеленую кнопку </span>**<span class="citation-10">Download</span>**<span class="citation-10"> (файл должен называться именно </span>`<span class="citation-10">PatchCleaner_1.4.2.0.exe</span>`<span class="citation-10 citation-end-10"> (название актуально на момент написания этой статьи) размером около 1.3 MB).<sup class="superscript" data-turn-source-index="2"></sup></span>

<p class="callout danger"><span class="citation-10 citation-end-10">С официального сайта программы скачивается реклама, не используйте его.</span></p>

#### <span class="citation-6 citation-end-6">Страховка от ошибок (как сделать на 100% безопасно):<sup class="superscript" data-turn-source-index="2"></sup></span> 

Даже несмотря на то, что программа толковая, с системными каталогами лучше перестраховаться. <span class="citation-5">Когда PatchCleaner завершит сканирование и покажет вам «сиротские» файлы (Orphaned files), </span>**<span class="citation-5">не спешите нажимать Delete</span>**<span class="citation-5 citation-end-5">.<sup class="superscript" data-turn-source-index="3"></sup></span>

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

1. Укажите программе любую другую папку (например, создайте временную папку `D:\InstallerBackup`).
2. Нажмите кнопку переноса. Программа сама аккуратно переместит эти 6 ГБ на диск D:.
3. После этого поработайте за компьютером пару дней: пооткрывайте нужные программы, проверьте, всё ли запускается и удаляется.
4. <span class="citation-4 citation-end-4">Если за пару дней всё работает штатно и никаких сбоев нет, вы сможете просто удалить эту резервную папку с диска D:, окончательно освободив место на диске C:.<sup class="superscript" data-turn-source-index="4"></sup></span> Если вдруг какой-то редкой программе неожиданно понадобится старый инсталлятор, вы всегда сможете вернуть файлы обратно в `C:\Windows\Installer`.

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

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9F%D0%B0%D0%BF%D0%BA%D0%B0-c%3A%5Cwindows%5Cwin" inline-copy-host=""><div>Папка **`C:\Windows\WinSxS`** (Windows Side-by-Side) — это одно из самых больших и важных хранилищ в операционной системе Windows. В ней находится база данных и файлы практически всех компонентов системы, обновлений, драйверов и библиотек (DLL), которые когда-либо устанавливались в Windows.</div>  
</div>#### Зачем нужна эта папка?

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%97%D0%B0%D1%89%D0%B8%D1%82%D0%B0-%D0%BE%D1%82-%D1%81%D0%B1%D0%BE%D0%B5%D0%B2-%D0%B8-%D0%BA%D0%BE" inline-copy-host="">1. <div>**Защита от сбоев и конфликтов (DLL Hell):** В ней хранятся разные версии одних и тех же системных библиотек. Если какая-то программа запрашивает старую версию компонента, Windows берет её из WinSxS, поэтому приложения не ломаются при обновлениях.</div>
2. <div>**Хранилище обновлений:** Когда Windows скачивает патчи, она складывает новые версии файлов сюда, а старые сохраняет на случай отката или восстановления системы.</div>

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

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8-%D0%BD%D0%B5%D1%82%21-%D0%A3" inline-copy-host="">- <div>**Категорически нет!** Удаление файлов, папок или подпалок внутри WinSxS через проводник **неминуемо сломает Windows**: перестанут запускаться программы, пропадут компоненты системы, а в худшем случае ПК перестанет загружаться.</div>
- <div>Размер этой папки часто составляет от 10 до 30 ГБ (иногда больше), и это нормальное поведение для Windows.</div>

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

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-windows-%D1%83%D0%BC%D0%B5%D0%B5%D1%82-%D1%81%D0%B0%D0%BC%D0%B0-%D0%BE" inline-copy-host=""><div>Windows умеет сама очищать эту папку от устаревших дубликатов и компонентов с помощью встроенного механизма **Очистки диска**:</div>  
1. <div>Нажмите **`Win + R`**, введите `cleanmgr` и нажмите **`Enter`**.</div>
2. <div>В появившемся окне выберите системный диск (**C:**) и нажмите OK.</div>
3. <div>Когда сканирование завершится, нажмите кнопку **«Очистить системные файлы»** (Clean up system files) и снова выберите диск C:.</div>
4. <div>В списке найдите и отметьте галочкой пункт **«Очистка обновлений Windows»** (Windows Update Cleanup).</div>
5. <div>Нажмите **OK**, чтобы система удалила старые резервные копии обновлений из WinSxS без риска повредить систему.</div>

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

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9F%D0%B0%D0%BF%D0%BA%D0%B0-inetcache%2C-%D1%80%D0%B0%D1%81" inline-copy-host=""><div>Папка **`INetCache`**, расположенная по столь глубокому системному пути (`C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache`), — это **скрытый кэш временных интернет-файлов, принадлежащий системной учетной записи (Local System / SYSTEM)**, а не вашему личному профилю пользователя.</div>  
</div>#### Что в ней хранится?

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%97%D0%B4%D0%B5%D1%81%D1%8C-%D0%BE%D1%81%D0%B5%D0%B4%D0%B0%D1%8E%D1%82-%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD" inline-copy-host=""><div>Здесь оседают временные файлы, кэш браузера Internet Explorer (который глубоко интегрирован в ядро Windows), а также данные, которые скачивают фоновые системные службы или компоненты операционной системы при обращении к веб-ресурсам (например, при проверке обновлений, работе встроенных модулей активации или стороннего софта, запущенного от имени системного администратора/службы).</div>  
</div>#### Можно ли её чистить?

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%92%D1%80%D1%83%D1%87%D0%BD%D1%83%D1%8E-%D1%87%D0%B5%D1%80%D0%B5%D0%B7-%D0%BF%D1%80%D0%BE%D0%B2%D0%BE%D0%B4" inline-copy-host="">- <div>**Вручную через проводник** лезть туда и удалять файлы не стоит, так как к этому профилю у обычной учетной записи может не быть полных прав, а активные службы могут блокировать файлы.</div>
- <div>Если папка разрослась до больших размеров, безопаснее всего очистить её с помощью той же **Очистки диска** (`cleanmgr`), выбрав пункт «Временные файлы Интернета» (Temporary Internet Files) при сканировании системных файлов.</div>

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

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%91%D0%BE%D0%BB%D0%B5%D0%B5-2-%D0%BC%D0%B8%D0%BB%D0%BB%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2-%D1%84%D0%B0" inline-copy-host=""><div>Более 2 миллионов файлов в папке `IE` системного профиля — это **типичный баг или застарелая проблема Windows**.</div>  
<div>Такое огромное количество мелких файлов (обычно это миллионы крошечных объектов кэша Internet Explorer) возникает из-за того, что фоновые службы Windows или сторонний софт (работающий от системной учетной записи) постоянно пишут туда данные, но встроенный механизм очистки никогда их не удаляет. Из-за этого файловая система начинает страдать от фрагментации, а проводник или антивирус могут намертво зависать при попытке зайти в эту папку.</div>  
</div><p class="callout info">Я использовал вариант 2. Работает очень долго. Перед запуском нужно закрыть WizTree.</p>

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

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9F%D1%80%D0%BE%D1%81%D1%82%D0%BE-%D0%B2%D1%8B%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D1%8C-%D0%B8%D1%85-%D0%B8" inline-copy-host=""><div>Просто выделить их и нажать Delete вручную через Проводник не получится: Windows выдаст ошибку о слишком длинных путях, либо процесс будет идти сутками из-за колоссального количества мелких объектов.</div>  
<div>Лучший способ очистить этот системный кэш — воспользоваться встроенной утилитой командной строки **DISM** или запустить автоматическую очистку.</div>  
</div>##### Вариант 1. Автоматическая очистка через «Очистку диска»

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%9D%D0%B0%D0%B6%D0%BC%D0%B8%D1%82%D0%B5-win-%2B-r%2C-%D0%B2%D0%B2%D0%B5" inline-copy-host="">1. <div>Нажмите **`Win + R`**, введите `cleanmgr` и нажмите `Enter`.</div>
2. <div>Выберите диск **C:**.</div>
3. <div>Обязательно нажмите кнопку **«Очистить системные файлы»** внизу окна и снова выберите диск C:.</div>
4. <div>В списке найдите галочку **«Временные файлы Интернета» (Temporary Internet Files)** и убедитесь, что она отмечена. Нажмите OK. (Система сама умеет безопасно вычищать этот каталог через свои API).</div>

</div>##### Вариант 2. Экстренная очистка через PowerShell (если `cleanmgr` не помог)

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%D0%95%D1%81%D0%BB%D0%B8-%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2-%D0%BC%D0%B8%D0%BB%D0%BB%D0%B8%D0%BE%D0%BD%D1%8B" inline-copy-host=""><div>Если файлов миллионы и стандартная утилита их не трогает, можно быстро очистить папку через PowerShell от имени администратора, используя утилиту `rd` (удаление дерева каталогов):</div>  
1. <div>Нажмите **`Win + X`** и выберите **Терминал (Администратор)** или **PowerShell (Администратор)**.</div>
2. <div>Выполните команду для принудительного удаления содержимого кэша:</div>  
    <div _ngcontent-ng-c2344738136="" class="code-block ng-tns-c2344738136-40 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwjjhc2ek4-XAxUAAAAAHQAAAAAQcw" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl82NWFjMGFmYmZmY2Y3MjQ1IiwiY18yYmIwYzUzOWEzMTA5NWNjIixudWxsLCJyY19jM2NkNGU2YzBkMDMwYzAxIixudWxsLG51bGwsInJ1IixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2344738136="" class="formatted-code-block-internal-container ng-tns-c2344738136-40"><div _ngcontent-ng-c2344738136="" class="animated-opacity ng-tns-c2344738136-40"><div _ngcontent-ng-c2344738136="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2344738136-40 ng-star-inserted"><span class="ng-tns-c2344738136-40">PowerShell</span><div _ngcontent-ng-c2344738136="" class="buttons ng-tns-c2344738136-40 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed _mat-animation-noopable mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
    Remove-Item -Path "C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache\IE\*" -Recurse -Force -ErrorAction SilentlyContinue
    
    ```
    
    <div _ngcontent-ng-c2344738136="" class="code-block ng-tns-c2344738136-40 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwjjhc2ek4-XAxUAAAAAHQAAAAAQcw" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl82NWFjMGFmYmZmY2Y3MjQ1IiwiY18yYmIwYzUzOWEzMTA5NWNjIixudWxsLCJyY19jM2NkNGU2YzBkMDMwYzAxIixudWxsLG51bGwsInJ1IixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2344738136="" class="formatted-code-block-internal-container ng-tns-c2344738136-40"><div _ngcontent-ng-c2344738136="" class="animated-opacity ng-tns-c2344738136-40"></div></div></div><div>*(Команда победит ограничение на длину путей и молча удалит весь накопившийся мусор, пропуская то, что в данный момент занято процессами).*</div>

<div>После этого миллионы мелких файлов исчезнут, освободив гигабайты пространства и избавив файловую систему от лишней нагрузки.</div></div><p class="callout info">Команда работает очень долго, может зависнуть. При работе она расходует очень много оперативной памяти (у меня доходило до 7Gb на процесс), освобождение места идет также медленно. Если программу прервать все освободившееся место снова будет занято. При завершении работы команда может подвиснуть и не выйти в командную строку, в моем случае переход туда произошел по клику на экране PowerShell.</p>

<div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--4" inline-copy-host=""></div><div id="bkmrk--5"></div><div id="bkmrk--6"></div><div _ngcontent-ng-c2589024448="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--7" inline-copy-host=""></div>

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

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

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

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

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

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

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

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

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

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

```powershell
w32tm /query /source
```

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

```text
Local CMOS Clock
```

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

---

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

Настройка:

```powershell
w32tm /query /configuration
```

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

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

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

```text
time.windows.com
```

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

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

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

---

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

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

```text
UDP source port: 123
UDP destination port: 123
```

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

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

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

```text
NTP 213.239.234.28:123
        │
        ▼
PC 192.168.0.103:123
```

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

```text
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-пакет содержит временные метки.

Упрощённо:

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

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

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

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

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

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

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

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

---

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

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

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

```text
sample 1
sample 2
sample 3
...
```

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

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

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

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

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

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

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

---

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

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

```text
MinPollInterval: 10
MaxPollInterval: 15
```

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

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

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

```text
17 минут
```

до:

```text
9 часов
```

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

```text
SpecialPollInterval: 16384
```

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

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

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

---

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

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

```powershell
w32tm /resync
```

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

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

Упрощённо:

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

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

Команда:

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

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

Например:

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

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

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

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

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

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

```text
[::]:123
0.0.0.0:123
```

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

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

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

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

против:

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

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

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

```bash
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.

- Нажмите **`Win + R`**, введите `taskschd.msc` и нажмите `Enter` (Планировщик заданий).
- Справа нажмите **«Создать задачу...»** (Create Task).
- **На вкладке «Общие»**:
    
    
    - Имя: `HTTP Time Sync`
    - Обязательно выберите галочку: **«Выполнить с наивысшими правами»** (Run with highest privileges) — это нужно, чтобы у скрипта были права на изменение системного времени.
    - В поле «Настроить для» выберите **Windows 10** (или Windows 11).
- **На вкладке «Триггеры»**:
    
    
    - Нажмите **«Создать...»** -&gt; В поле «Начать задачу» выберите **«При запуске»** (At startup) -&gt; ОК.
    - **«При подключении к сети»** (On workstation unlock / или по событию сна) — чтобы время корректировалось, когда вы открываете крышку ноутбука или разблокируете экран.
- **На вкладке «Действия»**:
    
    
    - Нажмите **«Создать...»** -&gt; Действие: **«Запуск программы»** (Start a program).
    - В поле «Программа или сценарий» введите: `powershell.exe`
    - В поле «Добавить аргументы (необязательно)» введите: `-ExecutionPolicy Bypass -WindowStyle Hidden -File "C:\Scripts\SyncTime.ps1"`
- **На вкладке «Условия» и «Параметры»**:
    
    
    - Снимите галочку «Запускать задачу только при питании от электросети» (если это ноутбук).
    - Поставьте галочку «Запускать задачу как можно скорее после пропуска планового запуска».