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обязательноПуть к директории
browseyesВидна при обзоре сети (yes/no)
readonlyyesТолько чтение (yes/no)
guestyesРазрешить гостевой доступ (yes/no)
usersallСписок разрешенных пользователей (через запятую)
adminsnoneСписок администраторов шары (через запятую)
writelistПользователи с правом записи на RO-шаре
commentОписание шары

Формат параметра пользователя (-u)

-u "<name;password>[;ID;group;GID]"
ПолеОписание
nameИмя пользователя (обязательно)
passwordПароль (обязательно)
IDUID пользователя (опционально)
groupГруппа пользователя (опционально)
GIDGID группы (опционально)

Переменные окружения

Альтернатива параметрам командной строки. Для множественных значений используйте нумерацию: 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Разрешить широкие символические ссылки
USERIDUID для пользователя smbuser
GROUPIDGID для группы 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

Порты

ПортПротоколОписание
137UDPNetBIOS Name Service (только с -n)
138UDPNetBIOS Datagram Service (только с -n)
139TCPSMB over NetBIOS
445TCPSMB 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      # Сохранять версии при повторном удалении
  1. При удалении файл перемещается в .deleted в корне шары
  2. Структура директорий сохраняется: /share/docs/file.txt/share/.deleted/docs/file.txt
  3. При повторном удалении файла с тем же именем создаются версии: 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

Дополнительные материалы

Дочерние заметки