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>
319 lines
12 KiB
Markdown
319 lines
12 KiB
Markdown
[](https://www.samba.org)
|
||
|
||
# Samba
|
||
|
||
Docker-контейнер для файлового сервера Samba.
|
||
|
||
## О форке
|
||
|
||
Этот репозиторий является форком проекта [dperson/samba](https://github.com/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 для мониторинга состояния
|
||
|
||
## Быстрый старт
|
||
|
||
### Запуск с настройками по умолчанию
|
||
|
||
```bash
|
||
docker run -it -p 139:139 -p 445:445 -d upagge/samba -p
|
||
```
|
||
|
||
### Запуск с локальным хранилищем
|
||
|
||
```bash
|
||
docker run -it --name samba -p 139:139 -p 445:445 \
|
||
-v /path/to/directory:/mount \
|
||
-d upagge/samba -p
|
||
```
|
||
|
||
### Запуск с docker-compose
|
||
|
||
```yaml
|
||
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'
|
||
```
|
||
|
||
## Конфигурация
|
||
|
||
### Справка по параметрам
|
||
|
||
```bash
|
||
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` | Путь к дополнительному конфиг-файлу |
|
||
|
||
## Примеры
|
||
|
||
### Установка часового пояса
|
||
|
||
```bash
|
||
docker run -it -e TZ=Europe/Moscow -p 139:139 -p 445:445 -d upagge/samba -p
|
||
```
|
||
|
||
### Создание пользователей и шар
|
||
|
||
```bash
|
||
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
|
||
|
||
```bash
|
||
docker run -it -p 139:139 -p 445:445 -d upagge/samba -p -t \
|
||
-u "macuser;password" \
|
||
-s "TimeMachine;/backup;no;no;no;macuser"
|
||
```
|
||
|
||
### Использование переменных окружения
|
||
|
||
```bash
|
||
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
|
||
|
||
```yaml
|
||
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`, поэтому секции шар ещё не существовали. Теперь порядок обработки исправлен.
|
||
|
||
Пример корректного использования:
|
||
|
||
```bash
|
||
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"
|
||
```
|
||
|
||
Или с переменными окружения:
|
||
|
||
```bash
|
||
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!`:
|
||
|
||
```bash
|
||
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`:
|
||
|
||
```bash
|
||
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
|
||
```
|
||
|
||
### Высокое потребление памяти
|
||
|
||
Ограничьте память контейнера:
|
||
|
||
```bash
|
||
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`:
|
||
|
||
```bash
|
||
smbclient -L \\localhost -U % -m SMB3
|
||
smbclient //localhost/share -U user -m SMB3
|
||
```
|
||
|
||
### NetBIOS не работает
|
||
|
||
При использовании `-n` или `NMBD` может потребоваться сетевой режим хоста:
|
||
|
||
```bash
|
||
docker run -it --network host \
|
||
-e NMBD=true \
|
||
-d upagge/samba -n -p \
|
||
-s "share;/data"
|
||
```
|
||
|
||
## Безопасность
|
||
|
||
- По умолчанию используется только SMB2/SMB3 (SMB1 отключён)
|
||
- Рекомендуется использовать сложные пароли
|
||
- Храните пароли в `.env` файле или секретах Docker
|
||
- Ограничивайте доступ к шарам конкретным пользователям
|
||
|
||
## Обратная связь
|
||
|
||
При возникновении проблем или вопросов создайте [issue на GitHub](https://github.com/upagge/samba/issues).
|