それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

apt でバージョン指定でアップグレード・インストール/apt list -a ですべてのバージョンを確認

/## apt install でバージョン指定でインストール

やりかた

sudo apt install パッケージ名=バージョン名

sudo apt install gitlab-ce=13.12.12-ce.0

apt install は指定バージョンまでアップグレードできます。

apt コマンドは アップグレードもインストールも同じだし当たり前なんだけど。

sudo apt install --upgrade gitlab-ce=13.12.12-ce.0
sudo apt upgrade gitlab-ce=13.12.12-ce.0

バージョン指定ができますね。

バージョン一覧を取得する

インストール対象となるバージョンを探すには、まずバージョン一覧を取得して選択する必要があります。

sudo apt list --upgradable -a gitlab-ce

または apt-cacheから

sudo apt-cache showpkg gitlab-ce

アップグレード時のコツ

単純にアップグレードしようとして、sudo apt upgrade アップグレードコマンドを打ち込んだとき

unpack でエラーになったりする。

dpkg: アーカイブ /var/cache/apt/archives/gitlab-ce_14.3.3-ce.0_amd64.deb の処理中にエラーが発生しました (--unpack):

そういうときに、一気にバージョンをあげようとせずに、一つずつバージョンを上げて試していいくことで解決する。

例に上げた、gitlab のバージョンアップは、postgresql 11 が必須になっていて sudo gitlab-ctl pg-upgrade をやれと、12→13 のときに出てきた、 12→14だと表示はもうなかった。

このように、最新バージョンに一気に挙げずに、バージョンを少しずつアップグレードしていくことで問題点が洗い出される事例は多い。

バージョン指定はgitlab-ce でよく使う。

gitlab-ceは、一気にバージョンを上げると、エラーになる。なので、ちょっとずつ上げていく

バックアップとって、バージョンを指定して、バージョンアップする。

sudo gitlab-backup create
sudo apt install --upgrade gitlab-ce=12.10.14-ce.0

gitlabについては、upgrade時にバックアップは自動取得されること「も」あるが、油断しちゃだめ。

ssh 秘密鍵のパスフレーズを変更(解除)する

ssh秘密鍵のパスワード変更

パスフレーズを変更する。(パーミッション変更が必要)

chmod 600  ~/my.ssh.id_rsa
ssh-keygen -p -f  ~/my.ssh.id_rsa

sshパスフレーズを解除する

パスフレーズを解除するときは、Enterを押す。空のパスワードを設定する。

Enter old passphrase:
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:

以前の投稿

秘密鍵のパスフレーズを解除してパスフレーズなしの秘密鍵を作る。 - それマグで!

ookla のスピードテストが安定しないうえにサーバー指定できなくなった

定期的に speedtest で速度測定してる

もうかれこれ2年位毎日スピードテストしてはログをためてたんだけど、サーバー指定ができなくなった。

いままでは、speedtest-cli でサーバー指定ができたのだけど、2021/08/29から最寄りのサーバーしか接続できなくなった。

f:id:takuya_1st:20211012032800p:plain

測定しすぎと怒られそうではあるが。。。ユーチューブが普及してインターネットが遅くなるピーク時間帯の速度変化を観察することで、混雑時間帯を避けて、apt update / upgrade やdocker の更新など個人で使うにはとんでもない量のパケットを流し続ける負い目がどうしてもあったので、速度測定の結果をダウンロードやアップロードの負荷分散に利用していた。どの時間帯が混んでいるか、PPPoEを複数ISPで接続して測定したんですが、統計的にデータを取るためには測定結果ブレ幅が大きいので、サーバー指定してたわけです。しかしできなくなった。

オフィシャルのクライアントなら指定できる

f:id:takuya_1st:20211012033521p:plain

speedtest-cli ではなく、オフィシャルのspeedtestコマンドを使えばいまでもID指定は可能なのですが。いつ終わるかわからないし、有志のCPUパワーなのでずっと気が引けてたわけで。これを期に乗り換えようと思ったわけです。

代替のスピードテスト

そこで、Cloudflareのスピードテストがサービス開始していたことを思い出して、そのクライアントを探したら・・・あった

私は断続的に測定して結果の変化を知りたいので、最高速度が知りたいわけでもなく。継続的に安定した測定結果を求めていた。

たぶんもっといい方法はある。VPS借りてHTTPの転送速度をCurlで測るとかしとけばだいぶ正確に出るとは思うけど。管理するサーバーが増えるのは困るし。どこかの画像をずっとダウンロードし続けるのも気が引ける。

cloudflareのスピードテスト用のcli

speed-cloudflare-cli - npm

