# Основы

# Пользователи, права и настройка рабочих мест

<div id="bkmrk-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B%3A-%D0%A0" style="background-color: #e3f2fd; border-left: 4px solid #2196f3; padding: 15px; margin: 15px 0; border-radius: 4px; font-family: sans-serif; line-height: 1.6;"> **Описание страницы:** Руководство для администратора по добавлению пользователей в Gitea и инструкция по настройке рабочих окружений (MobaXterm, PowerShell, Notepad++). </div>## 👤 1. Управление пользователями и правами (для Администратора)

### Создание учетной записи

В веб-интерфейсе Gitea под учетной записью администратора:

1. Перейдите в **Панель администратора** → вкладка **Пользователи** → кнопка **Создать пользователя**.
2. Заполните данные сотрудника (например, имя пользователя: `ivanov`).
3. Укажите временный пароль и активируйте опцию `Требовать смену пароля при следующем входе`.

### Предоставление прав к репозиторию

По умолчанию приватные репозитории скрыты от новых пользователей. Чтобы выдать доступ:

1. Откройте нужный репозиторий (например, `infra`) → перейдите в **Settings** (Настройки) → **Access Management** (Управление доступом).
2. В поле **Add Collaborator** введите имя сотрудника и выберите уровень прав (обычно **Write** для возможности отправки изменений).

## 🖥️ 2. Настройка рабочей машины пользователя

### Вариант А: Работа через MobaXterm (рекомендуется для Linux-окружения)

Откройте локальный терминал (Local Terminal) в MobaXterm и выполните команды:

```

# 1. Создание папки для SSH-ключей, если она отсутствует
mkdir -p ~/.ssh

# 2. Генерация пары SSH-ключей без пароля доступа
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_gitea -C "workstation@gitea" -N ""

# 3. Вывод публичной части ключа (скопируйте его полностью)
cat ~/.ssh/id_ed25519_gitea.pub
```

Добавьте скопированный ключ в профиль Gitea пользователя: **Настройки** → **SSH / GPG ключи** → **Добавить ключ**.

Настройте файл конфигурации SSH на рабочей машине для автоматического использования этого ключа:

```

# Создание конфигурационного файла SSH
cat >> ~/.ssh/config << 'EOF'
Host gitea-lab
    HostName 10.177.178.60
    User git
    Port 222
    IdentityFile ~/.ssh/id_ed25519_gitea
    IdentitiesOnly yes
    StrictHostKeyChecking no
EOF
<h1 id="bkmrk-%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D1%8B%D1%85">Установка безопасных прав на конфигурацию</h1>
<p>chmod 600 ~/.ssh/config
</p>
```

### Вариант Б: Работа через Windows PowerShell

Установите **Git for Windows** и выполните в PowerShell:

```

# Настройка глобальных параметров Git для подписи коммитов
git config --global user.name "Ivanov Ivan"
git config --global user.email "ivanov@company.local"
<h1 id="bkmrk-%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F-ssh-%D0%BA%D0%BB%D1%8E%D1%87%D0%B0">Генерация SSH-ключа</h1>
<p>mkdir -Force ~/.ssh
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_gitea -C "ivanov@workstation" -N ""</p>
<h1 id="bkmrk-%D0%92%D1%8B%D0%B2%D0%BE%D0%B4-%D0%BF%D1%83%D0%B1%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BA%D0%BB%D1%8E">Вывод публичного ключа для добавления в веб-интерфейс Gitea</h1>
<p>Get-Content ~/.ssh/id_ed25519_gitea.pub
</p>
```

### Вариант В: Работа по HTTPS с токеном доступа

