Problem: When using environment variables, GENERIC was processed before SHARE, so share sections didn't exist when -G options tried to modify them. Also, \s regex was not POSIX-compatible for Alpine/busybox. Changes: - Reorder env var processing: GLOBAL -> SHARE -> GENERIC - Replace \s with [[:space:]] in regex patterns - Add ^ anchor to sed append command - Add CHANGELOG.md documenting the fix - Update README.md (sync with Russian version) - Update README_RU.md with troubleshooting section 🤖 Generated with [Claude Code](https://claude.ai/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
12 KiB
Samba
Docker-контейнер для файлового сервера Samba.
О форке
Этот репозиторий является форком проекта dperson/samba, который давно не обновлялся. Данная версия содержит актуальную версию Samba для текущей версии Alpine Linux.
Версии Samba
Теги образа соответствуют версии Samba в контейнере. Используйте нужный тег для получения требуемой версии. Последняя стабильная версия всегда имеет тег latest, а версия в разработке — тег develop.
Версия Samba соответствует той, что доступна для установки в Alpine. Если новая версия Samba ещё не доступна в образе, это означает, что она ещё не обновлена в Alpine.
Что такое Samba?
С 1992 года Samba предоставляет безопасные, стабильные и быстрые службы файлов и печати для всех клиентов, использующих протокол SMB/CIFS: все версии DOS и Windows, OS/2, Linux и многие другие.
Возможности образа
- Базовый образ Alpine Linux (минимальный размер)
- Поддержка SMB2/SMB3 (SMB1 отключён по умолчанию)
- Поддержка Time Machine для macOS
- Встроенная корзина (recycle bin)
- Оптимизированные настройки производительности
- Healthcheck для мониторинга состояния
Быстрый старт
Запуск с настройками по умолчанию
docker run -it -p 139:139 -p 445:445 -d upagge/samba -p
Запуск с локальным хранилищем
docker run -it --name samba -p 139:139 -p 445:445 \
-v /path/to/directory:/mount \
-d upagge/samba -p
Запуск с docker-compose
services:
samba:
image: upagge/samba
restart: unless-stopped
ports:
- "139:139/tcp"
- "445:445/tcp"
volumes:
- /mnt/data:/share
command: '-s "Data;/share;yes;no;no" -u "user;password" -p'
Конфигурация
Справка по параметрам
docker run -it --rm upagge/samba -h
Параметры командной строки
| Параметр | Описание |
|---|---|
-h |
Показать справку |
-c "<from:to>" |
Настроить маппинг символов для имён файлов/директорий |
-g "<параметр>" |
Добавить глобальную опцию в smb.conf |
-G "<секция;параметр>" |
Добавить опцию в конкретную секцию smb.conf |
-i "<путь>" |
Импортировать файл smbpasswd |
-n |
Запустить демон nmbd для анонсирования шар |
-p |
Установить права владения и доступа на шарах |
-r |
Отключить корзину для шар |
-S |
Отключить минимальную версию SMB2 |
-t |
Включить поддержку Time Machine для macOS |
-s |
Настроить шару (см. формат ниже) |
-u |
Добавить пользователя (см. формат ниже) |
-w "<workgroup>" |
Настроить рабочую группу (домен) |
-W |
Разрешить широкие символические ссылки |
-I "<путь>" |
Добавить include в конец smb.conf |
Формат параметра шары (-s)
-s "<имя;/путь>[;browse;readonly;guest;users;admins;writelist;comment]"
| Поле | По умолчанию | Описание |
|---|---|---|
имя |
обязательно | Имя шары для клиентов |
/путь |
обязательно | Путь к директории шары |
browse |
yes | Видимость в сетевом окружении (yes/no) |
readonly |
yes | Только для чтения (yes/no) |
guest |
yes | Разрешить гостевой доступ (yes/no) |
users |
all | Список разрешённых пользователей (через запятую) |
admins |
none | Список администраторов шары (через запятую) |
writelist |
— | Пользователи с правом записи на RO-шаре |
comment |
— | Описание шары |
Формат параметра пользователя (-u)
-u "<имя;пароль>[;ID;группа;GID]"
| Поле | Описание |
|---|---|
имя |
Имя пользователя (обязательно) |
пароль |
Пароль пользователя (обязательно) |
ID |
UID пользователя (опционально) |
группа |
Группа пользователя (опционально) |
GID |
GID группы (опционально) |
Переменные окружения
| Переменная | Описание |
|---|---|
CHARMAP |
Маппинг символов |
GENERIC |
Опция для конкретной секции (поддерживает GENERIC2, GENERIC3...) |
GLOBAL |
Глобальная опция (поддерживает GLOBAL2, GLOBAL3...) |
IMPORT |
Путь к файлу smbpasswd для импорта |
NMBD |
Включить демон nmbd |
PERMISSIONS |
Установить права на шарах |
RECYCLE |
Отключить корзину |
SHARE |
Настройка шары (поддерживает SHARE2, SHARE3...) |
SMB |
Отключить минимальную версию SMB2 |
TIMEMACHINE |
Включить поддержку Time Machine |
TZ |
Часовой пояс (например, Europe/Moscow) |
USER |
Настройка пользователя (поддерживает USER2, USER3...) |
WIDELINKS |
Разрешить широкие символические ссылки |
WORKGROUP |
Рабочая группа |
USERID |
UID для пользователя smbuser |
GROUPID |
GID для группы smb |
INCLUDE |
Путь к дополнительному конфиг-файлу |
Примеры
Установка часового пояса
docker run -it -e TZ=Europe/Moscow -p 139:139 -p 445:445 -d upagge/samba -p
Создание пользователей и шар
docker run -it -p 139:139 -p 445:445 -d upagge/samba -p \
-u "user1;password1" \
-u "user2;password2" \
-s "public;/share;yes;no;yes" \
-s "users;/srv;no;no;no;user1,user2" \
-s "user1_private;/user1;no;no;no;user1" \
-s "user2_private;/user2;no;no;no;user2"
Включение Time Machine
docker run -it -p 139:139 -p 445:445 -d upagge/samba -p -t \
-u "macuser;password" \
-s "TimeMachine;/backup;no;no;no;macuser"
Использование переменных окружения
docker run -it -p 139:139 -p 445:445 \
-e SHARE="Data;/data;yes;no;no" \
-e SHARE2="Backup;/backup;yes;yes;no" \
-e USER="admin;secretpass" \
-e PERMISSIONS="true" \
-e TZ="Europe/Moscow" \
-v /mnt/data:/data \
-v /mnt/backup:/backup \
-d upagge/samba
Полный docker-compose.yml
services:
samba:
image: upagge/samba
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
deploy:
resources:
limits:
memory: 512M
healthcheck:
test: ["CMD", "smbclient", "-L", "\\\\localhost", "-U", "%", "-m", "SMB3"]
interval: 60s
timeout: 15s
start_period: 10s
retries: 3
Порты
| Порт | Протокол | Описание |
|---|---|---|
| 137 | UDP | NetBIOS Name Service (только с -n) |
| 138 | UDP | NetBIOS Datagram Service (только с -n) |
| 139 | TCP | SMB over NetBIOS |
| 445 | TCP | SMB напрямую |
Примечание: Порты 137 и 138 нужны только при использовании флага -n или переменной NMBD.
Решение проблем
Параметры -G для шар не переопределяют глобальные настройки
Если параметры -G для отдельных шар не переопределяют глобальные настройки force user и force group, убедитесь, что вы используете актуальную версию образа.
Проблема была исправлена: при использовании переменных окружения GENERIC обрабатывался до SHARE, поэтому секции шар ещё не существовали. Теперь порядок обработки исправлен.
Пример корректного использования:
docker run -it -p 139:139 -p 445:445 -d upagge/samba \
-s "public;/cloud/share;yes;no;yes" \
-G "public;force user = nobody" \
-G "public;force group = nogroup" \
-G "public;guest ok = yes" \
-G "public;read only = no"
Или с переменными окружения:
docker run -it -p 139:139 -p 445:445 \
-e SHARE="public;/cloud/share;yes;no;yes" \
-e GENERIC="public;force user = nobody" \
-e GENERIC2="public;force group = nogroup" \
-d upagge/samba
Ошибка "Access is denied"
Если вы получаете ошибку Access is denied или видите в логах change_to_user_internal: chdir_current_service() failed!:
docker run -it --name samba -p 139:139 -p 445:445 \
-v /path/to/directory:/mount \
-d upagge/samba -p
Добавьте флаг -p или установите переменную PERMISSIONS=true.
Если изменение прав невозможно, используйте переменные USERID и GROUPID:
docker run -it --name samba -p 139:139 -p 445:445 \
-e USERID=1000 \
-e GROUPID=1000 \
-v /path/to/directory:/mount \
-d upagge/samba
Высокое потребление памяти
Ограничьте память контейнера:
docker run -it --name samba -m 512m -p 139:139 -p 445:445 \
-v /path/to/directory:/mount \
-d upagge/samba -p
Подключение через smbclient
По умолчанию smbclient пытается использовать SMB1. Используйте флаг -m SMB3:
smbclient -L \\localhost -U % -m SMB3
smbclient //localhost/share -U user -m SMB3
NetBIOS не работает
При использовании -n или NMBD может потребоваться сетевой режим хоста:
docker run -it --network host \
-e NMBD=true \
-d upagge/samba -n -p \
-s "share;/data"
Безопасность
- По умолчанию используется только SMB2/SMB3 (SMB1 отключён)
- Рекомендуется использовать сложные пароли
- Храните пароли в
.envфайле или секретах Docker - Ограничивайте доступ к шарам конкретным пользователям
Обратная связь
При возникновении проблем или вопросов создайте issue на GitHub.
