Файловый сервер на Samba.md
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Struchkov Mark
2026-01-08 01:51:51 +03:00
parent fd2e2e8ab7
commit 1027f5ccb2

View File

@@ -126,6 +126,9 @@ services:
| `GROUPID` | GID для группы smb |
| `INCLUDE` | Путь к дополнительному конфиг-файлу |
| `TZ` | Часовой пояс (например, `Europe/Moscow`) |
| `RECYCLE_AGE` | Автоочистка файлов старше N дней из корзины |
| `RECYCLE_CRON_HOUR` | Час запуска очистки (0-23, по умолчанию: 3) |
| `RECYCLE_CRON_MINUTE` | Минута запуска очистки (0-59, по умолчанию: 0) |
### Пример с переменными окружения
```yaml
@@ -183,6 +186,156 @@ docker run -d -p 445:445 docker.struchkov.dev/samba:latest -E -p \
**Примечание**: некоторые старые клиенты могут не поддерживать эти функции.
## Корзина (Recycle Bin)
По умолчанию в образе включена корзина. При удалении файлы перемещаются в папку `.deleted` в корне каждой шары вместо окончательного удаления.
### Как работает
```ini
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`:
```yaml
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` для полного отключения корзины:
```bash
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`:
```bash
-s "public;/cloud/share;yes;no;yes" \
-G "public;force user = nobody" \
-G "public;force group = nobody" \
-G "public;guest only = yes"
```
Это гарантирует, что все операции выполняются от имени `nobody`, независимо от того, кто подключился.
## Комплексный пример
Сервер с гостевыми и приватными шарами, обнаружением в сети и ограничением ресурсов:
```yaml
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
Для мониторинга состояния контейнера:
```yaml
healthcheck:
test: ["CMD-SHELL", "smbclient -L localhost -N || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
```
Проверяет доступность SMB-сервера через анонимное подключение.
## Ограничение ресурсов
Samba может потреблять много памяти при большом количестве подключений. Рекомендуется ограничить:
```yaml
mem_limit: 256m # Жесткий лимит памяти
mem_reservation: 64m # Гарантированный минимум
cpus: 0.5 # Лимит CPU (0.5 = половина ядра)
```
## Решение проблем
### Ошибка "Access is denied"
Если в логах `change_to_user_internal: chdir_current_service() failed!`: