prismaでopensslのバージョンエラーが出た

いろんなエラーが入り混じってたので、まとめる
出てたエラー(以下はそれぞれ別の問題)
- opensslのバージョンが古いエラー
- https://zenn.dev/link/comments/f8f61b11bde2bd
- これはopensslのバージョンを上げて解決
- alpine3.21からopensslの場所が変わったことによるエラー
- https://zenn.dev/link/comments/cb5b456c70d1ca
- これはopensslの場所をprismaに対応させて解決

prisma: 6.0.0
使ってる。
Dockerで動かしたら以下のエラーが出るようになった。
prisma:warn Prisma failed to detect the libssl/openssl version to use, and may not work as expected. Defaulting to "openssl-1.1.x".
...
The Prisma engines do not seem to be compatible with your system. Please refer to the documentation about Prisma's system requirements: https://pris.ly/d/system-requirements
...
system requirements見てみると、
Debian or others 1.0.x glibc 2.19+
Debian or others 1.1.x, 3.x glibc 2.24+
どっちだ。と思ったけど、使ってるベースイメージはglibc 2.24+使ってそうだから、後者かな?
$ docker run -it node:20-bookworm-slim bash
# ldd --version
ldd (Debian GLIBC 2.36-9+deb12u9) 2.36
だとしても、1.1系で良さそうだけど。

とりあえず、3系にアップデートしてみる。
...
# Use node image for base image for all stages.
FROM node:${NODE_VERSION}-bookworm-slim AS base
# Set working directory for all build stages.
WORKDIR /usr/src/app
# Update openssl 3.x
+ RUN apt-get update && apt-get upgrade openssl -y \
+ && apt-get clean \
+ && rm -rf /var/lib/apt/lists/*
...
エラー解消された。

こっからは調査
prisma 6にアップデートしたから、出るようになったのかな?
調べる。

Debian 12 (Bookworm) debian-openssl-3.0.x 3.0.x

そういえば、schema.prismaにbinaryTargets指定してたの忘れてた。

binaryTargets
はengineのバイナリを生成する時にどのプラットフォーム向けに作るか指定するやつ。
ローカルはmacでデプロイ先はbookworm(Dockerfileで指定したやつ)なので、
binaryTargets = ["native", "debian-openssl-3.0.x"]

こっからは別の問題だった。
うまくいってた頃。もともとはnode:20-apineを使ってた。(いまはnode:20-bookworm-slim)
Prisma: 5.21.1
----
binaryTargets = ["native", "rhel-openssl-1.0.x"] // なんでこうしたんだっけか?
---
base image: node:20-alpine
エラー出た。

まずこうしてみる。
Prisma: 6.0.0
----
binaryTargets = ["native", "linux-musl-arm64-openssl-1.1.x"]
---
base image: node:20-alpine3.16 // opensslは1.1x
成功した。

次はこう。
Prisma: 6.0.0
----
binaryTargets = ["native", "linux-musl-arm64-openssl-1.1.x"]
---
- base image: node:20-alpine3.16 // opensslは1.1x
+ base image: node:20-alpine3.17 // opensslは3.x
できた。

alpine3.16, 3.17でbinaryTargets:"rhel-openssl-1.0.x"
Prisma: 6.0.0
----
binaryTargets = ["native", "rhel-openssl-1.0.x"] // なんでこうしたんだっけか?
---
base image: node:20-alpine3.16 // opensslは1.1x
base image: node:20-alpine3.17 // opensslは3.x
できた。
binartTargetsは関係ないのか?
あ、今はローカルで検証中。

alpine指定せずに、binaryTargetsをいじる。
Prisma: 6.0.0
----
binaryTargets = ["native", "linux-musl-arm64-openssl-3.x"]
---
base image: node:20-alpine
ビルドができなかった。
やっぱ、binaryTargets関係あるよな。
prisma:warn Prisma failed to detect the libssl/openssl version to use, and may not work as expected. Defaulting to "openssl-1.1.x".

Prisma: 6.0.0
----
- binaryTargets = ["native", "linux-musl-arm64-openssl-3.x"]
+ binaryTargets = ["native", "linux-musl-arm64-openssl-1.1.x"]
---
base image: node:20-alpine
buildはできたけど、エラー

alpineのバージョン指定しない時だけエラー。
でも、3.18を見てるはずで、alpine3.18にしたときは、エラーでなかった。
いや、3.21見てるか。
3.21指定したら同じエラー出たからそうだ。

こんなツイート発見

3.21からopensslの場所が変わったらしい。
RUN ln -s /usr/lib/libssl.so.3 /lib/libssl.so.3
を実行したらうまくいった。
なるほど〜〜〜〜
Prisma: 6.0.0
----
binaryTargets = ["native", "linux-musl-arm64-openssl-1.1.x"]
---
base image: node:20-alpine

binaryTargetsを3系にすると、ビルド失敗する。
10.55 Error: Unknown binary target linux-musl-arm64-openssl-3.x in generator client.
10.55 Possible binaryTargets: darwin, darwin-arm64, debian-openssl-1.0.x, debian-openssl-1.1.x, debian-openssl-3.0.x, rhel-openssl-1.0.x, rhel-openssl-1.1.x, rhel-openssl-3.0.x, linux-arm64-openssl-1.1.x, linu
x-arm64-openssl-1.0.x, linux-arm64-openssl-3.0.x, linux-arm-openssl-1.1.x, linux-arm-openssl-1.0.x, linux-arm-openssl-3.0.x, linux-musl, linux-musl-openssl-3.0.x, linux-musl-arm64-openssl-1.1.x, linux-musl-arm
64-openssl-3.0.x, linux-nixos, linux-static-x64, linux-static-arm64, windows, freebsd11, freebsd12, freebsd13, freebsd14, freebsd15, openbsd, netbsd, arm, native
が出るぞ。
Prisma: 6.0.0
----
binaryTargets = ["native", "linux-musl-arm64-openssl-3.x"]
---
base image: node:20-alpine

おっと、ビルド通らないのは凡ミスだ。
Prisma: 6.0.0
----
- binaryTargets = ["native", "linux-musl-arm64-openssl-3.x"]
+ binaryTargets = ["native", "linux-musl-arm64-openssl-3.0.x"]
---
base image: node:20-alpine
3.0.xにして、RUN ln -s /usr/lib/libssl.so.3 /lib/libssl.so.3したらうまくいきました。

まとめると。
alpineのバージョンを指定してなかったので、3.21にバージョン上がった時にopensslの場所が変わってエラーが出てた。