<div id="bkmrk-%E2%9A%A0%EF%B8%8F-%D0%92%D0%B0%D0%B6%D0%BD%D0%BE%3A-%D0%9D%D0%B5-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7" style="background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 12px; margin: 15px 0; border-radius: 4px; font-family: sans-serif; font-size: 0.95em; line-height: 1.6;"> ⚠️ **Важно:** Не используйте классический пароль от аккаунта для авторизации в консоли. Сгенерируйте **Токен доступа (Access Token)** в настройках вашего аккаунта Gitea. </div>```

# Включение безопасного хранения паролей и токенов в системном менеджере Windows
git config --global credential.helper manager
<h1 id="bkmrk-%D0%9A%D0%BB%D0%BE%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82">Клонирование репозитория по HTTPS</h1>
<p>git clone https://10.177.178.60:3000/admold/infra.git</p>
<h1 id="bkmrk-%D0%9F%D1%80%D0%B8-%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%BC-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B5-%D1%83">При первом запросе учетных данных введите свой логин, а вместо пароля вставьте токен доступа.</h1>
```

## ✏️ 3. Интеграция с Notepad++

### Настройка отступов для корректного синтаксиса YAML (Ansible)

Ansible критичен к отступам. Настройте Notepad++ перед началом работы:

1. Перейдите в меню: **Опции (Settings)** → **Настройки (Preferences...)** → пункт **Язык (Language)**.
2. В списке языков выберите **YAML**.
3. Установите галочку ✅ **Заменять пробелом (Replace by space)**.
4. Размер табуляции (Tab size) установите равным **2**.

### Алиас edit в MobaXterm (с автоматическим преобразованием путей и фоновым режимом)

Чтобы файлы открывались в Notepad++ из консоли MobaXterm без блокировки ввода терминала:

```

# 1. Откройте файл конфигурации оболочки в MobaXterm
nano ~/.bashrc
<h1 id="bkmrk-2.-%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D1%8C%D1%82%D0%B5-%D0%B2-%D0%BA%D0%BE%D0%BD%D0%B5%D1%86-">2. Добавьте в конец файла функцию (cygpath переведет Unix-путь в понятный для Windows формат, а символ & запустит редактор на фоне):</h1>
<p>edit() { "/drives/c/Program Files/Notepad++/notepad++.exe" "$(cygpath -w "$1")" & }</p>
<h1 id="bkmrk-3.-%D0%A1%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82%D0%B5-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD">3. Сохраните изменения (Ctrl+O -> Enter -> Ctrl+X) и примените их в сессии:</h1>
<p>source ~/.bashrc
</p>
```

### Алиас edit в стандартном Windows PowerShell

Если вы работаете в стандартном терминале Windows без MobaXterm:

```

# 1. Откройте профиль пользователя PowerShell (он автоматически создастся, если его нет)
if (!(Test-Path $PROFILE)) { New-Item -Type File -Path $PROFILE -Force }; notepad $PROFILE
<h1 id="bkmrk-2.-%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D1%8C%D1%82%D0%B5-%D0%B2-%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D0%B2">2. Добавьте в открывшийся текстовый файл следующие строки и сохраните его:</h1>
<p>function Edit-File { param($path) & "C:\Program Files\Notepad++\notepad++.exe" $path }
Set-Alias edit Edit-File</p>
<h1 id="bkmrk-3.-%D0%9F%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D0%B5-pow">3. Перезапустите PowerShell. Теперь команда "edit файл.yml" будет открывать его в Notepad++.</h1>
```

# Справочник базовых команд Git (Cheat Sheet)

<div id="bkmrk-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B%3A-%D0%9A" style="background-color: #e3f2fd; border-left: 4px solid #2196f3; padding: 15px; margin: 15px 0; border-radius: 4px; font-family: sans-serif; line-height: 1.6;"> **Описание страницы:** Карманный справочник по основным командам Git, сгруппированный по этапам работы системного администратора. </div>## 📁 1. Инициализация и клонирование репозиториев

