Rubyと筋肉とギターとわたし

筋トレが仕事です

【Elixir】docker compose構成のelixirとpostgresqlが接続できなかった話

あけましておめでとうございますもてぃ。

今年一発目の記事はElixirです。

僕はdockerが大好きで愛してやまないので、Elixir * PostgreSQL構成のdockerリポジトリを作りました。

github.com

その際はまった内容を備忘録として残しておきたいと思います。

環境

docker-compose.ymlの構成

こんな感じ。

version: '3'

services:
  postgres:
    build: ./postgres
    image: ecto-database
    container_name: ecto-database
    environment:
      POSTGRES_HOST_AUTH_METHOD: 'trust'
      TZ: 'Asia/Tokyo'
    volumes:
      - ./postgres/init:/docker-entrypoint-initdb.d
      - ecto-data:/var/lib/postgresql/data
    ports:
      - '5555:5432'
    restart: always
  app:
    build: .
    image: ecto-app
    container_name: ecto-app
    volumes:
      - .:/app
    tty: true
    stdin_open: true
    restart: always
    depends_on:
      - postgres

volumes:
  ecto-data:
    driver: local

ライブラリにはectopostgrexを使用してます。

ecto.create

app containerに対してmix ecto.createを実行しています。

# docker exec -it ecto-app mix ecto.createでもおk
% docker compose exec app mix ecto.create
Compiling 3 files (.ex)
Generated ecto_app app

05:34:55.399 [error] GenServer #PID<0.284.0> terminating
** (DBConnection.ConnectionError) tcp connect (postgres:5555): connection refused - :econnrefused
    (db_connection 2.4.3) lib/db_connection/connection.ex:100: DBConnection.Connection.connect/2
    (connection 1.1.0) lib/connection.ex:622: Connection.enter_connect/5
    (stdlib 4.2) proc_lib.erl:240: :proc_lib.init_p_do_apply/3
Last message: nil
State: Postgrex.Protocol

05:34:55.407 [error] GenServer #PID<0.290.0> terminating
** (DBConnection.ConnectionError) tcp connect (postgres:5555): connection refused - :econnrefused
    (db_connection 2.4.3) lib/db_connection/connection.ex:100: DBConnection.Connection.connect/2
    (connection 1.1.0) lib/connection.ex:622: Connection.enter_connect/5
    (stdlib 4.2) proc_lib.erl:240: :proc_lib.init_p_do_apply/3
Last message: nil
State: Postgrex.Protocol
** (Mix) The database for EctoApp.Repo couldn't be created: killed

いろいろ調べてみたら「postgresqlサーバーが立ち上がってない」だのいろいろ書かれてましたが、docker compose upで立ち上げたpostgresql コンテナは問題なく立ち上がってました。

docker-compose.ymlでentripointも設定して権限もしっかり付与しているので、ecto_appユーザーが接続できてないってこともないです。

念のため確認

% docker compose exec postgres psql -U ecto_app
psql (14.1)
Type "help" for help.

ecto_app=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 ecto_app  | Superuser, Create role, Create DB                          | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

ecto_app=#

ちゃんと権限もありましたね。

configの見直し

接続設定はconfig/config.exsに書かれてます。

import Config

config :ecto_app, EctoApp.Repo,
  database: "ecto_app",
  username: "ecto_app",
  password: "ecto_app_psql",
  hostname: "localhost",
  port: "5555"

config :ecto_app, ecto_repos: [EctoApp.Repo]

if Mix.env() == :dev do
  config :mix_test_watch,
    tasks: [
      "credo"
    ]
end

もともとpostgresqlをローカルにいれていない自分は、DBが必要になったときに毎回postgresql用のdocker-compose.ymlを作っていて、そのtemplateを毎度使っていました。

その設定をそのまま上のconfig.exsに反映していたのがまずかったのです…。

解決策

docker-composeで立ち上げる際のポート、ホストはdocker network上で生成されるものにおき替える必要があります。

docker-composeをみるとdatabaseのホストはpostgres、ポートはdocker network上では5432を開放しています。なのでその通りにconfig.exsを変更してあげる。

import Config

config :ecto_app, EctoApp.Repo,
  database: "ecto_app",
  username: "ecto_app",
  password: "ecto_app_psql",
  hostname: "postgres",
  port: "5432"

config :ecto_app, ecto_repos: [EctoApp.Repo]

if Mix.env() == :dev do
  config :mix_test_watch,
    tasks: [
      "credo"
    ]
end

再度ecto.createしてみると…

% docker compose exec app mix ecto.create
Compiling 3 files (.ex)
Generated ecto_app app
The database for EctoApp.Repo has already been created

なんかすでに作られてましたが、うまくコマンド実行できました。

