Файловый сервер на Samba.md
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Struchkov Mark
2026-01-08 01:32:24 +03:00
parent 33df815996
commit fd2e2e8ab7

View File

@@ -9,51 +9,216 @@ parents:
- "[[../devops/docker/Полезные Docker образы|Полезные Docker образы]]"
linked:
---
Samba — это свободное программное обеспечение, позволяющее построить файловую помойку на базе SMB/CIFS.
Samba — свободное программное обеспечение для организации файлового сервера на базе протокола SMB/CIFS. С 1992 года обеспечивает безопасный и стабильный обмен файлами между всеми клиентами, использующими SMB/CIFS: Windows, macOS, Linux и другими.
Самый простой способ запустить файловый сервер, это использовать Docker-compose:
```docker-compose
samba:
## Особенности образа
- Базовый образ Alpine Linux (минимальный размер)
- Поддержка SMB2/SMB3 (SMB1 отключен по умолчанию)
- Поддержка Time Machine для macOS
- Встроенная корзина для удаленных файлов
- Оптимизированные настройки производительности
- Healthcheck для мониторинга состояния
## Быстрый старт
### Docker Compose
```yaml
services:
samba:
image: docker.struchkov.dev/samba:latest
restart: always
restart: unless-stopped
container_name: samba
hostname: samba
networks:
samba:
ports:
- 139:139
- 445:445
- 137:137/udp
- 138:138/udp
- "139:139/tcp"
- "445:445/tcp"
volumes:
- ./samba/:/cloud:z
command: '-r -n -p -u "user1;pass1" -u "user2;$pass2" -s "rootfolder1;/cloud/share;yes;no;yes;user1,user2" -s "rootfolder2;/cloud/upagge;yes;no;no;user1" -s "footfolter3;/cloud/hmnitessa;yes;no;no;user2"'
- ./data:/cloud
command: '-p -u "user1;pass1" -s "share;/cloud;yes;no;no;user1"'
```
**Параметры:**
- `-r` — Отключить корзину для расшаренных ресурсов.
- `-n` — Запустить демон nmbd для объявления расшаренных ресурсов.
- `-p` — Установить права собственности и разрешения на расшаренные ресурсы.
- `-u "<username;password>[;ID;group;GID]"` — Добавить пользователя.
• `<username>` — имя пользователя.
• `<password>` — пароль пользователя.
• `[ID]` — идентификатор пользователя.
• `[group]` — группа пользователя.
• `[GID]` — идентификатор группы.
- `-s "<name;/path>[;browse;readonly;guest;users;admins;writelist;comment]"` — Настроить расшаренный ресурс.
• `<name>` — имя, как будет отображаться для клиентов.
• `<path>` — путь к расшаренному ресурсу.
• `[browsable]` — по умолчанию: yes или no.
• `[readonly]` — по умолчанию: yes или no.
• `[users]` — разрешенные пользователи по умолчанию: all или список разрешенных пользователей.
• `[admins]` — администраторы по умолчанию: none или список администраторов.
• `[writelist]` — список пользователей, которые могут записывать в ресурс с только для чтения.
• `[comment]` — описание расшаренного ресурса.
### Docker Compose с NetBIOS
Если требуется обнаружение в сети через NetBIOS, добавьте флаг `-n` и порты 137-138/udp:
```yaml
services:
samba:
image: docker.struchkov.dev/samba:latest
restart: unless-stopped
ports:
- "139:139/tcp"
- "445:445/tcp"
- "137:137/udp"
- "138:138/udp"
volumes:
- ./data:/cloud
command: '-n -p -u "user1;pass1" -s "share;/cloud;yes;no;no;user1"'
```
**Доступные сборки Samba**:
- 4.20.6-r1
- 4.19.6-r0
- 4.18.9-r0
## Параметры командной строки
| Флаг | Описание |
|------|----------|
| `-h` | Показать справку |
| `-c "<from:to>"` | Настроить маппинг символов для имен файлов/директорий |
| `-g "<параметр>"` | Добавить глобальную опцию в smb.conf |
| `-G "<секция;параметр>"` | Добавить опцию в конкретную секцию smb.conf |
| `-i "<путь>"` | Импортировать файл smbpasswd |
| `-n` | Запустить демон nmbd для объявления шар в сети |
| `-p` | Установить владельца и права на расшаренные директории |
| `-r` | Отключить корзину для шар |
| `-S` | Отключить минимальную версию SMB2 (разрешить SMB1) |
| `-t` | Включить поддержку Time Machine для macOS |
| `-s` | Настроить шару (см. формат ниже) |
| `-u` | Добавить пользователя (см. формат ниже) |
| `-w "<workgroup>"` | Настроить рабочую группу (домен) |
| `-W` | Разрешить широкие символические ссылки |
| `-I "<путь>"` | Добавить include в конец smb.conf |
| `-E` | Включить усиленную безопасность (подпись + шифрование) |
### Формат параметра шары (-s)
```
-s "<name;/path>[;browse;readonly;guest;users;admins;writelist;comment]"
```
| Поле | По умолчанию | Описание |
|------|--------------|----------|
| `name` | обязательно | Имя шары для клиентов |
| `/path` | обязательно | Путь к директории |
| `browse` | yes | Видна при обзоре сети (yes/no) |
| `readonly` | yes | Только чтение (yes/no) |
| `guest` | yes | Разрешить гостевой доступ (yes/no) |
| `users` | all | Список разрешенных пользователей (через запятую) |
| `admins` | none | Список администраторов шары (через запятую) |
| `writelist` | — | Пользователи с правом записи на RO-шаре |
| `comment` | — | Описание шары |
### Формат параметра пользователя (-u)
```
-u "<name;password>[;ID;group;GID]"
```
| Поле | Описание |
|------|----------|
| `name` | Имя пользователя (обязательно) |
| `password` | Пароль (обязательно) |
| `ID` | UID пользователя (опционально) |
| `group` | Группа пользователя (опционально) |
| `GID` | GID группы (опционально) |
## Переменные окружения
Альтернатива параметрам командной строки. Для множественных значений используйте нумерацию: SHARE, SHARE2, SHARE3...
| Переменная | Описание |
|------------|----------|
| `SHARE` | Конфигурация шары (поддерживает SHARE2, SHARE3...) |
| `USER` | Конфигурация пользователя (поддерживает USER2, USER3...) |
| `GLOBAL` | Глобальная опция (поддерживает GLOBAL2, GLOBAL3...) |
| `GENERIC` | Опция для секции (поддерживает GENERIC2, GENERIC3...) |
| `CHARMAP` | Маппинг символов |
| `IMPORT` | Путь к файлу smbpasswd для импорта |
| `NMBD` | Включить демон nmbd |
| `PERMISSIONS` | Установить права на шары |
| `RECYCLE` | Отключить корзину |
| `SMB` | Отключить минимальную версию SMB2 |
| `TIMEMACHINE` | Включить поддержку Time Machine |
| `SECURE` | Включить усиленную безопасность |
| `WORKGROUP` | Рабочая группа |
| `WIDELINKS` | Разрешить широкие символические ссылки |
| `USERID` | UID для пользователя smbuser |
| `GROUPID` | GID для группы smb |
| `INCLUDE` | Путь к дополнительному конфиг-файлу |
| `TZ` | Часовой пояс (например, `Europe/Moscow`) |
### Пример с переменными окружения
```yaml
services:
samba:
image: docker.struchkov.dev/samba:latest
restart: unless-stopped
environment:
TZ: 'Europe/Moscow'
SHARE: "Documents;/documents;yes;no;no;user1,user2"
SHARE2: "Media;/media;yes;yes;yes"
USER: "user1;${SAMBA_USER1_PASSWORD}"
USER2: "user2;${SAMBA_USER2_PASSWORD}"
PERMISSIONS: "true"
ports:
- "139:139/tcp"
- "445:445/tcp"
volumes:
- /mnt/documents:/documents
- /mnt/media:/media
```
## Порты
| Порт | Протокол | Описание |
|------|----------|----------|
| 137 | UDP | NetBIOS Name Service (только с `-n`) |
| 138 | UDP | NetBIOS Datagram Service (только с `-n`) |
| 139 | TCP | SMB over NetBIOS |
| 445 | TCP | SMB direct |
Порты 137 и 138 нужны только при использовании флага `-n` или переменной `NMBD`.
## Time Machine для macOS
Для резервного копирования macOS через Time Machine:
```bash
docker run -d -p 139:139 -p 445:445 \
-v /mnt/backup:/backup \
docker.struchkov.dev/samba:latest -p -t \
-u "macuser;password" \
-s "TimeMachine;/backup;no;no;no;macuser"
```
## Усиленная безопасность
Для сред, требующих дополнительной защиты, используйте флаг `-E` или переменную `SECURE=true`:
```bash
docker run -d -p 445:445 docker.struchkov.dev/samba:latest -E -p \
-u "user;password" \
-s "secure_share;/data;yes;no;no;user"
```
Это включает:
- **Server signing** (mandatory) — предотвращает подмену пакетов
- **Client signing** (mandatory) — гарантирует подлинность клиента
- **SMB encryption** (desired) — шифрует трафик, если клиент поддерживает
**Примечание**: некоторые старые клиенты могут не поддерживать эти функции.
## Решение проблем
### Ошибка "Access is denied"
Если в логах `change_to_user_internal: chdir_current_service() failed!`:
```bash
docker run -d -p 139:139 -p 445:445 \
-v /path/to/directory:/mount \
docker.struchkov.dev/samba:latest -p
```
Добавьте флаг `-p` или переменную `PERMISSIONS=true`.
Если изменение прав невозможно, используйте `USERID` и `GROUPID`:
```bash
docker run -d -p 139:139 -p 445:445 \
-e USERID=1000 \
-e GROUPID=1000 \
-v /path/to/directory:/mount \
docker.struchkov.dev/samba:latest
```
### Подключение через smbclient
По умолчанию smbclient пытается использовать SMB1. Используйте флаг `-m SMB3`:
```bash
smbclient -L \\\\localhost -U % -m SMB3
smbclient //localhost/share -U user -m SMB3
```
### Параметры -G не переопределяют глобальные настройки
Убедитесь, что используете актуальную версию образа. В старых версиях `GENERIC` обрабатывался до `SHARE`, поэтому секции шар ещё не существовали.
Корректный пример:
```bash
docker run -d -p 139:139 -p 445:445 docker.struchkov.dev/samba:latest \
-s "public;/cloud/share;yes;no;yes" \
-G "public;force user = nobody" \
-G "public;force group = nogroup"
```
***
## Мета информация