```

# Клонирование удаленного репозитория в текущую папку
git clone gitea-lab:admold/infra.git

# Клонирование репозитория в конкретную папку с указанием пути
git clone gitea-lab:admold/infra.git ~/projects/ansible

# Быстрое клонирование без истории коммитов (полезно для CI/CD-пайплайнов)
git clone --depth 1 gitea-lab:admold/infra.git

# Инициализация нового пустого Git-репозитория в текущей локальной папке
git init
```

## 🔍 2. Просмотр текущего состояния и истории изменений

```

# Просмотр статуса рабочей копии (измененные, удаленные, неотслеживаемые файлы)
git status

# Просмотр статуса в кратком компактном виде
git status -s

# Сравнение изменений в файлах, которые еще не добавлены в индекс (staged)
git diff

# Сравнение изменений в конкретном файле
git diff playbooks/site.yml

# Просмотр истории изменений (коммитов)
git log

# Краткий просмотр последних 5 коммитов (в одну строку каждый)
git log -5 --oneline
```

## ✏️ 3. Фиксация и отправка изменений (Commit &amp; Push)

```

# Добавление конкретного файла в индекс для последующего коммита
git add playbooks/site.yml

# Добавление всех изменений в отслеживаемых файлах (без добавления новых неотслеживаемых)
git add -u

# Фиксация изменений с кратким комментарием
git commit -m "fix: update configurations for backup paths"

# Отправка локальных изменений на удаленный сервер в ветку main
git push origin main
```

## 🌿 4. Ветки (Branches) и слияния

```

# Просмотр списка всех локальных веток
git branch

# Создание новой ветки и автоматический переход на неё
git switch -c feature/monitoring

# Переключение на существующую ветку
git switch main

# Слияние изменений из ветки feature/monitoring в текущую активную ветку
git merge feature/monitoring

# Удаление локальной ветки после завершения работ
git branch -d feature/monitoring
```

## 🔄 5. Отмена изменений и откат состояний

```

# Сброс изменений в файле до состояния последнего коммита
git restore playbooks/site.yml

# Сброс файла из подготовленной зоны (staged) обратно в измененные
git restore --staged playbooks/site.yml

# Откат последнего коммита с сохранением изменений в файлах
git reset --soft HEAD~1

# Полный откат последнего коммита с УДАЛЕНИЕМ всех изменений в файлах (опасно!)
git reset --hard HEAD~1

# Безопасная отмена уже отправленного на сервер коммита (создает новый коммит-отмену)
git revert a1b2c3d --no-edit
```

## 📦 6. Временное сохранение изменений (Stash)

```

# Спрятать все незакоммиченные изменения в специальный карман (чтобы очистить рабочую копию)
git stash

# Вернуть сохраненные изменения обратно в рабочую копию и удалить запись из кармана
git stash pop
```

# Практические кейсы и ежедневные сценарии

<div id="bkmrk-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B%3A-%D0%A8" style="background-color: #e3f2fd; border-left: 4px solid #2196f3; padding: 15px; margin: 15px 0; border-radius: 4px; font-family: sans-serif; line-height: 1.6;"> **Описание страницы:** Шаблоны действий в стандартных ситуациях администрирования инфраструктуры через Git. </div>## 🔧 Сценарий 1: Редактирование существующего файла конфигурации

<div id="bkmrk-%F0%9F%8E%AF-%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%3A-%D0%9D%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D0%BE" style="background-color: #e8f5e9; border-left: 4px solid #4caf50; padding: 12px; margin: 15px 0; border-radius: 4px; font-family: sans-serif; line-height: 1.6;"> **🎯 Задача:** Необходимо изменить существующий плейбук `playbooks/site.yml` (например, скорректировать пути бэкапов) и зафиксировать это в истории. </div>**1. Перейдите в каталог репозитория и обновите файлы до актуального состояния:**

```

cd ~/projects/infra
git pull origin main
```

**2. Откройте файл в вашем текстовом редакторе для внесения изменений:**

```

# Введите команду редактирования (например, "nano" или ваш настроенный alias "edit" для Notepad++)
edit playbooks/site.yml
```