takuya@~$ npm i -g speed-cloudflare-cli

added 1 package, and audited 2 packages in 3s

found 0 vulnerabilities
takuya@~$ speed-cloudflare-cli
 Server location: Tokyo (NRT)
         Your IP: 27.230.xxxxx (JP)
         Latency: 48.63 ms
          Jitter: 2.80 ms
     100kB speed: 24.94 Mbps
       1MB speed: 61.60 Mbps
      10MB speed: 189.32 Mbps
      25MB speed: 213.41 Mbps
     100MB speed: 274.18 Mbps
  Download speed: 207.27 Mbps
    Upload speed: 29.66 Mbps
takuya@~$

いけそう

grep の後方参照の代替案 5つ

grep では 後方参照ができないので、代替案を考えることになる。

方法1基本的な方法 -o

マッチした箇所だけを取り出す -o を使って、マッチした箇所だけを取り出す。

cat out.txt  | \grep -Po  'Abc.*Xyz'

方法2 先読み+あとよみ

先読み・後ろ読みにマッチした箇所だけを取り出す -o を組み合わせる。

cat out.txt  | \grep -Po  '(?<=Abc).*(?=Xyz)'

方法3 perlruby などワンライナーを使う

もはや、grep ではないが、代替案としては行ける

cat out.txt  | ruby -pe 'sub(/^Abc(.*)Xyz/, "\\1")'

方法4 sed で置換する

もはや、grep ではない。が代替案としては行けるし、sedは手軽に使える。

cat out.txt | sed  -nr 's/Abc(.+)Xyz/\1/p' 

ただし、sedでは、非マッチ箇所が残る。 sedはマッチした箇所を置換するだけなので、マッチしない箇所は出力される。

そこで、-nをつけて、マッチした箇所だけを表示するようにする。

方法5 bashの機能を使う。

[[ takuya =~ taku(.+) ]]
echo ${BASH_REMATCH[@]}

bash に正規表現のマッチングが追加されている。マッチした箇所をBASH_REMATCH変数で取り出せるので、後方参照の代わりになる。

後方参照を使いたいような場面はシェルスクリプトを作ってるときだろうから bash正規表現の各種機能で事足りることがほとんどである。

感想

grep正規表現と後方参照の代替は、「後方参照」を「置換」と考えて、sedで行うのがベターだと思われる。

grep でマッチした箇所を取り出す -o などと併せて覚えおけば、ちょっとしたフィルタ処理やデータを整形するときに使えるのではないかと思う。

後方参照=置換と考えるのが大事。マッチした箇所を取り出す。だと限界がある。

2023-05-23

bash rematchを追加

github actionでテストを自動実行する例

github のActionでテストを実行する例をつくりました。

https://github.com/takuya/github-action-sample-testing-code

テストの設定

github action を実行するには、レポジトリにディレクトリとYAMLを作成します。

## レポジトリの作成
mkdir my-repo
cd my-repo
touch README.md
git init 
git add README.md
git commit -m initial
git remote add origin git@github.com/xxxx/xxxx 
## actions の設定ファイルを設置
mkdir -p .github/workflows/
touch .github/workflows/actions.yml
## push で起動する
git add .github
git push origin master

テスト実行する

アクションの記述例はシンプルにしてあります。

name: build and test

on:
  push:
    branches:
      - master
  
jobs:
  build_and_test:
    runs-on: ubuntu-latest

    steps:
      - name: checkout
        uses: actions/checkout@v2
      - name: composer install
        shell: bash
        run : |
          composer install  -q --no-ansi --no-interaction --no-scripts --no-progress
          composer dump-autoload
      - name : run
        shell : bash
        run : |
          vendor/bin/phpunit
          

github アクションの限界

action は主に ubuntu-latest のgithub が用意したインスタンスが利用されます。

node や npm/yarn や webdriver などほしいと思うものは一通りインストール済みなので、無理せず既存のインスタンスを活用するのがいいかともう。

自分のdocker イメージを利用するのは少し手間なので、docker イメージを利用するなら circleCIのほうが楽かもしれない。

実行結果バッジ

実行結果バッジは次のようなURLで画像を取得できる。

https://github.com/takuya/cronjob-alternative/workflows/test%20src/badge.svg

URLの構造は次の通り。

https://github.com/takuya/{$レポジトリ名}/workflows/${ジョブ名}/badge.svg

ジョブ名のところには、yaml の最上位で指定した name が入る。

次のようなYAMLの場合は build and testになる。スペースは%20 になる。URLエンコードされる。

name: build and test

on:
  push:
    branches:
      - master
  

github actionsは動作がメチャクチャ速いので活用できる範囲で使っていきたい。