終わり

postgresqlとelixirの簡単なdocker compose構成が出来上がりました。

これでphoenixにも応用できるはずなので、phoenix tutorialをやる際はちょっとこのリポジトリをいじって圧倒的環境構築したいとおもいます。

Elixir/Phoenix極めるぞー!

(今年の抱負はまた別の記事で)

2022年振り返り

どうもてぃです。

はてぶを始めて初の振り返りです。

今年も頑張りました。早速振り返っていきます。

※多少愚痴が含まれます。苦手な人はブラウザバックお願いシャス。

1月

12/24に息子が生まれたため、1か月育休でした。

新居の引き渡しが2月で引っ越しに向けて荷造りと、子育てと、大忙しであっという間にすぎましたね。 嫁氏も息子も里帰りせず戻ってきたので、子供2人を見ながら引っ越し準備は死ぬほど大変でした。

最高の家に住むためとにかく家のことを頑張りました。よく頑張ったぞ自分。

2月

徐々に仕事再開。

と、新居引き渡しで引っ越し完了!新しい家は最高です。大満足。

Image from Gyazo

やることは山積みで、片づけながら荷解きしたり、デスク環境作ったり、娘の攻撃を受けながら仕事をしたり…

何をやってもうまくいかず大変だった記憶しかない。あまり仕事できなかったですね。

あと、歩道側にブロックがなく土が歩道に流れたりしてたので外構屋さんに先に歩道側の外構をやってもらいました。家のことばっかりですね。

2/9結婚記念日、何もできず、来年は頑張ろう。

個人的にイラっとした出来事 vol.1

業務委託先のMTGで…

もてぃ「引っ越しでネット回線が通ってないのと、働く環境が全然整ってないのであまり稼働できないです。できそうなところがあれば振ってもらいたいです。」

某氏「んー仕事は別にネット通ってなくてもできるので…。そのうえで、もてぃさんは何をやるんですか?」

何をやるんですかぁ?!?!?!wwwwwwwwwwwwwwwwwww

できねぇっていってんじゃんWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

エンジニアの仕事でネット回線がないのは致命的なんですけど…。そして今このMTGで貴重なテザリング通信量使い切りそうなのに、どうやってドキュメント確認するんですか?

という言葉を飲み込んで

もてぃ「そうですね、API定義のところからできればやりたいと思います(くそぼけが)」

このMTGを機に稼働するのをやめて、残タスクだけやりきることにしました。

ほんと、相手の状況も考えずに仕事を振る人っているんですねー(棒読み)。というかMTGの他メンバーフォローしてくれよ…。

文章で見てみると割と普通に感じますが、面と向かって言われたらくsssssっそイラっとしました。すんません。イラっとしたわ。すんません。

3月

前の家で使っていたdmm光を復活させてやっとまともに仕事ができるように。そして娘も「テレビみたぃぃいいいいいいいいいい」ってごねることがなくなりました(最近は見ないんですけどね)。

この月は主に家の初期不具合を直してもらいました。

ダンベルを変に落として傷のついたフローリングもタダで直してくれたのでマジでよかったです。新居で筋トレする予定の人はちゃんとトレーニングマットの上でやりましょう。

あと、忙しい中滑り込みで確定申告をしました。予定納税で20万ほど先に払っていたので、確定申告では10万ほど払っておしまい。所得税高すぎですわ…。

個人的にイラっとした出来事 vol.2

某slackで「子供たちの寝かしつけで稼働遅れます」と投稿したところ、某方に「(もっと稼働)がんばってよぉ~」と言われました。

その方は最近結婚して子供ができたようです。

…たぶん奥さん大変だろうな~と思います。

がんばってください…嫌味ではないです(笑)

4月

新居の2か月点検、 娘の幼稚園入園、息子のお宮参り!

とうとう娘が幼稚園に入りました。あの小さかった娘がねぇー人間になりましたね。よく幼稚園に行き始めると、朝駄々こねて行きたがらない…みたいなことが起きがちなようですが、うちの子は幸い全くなく喜んで行ってました。さすが俺の子だ。

そして、月末に一条工務店のお家見学会が入ったので、嫁さんと全力で荷解きして全て片付けました(一部片づけられなかったものはクローゼットにぶちこんだ)。お家見学会のメリットは一条工務店から広告料的なものが1組あたり5000円もらえるところと、人を呼ぶため部屋が圧倒的にきれいになるところですね。嫁さんが片づけるの苦手なので大変助かります。

部屋が片付いてデスク環境も出来上がったのでガッツリ仕事に集中し始めた月でした。

あ、あと個人開発で住宅ブログを作ったりdmm光からnuro光に乗り換えた月でしたね。住宅ブログ最初の投稿をやってまだ一回も記事書いてない…やばい。

