diff --git a/.config/example.yml b/.config/example.yml
index 2d1e82ee0b..c7884a3687 100644
--- a/.config/example.yml
+++ b/.config/example.yml
@@ -107,23 +107,51 @@ port: 3000
# Proxy trust settings
#
-# Changes how the server interpret the origin IP of the request.
+# Specifies the IP addresses that Misskey will use as trusted
+# reverse proxies (e.g., nginx, Cloudflare). This affects how
+# Misskey determines the source IP for each request and is used
+# for important rate limiting and security features. If the value
+# is not set correctly, Misskey may use the IP address of the
+# reverse proxy instead of the actual source IP, which may lead to
+# unintended rate limiting or security vulnerabilities.
+# By default, the loopback network and private network address
+# ranges shown below are trusted.
+# If you are using a single reverse proxy and it is on the same
+# machine or the same private network as Misskey, it is unlikely you
+# need to change this setting, and the default setting is fine.
+# Also, if you are using multiple reverse proxy servers and they are
+# all on the same private network as Misskey, the default setting
+# is fine.
+# However, if you are using a reverse proxy server that accesses
+# Misskey web servers and streaming servers via public IP addresses
+# (for example, Cloudflare), you must set this variable.
+# When changing this setting, you can use one of the following values:
#
-# Any format supported by Fastify is accepted.
-# Default: trust all proxies (i.e. trustProxy: true)
-# See: https://fastify.dev/docs/latest/reference/server/#trustproxy
-# To improve security, we recommend that you configure your settings appropriately.
-# Incorrect configuration can cause issues such as difficulty signing in,
-# so please configure your settings carefully.
+# - true: Trust all proxies
+# - false: Do not trust any proxies
+# - IP address, IP address range, or array of them: Trust hops that
+# match the specified criteria.
+# - Integer: Trust the nth hop from the front-facing proxy server as
+# the client.
+# For more information on how to configure this setting, please refer
+# to the Fastify documentation:
+# https://fastify.dev/docs/latest/Reference/Server/#trustproxy
#
-#trustProxy: [
-# '10.0.0.0/8'
-# '172.16.0.0/12'
-# '192.168.0.0/16'
-# '127.0.0.1/32'
-# '::1/128'
-# 'fc00::/7'
-#]
+# Note that if this variable is set, it overrides the default range,
+# so if you have both an external reverse proxy and a proxy on the
+# local host, you must include both IPs (or IP ranges).
+#
+#trustProxy:
+# - '10.0.0.0/8'
+# - '172.16.0.0/12'
+# - '192.168.0.0/16'
+# - '127.0.0.1/32'
+# - '::1/128'
+# - 'fc00::/7'
+# # Example: If you are using some external reverse proxies like CDNs,
+# # you may need to add the CDN IP ranges here.
+# # If you're using Cloudflare, you can find IP Ranges at:
+# # https://www.cloudflare.com/ips/
# ┌──────────────────────────┐
#───┘ PostgreSQL configuration └────────────────────────────────
@@ -293,6 +321,10 @@ id: 'aidx'
# Whether disable HSTS
#disableHsts: true
+# Enable internal IP-based rate limiting (default: true)
+# To configure them in reverse proxy instead, set this to false.
+#enableIpRateLimit: true
+
# Number of worker processes
#clusterLimit: 1
diff --git a/.dockerignore b/.dockerignore
index f204349160..39cbe2726f 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -6,6 +6,7 @@
Dockerfile
build/
built/
+src-js/
db/
.devcontainer/compose.yml
node_modules/
diff --git a/.github/ISSUE_TEMPLATE/01_bug-report.yml b/.github/ISSUE_TEMPLATE/01_bug-report.yml
index fd68e602dd..00da7e9a2a 100644
--- a/.github/ISSUE_TEMPLATE/01_bug-report.yml
+++ b/.github/ISSUE_TEMPLATE/01_bug-report.yml
@@ -54,7 +54,7 @@ body:
* Model and OS of the device(s): MacBook Pro (14inch, 2021), macOS Ventura 13.4
* Browser: Chrome 113.0.5672.126
* Server URL: misskey.example.com
- * Misskey: 2025.x.x
+ * Misskey: 2026.x.x
value: |
* Model and OS of the device(s):
* Browser:
@@ -74,7 +74,7 @@ body:
Examples:
* Installation Method or Hosting Service: docker compose, k8s/docker, systemd, "Misskey install shell script", development environment
- * Misskey: 2025.x.x
+ * Misskey: 2026.x.x
* Node: 20.x.x
* PostgreSQL: 18.x.x
* Redis: 7.x.x
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
new file mode 100644
index 0000000000..7c30489afe
--- /dev/null
+++ b/.github/copilot-instructions.md
@@ -0,0 +1,3 @@
+# Copilot Instructions for Misskey
+
+- en-US.yml を編集しないでください。
diff --git a/.github/workflows/api-misskey-js.yml b/.github/workflows/api-misskey-js.yml
index 49ca3058f3..1a35b86041 100644
--- a/.github/workflows/api-misskey-js.yml
+++ b/.github/workflows/api-misskey-js.yml
@@ -16,13 +16,13 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v6.0.1
+ uses: actions/checkout@v6.0.2
- name: Setup pnpm
- uses: pnpm/action-setup@v4.2.0
+ uses: pnpm/action-setup@v4.4.0
- name: Setup Node.js
- uses: actions/setup-node@v6.1.0
+ uses: actions/setup-node@v6.3.0
with:
node-version-file: '.node-version'
cache: 'pnpm'
diff --git a/.github/workflows/changelog-check.yml b/.github/workflows/changelog-check.yml
index d17999a271..37664e950e 100644
--- a/.github/workflows/changelog-check.yml
+++ b/.github/workflows/changelog-check.yml
@@ -12,9 +12,9 @@ jobs:
steps:
- name: Checkout head
- uses: actions/checkout@v6.0.1
+ uses: actions/checkout@v6.0.2
- name: Setup Node.js
- uses: actions/setup-node@v6.1.0
+ uses: actions/setup-node@v6.3.0
with:
node-version-file: '.node-version'
diff --git a/.github/workflows/check-misskey-js-autogen.yml b/.github/workflows/check-misskey-js-autogen.yml
index 8a81e85521..a31a4d85fa 100644
--- a/.github/workflows/check-misskey-js-autogen.yml
+++ b/.github/workflows/check-misskey-js-autogen.yml
@@ -18,7 +18,7 @@ jobs:
if: ${{ github.event.pull_request.mergeable == null || github.event.pull_request.mergeable == true }}
steps:
- name: checkout
- uses: actions/checkout@v6.0.1
+ uses: actions/checkout@v6.0.2
with:
submodules: true
persist-credentials: false
@@ -29,7 +29,7 @@ jobs:
- name: setup node
id: setup-node
- uses: actions/setup-node@v6.1.0
+ uses: actions/setup-node@v6.3.0
with:
node-version-file: '.node-version'
cache: pnpm
@@ -66,7 +66,7 @@ jobs:
if: ${{ github.event.pull_request.mergeable == null || github.event.pull_request.mergeable == true }}
steps:
- name: checkout
- uses: actions/checkout@v6.0.1
+ uses: actions/checkout@v6.0.2
with:
submodules: true
persist-credentials: false
diff --git a/.github/workflows/check-misskey-js-version.yml b/.github/workflows/check-misskey-js-version.yml
index ad07d47b65..f6095110c9 100644
--- a/.github/workflows/check-misskey-js-version.yml
+++ b/.github/workflows/check-misskey-js-version.yml
@@ -20,7 +20,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v6.0.1
+ uses: actions/checkout@v6.0.2
- name: Check version
run: |
if [ "$(jq -r '.version' package.json)" != "$(jq -r '.version' packages/misskey-js/package.json)" ]; then
diff --git a/.github/workflows/check-spdx-license-id.yml b/.github/workflows/check-spdx-license-id.yml
index fe71473ea3..d1448fc5d0 100644
--- a/.github/workflows/check-spdx-license-id.yml
+++ b/.github/workflows/check-spdx-license-id.yml
@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v6.0.1
+ uses: actions/checkout@v6.0.2
- name: Check
run: |
counter=0
diff --git a/.github/workflows/check_copyright_year.yml b/.github/workflows/check_copyright_year.yml
index 40016d39c5..7514358929 100644
--- a/.github/workflows/check_copyright_year.yml
+++ b/.github/workflows/check_copyright_year.yml
@@ -10,7 +10,7 @@ jobs:
check_copyright_year:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
- run: |
if [ "$(grep Copyright COPYING | sed -e 's/.*2014-\([0-9]*\) .*/\1/g')" -ne "$(date +%Y)" ]; then
echo "Please change copyright year!"
diff --git a/.github/workflows/deploy-test-environment.yml b/.github/workflows/deploy-test-environment.yml
index 32c7c6b6ea..77464b6465 100644
--- a/.github/workflows/deploy-test-environment.yml
+++ b/.github/workflows/deploy-test-environment.yml
@@ -28,7 +28,7 @@ jobs:
wait_time: ${{ steps.get-wait-time.outputs.wait_time }}
steps:
- name: Checkout
- uses: actions/checkout@v6.0.1
+ uses: actions/checkout@v6.0.2
- name: Check allowed users
id: check-allowed-users
diff --git a/.github/workflows/docker-develop.yml b/.github/workflows/docker-develop.yml
index 8a97959907..bedd501bc9 100644
--- a/.github/workflows/docker-develop.yml
+++ b/.github/workflows/docker-develop.yml
@@ -27,7 +27,7 @@ jobs:
platform=${{ matrix.platform }}
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
- name: Check out the repo
- uses: actions/checkout@v6.0.1
+ uses: actions/checkout@v6.0.2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
index 37f6aca588..fec5d1d530 100644
--- a/.github/workflows/docker.yml
+++ b/.github/workflows/docker.yml
@@ -32,7 +32,7 @@ jobs:
platform=${{ matrix.platform }}
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
- name: Check out the repo
- uses: actions/checkout@v6.0.1
+ uses: actions/checkout@v6.0.2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Docker meta
diff --git a/.github/workflows/dockle.yml b/.github/workflows/dockle.yml
index 45b8d23dda..916b905fd0 100644
--- a/.github/workflows/dockle.yml
+++ b/.github/workflows/dockle.yml
@@ -11,38 +11,43 @@ on:
jobs:
dockle:
runs-on: ubuntu-latest
+
env:
DOCKER_CONTENT_TRUST: 1
DOCKLE_VERSION: 0.4.15
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
- name: Download and install dockle v${{ env.DOCKLE_VERSION }}
run: |
+ set -eux
curl -L -o dockle.deb "https://github.com/goodwithtech/dockle/releases/download/v${DOCKLE_VERSION}/dockle_${DOCKLE_VERSION}_Linux-64bit.deb"
sudo dpkg -i dockle.deb
- - run: |
- cp .config/docker_example.env .config/docker.env
- cp ./compose_example.yml ./compose.yml
-
- - run: |
- docker compose up -d web
- IMAGE_ID=$(docker compose images --format json web | jq -r '.[0].ID')
- docker tag "${IMAGE_ID}" misskey-web:latest
-
- - name: Prune docker junk (optional but recommended)
+ - name: Build web image (docker build)
run: |
- docker system prune -af
- docker volume prune -f
+ set -eux
+ docker build -t "misskey-web:ci" .
+ docker image ls
- - name: Save image for Dockle
+ - name: Mount tmpfs for Dockle tar
+ env:
+ TMPFS_SIZE: 8G
run: |
- docker save misskey-web:latest -o ./misskey-web.tar
- ls -lh ./misskey-web.tar
+ set -eux
+ sudo mkdir -p /mnt/dockle-tmp
+ sudo mount -t tmpfs -o size=${{ env.TMPFS_SIZE }} tmpfs /mnt/dockle-tmp
+ free -h
+ df -h
- - name: Run Dockle with tar input
+ - name: Save image tar into tmpfs
run: |
- dockle --exit-code 1 --input ./misskey-web.tar
+ set -eux
+ docker save misskey-web:ci -o /mnt/dockle-tmp/misskey-web.tar
+ ls -lh /mnt/dockle-tmp/misskey-web.tar
+ - name: Run Dockle Scan (tar input)
+ run: |
+ set -eux
+ dockle --exit-code 1 --input /mnt/dockle-tmp/misskey-web.tar
diff --git a/.github/workflows/get-api-diff.yml b/.github/workflows/get-api-diff.yml
index f8a0c4aaa4..c7ab3e2a29 100644
--- a/.github/workflows/get-api-diff.yml
+++ b/.github/workflows/get-api-diff.yml
@@ -25,14 +25,14 @@ jobs:
ref: refs/pull/${{ github.event.number }}/merge
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
with:
ref: ${{ matrix.ref }}
submodules: true
- name: Setup pnpm
- uses: pnpm/action-setup@v4.2.0
+ uses: pnpm/action-setup@v4.4.0
- name: Use Node.js
- uses: actions/setup-node@v6.1.0
+ uses: actions/setup-node@v6.3.0
with:
node-version-file: '.node-version'
cache: 'pnpm'
diff --git a/.github/workflows/get-backend-memory.yml b/.github/workflows/get-backend-memory.yml
index 99f89631bb..0dcaaa8cb3 100644
--- a/.github/workflows/get-backend-memory.yml
+++ b/.github/workflows/get-backend-memory.yml
@@ -40,14 +40,14 @@ jobs:
- 56312:6379
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
with:
ref: ${{ matrix.ref }}
submodules: true
- name: Setup pnpm
- uses: pnpm/action-setup@v4.2.0
+ uses: pnpm/action-setup@v4.4.0
- name: Use Node.js
- uses: actions/setup-node@v6.1.0
+ uses: actions/setup-node@v6.3.0
with:
node-version-file: '.node-version'
cache: 'pnpm'
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 91cbe52c38..0d9ac81314 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -36,13 +36,13 @@ jobs:
pnpm_install:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
with:
fetch-depth: 0
submodules: true
- name: Setup pnpm
- uses: pnpm/action-setup@v4.2.0
- - uses: actions/setup-node@v6.1.0
+ uses: pnpm/action-setup@v4.4.0
+ - uses: actions/setup-node@v6.3.0
with:
node-version-file: '.node-version'
cache: 'pnpm'
@@ -69,13 +69,13 @@ jobs:
eslint-cache-version: v1
eslint-cache-path: ${{ github.workspace }}/node_modules/.cache/eslint-${{ matrix.workspace }}
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
with:
fetch-depth: 0
submodules: true
- name: Setup pnpm
- uses: pnpm/action-setup@v4.2.0
- - uses: actions/setup-node@v6.1.0
+ uses: pnpm/action-setup@v4.4.0
+ - uses: actions/setup-node@v6.3.0
with:
node-version-file: '.node-version'
cache: 'pnpm'
@@ -100,13 +100,13 @@ jobs:
- sw
- misskey-js
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
with:
fetch-depth: 0
submodules: true
- name: Setup pnpm
- uses: pnpm/action-setup@v4.2.0
- - uses: actions/setup-node@v6.1.0
+ uses: pnpm/action-setup@v4.4.0
+ - uses: actions/setup-node@v6.3.0
with:
node-version-file: '.node-version'
cache: 'pnpm'
diff --git a/.github/workflows/locale.yml b/.github/workflows/locale.yml
index 15cc9153f6..a965aae0d1 100644
--- a/.github/workflows/locale.yml
+++ b/.github/workflows/locale.yml
@@ -16,13 +16,13 @@ jobs:
runs-on: ubuntu-latest
continue-on-error: true
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
with:
fetch-depth: 0
submodules: true
- name: Setup pnpm
- uses: pnpm/action-setup@v4.2.0
- - uses: actions/setup-node@v6.1.0
+ uses: pnpm/action-setup@v4.4.0
+ - uses: actions/setup-node@v6.3.0
with:
node-version-file: ".node-version"
cache: "pnpm"
diff --git a/.github/workflows/on-release-created.yml b/.github/workflows/on-release-created.yml
index c9a47385a0..7d19678574 100644
--- a/.github/workflows/on-release-created.yml
+++ b/.github/workflows/on-release-created.yml
@@ -16,13 +16,13 @@ jobs:
id-token: write
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
with:
submodules: true
- name: Setup pnpm
- uses: pnpm/action-setup@v4.2.0
+ uses: pnpm/action-setup@v4.4.0
- name: Use Node.js
- uses: actions/setup-node@v6.1.0
+ uses: actions/setup-node@v6.3.0
with:
node-version-file: '.node-version'
cache: 'pnpm'
diff --git a/.github/workflows/report-backend-memory.yml b/.github/workflows/report-backend-memory.yml
index c339ca49b4..bf2e311c83 100644
--- a/.github/workflows/report-backend-memory.yml
+++ b/.github/workflows/report-backend-memory.yml
@@ -54,55 +54,110 @@ jobs:
BASE_MEMORY=$(cat ./artifacts/memory-base.json)
HEAD_MEMORY=$(cat ./artifacts/memory-head.json)
- BASE_RSS=$(echo "$BASE_MEMORY" | jq -r '.memory.rss // 0')
- HEAD_RSS=$(echo "$HEAD_MEMORY" | jq -r '.memory.rss // 0')
+ variation() {
+ calc() {
+ BASE=$(echo "$BASE_MEMORY" | jq -r ".${1}.${2} // 0")
+ HEAD=$(echo "$HEAD_MEMORY" | jq -r ".${1}.${2} // 0")
- # Calculate difference
- if [ "$BASE_RSS" -gt 0 ] && [ "$HEAD_RSS" -gt 0 ]; then
- DIFF=$((HEAD_RSS - BASE_RSS))
- DIFF_PERCENT=$(echo "scale=2; ($DIFF * 100) / $BASE_RSS" | bc)
+ DIFF=$((HEAD - BASE))
+ if [ "$BASE" -gt 0 ]; then
+ DIFF_PERCENT=$(echo "scale=2; ($DIFF * 100) / $BASE" | bc)
+ else
+ DIFF_PERCENT=0
+ fi
- # Convert to MB for readability
- BASE_MB=$(echo "scale=2; $BASE_RSS / 1048576" | bc)
- HEAD_MB=$(echo "scale=2; $HEAD_RSS / 1048576" | bc)
- DIFF_MB=$(echo "scale=2; $DIFF / 1048576" | bc)
+ # Convert KB to MB for readability
+ BASE_MB=$(echo "scale=2; $BASE / 1024" | bc)
+ HEAD_MB=$(echo "scale=2; $HEAD / 1024" | bc)
+ DIFF_MB=$(echo "scale=2; $DIFF / 1024" | bc)
- echo "base_mb=$BASE_MB" >> "$GITHUB_OUTPUT"
- echo "head_mb=$HEAD_MB" >> "$GITHUB_OUTPUT"
- echo "diff_mb=$DIFF_MB" >> "$GITHUB_OUTPUT"
- echo "diff_percent=$DIFF_PERCENT" >> "$GITHUB_OUTPUT"
- echo "has_data=true" >> "$GITHUB_OUTPUT"
+ JSON=$(jq -c -n \
+ --argjson base "$BASE_MB" \
+ --argjson head "$HEAD_MB" \
+ --argjson diff "$DIFF_MB" \
+ --argjson diff_percent "$DIFF_PERCENT" \
+ '{base: $base, head: $head, diff: $diff, diff_percent: $diff_percent}')
- # Determine if this is a significant change (more than 5% increase)
- if [ "$(echo "$DIFF_PERCENT > 5" | bc)" -eq 1 ]; then
- echo "significant_increase=true" >> "$GITHUB_OUTPUT"
- else
- echo "significant_increase=false" >> "$GITHUB_OUTPUT"
- fi
- else
- echo "has_data=false" >> "$GITHUB_OUTPUT"
- fi
+ echo "$JSON"
+ }
+
+ JSON=$(jq -c -n \
+ --argjson VmRSS "$(calc $1 VmRSS)" \
+ --argjson VmHWM "$(calc $1 VmHWM)" \
+ --argjson VmSize "$(calc $1 VmSize)" \
+ --argjson VmData "$(calc $1 VmData)" \
+ '{VmRSS: $VmRSS, VmHWM: $VmHWM, VmSize: $VmSize, VmData: $VmData}')
+
+ echo "$JSON"
+ }
+
+ JSON=$(jq -c -n \
+ --argjson beforeGc "$(variation beforeGc)" \
+ --argjson afterGc "$(variation afterGc)" \
+ --argjson afterRequest "$(variation afterRequest)" \
+ '{beforeGc: $beforeGc, afterGc: $afterGc, afterRequest: $afterRequest}')
+
+ echo "res=$JSON" >> "$GITHUB_OUTPUT"
- id: build-comment
name: Build memory comment
+ env:
+ RES: ${{ steps.compare.outputs.res }}
run: |
- HEADER="## Backend Memory Usage Comparison"
+ HEADER="## Backend memory usage comparison"
FOOTER="[See workflow logs for details](https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID})"
echo "$HEADER" > ./output.md
echo >> ./output.md
- if [ "${{ steps.compare.outputs.has_data }}" == "true" ]; then
- echo "| Metric | base | head | Diff |" >> ./output.md
- echo "|--------|------|------|------|" >> ./output.md
- echo "| RSS | ${{ steps.compare.outputs.base_mb }} MB | ${{ steps.compare.outputs.head_mb }} MB | ${{ steps.compare.outputs.diff_mb }} MB (${{ steps.compare.outputs.diff_percent }}%) |" >> ./output.md
- echo >> ./output.md
+ table() {
+ echo "| Metric | base (MB) | head (MB) | Diff (MB) | Diff (%) |" >> ./output.md
+ echo "|--------|------:|------:|------:|------:|" >> ./output.md
- if [ "${{ steps.compare.outputs.significant_increase }}" == "true" ]; then
- echo "⚠️ **Warning**: Memory usage has increased by more than 5%. Please verify this is not an unintended change." >> ./output.md
- echo >> ./output.md
- fi
- else
- echo "Could not retrieve memory usage data." >> ./output.md
+ line() {
+ METRIC=$2
+ BASE=$(echo "$RES" | jq -r ".${1}.${2}.base")
+ HEAD=$(echo "$RES" | jq -r ".${1}.${2}.head")
+ DIFF=$(echo "$RES" | jq -r ".${1}.${2}.diff")
+ DIFF_PERCENT=$(echo "$RES" | jq -r ".${1}.${2}.diff_percent")
+
+ if (( $(echo "$DIFF_PERCENT > 0" | bc -l) )); then
+ DIFF="+$DIFF"
+ DIFF_PERCENT="+$DIFF_PERCENT"
+ fi
+
+ # highlight VmRSS
+ if [ "$2" = "VmRSS" ]; then
+ METRIC="**${METRIC}**"
+ BASE="**${BASE}**"
+ HEAD="**${HEAD}**"
+ DIFF="**${DIFF}**"
+ DIFF_PERCENT="**${DIFF_PERCENT}**"
+ fi
+
+ echo "| ${METRIC} | ${BASE} MB | ${HEAD} MB | ${DIFF} MB | ${DIFF_PERCENT}% |" >> ./output.md
+ }
+
+ line $1 VmRSS
+ line $1 VmHWM
+ line $1 VmSize
+ line $1 VmData
+ }
+
+ echo "### Before GC" >> ./output.md
+ table beforeGc
+ echo >> ./output.md
+
+ echo "### After GC" >> ./output.md
+ table afterGc
+ echo >> ./output.md
+
+ echo "### After Request" >> ./output.md
+ table afterRequest
+ echo >> ./output.md
+
+ # Determine if this is a significant change (more than 5% increase)
+ if [ "$(echo "$RES" | jq -r '.afterGc.VmRSS.diff_percent | tonumber > 5')" = "true" ]; then
+ echo "⚠️ **Warning**: Memory usage has increased by more than 5%. Please verify this is not an unintended change." >> ./output.md
echo >> ./output.md
fi
diff --git a/.github/workflows/storybook.yml b/.github/workflows/storybook.yml
index c28b1f6e93..0bfb7f4c9c 100644
--- a/.github/workflows/storybook.yml
+++ b/.github/workflows/storybook.yml
@@ -22,12 +22,12 @@ jobs:
NODE_OPTIONS: "--max_old_space_size=7168"
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
if: github.event_name != 'pull_request_target'
with:
fetch-depth: 0
submodules: true
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
if: github.event_name == 'pull_request_target'
with:
fetch-depth: 0
@@ -37,9 +37,9 @@ jobs:
if: github.event_name == 'pull_request_target'
run: git checkout "$(git rev-list --parents -n1 HEAD | cut -d" " -f3)"
- name: Setup pnpm
- uses: pnpm/action-setup@v4.2.0
+ uses: pnpm/action-setup@v4.4.0
- name: Use Node.js
- uses: actions/setup-node@v6.1.0
+ uses: actions/setup-node@v6.3.0
with:
node-version-file: '.node-version'
cache: 'pnpm'
diff --git a/.github/workflows/test-backend.yml b/.github/workflows/test-backend.yml
index 562ec76b85..29e634f84b 100644
--- a/.github/workflows/test-backend.yml
+++ b/.github/workflows/test-backend.yml
@@ -48,13 +48,20 @@ jobs:
image: redis:7
ports:
- 56312:6379
+ meilisearch:
+ image: getmeili/meilisearch:v1.38.2
+ ports:
+ - 57712:7700
+ env:
+ MEILI_NO_ANALYTICS: true
+ MEILI_ENV: development
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
with:
submodules: true
- name: Setup pnpm
- uses: pnpm/action-setup@v4.2.0
+ uses: pnpm/action-setup@v4.4.0
- name: Get current date
id: current-date
run: echo "today=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
@@ -86,7 +93,7 @@ jobs:
fi
done
- name: Use Node.js
- uses: actions/setup-node@v6.1.0
+ uses: actions/setup-node@v6.3.0
with:
node-version-file: ${{ matrix.node-version-file }}
cache: 'pnpm'
@@ -129,13 +136,13 @@ jobs:
- 56312:6379
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
with:
submodules: true
- name: Setup pnpm
- uses: pnpm/action-setup@v4.2.0
+ uses: pnpm/action-setup@v4.4.0
- name: Use Node.js
- uses: actions/setup-node@v6.1.0
+ uses: actions/setup-node@v6.3.0
with:
node-version-file: ${{ matrix.node-version-file }}
cache: 'pnpm'
@@ -173,16 +180,16 @@ jobs:
POSTGRES_HOST_AUTH_METHOD: trust
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
with:
submodules: true
- name: Setup pnpm
- uses: pnpm/action-setup@v4.2.0
+ uses: pnpm/action-setup@v4.4.0
- name: Get current date
id: current-date
run: echo "today=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
- name: Use Node.js
- uses: actions/setup-node@v6.1.0
+ uses: actions/setup-node@v6.3.0
with:
node-version-file: ${{ matrix.node-version-file }}
cache: 'pnpm'
diff --git a/.github/workflows/test-federation.yml b/.github/workflows/test-federation.yml
index 7f8fe547e1..27049ecd42 100644
--- a/.github/workflows/test-federation.yml
+++ b/.github/workflows/test-federation.yml
@@ -36,7 +36,7 @@ jobs:
with:
submodules: true
- name: Setup pnpm
- uses: pnpm/action-setup@v4.2.0
+ uses: pnpm/action-setup@v4.4.0
- name: Get current date
id: current-date
run: echo "today=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
@@ -68,7 +68,7 @@ jobs:
fi
done
- name: Use Node.js
- uses: actions/setup-node@v6.1.0
+ uses: actions/setup-node@v6.3.0
with:
node-version-file: ${{ matrix.node-version-file }}
cache: 'pnpm'
diff --git a/.github/workflows/test-frontend.yml b/.github/workflows/test-frontend.yml
index 52723e894c..1125565d8b 100644
--- a/.github/workflows/test-frontend.yml
+++ b/.github/workflows/test-frontend.yml
@@ -28,13 +28,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
with:
submodules: true
- name: Setup pnpm
- uses: pnpm/action-setup@v4.2.0
+ uses: pnpm/action-setup@v4.4.0
- name: Use Node.js
- uses: actions/setup-node@v6.1.0
+ uses: actions/setup-node@v6.3.0
with:
node-version-file: '.node-version'
cache: 'pnpm'
@@ -76,7 +76,7 @@ jobs:
- 56312:6379
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
with:
submodules: true
# https://github.com/cypress-io/cypress-docker-images/issues/150
@@ -86,9 +86,9 @@ jobs:
#- uses: browser-actions/setup-firefox@latest
# if: ${{ matrix.browser == 'firefox' }}
- name: Setup pnpm
- uses: pnpm/action-setup@v4.2.0
+ uses: pnpm/action-setup@v4.4.0
- name: Use Node.js
- uses: actions/setup-node@v6.1.0
+ uses: actions/setup-node@v6.3.0
with:
node-version-file: '.node-version'
cache: 'pnpm'
diff --git a/.github/workflows/test-misskey-js.yml b/.github/workflows/test-misskey-js.yml
index 428cbce3b8..54cf1c318a 100644
--- a/.github/workflows/test-misskey-js.yml
+++ b/.github/workflows/test-misskey-js.yml
@@ -22,13 +22,13 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v6.0.1
+ uses: actions/checkout@v6.0.2
- name: Setup pnpm
- uses: pnpm/action-setup@v4.2.0
+ uses: pnpm/action-setup@v4.4.0
- name: Setup Node.js
- uses: actions/setup-node@v6.1.0
+ uses: actions/setup-node@v6.3.0
with:
node-version-file: '.node-version'
cache: 'pnpm'
diff --git a/.github/workflows/test-production.yml b/.github/workflows/test-production.yml
index 9c0ea4d738..319ff6e5f8 100644
--- a/.github/workflows/test-production.yml
+++ b/.github/workflows/test-production.yml
@@ -16,13 +16,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
with:
submodules: true
- name: Setup pnpm
- uses: pnpm/action-setup@v4.2.0
+ uses: pnpm/action-setup@v4.4.0
- name: Use Node.js
- uses: actions/setup-node@v6.1.0
+ uses: actions/setup-node@v6.3.0
with:
node-version-file: '.node-version'
cache: 'pnpm'
diff --git a/.github/workflows/validate-api-json.yml b/.github/workflows/validate-api-json.yml
index 8ffc60fc6e..f2e8381344 100644
--- a/.github/workflows/validate-api-json.yml
+++ b/.github/workflows/validate-api-json.yml
@@ -17,13 +17,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
with:
submodules: true
- name: Setup pnpm
- uses: pnpm/action-setup@v4.2.0
+ uses: pnpm/action-setup@v4.4.0
- name: Use Node.js
- uses: actions/setup-node@v6.1.0
+ uses: actions/setup-node@v6.3.0
with:
node-version-file: '.node-version'
cache: 'pnpm'
diff --git a/.gitignore b/.gitignore
index ac7502f384..7839e4de66 100644
--- a/.gitignore
+++ b/.gitignore
@@ -46,6 +46,7 @@ docker-compose.yml
built
built-test
js-built
+src-js
/data
/.cache-loader
/db
diff --git a/CHANGELOG.md b/CHANGELOG.md
index aa87591710..b8e46890ac 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,18 +1,116 @@
-## 2025.12.2
+## Unreleased
-### Note
-v2025.12.0で行われた「configの`trustProxy`のデフォルト値を`false`に変更」について、正しく環境に応じた設定を行わないとサインインが困難になるといった状態を緩和するために、以前のデフォルト値に戻す暫定対応を行いました。
+### General
+- Feat: ユーザーミュートの適用範囲から通知を除外できるように
+ - タイムラインや検索等でノートが見えないようにしつつ、通知は引き続き受け取れるように設定することができるようになりました
-**セキュリティを向上させるためには適切な設定を行うことを推奨しますが、間違った設定値を入れると上述のような不具合の原因となりますので、慎重に行ってください。**
+### Client
+- Enhance: ミュートの付与期間を自由に設定できるように
+- Enhance: ロールの付与期間を自由に設定できるように
+
+### Server
+- Fix: `/api-doc` にアクセスできない問題を修正
+
+
+## 2026.3.2
### General
- 依存関係の更新
### Client
-- Enhance: ミュートの付与期間を自由に設定できるように
-- Enhance: ロールの付与期間を自由に設定できるように
-- Fix: バージョン表記のないPlayが正しく動作しない問題を修正
+- Enhance: アプリ内ウィンドウの初期サイズを画面サイズに応じて自動で調整するように
+- Fix: 絵文字パレットが空の状態でMisskeyについてのページが閲覧できない問題を修正
+- Fix: ウィンドウのタイトルをクリックしても最前面に出ないことがある問題を修正
+### Server
+- Fix: 自分の行ったフォロワー限定投稿または指名投稿に自分自身でリアクションなどを行った場合のイベントが流れない問題を修正
+- Fix: 署名付きGETリクエストにおいてAcceptヘッダを署名の対象から除外(Acceptヘッダを正規化するCDNやリバースプロキシを使用している際に挙動がおかしくなる問題を修正)
+- Fix: WebSocket接続におけるノートの非表示ロジックを修正
+- Fix: チャンネルミュートを有効にしている際に、一部のタイムラインやノート一覧が空になる問題を修正
+- Fix: 初期読込時に必要なフロントエンドのアセットがすべて読み込まれていない問題を修正
+
+
+## 2026.3.1
+
+### General
+- 依存関係の更新
+
+### Server
+- Fix: セキュリティに関する修正
+
+
+## 2026.3.0
+
+### Note
+- `users/following` の `birthday` プロパティは非推奨になりました。代わりに `users/get-following-users-by-birthday` をご利用ください。
+
+### General
+- Enhance: 「もうすぐ誕生日のユーザー」ウィジェットで、誕生日が至近のユーザーも表示できるように
+ (Cherry-picked from https://github.com/MisskeyIO/misskey)
+ - 「今日誕生日のユーザー」は「もうすぐ誕生日のユーザー」に名称変更されました
+- Fix: ユーザーハッシュタグページでユーザーの読み込みが重複する問題を修正
+- 依存関係の更新
+
+### Client
+- Enhance: ドライブのファイル一覧で自動でもっと見るを利用可能に
+- Enhance: ウィジェットの表示設定をプレビューを見ながら行えるように
+- Enhance: ウィジェットの設定項目のラベルの多言語対応
+- Enhance: 画面幅が広いときにメディアを横並びで表示できるようにするオプションを追加
+- Enhance: パフォーマンスの向上
+- Fix: ドライブクリーナーでファイルを削除しても画面に反映されない問題を修正 #16061
+- Fix: 非ログイン時にログインを求めるダイアログが表示された後にダイアログのぼかしが解除されず操作不能になることがある問題を修正
+- Fix: ドライブのソートが「登録日(昇順)」の場合に正しく動作しない問題を修正
+- Fix: 高度なMFMのピッカーを使用する際の挙動を改善
+- Fix: 管理画面でアーカイブ済のお知らせを表示した際にアクティブなお知らせが多い旨の警告が出る問題を修正
+- Fix: ファイルタブのセンシティブメディアを開く際に確認ダイアログを出す設定が適用されない問題を修正
+- Fix: 2月29日を誕生日に設定している場合、閏年以外は3月1日を誕生日として扱うように修正
+- Fix: `Mk:C:container` の `borderWidth` が正しく反映されない問題を修正
+- Fix: mCaptchaが正しく動作しない問題を修正
+- Fix: 非ログイン時にリバーシの対局が表示されない問題を修正
+- Fix: ノートの詳細表示でリアクションが全件表示されない問題を修正
+- Fix: 動画埋め込みプレイヤーなどの一部ウィンドウで、ウィンドウのサイズ変更や移動が正常に行えない問題を修正
+- Fix: 画像エフェクトの修正
+ - 塗りつぶし・モザイク・ぼかしエフェクトを回転させると歪む問題を修正
+ - モザイクの格子のサイズが画像の縦横比によって長方形となる問題を修正
+ - モザイクの色味がより自然になるように修正
+ - ぼかしに不自然な縦線が入る問題を修正
+- Fix: フォロー承認通知でフォローされた際のメッセージの絵文字が表示されない問題を修正
+- Fix: HTTP環境など(Secure Contextのない環境)で、設定画面が閲覧できない問題を修正
+
+### Server
+- Enhance: OAuthのクライアント情報取得(Client Information Discovery)において、IndieWeb Living Standard 11 July 2024で定義されているJSONドキュメント形式に対応しました
+ - JSONによるClient Information Discoveryを行うには、レスポンスの`Content-Type`ヘッダーが`application/json`である必要があります
+ - 従来の実装(12 February 2022版・HTML Microformat形式)も引き続きサポートされます
+- Enhance: メモリ使用量を削減
+- Fix: `/admin/get-user-ips` エンドポイントのアクセス権限を管理者のみに修正
+
+## 2025.12.2
+
+### Note
+v2025.12.0で行われた「configの`trustProxy`のデフォルト値を`false`に変更」について、正しく環境に応じた設定を行わないとサインインが困難になるといった状態を緩和するために、以下の対応を行いました。
+
+**正しく設定しないと、上記のような不具合の原因となったり、セキュリティリスクが高まったりする可能性があります。必ず現在のconfigをご確認の上、必要に応じて値を変更してください。**
+
+- `trustProxy`について、デフォルト(configに値が設定されていない状態)ではループバックアドレスとローカルIPアドレス空間を信頼するようにしました。
+- `trustProxy`の設定方法について、より詳細に記述しました。
+- リバースプロキシやCDNなどのより上流のレイヤでレートリミットを設定したい場合や、緊急時の一時的な緩和策として、Misskey内部でのIPアドレスペースでのレートリミットを無効化できるようにしました。
+
+### General
+- 依存関係の更新
+
+### Client
+- Enhance: デッキのUI説明を追加
+- Enhance: 設定がブラウザによって消去されないようにするオプションを追加
+- Fix: バージョン表記のないPlayが正しく動作しない問題を修正
+ バージョン表記のないものは v0.x 系として実行されます。v1.x 系で動作させたい場合は必ずバージョン表記を含めてください。
+- Fix: デッキUIでメニュー位置を下にしているとプロファイル削除ボタンが表示されないのを修正
+- Fix: 一部のUnicode絵文字のリアクションがボタンにならない問題を修正
+
+### Server
+- Enhance: Misskey内部でのIPアドレスペースでのレートリミットを無効化できるように
+ - リバースプロキシやCDNなど別のレイヤで別途レートリミットを設定する場合や、ローカルでのテスト用途等として利用することを想定しています。
+ - デフォルトは `enableIpRateLimit: true`(Misskey内部でのIPアドレスペースでのレートリミットは有効)です。
+- Fix: コントロールパネルのジョブキューページで使用される一部APIの応答速度を改善
## 2025.12.1
diff --git a/COPYING b/COPYING
index 7635bfc913..a17c82c002 100644
--- a/COPYING
+++ b/COPYING
@@ -1,5 +1,5 @@
Unless otherwise stated this repository is
-Copyright © 2014-2025 syuilo and contributors
+Copyright © 2014-2026 syuilo and contributors
And is distributed under The GNU Affero General Public License Version 3, you should have received a copy of the license file as LICENSE.
diff --git a/Dockerfile b/Dockerfile
index 02739d9ca2..19f9e8c9dc 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,6 +1,6 @@
-# syntax = docker/dockerfile:1.4
+# syntax = docker/dockerfile:1.21
-ARG NODE_VERSION=22.15.0-bookworm
+ARG NODE_VERSION=22.22.0-bookworm
# build assets & compile TypeScript
@@ -102,6 +102,7 @@ COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-js/
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-reversi/built ./packages/misskey-reversi/built
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-bubble-game/built ./packages/misskey-bubble-game/built
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/backend/built ./packages/backend/built
+COPY --chown=misskey:misskey --from=native-builder /misskey/packages/backend/src-js ./packages/backend/src-js
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/i18n/built ./packages/i18n/built
COPY --chown=misskey:misskey --from=native-builder /misskey/fluent-emojis /misskey/fluent-emojis
COPY --chown=misskey:misskey . ./
diff --git a/README.md b/README.md
index a73102d713..e3261d13c2 100644
--- a/README.md
+++ b/README.md
@@ -26,6 +26,8 @@
[](https://deepwiki.com/misskey-dev/misskey)
+
+
## Thanks
@@ -49,3 +51,13 @@ Thanks to [Crowdin](https://crowdin.com/) for providing the localization platfor
Thanks to [Docker](https://hub.docker.com/) for providing the container platform that helps us run Misskey in production.
+
+---
+
+
= never : any; -type ObjectSchemaType
= NullOrUndefined
>; - export type SchemaTypeDef
=
p['type'] extends 'null' ? null :
p['type'] extends 'integer' ? number :
diff --git a/packages/backend/src/misc/show-machine-info.ts b/packages/backend/src/misc/show-machine-info.ts
index 8ddec35f23..b279eb9546 100644
--- a/packages/backend/src/misc/show-machine-info.ts
+++ b/packages/backend/src/misc/show-machine-info.ts
@@ -4,15 +4,11 @@
*/
import * as os from 'node:os';
-import sysUtils from 'systeminformation';
import type Logger from '@/logger.js';
export async function showMachineInfo(parentLogger: Logger) {
const logger = parentLogger.createSubLogger('machine');
logger.debug(`Hostname: ${os.hostname()}`);
logger.debug(`Platform: ${process.platform} Arch: ${process.arch}`);
- const mem = await sysUtils.mem();
- const totalmem = (mem.total / 1024 / 1024 / 1024).toFixed(1);
- const availmem = (mem.available / 1024 / 1024 / 1024).toFixed(1);
- logger.debug(`CPU: ${os.cpus().length} core MEM: ${totalmem}GB (available: ${availmem}GB)`);
+ logger.debug(`CPU: ${os.cpus().length} core MEM: ${(os.totalmem() / 1024 / 1024 / 1024).toFixed(1)}GB (available: ${(os.freemem() / 1024 / 1024 / 1024).toFixed(1)}GB)`);
}
diff --git a/packages/backend/src/misc/split-id-and-objects.ts b/packages/backend/src/misc/split-id-and-objects.ts
new file mode 100644
index 0000000000..d23bb93695
--- /dev/null
+++ b/packages/backend/src/misc/split-id-and-objects.ts
@@ -0,0 +1,27 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+/**
+ * idとオブジェクトを分離する
+ * @param input idまたはオブジェクトの配列
+ * @returns idの配列とオブジェクトの配列
+ */
+export function splitIdAndObjects
-
+