参考資料

https://flutter.takuchalle.dev/posts/how-to-test-on-github-actions/

cronをWEB管理するソフトを作りました。

cron の代替を作りました。

github.com

f:id:takuya_1st:20210917182720p:plain

経緯

cron(自動実行プログラム)の管理が煩雑でした。

増え続けるcrontab。ここ数年管理が崩壊していました。systemd.timer や google app scripts なども増えるし、ラムダ系で実行してたりいろいろな所で、タイマー(カレンダー)による実行が溢れかえる。手軽に作れる一方でエラーログを確認したりがめんどくさいので放置してて実行してるけど動いてないスクリプトとかもあり全容把握が困難でした。

散らばる cron / systemd.timer

crontab による管理は、3つの箇所に別れます。

システム(/etc/cron.d/) root ( /var/spool/cron/crontabs/root ) そして個人ユーザー ( /var/spool/cron/crontabs/$USER ) の3つに別れます。この時点でいい加減に管理していると大変。

最近は、systemd.timer が増えてきました。 systemd.timer は systemd.service とペアになっているので、ファイルが複数に分かれます。さらに、ユーザー空間の systemd ( systemd --user )もあります。ログ管理や任意実行は平易化したが、ファイル管理は煩雑になりました。

ここに、lxd/docker/vbox などの仮想環境のcronが加わると管理は不可能になります。

散らばる通知・ログ

大変なのはログと通知の管理です。スケジューラーがコケたときに通知くるけどcron などは > /dev/null とか > /var/log/my-job.log みたいにログファイルに書くしかなくて困る。エラー時の実行ログと正常ログを見たいのに、実行ログと実行時間から推察してログをたどるのが面倒だった。

crontab 書くのめんどくさい

ちょっとした分岐が書きたい

crontab で実行しようとすると、スクリプトいったん実行可能なファイルにして書き出す必要があって、条件分岐をかくのが大変だし、実行ファイルを一箇所に集めて管理とか大変だ。crontab 見ても何が実行されるのかパット見わからないことが多くて困る。

一時停止が大変

ジョブがエラーになってるときなど、一時停止したいときコメントアウトで対応してるとコメントアウトだらけになって、何がなんだかわからなくなった。

crontab の実行予定がわからない。

大量にあるとスクロールしながらひと目見て、cron 書式から次回実行はいつなんだというのがわかりにくい。ソートしたい。

ssh経由でリモート実行したい

cron を一箇所に集めて、sshでリモート実行ちゃえばある程度解決する。SSHで実行するとなると環境変数ssh-agentを書いて環境変数をうまく扱う必要がある。するとスクリプトファイルを使って実行するがcrontabファイルで完結しなくなる。

cron 限界じゃね?

というわけで、cronは5~10件が限界じゃね?別の何かが必要じゃないかと思いました。

webで管理したい。

webでcronの実行予定とスクリプト本文を編集できたらいいじゃん。

web管理機能を探したけど

いいものが見つからなかった。ジョブスケジューラは高機能すぎる気がするしjenkinsとかはCI/CDツールだし。どうも用途に合わないので、laravelでcron書式をつかったスケジュール実行ができるのでそれを応用して作りました。

ソフトウェア仕組み

root で スケジュール実行用のワーカーを常駐させて、毎分単位で実行するべき処理を探しては実行する。

このソフトウェアの限界

毎分単位で処理を探して、プロセスをforkしてジョブを実行するので、1000件くらいが上限だと思われる。

このソフトの特長

WEBから編集ができます。

一時停止状況がわかるように

コメントアウトの代わりに一時停止状況がわかるように

f:id:takuya_1st:20211004210305p:plain

次回実行の予定がわかるように

cron表記を日本語表記にして次回実行がわかるようにしておいた。

f:id:takuya_1st:20210917182425p:plain

実行ごとに結果がわかるように

実行ごとにSTDOUT/STDERRを保存するように。また実行時間も測定し、スケジュール全体の見直しに活用できるようにしました。

f:id:takuya_1st:20210917182531p:plain

スクリプト本文の直接記述

crontab が1コマンド(1行)で記述しなくちゃいけなくて改行を入れてるとおかしくなるのでとても不便なので、

改行やコメントを書けるようにして、直接記述できるようにしして、実行シェルをbash以外から選べるようにしておいた。現在はbash/phpを選べます。sh/rubyは行けそうなのでそのうち対応しようと思います。pythonはちょっと難しいかも。

f:id:takuya_1st:20211004210436p:plain

インストールと取得はgithub

Github に公開しておきます。

github.com

とりあえず試す用のdockerも用意しました。