5月

会社のメンツとか呼んで初の新居庭BBQ!

めちゃくちゃ楽しかった。BBQは安い肉でもおいしく感じるから不思議ですね。また来年もやりたい。

先月は住宅ブログを開発してましたが、5月はshopを作ってました。いらないもの売る個人サイト的な。これも住宅ブログ同様、作って満足して全然投稿してないけど。

あと、新しい業務委託を見つけるためいろいろ面談したり、会社のマネジメント合宿があったり、息子の半年記念写真撮りに行ったりといろいろありました。

息子と娘がかわいすぎる。

6月

娘の誕生日月!

3歳になりました。本人曰くお姉さんになったそうで、大きくなったらプリキュアになりたいそうです(笑)超かわいいw 最近はマイメロちゃんとクロミちゃんになりたいといってますがwww

この月は謎にモンハン2ndG配信者に感化されてPSPを大量にヤフオクで落としたりPCパーツを買い集めたりしてました。ちなみにPCパーツ全てそろったのですがまだ作ってないです。ケースだけ机の上に乗ってます(謎)

また、先月面談した会社で業務委託先が決まったので個人開発はいったんストップし、仕事に没頭する日々が始まりました。本業と同じ技術スタックなので楽しみながらやってましたね(なう)。

7月

念願のボッシュ食洗器の導入。

今年買ったのものランキング上位に入る最強家電です。

住宅と同じく高い買い物でしたが、今となっては必須アイテム。なければ生きていけない。

使い方は簡単。使った食器をいれるだけ。大容量なので何も気にせずぶち込んでもちゃーんと洗ってくれる。最強。神。もしかしたら、もう少し大きくなった娘が「大きくなったらボッシュの食洗器になりたい」と言い始めるかもしれない。それくらいパない。

Panasonic製の縦型食洗器??やめとけやめとけ。海外製の食洗器にしとけよ。ボッシュはお買い得だぞ。ミーレやガゲナウよりも安いしな。新居作る人、ぜひボッシュの食洗器導入を考えてくれたまへ。

…と食洗器の話ばかりでしたが、娘と川に遊びに行ったり、娘がけんけんスクーターに乗れるようになったり、保育参観にいったりしました。食洗器の設置時に床をえげつないくらいけずってて嫁氏激おこぷんぷん丸な出来事もありましたが、それはまた住宅ブログにでもかこうかな。

8月

ご近所さんと大分へハーモニーランド旅行にいきやした。

嫁さんの福利厚生でハーモニーランドがタダだったのとご近所さんの福利厚生でホテルがほぼタダだったので、1泊2日を1万前後で旅行できました。最強すぎる。

これも嫁さんの謎コミュ力のおかげです。嫁さん様様。ついでに掃除もしっかりしてくれたまへ。

あと、またモンハン配信者に感化されてPS2を購入し頑張ってモニターに映し出す…みたいな奇行に走ってました。何?ゲームはやったかって?聞くな。

9月

娘の七五三撮影にいってきました。

可愛い、天使、神。

月初にグループ会社の総会にいったんですが、まじで知らない人増えすぎててコミュ症発揮してました。気づいたら今の会社に入って割と古株になってるっぽく、いろんな人に玄人扱いされて困りましたね。人生は誰だってアマチュアなのよ、ワトスン君。

あと、もう住んで半年経つのに外構が全然進んでなく草が半端ないことなってきたので、いったん全体的に掘ってもらって砂利しけるところは敷いてもらいました。

記事を書いてる今の段階でやっとレイアウト終わったので年始からやっとちゃんとした作業に入ってもらえそう。楽しみでやんす~。

10月

なんと、エンジニアになって6年が経過してしまいました。中堅エンジニアじゃん。

子供ができて成長速度が急激に落ちてその葛藤に悩まされ早3年。正直今入ってきてる新人たちにすぐ抜かされそうです。パパエンジニアに助けてもらいたい(精神的に)。

そして少ない勉強時間をかき集め、応用情報技術者試験を受けてきました。

自己採点の結果、午前試験で落ちてた\(^o^)/オワタ

午後の自己採点は余裕で受かってたんですが…午前試験に監査問題多すぎでしたね。計算問題あんまでなくて点数稼げなかった。つらい。

勉強時間の取り方を考えさせられる試験でしたねぇ…次は受かりそうな予感してる(フラグ)ので来年頑張ります。

また、半ばにご近所さんたち(3家)とBBQしました。子供が多すぎて全然集中してご飯食べられなかったですがwww

月末には娘の運動会!まだまだ小さいので午前だけで終わりました。走り回って動画撮った、圧倒的パパしてきました。

