Файловый сервер на 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 образы]]"
|
- "[[../devops/docker/Полезные Docker образы|Полезные Docker образы]]"
|
||||||
linked:
|
linked:
|
||||||
---
|
---
|
||||||
Samba — это свободное программное обеспечение, позволяющее построить файловую помойку на базе SMB/CIFS.
|
Samba — свободное программное обеспечение для организации файлового сервера на базе протокола SMB/CIFS. С 1992 года обеспечивает безопасный и стабильный обмен файлами между всеми клиентами, использующими SMB/CIFS: Windows, macOS, Linux и другими.
|
||||||
|
|
||||||
Самый простой способ запустить файловый сервер, это использовать Docker-compose:
|
## Особенности образа
|
||||||
```docker-compose
|
- Базовый образ Alpine Linux (минимальный размер)
|
||||||
|
- Поддержка SMB2/SMB3 (SMB1 отключен по умолчанию)
|
||||||
|
- Поддержка Time Machine для macOS
|
||||||
|
- Встроенная корзина для удаленных файлов
|
||||||
|
- Оптимизированные настройки производительности
|
||||||
|
- Healthcheck для мониторинга состояния
|
||||||
|
|
||||||
|
## Быстрый старт
|
||||||
|
### Docker Compose
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
samba:
|
samba:
|
||||||
image: docker.struchkov.dev/samba:latest
|
image: docker.struchkov.dev/samba:latest
|
||||||
restart: always
|
restart: unless-stopped
|
||||||
container_name: samba
|
container_name: samba
|
||||||
hostname: samba
|
hostname: samba
|
||||||
networks:
|
|
||||||
samba:
|
|
||||||
ports:
|
ports:
|
||||||
- 139:139
|
- "139:139/tcp"
|
||||||
- 445:445
|
- "445:445/tcp"
|
||||||
- 137:137/udp
|
|
||||||
- 138:138/udp
|
|
||||||
volumes:
|
volumes:
|
||||||
- ./samba/:/cloud:z
|
- ./data:/cloud
|
||||||
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"'
|
command: '-p -u "user1;pass1" -s "share;/cloud;yes;no;no;user1"'
|
||||||
```
|
```
|
||||||
|
|
||||||
**Параметры:**
|
### Docker Compose с NetBIOS
|
||||||
- `-r` — Отключить корзину для расшаренных ресурсов.
|
Если требуется обнаружение в сети через NetBIOS, добавьте флаг `-n` и порты 137-138/udp:
|
||||||
- `-n` — Запустить демон nmbd для объявления расшаренных ресурсов.
|
```yaml
|
||||||
- `-p` — Установить права собственности и разрешения на расшаренные ресурсы.
|
services:
|
||||||
- `-u "<username;password>[;ID;group;GID]"` — Добавить пользователя.
|
samba:
|
||||||
• `<username>` — имя пользователя.
|
image: docker.struchkov.dev/samba:latest
|
||||||
• `<password>` — пароль пользователя.
|
restart: unless-stopped
|
||||||
• `[ID]` — идентификатор пользователя.
|
ports:
|
||||||
• `[group]` — группа пользователя.
|
- "139:139/tcp"
|
||||||
• `[GID]` — идентификатор группы.
|
- "445:445/tcp"
|
||||||
- `-s "<name;/path>[;browse;readonly;guest;users;admins;writelist;comment]"` — Настроить расшаренный ресурс.
|
- "137:137/udp"
|
||||||
• `<name>` — имя, как будет отображаться для клиентов.
|
- "138:138/udp"
|
||||||
• `<path>` — путь к расшаренному ресурсу.
|
volumes:
|
||||||
• `[browsable]` — по умолчанию: ‘yes’ или ‘no’.
|
- ./data:/cloud
|
||||||
• `[readonly]` — по умолчанию: ‘yes’ или ‘no’.
|
command: '-n -p -u "user1;pass1" -s "share;/cloud;yes;no;no;user1"'
|
||||||
• `[users]` — разрешенные пользователи по умолчанию: ‘all’ или список разрешенных пользователей.
|
```
|
||||||
• `[admins]` — администраторы по умолчанию: ‘none’ или список администраторов.
|
|
||||||
• `[writelist]` — список пользователей, которые могут записывать в ресурс с только для чтения.
|
|
||||||
• `[comment]` — описание расшаренного ресурса.
|
|
||||||
|
|
||||||
**Доступные сборки 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