**3. Сохраните изменения, вернитесь в консоль и зафиксируйте их:**

```

# Проверьте, какие файлы были изменены
git status -s
<h1 id="bkmrk-%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D1%8C%D1%82%D0%B5-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-">Добавьте измененный файл в индекс</h1>
<p>git add playbooks/site.yml</p>
<h1 id="bkmrk-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%B9%D1%82%D0%B5-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82-%D1%81-%D0%BF%D0%BE">Создайте коммит с понятным описанием изменений</h1>
<p>git commit -m "fix: update backup paths in site.yml"</p>
<h1 id="bkmrk-%D0%9E%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D1%8C%D1%82%D0%B5-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82-%D0%BD%D0%B0-">Отправьте коммит на сервер Gitea</h1>
<p>git push origin main
</p>
```

---

## 📦 Сценарий 2: Создание новой роли/файла (Работа с Untracked-файлами)

<div id="bkmrk-%F0%9F%8E%AF-%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%3A-%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%B2" style="background-color: #e8f5e9; border-left: 4px solid #4caf50; padding: 12px; margin: 15px 0; border-radius: 4px; font-family: sans-serif; line-height: 1.6;"> **🎯 Задача:** Добавить в структуру репозитория совершенно новый файл роли `roles/nginx/tasks/main.yml`. </div>**1. Создайте структуру каталогов и откройте новый файл в редакторе:**

```

mkdir -p roles/nginx/tasks
edit roles/nginx/tasks/main.yml
```

**2. Начните отслеживание нового файла в Git:**

<div id="bkmrk-%E2%9A%A0%EF%B8%8F-%D0%91%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C%3A-%D0%9D%D0%B5-" style="background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 12px; margin: 15px 0; border-radius: 4px; font-family: sans-serif; font-size: 0.95em; line-height: 1.6;"> ⚠️ **Безопасность:** Не используйте команду `git add .` в корневом каталоге. Она может случайно захватить временные лог-файлы или незашифрованные файлы секретов. Добавляйте новые файлы точечно, прописывая к ним явные пути. </div>```

# Проверьте статус (файл должен находиться в категории Untracked)
git status
<h1 id="bkmrk-%D0%AF%D0%B2%D0%BD%D0%BE-%D1%83%D0%BA%D0%B0%D0%B6%D0%B8%D1%82%D0%B5-git-%D0%BD%D0%B0%D1%87">Явно укажите Git начать отслеживание этого файла</h1>
<p>git add roles/nginx/tasks/main.yml</p>
<h1 id="bkmrk-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%B9%D1%82%D0%B5-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82-%D0%B8-%D0%BE%D1%82">Создайте коммит и отправьте его на сервер</h1>
<p>git commit -m "feat: add basic task layout for nginx role"
git push origin main
</p>
```

---

## 🌿 Сценарий 3: Изолированное тестирование рискованных изменений

<div id="bkmrk-%F0%9F%8E%AF-%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%3A-%D0%9D%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D0%BE-1" style="background-color: #e8f5e9; border-left: 4px solid #4caf50; padding: 12px; margin: 15px 0; border-radius: 4px; font-family: sans-serif; line-height: 1.6;"> **🎯 Задача:** Необходимо провести глобальный рефакторинг конфигурационных файлов серверов, но так, чтобы не сломать стабильную ветку `main`, с которой работают остальные члены команды. </div>**1. Создайте изолированную экспериментальную ветку и перейдите на неё:**

```

# Переключитесь на актуальную версию ветки main
git switch main
git pull origin main
<h1 id="bkmrk-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%B9%D1%82%D0%B5-%D0%B2%D0%B5%D1%82%D0%BA%D1%83-%D1%8D%D0%BA%D1%81%D0%BF%D0%B5">Создайте ветку эксперимента</h1>
<p>git switch -c experiment/global-refactor
</p>
```

**2. Отредактируйте файлы и зафиксируйте изменения локально:**