最後に家族でコスモスを見に行きました。水巻町っつー割と治安がよくないんですが、最近都市開発されてるっぽいとこで見てきました。

ひたすら娘がかわゆい。水巻はコスモスおおいわー。

11月

会社の全力新規サービス開発合宿!

めっちゃ楽しかったが、新卒との温度感があんまあってなかったなぁと個人的に感じた合宿だった。温度感高いときはもっと全力で開発してくれ!そういう体で合宿来てるだろ!とか思ったりね。

合宿で出来上がるはずだったものが出来上がらないのは歯がゆかった。おのおのやること分担してたけども、やっぱり優先順位をやる前にある程度つけるべきだなと思ったのと、各個人に任せすぎてたってのが素直な感想。人力でできるところはあとでやって、主要なところ先に実装すべきだった。次開発合宿があるなら生かしたい。

フリー素材、新卒たち(ベンチプレス130kg筋肉エンジニアと数独&NBA大好きつよつよエンジニア)

半ばに娘のマラソン大会があったり、宮地嶽神社に七五三行ったり、家のデザインルーバーにスズメがめちゃくちゃ💩するからおもちゃの蛇設置したり、家族でサーカス見に行ったり、雑草を駆除するため除草剤をまいたりした11月でした。

12月

またまた保育参観!娘が体操してるところを初めて見ました。意外と運動神経いいし、3歳児って逆立ちできるんですね。マジですごい、さすが俺の娘。たぶんもう少し大きくなったら「体操選手になりたい」とか言い出したりしてね。

会社では2回目のマネジメント合宿。新卒が入って半年後の会社のことを2日かけて考える合宿です。1回目と違っていろいろ意見が出たり、今後やることがより明確になって、全員が向かっていく方向性を合わせられたのがすげぇよかったです。開発合宿の振り返りもしたかったわなぁー。

あとまたお高い買い物をしました。この子。

ソニーのα7cです。ヨドバシカメラ20thとかいうやつで店頭で買いました。ソニーでもキャッシュバックしていてかなりお買い得だったのと、スマホで運動会や保育参観を撮るのに限界を感じていたので、キャッシュバックキャンペーンに乗っかって買ってしまいました。

嫁さんの友達どうしの写真撮影会でも使ったり、息子の1歳誕生日会でも使ったりと早速活躍してくれてます。まじで買ってよかった。google photoが圧迫されなくて助かる。

息子の1歳誕生日はぐちゃぐちゃw

あんなにちっさかったのに今では軽々アンパンマンのジャングルジムに上るし、気づいたら階段・椅子・ソファーに上ってるし、冷蔵庫も勝手にあけるw めっちゃヤンチャ小僧ですw

怪我しないように在宅マンなので細心の注意を払いながらこれからも大事に育てていきたいですねぇ。私のように大きくなってくれたまへ。

1年を振り返って

思っていた以上に家族マンだったし、割と真面目に仕事もしてたし、コードもあの忙しさの中では書いてた方かなと思いました。

仕事やエンジニア目線のことを書くと、もっと成長できるはずだーっと思いこんで悩んで不安になって頑張ってた一年だった気がします。ただ、この点は前年よりも明らかに改善していて、あと集中力をより高めていけば満足する最低レベルまでは持っていけそうだなと感じました。来年はyoutubetwitterの時間を極力減らして、他のインプット・アウトプットにつなげて行きたい。

正直6年たったそこら辺のエンジニアに比べると💩レベルだと思うので、うんちは💩なりにもっとあがいてレベルを上げていきたいです。自分の状況を言い訳に使わないように時間を有効に使って来年は頑張っていきます。

会社の売り上げも全盛期に比べると全然よくない、むしろやばいくらいなので、もっと売り上げに敏感に、最悪自分が時間外受託して会社に売上計上することも視野に入れながら、でもそんなことにならないよう今あるサービスを全力で全員で伸ばしていこうと思います。

6月までに単月黒字にならなければグループ会社に統合…みたいな話が出てるのでそんなことにならないようまじで頑張る。

家族サービスも今まで通りやってたくさん思い出作っていきたいっすね。

以上、今年の振り返りでした。

次は新年の目標記事でお会いしましょう。

では、よいお年を。さらだばー。

【Ubuntu】apt upgradeでdpkg : breaks: libapt-pkg5.0 (< 1.7~b)が発生したときの対処記録

原因の推察

ubuntu 18.04でnodeのlatestが動かせず、ubuntu 20.04LTSベースのLinux Mint 20 Ulyanaにアップグレードしたのが原因だと思われる…。

nodeがうごかないでもがき苦しんでたTLが以下。

エラー内容

% sudo apt upgrade 
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
アップグレードパッケージを検出しています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 dpkg : 破壊: libapt-pkg5.0 (< 1.7~b) しかし、1.6.14 はインストールされようとしています
E: 壊れたパッケージ

