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"Мета информация
Область:: 00 Snippets
Родитель:: Полезные Docker образы
Источник::
Автор::
Создана:: 2024-09-06
Дополнительные материалы
- Исходный код проекта. Форк, который я поддерживаю в актуальном состоянии.
- Оригинальный репозиторий на GitHub. Не поддерживается и не обновляется.
- Образ проекта в моем Nexus