# Home Server Services

> **Home Server Services** - это полный набор сервисов в Docker для организации домашнего сервера!
>
> Главное - это **модульность** и **воспроизводимая установка**. Можно развернуть за 15 минут!

![](./screenshots/grafana.jpg)
![](./screenshots/portainer.jpg)

## Мой сервер:

- CheckWay POS88
  - [Intel Celeron J1900](https://technical.city/ru/cpu/Core-2-Duo-E8400-protiv-Celeron-J1900) @ 1.99GHz (64 bit)
  - 4Gb RAM
  - 120Gb SSD
  - Не греется, не шумит, мало потребляет
- Debian 13 (Trixie) Minimal
  - [Docker](https://www.docker.com/)
  - [Docker Compose](https://docs.docker.com/compose/)
  - Политика частоты работы CPU - `ondemand`

## Сервисы:

- [Portainer](./portainer/) - Управление контейнерами
- [Grafana](./grafana/) - Загруженность сервера
  - [Prometheus](./grafana/prometheus.yml)
  - [Node Exporter](./grafana/)
- [Proxy](./proxy/) - Reverse proxy
  - [Nginx](./proxy/nginx/)
  - [DDNS](./proxy/ddns/) - Автоматическое обновление DNS записей у регистратора [рег.ру](https://www.reg.ru)
  - Let's Encrypt - Автоматическое обновление SSL сертификатов на все домены
- [Samba](./samba/) - Сетевой диск
- [Syncthing](./syncthing/) - Синхронизация данных между устройствами
- [Transmission](./transmission/) - BitTorrent клиент
- [AutoSSH](./autossh/) - SSH тунель
- [Gitea](./gitea/) - Git-сервер
- [Cloud](./cloud/) - FileBrowser - веб-интерфейс для управления файлами
- [Matrix](./matrix/) - сервер Matrix
  - [Synapse](./matrix/create_config.sh) - Matrix сервер Synapse
  - [Element](./matrix/docker-compose.yml) - Matrix веб-клиент Element
- [Pi-hole](./pihole/) - DNS фильтр (блокировка рекламы, слежки, защита от атак)

## О проекте:

- **Полнофункциональный домашний сервер**
- **Все сервисы настроены через Docker Compose** для легкого управления и быстрого запуска
- **Мониторинг системы через Grafana** с готовыми дашбордами
- **Файловый сервер Samba** для доступа к файлам по сети
  - Открытый диск только на чтение
  - Доступ на запись только после авторизации
- **Синхронизация файлов** между устройствами через **Syncthing**
  - Постоянная точка синхронизации позволяет обмениваться файлами между устройствами, даже если они не бывают одновременно в сети - домашний сервер выступает посредником
- **BitTorrent клиент Transmission** с веб-интерфейсом
- **SSH туннелирование через AutoSSH**
  - Можно пробросить порт на удалённый VPS, автоматически переподключается при потере соединения
- **Nginx reverse proxy** для маршрутизации трафика к сервисам
  - Автоматическое получение и обновление SSL сертификатов через Let's Encrypt
  - Автоматическое обновление DNS записей у регистратора [рег.ру](https://www.reg.ru)
- **Git-сервер Gitea** для хостинга собственных репозиториев
- **FileBrowser** - веб-интерфейс для управления файлами через браузер
- **Matrix Synapse** - собственный сервер для мессенджера Matrix с веб-клиентом Element
- Блокировка рекламы, нежелательной слежки, частичная защита от атак с помощью **Pi-hole**
- Управление Docker через **Portainer с веб-интерфейсом**
- Скрипт для снижения энергопотребления
- Все **сервисы используют переменные окружения** для гибкой настройки и примеры конфигураций
- Автоматический перезапуск контейнеров при сбоях

## Подготовка:

- Купить белый IP адрес у провайдера
- В настройках роутера пробросить 80 и 443 порт на сервер
- Купить домен второго уровня у регистратора [рег.ру](https://www.reg.ru)
- [В настройках API рег.ру](https://www.reg.ru/user/account/settings/api/) добавить CIDR вашего провайдера (чтобы при смене IP наш скрипт смог обновить DNS записи)
- В настройках DNS-серверов зоны указать бесплатные DNS-серверы рег.ру: `ns1.reg.ru`, `ns2.reg.ru`

## Запуск:

### 1. Portainer

```bash
cd portainer
cp .env.example .env && vim .env
sudo docker compose up -d
```

### 2. Grafana

```bash
cd grafana
cp .env.example .env && vim .env
sudo docker compose up -d
```

### 3. AutoSSH

```bash
cd autossh
cp .env.example .env && vim .env
sudo docker compose up -d --build
```

### 4. Samba

```bash
cd samba
cp .env.example .env && vim .env
sudo docker compose up -d
```

### 5. Transmission

```bash
cd transmission
cp .env.example .env && vim .env
sudo docker compose up -d
```

### 6. Syncthing

```bash
cd syncthing
cp .env.example .env && vim .env
sudo docker compose up -d
```

### 7. Gitea

```bash
cd gitea
cp .env.example .env && vim .env
sudo docker compose up -d
```

> **Примечание:** Конфигурируется позже, уже в веб-форме.

### 8. Cloud (FileBrowser)

```bash
cd cloud
cp .env.example .env && vim .env
touch filebrowser.db
sudo docker compose up -d
```

### 9. Matrix

```bash
cd matrix
cp .env.example .env && vim .env
```

Создаём конфиг [по примеру](./matrix/create_config.sh). Меняем базу данных на PostgreSQL:

```yaml
database:
  name: psycopg2
  args:
    user: user
    password: passw0rd
    database: db
    host: matrix-db
    cp_min: 5
    cp_max: 10
```

Запускаем:

```bash
sudo docker compose up -d
```

Создаём пользователя [по примеру](./matrix/create_user.sh).

### 10. Pi-hole

```bash
cd pihole
cp .env.example .env && vim .env
sudo docker compose up -d
```

[Устанавливаем пароль](./pihole/set-password.sh) (оставить пустым для доступа без пароля)

В разделе Settings > DNS выбираем вышестоящие DNS сервер. Включаем сверху расширенные настройки и в блоке interface settings выбираем пункт `Permit all origins`. В разделе Lists добавляем [списки доменов для блокировки](./pihole/block-lists.txt). Затем обновляем их в Tools > Update Gravity. В настройках ПК (роутера) устанавливаем в качестве DNS наш сервер.

### 11. Nginx Reverse Proxy (Entrypoint)

```bash
cd proxy
cp .env.example .env && vim .env
```

Создаём конфиг для DynDNS:

```bash
cp ddns/domains.txt.example ddns/domains.txt && vim ddns/domains.txt
```

Нужно указать ресурсные записи `@` и `www` для доступа к домену второго уровня напрямую. Также нужно добавить домены 3-го уровня для: gitea, cloud (filebrowser), matrix server (synapse), matrix client (element).

В первый раз SSL сертификаты нужно создать вручную.

Запускаем DDNS скрипт и HTTP сервер для Let's Encrypt:

```bash
sudo docker compose -f init-compose.yml up -d --build
```

Проверяем по логам в portainer и в личном кабинете рег.ру что ресурсные записи обновились. Ожидаем пока DNS обновит информацию о наших поддоменах (занимает от 15 минут до 24 часов). Затем создаём SSL сертификаты на каждый домен(-ы) [по примеру](./proxy/create-first-cert-example.sh).

Настраиваем Nginx:

```bash
cd nginx/conf.d
cp default.conf.example default.conf
vim default.conf
```

Запускаем основной контейнер:

```bash
sudo docker compose -f init-compose.yml down
sudo docker compose up -d --build
```

## Использование:

#### После настройки и запуска внутренние сервисы доступны (по умолчанию) по следующим портам:

- **Grafana** — порт `3000`:
  ![](./screenshots/grafana.jpg)

- **Portainer** — порт `9000`:
  ![](./screenshots/portainer.jpg)

- **Transmission** — порт `9091`:
  ![](./screenshots/transmission.png)

- **Syncthing** — порт `8384`:
  ![](./screenshots/syncthing.png)

- **Pi-hole** — порт `8080`:
  ![](./screenshots/pihole.png)

#### Внешние сервисы запустятся на указанных в конфиге nginx поддоменах:

- **Gitea**
  ![](./screenshots/gitea.png)
- **Synapse и Element**
  |![](./screenshots/synapse.png)|![](./screenshots/element.png)|
  |-|-|
- **FileBrowser**
  ![](./screenshots/cloud.png)