試したこと1

superuser.com

質問者と同じく上手くいかなかった

試したこと2

qiita.com

ほぼ同じエラー内容。ただupgrade listを確認すると…

% apt list --upgradable
一覧表示... 完了
brave-browser/stable 1.44.112 amd64 [1.44.105 からアップグレード可]
firefox-locale-en/tricia 105.0.3+linuxmint1+tricia amd64 [105.0.1+linuxmint1+tricia からアップグレード可]
firefox-locale-ja/tricia 105.0.3+linuxmint1+tricia amd64 [105.0.1+linuxmint1+tricia からアップグレード可]
firefox/tricia 105.0.3+linuxmint1+tricia amd64 [105.0.1+linuxmint1+tricia からアップグレード可]
linux-generic-hwe-18.04/bionic-updates,bionic-security 5.4.0.128.144~18.04.107 amd64 [5.4.0.126.142~18.04.106 からアップグレード可]
linux-headers-generic-hwe-18.04/bionic-updates,bionic-security 5.4.0.128.144~18.04.107 amd64 [5.4.0.126.142~18.04.106 からアップグレード可]
linux-image-generic-hwe-18.04/bionic-updates,bionic-security 5.4.0.128.144~18.04.107 amd64 [5.4.0.126.142~18.04.106 からアップグレード可]
ubuntu-advantage-tools/bionic-updates 27.11.2~18.04.1 amd64 [27.10.1~20.04.1 からアップグレード可]

アップグレード待ちが結構あるんですよね…

とりあえず、記事と同じようにubuntu-advantage-toolsだけ消してみる。

% sudo apt remove ubuntu-advantage-tools
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  distro-info python3-debconf python3-distro-info python3-distupgrade python3-update-manager ubuntu-release-upgrader-core
これを削除するには 'sudo apt autoremove' を利用してください。
以下のパッケージは「削除」されます:
  ttf-mscorefonts-installer ubuntu-advantage-tools update-manager-core update-notifier-common
アップグレード: 0 個、新規インストール: 0 個、削除: 4 個、保留: 8 個。
この操作後に 2,199 kB のディスク容量が解放されます。
続行しますか? [Y/n] Y
(データベースを読み込んでいます ... 現在 562108 個のファイルとディレクトリがインストールされています。)
ttf-mscorefonts-installer (3.7ubuntu6) を削除しています ...
Removing the downloaded fonts...
update-notifier-common (3.192.30.11) を削除しています ...
update-manager-core (1:20.04.10.10) を削除しています ...
dpkg: 警告: update-manager-core の削除中、ディレクトリ '/var/lib/update-manager' が空でないため削除できませんでした
ubuntu-advantage-tools (27.10.1~20.04.1) を削除しています ...
man-db (2.9.1-1) のトリガを処理しています ...

~ 
% sudo apt autoremove
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージは「削除」されます:
  distro-info python3-debconf python3-distro-info python3-distupgrade python3-update-manager ubuntu-release-upgrader-core
アップグレード: 0 個、新規インストール: 0 個、削除: 6 個、保留: 8 個。
この操作後に 1,378 kB のディスク容量が解放されます。
続行しますか? [Y/n] Y
(データベースを読み込んでいます ... 現在 561857 個のファイルとディレクトリがインストールされています。)
distro-info (0.23ubuntu1) を削除しています ...
python3-debconf (1.5.73) を削除しています ...
ubuntu-release-upgrader-core (1:20.04.39) を削除しています ...
python3-distupgrade (1:20.04.39) を削除しています ...
python3-update-manager (1:20.04.10.10) を削除しています ...
python3-distro-info (0.23ubuntu1) を削除しています ...
man-db (2.9.1-1) のトリガを処理しています ...

apt remove時になんか警告出てるが…とりあえず無視したまへ。

満を持してupgrade

% sudo apt upgrade
.
.
.
なんかめっちゃアプグレされてる
.
.
.

成功!!!!!!!!!

最後に

問題なく apt updateも成功しました。

やっぱり、時代はMacよりもLinuxですね。

【Ubuntu】heroku cliでGPGエラー

どうもてぃ。

今回のエラーはいつも出るのでさすがに記事にしてあとで見返そうと思い書くことにしました。

毎回調べるのに疲れた…。

エラー内容

% sudo apt update

