236 lines
11 KiB
Markdown
236 lines
11 KiB
Markdown
---
|
||
aliases:
|
||
tags:
|
||
- maturity/🌱
|
||
date: 2024-09-06
|
||
zero-link:
|
||
- "[[../../meta/zero/00 Snippets|00 Snippets]]"
|
||
parents:
|
||
- "[[../devops/docker/Полезные Docker образы|Полезные Docker образы]]"
|
||
linked:
|
||
---
|
||
Samba — свободное программное обеспечение для организации файлового сервера на базе протокола SMB/CIFS. С 1992 года обеспечивает безопасный и стабильный обмен файлами между всеми клиентами, использующими SMB/CIFS: Windows, macOS, Linux и другими.
|
||
|
||
## Особенности образа
|
||
- Базовый образ Alpine Linux (минимальный размер)
|
||
- Поддержка SMB2/SMB3 (SMB1 отключен по умолчанию)
|
||
- Поддержка Time Machine для macOS
|
||
- Встроенная корзина для удаленных файлов
|
||
- Оптимизированные настройки производительности
|
||
- Healthcheck для мониторинга состояния
|
||
|
||
## Быстрый старт
|
||
### Docker Compose
|
||
```yaml
|
||
services:
|
||
samba:
|
||
image: docker.struchkov.dev/samba:latest
|
||
restart: unless-stopped
|
||
container_name: samba
|
||
hostname: samba
|
||
ports:
|
||
- "139:139/tcp"
|
||
- "445:445/tcp"
|
||
volumes:
|
||
- ./data:/cloud
|
||
command: '-p -u "user1;pass1" -s "share;/cloud;yes;no;no;user1"'
|
||
```
|
||
|
||
### 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"'
|
||
```
|
||
|
||
## Параметры командной строки
|
||
| Флаг | Описание |
|
||
|------|----------|
|
||
| `-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"
|
||
```
|
||
|
||
***
|
||
## Мета информация
|
||
**Область**:: [[../../meta/zero/00 Snippets|00 Snippets]]
|
||
**Родитель**:: [[../devops/docker/Полезные Docker образы|Полезные Docker образы]]
|
||
**Источник**::
|
||
**Автор**::
|
||
**Создана**:: [[2024-09-06]]
|
||
### Дополнительные материалы
|
||
- [Исходный код проекта.](https://git.struchkov.dev/DockerFiles/samba) Форк, который я поддерживаю в актуальном состоянии.
|
||
- [Оригинальный репозиторий на GitHub.](https://github.com/dperson/samba) Не поддерживается и не обновляется.
|
||
- [Образ проекта в моем Nexus](https://nexus.struchkov.dev/#browse/browse:docker:v2%2Fsamba%2Ftags)
|
||
### Дочерние заметки
|
||
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|