docker pull ghcr.io/takuya/cronjob-alternative:latest
docker run --rm -p 5000:80 ghcr.io/takuya/cronjob-alternative:latest

cronといってますが、cron表記を使うだけで、crontabの編集を一切やりません。実行するワーカーはcronとは別にじぶんで起動して使います。

multipass のubuntu で dockerd を動かして外部から接続できるようにする。

multipass に docker を入れる。

multipass を windowsでインストールすると、HyperVの仮想マシンで起動します。

choco install multipass 

windowshyper-V で起動したubuntu に docker を入れる。

sudo snap install docker 

mutipass な ubuntu の docker(dockerd) が外部接続を受けるようにする。

dockerd の起動設定を変える。

[Service]
# ExecStart=/usr/bin/snap run docker.dockerd  
ExecStart=/usr/bin/snap run docker.dockerd  -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

書き換えコマンド。

sudo vim /etc/systemd/system/snap.docker.dockerd.service
# または
# sudo systemctl edit snap.docker.dockerd.service

リロード

sudo systemctl daemon-reload
sudo systemctl status snap.docker.dockerd.service

外部(Windows/Mac)からmultipass のdocker に接続する。

multipass の仮想マシンtcp://172.17.231.118:2375 でlisten しているので、そこへ接続する。

DOCKER_HOST=tcp://172.17.231.118:2375 /usr/bin/docker run --rm hello-world

docker コマンドをインストールする。

dockerd を除いた、docker コマンドだけをインストールするには

wsl v1 のDeibanの場合。

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo   "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
## 
sudo apt install docker-ce-cli

windows内に複数の仮想環境が乱立するが、TCP経由でdockerd を使うと選択肢が多く、比較的インストールがスムーズに終わることがわかる。

Windows内部の構造を単純に考えると次のようになる。

windows 内部
   - multipass 
       - ubuntu 
   - wsl
     - v1 
       - debian 

docker-desktop でお手軽なんだけど、docker-desktop 版をいれるとwslv2 になるのでめんどくさいんですよ。

別ホストのdockerをTCP経由で操作する

docker は自PCに入れなくても動作します。

docker コマンドの接続は次のようになっています。

docker-cli ---- fd(sock) --- docker-host

docker は api 経由で動作しているので、TCP経由でも接続できます。

docker-cli ---- tcp(sock) --- docker-host

tcp 接続でdocker を使う。

tcp://192.168.2.10:2375 で起動したdockerへ接続する。

DOCKER_HOST=tcp://192.168.2.10:2375 /usr/bin/docker ps -a

docker daemon ホストを tcp://192.168.2.10:2375 で起動する。

TCP経由でリッスンし起動する。

/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock  

systemd の記述を変える。

/etc/systemd/system/multi-user.target.wants/docker.service

ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock

リロード再起動

sudo  systemctl daemon-reload
sudo systemctl restart docker.service

活用法

WindowsでDockerを使うときは茨の道なので、TCP経由で起動するといいです。

wsl → localhost:2375  → Windows Docker 
wsl → localhost:2375  → HyperV Docker
wsl → 172.16.11.11:2375  → multipass ubnuto docker

参考資料

bashスクリプトで標準入力か引数のどちらかを取得する

STDINか引数を処理するコマンドを作りたい。

たとえば、次のようなコマンドを作りたい。

標準入力があるときは、標準入力を使い、それ以外は引数を使う。

echo AAA | to_lower
to_lower AAA

to_lower の例。

ヒアストリングに展開すれば楽ちんです。

<<< ${@:-$(</dev/stdin)}
#!/usr/bin/env bash
tr "[:upper:]" "[:lower:]" <<< ${@:-$(</dev/stdin)}

{$@} が引数で引数があるときは引数を使い、ないときは$(</dev/stdin) で標準入力を探しに行く

参考資料

https://stackoverflow.com/questions/19619490/how-to-read-stdin-when-no-arguments-are-passed/19619634#19619634

openwrt で IPアドレスが変わるまで再接続(IPガチャ)

openwrt でpppoe を再接続

再接続して、IPアドレスが変わるまで、PPPoEガチャをする。

IPアドレス判定がおかしいとき。

IPアドレスによる地域判定や、IPアドレスで「ブロック」されたときに、再接続する。

今どき、ipv4 をブロックリストに追加したり、地域判定でごちゃごちゃするのはありえないと思うんだけどさ。

ネットワーク関連のコマンド。

/lib/functions/network.sh にネットワーク関連のコマンドが用意されているのでそれを読み込む。

source   /lib/functions/network.sh

現在のIPアドレス