ヒット:1 http://ubuntutym.u-toyama.ac.jp/ubuntu bionic InRelease
ヒット:2 http://ubuntutym.u-toyama.ac.jp/ubuntu bionic-updates InRelease                                                                                                                                                          
ヒット:3 http://ubuntutym.u-toyama.ac.jp/ubuntu bionic-backports InRelease                                                                                                                                                                                                                                                   
ヒット:4 https://cli.github.com/packages stable InRelease                                                                                                                                                                                                                                                                    
ヒット:5 http://packages.microsoft.com/repos/code stable InRelease                                                                                                                                                                                                                                                           
無視:6 http://ftp.jaist.ac.jp/pub/Linux/linuxmint/packages tricia InRelease                                                                                                                                                                                                                                                  
ヒット:7 https://repo.steampowered.com/steam stable InRelease                                                                                                                                                                                                                                                                
ヒット:8 http://dl.google.com/linux/chrome/deb stable InRelease                                                                                                                                                                                                                                                              
ヒット:9 http://ftp.jaist.ac.jp/pub/Linux/linuxmint/packages tricia Release                                                                                                                                                                                                                                                  
ヒット:10 https://repo.nordvpn.com/deb/nordvpn/debian stable InRelease                                                                                                                                                                                                                                                       
取得:12 https://packages.cloud.google.com/apt cloud-sdk InRelease [6,751 B]                                                                                                                                                                                                                                                  
ヒット:13 http://apt.postgresql.org/pub/repos/apt bionic-pgdg InRelease                                                                                                                                                                                                                                                      
取得:14 https://packages.stripe.dev/stripe-cli-debian-local stable InRelease [3,427 B]                                                                                                                                                                     
ヒット:15 http://ppa.launchpad.net/alessandro-strada/ppa/ubuntu bionic InRelease                                                                                                                                                                             
ヒット:17 http://archive.canonical.com/ubuntu bionic InRelease                                                                                                                                                                                                              
取得:16 https://cli-assets.heroku.com/branches/stable/apt ./ InRelease [2,550 B]                                                                                                                                                              
エラー:16 https://cli-assets.heroku.com/branches/stable/apt ./ InRelease                                                                                                                                                                      
  公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 536F8F1DE80F6A35
ヒット:19 http://ppa.launchpad.net/chrdevs/figma/ubuntu bionic InRelease                                                                                                     
取得:20 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]                                                                                                                                                                           
ヒット:21 http://ppa.launchpad.net/ethereum/ethereum/ubuntu bionic InRelease                                                                                                                                                                   
ヒット:18 https://packagecloud.io/github/git-lfs/linuxmint tricia InRelease                                                                                                                                                  
ヒット:23 http://ppa.launchpad.net/linuxuprising/java/ubuntu bionic InRelease                                                        
ヒット:22 https://packagecloud.io/slacktechnologies/slack/debian jessie InRelease                                                                                
ヒット:24 http://ppa.launchpad.net/obsproject/obs-studio/ubuntu bionic InRelease                                                     
ヒット:25 http://ppa.launchpad.net/peek-developers/stable/ubuntu bionic InRelease                                                  
取得:26 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [1,224 kB]
ヒット:27 http://ppa.launchpad.net/xuzhen666/ppsspp/ubuntu bionic InRelease                                                       
取得:28 http://security.ubuntu.com/ubuntu bionic-security/universe i386 Packages [1,034 kB]                                                                                                                                                                                                                                  
取得:29 http://security.ubuntu.com/ubuntu bionic-security/universe Translation-en [282 kB]                                                                                                                                                                                                                                   
2,641 kB を 8秒 で取得しました (327 kB/s)                                                                                                                                                                                                                                                                                    
パッケージリストを読み込んでいます... 完了
W: 署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: https://cli-assets.heroku.com/branches/stable/apt ./ InRelease: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 536F8F1DE80F6A35
W: https://cli-assets.heroku.com/branches/stable/apt/./InRelease の取得に失敗しました  公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 536F8F1DE80F6A35
W: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。

NO_PUBKEY 536F8F1DE80F6A35

これ。システム側にGPGエラーで出てきたキーがないとのこと。なので追加してあげます。

解決方法

% sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 536F8F1DE80F6A35

Executing: /tmp/apt-key-gpghome.a9Y6s4DyNb/gpg.1.sh --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 536F8F1DE80F6A35
gpg: 鍵536F8F1DE80F6A35: 公開鍵"Heroku Inc. <support@heroku.com>"をインポートしました
gpg: 処理数の合計: 1
gpg:               インポート: 1

問題なくシステム側にpublic keyがインポートできました。

終わり

