# 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()

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 add v4tov4 `
  listenport=3307 listenaddress=127.0.0.1 `
  connectport=3306 connectaddress=$ip

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

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


Write-Host ""
Write-Host "Ready:"
Write-Host "MariaDB    -> 127.0.0.1:3307"
Write-Host "PostgreSQL -> 127.0.0.1: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 class=""></div></div></div>---

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

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

# Работа с 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.

Откройте:

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

# Настройка 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            
    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>