私的サーバー構築日誌：Samba in Docker

# 能書き

[私的サーバー構築日誌：仕切り直し](https://qiita.com/katz_engineer/items/1f21de2bd9072c260ae6)からの自宅サーバー構築の続きです。

Sambaでファイルサーバーを立てて、Windowsからファイルアクセスできるようにします。環境を汚すのがイヤだったので、SambaサーバーはDockerに閉じ込めます。同じ理由で、LDAPとの連携は諦めました。SambaはLDAPに何やら書き込むらしいので。

パスワードなども平文で```docker-compose.yml```ファイルに格納される手順になります。気になる方は、今回の手順は避けて下さい。

# 参考文献

- [【2023年06月版】Ubuntu22.04 で Docker + Samba で Windowsとファイル共有、ついでにサービス化 - Qiita](https://qiita.com/nouernet/items/f06e20bf77fd8de5e9fe) … 今回はほとんどこれと同じ手順です。
- [Dockerを使ってSambaサーバを立てる - Magnolia Tech](https://blog.magnolia.tech/entry/2023/01/18/233655)
- [Samba4を使ったファイルサーバの構築と外部LDAPサーバとの連携 - Qiita](https://qiita.com/itawn/items/03e8e5f2ba3f50ed76c8)
- [Ubuntu 22.04 Samba構築 - 手当たり次第に書くんだ](https://www.si1230.com/?p=46277) … SambaはLDAPに対してSID等の情報を登録する、そうです。
- [ユーザー登録 - ユーザー登録 - 私的サーバー構築日誌：LDAPサーバー OpenLDAP・ユーザー登録 - Qiita](https://qiita.com/katz_engineer/items/d576dddbe6a4d8b65fca) … 今回はLDAPとの連携はやめましたので、LDAPに登録されているユーザー情報は別途確認する必要があります。

# 準備

## 共有ディレクトリ

```/srv/samba```を作って共有ディレクトリとします。

```console:サーバー側
cd /srv
sudo mkdir samba
```

```console:サーバー側
sudo chown $USER: samba
```

## docker-compose.yml

```console:サーバー側
cd
mkdir docker-samba
cd docker-samba
```

```console:サーバー側
curl -O https://raw.githubusercontent.com/ServerContainers/samba/master/docker-compose.yml
```

例によってパッチを用意しました。[用意すべきアカウント](https://qiita.com/katz_engineer/items/d576dddbe6a4d8b65fca#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E7%99%BB%E9%8C%B2-1)の追加などは適宜対応して下さい。環境変数などの設定に関しては[こちらの本家説明](https://hub.docker.com/r/servercontainers/samba)を参照して下さい。説明は英語なので自動翻訳でどうぞ。

```console:サーバー側
ACCOUNT=taro
SURNAME=familyname
PASSWORD=Ma9H%6jg
USERID=10000
GROUPID=10000
```

```console:サーバー側
cat <<___ >samba.patch
9c9
<     restart: always
---
>     restart: unless-stopped
10,11d9
<     # note that this network_mode makes it super easy (especially for zeroconf) but is not as safe as exposing ports directly
<     # more about that here: https://book.hacktricks.xyz/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation#hostnetwork
13,15d10
<     # uncomment to solve bug: https://github.com/ServerContainers/samba/issues/50 - wsdd2 only - not needed for samba
<     #cap_add:
<     #  - CAP_NET_ADMIN
22,26d16
<       # uncomment to disable optional services
<       #WSDD2_DISABLE: 1
<       #AVAHI_DISABLE: 1
<       #NETBIOS_DISABLE: 1
< 
29,42c19,21
<       ACCOUNT_alice: alipass
<       UID_alice: 1000
<       GROUPS_alice: family
< 
<       ACCOUNT_bob: bobpass
<       UID_bob: 1001
<       GROUPS_bob: family
< 
<       # example for hashed password (user: foo | password: bar) - generated using create-hash.sh script.
<       ACCOUNT_foo: "foo:1000:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:86C156FC198B358CCCF6278D8BD49B6A:[U          ]:LCT-61B0859A:"
<       UID_foo: 1002
<       GROUPS_foo: family
< 
<       SAMBA_VOLUME_CONFIG_shared_home: "[Home]; path=/shares/homes/%U; valid users = alice, bob, foo; guest ok = no; read only = no; browseable = yes"
---
>       ACCOUNT_$ACCOUNT: $PASSWORD
>       UID_$ACCOUNT: $USERID
>       GROUPS_$ACCOUNT: $SURNAME
44,45c23
<       SAMBA_VOLUME_CONFIG_aliceonly: "[Alice Share]; path=/shares/alice; valid users = alice; guest ok = no; read only = no; browseable = yes"
<       SAMBA_VOLUME_CONFIG_alicehidden: "[Alice Hidden Share]; path=/shares/alice-hidden; valid users = alice; guest ok = no; read only = no; browseable = no"
---
>       SAMBA_VOLUME_CONFIG_${ACCOUNT}only: "[$ACCOUNT]; path=/shares/$ACCOUNT; valid users = $ACCOUNT; guest ok = no; read only = no; browseable = yes"
47,52d24
<       SAMBA_VOLUME_CONFIG_bobonly: "[Bob Share]; path=/shares/bob; valid users = bob; guest ok = no; read only = no; browseable = yes"
< 
<       SAMBA_VOLUME_CONFIG_public: "[Public]; path=/shares/public; valid users = alice, bob, foo; guest ok = no; read only = no; browseable = yes; force group = family"
<       SAMBA_VOLUME_CONFIG_public_ro: "[Public ReadOnly]; path=/shares/public; guest ok = yes; read only = yes; browseable = yes; force group = family"
< 
<       SAMBA_VOLUME_CONFIG_timemachine: "[TimeMachine]; path=/shares/timemachine/%U; valid users = alice, bob, foo; guest ok = no; read only = no; browseable = yes; fruit:time machine = yes; fruit:time machine max size = 500G"
54c26
<       - /etc/avahi/services/:/external/avahi
---
>       - ./etc_avahi_services/:/external/avahi
57,63c29
<       - ./shares/alice:/shares/alice
<       - ./shares/alice-hidden:/shares/alice-hidden
<       - ./shares/bob:/shares/bob
<       - ./shares/public:/shares/public
<       - ./shares/homes:/shares/homes
<       - ./shares/timemachine:/shares/timemachine
< 
---
>       - /srv/samba/$ACCOUNT:/shares/$ACCOUNT
___
```

```console:サーバー側
patch --ignore-whitespace docker-compose.yml <samba.patch
```

# 起動と確認

```console:サーバー側
docker compose up -d
```

共有ディレクトリの所有者をきちんと```taro```にしてやらないと、書き込めないようです。

```console:サーバー側
cd /srv/samba
sudo chown $USERID:$GROUPID $ACCOUNT
```

同じLAN上にあるWindowsマシンから共有の具合を確認します。[```primary.home```が家庭内LANに設定しているウチのサーバーの名前](https://qiita.com/katz_engineer/items/f2198e5cb7b222d4180e#%E8%A8%AD%E5%AE%9A)です。

```console:WindowsクライアントマシンのDOSプロンプト
start \\primary.home
```

これでユーザー```taro```としてログインすると、```taro```フォルダが表示され、編集可能になります。

# 仕舞い

成功が確認できたら、設定ファイルのパッチは不要なので削除しておきましょう。

```console:サーバー側
cd
rm docker-samba/samba.patch
```

以上、sambaサーバーをDockerコンテナで立てました。これだけなら非常に簡単ですね。これだけなら。