% sudo apt update
ヒット:1 http://ubuntutym.u-toyama.ac.jp/ubuntu bionic InRelease
ヒット:2 http://ubuntutym.u-toyama.ac.jp/ubuntu bionic-updates InRelease                                                                                                                                                                                                                                                     
ヒット:3 http://ubuntutym.u-toyama.ac.jp/ubuntu bionic-backports InRelease                                                                                                                                                                                                                                                   
無視:4 http://ftp.jaist.ac.jp/pub/Linux/linuxmint/packages tricia InRelease                                                                                                                                                                                                                                                  
ヒット:5 http://ftp.jaist.ac.jp/pub/Linux/linuxmint/packages tricia Release                                                                                                                                                                                                                                                  
ヒット:6 https://cli.github.com/packages stable InRelease                                                                                                                                                                                                                                                                    
取得:7 https://cli-assets.heroku.com/branches/stable/apt ./ InRelease [2,550 B]                                                                                                                                                                                                                                              
ヒット:8 http://dl.google.com/linux/chrome/deb stable InRelease                                                                                                                                                                                                                                                              
ヒット:9 https://repo.nordvpn.com/deb/nordvpn/debian stable InRelease                                                                                                                                                                                                                                                        
ヒット:10 https://packages.cloud.google.com/apt cloud-sdk InRelease                                                                                                                                                                                                                                                          
ヒット:12 https://repo.steampowered.com/steam stable InRelease                                                                                                                                                                                                                                                               
ヒット:13 http://security.ubuntu.com/ubuntu bionic-security InRelease                                                                                                                                                                                                                                                        
取得:14 https://cli-assets.heroku.com/branches/stable/apt ./ Packages [608 B]                                                                                                                                                                                                            
ヒット:16 http://archive.canonical.com/ubuntu bionic InRelease                                                                                                                                                                                                                                                               
ヒット:17 http://ppa.launchpad.net/alessandro-strada/ppa/ubuntu bionic InRelease                                                                                                                                                                                                                                             
ヒット:18 http://packages.microsoft.com/repos/code stable InRelease                                                                                                                                                                                                                                                          
ヒット:19 http://apt.postgresql.org/pub/repos/apt bionic-pgdg InRelease                                                                                                                                                                                                                                                      
ヒット:15 https://packagecloud.io/github/git-lfs/linuxmint tricia InRelease                                                                                                                                                         
ヒット:21 http://ppa.launchpad.net/chrdevs/figma/ubuntu bionic InRelease                                                                                  
ヒット:20 https://packagecloud.io/slacktechnologies/slack/debian jessie InRelease                                                                                                             
ヒット:22 http://ppa.launchpad.net/ethereum/ethereum/ubuntu bionic InRelease                                                                                                                  
取得:23 https://packages.stripe.dev/stripe-cli-debian-local stable InRelease [3,427 B]                                        
ヒット:24 http://ppa.launchpad.net/linuxuprising/java/ubuntu bionic InRelease                     
ヒット:25 http://ppa.launchpad.net/obsproject/obs-studio/ubuntu bionic InRelease                
ヒット:26 http://ppa.launchpad.net/peek-developers/stable/ubuntu bionic InRelease               
ヒット:27 http://ppa.launchpad.net/xuzhen666/ppsspp/ubuntu bionic InRelease                                                                                                                                                                                                                                                  
6,585 B を 6秒 で取得しました (1,058 B/s)                                                                                                                                                                                                                                                                                    
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています       
状態情報を読み取っています... 完了
パッケージはすべて最新です。

よいUbuntuライフを。

【Prisma】upsertがうまく動かないときに確認すること

おひさしどうもてぃです。

最近は個人開発で自分のshopだったりhomeブログだったり作っていて、あまり記事をアウトプットできてなかったので書きます。

いつも通り解決シリーズです。

環境

  • NestJS 8.0.0
  • Prisma client 4.0.0

NestJS × Prisma × GraphQLの構成です。

問題

Prismaのupsertで要求されるwhereの型にidしか表示されず、他の条件(たとえばemailとか)を入れたとしてもエラーを返されていました。

該当のコードはこちら。

import { Injectable } from '@nestjs/common'
import { Prisma, User } from '@prisma/client'
import { PrismaService } from '~/prisma/prisma.service'

@Injectable()
export class UsersService {
  constructor(private readonly prisma: PrismaService) {}

  // auth validateで使用
  async findOrCreateBy(email: string): Promise<User> {
    return await this.prisma.user.upsert({
      where: { email: email },
      update: { email: email },
      create: { email: email, name: 'test user' },
    })
  }
}

ちな、Prisma公式を参考にしました。

www.prisma.io

上のままだと型のエラーが出ていたのでupsertの定義元の型を確認してみました。

