Kopia Serverをdockerで立ち上げる

投稿者: | 2月 21, 2025

仕事を変わるタイミングでもし必要がなければ、以前使っていた機材を処分しようと思ったら、10台くらいでてきた。全部売却して生活費?の足しにしようかと思ったが、筐体ごととなるとなかなか売り手がつかずなので、パーツをバラして売るか。まだどうにかわからないので取らぬ狸なんだが、全部電源を入れることはないので、少しずつパーツをバラして売却していくかなぁ。さらに実は、NASが3台もある。そのうち2台は常時稼働していて、1台は必要に応じてWOLしている。しかし、昨今、大容量のディスクが出てくるが、大容量のディスクになればなるほど、壊れたら一蓮托生。もちろん、RAIDにしているものもあるが、していないものもある。(容量を稼ぎたい。)なんとなくだがバックアップが必要。しかし、バックアップするって、もう一台NASがいると言うこと。うーん、悩ましい。今のディスク容量でもう一台となると使ってない機材を全部売ったとしても資金が足りない。円安の時にすべきは転職だけで、物の購入は避けるべき。と思ったら、1ドル150円切った。

 

閑話休題

 

kopiaをNASサーバで立ててみた。

今のNASは、単にファイル共有とかiSCSIのLUNの利用だけではなく、dockerが使えるので、色々な機能が拡張できる。

以下、QNAPで作成してみた例。

  • 多分、パスさえ考慮すれば、Synologyでも動くはず。
  • QNAP自体の共有のバックアップは、/dataがNASの/としてマウントされているので、/data配下を指定するとNASのフォルダをバックアップできる。
  • コンテナの起動時にホスト名が変わってしまうのを防ぐために、ホスト名を固定にしている。(kopia-server)
  • htpasswdコマンドをインストールしたく無いのでhttpdコンテナを起動して実行している。
  • compose.yamlにkopiaのrepositoryパスワードを事前に記載する。

    – KOPIA_PASSWORD=Password1234!

    を追記する。その際

    – KOPIA_PASSWORD=”Password1234!”はだめ。パスワードが「”Password1234!”」となってしまう。

    https://github.com/kopia/kopia/issues/4177#issuecomment-2439937449

    すごくハマった、これ。

 

KOPIA_DIR=/share/Share/kopia
KOPIA_UI_PASSWORD=Password1234

mkdir -p ${KOPIA_DIR}/{logs,config,cache,repository,rclone,mnt}
cd ${KOPIA_DIR}/
chown 65532:65532 {logs,config,cache,repository,rclone,mnt}

mkdir -p ${KOPIA_DIR}/certs
openssl req -x509 -newkey rsa:4096 -keyout certs/my.key -out certs/my.cert -sha256 -days 3650 -nodes -subj "/CN=$(hostname)"
chmod 600 certs/my.*

docker run --rm httpd:alpine htpasswd -nb kopia ${KOPIA_UI_PASSWORD} > kopiapass
chmod 600 kopiapass
docker rmi httpd:alpine
cat << EOF > compose.yaml
services:
kopia:
  image: kopia/kopia:latest
  container_name: kopia-server
  hostname: kopia-server
  restart: unless-stopped
  user: "0:0"
  cap_add:
    - SYS_ADMIN
  security_opt:
    - apparmor:unconfined
  devices:
    - /dev/fuse:/dev/fuse:rwm
  ports:
    - "51515:51515"
  environment:
    - KOPIA_UI_USER=kopia
    - TZ=Asia/Tokyo
    - KOPIA_SERVER_CONTROL_USER=server-control
    - KOPIA_SERVER_CONTROL_PASSWORD=PASSWORD
    - KOPIA_PASSWORD=Password00!
  volumes:
    - ./config:/app/config
    - ./cache:/app/cache
    - ./logs:/app/logs
    - ./rclone:/app/rclone
    - ./mnt/kopia:/tmp:shared
    - /:/data:ro
    - ./repository:/repository
    - ./kopiapass:/kopiapass:ro
    - ./certs/my.cert:/my.cert:ro
    - ./certs/my.key:/my.key:ro
  command:
    server start
    --tls-cert-file /my.cert
    --tls-key-file /my.key
    --disable-csrf-token-checks
    --address=0.0.0.0:51515
    --server-username=kopia
    --htpasswd-file /kopiapass
EOF

docker compose up -d

repositoryを登録する。そのパスワードは、KOPIA_PASSWORDで指定したものを利用する。これをしないと、コンテナが再起動したときにrepositoryがマウントされない。

もし、スクリプトの実行をしたいのであれば、以下を実行して、再度立ち上げ直す。GUIからレポジトリに接続するときに、アクションが有効にできないので。

sed -i -e "s/\"enableActions\": false/\"enableActions\": true/g" config/repository.config
docker compose down
docker compose up -d

これを実行すると、ポリシーでアクションが実行できるようになる。

 

ユーザの追加

USERNAME=<ユーザ名>@<ホスト名>
USER_PASSWORD=<ユーザのパスワード>
KOPIA_PASSWORD=<repositoryパスワード>

docker exec kopia-server kopia server users list --password=${KOPIA_PASSWORD}
docker exec kopia-server kopia server users add ${USERNAME} --password=${KOPIA_PASSWORD} --user-password=${USER_PASSWORD}
docker exec kopia-server kopia server refresh --address=https://minio1.cloudshift.tech:51515 --server-control-username=server-control --server-control-password=PASSWORD
docker exec kopia-server kopia server users info root@kopia-test3 --password=${KOPIA_PASSWORD}
docker exec kopia-server kopia server users list --password=${KOPIA_PASSWORD}
openssl x509 -in certs/my.cert -noout -fingerprint -sha256 | sed 's/://g'

 

ところどころハマったがどうにかできた。kopiaはパスワード周りが難しい。というか、微妙な設定でハマるなぁ。一応できたのでこれでよしかなぁ。

コメントを残す