Merge branch 'v2023.12.9'
Some checks are pending
/ test-build (push) Waiting to run

This commit is contained in:
nelle 2024-07-28 19:01:14 -06:00
commit 03e54e88b8
408 changed files with 17480 additions and 20204 deletions

View file

@ -1,5 +1,5 @@
on: on:
- push push:
jobs: jobs:
test-build: test-build:
runs-on: docker runs-on: docker
@ -15,19 +15,15 @@ jobs:
image: redis image: redis
steps: steps:
- name: Clone repository - name: Clone repository
run: git clone https://iceshrimp.dev/iceshrimp/iceshrimp.git --branch=${{ github.ref_name }} --depth=1 /iceshrimp run: git clone https://iceshrimp.dev/iceshrimp/iceshrimp.git --branch=${{ github.ref_name }} --depth=1 .
- name: Install build dependencies - name: Install build dependencies
run: | run: |
cd /iceshrimp
cp -Tr /iceshrimp-caches/yarn .yarn cp -Tr /iceshrimp-caches/yarn .yarn
yarn --immutable yarn --immutable
rm -rf /iceshrimp-caches/yarn/* && cp -Tr .yarn /iceshrimp-caches/yarn rm -rf /iceshrimp-caches/yarn/* && cp -Tr .yarn /iceshrimp-caches/yarn
- name: Build the shrimp - name: Build the shrimp
run: | run: yarn build:debug
cd /iceshrimp
yarn build:debug
- name: Test the shrimp - name: Test the shrimp
run: | run: |
cd /iceshrimp
cp .config/ci.yml .config/default.yml cp .config/ci.yml .config/default.yml
yarn run migrate yarn run migrate

828
.pnp.cjs generated

File diff suppressed because it is too large Load diff

48
.pnp.loader.mjs generated
View file

@ -1,9 +1,12 @@
/* eslint-disable */
// @ts-nocheck
import fs from 'fs'; import fs from 'fs';
import { URL as URL$1, fileURLToPath, pathToFileURL } from 'url'; import { URL as URL$1, fileURLToPath, pathToFileURL } from 'url';
import path from 'path'; import path from 'path';
import { createHash } from 'crypto'; import { createHash } from 'crypto';
import { EOL } from 'os'; import { EOL } from 'os';
import moduleExports, { isBuiltin } from 'module'; import esmModule, { createRequire, isBuiltin } from 'module';
import assert from 'assert'; import assert from 'assert';
const SAFE_TIME = 456789e3; const SAFE_TIME = 456789e3;
@ -830,6 +833,12 @@ class ProxiedFS extends FakeFS {
rmdirSync(p, opts) { rmdirSync(p, opts) {
return this.baseFs.rmdirSync(this.mapToBase(p), opts); return this.baseFs.rmdirSync(this.mapToBase(p), opts);
} }
async rmPromise(p, opts) {
return this.baseFs.rmPromise(this.mapToBase(p), opts);
}
rmSync(p, opts) {
return this.baseFs.rmSync(this.mapToBase(p), opts);
}
async linkPromise(existingP, newP) { async linkPromise(existingP, newP) {
return this.baseFs.linkPromise(this.mapToBase(existingP), this.mapToBase(newP)); return this.baseFs.linkPromise(this.mapToBase(existingP), this.mapToBase(newP));
} }
@ -1211,6 +1220,18 @@ class NodeFS extends BasePortableFakeFS {
rmdirSync(p, opts) { rmdirSync(p, opts) {
return this.realFs.rmdirSync(npath.fromPortablePath(p), opts); return this.realFs.rmdirSync(npath.fromPortablePath(p), opts);
} }
async rmPromise(p, opts) {
return await new Promise((resolve, reject) => {
if (opts) {
this.realFs.rm(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject));
} else {
this.realFs.rm(npath.fromPortablePath(p), this.makeCallback(resolve, reject));
}
});
}
rmSync(p, opts) {
return this.realFs.rmSync(npath.fromPortablePath(p), opts);
}
async linkPromise(existingP, newP) { async linkPromise(existingP, newP) {
return await new Promise((resolve, reject) => { return await new Promise((resolve, reject) => {
this.realFs.link(npath.fromPortablePath(existingP), npath.fromPortablePath(newP), this.makeCallback(resolve, reject)); this.realFs.link(npath.fromPortablePath(existingP), npath.fromPortablePath(newP), this.makeCallback(resolve, reject));
@ -1403,6 +1424,8 @@ const URL = Number(process.versions.node.split('.', 1)[0]) < 20 ? URL$1 : global
const [major, minor] = process.versions.node.split(`.`).map((value) => parseInt(value, 10)); const [major, minor] = process.versions.node.split(`.`).map((value) => parseInt(value, 10));
const WATCH_MODE_MESSAGE_USES_ARRAYS = major > 19 || major === 19 && minor >= 2 || major === 18 && minor >= 13; const WATCH_MODE_MESSAGE_USES_ARRAYS = major > 19 || major === 19 && minor >= 2 || major === 18 && minor >= 13;
const HAS_LAZY_LOADED_TRANSLATORS = major === 20 && minor < 6 || major === 19 && minor >= 3; const HAS_LAZY_LOADED_TRANSLATORS = major === 20 && minor < 6 || major === 19 && minor >= 3;
const SUPPORTS_IMPORT_ATTRIBUTES = major >= 21 || major === 20 && minor >= 10 || major === 18 && minor >= 20;
const SUPPORTS_IMPORT_ATTRIBUTES_ONLY = major >= 22;
function readPackageScope(checkPath) { function readPackageScope(checkPath) {
const rootSeparatorIndex = checkPath.indexOf(npath.sep); const rootSeparatorIndex = checkPath.indexOf(npath.sep);
@ -1493,11 +1516,22 @@ async function load$1(urlString, context, nextLoad) {
const format = getFileFormat(filePath); const format = getFileFormat(filePath);
if (!format) if (!format)
return nextLoad(urlString, context, nextLoad); return nextLoad(urlString, context, nextLoad);
if (format === `json` && context.importAssertions?.type !== `json`) { if (format === `json`) {
const err = new TypeError(`[ERR_IMPORT_ASSERTION_TYPE_MISSING]: Module "${urlString}" needs an import assertion of type "json"`); if (SUPPORTS_IMPORT_ATTRIBUTES_ONLY) {
if (context.importAttributes?.type !== `json`) {
const err = new TypeError(`[ERR_IMPORT_ATTRIBUTE_MISSING]: Module "${urlString}" needs an import attribute of "type: json"`);
err.code = `ERR_IMPORT_ATTRIBUTE_MISSING`;
throw err;
}
} else {
const type = `importAttributes` in context ? context.importAttributes?.type : context.importAssertions?.type;
if (type !== `json`) {
const err = new TypeError(`[ERR_IMPORT_ASSERTION_TYPE_MISSING]: Module "${urlString}" needs an import ${SUPPORTS_IMPORT_ATTRIBUTES ? `attribute` : `assertion`} of type "json"`);
err.code = `ERR_IMPORT_ASSERTION_TYPE_MISSING`; err.code = `ERR_IMPORT_ASSERTION_TYPE_MISSING`;
throw err; throw err;
} }
}
}
if (process.env.WATCH_REPORT_DEPENDENCIES && process.send) { if (process.env.WATCH_REPORT_DEPENDENCIES && process.send) {
const pathToSend = pathToFileURL( const pathToSend = pathToFileURL(
npath.fromPortablePath( npath.fromPortablePath(
@ -1941,6 +1975,13 @@ function packageImportsResolve({ name, base, conditions, readFileSyncFn }) {
throwImportNotDefined(name, packageJSONUrl, base); throwImportNotDefined(name, packageJSONUrl, base);
} }
let findPnpApi = esmModule.findPnpApi;
if (!findPnpApi) {
const require = createRequire(import.meta.url);
const pnpApi = require(`./.pnp.cjs`);
pnpApi.setup();
findPnpApi = esmModule.findPnpApi;
}
const pathRegExp = /^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/; const pathRegExp = /^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/;
const isRelativeRegexp = /^\.{0,2}\//; const isRelativeRegexp = /^\.{0,2}\//;
function tryReadFile(filePath) { function tryReadFile(filePath) {
@ -1968,7 +2009,6 @@ async function resolvePrivateRequest(specifier, issuer, context, nextResolve) {
} }
} }
async function resolve$1(originalSpecifier, context, nextResolve) { async function resolve$1(originalSpecifier, context, nextResolve) {
const { findPnpApi } = moduleExports;
if (!findPnpApi || isBuiltin(originalSpecifier)) if (!findPnpApi || isBuiltin(originalSpecifier))
return nextResolve(originalSpecifier, context, nextResolve); return nextResolve(originalSpecifier, context, nextResolve);
let specifier = originalSpecifier; let specifier = originalSpecifier;

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f55f261eeccf10a7439daaece365db141f635a7e9a1f9016e00ab8f28943399f
size 91230

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2813f320e458788fe0798d2ccfcda5761be9356459aead4956f33c948d3c488b
size 22555

BIN
.yarn/cache/@img-sharp-darwin-arm64-npm-0.33.4-061afc6886-10.zip (Stored with Git LFS) vendored Normal file

Binary file not shown.

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:723b51d409908aa6afafeca67892dc83b016696018d449e18a81d11bd1110b95
size 106850

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e00b4d72355e50af073adb1d02fcae5f858e91ab2323022f560b0fff36f3d5cb
size 7008013

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0ffccca8cd6273fcc7a24fc1ec2cc621247c31e6d69dfe6200190186653d8330
size 7894090

BIN
.yarn/cache/@img-sharp-libvips-linux-arm64-npm-1.0.2-a3a6e66f3b-10.zip (Stored with Git LFS) vendored Normal file

Binary file not shown.

BIN
.yarn/cache/@img-sharp-libvips-linux-x64-npm-1.0.2-69e740ab3d-10.zip (Stored with Git LFS) vendored Normal file

Binary file not shown.

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2bfedd5b2cfa0952e02cdd4d72f83e32df9de82db18cf5195e16f72891d815ac
size 7099479

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:737651fc2b1963b06609484ac20fedd163bdd57b51ab4eb693cd506d5841695a
size 7204642

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:80752717166479cd78d3a4477293e80d7d96de70a09785489f51b86bc177296e
size 107298

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:37df8739ba92bd891180a9fe4aa2a372cfd4ea92223bd14ccc5f0526661df978
size 114780

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:507a08f66569fb890d3459241a989b257ae758b7cec2014ee18d4574f4233a61
size 111591

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bb0ca07851c9935e2889d79d613591929b83d9274b8636e247665ca1a1c6f57f
size 118348

Binary file not shown.

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:efc418b0cc9ffe3683b1cf5f5c2be1f614a8babd885446b88111c9f2f8308379
size 168922

BIN
.yarn/cache/chalk-npm-4.0.0-50e5418ea0-f8ae363f43.zip (Stored with Git LFS) vendored

Binary file not shown.

BIN
.yarn/cache/chownr-npm-1.1.4-5bd400ab08-115648f8eb.zip (Stored with Git LFS) vendored

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:23b86d525b50e2419c6def32d652247d834dac64ca9e61f89b7d893febfbca34
size 9395

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
.yarn/cache/nan-npm-2.18.0-a51ed5bed5-5520e22c64.zip (Stored with Git LFS) vendored

Binary file not shown.

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bb4ff42d414f1c2a732d520e2b25bedf23587ff4d22cf672519bf53b83ddc0dd
size 99593

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
.yarn/cache/rc-npm-1.2.8-d6768ac936-5c4d72ae7e.zip (Stored with Git LFS) vendored

Binary file not shown.

BIN
.yarn/cache/re2-npm-1.20.11-ab65de125e-a8665c861c.zip (Stored with Git LFS) vendored Normal file

Binary file not shown.

BIN
.yarn/cache/re2-npm-1.20.9-65a014d791-0ecd9f849b.zip (Stored with Git LFS) vendored

Binary file not shown.

BIN
.yarn/cache/semver-npm-7.6.2-0fec6944bb-296b17d027.zip (Stored with Git LFS) vendored Normal file

Binary file not shown.

BIN
.yarn/cache/sharp-npm-0.32.1-5af640fc49-07df854f3d.zip (Stored with Git LFS) vendored

Binary file not shown.

BIN
.yarn/cache/sharp-npm-0.33.4-afc15185a7-f396d1363d.zip (Stored with Git LFS) vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
.yarn/cache/summaly-npm-2.7.0-e25bfbf6a2-ce49173396.zip (Stored with Git LFS) vendored

Binary file not shown.

BIN
.yarn/cache/tar-fs-npm-2.1.1-e374d3b7a2-526deae025.zip (Stored with Git LFS) vendored

Binary file not shown.

Binary file not shown.

BIN
.yarn/cache/uuid-npm-7.0.3-2b088bd924-b2a4d30ecd.zip (Stored with Git LFS) vendored

Binary file not shown.

BIN
.yarn/cache/uuid-npm-9.0.1-39a8442bc6-9d0b6adb72.zip (Stored with Git LFS) vendored Normal file

Binary file not shown.

BIN
.yarn/corepack.tgz (Stored with Git LFS)

Binary file not shown.

View file

@ -1,3 +1,61 @@
## v2023.12.9
This release contains a security patch, as well as minor fixes and improvements. Upgrading is strongly recommended for all server operators.
### Highlights
- Several DoS vulnerabilities - allowing remote attackers to allocate arbitrary amounts of memory - were patched
- Corrupt jobs now get discarded instead of clogging up the failed queues
### Backend
- Fetched JSON-LD contexts are now limited to 1MiB, resolving a DoS attack vector
- Fetched node-fetch responses are now limited to 1MiB/10MiB, resolving a DoS attack vector
### Miscellaneous
- The docker images now use the bundled libvips version shipping with sharp instead of the system-wide one, reducing the image size by ~60MB
- The example docker-compose.yml file was updated
- The iceshrimp-js package was renamed to iceshrimp-sdk in order to prevent confusion should this repository be renamed to iceshrimp-js in the future (to distinguish it from Iceshrimp.NET)
- Various dependency updates
- Various translation updates
### Attribution
This release was made possible by project contributors: AntoineÐ & Laura Hausmann
## v2023.12.8
This release contains minor fixes and improvements. Upgrading is recommended for all server operators.
### Highlights
- AiScript has been updated to v0.17.0
- Several new MFM functions have been added
### Backend
- Pinned notes are rendered as links instead of objects, improving privacy
- Sporadic errors while scrolling through followers/following lists were fixed
- The link preview generator now sends a proper user agent instead of identifying itself as a generic bot
- The home timeline query heuristic now gets reset when follow lists are being imported, resolving a timeline performance edge case
### Mastodon client API
- The verify_credentials response now includes the follow_requests_count property, improving compatibiltiy with certain Mastodon clients
- Attachments will now fall back to their full res version if they don't have a thumbnail, fixing a crash with the official Mastodon for Android app
### Frontend
- The placeholder timetravel buttons have been removed
- The experiments page has been removed
### Miscellaneous
- The helm chart was updated and now has more configuration options
- The yarn version was updated to v4.3.1
- The README was updated to better reflect the current development situation in relation to the rewrite
- The project now builds against NodeJS 22
- The dockerfile was updated & now builds against alpine 3.20
- Backend dependencies have been updated
- The recommended key/value store was switched to valkey
- The CI configuration has been updated
- Various translation updates
### Attribution
This release was made possible by project contributors: AverageDood, Gersonzao, Kopper, Laura Hausmann, Mae Dartmann, Pyrox, Tournesol, ari melody, limepotato, mia & zotan
It also includes cherry-picked contributions from external contributors: naskya (firefish), ChaoticLeah (cutiekey)
## v2023.12.7 ## v2023.12.7
This is a security release. Upgrading is therefore strongly recommended. This is a security release. Upgrading is therefore strongly recommended.
@ -718,4 +776,4 @@ It also includes cherry-picked contributions from external contributors: Namekuj
--- ---
This file lists all major changes made since the fork from Firefish on 2023-07-21. For changes prior to that date, please reference the [Firefish](https://git.joinfirefish.org/firefish/firefish/-/tree/76ad0a19b3a64eaecb4da31f20c229e423ee2095/) repository. This file lists all major changes made since the fork from Firefish on 2023-07-21. For changes prior to that date, please reference the [Firefish](https://firefish.dev/firefish/firefish/-/tree/76ad0a19b3a64eaecb4da31f20c229e423ee2095/) repository.

View file

@ -1,10 +1,10 @@
# syntax = docker/dockerfile:1.2 # syntax = docker/dockerfile:1.2
## Install dev and compilation dependencies, build files ## Install dev and compilation dependencies, build files
FROM alpine:3.18 as build FROM alpine:3.20 as build
WORKDIR /iceshrimp WORKDIR /iceshrimp
# Install compilation dependencies # Install compilation dependencies
RUN apk add --no-cache --no-progress git alpine-sdk vips-dev python3 nodejs-current npm vips RUN apk add --no-cache --no-progress git alpine-sdk python3 py3-setuptools nodejs-current npm
# Copy in all files for the build # Copy in all files for the build
COPY . ./ COPY . ./
@ -31,11 +31,11 @@ RUN yarn focus-production
RUN --mount=type=cache,target=/iceshrimp/.yarncache_focused rm -rf .yarncache/* && cp -r .yarn/. .yarncache_focused RUN --mount=type=cache,target=/iceshrimp/.yarncache_focused rm -rf .yarncache/* && cp -r .yarn/. .yarncache_focused
## Runtime container ## Runtime container
FROM alpine:3.18 FROM alpine:3.20
WORKDIR /iceshrimp WORKDIR /iceshrimp
# Install runtime dependencies # Install runtime dependencies
RUN apk add --no-cache --no-progress tini ffmpeg vips-dev zip unzip nodejs-current libheif-dev RUN apk add --no-cache --no-progress tini ffmpeg zip unzip nodejs-current libheif-dev
# Copy built files # Copy built files
COPY --from=build /iceshrimp /iceshrimp COPY --from=build /iceshrimp /iceshrimp

View file

@ -57,7 +57,7 @@
- Check out [FediDB](https://fedidb.org/software/iceshrimp) or [Fediverse Observer](https://iceshrimp.fediverse.observer/list) to get an overview of the instances that are out there. - Check out [FediDB](https://fedidb.org/software/iceshrimp) or [Fediverse Observer](https://iceshrimp.fediverse.observer/list) to get an overview of the instances that are out there.
- Please note that we do not operate a "flagship instance", the only project-affiliated domain is `iceshrimp.dev`. - Please note that we do not operate a "flagship instance", the only project-affiliated domain is `iceshrimp.dev`.
- Want to donate to the project? - Want to donate to the project?
- Our backend lead dev (zotan) is in need of a better laptop, as their current one does not have enough memory. You can contribute [here](https://bunq.me/zotanlaptopcrowdfund). Any leftover money will be given to queers in need. - Our frontend dev (Lilian) needs help paying for healthcare costs. You can contribute [here](https://bunq.me/lilianhealthcarefund). Money from the fund will be used for co-pays, and medical expenses not covered by insurance.
- Need help or want to contribute? Join the [chat room](https://chat.iceshrimp.dev)! - Need help or want to contribute? Join the [chat room](https://chat.iceshrimp.dev)!
--- ---

View file

@ -8,7 +8,7 @@
}, },
"formatter": { "formatter": {
"ignore": [ "ignore": [
"packages/iceshrimp-js/api-extractor.json", "packages/iceshrimp-sdk/api-extractor.json",
"packages/*/tsconfig.json", "packages/*/tsconfig.json",
"packages/*/built", "packages/*/built",
"packages/*/package-lock.json", "packages/*/package-lock.json",

View file

@ -15,7 +15,7 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes # This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version. # to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/) # Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.1.2 version: 0.1.4
# This is the version number of the application being deployed. This version number should be # This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to # incremented each time you make changes to the application. Versions are not expected to

View file

@ -31,6 +31,7 @@ A fun, new, open way to experience social media https://iceshrimp.dev
| iceshrimp.libreTranslate.apiKey | string | `""` | | | iceshrimp.libreTranslate.apiKey | string | `""` | |
| iceshrimp.libreTranslate.apiUrl | string | `""` | | | iceshrimp.libreTranslate.apiUrl | string | `""` | |
| iceshrimp.libreTranslate.managed | bool | `false` | | | iceshrimp.libreTranslate.managed | bool | `false` | |
| iceshrimp.maxNoteLength | integer | `3000` | Max note length |
| iceshrimp.objectStorage.access_key | string | `""` | | | iceshrimp.objectStorage.access_key | string | `""` | |
| iceshrimp.objectStorage.access_secret | string | `""` | | | iceshrimp.objectStorage.access_secret | string | `""` | |
| iceshrimp.objectStorage.baseUrl | string | `""` | | | iceshrimp.objectStorage.baseUrl | string | `""` | |
@ -51,6 +52,7 @@ A fun, new, open way to experience social media https://iceshrimp.dev
| iceshrimp.smtp.port | int | `587` | | | iceshrimp.smtp.port | int | `587` | |
| iceshrimp.smtp.server | string | `"smtp.mailgun.org"` | | | iceshrimp.smtp.server | string | `"smtp.mailgun.org"` | |
| iceshrimp.smtp.useImplicitSslTls | bool | `false` | | | iceshrimp.smtp.useImplicitSslTls | bool | `false` | |
| iceshrimp.strategy | object | `{}` | Override DeploymentStrategy for Iceshrimp |
| elasticsearch | object | `{"auth":{},"enabled":false,"hostname":"","port":9200,"ssl":false}` | https://github.com/bitnami/charts/tree/master/bitnami/elasticsearch#parameters | | elasticsearch | object | `{"auth":{},"enabled":false,"hostname":"","port":9200,"ssl":false}` | https://github.com/bitnami/charts/tree/master/bitnami/elasticsearch#parameters |
| fullnameOverride | string | `""` | | | fullnameOverride | string | `""` | |
| image.pullPolicy | string | `"IfNotPresent"` | | | image.pullPolicy | string | `"IfNotPresent"` | |

View file

@ -211,7 +211,7 @@ id: 'aid'
#───┘ Other configuration └───────────────────────────────────── #───┘ Other configuration └─────────────────────────────────────
# Max note length, should be < 8000. # Max note length, should be < 8000.
#maxNoteLength: 3000 maxNoteLength: {{ .Values.iceshrimp.maxNoteLength | default 3000 }}
# Maximum lenght of an image caption or file comment (default 1500, max 8192) # Maximum lenght of an image caption or file comment (default 1500, max 8192)
#maxCaptionLength: 1500 #maxCaptionLength: 1500

View file

@ -8,6 +8,12 @@ spec:
{{- if not .Values.autoscaling.enabled }} {{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }} replicas: {{ .Values.replicaCount }}
{{- end }} {{- end }}
{{- if .Values.iceshrimp.deploymentStrategy }}
strategy:
{{- toYaml .Values.iceshrimp.deploymentStrategy | nindent 4 }}
{{- end }}
selector: selector:
matchLabels: matchLabels:
{{- include "iceshrimp.selectorLabels" . | nindent 6 }} {{- include "iceshrimp.selectorLabels" . | nindent 6 }}

View file

@ -54,6 +54,13 @@ iceshrimp:
helm.sh/resource-policy: keep helm.sh/resource-policy: keep
size: 10Gi size: 10Gi
# Deployment strategy (optional), see https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy
# deploymentStrategy:
# type: RollingUpdate
# rollingUpdate:
# maxUnavailable: 0
# maxSurge: 1
# -- If you want to allow iceshrimp to connect to private ips, enter the cidrs here. # -- If you want to allow iceshrimp to connect to private ips, enter the cidrs here.
allowedPrivateNetworks: [] allowedPrivateNetworks: []
# - "10.0.0.0/8" # - "10.0.0.0/8"
@ -68,6 +75,9 @@ iceshrimp:
# Number of worker processes per replica # Number of worker processes per replica
clusterLimit: 1 clusterLimit: 1
# Max note length
maxNoteLength: 3000
# https://github.com/bitnami/charts/tree/master/bitnami/postgresql#parameters # https://github.com/bitnami/charts/tree/master/bitnami/postgresql#parameters
postgresql: postgresql:
# -- disable if you want to use an existing db; in which case the values below # -- disable if you want to use an existing db; in which case the values below

View file

@ -22,7 +22,7 @@ services:
redis: redis:
restart: always restart: always
container_name: iceshrimp_redis container_name: iceshrimp_redis
image: docker.io/redis:7.0-alpine image: docker.io/valkey/valkey:7-alpine
networks: networks:
- network - network
volumes: volumes:

View file

@ -2,4 +2,4 @@
You can find interactive API documentation at any Iceshrimp instance. https://iceshrimp.social/api-doc You can find interactive API documentation at any Iceshrimp instance. https://iceshrimp.social/api-doc
You can also find auto-generated documentation for iceshrimp-js [here](../packages/iceshrimp-js/markdown/iceshrimp-js.md). You can also find auto-generated documentation for iceshrimp-sdk [here](../packages/iceshrimp-sdk/markdown/iceshrimp-sdk.md).

View file

@ -28,7 +28,7 @@ services:
redis: redis:
restart: unless-stopped restart: unless-stopped
image: docker.io/redis:7.0-alpine image: docker.io/valkey/valkey:7-alpine
container_name: iceshrimp_redis container_name: iceshrimp_redis
networks: networks:
- ishnet - ishnet
@ -37,7 +37,7 @@ services:
db: db:
restart: unless-stopped restart: unless-stopped
image: docker.io/postgres:12.2-alpine image: docker.io/postgres:16-alpine
container_name: iceshrimp_db container_name: iceshrimp_db
networks: networks:
- ishnet - ishnet

View file

@ -14,7 +14,7 @@ This document will guide you through manual installation of Iceshrimp. We also p
- [**Node.js**](https://nodejs.org) v18.16.0+ (v20 recommended) - [**Node.js**](https://nodejs.org) v18.16.0+ (v20 recommended)
- [**PostgreSQL**](https://www.postgresql.org/) 12+ (including modules, usually packaged as postgresql-contrib) - [**PostgreSQL**](https://www.postgresql.org/) 12+ (including modules, usually packaged as postgresql-contrib)
- [**Redis**](https://redis.io/) 6+ - [**Valkey**](https://valkey.io/) (or any other Redis 6 compatible fork)
- [**libvips**](https://www.libvips.org/) - [**libvips**](https://www.libvips.org/)
- **Web proxy** - **Web proxy**
- nginx - nginx

View file

@ -2092,15 +2092,6 @@ preventAiLearning: Evita l'indexació dels bots
preventAiLearningDescription: Sol·liciteu que els models de llenguatge d'IA de tercers preventAiLearningDescription: Sol·liciteu que els models de llenguatge d'IA de tercers
no estudiïn el contingut que pengeu, com ara publicacions i imatges. no estudiïn el contingut que pengeu, com ara publicacions i imatges.
pwa: Instal·lar PWA pwa: Instal·lar PWA
_experiments:
alpha: Alfa
beta: Beta
release: Publicà
title: Experiments
enablePostImports: Activar l'importació de publicacions
postImportsCaption: Permet els usuaris importar publicacions desde comptes a Iceshrimp,
Iceshrimp, Mastodon, Akkoma i Pleroma. Pot fer que el servidor vagi més lent durant
la càrrega si tens un coll d'ampolla a la cua.
noGraze: Si us plau, desactiva l'extensió del navegador "Graze for Mastodon", ja que noGraze: Si us plau, desactiva l'extensió del navegador "Graze for Mastodon", ja que
interfereix amb Iceshrimp. interfereix amb Iceshrimp.
accessibility: Accessibilitat accessibility: Accessibilitat

View file

@ -2101,12 +2101,6 @@ accessibility: Erreichbarkeit
jumpToPrevious: Zum Vorherigen springen jumpToPrevious: Zum Vorherigen springen
silencedWarning: Diese Meldung wird angezeigt, weil diese Nutzer von Servern stammen, silencedWarning: Diese Meldung wird angezeigt, weil diese Nutzer von Servern stammen,
die Ihr Administrator abgeschaltet hat, so dass es sich möglicherweise um Spam handelt. die Ihr Administrator abgeschaltet hat, so dass es sich möglicherweise um Spam handelt.
_experiments:
title: Funktionstests
enablePostImports: Beitragsimporte aktivieren
postImportsCaption: Erlaubt es Nutzer:innen ihre Posts von alten Iceshrimp, Iceshrimp,
Mastodon, Akkoma und Pleroma Accounts zu importieren. Bei Engpässen in der Warteschlange
kann es zu Verlangsamungen beim Laden während des Imports kommen.
noGraze: Bitte deaktivieren Sie die Browsererweiterung "Graze for Mastodon", da sie noGraze: Bitte deaktivieren Sie die Browsererweiterung "Graze for Mastodon", da sie
die Funktion von Iceshrimp stört. die Funktion von Iceshrimp stört.
indexFrom: Indexieren ab Beitragskennung aufwärts indexFrom: Indexieren ab Beitragskennung aufwärts

View file

@ -1344,6 +1344,15 @@ _mfm:
plain: "Plain" plain: "Plain"
plainDescription: "Deactivates the effects of all MFM contained within this MFM plainDescription: "Deactivates the effects of all MFM contained within this MFM
effect." effect."
border: "Border"
borderDescription: "Adds a border around content."
ruby: "Ruby"
rubyDescription: "Render a small annotation above text, Usually used for showing pronounciations of East Asian characters."
unixtime: "Unix Time"
unixtimeDescription: "Convert a number of seconds since 1st of January, 1970 to a readable date."
followmouse: "Follow Mouse"
followmouseDescription: "Make content follow the mouse cursor."
followmouseToggle: "Toggle preview"
_instanceTicker: _instanceTicker:
none: "Never show" none: "Never show"
remote: "Show for remote creatures" remote: "Show for remote creatures"
@ -2148,12 +2157,6 @@ _deck:
channel: "Channel" channel: "Channel"
mentions: "Mentions" mentions: "Mentions"
direct: "Direct messages" direct: "Direct messages"
_experiments:
title: "Experiments"
enablePostImports: "Enable beep imports"
postImportsCaption: "Allows creatures to import their beeps from past Jörmungandr, Misskey,
Mastodon, Akkoma, and Pleroma accounts. It may cause slowdowns during load if
your queue is bottlenecked."
_dialog: _dialog:
charactersExceeded: "Max characters exceeded! Current: {current}/Limit: {max}" charactersExceeded: "Max characters exceeded! Current: {current}/Limit: {max}"
charactersBelow: "Not enough characters! Current: {current}/Limit: {min}" charactersBelow: "Not enough characters! Current: {current}/Limit: {min}"

View file

@ -447,7 +447,7 @@ title: "Título"
text: "Texto" text: "Texto"
enable: "Activar" enable: "Activar"
next: "Siguiente" next: "Siguiente"
retype: "Intentar de nuevo" retype: "otra vez"
noteOf: "Publicaciones de {user}" noteOf: "Publicaciones de {user}"
inviteToGroup: "Invitar al grupo" inviteToGroup: "Invitar al grupo"
quoteAttached: "Cita añadida" quoteAttached: "Cita añadida"
@ -468,9 +468,9 @@ weakPassword: "Contraseña débil"
normalPassword: "Contraseña aceptable" normalPassword: "Contraseña aceptable"
strongPassword: "Contraseña fuerte" strongPassword: "Contraseña fuerte"
passwordMatched: "Coincide" passwordMatched: "Coincide"
passwordNotMatched: "Las contraseñas no coinciden" passwordNotMatched: "No coincide"
signinWith: "Inicia sesión con {x}" signinWith: "Inicia sesión con {x}"
signinFailed: "Autenticación fallida. Asegúrate de haber usado el nombre de usuario signinFailed: "Inicio de sesión fallido. Asegúrate de haber usado el nombre de usuario
y contraseña correctos." y contraseña correctos."
tapSecurityKey: "Toque la clave de seguridad" tapSecurityKey: "Toque la clave de seguridad"
or: "O" or: "O"
@ -2188,12 +2188,6 @@ _feeds:
copyFeed: Copiar feed copyFeed: Copiar feed
rss: RSS rss: RSS
atom: Atom atom: Atom
_experiments:
title: Experimentos
enablePostImports: Activar importaciones de publicaciones
postImportsCaption: Permite a los usuarios importar publicaciones de cuentas antiguas
de Iceshrimp, Misskey, Mastodon, Akkoma y Pleroma. Puede que cause ralentizaciones
durante la carga si sufres cuello de botella.
_skinTones: _skinTones:
mediumDark: Medio oscuro mediumDark: Medio oscuro
dark: Oscuro dark: Oscuro

View file

@ -993,9 +993,9 @@ _registry:
domain: "Domaine" domain: "Domaine"
createKey: "Créer une clé" createKey: "Créer une clé"
_aboutIceshrimp: _aboutIceshrimp:
about: "Iceshrimp est un média social décentralisé et fédéré utilisant ActivityPub.\n\ about: "Iceshrimp est un média social décentralisé et fédéré utilisant ActivityPub.\n
C'est un fork de Calckey/Firefish (lui-même fork de Misskey) qui se concentre Cest un fork de Calckey/Firefish (lui-même fork de Misskey) qui se concentre
sur la stabilité, les performances et la facilité d'utilisation plutôt que sur sur la stabilité, les performances et la facilité dutilisation plutôt que sur
de nouvelles fonctionnalités." de nouvelles fonctionnalités."
contributors: "Principaux contributeurs" contributors: "Principaux contributeurs"
allContributors: "Tous les contributeurs" allContributors: "Tous les contributeurs"
@ -1114,6 +1114,17 @@ _mfm:
backgroundDescription: Changer la couleur darrière-plan dun texte. backgroundDescription: Changer la couleur darrière-plan dun texte.
background: Couleur darrière-plan background: Couleur darrière-plan
plain: Simple plain: Simple
border: Bordure
rubyDescription: Affiche une petite annotation au-dessus du texte, généralement
utilisée pour afficher les prononciations des caractères dAsie de lEst.
borderDescription: Ajoute une bordure autour du contenu.
ruby: Rubis
unixtime: Heure Unix (Posix)
unixtimeDescription: Convertit un nombre de secondes depuis le 1er janvier 1970
en une date lisible.
followmouse: Suivre la souris
followmouseDescription: Faire en sorte que le contenu suive le curseur de la souris.
followmouseToggle: Afficher/Masquer laperçu
_instanceTicker: _instanceTicker:
none: "Cacher" none: "Cacher"
remote: "Montrer pour les utilisateur·ice·s distant·e·s" remote: "Montrer pour les utilisateur·ice·s distant·e·s"
@ -2103,15 +2114,6 @@ editNote: Modifier publication
edited: "Modifié à {date} {time}" edited: "Modifié à {date} {time}"
flagShowTimelineRepliesDescription: Si activé, affiche dans le fil les réponses des flagShowTimelineRepliesDescription: Si activé, affiche dans le fil les réponses des
utilisatieur·rice·s aux publications des autres. utilisatieur·rice·s aux publications des autres.
_experiments:
alpha: Alpha
beta: Beta
enablePostImports: Autoriser limportation de publications
title: Expérimentations
postImportsCaption: Permet aux utilisateurs dimporter leurs publications à partir
de leurs anciens comptes Iceshrimp, Misskey, Mastodon, Akkoma et Pleroma. Cela
peut entraîner des ralentissements lors du chargement si votre file dattente
est congestionnée.
findOtherInstance: Trouver une autre instance findOtherInstance: Trouver une autre instance
userSaysSomethingReasonQuote: "{name} a cité une publication contenant {reason}" userSaysSomethingReasonQuote: "{name} a cité une publication contenant {reason}"
signupsDisabled: Les inscriptions sur cette instance sont actuellement désactivés, signupsDisabled: Les inscriptions sur cette instance sont actuellement désactivés,
@ -2215,7 +2217,7 @@ _filters:
matchOptions: Modifier la sensibilité à la casse et/ou activer la correspondance matchOptions: Modifier la sensibilité à la casse et/ou activer la correspondance
exacte avec une suite de caractères exacte avec une suite de caractères
info: Nomenclature info: Nomenclature
info2: Un tiret entre crochets [-] indique la possibilité d'inverser/négativer info2: Un tiret entre crochets [-] indique la possibilité dinverser/négativer
un filtre avec le caractère tiret - un filtre avec le caractère tiret -
infoEnd: Filtrer par aliases infoEnd: Filtrer par aliases
replyTo: En réponse à replyTo: En réponse à
@ -2263,10 +2265,10 @@ cwStyle: Apparence des «Avertissement de contenu»
collapseAllCws: Cacher le contenu de toutes les réponses collapseAllCws: Cacher le contenu de toutes les réponses
searchNotLoggedIn_1: Vous devez être authentifié pour pouvoir utiliser la recherche searchNotLoggedIn_1: Vous devez être authentifié pour pouvoir utiliser la recherche
en texte intégral. en texte intégral.
searchNotLoggedIn_2: Toutefois, vous pouvez effectuer des recherches à l'aide de hashtags searchNotLoggedIn_2: Toutefois, vous pouvez effectuer des recherches à laide de hashtags
et rechercher des utilisateurs. et rechercher des utilisateurs.
antennaTimelineHint: Les antennes affichent les messages correspondants dans l'ordre antennaTimelineHint: Les antennes affichent les messages correspondants dans lordre
dans lequel ils ont été reçus, ce qui n'est pas nécessairement chronologique. dans lequel ils ont été reçus, ce qui nest pas nécessairement chronologique.
alwaysExpandCws: Toujours dérouler les messages avec des avertissements sur le contenu alwaysExpandCws: Toujours dérouler les messages avec des avertissements sur le contenu
hideFromHome: Cacher de la timeline «Principal» hideFromHome: Cacher de la timeline «Principal»
_wellness: _wellness:

View file

@ -1898,11 +1898,6 @@ noteId: 投稿のID
hiddenTagsDescription: 'トレンドと「みつける」から除外したいハッシュタグを(先頭の # を除いて)改行区切りで入力してください。この設定はトレンドと「みつける」以外には影響しません。' hiddenTagsDescription: 'トレンドと「みつける」から除外したいハッシュタグを(先頭の # を除いて)改行区切りで入力してください。この設定はトレンドと「みつける」以外には影響しません。'
hiddenTags: 非表示にするハッシュタグ hiddenTags: 非表示にするハッシュタグ
apps: "アプリ" apps: "アプリ"
_experiments:
title: 試験的な機能
postImportsCaption:
ユーザーが過去の投稿をIceshrimp・Iceshrimp・Mastodon・Akkoma・Pleromaからインポートすることを許可します。キューが溜まっているときにインポートするとサーバーに負荷がかかる可能性があります。
enablePostImports: 投稿のインポートを有効にする
sendModMail: モデレーション通知を送る sendModMail: モデレーション通知を送る
deleted: 削除済み deleted: 削除済み
editNote: 投稿を編集 editNote: 投稿を編集

View file

@ -1257,11 +1257,6 @@ _aboutIceshrimp:
de bovenstaande link om je naam hier te krijgen! de bovenstaande link om je naam hier te krijgen!
contributors: Belangrijkste bijdragers contributors: Belangrijkste bijdragers
allContributors: Alle bijdragers allContributors: Alle bijdragers
_experiments:
postImportsCaption: Hiermee kunnen gebruikers hun posts van eerdere Iceshrimp, Misskey,
Mastodon, Akkoma en Pleroma-accounts importen. Dit kan tijdensh het laden voor
traagheid zorgen als de wachtrij vol zit.
enablePostImports: Post-importeren aanzetten
hiddenTagsDescription: 'Geef de hashtags (zonder #) op die je uit Trending en Verkennen hiddenTagsDescription: 'Geef de hashtags (zonder #) op die je uit Trending en Verkennen
wilt verbergen. Verborgen hashtags zijn nog steeds ontdekbaar via andere manieren.' wilt verbergen. Verborgen hashtags zijn nog steeds ontdekbaar via andere manieren.'
pinnedClipId: ID van de clip on vast te zetten pinnedClipId: ID van de clip on vast te zetten

View file

@ -2098,12 +2098,6 @@ preventAiLearningDescription: Zażądaj, by modele językowe AI osób trzecich n
silencedWarning: Ta strona się pokazuje, ponieważ wymienieni użytkownicy są z serwerów silencedWarning: Ta strona się pokazuje, ponieważ wymienieni użytkownicy są z serwerów
które Twój admin wyciszył, więc mogą być oni potencjalnymi spamerami. które Twój admin wyciszył, więc mogą być oni potencjalnymi spamerami.
verifiedLink: Zweryfikowany link verifiedLink: Zweryfikowany link
_experiments:
enablePostImports: Włącz import postów
postImportsCaption: Pozwala użytkownikom na zaimportowanie ich postów z poprzednich
kont Iceshrimp, Misskey, Mastodon, Akkomy czy Pleromy. Może to spowodować spowolnienia
podczas ładowania, jeśli twoja kolejka ma wąskie gardło.
title: Eksperymenty
alwaysExpandCws: Zawsze rozwijaj posty z CW alwaysExpandCws: Zawsze rozwijaj posty z CW
video: Film video: Film
swipeOnMobile: Zezwól na przesuwanie palcem między stronami swipeOnMobile: Zezwól na przesuwanie palcem między stronami

View file

@ -57,7 +57,7 @@ login: Entrar
loggingIn: Entrando loggingIn: Entrando
logout: Sair logout: Sair
signup: Criar conta signup: Criar conta
uploading: Enviando... uploading: Enviando
users: Usuários users: Usuários
addUser: Adicione um usuário addUser: Adicione um usuário
addInstance: Adicionar um servidor addInstance: Adicionar um servidor
@ -95,7 +95,7 @@ alreadyFavorited: Já foi adicionado aos marcadores.
download: Download download: Download
pageLoadError: Ocorreu um erro ao carregar a página. pageLoadError: Ocorreu um erro ao carregar a página.
pageLoadErrorDescription: Isso normalmente é causado por erros de rede ou pelo cache pageLoadErrorDescription: Isso normalmente é causado por erros de rede ou pelo cache
do navegador. Tente limpar o cache e, depois de esperar um pouquinho, tente novamente. do navegador. Tente limpar o cache ou esperar um pouquinho e recarregar a página.
serverIsDead: Esse servidos não está respondendo. Por favor espere um pouco e tente serverIsDead: Esse servidos não está respondendo. Por favor espere um pouco e tente
novamente. novamente.
youShouldUpgradeClient: Para visualizar essa página, favor reiniciar para atualizar youShouldUpgradeClient: Para visualizar essa página, favor reiniciar para atualizar
@ -110,3 +110,60 @@ followRequests: Pedidos de seguimento
unfollow: Parar de seguir unfollow: Parar de seguir
followRequestPending: Pedido de seguimento pendente followRequestPending: Pedido de seguimento pendente
enterEmoji: Insira um emoji enterEmoji: Insira um emoji
markAsSensitive: Marcar como sensível
unmarkAsSensitive: Desmarcar como sensível
processing: Processando…
renoted: Impulsionado.
blockConfirm: Tem certeza de que deseja bloquear esta conta?
unsuspendConfirm: Tem certeza de que deseja remover a suspensão desta conta?
flagAsBotDescription: Habilite esta opção se esta conta for controlada por um programa.
Se ativado, ela funcionará como um sinalizador para outros desenvolvedores, evitando
intermináveis cadeias de interação com outros bots e ajustando os sistemas internos
do Iceshrimp para tratar esta conta como um bot.
sendErrorReportsDescription: "Quando ativado, informações de erro detalhadas serão
compartilhadas com o Iceshrimp quando ocorrer um problema, ajudando a melhorar a
qualidade do Iceshrimp.\n Isso incluirá informações como a versão do seu sistema
operacional, qual navegador você está usando, sua atividade no Iceshrimp, etc."
general: Geral
federation: Federação
receiveFollowRequest: Pedido de seguidor recebido
followRequestAccepted: Pedido de seguidor aceito
pinned: Fixar no perfil
reaction: Reações
removeReaction: Remover sua reação
enableEmojiReactions: Ativar reações de emoji
showEmojisInReactionNotifications: Mostrar emojis em notificações de reação
reactionSetting: Reações a serem mostradas no seletor de reações
reactionSettingDescription2: Arraste para organizar, clique para excluir, aperte "+"
para adicionar.
attachCancel: Remover anexo
enterFileName: Insira nome de arquivo
suspend: Suspender
unsuspend: Remover suspensão
unblockConfirm: Tem certeza de que deseja desbloquear esta conta?
suspendConfirm: Tem certeza de que deseja suspender esta conta?
editWidgetsExit: Feito
sensitive: Sensível
block: Bloquear
unblock: Desbloquear
emoji: Emoji
emojis: Emoji
wallpaper: Plano de fundo
recipient: Destinatário(s)
annotation: Comentários
instances: Servidores
charts: Gráficos
operations: Operações
software: Programa
version: Versão
metadata: Metadados
network: Rede
disk: Disco
statistics: Estatísticas
done: Feito
default: Padrão
blocked: ''
migrationConfirm: "Você tem certeza absoluta de que deseja migrar sua conta para {account}?
Depois de fazer isso, você não poderá reverter e não poderá usar sua conta normalmente
novamente.\nAlém disso, certifique-se de definir esta conta atual como a conta da
qual você está migrando."

View file

@ -1859,12 +1859,6 @@ _notification:
youReceivedFollowRequest: Bir takip isteği geldi youReceivedFollowRequest: Bir takip isteği geldi
youGotPoll: '{name} anketinde oylama yaptı' youGotPoll: '{name} anketinde oylama yaptı'
youGotMessagingMessageFromUser: '{name} sana bir sohbet mesajı gönderdi' youGotMessagingMessageFromUser: '{name} sana bir sohbet mesajı gönderdi'
_experiments:
title: Deneyler
postImportsCaption: Kullanıcıların geçmiş Iceshrimp, Iceshrimp, Mastodon, Akkoma ve
Pleroma hesaplarından gönderilerini içe aktarmalarına izin verir. Kuyruğunuz tıkanırsa
yükleme sırasında yavaşlamalara neden olabilir.
enablePostImports: Gönderi içeri aktarmasını aktif et
_dialog: _dialog:
charactersExceeded: 'Maksimum karakter aşıldı! Geçerli: {current}/Sınır: {max}' charactersExceeded: 'Maksimum karakter aşıldı! Geçerli: {current}/Sınır: {max}'
charactersBelow: 'Yeterli karakter yok! Geçerli: {current}/Sınır: {min}' charactersBelow: 'Yeterli karakter yok! Geçerli: {current}/Sınır: {min}'

View file

@ -1904,12 +1904,6 @@ _instanceMute:
title: Приховує записи з перелічених серверів. title: Приховує записи з перелічених серверів.
instanceMuteDescription2: Розділити новими рядками instanceMuteDescription2: Розділити новими рядками
heading: Список серверів для заглушення heading: Список серверів для заглушення
_experiments:
enablePostImports: Ввімкнути імпорт записів
title: Експерименти
postImportsCaption: Дозволяє користувачам імпортувати свої публікації з минулих
облікових записів Iceshrimp, Misskey, Mastodon, Akkoma і Pleroma. Це може знизити
швидкість під час завантаження, якщо ваша черга перевантажена.
_dialog: _dialog:
charactersExceeded: 'Перевищено максимальну кількість символів! Обмеження: {current}/{max}' charactersExceeded: 'Перевищено максимальну кількість символів! Обмеження: {current}/{max}'
charactersBelow: 'Недостатньо символів! Обмеження: {current}/{min}' charactersBelow: 'Недостатньо символів! Обмеження: {current}/{min}'

View file

@ -1815,10 +1815,6 @@ _messaging:
dms: 私信 dms: 私信
groups: 群组 groups: 群组
migration: 迁移 migration: 迁移
_experiments:
title: 实验性功能
postImportsCaption: 允许用户从过去的 Iceshrimp、Iceshrimp、Mastodon、Akkoma 和 Pleroma 账号导入帖子。如果您的队列出现拥堵,则可能会导致加载速度减慢。
enablePostImports: 启用帖子导入
license: 许可证 license: 许可证
flagSpeakAsCatDescription: 在猫模式下您的帖子会喵化 flagSpeakAsCatDescription: 在猫模式下您的帖子会喵化
allowedInstances: 白名单服务器 allowedInstances: 白名单服务器

View file

@ -1823,8 +1823,6 @@ flagSpeakAsCat: 像貓一樣地說話
silenceThisInstance: 靜音此伺服器 silenceThisInstance: 靜音此伺服器
silencedInstances: 已靜音的伺服器 silencedInstances: 已靜音的伺服器
silenced: 已靜音 silenced: 已靜音
_experiments:
title: 試驗功能
findOtherInstance: 找找另一個伺服器 findOtherInstance: 找找另一個伺服器
noGraze: 瀏覽器擴展 "Graze for Mastodon" 會與Iceshrimp發生衝突請停用該擴展。 noGraze: 瀏覽器擴展 "Graze for Mastodon" 會與Iceshrimp發生衝突請停用該擴展。
userSaysSomethingReasonRenote: '{name} 轉傳了包含 {reason} 的貼文' userSaysSomethingReasonRenote: '{name} 轉傳了包含 {reason} 的貼文'

View file

@ -1,15 +1,15 @@
{ {
"name": "iceshrimp", "name": "iceshrimp",
"version": "2023.12.7-jormungandr.18", "version": "2023.12.9-jormungandr.18",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://iceshrimp.dev/limepotato/jormungandr-bite.git" "url": "https://iceshrimp.dev/limepotato/jormungandr-bite.git"
}, },
"private": true, "private": true,
"scripts": { "scripts": {
"rebuild": "clean && node ./scripts/build-greet.js && yarn workspace iceshrimp-js build && yarn workspaces foreach -Apitv run build && gulp", "rebuild": "clean && node ./scripts/build-greet.js && yarn workspace iceshrimp-sdk build && yarn workspaces foreach -Apitv run build && gulp",
"build": "node ./scripts/build-greet.js && yarn workspace iceshrimp-js run build && yarn workspaces foreach -Apitv run build && gulp", "build": "node ./scripts/build-greet.js && yarn workspace iceshrimp-sdk run build && yarn workspaces foreach -Apitv run build && gulp",
"build:debug": "node ./scripts/build-greet.js && yarn workspace iceshrimp-js run build:debug && yarn workspaces foreach -Apitv run build:debug && gulp", "build:debug": "node ./scripts/build-greet.js && yarn workspace iceshrimp-sdk run build:debug && yarn workspaces foreach -Apitv run build:debug && gulp",
"start": "yarn workspace backend run start", "start": "yarn workspace backend run start",
"start:debug": "yarn workspace backend run start:debug", "start:debug": "yarn workspace backend run start:debug",
"start:test": "yarn workspace backend run start:test", "start:test": "yarn workspace backend run start:test",
@ -39,7 +39,7 @@
"packages/backend", "packages/backend",
"packages/client", "packages/client",
"packages/sw", "packages/sw",
"packages/iceshrimp-js" "packages/iceshrimp-sdk"
], ],
"resolutions": { "resolutions": {
"chokidar": "^3.3.1" "chokidar": "^3.3.1"
@ -71,10 +71,12 @@
"typescript": "5.1.6", "typescript": "5.1.6",
"yaml": "^2.3.4" "yaml": "^2.3.4"
}, },
"packageManager": "yarn@4.1.1", "packageManager": "yarn@4.3.1",
"dependenciesMeta": { "dependenciesMeta": {
"@discordapp/twemoji@14.1.2": { "@discordapp/twemoji@14.1.2": { "unplugged": true },
"unplugged": true "@microsoft/api-documenter@7.22.30": { "unplugged": true },
} "@microsoft/api-extractor@7.36.3": { "unplugged": true },
"@microsoft/api-extractor-model@7.27.5": { "unplugged": true },
"eventemitter3@4.0.7": { "unplugged": true }
} }
} }

View file

@ -5,4 +5,4 @@ This directory contains all of the packages Iceshrimp uses.
- `backend`: Main backend code written in TypeScript for NodeJS - `backend`: Main backend code written in TypeScript for NodeJS
- `client`: Web interface written in Vue3 and TypeScript - `client`: Web interface written in Vue3 and TypeScript
- `sw`: Web [Service Worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) written in TypeScript - `sw`: Web [Service Worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) written in TypeScript
- `iceshrimp-js`: TypeScript SDK for both backend and client, also published on [NPM](https://www.npmjs.com/package/iceshrimp-js) for public use - `iceshrimp-sdk`: TypeScript SDK for both backend and client

View file

@ -27,6 +27,7 @@
"@bull-board/koa": "5.6.0", "@bull-board/koa": "5.6.0",
"@bull-board/ui": "5.6.0", "@bull-board/ui": "5.6.0",
"@discordapp/twemoji": "14.1.2", "@discordapp/twemoji": "14.1.2",
"@iceshrimp/summaly": "2.7.2",
"@koa/cors": "3.4.3", "@koa/cors": "3.4.3",
"@koa/multer": "3.0.2", "@koa/multer": "3.0.2",
"@koa/router": "9.0.1", "@koa/router": "9.0.1",
@ -34,7 +35,6 @@
"@peertube/http-signature": "1.7.0", "@peertube/http-signature": "1.7.0",
"@redocly/openapi-core": "1.0.0-beta.131", "@redocly/openapi-core": "1.0.0-beta.131",
"@sinonjs/fake-timers": "9.1.2", "@sinonjs/fake-timers": "9.1.2",
"@syuilo/aiscript": "0.11.1",
"@transfem-org/sfm-js": "^0.24.5", "@transfem-org/sfm-js": "^0.24.5",
"adm-zip": "^0.5.10", "adm-zip": "^0.5.10",
"ajv": "8.12.0", "ajv": "8.12.0",
@ -69,7 +69,7 @@
"gunzip-maybe": "^1.4.2", "gunzip-maybe": "^1.4.2",
"happy-dom": "^12.10.3", "happy-dom": "^12.10.3",
"hpagent": "0.1.2", "hpagent": "0.1.2",
"iceshrimp-js": "workspace:*", "iceshrimp-sdk": "workspace:*",
"ioredis": "5.3.2", "ioredis": "5.3.2",
"ip-cidr": "3.1.0", "ip-cidr": "3.1.0",
"is-svg": "4.3.2", "is-svg": "4.3.2",
@ -93,7 +93,7 @@
"msgpackr": "1.9.5", "msgpackr": "1.9.5",
"multer": "1.4.4-lts.1", "multer": "1.4.4-lts.1",
"nested-property": "4.0.0", "nested-property": "4.0.0",
"node-fetch": "3.3.1", "node-fetch": "3.3.2",
"nodemailer": "6.9.3", "nodemailer": "6.9.3",
"oauth": "^0.10.0", "oauth": "^0.10.0",
"os-utils": "0.0.14", "os-utils": "0.0.14",
@ -111,7 +111,7 @@
"qs": "6.11.2", "qs": "6.11.2",
"random-seed": "0.3.0", "random-seed": "0.3.0",
"ratelimiter": "3.4.1", "ratelimiter": "3.4.1",
"re2": "^1.20.9", "re2": "^1.20.11",
"redis-lock": "0.1.4", "redis-lock": "0.1.4",
"redis-semaphore": "5.3.1", "redis-semaphore": "5.3.1",
"reflect-metadata": "0.1.13", "reflect-metadata": "0.1.13",
@ -121,9 +121,8 @@
"sanitize-html": "2.10.0", "sanitize-html": "2.10.0",
"seedrandom": "^3.0.5", "seedrandom": "^3.0.5",
"semver": "7.5.4", "semver": "7.5.4",
"sharp": "0.32.1", "sharp": "0.33.4",
"stringz": "2.1.0", "stringz": "2.1.0",
"summaly": "2.7.0",
"syslog-pro": "1.0.0", "syslog-pro": "1.0.0",
"systeminformation": "^5.21.12", "systeminformation": "^5.21.12",
"tar-stream": "^3.1.6", "tar-stream": "^3.1.6",

View file

@ -24,6 +24,7 @@ export class FederatedBite1705528046452 implements MigrationInterface {
} }
public async down(queryRunner: QueryRunner): Promise<void> { public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DELETE FROM "notification" WHERE "biteId" IS NOT NULL`);
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_c54844158c1eead7042e7ca4c83"`); await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_c54844158c1eead7042e7ca4c83"`);
await queryRunner.query(`ALTER TABLE "bite" DROP CONSTRAINT "FK_5d5f68610583f2e0b6785d3c0e9"`); await queryRunner.query(`ALTER TABLE "bite" DROP CONSTRAINT "FK_5d5f68610583f2e0b6785d3c0e9"`);
await queryRunner.query(`ALTER TABLE "bite" DROP CONSTRAINT "FK_a646fbbeb6efa2531c75fec46b9"`); await queryRunner.query(`ALTER TABLE "bite" DROP CONSTRAINT "FK_a646fbbeb6efa2531c75fec46b9"`);

View file

@ -0,0 +1,13 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class BiteNotificationIndex1722204953558 implements MigrationInterface {
name = 'BiteNotificationIndex1722204953558'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`CREATE INDEX "IDX_c54844158c1eead7042e7ca4c8" ON "notification" ("biteId") `);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP INDEX "public"."IDX_c54844158c1eead7042e7ca4c8"`);
}
}

View file

@ -88,7 +88,6 @@ export async function getResponse(args: {
body?: string; body?: string;
headers: Record<string, string>; headers: Record<string, string>;
timeout?: number; timeout?: number;
size?: number;
redirect?: RequestRedirect; redirect?: RequestRedirect;
}) { }) {
const timeout = args.timeout || 10 * 1000; const timeout = args.timeout || 10 * 1000;
@ -103,7 +102,7 @@ export async function getResponse(args: {
headers: args.headers, headers: args.headers,
body: args.body, body: args.body,
timeout, timeout,
size: args.size || 10 * 1024 * 1024, size: 10 * 1024 * 1024,
agent: getAgentByUrl, agent: getAgentByUrl,
signal: controller.signal, signal: controller.signal,
redirect: args.redirect redirect: args.redirect

View file

@ -1,4 +1,4 @@
import { Check, Column, Entity, ManyToOne, PrimaryColumn } from "typeorm"; import { Check, Column, Entity, ManyToOne, PrimaryColumn, Index } from "typeorm";
import { id } from "../id.js"; import { id } from "../id.js";
import { User } from "./user.js"; import { User } from "./user.js";

View file

@ -183,6 +183,7 @@ export class Notification {
@JoinColumn() @JoinColumn()
public appAccessToken: AccessToken | null; public appAccessToken: AccessToken | null;
@Index()
@Column({ ...id(), nullable: true }) @Column({ ...id(), nullable: true })
public biteId: Bite["id"] | null; public biteId: Bite["id"] | null;

View file

@ -241,6 +241,7 @@ export const UserRepository = db.getRepository(User).extend({
}, },
async userFromURI(uri: string): Promise<User | null> { async userFromURI(uri: string): Promise<User | null> {
try {
const dbResolver = new DbResolver(); const dbResolver = new DbResolver();
let local = await dbResolver.getUserFromApId(uri); let local = await dbResolver.getUserFromApId(uri);
if (local) { if (local) {
@ -259,6 +260,10 @@ export const UserRepository = db.getRepository(User).extend({
} }
return isActor(object) ? await createPerson(getApId(object)) : null; return isActor(object) ? await createPerson(getApId(object)) : null;
}
catch {
return null;
}
}, },
async getHasUnreadAntenna(userId: User["id"]): Promise<boolean> { async getHasUnreadAntenna(userId: User["id"]): Promise<boolean> {

View file

@ -1,4 +1,5 @@
import type Bull from "bull"; import type Bull from "bull";
import { noop } from "@/queue/processors/noop.js";
const jobs = {} as Record<string, Bull.ProcessCallbackFunction<Record<string, unknown>>>; const jobs = {} as Record<string, Bull.ProcessCallbackFunction<Record<string, unknown>>>;
@ -6,4 +7,6 @@ export default function (q: Bull.Queue) {
for (const [k, v] of Object.entries(jobs)) { for (const [k, v] of Object.entries(jobs)) {
q.process(k, 16, v); q.process(k, 16, v);
} }
q.process(noop);
} }

View file

@ -9,6 +9,7 @@ import { Users, DriveFiles } from "@/models/index.js";
import type { DbUserImportJobData } from "@/queue/types.js"; import type { DbUserImportJobData } from "@/queue/types.js";
import { queueLogger } from "../../logger.js"; import { queueLogger } from "../../logger.js";
import type Bull from "bull"; import type Bull from "bull";
import { cache as heuristic } from "@/server/api/common/generate-following-query.js";
const logger = queueLogger.createSubLogger("import-following"); const logger = queueLogger.createSubLogger("import-following");
@ -111,6 +112,7 @@ export async function importFollowing(
} }
} }
await heuristic.delete(user.id);
logger.succ("Imported"); logger.succ("Imported");
done(); done();
} }

View file

@ -16,6 +16,7 @@ import { importMastoPost } from "./import-masto-post.js";
import { importCkPost } from "./import-firefish-post.js"; import { importCkPost } from "./import-firefish-post.js";
import { importBlocking } from "./import-blocking.js"; import { importBlocking } from "./import-blocking.js";
import { importCustomEmojis } from "./import-custom-emojis.js"; import { importCustomEmojis } from "./import-custom-emojis.js";
import { noop } from "@/queue/processors/noop.js";
const jobs = { const jobs = {
deleteDriveFiles, deleteDriveFiles,
@ -44,4 +45,6 @@ export default function (dbQueue: Bull.Queue<DbJobData>) {
for (const [k, v] of Object.entries(jobs)) { for (const [k, v] of Object.entries(jobs)) {
dbQueue.process(k, v); dbQueue.process(k, v);
} }
dbQueue.process(noop);
} }

View file

@ -22,6 +22,10 @@ const logger = new Logger("deliver");
let latest: string | null = null; let latest: string | null = null;
export default async (job: Bull.Job<DeliverJobData>) => { export default async (job: Bull.Job<DeliverJobData>) => {
if (job.data == null || Object.keys(job.data).length === 0) {
job.opts.removeOnComplete = true;
return "Skip (data was null or empty)";
}
const { host } = new URL(job.data.to); const { host } = new URL(job.data.to);
const puny = toPuny(host); const puny = toPuny(host);

View file

@ -11,6 +11,11 @@ export async function endedPollNotification(
job: Bull.Job<EndedPollNotificationJobData>, job: Bull.Job<EndedPollNotificationJobData>,
done: any, done: any,
): Promise<void> { ): Promise<void> {
if (job.data == null || Object.keys(job.data).length === 0) {
job.opts.removeOnComplete = true;
done();
return;
}
const note = await Notes.findOneBy({ id: job.data.noteId }); const note = await Notes.findOneBy({ id: job.data.noteId });
if (note == null || !note.hasPoll) { if (note == null || !note.hasPoll) {
done(); done();

View file

@ -29,6 +29,10 @@ const logger = new Logger("inbox");
// Processing when an activity arrives in the user's inbox // Processing when an activity arrives in the user's inbox
export default async (job: Bull.Job<InboxJobData>): Promise<string> => { export default async (job: Bull.Job<InboxJobData>): Promise<string> => {
if (job.data == null || Object.keys(job.data).length === 0) {
job.opts.removeOnComplete = true;
return "Skip (data was null or empty)";
}
const signature = job.data.signature; // HTTP-signature const signature = job.data.signature; // HTTP-signature
let activity = job.data.activity; let activity = job.data.activity;

View file

@ -0,0 +1,7 @@
import Bull from "bull";
// Processor to be registered for jobs with __default__ (unnamed) handlers in queues that only have named handlers
// Prevents sporadic bogus jobs from clogging up the queues
export async function noop(job: Bull.Job): Promise<void> {
job.opts.removeOnComplete = true;
}

View file

@ -2,6 +2,7 @@ import type Bull from "bull";
import type { ObjectStorageJobData } from "@/queue/types.js"; import type { ObjectStorageJobData } from "@/queue/types.js";
import deleteFile from "./delete-file.js"; import deleteFile from "./delete-file.js";
import cleanRemoteFiles from "./clean-remote-files.js"; import cleanRemoteFiles from "./clean-remote-files.js";
import { noop } from "@/queue/processors/noop.js";
const jobs = { const jobs = {
deleteFile, deleteFile,
@ -16,4 +17,6 @@ export default function (q: Bull.Queue) {
for (const [k, v] of Object.entries(jobs)) { for (const [k, v] of Object.entries(jobs)) {
q.process(k, 16, v); q.process(k, 16, v);
} }
q.process(noop);
} }

View file

@ -6,6 +6,7 @@ import { checkExpiredMutings } from "./check-expired-mutings.js";
import { clean } from "./clean.js"; import { clean } from "./clean.js";
import { setLocalEmojiSizes } from "./local-emoji-size.js"; import { setLocalEmojiSizes } from "./local-emoji-size.js";
import { verifyLinks } from "./verify-links.js"; import { verifyLinks } from "./verify-links.js";
import { noop } from "@/queue/processors/noop.js";
const jobs = { const jobs = {
tickCharts, tickCharts,
@ -25,4 +26,6 @@ export default function (dbQueue: Bull.Queue<Record<string, unknown>>) {
for (const [k, v] of Object.entries(jobs)) { for (const [k, v] of Object.entries(jobs)) {
dbQueue.process(k, v); dbQueue.process(k, v);
} }
dbQueue.process(noop);
} }

View file

@ -9,6 +9,10 @@ import config from "@/config/index.js";
const logger = new Logger("webhook"); const logger = new Logger("webhook");
export default async (job: Bull.Job<WebhookDeliverJobData>) => { export default async (job: Bull.Job<WebhookDeliverJobData>) => {
if (job.data == null || Object.keys(job.data).length === 0) {
job.opts.removeOnComplete = true;
return "Skip (data was null or empty)";
}
try { try {
logger.debug(`delivering ${job.data.webhookId}`); logger.debug(`delivering ${job.data.webhookId}`);

View file

@ -6,7 +6,6 @@ import config from "@/config/index.js";
import { genId } from "@/misc/gen-id.js"; import { genId } from "@/misc/gen-id.js";
import { createBite } from "@/services/create-bite.js"; import { createBite } from "@/services/create-bite.js";
import { Bite } from "@/models/entities/bite.js"; import { Bite } from "@/models/entities/bite.js";
import { tickBiteIncoming } from "@/metrics.js";
export default async ( export default async (
actor: CacheableRemoteUser, actor: CacheableRemoteUser,
@ -76,7 +75,5 @@ export default async (
bite.published ? new Date(bite.published) : null, bite.published ? new Date(bite.published) : null,
); );
tickBiteIncoming();
return "ok"; return "ok";
}; };

View file

@ -126,6 +126,7 @@ export class LdSignature {
headers: { headers: {
Accept: "application/ld+json, application/json", Accept: "application/ld+json, application/json",
}, },
size: 1024 * 1024, // 1MiB
// TODO // TODO
//timeout: this.loderTimeout, //timeout: this.loderTimeout,
agent: (u) => (u.protocol === "http:" ? httpAgent : httpsAgent), agent: (u) => (u.protocol === "http:" ? httpAgent : httpsAgent),

View file

@ -584,7 +584,7 @@ export async function updateNote(value: string | IObject, resolver?: Resolver) {
text = await htmlToMfm(post.content, post.tag); text = await htmlToMfm(post.content, post.tag);
} }
const cw = post.sensitive && post.summary; const cw = post.summary === "" ? null : post.summary;
// File parsing // File parsing
const fileList = post.attachment const fileList = post.attachment

View file

@ -56,6 +56,8 @@ import {
import { RecursionLimiter } from "@/models/repositories/user-profile.js"; import { RecursionLimiter } from "@/models/repositories/user-profile.js";
import { UserConverter } from "@/server/api/mastodon/converters/user.js"; import { UserConverter } from "@/server/api/mastodon/converters/user.js";
import fetch from "node-fetch";
const logger = apLogger; const logger = apLogger;
const nameLength = 128; const nameLength = 128;
@ -271,6 +273,7 @@ export async function createPerson(
try { try {
let data = await fetch(person.followers, { let data = await fetch(person.followers, {
headers: { Accept: "application/json" }, headers: { Accept: "application/json" },
size: 1024 * 1024
}); });
let json_data = JSON.parse(await data.text()); let json_data = JSON.parse(await data.text());
@ -286,6 +289,7 @@ export async function createPerson(
try { try {
let data = await fetch(person.following, { let data = await fetch(person.following, {
headers: { Accept: "application/json" }, headers: { Accept: "application/json" },
size: 1024 * 1024
}); });
let json_data = JSON.parse(await data.text()); let json_data = JSON.parse(await data.text());
@ -529,6 +533,7 @@ export async function updatePerson(
try { try {
let data = await fetch(person.followers, { let data = await fetch(person.followers, {
headers: { Accept: "application/json" }, headers: { Accept: "application/json" },
size: 1024 * 1024
}); });
let json_data = JSON.parse(await data.text()); let json_data = JSON.parse(await data.text());
@ -544,6 +549,7 @@ export async function updatePerson(
try { try {
let data = await fetch(person.following, { let data = await fetch(person.following, {
headers: { Accept: "application/json" }, headers: { Accept: "application/json" },
size: 1024 * 1024
}); });
let json_data = JSON.parse(await data.text()); let json_data = JSON.parse(await data.text());

View file

@ -11,14 +11,14 @@ export default function (
totalItems: any, totalItems: any,
first?: string, first?: string,
last?: string, last?: string,
orderedItems?: Record<string, unknown>[], orderedItems?: (Record<string, unknown> | string)[],
): { ): {
id: string | null; id: string | null;
type: "OrderedCollection"; type: "OrderedCollection";
totalItems: any; totalItems: any;
first?: string; first?: string;
last?: string; last?: string;
orderedItems?: Record<string, unknown>[]; orderedItems?: (Record<string, unknown> | string)[];
} { } {
const page: any = { const page: any = {
id, id,

View file

@ -27,7 +27,6 @@ import { shouldBlockInstance } from "@/misc/should-block-instance.js";
import { apLogger } from "@/remote/activitypub/logger.js"; import { apLogger } from "@/remote/activitypub/logger.js";
import { In, IsNull, Not } from "typeorm"; import { In, IsNull, Not } from "typeorm";
import renderBite from "@/remote/activitypub/renderer/bite.js"; import renderBite from "@/remote/activitypub/renderer/bite.js";
import { tickResolve } from "@/metrics.js";
export default class Resolver { export default class Resolver {
private history: Set<string>; private history: Set<string>;

View file

@ -37,7 +37,6 @@ import { serverLogger } from "./index.js";
import config from "@/config/index.js"; import config from "@/config/index.js";
import Koa from "koa"; import Koa from "koa";
import renderBite from "@/remote/activitypub/renderer/bite.js"; import renderBite from "@/remote/activitypub/renderer/bite.js";
import { tickFetch } from "@/metrics.js";
// Init router // Init router
const router = new Router(); const router = new Router();

Some files were not shown because too many files have changed in this diff Show more