Файловый сервер на Samba.md
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -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"
|
||||
```
|
||||
|
||||
***
|
||||
## Мета информация
|
||||
|
||||
Reference in New Issue
Block a user