diff --git a/.dockerignore b/.dockerignore
index 854e643d393b0db52077a639fa9f56f332b31449..8f984831ef86c7d422e53886931c7626f403a412 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -16,9 +16,15 @@ files/
 misskey-assets/
 fluent-emojis/
 .pnp.*
+
+# .yarn関連
 .yarn/*
 !.yarn/patches
 !.yarn/plugins
 !.yarn/releases
 !.yarn/sdks
 !.yarn/versions
+
+.idea/
+packages/*/.vscode/
+packages/backend/test/docker-compose.yml
diff --git a/.dockleignore b/.dockleignore
new file mode 100644
index 0000000000000000000000000000000000000000..7b17e9c9b5a1533a7dae2c6a6764b56d513eb42b
--- /dev/null
+++ b/.dockleignore
@@ -0,0 +1,2 @@
+DKL-DI-0006
+DKL-LI-0003
diff --git a/.github/workflows/dockle.yml b/.github/workflows/dockle.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9b79ee54f0ac3ea5e02e102ba4a426e629480c37
--- /dev/null
+++ b/.github/workflows/dockle.yml
@@ -0,0 +1,30 @@
+---
+name: Dockle
+
+on:
+  push:
+    branches:
+      - master
+      - develop
+  pull_request:
+
+jobs:
+  dockle:
+    runs-on: ubuntu-latest
+    env:
+      DOCKER_CONTENT_TRUST: 1
+    steps:
+      - uses: actions/checkout@v3.2.0
+      - run: |
+          curl -L -o dockle.deb "https://github.com/goodwithtech/dockle/releases/download/v0.4.10/dockle_0.4.10_Linux-64bit.deb"
+          sudo dpkg -i dockle.deb
+      - run: |
+          cp .config/docker_example.env .config/docker.env
+          cp ./docker-compose.yml.example ./docker-compose.yml
+      - run: |
+          docker compose up -d web
+          docker tag "$(docker compose images web | awk 'OFS=":" {print $4}' | tail -n +2)" misskey-web:latest
+      - run: |
+          cmd="dockle --exit-code 1 misskey-web:latest ${image_name}"
+          echo "> ${cmd}"
+          eval "${cmd}"
diff --git a/Dockerfile b/Dockerfile
index 3876b5f6ce2e758f38b2be1acd084d2edffc82ed..9b6f2f7e30cac0a05b49e589b36c0246bbe98aa4 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -8,7 +8,9 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
 	; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache \
 	&& apt-get update \
 	&& apt-get install -yqq --no-install-recommends \
-	build-essential
+	build-essential wget ca-certificates \
+	&& wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq \
+	&& chmod +x /usr/bin/yq
 
 RUN corepack enable
 
@@ -29,6 +31,7 @@ ARG NODE_ENV=production
 
 RUN git submodule update --init
 RUN pnpm build
+RUN rm -rf .git/
 
 FROM node:${NODE_VERSION}-slim AS runner
 
@@ -42,13 +45,17 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
 	&& apt-get update \
 	&& apt-get install -y --no-install-recommends \
 	ffmpeg tini \
+	&& rm -rf /var/lib/apt/lists \
 	&& corepack enable \
 	&& groupadd -g "${GID}" misskey \
-	&& useradd -l -u "${UID}" -g "${GID}" -m -d /misskey misskey
+	&& useradd -l -u "${UID}" -g "${GID}" -m -d /misskey misskey \
+	&& find / -type f -perm /u+s -ignore_readdir_race -exec chmod u-s {} \; \
+	&& find / -type f -perm /g+s -ignore_readdir_race -exec chmod g-s {} \;
 
 USER misskey
 WORKDIR /misskey
 
+COPY --from=builder /usr/bin/yq /usr/bin/yq
 COPY --chown=misskey:misskey --from=builder /misskey/node_modules ./node_modules
 COPY --chown=misskey:misskey --from=builder /misskey/built ./built
 COPY --chown=misskey:misskey --from=builder /misskey/packages/backend/node_modules ./packages/backend/node_modules
@@ -58,5 +65,6 @@ COPY --chown=misskey:misskey --from=builder /misskey/fluent-emojis /misskey/flue
 COPY --chown=misskey:misskey . ./
 
 ENV NODE_ENV=production
+HEALTHCHECK --interval=5s --retries=20 CMD ["/bin/bash", "/misskey/healthcheck.sh"]
 ENTRYPOINT ["/usr/bin/tini", "--"]
 CMD ["pnpm", "run", "migrateandstart"]
diff --git a/healthcheck.sh b/healthcheck.sh
new file mode 100644
index 0000000000000000000000000000000000000000..f8e598b28233bee1c0e765b67b4931aed498f02d
--- /dev/null
+++ b/healthcheck.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+PORT=$(yq '.port' /misskey/.config/default.yml)
+curl -s -S -o /dev/null "http://localhost:${PORT}"