```

# Откройте плейбук для внесения тестовых изменений
edit playbooks/base_setup.yml
<h1 id="bkmrk-%D0%A2%D0%B0%D0%BA-%D0%BA%D0%B0%D0%BA-%D0%BC%D1%8B-%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D1%81%D1%8F">Так как мы находимся в изолированной ветке, мы можем безопасно добавить изменения измененных файлов</h1>
<p>git add -u
git commit -m "refactor: apply experimental directory structuring"
</p>
```

**3. Примите решение по результатам тестирования:**

<span style="display: inline-block; padding: 3px 8px; border-radius: 4px; font-size: 0.85em; font-weight: bold; margin-right: 5px; background-color: #28a745; color: white;">ВАРИАНТ А</span> Эксперимент удался. Вливаем изменения в основную ветку:

```

# Вернитесь в ветку main
git switch main
<h1 id="bkmrk-%D0%A1%D0%BB%D0%B5%D0%B9%D1%82%D0%B5-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D0%B7-">Слейте изменения из экспериментальной ветки в основную</h1>
<p>git merge experiment/global-refactor</p>
<h1 id="bkmrk-%D0%9E%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D1%8C%D1%82%D0%B5-%D0%BE%D0%B1%D1%8A%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%BD">Отправьте объединенный результат на сервер</h1>
<p>git push origin main
</p>
```

<span style="display: inline-block; padding: 3px 8px; border-radius: 4px; font-size: 0.85em; font-weight: bold; margin-right: 5px; background-color: #dc3545; color: white;">ВАРИАНТ Б</span> Эксперимент провалился. Безболезненно удаляем ветку:

```

# Вернитесь на стабильную ветку main
git switch main
<h1 id="bkmrk-%D0%9F%D1%80%D0%B8%D0%BD%D1%83%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE-%D1%83%D0%B4%D0%B0%D0%BB%D0%B8%D1%82">Принудительно удалите испорченную ветку эксперимента</h1>
<p>git branch -D experiment/global-refactor
</p>
```

---

## 💥 Сценарий 4: Разрешение конфликтов при попытке слияния

<div id="bkmrk-%F0%9F%8E%AF-%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%3A-%D0%9F%D1%80%D0%B8-%D0%BF%D0%BE%D0%BF%D1%8B%D1%82%D0%BA" style="background-color: #e8f5e9; border-left: 4px solid #4caf50; padding: 12px; margin: 15px 0; border-radius: 4px; font-family: sans-serif; line-height: 1.6;"> **🎯 Задача:** При попытке обновиться через `git pull` или выполнить `merge`, консоль выдала ошибку "CONFLICT (content): Merge conflict in playbooks/site.yml". </div>**1. Локализуйте конфликтный файл:**

```

git status
# Ищите пометку "both modified: playbooks/site.yml"
```

**2. Откройте этот файл в текстовом редакторе:**

```

edit playbooks/site.yml
```

**3. Найдите в тексте разделительные маркеры Git:**

```

<<<<<<< HEAD
Ваша локальная версия (то, что было у вас на компьютере)
=======
Удаленная версия (то, что кто-то уже успел отправить на Gitea)
>>>>>>> a1b2c3d4...
```

**4. Отредактируйте конфликтную область:**  
Удалите маркеры конфликта (`&lt;&lt;&lt;&lt;&lt;&lt;&lt;`, `=======`, `&gt;&gt;&gt;&gt;&gt;&gt;&gt;`) и оставьте только правильную логику (возможно, объединив обе версии).

**5. Зафиксируйте успешное решение конфликта в репозитории:**

```

# Сообщите Git, что конфликт решен
git add playbooks/site.yml
<h1 id="bkmrk-%D0%97%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B8%D1%82%D0%B5-%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8E-%D1%81">Завершите операцию слияния</h1>
<p>git commit -m "merge: resolve conflicts in site.yml"
</p>
```