From c1642dd3a699b724ddebe4aa3f6671231f14de1c Mon Sep 17 00:00:00 2001 From: Vladimir Eremin Date: Tue, 27 Jan 2026 23:02:40 +0300 Subject: [PATCH] docs: Remove questionable doc and update initial setup --- .../content/en/root/recipes/initial-setup.md | 177 +++++++++------- .../content/ru/root/recipes/xray-setup.md | 196 ------------------ 2 files changed, 101 insertions(+), 272 deletions(-) delete mode 100644 services/docs/content/ru/root/recipes/xray-setup.md diff --git a/services/docs/content/en/root/recipes/initial-setup.md b/services/docs/content/en/root/recipes/initial-setup.md index 200b534..9119346 100644 --- a/services/docs/content/en/root/recipes/initial-setup.md +++ b/services/docs/content/en/root/recipes/initial-setup.md @@ -5,131 +5,156 @@ weight: 1 type: docs --- -How to set up a fresh Debian host from zero to deployment. +# Initial Host Setup -## Add Adam User and Wheel Group +**Description:** Hardened setup for a fresh Debian host from zero to deployment. -Adam is a core user on each of the system. -It does not has password, -hence only connection via ssh is available, -providing a password-less sudo. +--- + +## 1. System User & Privileges + +We use the `adam` user for all administrative tasks. To minimize friction while maintaining security, we utilize SSH-key authentication and passwordless `sudo` via the `wheel` group. + +### Create the Admin User ```bash -# Add adam user -useradd -m -s '/bin/bash' adam +# Create the user with a bash shell +useradd -m -s /bin/bash adam -# Add wheel group for password-less sudo +# Create the wheel group (common for cross-distro consistency) groupadd wheel -vi /etc/sudoers.d/99-root-ermnvldmr + +# Create a modular sudoers file with safety checks +# This allows members of 'wheel' to run sudo without a password +echo "%wheel ALL=(ALL) NOPASSWD: ALL" | sudo visudo -c -f /etc/sudoers.d/99-root-ermnvldmr + +# Add adam to the necessary groups +usermod -aG wheel,docker adam + ``` -Fill file with the content: +--- -```visudo -%wheel ALL = (ALL) NOPASSWD: ALL -``` +## 2. SSH Hardening & Key Management -Then add _Adam_ user to the group +Passwords are disabled. Access is strictly via SSH keys. + +### Secure SSH Directory + +We set strict permissions immediately to prevent the SSH daemon from rejecting the keys. ```bash -usermod -a -G wheel adam +# Setup directories as root for the adam user +mkdir -p /home/adam/.ssh +chmod 700 /home/adam/.ssh + +# Add your public key (Replace [PASTE_PUB_KEY_HERE]) +echo "[PASTE_PUB_KEY_HERE]" > /home/adam/.ssh/authorized_keys +chmod 600 /home/adam/.ssh/authorized_keys +chown -R adam:adam /home/adam/.ssh + ``` -## Configure SSH +### Harden SSH Daemon -Hardening SSHD, -even stupidly changing port. +Modify the SSH configuration to change the default port and disable password entry. ```bash -# Move public ssh key of user adam to the server -vi /home/adam/.ssh/authorized_keys - -# Create additional ssh rules -vi /etc/ssh/sshd_config.d/99-root-ermnvldmr.conf -``` - -With the following content: - -```conf +# Create a dedicated override config +cat < /etc/ssh/sshd_config.d/99-root-ermnvldmr.conf Port 2222 PasswordAuthentication no PermitEmptyPasswords no AllowUsers adam +EOF + +# Validate syntax before restarting to avoid lockout +sshd -t && systemctl restart ssh + ``` -## Install Docker +--- -Follow the official Docker installation guide for Debian -- -[docs.docker.com](https://docs.docker.com/engine/install/debian/) +## 3. GitHub Access (Deploy Key) -Test Docker installation: +Since the repository is hosted on GitHub, the host needs its own identity to pull updates. ```bash -docker --version -docker compose version +# Generate a host-specific SSH key (no passphrase for automation) +ssh-keygen -t ed25519 -f /home/adam/.ssh/adam-at-deytenit_github_com_ed25519 -N "" + +# Display the public key to be added to GitHub (Settings > Deploy Keys) +cat /home/adam/.ssh/adam-at-deytenit_github_com_ed25519.pub + ``` -## Clone the root.ermnvldmr.com Repository +> [!TIP] +> Add the output above to your [GitHub Repository Deploy Keys](https://www.google.com/search?q=https://github.com/deytenit/root.ermnvldmr.com/settings/keys) with **read access**. + +--- + +## 4. Install Docker Engine + +Standard Docker installation for Debian - [Docs: Docker - Install on Debian](https://docs.docker.com/engine/install/debian/). ```bash -# Clone to your preferred location -cd /srv -sudo mkdir root.ermnvldmr.com -sudo chown adam:adam root.ermnvldmr.com +# Follow official guide: https://docs.docker.com/engine/install/debian/ +# Once installed, verify (Adam can run this without sudo now) +docker run --rm hello-world -# Clone the repository -git clone git@github.com:deytenit/root.ermnvldmr.com.git root.ermnvldmr.com - -# Run the repository initialization -./init.sh ``` -## Setup node +--- -> [!IMPORTANT] -> From now on `$NODE` equals node name of the server you are setting up. +## 5. Repository Deployment -> [!NOTE] -> More about root.ermnvldmr.com compositions repository -- [github.com](https://github.com/) - -Run node-specific scripts in $NODE/.host/.scripts -in order of their numbering: +Clone the infrastructure repository and initialize the node. ```bash -# For example for node daedalus +# Setup the service directory +export REPO_DIR="/srv/root.ermnvldmr.com" +sudo mkdir -p $REPO_DIR +sudo chown adam:adam $REPO_DIR + +# Clone as the adam user +sudo -u adam git clone git@github.com:deytenit/root.ermnvldmr.com.git $REPO_DIR + +# Initialize node (Set your node name, e.g., daedalus) +export NODE="daedalus" +cd $REPO_DIR +sudo -u adam ./init.sh -# Setting up the base components -./daedalus/.host/.scripts/00-base -# Setting up ufw with rules defined in ./daedalus/.host/ufw -./daedalus/.host/.scripts/10-ufw -# Setting up crowdsec with rules defined in ./daedalus/.host/crowd -./daedalus/.host/.scripts/20-crowd -# Setting up cron with tasks defined in ./daedalus/.host/cron -./daedalus/.host/.scripts/30-cron ``` -## Setup Storage Tiers +### Node-Specific Configuration -You need to decide where to store your data tiers: +Run the staged initialization scripts in order: ```bash -# Create storage directories +# Run the sequence for your specific node +./$NODE/.host/.scripts/00-base +./$NODE/.host/.scripts/10-ufw +./$NODE/.host/.scripts/20-crowd +./$NODE/.host/.scripts/30-cron + +``` + +--- + +## 6. Storage & Hardening + +Define the data tiers and secure the environment by creating non-root users for containerized services. + +```bash +# Create (or mount) storage directories sudo mkdir -p /srv/com-ermnvldmr-root-$NODE-{tier1,tier2,tier3} -# Setup tiers for the node -.scripts/ops/setup-tiers $NODE \ +# Setup tiers and non-root users +sudo -u adam .scripts/ops/setup-tiers $NODE \ /srv/com-ermnvldmr-root-$NODE-tier1 \ /srv/com-ermnvldmr-root-$NODE-tier2 \ /srv/com-ermnvldmr-root-$NODE-tier3 -``` -## Setup noroot-users +sudo -u adam .scripts/ops/setup-noroot-users $NODE -To harden the containers running on the node, -we create series of noroot-users and shared group -for each project in the compose repository node directory. - -```bash -# Setup noroot-users for the node -.scripts/ops/setup-noroot-users $NODE ``` diff --git a/services/docs/content/ru/root/recipes/xray-setup.md b/services/docs/content/ru/root/recipes/xray-setup.md deleted file mode 100644 index 1af3886..0000000 --- a/services/docs/content/ru/root/recipes/xray-setup.md +++ /dev/null @@ -1,196 +0,0 @@ ---- -title: "Настройка xray-клиента" -description: "Дружелюбная инструкция по настройке xray-client без какого-либо предназначения" -type: docs ---- - -Данная инструкция поможет вам пошагово настроить клиент для работы через заданную конфигурацию соединения и особые правила маршрутизации (*routing*). - -**Следуйте** каждому шагу внимательно. - -> [!NOTE] -> Инструкция предназначена для настройки xray-клиента без дальнейшего предназначения – мы не предоставляем услуги прокси. - -## Необходимые данные - -- Строка подключения формата: - - ``` - vless://... - ``` - -- Набор правил маршрутизации: - -> [!WARNING] -> Данный формат правил **подходит только** для **v2rayN/v2rayNG**! -> **Для happ** правильная строка указана **в самой инструкции**. - - ```json - [ - {"domain":["domain:ru","domain:su","domain:vk.com","domain:yandex.com"],"enabled":true,"locked":false,"outboundTag":"direct","remarks":"Domain RU - Direct"}, - {"domain":["geosite:private"],"enabled":true,"locked":false,"outboundTag":"direct","remarks":"Domain Private - Direct"}, - {"enabled":true,"ip":["geoip:ru"],"locked":false,"outboundTag":"direct","remarks":"IP RU - Direct"}, - {"enabled":true,"ip":["geoip:private"],"locked":false,"outboundTag":"direct","remarks":"IP Private - Direct"} - ] - ``` - -## Android (v2rayNG) - -> [!IMPORTANT] -> NekoBox (MatsuriDayo) более не рекомендован к использованию из-за малой активности в разработке – **удалите** его. - -> [!TIP] -> Наглядный пример настройки — [на видео](/videos/recipes-xray-setup-v2rayng.webm) - -### Шаг 1. Установите приложение - -- **Скачайте** v2rayNG с [официального репозитория](https://github.com/2dust/v2rayNG/releases). - Обычно нужен файл `v2rayNG_x.x.x_universal.apk`. -- **Установите** скачанный `.apk` файл на Android-устройство. - -### Шаг 2. Добавьте конфигурацию - -- **Откройте** приложение v2rayNG. -- **Нажмите** "+" в правом верхнем углу. -- **Выберите** `Import config from Clipboard` (предварительно **скопируйте** ссылку конфигурации в буфер обмена). - -### Шаг 3. Настройте правила маршрутизации - -- **Вернитесь** на главный экран приложения. -- **Нажмите** на "бургер-меню" (три полоски) в левом верхнем углу. -- **Выберите** `Routing Settings`. -- **Нажмите** на три точки в правом верхнем углу. -- **Выберите** `Import ruleset from clipboard` (предварительно **скопируйте** [JSON с правилами](#необходимые-данные)). -- **Нажмите** на Domain strategy и **выберите** `IPOnDemand`. - -### Шаг 4. Запустите подключение - -- **Вернитесь** на главный экран. -- **Нажмите** кнопку ▶ для запуска соединения. - -## Windows / MacOS / Linux (v2rayN) - -### Шаг 1. Установите приложение - -- **Скачайте** нужную версию приложения с [официального репозитория](https://github.com/2dust/v2rayN/releases): - - Windows: `v2rayN-windows-64-desktop.zip` - - Linux: `v2rayN-linux-64.zip` - - MacOS: `v2rayN-macos-arm64.dmg` - -> [!TIP] -> **Чтобы увидеть** все файлы для скачивания **нажмите** на ссылку под файлами. -> -> ![Показать все файлы для скачивания](/images/recipes-xray-setup-v2rayn-download.webp) - -#### Windows - -- **Распакуйте** файл `.zip` в любое удобное место. -![Контекстное меню – распаковать всё](/images/recipes-xray-setup-v2rayn-windows-unzip.webp) - -- **Переместите** распакованную папку в более естественное место – -**вырежте** папку. -![Вырезка распакованной папки](/images/recipes-xray-setup-v2rayn-windows-cut.webp) - -- Затем **вставьте** в папку `Документы`. - -![Вставка в папку Документы](/images/recipes-xray-setup-v2rayn-windows-paste.webp) - -- В перемещённой папке **будет** лежать `v2rayN` приложение. - -> [!TIP] -> **Чтобы не потерять** приложение – **отправьте** ярлык на Рабочий Стол. -> -> ![Отправить ярлык на Рабочий Стол](/images/recipes-xray-setup-v2rayn-windows-shortcut.webp) - -#### Linux - -Если вы **пользуетесь Linux**, я думаю, у вас достаточно знаний, чтобы **настроить всё самостоятельно**. - -В этом разделе будут рассмотрены **частые проблемы** и **пути их решения**. - -#### MacOS - -- **Откройте** файл `.dmg` и **перетащите** приложение в папку "Программы". -- **Откройте** терминал и **выполните** команду: - - ``` - sudo xattr -cr /Applications/v2rayN.app - ``` - -- После первого открытия, **Откройте** системные настройки: - - **Выберете** пункт `Privacy & Security` - - **Прокрутите** вниз до уведомления о блокировке "xray" - - **Нажмите** `Allow Anyway` - -### Шаг 2. Добавьте конфигурацию - -- **Откройте** v2rayN. -- **Нажмите** `Configurations` в левом верхнем углу окна. -- **Выберите** `Import Share Links from clipboard (Ctrl+V)` (предварительно **скопируйте** конфигурационную ссылку). - ![Импортирование Конфигурации](/images/recipes-xray-setup-v2rayn-import-config.webp) - -### Шаг 3. Настройте правила маршрутизации - -- **Перейдите** в `Settings` → `Routing Settings`. - ![Открытие Настроек Маршрутизации](/images/recipes-xray-setup-v2rayn-open-routing.webp) -- В открывшемся окне: - - **Нажмите** `Add` в верхнем левом углу. - - В новом окне в поле Remarks **введите** произвольное имя, например: "RU - Direct". - - В поле Domain strategy **выберите** `IPOnDemand`. - - В вверху окна **нажмите** `Import Rules From Clipboard` (предварительно **скопируйте** [JSON с правилами](#необходимые-данные)). - - В появившемся окне "Do you want to append rules? ..." – **нажмите** `No`. - ![Импортирование Правил Маршрутизации](/images/recipes-xray-setup-v2rayn-add-routing.webp) - - - **Нажимайте** `Confirm` до тех пор, пока не **вернётесь** в основной интерфейс. - -### Шаг 4. Запустите подключение - -- **Выберите** созданные правила маршрутизации из второго выпадающего списка снизу. - ![Выбор Правил Маршрутизации](/images/recipes-xray-setup-v2rayn-select-routing.webp) - -- **Нажмите** `Enable Tun` для запуска соединения (**следуйте** запросам v2rayN). - -## iOS / iPadOS (happ) - -### Шаг 1. Установите приложение - -- **Установите** _happ_ из [App Store](https://apps.apple.com/us/app/happ-proxy-utility/id6504287215). - -### Шаг 2. Добавьте конфигурацию - -- **Откройте** приложение. -- **Нажмите** "+" в правом верхнем углу. -- **Выберите** `Import from clipboard` (предварительно **скопируйте** ссылку конфигурации в буфер обмена). - -![Добавление конфигурации](/images/recipes-xray-setup-happ-import-config.webp) - -### Шаг 3. Откройте настройки роутинга - -- **Перейдите** по значку шестиренки в левом верхнем углу. -- **Выберите** `Routing Rules`. - -![Открытие настроек роутинга](/images/recipes-xray-setup-happ-open-routing.webp) - -### Шаг 4. Импортируйте роутинг - -- **Нажмите** `...` (три точки) в правом верхнем углу. -- **Выберите** `Import from clipboard` (предварительно **скопируйте** правила, см. ниже). - -> [!IMPORTANT] -> Формат правил отличается от v2rayN/v2rayNG! -> Эта строка - эквивалентна правилам сверху. -> -> ``` -> happ://routing/add/eyJEbnNIb3N0cyI6eyJkbnMuZ29vZ2xlIjoiOC44LjguOCIsImNsb3VkZmxhcmUtZG5zLmNvbSI6IjEuMS4xLjEifSwiQmxvY2tJcCI6W10sIkZha2VEbnMiOnRydWUsIlJlbW90ZUROU1R5cGUiOiJEb1UiLCJEb21lc3RpY0ROU0lwIjoiOC44LjguOCIsIkRpcmVjdFNpdGVzIjpbImRvbWFpbjpydSIsImRvbWFpbjpzdSIsImRvbWFpbjp2ay5jb20iLCJkb21haW46eWFuZGV4LmNvbSIsImdlb3NpdGU6cHJpdmF0ZSJdLCJHZW9pcFVybCI6Imh0dHBzOlwvXC9naXRodWIuY29tXC9Mb3lhbHNvbGRpZXJcL3YycmF5LXJ1bGVzLWRhdFwvcmVsZWFzZXNcL2xhdGVzdFwvZG93bmxvYWRcL2dlb2lwLmRhdCIsIkdsb2JhbFByb3h5Ijp0cnVlLCJEaXJlY3RJcCI6WyJnZW9pcDpydSIsImdlb2lwOnByaXZhdGUiXSwiUHJveHlTaXRlcyI6W10sIk5hbWUiOiJEZWZhdWx0IiwiR2Vvc2l0ZVVybCI6Imh0dHBzOlwvXC9naXRodWIuY29tXC9Mb3lhbHNvbGRpZXJcL3YycmF5LXJ1bGVzLWRhdFwvcmVsZWFzZXNcL2xhdGVzdFwvZG93bmxvYWRcL2dlb3NpdGUuZGF0IiwiQmxvY2tTaXRlcyI6W10sIkxhc3RVcGRhdGVkIjoxNzU5NDMxODk5LCJVc2VDaHVua0ZpbGVzIjp0cnVlLCJSZW1vdGVETlNEb21haW4iOiJodHRwczpcL1wvY2xvdWRmbGFyZS1kbnMuY29tXC9kbnMtcXVlcnkiLCJEb21haW5TdHJhdGVneSI6IklQSWZOb25NYXRjaCIsIkRvbWVzdGljRE5TRG9tYWluIjoiaHR0cHM6XC9cL2Rucy5nb29nbGVcL2Rucy1xdWVyeSIsIlJlbW90ZUROU0lwIjoiMS4xLjEuMSIsIlByb3h5SXAiOltdLCJEb21lc3RpY0ROU1R5cGUiOiJEb1UifQ== -> ``` - -![Импортирование правил](/images/recipes-xray-setup-happ-add-routing.webp) - -### Шаг 5. Роутинг установлен - -- **После** настройки роутинга, - содержимое экрана должно быть похоже на картинку снизу. -- **Вернитесь** на главный экран. -- **Нажмите** кнопку вкключения для запуска соединения. - -![Финальный экран](/images/recipes-xray-setup-happ-routing-final.webp)