ネットワークコマンドから、現在のIPアドレスを取得できる。

  source   /lib/functions/network.sh
  network_flush_cache
  network_find_wan WAN_IF
  network_get_ipaddr IP_ADDR "${WAN_IF}"

再接続

PPPoEの再接続は ifup/ifdown でできる。

引数は、pppoe の接続名になる。

  ifdown ocn_pppoe;
  ifup ocn_pppoe;

IPアドレスを変えるまで無限ループにする。

#!/usr/bin/env bash


function get_current_ip(){
  . /lib/functions/network.sh
  network_flush_cache
  network_find_wan WAN_IF
  network_get_ipaddr IP_ADDR "${WAN_IF}"
  echo $IP_ADDR
}
function reconnet_pppoe(){
  # >&2 echo ${FUNCNAME[0]}
  ifdown ocn_pppoe;
  ifup ocn_pppoe;
  wait_reconnect
  # >&2 echo reconnect_end
}


function wait_reconnect() {
  IP_ADDR=` get_current_ip `
  while [[ -z $IP_ADDR ]]; do

    IP_ADDR=` get_current_ip `

    # >&2 echo IP_ADDR=$IP_ADDR
    if (( i++ > 60  ));  then
        # >&2 echo wait give up
        break
    fi
    sleep 1
  done

}



function main(){

  PREV_IP=` get_current_ip `
  while (( cnt++ < 100 )); do

    # echo $cnt
    reconnet_pppoe;
    # >&2 ip addr show pppoe-ybb

    CURR_IP=`get_current_ip`

    echo old_ip=${PREV_IP} ,new_ip=$CURR_IP
    ## ip 変わるまで再接続
    if [[ ! -z $CURR_IP ]] && [[ $PREV_IP != $CURR_IP ]] ;then
      break
    fi
  done

  echo done
}


main

bitwardenのインストール

bitwardenを動かしてみる。

構成、Ubuntu 20.04 に lxc コンテナを用意し、lxc コンテナ内部に docker インストール、docker 上に bitwarden を入れた

bitwarden on docker on lxc on ubuntu 20.04 です

lxc の準備

snap install lxc 

LXC 仮想マシン準備

name=bitwarden
lxc launch ubuntu:20.04 $name --storage bt01
lxc config set $name security.privileged true
lxc config set $name security.nesting true
lxc restart $name
lxc shell $name

docker 準備

apt update 
apt upgrade -y 
apt install docker-compose -y
docker run --rm hello-world

作業用ディレクト

cd 
mkdir sample 
cd sample

bitwarden サーバー

curl -s -o bitwarden.sh \    https://raw.githubusercontent.com/bitwarden/server/master/scripts/bitwarden.sh \
    && chmod +x bitwarden.sh
./bitwarden.sh install
./bitwarden.sh start

インストールID

https://bitwarden.com/hostにアクセス

  • Installation Id: a5dd017f-ca06-xxxxx
  • Installation Key: mPYQiuxxxx

インストールIDを生成してインストールを認証して持らう。

再インストール

再インストールや失敗時にやり直す場合は、先にbwdataを除去しておく。

rm -rf bwdata
./bitwarden.sh install

バックアップ

./biwarden stop
rclone bwdata xx:/backup

証明書

証明書は、letsencrypt を certbot するけど、自動取得がNAT内部だと動かないので、最初は自己署名証明書にしておくのがベター

自分インストールの物を使う。

Chromeの拡張で自分のサーバーを使うには、次のボタンを押す。

インストールのログ

root@bitwarden:~/sample# ./bitwarden.sh install
 _     _ _                         _
