Файловый сервер на Samba.md
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -126,6 +126,9 @@ services:
|
|||||||
| `GROUPID` | GID для группы smb |
|
| `GROUPID` | GID для группы smb |
|
||||||
| `INCLUDE` | Путь к дополнительному конфиг-файлу |
|
| `INCLUDE` | Путь к дополнительному конфиг-файлу |
|
||||||
| `TZ` | Часовой пояс (например, `Europe/Moscow`) |
|
| `TZ` | Часовой пояс (например, `Europe/Moscow`) |
|
||||||
|
| `RECYCLE_AGE` | Автоочистка файлов старше N дней из корзины |
|
||||||
|
| `RECYCLE_CRON_HOUR` | Час запуска очистки (0-23, по умолчанию: 3) |
|
||||||
|
| `RECYCLE_CRON_MINUTE` | Минута запуска очистки (0-59, по умолчанию: 0) |
|
||||||
|
|
||||||
### Пример с переменными окружения
|
### Пример с переменными окружения
|
||||||
```yaml
|
```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"
|
### Ошибка "Access is denied"
|
||||||
Если в логах `change_to_user_internal: chdir_current_service() failed!`:
|
Если в логах `change_to_user_internal: chdir_current_service() failed!`:
|
||||||
|
|||||||
Reference in New Issue
Block a user