すると…

  /**
   * User upsert
   */
  export type UserUpsertArgs = {
    /**
     * Select specific fields to fetch from the User
     * 
    **/
    select?: UserSelect | null
    /**
     * Choose, which related nodes to fetch as well.
     * 
    **/
    include?: UserInclude | null
    /**
     * The filter to search for the User to update in case it exists.
     * 
    **/
    where: UserWhereUniqueInput
    /**
     * In case the User found by the `where` argument doesn't exist, create a new User with this data.
     * 
    **/
    create: XOR<UserCreateInput, UserUncheckedCreateInput>
    /**
     * In case the User was found with the provided `where` argument, update it with this data.
     * 
    **/
    update: XOR<UserUpdateInput, UserUncheckedUpdateInput>
  }
  .
  .
  .

  export type UserWhereUniqueInput = {
    id?: string
  }

upsertのwhereに使われているのは UserWhereUniqueInputで、この子を確認してみるとidしか型にない…

どういうこと!?

公式をもっとちゃんと見ましょう

そういうこと。

Upsertのところをもっとちゃんと見てみましょう。

www.prisma.io

↑のwhereのところに注目。

Wraps all unique fields of a model so that individual records can be selected

unique field、これだわ。

もっとわかりやっすく書いてほしい…(切実)、せめて大文字とか。

解決

ということで、prisma.schemaにunique制約をかけて…

// User(ユーザー)
model User {
  id             String     @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
  email          String?    @unique() @default("")
  phoneNumber    String?    @unique() @default("") @map("phone_number")
  companyName    String?    @default("") @map("company_name")
  address String?    @default("")

  createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6)
  updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz(6)
}

マイグレーションをかければ

$ npx prisma migrate dev --name add_unique --skip-seed

UserWhereUniqueInputがこんな感じになりました。

  export type UserWhereUniqueInput = {
    id?: string
    email?: string
    phoneNumber?: string
  }

ちゃんとUnique制約つけたカラムが追加されてました。

【docker】dockerコマンドにサブコマンドのcomposeを導入する

どうもてぃ。

もてぃ家に新たに家族が増えました。可愛らしい男の子です。

そして新居も引き渡され、やっと落ち着いてきた次第。

環境

% cat /etc/os-release 
NAME="Linux Mint"
VERSION="19.3 (Tricia)"
ID=linuxmint
ID_LIKE=ubuntu
PRETTY_NAME="Linux Mint 19.3"
VERSION_ID="19.3"
HOME_URL="https://www.linuxmint.com/"
SUPPORT_URL="https://forums.linuxmint.com/"
BUG_REPORT_URL="http://linuxmint-troubleshooting-guide.readthedocs.io/en/latest/"
PRIVACY_POLICY_URL="https://www.linuxmint.com/"
VERSION_CODENAME=tricia
UBUNTU_CODENAME=bionic

% docker -v
Docker version 20.10.7, build 20.10.7-0ubuntu5~18.04.3

github公式のインストールコマンドを実行

こちらを参考。

github.com

ま、結論から言えば失敗です。

% docker compose version
docker: 'compose' is not a docker command.
See 'docker --help'

docker V2公式ドキュメントを見る

自分はubuntuを使っているので、ここを参照。

docs.docker.com

まんまここに書いてる通りで上手く行きました。公式 is best.

% docker compose version
Docker Compose version v2.2.3

【docker】コンテナの再起動を通知したい

どうもてぃです。

Herokuのようにインスタンスを定期的に再起動したい。そんなことを思ったことはありませんか?僕だけですか?

自社サービスをコンテナで動かしているのですが、原因不明でVMにアクセスできなくなり、VMを再起動しコンテナも同じく再起動する…といったかなり良くない運用方法で進めていたので、コンテナを定期的に再起動して対応してみました(主な原因としては、workerのコンテナでredisと突然接続できなくなるものでした)。

環境

  • GCE (VM: CentOS)
  • docker
  • docker-compose(アプリケーション側の構成用)

slack-dockerを使用する

当初はcronでコンテナを再起動したあと、slack通知用にスクリプトを組もうと考えていて、cron実行ユーザー用に環境を作ろうか…と思いましたがめんどくさくなり、

「え、これもコンテナでよくね?なんかimageあるやろ」

と思いしらべたらすぐに見つかりました。

github.com

slack-dockerコンテナにホスト側のdockerプロセスを同期し、更に通知したいwebhook urlを渡してあげるだけで通知が完了します。

slackのincoming webhookのURLは↓

https://my.slack.com/services/new/incoming-webhook

URLが出てきたら以下のコマンドを実行する。

$ docker run -d -e webhook="上で作ったincoming webhook url" -h "$(hostname)" -v /var/run/docker.sock:/var/run/docker.sock ghcr.io/int128/slack-docker

設定がうまくいくとchannelに通知が行きます

f:id:rdwbocungelt5:20211116100001p:plain

すばらしい...

IaaSでdockerを使う場合はこれを採用すると幸せになりますね(IaaSでコンテナ立てるのは微妙なんですがね)