18 KiB
aliases, tags, date, zero-link, parents, linked
| aliases | tags | date | zero-link | parents | linked | |||
|---|---|---|---|---|---|---|---|---|
|
2024-09-06 |
|
|
Samba — свободное программное обеспечение для организации файлового сервера на базе протокола SMB/CIFS. С 1992 года обеспечивает безопасный и стабильный обмен файлами между всеми клиентами, использующими SMB/CIFS: Windows, macOS, Linux и другими.
Особенности образа
- Базовый образ Alpine Linux (минимальный размер)
- Поддержка SMB2/SMB3 (SMB1 отключен по умолчанию)
- Поддержка Time Machine для macOS
- Встроенная корзина для удаленных файлов
- Оптимизированные настройки производительности
- Healthcheck для мониторинга состояния
Быстрый старт
Docker Compose
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:
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) |
RECYCLE_AGE |
Автоочистка файлов старше N дней из корзины |
RECYCLE_CRON_HOUR |
Час запуска очистки (0-23, по умолчанию: 3) |
RECYCLE_CRON_MINUTE |
Минута запуска очистки (0-59, по умолчанию: 0) |
Пример с переменными окружения
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:
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:
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) — шифрует трафик, если клиент поддерживает
Примечание: некоторые старые клиенты могут не поддерживать эти функции.
Корзина (Recycle Bin)
По умолчанию в образе включена корзина. При удалении файлы перемещаются в папку .deleted в корне каждой шары вместо окончательного удаления.
Как работает
vfs objects = catia recycle
recycle:keeptree = yes # Сохранять структуру папок
recycle:maxsize = 0 # Без лимита размера (0 = любой файл)
recycle:repository = .deleted # Папка для удалённых файлов
recycle:versions = yes # Сохранять версии при повторном удалении
- При удалении файл перемещается в
.deletedв корне шары - Структура директорий сохраняется:
/share/docs/file.txt→/share/.deleted/docs/file.txt - При повторном удалении файла с тем же именем создаются версии:
file.txt,Copy #1 of file.txtи т.д.
Автоматическая очистка
Важно: без очистки удалённые файлы накапливаются бесконечно и занимают место на диске.
Включите автоматическую очистку через переменную RECYCLE_AGE:
services:
samba:
image: docker.struchkov.dev/samba:latest
environment:
RECYCLE_AGE: "30" # Удалять файлы старше 30 дней
RECYCLE_CRON_HOUR: "4" # Запуск в 4:00 (опционально, по умолчанию: 3)
RECYCLE_CRON_MINUTE: "30" # Запуск в XX:30 (опционально, по умолчанию: 0)
# ... остальная конфигурация
Задача очистки:
- Запускается ежедневно в указанное время (по умолчанию 3:00)
- Активируется только если корзина включена (нет флага
-r) - Логи пишутся в
/var/log/recycle-cleanup.log
Отключение корзины
Используйте флаг -r или RECYCLE=true для полного отключения корзины:
docker run -d docker.struchkov.dev/samba:latest -r -p -s "share;/data"
Рекомендуется отключать для:
- Хранения больших медиа-файлов (видео, музыка)
- Ограниченного места на диске
- Временных или кэш-директорий
Полезные глобальные опции
Через флаг -g можно настроить дополнительные параметры smb.conf:
| Опция | Описание |
|---|---|
workgroup = WORKGROUP |
Рабочая группа Windows |
server string = Samba Server |
Описание сервера в сети |
netbios name = SAMBA |
Имя сервера в сети NetBIOS |
map to guest = Bad User |
Автоматически подключать как гостя при неверном логине |
guest account = nobody |
Системный пользователь для гостевых подключений |
local master = yes |
Участвовать в выборах мастер-браузера |
preferred master = yes |
Предпочтительный мастер-браузер |
os level = 20 |
Приоритет в выборах мастер-браузера (выше = приоритетнее) |
wins support = yes |
Включить WINS-сервер для разрешения имен |
name resolve order = bcast host |
Порядок разрешения имен |
Гостевые шары с принудительным пользователем
Для публичных папок без авторизации используйте комбинацию параметров шары и опций -G:
-s "public;/cloud/share;yes;no;yes" \
-G "public;force user = nobody" \
-G "public;force group = nobody" \
-G "public;guest only = yes"
Это гарантирует, что все операции выполняются от имени nobody, независимо от того, кто подключился.
Комплексный пример
Сервер с гостевыми и приватными шарами, обнаружением в сети и ограничением ресурсов:
services:
samba:
image: docker.struchkov.dev/samba:latest
restart: always
container_name: samba
hostname: samba
network_mode: host
volumes:
- ./storage/samba/:/cloud:z
command: >
-r -n -p
-g "workgroup = WORKGROUP"
-g "server string = Samba Server"
-g "netbios name = SAMBA"
-g "map to guest = Bad User"
-g "guest account = nobody"
-g "local master = yes"
-g "preferred master = yes"
-g "os level = 20"
-g "wins support = yes"
-g "name resolve order = bcast host"
-u "user1;${SMB_USER1}"
-u "user2;${SMB_USER2}"
-s "shared;/cloud/share;yes;no;yes"
-G "shared;force user = nobody"
-G "shared;force group = nobody"
-G "shared;guest only = yes"
-s "media;/cloud/media;yes;no;yes"
-G "media;force user = nobody"
-G "media;force group = nobody"
-G "media;guest only = yes"
-s "user1;/cloud/user1;yes;no;no;user1"
-s "user2;/cloud/user2;yes;no;no;user1,user2"
healthcheck:
test: ["CMD-SHELL", "smbclient -L localhost -N || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
mem_limit: 256m
mem_reservation: 64m
cpus: 0.5
Особенности конфигурации:
network_mode: host— необходим для корректной работы NetBIOS и обнаружения в локальной сети-r— отключена корзина (для экономии места)- Гостевые шары (
shared,media) доступны без авторизации - Приватные шары (
user1,user2) доступны только указанным пользователям - Пароли вынесены в переменные окружения через
.envфайл - Ограничение памяти и CPU для предсказуемого потребления ресурсов
Healthcheck
Для мониторинга состояния контейнера:
healthcheck:
test: ["CMD-SHELL", "smbclient -L localhost -N || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
Проверяет доступность SMB-сервера через анонимное подключение.
Ограничение ресурсов
Samba может потреблять много памяти при большом количестве подключений. Рекомендуется ограничить:
mem_limit: 256m # Жесткий лимит памяти
mem_reservation: 64m # Гарантированный минимум
cpus: 0.5 # Лимит CPU (0.5 = половина ядра)
Решение проблем
Ошибка "Access is denied"
Если в логах change_to_user_internal: chdir_current_service() failed!:
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:
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:
smbclient -L \\\\localhost -U % -m SMB3
smbclient //localhost/share -U user -m SMB3
Параметры -G не переопределяют глобальные настройки
Убедитесь, что используете актуальную версию образа. В старых версиях GENERIC обрабатывался до SHARE, поэтому секции шар ещё не существовали.
Корректный пример:
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 Родитель:: ../devops/docker/Полезные Docker образы Источник:: Автор:: Создана:: 2024-09-06
Дополнительные материалы
- Исходный код проекта. Форк, который я поддерживаю в актуальном состоянии.
- Оригинальный репозиторий на GitHub. Не поддерживается и не обновляется.
- Образ проекта в моем Nexus