| |__ (_) |___      ____ _ _ __ __| | ___ _ __
| '_ \| | __\ \ /\ / / _` | '__/ _` |/ _ \ '_ \
| |_) | | |_ \ V  V / (_| | | | (_| |  __/ | | |
|_.__/|_|\__| \_/\_/ \__,_|_|  \__,_|\___|_| |_|

Open source password management solutions
Copyright 2015-2021, 8bit Solutions LLC
https://bitwarden.com, https://github.com/bitwarden

===================================================

bitwarden.sh version 1.42.3
Docker version 20.10.7, build 20.10.7-0ubuntu1~20.04.1
docker-compose version 1.25.0, build unknown

(!) Enter the domain name for your Bitwarden instance (ex. bitwarden.example.com): bit.exampmle.com

(!) Do you want to use Let's Encrypt to generate a free SSL certificate? (y/n): n

(!) Enter the database name for your Bitwarden instance (ex. vault):

1.42.3: Pulling from bitwarden/setup
Digest: sha256:a85998defed50c28dcd477c1b196df9282e0f46c18dfb5d0f5378833fe02f81e
Status: Image is up to date for bitwarden/setup:1.42.3
docker.io/bitwarden/setup:1.42.3

(!) Enter your installation id (get at https://bitwarden.com/host): a5dd017f-ca06-xxx-xxx-xxxxxxxx

(!) Enter your installation key: mPYQiuHnxxxxxxxxx

(!) Do you have a SSL certificate to use? (y/n): n

(!) Do you want to generate a self-signed SSL certificate? (y/n): y

Generating self signed SSL certificate.
Generating a RSA private key
..................++++
...........................................................................................................................................................................................................................................................................++++
writing new private key to '/bitwarden/ssl/self/bit.example.com/private.key'
-----
Generating key for IdentityServer.
Generating a RSA private key
...................................++++
.........................................++++
writing new private key to 'identity.key'
-----

!!!!!!!!!! WARNING !!!!!!!!!!
You are using an untrusted SSL certificate. This certificate will not be
trusted by Bitwarden client applications. You must add this certificate to
the trusted store on each device or else you will receive errors when trying
to connect to your installation.

Building nginx config.
Building docker environment files.
Building docker environment override files.
Building FIDO U2F app id.
Building Asset Links For Fido2.
Building docker-compose.yml.

Installation complete

If you need to make additional configuration changes, you can modify
the settings in `./bwdata/config.yml` and then run:
`./bitwarden.sh rebuild` or `./bitwarden.sh update`

Next steps, run:
`./bitwarden.sh start`

起動チェック

起動したら、IPアドレスへアクセスする。 http://docker-nginx.local:8080/ にアクセスして起動チェックする。

ポートフォワーディング

docker コンテナへのポートフォワーディングを設定する。

リッスンするポートをここで指定する。

bitwarden/bwdata/config.yml

url: https://mybitwarden.example.tld
generate_compose_config: true
generate_nginx_config: true
http_port: 11080
https_port: 11443
compose_version:
captcha: false
ssl: false

ssl は letsencrypt でできるが、証明書の管理は面倒くさいので、cloudflareで受けるか、自前のnginxでSSLリバースプロキシを構成した。

管理者メールとメール設定

ログインと新規登録、パスワード紛失時のリカバリにメールを使うのでSMTPサーバーを設定する。

管理者ログイン(といってもユーザーの削除くらいしかできない、ユーザーのデータを見ることは出来ない)

bitwarden/bwdata/env/global.override.env

globalSettings__mail__replyToEmail=mybitwarden@example.tld
globalSettings__mail__smtp__host=smtp.example.tld
globalSettings__mail__smtp__port=465
globalSettings__mail__smtp__ssl=true
globalSettings__mail__smtp__username=mybitwarden@example.tld
globalSettings__mail__smtp__password=XXX_smtp_password_XXX
globalSettings__disableUserRegistration=true
globalSettings__hibpApiKey=REPLACE
adminSettings__admins=admin-user@example.tld

ドメイン名+SSL経由でアクセスする

あとは、リバースプロキシを設置してドメイン名でアクセスできるように設定する。

これは、インストールではないので、割愛。

bitwarden self-hostedの制限事項

organization ( 組織 ) は作れない。この点を除けば通常の利用とほぼ同じである。

ファイルの添付もできないが、ほとんど困らない。キャッシュカード、マイナンバーカードや、免許証などは、写真で添付せずに番号を入れておけばいいだけだ。

Macの設定のアップデート通知のバッジを省略する。

MacOSの通知バッヂを省略する

macOSの新バージョンの実験台にされるのはいやなので少し前のバージョンを使ってます。 しかし、通知アイコンがずっとアップデートを通知してくるので消したいです。

defaults write com.apple.systempreferences AttentionPrefBundleIDs 0 && killall Dock

これで、preference の dock から red badge を消すことが出来る

f:id:takuya_1st:20220325030501p:plain

もとに戻せるのか?

戻せます

defaults write com.apple.systempreferences AttentionPrefBundleIDs 1 && killall Dock

コマンドを実行するだけでいいのは便利よね。

参考資料

https://apple.stackexchange.com/questions/344278/how-can-i-disable-the-red-software-update-notification-bubble-on-the-system-pref?rq=1

https://osxdaily.com/2020/05/12/disable-red-badge-icon-system-preferences-macos/

s3互換ストレージminio をインストール(2021版)

minio のインストール

最近バージョンアップしたので最新版(2021-09-27現在)で起動やり直したのでメモ、

  • 管理画面にダッシュボードがついた
  • 管理画面のポートが変更になった。
  • 管理画面とストレージのポートが別れた。

管理画面とストレージを別々に起動するのは地味に迷惑なので困った。

あと管理画面でユーザー系の機能が追加されて、軽量なストレージではなくなった。

個人では使わない機能が追加されてるが、S3代用として十分に使えるものになった印象。

公式マニュアルがdocker からpodman に変わった。

docker での起動

docker 起動は、公式マニュアルではとてもシンプルに記述しているが、実際に動かすには、ポートとユーザー環境変数と永続化ボリュームが必要であった。

IMAGE=minio/minio
NAME=minio
PORT_EXPOSE=80801
PORT_WEB_EXPOSE=8080
VOLUME_PERSIST=$( realpath ./data )
docker run -d
    --rm
    --name $NAME
    -p $PORT_EXPOSE:9000
    -p $PORT_WEB_EXPOSE:9001
    -v $VOLUME_PERSIST:/data
    -e MINIO_ROOT_PASSWORD=$MINIO_ROOT_PASSWORD
    -e MINIO_ROOT_USER=$MINIO_ROOT_USER
    $IMAGE server /data   --console-address ':9001'

イメージのレポジトリは、dockerhub か redhatレジストリ quay.io のどちらかを使う。

#dockerhub
minio/minio
# quay.io
quay.io/minio/minio

サクッと停止起動用のスクリプトにしておく。

#!/usr/bin/env bash
# https://takuya-1st.hatenablog.jp/
## : vim

cd $( dirname $( realpath $0 ) )
DIR=$(pwd)


NAME=minio
PORT_WEB_EXPOSE=8080
PORT_EXPOSE=8081
VOLUME_PERSIST=$( realpath ./data )
DOCKER_ID_CMD="docker ps -q  --filter name=$NAME"
IMAGE=minio/minio

MINIO_ROOT_USER=xxxxadminxxx
MINIO_ROOT_PASSWORD=xxxxxxpasswordxxxx


function stop(){
    if [[ ! -z $( $DOCKER_ID_CMD ) ]] ; then
      echo  $NAME is already started. stopping...
      docker stop $( $DOCKER_ID_CMD )
      while [[ ! -z $( $DOCKER_ID_CMD ) ]] ; do
        sleep 1
      done
      echo done

    fi
}
function update(){
  CMD="docker pull $IMAGE "
  echo $CMD
  $CMD

}

function start(){
  CMD="docker run -d
    --rm
    --name $NAME
    -p $PORT_EXPOSE:9000
    -p $PORT_WEB_EXPOSE:9001
    -v $VOLUME_PERSIST:/data
    -e MINIO_ROOT_PASSWORD=$MINIO_ROOT_PASSWORD
    -e MINIO_ROOT_USER=$MINIO_ROOT_USER
    $IMAGE server /data   --console-address ':9001'
  "

  echo $CMD
  $CMD
}


case $1 in
  start)
    start
    ;;
  stop)
    stop
    ;;
  update)
    update
    ;;
  *)
    stop
    update
    start
    ;;
esac

nginx でプロキシする。

複数ドメインをつけるとめんどくさいので、同一ドメインでサブディレクトリで運用したいが、管理画面をサブディレクトリにするのは面倒だったので。ドメインを別に設定した。

管理画面 http://s3admin.example.com/
ストレージ http://s3.example.com/

nginx の設定を作る

## 2021-09-27 takuya

server {

  listen 80;
  server_name s3admin.example.com;
  server_tokens off;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;

    proxy_connect_timeout 300;
    # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    chunked_transfer_encoding off;
    proxy_pass http://docker.lxd:8081;
  }

}
server {

  listen 80;
  server_name s3.example.com;
  server_tokens off;

location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;
    ##
    chunked_transfer_encoding off;
    proxy_set_header Connection '';
    proxy_http_version 1.1;
    proxy_buffering off;
    proxy_cache off;
    rewrite ^/storage(.*)$ $1 break;
    proxy_pass http://docker-host.lxd:8080;
  }

}

これで、/storage/へのアクセスがS3アクセスになる。

以前のminio のデータもちゃんとそのまま見える。ただ公開範囲や権限は設定し直しになった。 f:id:takuya_1st:20210927224400p:plain

アップロードとダウンロードをテストする

mc ( minio client )がインストールされたdocker があるのでこれを使ってアップロードしてみる。 これで、取得とテスト実行ができる

docker run --rm minio/mc ls play

実際に使ってみる。

docker run  --rm -it  --entrypoint=/bin/bash  minio/mc

minio S3ホストへの接続設定

endpoint=https://s3.example.com/
accesskey=fuheejuShaogae2gggggggggg
secret=ier8Ayaesieghggggggg
mc alias set myS3 \
$endpoint $accesskey $secret

バケットの作成

mc mb myS3/aaa

バケットの一覧

mc ls myS3

ファイルのアップロード

mc cp myS3 hello.txt myS3/aaa/

バケットをpublic に

 mc policy set public myS3/aaa

あとはブラウザから見てみよう

curl https://s3.example.com/aaa/hello.txt

行けそうですね。

参考資料

リモートデスクトップの設定と起動を設定するコマンド

リモートデスクトップの設定と起動

Windowsリモートデスクトップを有効にする設定の場所がわかりにくいのでメモ

設定→システム→リモートデスクトップの順にたどる。

f:id:takuya_1st:20210927135150p:plain

Win10に搭載されている設定メニューにコントロールパネルみたいに「パス」がなくなったのは設計上大問題ですわ。

コマンド

Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
PS C:\Windows\system32> Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server'-name "fDenyTSConnections" -Value 0
PS C:\Windows\system32> Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
PS C:\Windows\system32>
PS C:\Windows\system32>

windowsの再設定

windowsの再設定

2021-08-18 に設定した

scansnap のフォルダを消すのに苦労したのでメモ

連絡先を消す

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{56784854-C6CB-462B-8169-88E350ACB882}\PropertyBag]
"NoCustomize"=dword:00000001
"ThisPCPolicy"="Hide"

保存したゲームを消す

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{4C5C32FF-BB9D-43b0-B5B4-2D72E54EAAA4}\PropertyBag]
"ThisPCPolicy"="Hide"

ミュージックを消す

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{a0c69a99-21c8-4671-8703-7934162fcf1d}\PropertyBag]
"BaseFolderId"="{4BD8D571-6D19-48D3-BE97-422220080E43}"
"ThisPCPolicy"="Hide"

ビデオを消す

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{35286a68-3c57-41a1-bbb1-0eae73d76c95}\PropertyBag]
"BaseFolderId"="{18989B1D-99B5-455B-841C-AB7C74E4DDFC}"
"ThisPCPolicy"="Hide"

ScanSnapフォルダを消す

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{591C1901-C0DA-4776-8450-F9806F6E9687}]
@="ScanSnap Folder"
"AppID"="{3DB87E3A-2490-49DA-BA7C-5931849992CE}"
"InfoTip"="ScanSnap Folder"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{591C1901-C0DA-4776-8450-F9806F6E9687}\DefaultIcon]
@="C:\\Program Files (x86)\\PFU\\ScanSnap\\SSFolder\\x64\\SSFolder.DLL,0"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{591C1901-C0DA-4776-8450-F9806F6E9687}\InprocServer32]
@="C:\\Program Files (x86)\\PFU\\ScanSnap\\SSFolder\\x64\\SSFolder.DLL"
"ThreadingModel"="Apartment"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{591C1901-C0DA-4776-8450-F9806F6E9687}\ProgID]
@="SSFolder.ShellFolderImpl.1"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{591C1901-C0DA-4776-8450-F9806F6E9687}\Programmable]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{591C1901-C0DA-4776-8450-F9806F6E9687}\ShellFolder]
"Attributes"=dword:f8000000
"wantsFORPARSING"=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{591C1901-C0DA-4776-8450-F9806F6E9687}\TypeLib]
@="{8D4FB007-2F3F-4C51-BD10-D39D5445C59B}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{591C1901-C0DA-4776-8450-F9806F6E9687}\VersionIndependentProgID]
@="SSFolder.ShellFolderImpl"

3Dオブジェクトを消す

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{31C0DD25-9439-4F12-BF41-7FF4EDA38722}]
"Category"=dword:00000004
"FolderTypeID"="{b3690e58-e961-423b-b687-386ebfd83239}"
"Icon"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,\
  00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,69,00,\
  6d,00,61,00,67,00,65,00,72,00,65,00,73,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,\
  00,31,00,39,00,38,00,00,00
"LocalizedName"=hex(2):40,00,25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,\
  6f,00,6f,00,74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,\
  00,5c,00,77,00,69,00,6e,00,64,00,6f,00,77,00,73,00,2e,00,73,00,74,00,6f,00,\
  72,00,61,00,67,00,65,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,32,00,31,00,38,\
  00,32,00,35,00,00,00
"Name"="3D Objects"
"ParentFolder"="{5E6C858F-0E22-4760-9AFE-EA3317B67173}"
"PreCreate"=dword:00000001
"RelativePath"="3D Objects"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{31C0DD25-9439-4F12-BF41-7FF4EDA38722}\PropertyBag]
"ThisPCPolicy"="Hide"