Initial commit
This commit is contained in:
@@ -0,0 +1,14 @@
|
|||||||
|
Copyright 2023 The Iceshrimp contributors
|
||||||
|
Copyright 2023 The Firefish contributors
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
url: http://localhost:3000
|
||||||
|
port: 3000
|
||||||
|
|
||||||
|
db:
|
||||||
|
host: 127.0.0.1
|
||||||
|
port: 5432
|
||||||
|
|
||||||
|
db: iceshrimp
|
||||||
|
|
||||||
|
user: iceshrimp
|
||||||
|
pass: iceshrimp
|
||||||
|
|
||||||
|
redis:
|
||||||
|
host: localhost
|
||||||
|
port: 6379
|
||||||
|
family: 4
|
||||||
|
#sonic:
|
||||||
|
# host: localhost
|
||||||
|
# port: 1491
|
||||||
|
# auth: SecretPassword
|
||||||
|
# collection: notes
|
||||||
|
# bucket: default
|
||||||
|
|
||||||
|
reservedUsernames:
|
||||||
|
- root
|
||||||
|
- admin
|
||||||
|
- administrator
|
||||||
|
- me
|
||||||
|
- system
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
# db settings
|
||||||
|
POSTGRES_PASSWORD=example-iceshrimp-pass
|
||||||
|
POSTGRES_USER=example-iceshrimp-user
|
||||||
|
POSTGRES_DB=iceshrimp
|
||||||
@@ -0,0 +1,263 @@
|
|||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# Iceshrimp configuration
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
# After starting your server, please don't change the URL! Doing so will break federation.
|
||||||
|
|
||||||
|
# ┌─────┐
|
||||||
|
#───┘ URL └─────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
# Final accessible URL seen by a user.
|
||||||
|
url: https://example.org/
|
||||||
|
|
||||||
|
# (Optional - ADVANCED) Domain used for account handles.
|
||||||
|
# Only uncomment this if you want to for example have the URL be ice.example.org
|
||||||
|
# and the handles to be example.org
|
||||||
|
# accountDomain: example.org
|
||||||
|
|
||||||
|
# ┌───────────────────────┐
|
||||||
|
#───┘ Port and TLS settings └───────────────────────────────────
|
||||||
|
|
||||||
|
#
|
||||||
|
# Iceshrimp requires a reverse proxy to support HTTPS connections.
|
||||||
|
#
|
||||||
|
# +----- https://example.com/ ------------+
|
||||||
|
# +------+ |+-------------+ +----------------+|
|
||||||
|
# | User | ---> || Proxy (443) | ---> | Iceshrimp (3000) ||
|
||||||
|
# +------+ |+-------------+ +----------------+|
|
||||||
|
# +---------------------------------------+
|
||||||
|
#
|
||||||
|
# You need to set up a reverse proxy. (e.g. nginx, caddy)
|
||||||
|
# An encrypted connection with HTTPS is highly recommended
|
||||||
|
# because tokens may be transferred in GET requests.
|
||||||
|
|
||||||
|
# The port that your Iceshrimp server should listen on.
|
||||||
|
port: 3000
|
||||||
|
|
||||||
|
# ┌──────────────────────────┐
|
||||||
|
#───┘ PostgreSQL configuration └────────────────────────────────
|
||||||
|
|
||||||
|
db:
|
||||||
|
host: db
|
||||||
|
port: 5432
|
||||||
|
#ssl: false
|
||||||
|
# Database name
|
||||||
|
db: iceshrimp
|
||||||
|
|
||||||
|
# Auth
|
||||||
|
user: example-iceshrimp-user
|
||||||
|
pass: example-iceshrimp-pass
|
||||||
|
|
||||||
|
# Whether disable Caching queries
|
||||||
|
#disableCache: true
|
||||||
|
|
||||||
|
# Extra Connection options
|
||||||
|
#extra:
|
||||||
|
# ssl:
|
||||||
|
# host: localhost
|
||||||
|
# rejectUnauthorized: false
|
||||||
|
|
||||||
|
# ┌─────────────────────┐
|
||||||
|
#───┘ Redis configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
redis:
|
||||||
|
host: redis
|
||||||
|
port: 6379
|
||||||
|
#tls:
|
||||||
|
# host: localhost
|
||||||
|
# rejectUnauthorized: false
|
||||||
|
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
||||||
|
#pass: example-pass
|
||||||
|
#prefix: example-prefix
|
||||||
|
#db: 1
|
||||||
|
#user: default
|
||||||
|
|
||||||
|
|
||||||
|
# ┌───────────────┐
|
||||||
|
#───┘ ID generation └───────────────────────────────────────────
|
||||||
|
|
||||||
|
# No need to uncomment in most cases, but you may want to change
|
||||||
|
# these settings if you plan to run a large and/or distributed server.
|
||||||
|
|
||||||
|
# cuid:
|
||||||
|
# # Min 16, Max 24
|
||||||
|
# length: 16
|
||||||
|
#
|
||||||
|
# # Set this to a unique string across workers (e.g., machine's hostname)
|
||||||
|
# # if your workers are running in multiple hosts.
|
||||||
|
# fingerprint: my-fingerprint
|
||||||
|
|
||||||
|
|
||||||
|
# ┌─────────────────────┐
|
||||||
|
#───┘ Other configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
# Maximum length of a post (default 3000, max 100000)
|
||||||
|
#maxNoteLength: 3000
|
||||||
|
|
||||||
|
# Maximum length of an image caption (default 1500, max 8192)
|
||||||
|
#maxCaptionLength: 1500
|
||||||
|
|
||||||
|
# Reserved usernames that only the administrator can register with
|
||||||
|
reservedUsernames: [
|
||||||
|
'root',
|
||||||
|
'admin',
|
||||||
|
'administrator',
|
||||||
|
'me',
|
||||||
|
'system'
|
||||||
|
]
|
||||||
|
|
||||||
|
# Whether disable HSTS
|
||||||
|
#disableHsts: true
|
||||||
|
|
||||||
|
# Number of worker processes
|
||||||
|
#clusterLimit: 1
|
||||||
|
|
||||||
|
# Worker only mode
|
||||||
|
#onlyQueueProcessor: 1
|
||||||
|
|
||||||
|
# Job concurrency per worker
|
||||||
|
# deliverJobConcurrency: 128
|
||||||
|
# inboxJobConcurrency: 16
|
||||||
|
|
||||||
|
# Job rate limiter
|
||||||
|
# deliverJobPerSec: 128
|
||||||
|
# inboxJobPerSec: 16
|
||||||
|
|
||||||
|
# Job attempts
|
||||||
|
# deliverJobMaxAttempts: 12
|
||||||
|
# inboxJobMaxAttempts: 8
|
||||||
|
|
||||||
|
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
||||||
|
#outgoingAddressFamily: ipv4
|
||||||
|
|
||||||
|
# Syslog option
|
||||||
|
#syslog:
|
||||||
|
# host: localhost
|
||||||
|
# port: 514
|
||||||
|
|
||||||
|
# Proxy for HTTP/HTTPS
|
||||||
|
#proxy: http://127.0.0.1:3128
|
||||||
|
|
||||||
|
#proxyBypassHosts: [
|
||||||
|
# 'web.kaiteki.app',
|
||||||
|
# 'example.com',
|
||||||
|
# '192.0.2.8'
|
||||||
|
#]
|
||||||
|
|
||||||
|
# Proxy for SMTP/SMTPS
|
||||||
|
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
|
||||||
|
#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4
|
||||||
|
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
|
||||||
|
|
||||||
|
# Media Proxy
|
||||||
|
#mediaProxy: https://example.com/proxy
|
||||||
|
|
||||||
|
# Proxy remote files (default: false)
|
||||||
|
#proxyRemoteFiles: true
|
||||||
|
|
||||||
|
# Media cleanup settings (defaults: false, 0, false, false)
|
||||||
|
#mediaCleanup:
|
||||||
|
# cron: true
|
||||||
|
# maxAgeDays: 30
|
||||||
|
# cleanAvatars: false
|
||||||
|
# cleanHeaders: false
|
||||||
|
|
||||||
|
# Status code images
|
||||||
|
#images:
|
||||||
|
# info: '/twemoji/1f440.svg'
|
||||||
|
# notFound: '/twemoji/2049.svg'
|
||||||
|
# error: '/twemoji/1f480.svg'
|
||||||
|
|
||||||
|
# Search engine (MFM)
|
||||||
|
#searchEngine: 'https://duckduckgo.com/?q='
|
||||||
|
|
||||||
|
#allowedPrivateNetworks: [
|
||||||
|
# '127.0.0.1/32'
|
||||||
|
#]
|
||||||
|
|
||||||
|
# TWA
|
||||||
|
#twa:
|
||||||
|
# nameSpace: android_app
|
||||||
|
# packageName: tld.domain.twa
|
||||||
|
# sha256CertFingerprints: ['AB:CD:EF']
|
||||||
|
|
||||||
|
# Upload or download file size limits (bytes)
|
||||||
|
#maxFileSize: 262144000
|
||||||
|
|
||||||
|
# ┌────────────────────────────────┐
|
||||||
|
#───┘ Mastodon client API HTML Cache └──────────────────────────
|
||||||
|
# Caution: rendered post html content is stored in redis (in-memory cache)
|
||||||
|
# for the duration of ttl, so don't set it too high if you have little system memory.
|
||||||
|
#
|
||||||
|
# The prewarm option causes every incoming user/note create/update event to
|
||||||
|
# be rendered so the cache is always "warm". This trades background cpu load for
|
||||||
|
# better request response time and better scaling, as posts won't have to be rendered
|
||||||
|
# on request.
|
||||||
|
#
|
||||||
|
# The dbFallback option stores html data that expires into postgres,
|
||||||
|
# which is more expensive than fetching it from redis,
|
||||||
|
# but cheaper than re-rendering the HTML.
|
||||||
|
|
||||||
|
#htmlCache:
|
||||||
|
# ttl: 1h
|
||||||
|
# prewarm: false
|
||||||
|
# dbFallback: false
|
||||||
|
|
||||||
|
# Duration hard muted notes are stored in redis for.
|
||||||
|
# Increasing this trades higher memory consumption for lower cpu usage on repeated requests within the specified ttl.
|
||||||
|
#wordMuteCache:
|
||||||
|
# ttl: 24h
|
||||||
|
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# Congrats, you've reached the end of the config file needed for most deployments!
|
||||||
|
# Enjoy your Iceshrimp server!
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# Managed hosting settings
|
||||||
|
# >>> NORMAL SELF-HOSTERS, STAY AWAY! <<<
|
||||||
|
# >>> YOU DON'T NEED THIS! <<<
|
||||||
|
# Each category is optional, but if each item in each category is mandatory!
|
||||||
|
# If you mess this up, that's on you, you've been warned...
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
#maxUserSignups: 100
|
||||||
|
#isManagedHosting: true
|
||||||
|
#deepl:
|
||||||
|
# managed: true
|
||||||
|
# authKey: ''
|
||||||
|
# isPro: false
|
||||||
|
#
|
||||||
|
#email:
|
||||||
|
# managed: true
|
||||||
|
# address: 'example@email.com'
|
||||||
|
# host: 'email.com'
|
||||||
|
# port: 587
|
||||||
|
# user: 'example@email.com'
|
||||||
|
# pass: ''
|
||||||
|
# useImplicitSslTls: false
|
||||||
|
#
|
||||||
|
#objectStorage:
|
||||||
|
# managed: true
|
||||||
|
# baseUrl: ''
|
||||||
|
# bucket: ''
|
||||||
|
# prefix: ''
|
||||||
|
# endpoint: ''
|
||||||
|
# region: ''
|
||||||
|
# accessKey: ''
|
||||||
|
# secretKey: ''
|
||||||
|
# useSsl: true
|
||||||
|
# connnectOverProxy: false
|
||||||
|
# setPublicReadOnUpload: true
|
||||||
|
# s3ForcePathStyle: true
|
||||||
|
|
||||||
|
# !!!!!!!!!!
|
||||||
|
# >>>>>> AGAIN, NORMAL SELF-HOSTERS, STAY AWAY! <<<<<<
|
||||||
|
# >>>>>> YOU DON'T NEED THIS, ABOVE SETTINGS ARE FOR MANAGED HOSTING ONLY! <<<<<<
|
||||||
|
# !!!!!!!!!!
|
||||||
|
|
||||||
|
# Seriously. Do NOT fill out the above settings if you're self-hosting.
|
||||||
|
# They're much better off being set from the control panel.
|
||||||
@@ -0,0 +1,283 @@
|
|||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# Iceshrimp configuration
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
# After starting your server, please don't change the URL! Doing so will break federation.
|
||||||
|
|
||||||
|
# ┌─────┐
|
||||||
|
#───┘ URL └─────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
# Final accessible URL seen by a user.
|
||||||
|
url: http://100.87.21.24:3000/
|
||||||
|
|
||||||
|
# (Optional - ADVANCED) Domain used for account handles.
|
||||||
|
# Only uncomment this if you want to for example have the URL be ice.example.org
|
||||||
|
# and the handles to be example.org
|
||||||
|
# accountDomain: example.org
|
||||||
|
|
||||||
|
# ┌───────────────────────┐
|
||||||
|
#───┘ Port and TLS settings └───────────────────────────────────
|
||||||
|
|
||||||
|
#
|
||||||
|
# Iceshrimp requires a reverse proxy to support HTTPS connections.
|
||||||
|
#
|
||||||
|
# +------- https://example.com/ ------------+
|
||||||
|
# +------+ |+-------------+ +------------------+|
|
||||||
|
# | User | ---> || Proxy (443) | ---> | Iceshrimp (3000) ||
|
||||||
|
# +------+ |+-------------+ +------------------+|
|
||||||
|
# +-----------------------------------------+
|
||||||
|
#
|
||||||
|
# You need to set up a reverse proxy. (e.g. nginx, caddy)
|
||||||
|
# An encrypted connection with HTTPS is highly recommended
|
||||||
|
# because tokens may be transferred in GET requests.
|
||||||
|
|
||||||
|
# The port that your Iceshrimp server should listen on.
|
||||||
|
port: 3000
|
||||||
|
|
||||||
|
# The local address that your Iceshrimp server should bind to.
|
||||||
|
listen: 0.0.0.0
|
||||||
|
|
||||||
|
# Local HTTPS certificate files.
|
||||||
|
# tls:
|
||||||
|
# keyPath: .config/tls/localhost.key
|
||||||
|
# certPath: .config/tls/localhost.crt
|
||||||
|
|
||||||
|
# ┌──────────────────────────┐
|
||||||
|
#───┘ PostgreSQL configuration └────────────────────────────────
|
||||||
|
|
||||||
|
db:
|
||||||
|
host: localhost
|
||||||
|
port: 5432
|
||||||
|
#ssl: false
|
||||||
|
# Database name
|
||||||
|
db: iceshrimp
|
||||||
|
|
||||||
|
# Auth
|
||||||
|
user: postgres
|
||||||
|
pass: a
|
||||||
|
|
||||||
|
# Whether disable Caching queries
|
||||||
|
#disableCache: true
|
||||||
|
|
||||||
|
# Extra Connection options
|
||||||
|
#extra:
|
||||||
|
# ssl:
|
||||||
|
# host: localhost
|
||||||
|
# rejectUnauthorized: false
|
||||||
|
|
||||||
|
# You can enable different different logging levels by setting the value of logging to any of the values listed below
|
||||||
|
# * 'error' - logs all failed queries and errors
|
||||||
|
# * 'slow' - logs slow queries
|
||||||
|
# * 'query' - logs all queries
|
||||||
|
# * 'schema' - logs the schema build process
|
||||||
|
# * 'info' - logs internal orm informative messages
|
||||||
|
# * 'log' - logs internal orm log messages
|
||||||
|
# You can set multiple log level by specifying them as an array i.e ['log', 'info']
|
||||||
|
# You can set disable all log levels by specifying an empty array: []
|
||||||
|
# You can set enable all log levels by specifying the special value: 'all'
|
||||||
|
logging: ['error', 'slow']
|
||||||
|
|
||||||
|
# ┌─────────────────────┐
|
||||||
|
#───┘ Redis configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
redis:
|
||||||
|
host: localhost
|
||||||
|
port: 6379
|
||||||
|
#tls:
|
||||||
|
# host: localhost
|
||||||
|
# rejectUnauthorized: false
|
||||||
|
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
||||||
|
#pass: example-pass
|
||||||
|
#prefix: example-prefix
|
||||||
|
#db: 1
|
||||||
|
#user: default
|
||||||
|
|
||||||
|
|
||||||
|
# ┌───────────────┐
|
||||||
|
#───┘ ID generation └───────────────────────────────────────────
|
||||||
|
|
||||||
|
# No need to uncomment in most cases, but you may want to change
|
||||||
|
# these settings if you plan to run a large and/or distributed server.
|
||||||
|
|
||||||
|
# cuid:
|
||||||
|
# # Min 16, Max 24
|
||||||
|
# length: 16
|
||||||
|
#
|
||||||
|
# # Set this to a unique string across workers (e.g., machine's hostname)
|
||||||
|
# # if your workers are running in multiple hosts.
|
||||||
|
# fingerprint: my-fingerprint
|
||||||
|
|
||||||
|
|
||||||
|
# ┌─────────────────────┐
|
||||||
|
#───┘ Other configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
# Maximum length of a post (default 3000, max 100000)
|
||||||
|
#maxNoteLength: 3000
|
||||||
|
|
||||||
|
# Maximum length of an image caption (default 1500, max 8192)
|
||||||
|
#maxCaptionLength: 1500
|
||||||
|
|
||||||
|
# Reserved usernames that only the administrator can register with
|
||||||
|
reservedUsernames: [
|
||||||
|
'root',
|
||||||
|
'admin',
|
||||||
|
'administrator',
|
||||||
|
'me',
|
||||||
|
'system'
|
||||||
|
]
|
||||||
|
|
||||||
|
# Whether disable HSTS
|
||||||
|
disableHsts: true
|
||||||
|
|
||||||
|
# Number of worker processes
|
||||||
|
#clusterLimit: 1
|
||||||
|
|
||||||
|
# Worker only mode
|
||||||
|
#onlyQueueProcessor: 1
|
||||||
|
|
||||||
|
# Job concurrency per worker
|
||||||
|
# deliverJobConcurrency: 128
|
||||||
|
# inboxJobConcurrency: 16
|
||||||
|
|
||||||
|
# Job rate limiter
|
||||||
|
# deliverJobPerSec: 128
|
||||||
|
# inboxJobPerSec: 16
|
||||||
|
|
||||||
|
# Job attempts
|
||||||
|
# deliverJobMaxAttempts: 12
|
||||||
|
# inboxJobMaxAttempts: 8
|
||||||
|
|
||||||
|
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
||||||
|
#outgoingAddressFamily: ipv4
|
||||||
|
|
||||||
|
# Syslog option
|
||||||
|
#syslog:
|
||||||
|
# host: localhost
|
||||||
|
# port: 514
|
||||||
|
|
||||||
|
# Proxy for HTTP/HTTPS
|
||||||
|
#proxy: http://127.0.0.1:3128
|
||||||
|
|
||||||
|
#proxyBypassHosts: [
|
||||||
|
# 'web.kaiteki.app',
|
||||||
|
# 'example.com',
|
||||||
|
# '192.0.2.8'
|
||||||
|
#]
|
||||||
|
|
||||||
|
# Proxy for SMTP/SMTPS
|
||||||
|
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
|
||||||
|
#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4
|
||||||
|
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
|
||||||
|
|
||||||
|
# Media Proxy
|
||||||
|
#mediaProxy: https://example.com/proxy
|
||||||
|
|
||||||
|
# Proxy remote files (default: false)
|
||||||
|
#proxyRemoteFiles: true
|
||||||
|
|
||||||
|
# Media cleanup settings (defaults: false, 0, false, false)
|
||||||
|
#mediaCleanup:
|
||||||
|
# cron: true
|
||||||
|
# maxAgeDays: 30
|
||||||
|
# cleanAvatars: false
|
||||||
|
# cleanHeaders: false
|
||||||
|
|
||||||
|
# Status code images
|
||||||
|
#images:
|
||||||
|
# info: '/twemoji/1f440.svg'
|
||||||
|
# notFound: '/twemoji/2049.svg'
|
||||||
|
# error: '/twemoji/1f480.svg'
|
||||||
|
|
||||||
|
# Search engine (MFM)
|
||||||
|
#searchEngine: 'https://duckduckgo.com/?q='
|
||||||
|
|
||||||
|
#allowedPrivateNetworks: [
|
||||||
|
# '127.0.0.1/32'
|
||||||
|
#]
|
||||||
|
|
||||||
|
# TWA
|
||||||
|
#twa:
|
||||||
|
# nameSpace: android_app
|
||||||
|
# packageName: tld.domain.twa
|
||||||
|
# sha256CertFingerprints: ['AB:CD:EF']
|
||||||
|
|
||||||
|
# Upload or download file size limits (bytes)
|
||||||
|
#maxFileSize: 262144000
|
||||||
|
|
||||||
|
# ┌────────────────────────────────┐
|
||||||
|
#───┘ Mastodon client API HTML Cache └──────────────────────────
|
||||||
|
# Caution: rendered post html content is stored in redis (in-memory cache)
|
||||||
|
# for the duration of ttl, so don't set it too high if you have little system memory.
|
||||||
|
#
|
||||||
|
# The prewarm option causes every incoming user/note create/update event to
|
||||||
|
# be rendered so the cache is always "warm". This trades background cpu load for
|
||||||
|
# better request response time and better scaling, as posts won't have to be rendered
|
||||||
|
# on request.
|
||||||
|
#
|
||||||
|
# The dbFallback option stores html data that expires into postgres,
|
||||||
|
# which is more expensive than fetching it from redis,
|
||||||
|
# but cheaper than re-rendering the HTML.
|
||||||
|
|
||||||
|
#htmlCache:
|
||||||
|
# ttl: 1h
|
||||||
|
# prewarm: false
|
||||||
|
# dbFallback: false
|
||||||
|
|
||||||
|
# Duration hard muted notes are stored in redis for.
|
||||||
|
# Increasing this trades higher memory consumption for lower cpu usage on repeated requests within the specified ttl.
|
||||||
|
#wordMuteCache:
|
||||||
|
# ttl: 24h
|
||||||
|
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# Congrats, you've reached the end of the config file needed for most deployments!
|
||||||
|
# Enjoy your Iceshrimp server!
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# Managed hosting settings
|
||||||
|
# >>> NORMAL SELF-HOSTERS, STAY AWAY! <<<
|
||||||
|
# >>> YOU DON'T NEED THIS! <<<
|
||||||
|
# Each category is optional, but if each item in each category is mandatory!
|
||||||
|
# If you mess this up, that's on you, you've been warned...
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
#maxUserSignups: 100
|
||||||
|
#isManagedHosting: true
|
||||||
|
#deepl:
|
||||||
|
# managed: true
|
||||||
|
# authKey: ''
|
||||||
|
# isPro: false
|
||||||
|
#
|
||||||
|
#email:
|
||||||
|
# managed: true
|
||||||
|
# address: 'example@email.com'
|
||||||
|
# host: 'email.com'
|
||||||
|
# port: 587
|
||||||
|
# user: 'example@email.com'
|
||||||
|
# pass: ''
|
||||||
|
# useImplicitSslTls: false
|
||||||
|
#
|
||||||
|
#objectStorage:
|
||||||
|
# managed: true
|
||||||
|
# baseUrl: ''
|
||||||
|
# bucket: ''
|
||||||
|
# prefix: ''
|
||||||
|
# endpoint: ''
|
||||||
|
# region: ''
|
||||||
|
# accessKey: ''
|
||||||
|
# secretKey: ''
|
||||||
|
# useSsl: true
|
||||||
|
# connnectOverProxy: false
|
||||||
|
# setPublicReadOnUpload: true
|
||||||
|
# s3ForcePathStyle: true
|
||||||
|
|
||||||
|
# !!!!!!!!!!
|
||||||
|
# >>>>>> AGAIN, NORMAL SELF-HOSTERS, STAY AWAY! <<<<<<
|
||||||
|
# >>>>>> YOU DON'T NEED THIS, ABOVE SETTINGS ARE FOR MANAGED HOSTING ONLY! <<<<<<
|
||||||
|
# !!!!!!!!!!
|
||||||
|
|
||||||
|
# Seriously. Do NOT fill out the above settings if you're self-hosting.
|
||||||
|
# They're much better off being set from the control panel.
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
replicaCount: 1
|
||||||
|
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 0.5
|
||||||
|
memory: 512Mi
|
||||||
|
limits:
|
||||||
|
cpu: 1
|
||||||
|
memory: 1Gi
|
||||||
|
|
||||||
|
iceshrimp:
|
||||||
|
domain: example.tld
|
||||||
|
smtp:
|
||||||
|
from_address: noreply@example.tld
|
||||||
|
port: 587
|
||||||
|
server: smtp.gmail.com
|
||||||
|
useImplicitSslTls: false
|
||||||
|
login: me@example.tld
|
||||||
|
password: CHANGEME
|
||||||
|
objectStorage:
|
||||||
|
baseUrl: https://example-bucket.nyc3.cdn.digitaloceanspaces.com
|
||||||
|
access_key: CHANGEME
|
||||||
|
access_secret: CHANGEME
|
||||||
|
bucket: example-bucket
|
||||||
|
endpoint: nyc3.digitaloceanspaces.com:443
|
||||||
|
region: nyc3
|
||||||
|
allowedPrivateNetworks: []
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
annotations:
|
||||||
|
cert-manager.io/cluster-issuer: letsencrypt
|
||||||
|
hosts:
|
||||||
|
- host: example.tld
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: ImplementationSpecific
|
||||||
|
tls:
|
||||||
|
- secretName: example-tld-certificate
|
||||||
|
hosts:
|
||||||
|
- example.tld
|
||||||
|
|
||||||
|
elasticsearch:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
postgresql:
|
||||||
|
auth:
|
||||||
|
password: CHANGEME
|
||||||
|
postgresPassword: CHANGEME
|
||||||
|
primary:
|
||||||
|
persistence:
|
||||||
|
enabled: true
|
||||||
|
storageClass: vultr-block-storage
|
||||||
|
size: 25Gi
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 0.25
|
||||||
|
memory: 256Mi
|
||||||
|
limits:
|
||||||
|
cpu: 0.5
|
||||||
|
memory: 512Mi
|
||||||
|
metrics:
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
redis:
|
||||||
|
auth:
|
||||||
|
password: CHANGEME
|
||||||
|
master:
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 0.25
|
||||||
|
memory: 256Mi
|
||||||
|
limits:
|
||||||
|
cpu: 0.5
|
||||||
|
memory: 256Mi
|
||||||
|
persistence:
|
||||||
|
storageclass: vultr-block-storage
|
||||||
|
size: 10Gi
|
||||||
|
replica:
|
||||||
|
replicaCount: 0
|
||||||
|
metrics:
|
||||||
|
enabled: true
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# Visual Studio Code
|
||||||
|
.vscode
|
||||||
|
|
||||||
|
# Intelij-IDEA
|
||||||
|
.idea
|
||||||
|
|
||||||
|
# Node.js
|
||||||
|
node_modules
|
||||||
|
**/node_modules
|
||||||
|
report.*.json
|
||||||
|
|
||||||
|
# Rust
|
||||||
|
packages/backend/native-utils/target
|
||||||
|
|
||||||
|
# Coverage
|
||||||
|
coverage
|
||||||
|
|
||||||
|
# config
|
||||||
|
/.config
|
||||||
|
|
||||||
|
# misskey
|
||||||
|
built
|
||||||
|
db
|
||||||
|
elasticsearch
|
||||||
|
redis
|
||||||
|
npm-debug.log
|
||||||
|
*.pem
|
||||||
|
run.bat
|
||||||
|
api-docs.json
|
||||||
|
*.log
|
||||||
|
*.code-workspace
|
||||||
|
.DS_Store
|
||||||
|
files
|
||||||
|
ormconfig.json
|
||||||
|
packages/backend/assets/instance.css
|
||||||
|
|
||||||
|
# dockerignore custom
|
||||||
|
.git
|
||||||
|
Dockerfile
|
||||||
|
docker-compose.yml
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
charset = utf-8
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
|
[*.yml]
|
||||||
|
indent_style = space
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
if ! has nix_direnv_version || ! nix_direnv_version 2.3.0; then
|
||||||
|
source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.3.0/direnvrc" "sha256-Dmd+j63L84wuzgyjITIfSxSD57Tx7v51DMxVZOsiUD8="
|
||||||
|
fi
|
||||||
|
use flake . --impure
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
# refactor: :art: rome
|
||||||
|
2aab2de38d12f67c65360f7767df7a29bd98c832
|
||||||
|
# chore: rome formatting
|
||||||
|
1309bafb07f91d7ba1f001f647d294139a96ea74
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
*.7z filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.afdesign filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.ai filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.blend filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.BMP filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.bmp filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.doc filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.docx filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.enc filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.flac filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.gif filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.glb filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.gpg filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.gz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.ico filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.jpeg filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.JPEG filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.jpg filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.JPG filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.lockb filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.mkv filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.mov filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.MOV filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.mp3 filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.mp4 filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.MP4 filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.MPG filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.mpg filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.mqo filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.odp filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.ods filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.odt filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.ogg filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.pdf filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.png filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.PNG filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.pptx filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.psd filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.rar filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.svg filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.tar filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.tgz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.wav filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.webm filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.webp filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.woff2 filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.xcf filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.xls filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.xz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.zstd filter=lfs diff=lfs merge=lfs -text
|
||||||
|
group1-shard?of6 filter=lfs diff=lfs merge=lfs -text
|
||||||
+82
@@ -0,0 +1,82 @@
|
|||||||
|
# Visual Studio Code
|
||||||
|
/.vscode/*
|
||||||
|
!/.vscode/extensions.json
|
||||||
|
!/.vscode/settings.dev.json
|
||||||
|
|
||||||
|
# Intelij-IDEA
|
||||||
|
/.idea
|
||||||
|
packages/backend/.idea/backend.iml
|
||||||
|
packages/backend/.idea/modules.xml
|
||||||
|
packages/backend/.idea/vcs.xml
|
||||||
|
|
||||||
|
# Node.js
|
||||||
|
node_modules
|
||||||
|
report.*.json
|
||||||
|
|
||||||
|
# Coverage
|
||||||
|
coverage
|
||||||
|
|
||||||
|
# config
|
||||||
|
/.config/*
|
||||||
|
!/.config/example.yml
|
||||||
|
!/.config/example-docker.yml
|
||||||
|
!/.config/devenv.yml
|
||||||
|
!/.config/docker_example.env
|
||||||
|
!/.config/helm_values_example.yml
|
||||||
|
!/.config/LICENSE
|
||||||
|
|
||||||
|
# docker configs
|
||||||
|
/dev/docker-compose.yml
|
||||||
|
/docker-compose.yml
|
||||||
|
|
||||||
|
# misskey
|
||||||
|
built
|
||||||
|
elasticsearch
|
||||||
|
redis
|
||||||
|
meili_data
|
||||||
|
sonic
|
||||||
|
dragonflydb
|
||||||
|
keydb
|
||||||
|
redis_cache
|
||||||
|
npm-debug.log
|
||||||
|
*.pem
|
||||||
|
run.bat
|
||||||
|
api-docs.json
|
||||||
|
*.log
|
||||||
|
*.code-workspace
|
||||||
|
.DS_Store
|
||||||
|
files
|
||||||
|
ormconfig.json
|
||||||
|
packages/backend/assets/instance.css
|
||||||
|
packages/backend/assets/sounds/None.mp3
|
||||||
|
packages/backend/assets/LICENSE
|
||||||
|
|
||||||
|
!/packages/backend/queue/processors/db
|
||||||
|
!packages/backend/src/db
|
||||||
|
|
||||||
|
# blender backups
|
||||||
|
*.blend1
|
||||||
|
*.blend2
|
||||||
|
*.blend3
|
||||||
|
*.blend4
|
||||||
|
*.blend5
|
||||||
|
|
||||||
|
#old pnpm
|
||||||
|
pnpm*
|
||||||
|
|
||||||
|
.yarn/*
|
||||||
|
!.yarn/cache
|
||||||
|
!.yarn/patches
|
||||||
|
!.yarn/plugins
|
||||||
|
!.yarn/releases
|
||||||
|
!.yarn/sdks
|
||||||
|
!.yarn/versions
|
||||||
|
!.yarn/corepack.tgz
|
||||||
|
|
||||||
|
# Nix Development shell items
|
||||||
|
.devenv
|
||||||
|
.direnv
|
||||||
|
|
||||||
|
# helm chart dependencies
|
||||||
|
chart/charts
|
||||||
|
chart/Chart.lock
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "assets/branding"]
|
||||||
|
path = assets/branding
|
||||||
|
url = https://iceshrimp.dev/iceshrimp/branding.git
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
v22.22.2
|
||||||
Generated
+2129
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json.schemastore.org/vsls",
|
||||||
|
"gitignore": "exclude"
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[weblate]
|
||||||
|
url = https://hosted.weblate.org/api/
|
||||||
|
translation = iceshrimp/locales
|
||||||
+52
@@ -0,0 +1,52 @@
|
|||||||
|
approvedGitRepositories:
|
||||||
|
- "**"
|
||||||
|
|
||||||
|
compressionLevel: mixed
|
||||||
|
|
||||||
|
enableGlobalCache: false
|
||||||
|
|
||||||
|
enableScripts: true
|
||||||
|
|
||||||
|
enableTelemetry: false
|
||||||
|
|
||||||
|
nodeLinker: pnp
|
||||||
|
|
||||||
|
npmMinimalAgeGate: 1w
|
||||||
|
|
||||||
|
npmScopes:
|
||||||
|
iceshrimp:
|
||||||
|
npmRegistryServer: "https://iceshrimp.dev/api/packages/iceshrimp/npm/"
|
||||||
|
|
||||||
|
packageExtensions:
|
||||||
|
consolidate@^0.16.0:
|
||||||
|
dependencies:
|
||||||
|
ejs: ^3.1.7
|
||||||
|
pug: 3.0.2
|
||||||
|
debug@*:
|
||||||
|
dependencies:
|
||||||
|
supports-color: ^8.0.0
|
||||||
|
fix-esm@1.0.1:
|
||||||
|
dependencies:
|
||||||
|
multer: 1.4.4-lts.1
|
||||||
|
node-fetch@2.6.12:
|
||||||
|
dependencies:
|
||||||
|
encoding: ^0.1.13
|
||||||
|
ws@8.13.0:
|
||||||
|
dependencies:
|
||||||
|
bufferutil: ^4.0.1
|
||||||
|
|
||||||
|
pnpMode: strict
|
||||||
|
|
||||||
|
supportedArchitectures:
|
||||||
|
cpu:
|
||||||
|
- current
|
||||||
|
- x64
|
||||||
|
- arm64
|
||||||
|
libc:
|
||||||
|
- current
|
||||||
|
- glibc
|
||||||
|
- musl
|
||||||
|
os:
|
||||||
|
- current
|
||||||
|
- darwin
|
||||||
|
- linux
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# We test our Mastodon-compatible API against the following clients:
|
||||||
|
## Web
|
||||||
|
- [Elk](https://elk.zone)
|
||||||
|
- [Phanpy](https://phanpy.social/)
|
||||||
|
- [Enafore](https://enafore.social/)
|
||||||
|
- [Masto-FE-standalone](https://iceshrimp.dev/iceshrimp/masto-fe-standalone)
|
||||||
|
|
||||||
|
## iOS
|
||||||
|
- [Mona](https://apps.apple.com/us/app/mona-for-mastodon/id1659154653)
|
||||||
|
- [Toot!](https://apps.apple.com/us/app/toot-for-mastodon/id1229021451)
|
||||||
|
- [Ice Cubes](https://apps.apple.com/us/app/ice-cubes-for-mastodon/id6444915884)
|
||||||
|
- [Tusker](https://apps.apple.com/us/app/tusker/id1498334597)
|
||||||
|
- [Feditext](https://github.com/feditext/feditext)
|
||||||
|
- [Mastodon](https://apps.apple.com/us/app/mastodon-for-iphone-and-ipad/id1571998974)
|
||||||
|
|
||||||
|
## Android
|
||||||
|
- [Tusky](https://tusky.app/)
|
||||||
|
- [Moshidon](https://lucasggamerm.github.io/moshidon/)
|
||||||
|
- [Megalodon](https://sk22.github.io/megalodon/)
|
||||||
|
- [Mastodon](https://play.google.com/store/apps/details?id=org.joinmastodon.android)
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
`yarn full:backup`
|
||||||
|
`yarn full:restore <backup.tar.gz>`
|
||||||
|
既存互換で `yarn db:backup` / `yarn db:restore` も同じ処理
|
||||||
+927
@@ -0,0 +1,927 @@
|
|||||||
|
## v2026.5.1
|
||||||
|
This release contains several critical security patches, as well as minor fixes and improvements. Upgrading is strongly recommended for all server operators.
|
||||||
|
|
||||||
|
### Security
|
||||||
|
- Fixed signature bypass with certain keywords (reported by Mastodon)
|
||||||
|
- Fixed signature bypass with improper algorithm ordering
|
||||||
|
- Fixed XSS in emoji autocompleter
|
||||||
|
- Disabled hashtag channel
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- Fixed service worker not properly loading
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: mia
|
||||||
|
|
||||||
|
Furthermore, I want to give special thanks to Mastodon for the vulnerability disclosure.
|
||||||
|
|
||||||
|
## v2026.4.2
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- Fixed quote authorization stripping post metadata
|
||||||
|
|
||||||
|
### Client
|
||||||
|
- Fixed broken navigation when "automatically reload when losing connection to the server" is enabled
|
||||||
|
- Hid voting options for logged out users
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- Build system has been rewritten
|
||||||
|
- Dependencies have been updated
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: mia
|
||||||
|
|
||||||
|
## v2026.4.1
|
||||||
|
This release contains multiple new features and bug fixes. Due to this release including database migrations, you will not be able to migrate from this version to Iceshrimp.NET until their migration script is updated.
|
||||||
|
|
||||||
|
### Highlights
|
||||||
|
- Biting has been added
|
||||||
|
- You can bite users, notes, and bites
|
||||||
|
- You can control who is allowed to bite you
|
||||||
|
- Pronouns now have a dedicated field (only compatible with Iceshrimp.NET)
|
||||||
|
- Quotes now are compatible with Mastodon (FEP-044f)
|
||||||
|
- Users on Mastodon can quote your post and it will show up properly on their side
|
||||||
|
- You can quote users on Mastodon and it will show up properly on their side
|
||||||
|
- Unicode emojis up to version 16 are now supported
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- Node.js v25 is now supported
|
||||||
|
- The offline page has been removed
|
||||||
|
- Authentication is now required to pull defederation data
|
||||||
|
- Usernames with periods in them are now pingable
|
||||||
|
- Poll refreshing should be more reliable
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: AntoineÐ, banaanihillo, mia, nebby& & yukijoou
|
||||||
|
|
||||||
|
## v2023.12.14
|
||||||
|
This release contains a critical security patch, as well as several lower severity security patches. Upgrading is strongly recommended for all server operators.
|
||||||
|
|
||||||
|
### Highlights
|
||||||
|
- A XSS vulnerability related to parsing of relative URLs has been fixed
|
||||||
|
- Media URLs are now always proxied, no matter the protocol in use
|
||||||
|
- AiScript endpoints are now validated more strictly
|
||||||
|
- Negative values for MFM scale nodes are now clamped
|
||||||
|
- Profile fields are now rendered as HTML for federation
|
||||||
|
- Summaly has been updated, resolving a SSRF vulnerability
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: Laura Hausmann
|
||||||
|
|
||||||
|
It also includes cherry-picked contributions from external contributors: dakkar (sharkey)
|
||||||
|
|
||||||
|
Furthermore, I want to give special thanks to Hazel Koehler for the vulnerability disclosure.
|
||||||
|
|
||||||
|
## v2023.12.13
|
||||||
|
This release is identical to v2023.12.12, but no longer incorrectly identifies its version as v2023.12.11.
|
||||||
|
|
||||||
|
## v2023.12.12
|
||||||
|
This release contains a critical security patch, as well as minor fixes and improvements. Upgrading is strongly recommended for all server operators.
|
||||||
|
|
||||||
|
### Highlights
|
||||||
|
- An unauthenticated SQL injection vulnerability inherited from calckey/firefish has been patched
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- Negated searches now work with match:words
|
||||||
|
- The poll.votes option has been removed from the note edit service
|
||||||
|
- Edits that try to add or remove polls from existing notes now get rejected
|
||||||
|
- Emoji are now extracted from profile fields
|
||||||
|
- Blurhash failures are now handled gracefully
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- Dependencies have been updated
|
||||||
|
- CI workflows have been updated
|
||||||
|
- Translations have been updated
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: Fynh, Laura Hausmann, mia, sugar & zenja
|
||||||
|
|
||||||
|
Furthermore, I want to give special thanks to Natty for the vulnerability disclosure.
|
||||||
|
|
||||||
|
## v2023.12.11
|
||||||
|
This release contains several critical security patches, as well as minor fixes and improvements. Upgrading is strongly recommended for all server operators.
|
||||||
|
|
||||||
|
### Highlights
|
||||||
|
- Several DoS, impersonation, data leakage & click jacking vulnerabilities have been patched
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- Various issues related to AP object validation have been resolved
|
||||||
|
- The ap/get API endpoint is now only available to administrators
|
||||||
|
- Blocks are now enforced in NoteRepository.isVisibleForMe
|
||||||
|
- Audience parsing no longer bypasses the AP recursion limit
|
||||||
|
- Edits of local-only notes are no longer federated out
|
||||||
|
- AP object URIs now get canonicalized before comparing them for consistency
|
||||||
|
- SSRF prevention now applies to all code paths
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: Kopper & Laura Hausmann
|
||||||
|
|
||||||
|
Furthermore, I want to give special thanks to Hazel Koehler for the vulnerability disclosure.
|
||||||
|
|
||||||
|
## v2023.12.10
|
||||||
|
This release contains a critical security patch, as well as minor fixes and improvements. Upgrading is strongly recommended for all server operators.
|
||||||
|
|
||||||
|
### Highlights
|
||||||
|
- A DoS / DDoS / request amplification vulnerability has been patched
|
||||||
|
- Follower-only pinned notes are now fetched correctly
|
||||||
|
- Prometheus metrics support has been added
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- Follower-only polls now update correctly
|
||||||
|
- The job queue was migrated to BullMQ (from the legacy Bull)
|
||||||
|
- Redis now uses the correct prefix for subscribe/notify
|
||||||
|
- HTTP 429 errors are now treated as retryable
|
||||||
|
|
||||||
|
### Frontend
|
||||||
|
- The emoji picker now supports searching for emoji with uppercase letters
|
||||||
|
- Inline replies now render correctly on Chrome version >= 130
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- The Firefish migration guide was updated
|
||||||
|
- The README was updated
|
||||||
|
- Yarn telemetry has been disabled
|
||||||
|
- Various Dockerfile changes
|
||||||
|
- Various translation updates
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: AverageDood, Laura Hausmann, Mae Dartmann, SWREI, ltlapy, mia, morotesovtannu & sugar
|
||||||
|
|
||||||
|
## 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
|
||||||
|
This is a security release. Upgrading is therefore strongly recommended.
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- Incoming LD-signed activities are now compacted against a well-known context to defend against spoofing attacks
|
||||||
|
- The automatically followed account property no longer gets set to a random (possibly non-local) user on instance settings updates
|
||||||
|
- The TypeORM logger is now much more configurable
|
||||||
|
- The bull dashboard now has the correct cache-control headers set
|
||||||
|
|
||||||
|
### Mastodon client API
|
||||||
|
- The quote_id property is now returned for note responses
|
||||||
|
- The note search query now sets the userId property correctly, solving the problem of mismatching search results between the web client and the Mastodon client API
|
||||||
|
- The user profile html cache now gets updated and queried using the correct timestamp for local users, resolving an issue of stale data being displayed in some circumstances
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- The yarn version was updated to 4.1.1
|
||||||
|
- The Dockerfile was updated to work better with some build systems that don't support cp -Tr
|
||||||
|
- The helm chart now has an option to set the number of worker threads
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: Ezeani Emmanuel, Laura Hausmann, Mae Dartmann & mei23
|
||||||
|
|
||||||
|
Furthermore, I want to give special thanks to tesaguri for the security disclosure.
|
||||||
|
|
||||||
|
## v2023.12.6
|
||||||
|
This is a security release. Upgrading is therefore strongly recommended.
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- When fetching activities, their identifiers are now validated much more strictly
|
||||||
|
- Drive files now have the `X-Content-Type-Options` header set to `nosniff`
|
||||||
|
- The queue dashboard path is now validated more strictly
|
||||||
|
- The AP object resolver logic was improved to better handle edge cases
|
||||||
|
- Poll notifications are no longer generated for muted notes
|
||||||
|
|
||||||
|
### Frontend
|
||||||
|
- Remote (cross-origin) videos now plays properly
|
||||||
|
- Emoji reactions on the landing page timeline preview are now aligned properly
|
||||||
|
|
||||||
|
### Mastodon client API
|
||||||
|
- The default reaction is now returned with /v1/instance
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- The podman documentation was improved
|
||||||
|
- The example nginx config now has gzip enabled
|
||||||
|
- The Dockerfile now references the required dependencies for decoding AVIF images
|
||||||
|
- The installation requirements now mention postgresql-contrib
|
||||||
|
- Various translation updates
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: CookiLover311, Crimekillz, Jegler, Laura Hausmann, Lilian, Norm, Salif Mehmed, jeder, konkonkon, naskya & 老周部落
|
||||||
|
|
||||||
|
Furthermore, I want to give special thanks to Oneric for the extraordinarily detailed security disclosure.
|
||||||
|
|
||||||
|
## v2023.12.5
|
||||||
|
This is a followup security release. Upgrading is recommended.
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- When fetching activities, the JSON-LD profile is now enforced for responses with application/ld+json content type
|
||||||
|
- Incoming note edits with attachment and no alt text no longer get silently dropped
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: Laura Hausmann
|
||||||
|
|
||||||
|
## v2023.12.4
|
||||||
|
This is a security release. Upgrading is therefore strongly recommended.
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- The content type of fetched activities is now enforced
|
||||||
|
- Fetched activities' IDs must now match the hostname of the final request URL (after redirects)
|
||||||
|
- A typo in the activity audience parser was fixed, fixing federation of public posts with JSON-LD compliant remote instances
|
||||||
|
|
||||||
|
### Mastodon client API
|
||||||
|
- The quote_id parameter is now supported when creating new posts
|
||||||
|
- The /v2/suggestions endpoint now requires the same scope as Mastodon (which differs from their API documentation)
|
||||||
|
- Full OAuth scopes (read/write/follow) are now also registered when expanding the authorized scopes list
|
||||||
|
|
||||||
|
### Frontend
|
||||||
|
- Migrating from/to the same account twice no longer breaks the migration page
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- The packaged yarn version (for NixOS) was updated to 4.1.0
|
||||||
|
- Various translation updates
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: Laura Hausmann, Pyrox & tournesol
|
||||||
|
|
||||||
|
## v2023.12.3
|
||||||
|
### Release notes
|
||||||
|
This is a security release. Upgrading is strongly recommended, as is adding an instance-wide announcement informing your users that if they previously imported posts from Mastodon, they should check their imported post history for DMs and follower-only posts that should not be public.
|
||||||
|
|
||||||
|
### Vulnerability explanation
|
||||||
|
The Mastodon post import feature (that has been untouched since Iceshrimp was forked from Firefish last year) did not correctly validate/set post visibility on imported posts. Due to the nature of the vulnerability, it's impossible to reconstruct which posts have been imported, and therefore we cannot restrict access to them in an update.
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- Post imports have been disabled
|
||||||
|
- Existing posts that have the "hidden" visibility are now only accessible to the author
|
||||||
|
|
||||||
|
### Frontend
|
||||||
|
- The UI for post imports has been removed
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- The yarn version was updated to 4.1.0
|
||||||
|
- The helm chart was updated
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: Laura Hausmann & corite
|
||||||
|
|
||||||
|
## v2023.12.2
|
||||||
|
### Release notes
|
||||||
|
This release contains minor fixes and improvements. Upgrading is recommended, especially if you have a lot of delayed jobs in your deliver queue.
|
||||||
|
|
||||||
|
### Highlights
|
||||||
|
- Deliver jobs to dead/unresponsive instances will no longer get stuck in the deliver queue after 7 days of them being unresponsive
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- Emojis that contain special characters now work properly
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- Podman installation docs have been added
|
||||||
|
- The helm chart has been updated
|
||||||
|
- Locale files that were named incorrectly have been fixed
|
||||||
|
- Various translation updates
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: Daks, Jeder, Laura Hausmann, Salif Mehmed, corite & jolupa
|
||||||
|
|
||||||
|
It also includes cherry-picked contributions from external contributors: Johann150
|
||||||
|
|
||||||
|
## v2023.12.1
|
||||||
|
### Release notes
|
||||||
|
This release contains performance improvements and minor bugfixes. Upgrading is recommended, especially if you are still experiencing performance issues with notifications and/or the home timeline.
|
||||||
|
|
||||||
|
### Highlights
|
||||||
|
- Performance issues with the home timeline heuristics query as well as the notifications query have been resolved
|
||||||
|
|
||||||
|
### UI/UX
|
||||||
|
- A bug in which an extra colon was shown at the end of some notifications has been resolved
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: Laura Hausmann & mia
|
||||||
|
|
||||||
|
## v2023.12
|
||||||
|
### Release notes
|
||||||
|
This release contains only very minor changes if you're upgrading from `v2023.12-pre4`, but for users who skipped the prereleases, lots has changed. We primarily spent this release cycle on improving performance, we hope you enjoy a snappier experience!
|
||||||
|
|
||||||
|
The information below is an *aggregate* of all release highlights since the last stable release.
|
||||||
|
|
||||||
|
### Highlights
|
||||||
|
- Reworked full text search, retiring Meili/Sonic/Elastic in favor of Postgres gin_trgm with advanced search filter support
|
||||||
|
- Significantly improved backend & API performance across the board
|
||||||
|
- A HTML cache was added to the Mastodon client API, drastically improving performance (check the example config for more details & configuration options)
|
||||||
|
- Word mute filters were completely reworked for better performance, especially at scale
|
||||||
|
- A couple Mastodon OAuth regressions were fixed
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- Unnecessary table joins were removed for the i/notifications API endpoint, improving performance
|
||||||
|
|
||||||
|
### UI/UX
|
||||||
|
- The pages and gallery tab navigation was fixed
|
||||||
|
- The center and small MFM tags now autocomplete properly
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- The documentation on creating a database during the install process was improved
|
||||||
|
- Dependencies were updated and deduplicated, saving disk space
|
||||||
|
- Migration docs for Firefish were added
|
||||||
|
- JetBrains AI was disabled globally in the monorepo
|
||||||
|
- Various translation updates
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: AntoineÐ, AverageDood, Jeder, Laura Hausmann, Pyrox, Salif Mehmed & Tournesol
|
||||||
|
|
||||||
|
## v2023.12-pre4
|
||||||
|
This release preview primarily fixes bugs & regressions. Note: If you are upgrading from `-pre3` and had the HTML cache prewarm functionality enabled, you might want to clear it (`DELETE FROM "html_note_cache_entry";`), as quote URLs were not stored correctly due to an oversight.
|
||||||
|
|
||||||
|
### Mastodon client API
|
||||||
|
- The html cache prewarm functionality now correctly includes quote URLs
|
||||||
|
- Follow status indicators now work properly in apps that rely on an undocumented Mastodon API behavior (e.g. toot!)
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- Relative URLs are no longer proxied, fixing the local instance icon indicator in the default configuration
|
||||||
|
|
||||||
|
### UI/UX
|
||||||
|
- The update check in the admin panel now works as expected
|
||||||
|
- Toggles now have outlines for better visibility
|
||||||
|
- The client error screen was improved with new colors and icons
|
||||||
|
- The Twitter integration was removed, as it hasn't been functional since their API changes
|
||||||
|
- The apps help button now links to a new page in the repository ([APPS.md](https://iceshrimp.dev/iceshrimp/iceshrimp/src/branch/dev/APPS.md))
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- The biome code formatter version and configuration were updated
|
||||||
|
- Various translation updates
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: AntoineÐ, AverageDood, Froggo, Laura Hausmann, Minybol & Pyrox
|
||||||
|
|
||||||
|
## v2023.12-pre3
|
||||||
|
This release preview primarily contains performance optimizations and regression fixes. Upgrading is recommended especially if you're running a big instance or have more than a couple thousand entries in the `muted_note` table.
|
||||||
|
|
||||||
|
### Highlights
|
||||||
|
- A HTML cache was added to the Mastodon client API, drastically improving performance (check the example config for more details & configuration options)
|
||||||
|
- Word mute filters were completely reworked for better performance, especially at scale
|
||||||
|
- A couple Mastodon OAuth regressions were fixed
|
||||||
|
|
||||||
|
### Mastodon client API
|
||||||
|
- Notes that were filtered out due to hard word mutes are now returned to clients with the FilterResult property instead of being silently dropped
|
||||||
|
- Login with clients that leave a trailing `+` character in the scope parameter has been fixed
|
||||||
|
- Login with clients that depend on the `state` parameter in the OAuth process has been fixed
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- updateUserProfileData now only triggers updateMentions once
|
||||||
|
- Word mute data is now stored in redis instead of the database, significantly improving timeline query performance for larger instances
|
||||||
|
- Database columns containing hostnames had their length increased to accomodate longer domain names
|
||||||
|
|
||||||
|
### UI/UX
|
||||||
|
- Copy to clipboard now uses the modern async clipboard API and no longer applies weird formatting to copied text
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- Various translation updates
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: AverageDood, Laura Hausmann & Pyrox
|
||||||
|
|
||||||
|
## v2023.12-pre2
|
||||||
|
This release contains an important security fix. Upgrading is therefore strongly recommended. If you are on or want to upgrade to a stable release, please refer to the stable backport release [v2023.11.4](https://iceshrimp.dev/iceshrimp/iceshrimp/releases/tag/v2023.11.4) instead.
|
||||||
|
|
||||||
|
### Added features
|
||||||
|
- A new setting was added that allows admins to specify an account that's automatically followed on user registration
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
- HTTP signatures are now properly validated everywhere
|
||||||
|
|
||||||
|
### UI/UX
|
||||||
|
- The gradient angles were adjusted to be in line with the design guidelines
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: AntoineÐ, Latte macchiato & Laura Hausmann
|
||||||
|
|
||||||
|
It also includes cherry-picked contributions from external contributors: perillamint, yunochi
|
||||||
|
|
||||||
|
## v2023.12-pre1
|
||||||
|
It's been a while, but it's time for another prerelease. This release cycle is going to primarily focus on performance, both in the backend and the frontend.
|
||||||
|
|
||||||
|
Note: This release preview includes a lot of expensive migrations, which may take a while to run. We promise the performance benefits are worth the wait.
|
||||||
|
|
||||||
|
### Highlights
|
||||||
|
- Reworked full text search, retiring Meili/Sonic/Elastic in favor of Postgres gin_trgm with advanced search filter support
|
||||||
|
- Significantly improved backend & API performance across the board
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- Support for external search backends was removed
|
||||||
|
- Support for advanced search filters was added to the Postgres search backend
|
||||||
|
- The `search-by-username-and-host` API endpoint no longer excludes the local user making the request
|
||||||
|
- Renote status is now aggregated and returned with timeline responses instead of the client requesting it for each note individually
|
||||||
|
- Heuristics for which timeline query to use for each user were added, drastically improving worst case timeline performance
|
||||||
|
- Timeline queries were streamlined for improved performance, adding new multi-column indicies as appropriate
|
||||||
|
- User avatar and banner URL & blurhash were duplicated into the user table, drastically improving query performance by saving up to 6 joins per query
|
||||||
|
- The media proxy was reworked to not require a database query per requested file
|
||||||
|
- A per-request packed user cache was added to the web API to improve performance, mimicking the existing Mastodon client API implementation
|
||||||
|
- The web API now only fetches exactly as many notes as have been requested
|
||||||
|
- The `re2` dependency was updated, fixing builds on NixOS
|
||||||
|
- Environment variables that allow setting alternative locations for the config file, a second config file for secrets, the custom directory as well as the media directory were added
|
||||||
|
- The `followRequestAccepted` notification is no longer emitted for non-locked accounts
|
||||||
|
- The mfm-to-html renderer for outgoing ActivityPub messages was changed to happy-dom
|
||||||
|
|
||||||
|
### Mastodon client API
|
||||||
|
- Search now also supports filters, using the same syntax as the web client
|
||||||
|
- NoteConverter and UserConverter now pre-aggregate applicable data in their respective `encodeMany` functions for improved performance
|
||||||
|
- The `user` column is now joined where applicable for improved performance
|
||||||
|
- The mfm-to-html renderer was changed to happy-dom, drastically improving timeline performance
|
||||||
|
|
||||||
|
### UI/UX
|
||||||
|
- The search dialog was replaced with a proper search page, and now supports additional search filters
|
||||||
|
- A help page containing a list of all available search filters was added
|
||||||
|
- All references to post indexing were removed, as manual indexing is no longer required
|
||||||
|
- The search filter button is no longer visible in guest mode
|
||||||
|
- Inactive search tabs are no longer loaded
|
||||||
|
- Overscroll was disabled due to it causing graphical glitches and weird behavior, especially on desktop
|
||||||
|
- All images in timeline views now have the `loading="lazy"` and `decoding="async"` attributes set
|
||||||
|
- The URL card animation has been removed
|
||||||
|
- Additional posts are now loaded in before reaching the bottom of the timeline
|
||||||
|
- VueJS and Vite were updated to their respective latest versions
|
||||||
|
|
||||||
|
### Infrastructure and governance
|
||||||
|
- Docker builds with populated BuildKit caches no longer break if the yarn cache changes
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- References to external search backends were removed from the documentation & example configuration files
|
||||||
|
- The installation docs now contain information on the available environment variables
|
||||||
|
- The project readme was updated
|
||||||
|
- All project imports of the deprecated punycode node module were switched over to the punycode.js replacement
|
||||||
|
- Various translation updates
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: AntoineÐ & Laura Hausmann
|
||||||
|
|
||||||
|
## v2023.11.3
|
||||||
|
This release contains yet more packaging and distribution-related changes, including some required for packaging the project for NixOS.
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- The backslash character is now correctly escaped in `sqlLikeEscape`, fixing search queries containing backslashes
|
||||||
|
|
||||||
|
### Infrastructure and governance
|
||||||
|
- The Dockerfile was streamlined and now builds the project with an immutable lockfile in the first stage
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- The `focus-production` yarn script now also updates `.yarnrc.yml`, fixing builds in some packaging environments
|
||||||
|
- The default locale was changed to `en-US`, which should fix translation-related UI issues
|
||||||
|
- A new yarn script - `pack-yarn` - was added to assist with packaging the project on NixOS
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: Jeder, Laura Hausmann & Pyrox
|
||||||
|
|
||||||
|
## v2023.11.2
|
||||||
|
This release primarily contains project maintenance changes. For the first time, we are also distributing binary packages! Currently we support Arch Linux, DEB & RPM based distributions will follow.
|
||||||
|
|
||||||
|
### Highlights
|
||||||
|
- Lots of yarn script tweaks and additions, allowing for easier packaging and distribution
|
||||||
|
- Significantly reduced size of container images
|
||||||
|
- Binary packages for Arch Linux (DEB/RPM support to follow)
|
||||||
|
|
||||||
|
### UI/UX
|
||||||
|
- The local-only icon is now consistent across different parts of the UI
|
||||||
|
- The `/about-iceshrimp` page was tweaked
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- Running `yarn workspace backend run migration:revert` now exits properly instead of stalling
|
||||||
|
- Enabling 2FA when the instance is in private mode no longer locks users out of their account
|
||||||
|
- A typo in the name of the scope parameter for the `/oauth/token` endpoint was fixed
|
||||||
|
- The `/oauth/token` endpoint is now strictly compliant with the Mastodon API specification (note: their documentation does not match their implementation)
|
||||||
|
|
||||||
|
### Infrastructure and governance
|
||||||
|
- Built Docker images now only contain runtime dependencies, decreasing image size significantly
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- Yarn is now using the strict PnP mode, all peer dependencies that are broken upstream were patched
|
||||||
|
- A new yarn script, `focus-production`, was added. Running it will remove all dependencies that are not needed after building the project. Caution: only use for packaging, as this rewrites all `package.json` files in the project directory.
|
||||||
|
- A new yarn script, `regen-version`, was added. Running it will set the `version` attribute of the main `package.json` to `${tag}-dev-${git_revision}`.
|
||||||
|
- The installation documentation was updated
|
||||||
|
- Git LFS disclaimers were added to the documentation
|
||||||
|
- Yarn was updated to v4.0.2
|
||||||
|
- Dependencies using `node-gyp` now build with all available threads
|
||||||
|
- The nix flake was updated to work properly with all recent changes
|
||||||
|
- The documentation no longer recommends git clones with `--depth=1` for most deployment types, as this is not really necessary anymore due to git-lfs
|
||||||
|
- Patches were merged into upstream `re2` and their `install-artifact-from-github` dependency, both fixing build on arm64-musl, and allowing for much faster prebuilt artifact installs
|
||||||
|
- The yarn script `dev` now only builds the project once
|
||||||
|
- The nix development documentation was updated
|
||||||
|
- The README badges were updated
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: Alexis, AntoineÐ, Laura Hausmann & Pyrox
|
||||||
|
|
||||||
|
## v2023.11.1
|
||||||
|
### Release notes
|
||||||
|
This release primarily adds polish and fixes bugs and regressions introduced in the previous release cycle. If you are running `v2023.11` or earlier, upgrading is strongly recommended.
|
||||||
|
|
||||||
|
### Highlights
|
||||||
|
- Builds on docker-arm64 (and on bare metal musl-arm64 distros) work as expected again
|
||||||
|
- Improved OAuth login page
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
- The `node-re2` dependency was migrated to an in-house fork, fixing builds on musl-arm64
|
||||||
|
- Tags in edited posts are now handled correctly
|
||||||
|
- Poll are now federating properly to non-\*key instances again
|
||||||
|
- Hovering over a link no longer renders a duplicate popover
|
||||||
|
- Various client settings that were previously missing from preference backups are now included
|
||||||
|
- Incoming poll edits are now processed correctly
|
||||||
|
|
||||||
|
### UI/UX
|
||||||
|
- The "Centered" layout was removed
|
||||||
|
- The layout dropdown was replaced with a "toggle layout" button
|
||||||
|
- The "Modern" CW style now has the visual buttons match the clickable area
|
||||||
|
- The OAuth login page has been fully reworked to only show essential information
|
||||||
|
- Tooltips are no longer shown on touchscreen input
|
||||||
|
- The icon for "mark all notifications as read" was changed to `ph-checks` to better reflect the action
|
||||||
|
- A new client preferences category, "Wellness", was added, currently containing the option to hide certain UI elements like the new posts indicator, with more to come
|
||||||
|
|
||||||
|
### Mastodon client API
|
||||||
|
- A regression in which remote posts with quotes attached had the quoteUri duplicated was fixed
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- Local only notes are now not shown to guest users in timeline/non-detail views either
|
||||||
|
- Channels are no longer visible to guests
|
||||||
|
- User bios with MFM now federate properly with other \*key instances implementing the \_misskey_summary field
|
||||||
|
- The separate cache server was merged back into a unified (cache + queue processor) redis architecture, the respective config fields have been removed
|
||||||
|
|
||||||
|
### Infrastructure and governance
|
||||||
|
- The CI workflows no longer reference cargo/rust
|
||||||
|
- Docker builds now use the yarn version specified in `package.json` instead of `yarn@stable`
|
||||||
|
- The README was updated to better reflect the project values
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- The code formatter was changed from `rome` to `biome`
|
||||||
|
- The "Twitter (soon)" option for post imports has been removed
|
||||||
|
- The documentation now contains information on possible conflicts between the corepack and system yarn installations
|
||||||
|
- Various translation updates
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: AntoineÐ, Aylam & Laura Hausmann
|
||||||
|
|
||||||
|
It also includes cherry-picked contributions from external contributors: kakkokari-gtyih
|
||||||
|
|
||||||
|
## v2023.11
|
||||||
|
### Release notes
|
||||||
|
This release contains only very minor changes if you're upgrading from `v2023.11-pre5`, but for users who skipped the prereleases, lots has changed. Be sure to read the changelogs of all releases between the one you're upgrading from and this one, especially the sections on breaking changes.
|
||||||
|
|
||||||
|
The information below is an *aggregate* of all breaking changes and release highlights since the last stable release.
|
||||||
|
|
||||||
|
### Breaking changes
|
||||||
|
- Lists have been reworked, now only allowing followed users to be added, and support for proxy accounts has been removed. To allow users to follow any users they want to keep on their lists, the migration that removes all list members users are not following will only be activated in the release **after** the next stable release. It is therefore highly recommended to add an instance announcement informing your users of this change and advising them to follow any affected accounts and to use the new "hide from home timeline" list option if desired.
|
||||||
|
- The Mastodon client API now uses the same object identifiers as the Misskey API, as well as its own, separate OAuth backend. This means all existing sessions are now invalid. Please log out and back in again in your clients.
|
||||||
|
|
||||||
|
### Highlights
|
||||||
|
- The Mastodon client API backend underwent a full rewrite, dropping megalodon as a dependency. Expect:
|
||||||
|
+ Rich text formatting (mentions, links, hashtags, etc. are now properly formatted)
|
||||||
|
+ Significantly improved API responsiveness - performance was improved by a factor of 2-5x (or more!) depending on the endpoint
|
||||||
|
+ Better spec compliance & improved compatibility (we test against: Mona, toot!, Ice Cubes, Tusker, Feditext, Mastodon for iOS, Mastodon for Android/Megalodon/Moshidon, Tusky, Elk, Phanpy, Pinafore/Semaphore/Enafore and more)
|
||||||
|
- The Mastodon client API now supports the websocket streaming API
|
||||||
|
- Various bugs in the HTTP Link header pagination implementation were fixed
|
||||||
|
- The Mastodon client API now uses OAuth instead of MiAuth
|
||||||
|
- ActivityPub object lookups now respect redirects
|
||||||
|
- Significantly improved handling of mentions, both in outgoing AP messages and in the Mastodon client API
|
||||||
|
- Various Mastodon client API regressions are now fixed, improving client compatibility
|
||||||
|
- HTTP Signature validation error handling has been improved
|
||||||
|
- The project is now compatible with NodeJS >= 18.6 (tested against v21.1.0 at time of writing)
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- The project is now compatible with NodeJS v21, tested against v21.1.0 at time of writing
|
||||||
|
- The nix dev environment was updated
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: AntoineÐ, Aylam, Erin Shepherd, jeder, Laura Hausmann & Pyrox
|
||||||
|
|
||||||
|
It also includes cherry-picked contributions from external contributors: Johann150
|
||||||
|
|
||||||
|
## v2023.11-pre5
|
||||||
|
### Release notes
|
||||||
|
This release fixes a regression introduced in the last release preview. If you are running `v2023.11-pre3` or `v2023.11-pre4`, upgrading is strongly recommended.
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- The commit that removed the `Mk` prefix from VueJS components has been reverted, as it caused various UI issues
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: Laura Hausmann
|
||||||
|
|
||||||
|
## v2023.11-pre4
|
||||||
|
### Release notes
|
||||||
|
This release mostly fixes regressions introduced in the last release preview. If you are running `v2023.11-pre3`, upgrading is strongly recommended.
|
||||||
|
|
||||||
|
### Mastodon client API
|
||||||
|
- The compatible version was bumped to 4.2.1, to indicate support for the "hide list members from home timeline" feature
|
||||||
|
- Remote users are now automatically refreshed in background
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- Errors in refetchPublicKeyForApId can no longer cause strange inbox queue behavior
|
||||||
|
- Database transactions were refactored so no non-database code is run in transaction blocks, fixing a possible backend stall condition in which all database connections are blocked by transactions
|
||||||
|
- User profile mentions resolution no longer recurses infinitely, fixing a possible DoS attack vector
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- The `Mk` prefix was removed from all custom VueJS components
|
||||||
|
- `.yarn/sdks` was updated to fix language server problems in VSCode
|
||||||
|
- Various translation updates
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: AntoineÐ, Aylam, jeder & Laura Hausmann
|
||||||
|
|
||||||
|
## v2023.11-pre3
|
||||||
|
### Breaking changes
|
||||||
|
- Lists have been reworked, now only allowing followed users to be added, and support for proxy accounts has been removed. To allow users to follow any users they want to keep on their lists, the migration that removes all list members users are not following will only be activated in the release **after** the next stable release. It is therefore highly recommended to add an instance announcement informing your users of this change and advising them to follow any affected accounts and to use the new "hide from home timeline" list option if desired.
|
||||||
|
|
||||||
|
### Highlights
|
||||||
|
- Significantly improved handling of mentions, both in outgoing AP messages and in the Mastodon client API
|
||||||
|
- Various Mastodon client API regressions are now fixed, improving client compatibility
|
||||||
|
- HTTP Signature validation error handling has been improved
|
||||||
|
- The project is now compatible with NodeJS >= 18.6 (tested against v20.8.1 at time of writing)
|
||||||
|
|
||||||
|
### Mastodon client API
|
||||||
|
- Long redirect URIs are now handled correctly
|
||||||
|
- The `/v1/instance` endpoint now returns the correct streaming URL
|
||||||
|
- The `/v1/apps` response now returns all fields, including `vapid_key`, allowing for implementation of push notifications in the future
|
||||||
|
- Redirect URLs that contain double-urlencoded parts are now handled correctly
|
||||||
|
- The OAuth process now displays errors properly
|
||||||
|
- The hashtag timeline query is now case insensitive
|
||||||
|
- Statuses returned by all endpoints now have the `content_type` field populated
|
||||||
|
- The `/v1/instance` endpoint now correctly lists the supported mime types for statuses
|
||||||
|
- Hashtags now have the `class=hashtag` attribute set correctly
|
||||||
|
- Accounts returned by all endpoints now have the `fqn` field populated
|
||||||
|
- Inline quote URLs are now rendered properly by supported clients (e.g. Enafore)
|
||||||
|
- Mentions to accounts the instance was unable to resolve are now rendered as plain text
|
||||||
|
- Profile edits made using `/v1/update_credentials` are now federated properly
|
||||||
|
- An edge case where quotes were incorrectly detected as boosts was resolved
|
||||||
|
- Boosted quotes are now handled properly
|
||||||
|
- User profile data is now updated in the background when calling `/v1/accounts/:id`
|
||||||
|
- The `url` field in status objects now contains the url instead of the uri, whenever available
|
||||||
|
- Boosts by boost-muted users are now skipped in the Mastodon streaming API
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- Migrations are finally in sync with the ORM, allowing for proper migrations handling in the future
|
||||||
|
- Mentions in user profiles are now resolved and stored in the database
|
||||||
|
- Invalid mentions in outgoing AP messages are now sent as plain text instead of an unreachable link pointing back at the origin instance
|
||||||
|
- When HTTP signature validation fails, an attempt to refresh the user's public key is now made, fixing federation with Mastodon instances who ran `tootctl accounts rotate`
|
||||||
|
- The error image override config is now loaded properly
|
||||||
|
- VAPID keys for WebPush are now properly generated when bootstrapping a new instance
|
||||||
|
- Capitalization of mentions is now corrected automatically, preventing federation issues where remote instances fail to render them
|
||||||
|
- Authorized fetch is now enabled by default for new instances
|
||||||
|
- NSFW detection & tensorflow have been removed
|
||||||
|
- HTTP signature validation now correctly verifies the hostname of the keyId against the hostname of the actor uri instead of the user's account domain, fixing an edge case where federation with split domain instances could fail
|
||||||
|
- Federation handshakes initiated by GoToSocial when the local instance has authorized fetch enabled are now handled correctly
|
||||||
|
- The `search-by-username-and-host` endpoint now doesn't filter out inactive users by default
|
||||||
|
|
||||||
|
### UI/UX
|
||||||
|
- The default themes were tweaked
|
||||||
|
- The 'Explore' tab header now uses the correct icon
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- Some unused files have been removed from the repository
|
||||||
|
- The code formatter now works properly for .vue files
|
||||||
|
- The discrepancy of different formatters using different tab widths was resolved
|
||||||
|
- The documentation now recommends using `git clone --depth=1` when cloning the repository to speed up the process
|
||||||
|
- The Dockerfile now doesn't run `yarn workspaces focus --production` because it doesn't actually save any space in the final image due to yarn zero installs
|
||||||
|
- A new yarn script, `start:debug`, was added to make attaching a debugger to the application easier
|
||||||
|
- Dependencies with critical vulnerabilities have been updated
|
||||||
|
- Various translation updates
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: AntoineÐ, Aylam, Erin Shepherd & Laura Hausmann
|
||||||
|
|
||||||
|
## v2023.11-pre2
|
||||||
|
### Highlights
|
||||||
|
- An oversight in the OAuth helper that was preventing login to work in some Mastodon clients was fixed.
|
||||||
|
|
||||||
|
## v2023.11-pre1
|
||||||
|
### New versioning scheme
|
||||||
|
From now on we will use a JetBrains-like versioning scheme. Since our release candidates are more of a release preview, they can now be identified by the `-pre` suffix, followed by a number that increments with each following release preview. To maintain lexical sort order with previous releases from this year, we're starting the release counter at 11. That makes this release `v2023.11-pre1`.
|
||||||
|
|
||||||
|
### Breaking changes
|
||||||
|
- The Mastodon client API now uses its own, separate OAuth backend. This means all existing sessions are now invalid. Please log out and back in again in your clients.
|
||||||
|
|
||||||
|
### Highlights
|
||||||
|
- The Mastodon client API now uses OAuth instead of MiAuth
|
||||||
|
- ActivityPub object lookups now respect redirects
|
||||||
|
|
||||||
|
### Mastodon client API
|
||||||
|
- Reactions with 0 reacts are no longer returned
|
||||||
|
- The 'next' part of the Link pagination header is no longer returned when there are less results than the set limit
|
||||||
|
- Remote mentions of local users are now rendered correctly
|
||||||
|
- Mentions now only display the handle, without the instance domain, mimicking Mastodon
|
||||||
|
- Code blocks are now rendered properly
|
||||||
|
- Mentions in user bios now work (most of the time)
|
||||||
|
- Quote URIs are now only appended to the post if the post doesn't already contain them
|
||||||
|
- Links are now rendered properly
|
||||||
|
- The streaming API now works for webclients running in Chrome and its derivatives
|
||||||
|
- /v1/instance now returns the field `max_toot_chars`, improving compatibility with some clients
|
||||||
|
- Edit history is now returned in the correct order
|
||||||
|
- Invalid remote mentions are now handled correctly
|
||||||
|
- User search autocomplete now works as one would expect
|
||||||
|
- The public:allow_local_only stream is now supported
|
||||||
|
|
||||||
|
### UI/UX
|
||||||
|
- "NSFW content" was renamed to "sensitive content"
|
||||||
|
- The user mention picker now works correctly for remote users
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- All migrations are now written in TypeScript
|
||||||
|
- Mentions in outgoing AP messages are now formatted correctly
|
||||||
|
- Trailing slashes for links in user profile fields are now only sent in AP messages if explicitly set
|
||||||
|
- Links in outgoing AP messages are now formatted correctly
|
||||||
|
- Mention parsing in incoming & outgoing AP messages now matches usernames case-insensitively
|
||||||
|
- The required VAPID keys for WebPush are now generated automatically
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- A missing devDependency was added
|
||||||
|
- The unused check:connect script was removed
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: aylamz & Laura Hausmann
|
||||||
|
|
||||||
|
It also includes cherry-picked contributions from external contributors: Johann150
|
||||||
|
|
||||||
|
## v2023.10.11-rc1
|
||||||
|
### Highlights
|
||||||
|
- The Mastodon client API now supports the websocket streaming API
|
||||||
|
- Various bugs in the HTTP Link header pagination implementation were fixed
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: Laura Hausmann
|
||||||
|
|
||||||
|
## v2023.10.08-rc1
|
||||||
|
### Breaking changes
|
||||||
|
- The Mastodon client API now uses the standard alphanumeric ID format. This breaks pagination with existing Mastodon client sessions, if they cache user and/or post data. It is therefore strongly recommended that you either clear the client's cache (if it exposes such a button), its data (if your OS supports this), log out and in again, or in the worst case reinstall any clients with active sessions, especially if you notice strange timeline behavior or unexplained "Record not found" errors.
|
||||||
|
|
||||||
|
### Highlights
|
||||||
|
- The Mastodon client API backend underwent a full rewrite, dropping megalodon as a dependency. Expect:
|
||||||
|
+ Rich text formatting (mentions, links, hashtags, etc. are now properly formatted)
|
||||||
|
+ Significantly improved API responsiveness - performance was improved by a factor of 2-5x (or more!) depending on the endpoint
|
||||||
|
+ Better spec compliance & improved compatibility (we test against: Mona, toot!, Ice Cubes, Tusker, Feditext, Mastodon for iOS, Mastodon for Android/Megalodon/Moshidon, Tusky, Elk, Phanpy, Pinafore/Semaphore/Enafore and more)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
- The update checker now works properly with the new versioning scheme
|
||||||
|
- The control panel indicator is now displayed correctly
|
||||||
|
- Countless Mastodon client API bugs have been resolved
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- Note edits (of local users) have been completely reworked, now storing the correct history and no longer accepting nonsensical parameters (like changing the reply target) that don't federate properly if at all
|
||||||
|
|
||||||
|
### UI/UX
|
||||||
|
- The calendar widget is now disabled by default
|
||||||
|
- The navigation buttons on mobile have been improved
|
||||||
|
- The default themes now have proper shadows
|
||||||
|
- Post headers no longer have text shadow
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- The documentation now mentions PGTune
|
||||||
|
- Private mode descriptions now refer to 'allowlists' instead of an outdated term
|
||||||
|
- Various translation updates
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
- This release was made possible by project contributors: Alexis, AntoineÐ, Aylam & Laura Hausmann
|
||||||
|
|
||||||
|
## v2023.10.04
|
||||||
|
### Highlights
|
||||||
|
- New logos, themes & brand colors
|
||||||
|
- All rust code has been removed (less jank, significantly faster build times)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
- Post boost counts can no longer become negative
|
||||||
|
|
||||||
|
### Performance
|
||||||
|
- User note lookups are now significantly faster
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- Minor iconograpgy changes
|
||||||
|
- Translation updates
|
||||||
|
|
||||||
|
### Infrastructure
|
||||||
|
- Docker builds are now versioned
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: AntoineÐ, Aylam, Jeder, Laura Hausmann & moshibar
|
||||||
|
|
||||||
|
## v2023.09.13-rc1
|
||||||
|
### Highlights
|
||||||
|
- New branding & documentation
|
||||||
|
- Proper support for split domain deployments, both local and remote
|
||||||
|
- [Configurable](https://iceshrimp.dev/iceshrimp/iceshrimp/src/commit/f3c1e4efd30e660372a652a7b43fdb63e2817bae/.config/example.yml#L193-L198) automatic remote media pruning (disabled by default)
|
||||||
|
- Reworked content warnings (three different styles for CW'd posts, 'Expand all CWs in thread' button, 'Expand all CWs by default' client option)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
- CW-only quotes now function correctly
|
||||||
|
- Relative timestamps (*1m ago*) are now updated as time passes
|
||||||
|
- Replies to inaccessible posts are now displayed correctly instead of causing timeline errors
|
||||||
|
- Antenna pagination is now handled correctly, including for posts received out of order
|
||||||
|
- Inbox URLs are now checked in the deliver manager (a broken akkoma commit was briefly causing delivery queue crashes)
|
||||||
|
- The chats page title no longer occasionally displays *undefined*
|
||||||
|
- Fixed an edge case where account deletion could time out
|
||||||
|
- Antennas now also match on CW text
|
||||||
|
- Local only posts now correctly display on the timeline without having to reload
|
||||||
|
- The migration that moves antennas to the redis/dragonflydb cache server now works with password protected redis servers
|
||||||
|
- You can now no longer edit a post to include a quote of itself
|
||||||
|
- Post edits no longer support post visibility changes
|
||||||
|
- Full text search is now restricted to logged in users
|
||||||
|
- Local only posts are no longer accessible to guest users
|
||||||
|
- The web client now shows local users with the instance account domain instead of the web domain
|
||||||
|
- New replies in a thread are now displayed correctly
|
||||||
|
- User update no longer fails for users who don't have a `sharedInbox`
|
||||||
|
- Follow requests now paginate properly
|
||||||
|
- Fetching pinned posts from users on GoToSocial instances (or other AP implementations that return a collection of URIs instead of objects) now works properly
|
||||||
|
|
||||||
|
### UI/UX
|
||||||
|
- Ads, donation nag prompts & the patreon integration have been removed
|
||||||
|
- The blinking notification indicator has been replaced with a static one
|
||||||
|
- Replies to inaccessible posts now have an indicator explainin this
|
||||||
|
- Protected posts now have a lock indicator instead of a disabled boost button
|
||||||
|
- The navbar editor now has a proper UI
|
||||||
|
- The instance ticker is now much more readable in light mode
|
||||||
|
- The post visibility picker is now mobile-optimized
|
||||||
|
- The search button in the guest view is now a button instead of a fake search bar
|
||||||
|
- Blur is now disabled by default
|
||||||
|
- When blur is disabled, UI elements are now properly opaque
|
||||||
|
- The antenna timeline now has a help text explaining why posts can be out of order
|
||||||
|
- Status images have been replaced with [configurable](https://iceshrimp.dev/iceshrimp/iceshrimp/src/commit/3afbaacc3773ac0772204d872126d37309302562/.config/example-docker.yml#L201-L205) status emoji
|
||||||
|
- The navbar layout has been tweaked
|
||||||
|
- Various inconsistencies as well as alignment & animation issues have been fixed
|
||||||
|
|
||||||
|
### Mastodon client API
|
||||||
|
- /api/v1/instance is now more accurate
|
||||||
|
- Emoji reactions are now supported
|
||||||
|
- The 'pinned' parameter is now supported for individual profile timelines
|
||||||
|
- Improved handling for quotes
|
||||||
|
- Post edits are now supported
|
||||||
|
- Post deletion now returns the correct response
|
||||||
|
- OAuth registration now correctly supports multiple callback URIs
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- `Cache<T>` `.getAll` and `.delete` functions now work as expected
|
||||||
|
- Deleted users are now purged from user lookup and public key caches
|
||||||
|
- Proper support for host-meta style WebFinger
|
||||||
|
- Stricter compliance with the WebFinger spec
|
||||||
|
- Support for WebFinger remotes that don't handle queries for object URIs correctly
|
||||||
|
|
||||||
|
### Performance
|
||||||
|
- The project is now built with yarn berry (with zero installs) instead of pnpm
|
||||||
|
- The docker build process now properly caches rust and yarn deps
|
||||||
|
- The migration rust crate now builds much faster
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
- The MFM search engine is now [configurable](https://iceshrimp.dev/iceshrimp/iceshrimp/src/commit/afd9ffb3c728b143c6d3d4d3dd8562ec6bde3a91/.config/example.yml#L206-L207)
|
||||||
|
- Various translation updates
|
||||||
|
|
||||||
|
### Infrastructure and governance
|
||||||
|
- Commits are now tested with basic CI on push
|
||||||
|
- Docker builds are now automatic for amd64 and arm64
|
||||||
|
- The [code of conduct](CODE_OF_CONDUCT.md) has been updated
|
||||||
|
|
||||||
|
### Attribution
|
||||||
|
This release was made possible by project contributors: Anthial, AntoineÐ, April John, aylamz, Froggo, Jeder, Laura Hausmann, Luna, maikelthedev, moshibar, ShittyKopper & Vyr Cossont
|
||||||
|
|
||||||
|
It also includes cherry-picked contributions from external contributors: Namekuji, Natty, ThatOneCalculator & Naskya
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
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.
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
# Codexで追加・修正した機能一覧
|
||||||
|
|
||||||
|
このファイルは、この作業ツリー上でCodexが実装した変更を追跡するためのメモです。
|
||||||
|
|
||||||
|
## v267F.0
|
||||||
|
|
||||||
|
- 管理者がプラン種別を追加・更新・削除できる管理APIと管理画面を追加。
|
||||||
|
- 管理者がユーザーを任意のプランへ加入・解除できる機能を追加。
|
||||||
|
- 加入中プランのアイコンをユーザー名横に表示するように変更。
|
||||||
|
- バージョン名を `v267F.0` に更新。
|
||||||
|
|
||||||
|
## v267E.3
|
||||||
|
|
||||||
|
- 添付ファイルの閲覧にEPUBビューアを追加。
|
||||||
|
- EPUB3表示、EPUB内JavaScript、インタラクティブコンテンツ、外部CDN参照に対応。
|
||||||
|
- EPUB実行環境は隔離iframe内に配置し、SNS本体の画面とは分離。
|
||||||
|
- EPUBファイルをブラウザ表示可能なMIMEとして扱うように変更。
|
||||||
|
- バージョン名を `v267E.3` に更新。
|
||||||
|
|
||||||
|
## v267E.2
|
||||||
|
|
||||||
|
- ゆめくじを左メニューの将棋の直後に移動。
|
||||||
|
- 動画・音声・画像・カラオケの特設サイトから、必要メディアを添付したタグ付き投稿を開始できるように変更。
|
||||||
|
- Lua4Frozenトップページから、Luaファイルを添付した `#Lua4Frozen` 投稿を開始できるように変更。
|
||||||
|
- ハッシュタグ検索ページから、表示中のハッシュタグを入れた投稿を開始できるように変更。
|
||||||
|
- 期限切れで削除される自分のMemorietを再投稿用アーカイブとして保存し、削除済み一覧から再投稿できるように変更。
|
||||||
|
- Memorietのテキストレイヤーをプレビュー上で直接入力・ドラッグ移動できるように変更。
|
||||||
|
- Lua4FrozenにCanvasの1つ上へ表示する `ffy.svg` SVGベクタレイヤーを追加。
|
||||||
|
- バージョン名を `v267E.2` に更新。
|
||||||
|
|
||||||
|
## v267C.7.2
|
||||||
|
|
||||||
|
- バージョン名を `v267C.7.2` に更新。
|
||||||
|
|
||||||
|
## v267C.2
|
||||||
|
|
||||||
|
- クライアント起動時に汎用エラー画面へ落ちる問題を修正。
|
||||||
|
- backend単体ビルドでも現在バージョンのロケールJSONを生成するように変更。
|
||||||
|
- boot scriptが古い `localStorage.v` を優先して存在しないロケールJSONを取りに行かないように変更。
|
||||||
|
- ViteのNode組み込みモジュール空スタブを削除し、クライアント実行時の依存解決を復元。
|
||||||
|
- バージョン名を `v267C.2` に更新。
|
||||||
|
|
||||||
|
## v267C.7.1
|
||||||
|
|
||||||
|
- クライアントビルド時のVite警告を抑制。
|
||||||
|
- ブラウザで不要なNode組み込みモジュール参照に空スタブを割り当て。
|
||||||
|
- 実行に影響しない動的import/チャンクサイズ警告をビルドログに出さない設定に変更。
|
||||||
|
- サーバ起動時の警告を抑制。
|
||||||
|
- 通常起動を `NODE_ENV=production` に変更。
|
||||||
|
- `DEP0060` の既知依存警告を抑制。
|
||||||
|
- 起動ログのバージョン表示が `vv...` にならないよう修正。
|
||||||
|
- バージョン名を `v267C.7.1` に更新。
|
||||||
|
|
||||||
|
## v267C.7
|
||||||
|
|
||||||
|
- Iceshrimp最新版の状況確認に基づき、既存JS版の方針に近い小さなQoL機能として「ゆめくじ」ページを追加。
|
||||||
|
- `/yume-fortune` からアクセス可能。
|
||||||
|
- サイドバー項目として追加。
|
||||||
|
- Aboutページからもアクセス可能。
|
||||||
|
- 今日の結果、引き直し、投稿共有に対応。
|
||||||
|
- テーマ名を整理。
|
||||||
|
- 既存の `FrozenFriendsYume Light` を `Iceshrimp Light` に戻した。
|
||||||
|
- 既存の `FrozenFriendsYume Dark` を `Iceshrimp Dark` に戻した。
|
||||||
|
- 新しい `FrozenFriendsYume Light` / `FrozenFriendsYume Dark` を追加。
|
||||||
|
- PostgreSQLデータベースのバックアップ/リストアスクリプトを追加。
|
||||||
|
- `yarn db:backup`
|
||||||
|
- `yarn db:restore <backup.dump|backup.sql>`
|
||||||
|
- バージョン名を `v267C.7` に更新。
|
||||||
|
|
||||||
|
## v267C.6
|
||||||
|
|
||||||
|
- 動画サービス・音声サービス・Lua4Frozen・カラオケの閲覧数カウント仕様を変更。
|
||||||
|
- 動画/音声は再生開始時にカウント。
|
||||||
|
- Lua4Frozenは実行ボタン押下時にカウント。
|
||||||
|
- カラオケは歌唱開始時にカウント。
|
||||||
|
- 同一ユーザーまたは同一IPは1分あたり1回までカウント。
|
||||||
|
- カウント制限に当たっても再生・実行・歌唱自体は継続。
|
||||||
|
- サービス投稿は通常のノート表示では自動閲覧数加算しないように変更。
|
||||||
|
- スマホ表示時に将棋ページ右側が見切れないようにレイアウトを調整。
|
||||||
|
- クライアント更新通知を「アップデートしました!バージョン{version}」形式に変更。
|
||||||
|
- バージョン名を `v267C.6` に更新。
|
||||||
|
|
||||||
|
## 広告関連
|
||||||
|
|
||||||
|
- 広告クリック時に「問題が発生しました」画面になる問題を修正。
|
||||||
|
- `adservice` 投稿を広告表示経由で取得できるように、表示権限判定へ広告用途の例外を追加。
|
||||||
|
- 広告が一般ユーザーに表示されたときにクレジットを消費するように変更。
|
||||||
|
- 広告主本人、管理者、モデレーター、botが広告を閲覧した場合はクレジットを消費しないように変更。
|
||||||
|
- コントロールパネルの広告一覧に「失効クレジット」を追加。
|
||||||
|
- 期限内に消費されず、期限切れになった残クレジットを表示。
|
||||||
|
|
||||||
|
## 接続・ログ安定化
|
||||||
|
|
||||||
|
- `write EPIPE`、`read ECONNRESET`、`ERR_STREAM_DESTROYED` など、切断済み接続への書き込みで発生するノイズを抑制。
|
||||||
|
- ファイル配信・プロキシ・API・サーバー起動部で無害な接続切断エラーを無視。
|
||||||
|
- `latest-version` APIの外部取得に短いタイムアウトを追加し、取得失敗時にログを荒らさず `tag_name: null` を返すように変更。
|
||||||
|
- Node.jsの `punycode` 非推奨警告を既知ノイズとして抑制。
|
||||||
|
- 接続が切れたとき、クライアント右下に「接続が切れました。」と「リロードする」ボタンを表示。
|
||||||
|
- 右上の閉じるボタンで非表示にできる。
|
||||||
|
|
||||||
|
## IPアドレス処理
|
||||||
|
|
||||||
|
- IPハッシュ化処理で不正なIPv4アドレスにより落ちる問題を修正。
|
||||||
|
- `X-Forwarded-For` のカンマ区切り値を正規化。
|
||||||
|
- `IPv4:port` と角括弧付きIPv6を正規化。
|
||||||
|
- 不正値は安全なフォールバックに流すように変更。
|
||||||
|
|
||||||
|
## 国際化
|
||||||
|
|
||||||
|
- 追加機能で不足していた日本語・英語の文言を追加。
|
||||||
|
- 更新通知用の日本語・英語文言を追加。
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
|
||||||
|
# Iceshrimp Community Code of Conduct
|
||||||
|
|
||||||
|
The Iceshrimp Code of Conduct is a set of guidelines that explains how our community behaves and what we value as members and project to others. This Code of Conduct is a living document and will be updated when and as deemed necessary.
|
||||||
|
|
||||||
|
The Code of Conduct does not seek to restrict speech or penalize non-native speakers of English or any other language. Instead the Code of Conduct spells out the kinds of behaviors we, as a community, find to be acceptable and unacceptable.
|
||||||
|
|
||||||
|
It is important to assume good faith and remember that many of our contributors may have different backgrounds which could color their approach in all things.
|
||||||
|
|
||||||
|
## Conduct
|
||||||
|
|
||||||
|
- We are committed to providing a friendly, safe and welcoming environment for all, regardless of level of experience, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, nationality, or other similar characteristic.
|
||||||
|
- Please avoid using overtly sexual aliases or other nicknames that might detract from a friendly, safe and welcoming environment for all.
|
||||||
|
- Please be kind and courteous. There's no need to be mean or rude.
|
||||||
|
- Respect that people have differences of opinion and that every design or implementation choice carries a trade-off and numerous costs. There is seldom a right answer.
|
||||||
|
- We will exclude you from interaction if you insult, demean or harass anyone. That is not welcome behavior. We interpret the term “harassment” as including the definition in the [Citizen Code of Conduct](https://github.com/stumpsyn/policies/blob/master/citizen_code_of_conduct.md#4-unacceptable-behavior); if you have any lack of clarity about what might be included in that concept, please read their definition. In particular, we don't tolerate behavior that excludes people in socially marginalized groups.
|
||||||
|
- Private harassment is also unacceptable. No matter who you are, if you feel you have been or are being harassed or made uncomfortable by a community member, please contact conduct@iceshrimp.dev. Whether you're a regular contributor or a newcomer, we care about making this community a safe place for you and we've got your back.
|
||||||
|
- Likewise any spamming, trolling, flaming, baiting or other attention-stealing behavior is not welcome
|
||||||
|
|
||||||
|
Try to avoid flirting with offensive or sensitive issues, particularly if they're off-topic; this all too often leads to unnecessary fights, hurt feelings, and damaged trust; worse, it can drive people away from the community entirely.
|
||||||
|
|
||||||
|
And if someone takes issue with something you said or did, resist the urge to be defensive. Just stop doing what it was they complained about and apologize. Even if you feel you were misinterpreted or unfairly accused, chances are good there was something you could've communicated better — remember that it's your responsibility to make your community members comfortable. Everyone wants to get along and we are all here first and foremost because we want to talk about and develop cool technology. You will find that people will be eager to assume good intent and forgive as long as you earn their trust.
|
||||||
|
|
||||||
|
## Moderation
|
||||||
|
|
||||||
|
**People who have an issue or questions about a potential Code of Conduct violation can raise it by writing an e-mail to [conduct@iceshrimp.dev](mailto:conduct@iceshrimp.dev)**
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies within all community spaces, and also applies when an individual is representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is derived from openSUSE and Rust Code of Conduct documents.
|
||||||
|
|
||||||
|
[Rust Code of Conduct](https://www.rust-lang.org/policies/code-of-conduct)
|
||||||
|
|
||||||
|
[openSUSE Community Code of Conduct](https://code.opensuse.org/project/coc/blob/main/f/Code-of-Conduct.md)
|
||||||
|
|
||||||
|
Some parts are also adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
|
||||||
|
|
||||||
+274
@@ -0,0 +1,274 @@
|
|||||||
|
# Contribution guide
|
||||||
|
We're glad you're interested in contributing Iceshrimp! In this document you will find the information you need to contribute to the project.
|
||||||
|
|
||||||
|
## Translation (i18n)
|
||||||
|
Iceshrimp uses [Weblate](https://translate.iceshrimp.dev/) for translation and internationalization management.
|
||||||
|
|
||||||
|
If your language is not listed in Weblate, please open an issue.
|
||||||
|
|
||||||
|
You can contribute without knowing how to code by helping translate here:
|
||||||
|
|
||||||
|
[](https://translate.iceshrimp.dev/)
|
||||||
|
|
||||||
|
[](https://translate.iceshrimp.dev/)
|
||||||
|
|
||||||
|
|
||||||
|
## Issues
|
||||||
|
Before creating an issue, please check the following:
|
||||||
|
- To avoid duplication, please search for similar issues before creating a new issue.
|
||||||
|
- Do not use Issues to ask questions or troubleshooting.
|
||||||
|
- Issues should only be used to feature requests, suggestions, and bug tracking.
|
||||||
|
- Please ask questions or troubleshooting in the [Matrix room](https://matrix.to/#/#iceshrimp-dev:161.rocks).
|
||||||
|
|
||||||
|
> **Warning**
|
||||||
|
> Do not close issues that are about to be resolved. It should remain open until a commit that actually resolves it is merged.
|
||||||
|
|
||||||
|
## Before implementation
|
||||||
|
When you want to add a feature or fix a bug, **first have the design and policy reviewed in an Issue** (if it is not there, please make one). Without this step, there is a high possibility that the PR will not be merged even if it is implemented.
|
||||||
|
|
||||||
|
At this point, you also need to clarify the goals of the PR you will create, and make sure that the other members of the team are aware of them.
|
||||||
|
PRs that do not have a clear set of do's and don'ts tend to be bloated and difficult to review.
|
||||||
|
|
||||||
|
Also, when you start implementation, assign yourself to the Issue (if you cannot do it yourself, ask another member to assign you). By expressing your intention to work the Issue, you can prevent conflicts in the work.
|
||||||
|
|
||||||
|
## Well-known branches
|
||||||
|
- The **`main`** branch is tracking the latest release and used for production purposes.
|
||||||
|
- The **`develop`** branch is where we work for the next release.
|
||||||
|
- When you create a PR, basically target it to this branch. **But create a different branch**
|
||||||
|
- The **`l10n_develop`** branch is reserved for localization management.
|
||||||
|
- **`feature/*`** branches are reserved for the development of a specific feature
|
||||||
|
|
||||||
|
## Creating a PR
|
||||||
|
Thank you for your PR! Before creating a PR, please check the following:
|
||||||
|
- If possible, prefix the title with a keyword that identifies the type of this PR, as shown below.
|
||||||
|
- `fix` / `refactor` / `feat` / `enhance` / `perf` / `chore` etc. You are also welcome to use gitmoji. This is important as we use these to A) easier read the git history and B) generate our changelog. Without propper prefixing it is possible that your PR is rejected.
|
||||||
|
- Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR.
|
||||||
|
- If there is an Issue which will be resolved by this PR, please include a reference to the Issue in the text. Good examples include `Closing: #21` or `Resolves: #21`
|
||||||
|
- Check if there are any documents that need to be created or updated due to this change.
|
||||||
|
- If you have added a feature or fixed a bug, please add a test case if possible.
|
||||||
|
- Please make sure that formatting, tests and Lint are passed in advance.
|
||||||
|
- You can run it with `pnpm run format`, `pnpm run test` and `pnpm run lint`. [See more info](#testing)
|
||||||
|
- If this PR includes UI changes, please attach a screenshot in the text.
|
||||||
|
|
||||||
|
Thanks for your cooperation 🤗
|
||||||
|
|
||||||
|
## Reviewers guide
|
||||||
|
Be willing to comment on the good points and not just the things you want fixed 💯
|
||||||
|
|
||||||
|
### Review perspective
|
||||||
|
- Scope
|
||||||
|
- Are the goals of the PR clear?
|
||||||
|
- Is the granularity of the PR appropriate?
|
||||||
|
- Security
|
||||||
|
- Does merging this PR create a vulnerability?
|
||||||
|
- Performance
|
||||||
|
- Will merging this PR cause unexpected performance degradation?
|
||||||
|
- Is there a more efficient way?
|
||||||
|
- Testing
|
||||||
|
- Does the test ensure the expected behavior?
|
||||||
|
- Are there any omissions or gaps?
|
||||||
|
- Does it check for anomalies?
|
||||||
|
|
||||||
|
## Deploy (SOON)
|
||||||
|
The `/deploy` command by issue comment can be used to deploy the contents of a PR to the preview environment.
|
||||||
|
```
|
||||||
|
/deploy sha=<commit hash>
|
||||||
|
```
|
||||||
|
An actual domain will be assigned so you can test the federation.
|
||||||
|
|
||||||
|
## Merge
|
||||||
|
|
||||||
|
## Release
|
||||||
|
### Release Instructions
|
||||||
|
1. Commit version changes in the `develop` branch ([package.json](https://github.com/misskey-dev/misskey/blob/develop/package.json))
|
||||||
|
2. Create a release PR.
|
||||||
|
- Into `master` from `develop` branch.
|
||||||
|
- The title must be in the format `Release: x.y.z`.
|
||||||
|
- `x.y.z` is the new version you are trying to release.
|
||||||
|
3. Deploy and perform a simple QA check. Also verify that the tests passed.
|
||||||
|
4. Merge it.
|
||||||
|
5. Create a [release of GitHub](https://github.com/misskey-dev/misskey/releases)
|
||||||
|
- The target branch must be `master`
|
||||||
|
- The tag name must be the version
|
||||||
|
|
||||||
|
## Development
|
||||||
|
During development, it is useful to use the `yarn dev` command.
|
||||||
|
This command monitors the server-side and client-side source files and automatically builds them if they are modified.
|
||||||
|
In addition, it will also automatically start the Misskey server process.
|
||||||
|
|
||||||
|
|
||||||
|
# THE FOLLOWING IS OUTDATED:
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
- Test codes are located in [`/test`](/test).
|
||||||
|
|
||||||
|
### Run test
|
||||||
|
Create a config file.
|
||||||
|
```
|
||||||
|
cp test/test.yml .config/
|
||||||
|
```
|
||||||
|
Prepare DB/Redis for testing.
|
||||||
|
```
|
||||||
|
docker-compose -f test/docker-compose.yml up
|
||||||
|
```
|
||||||
|
Alternatively, prepare an empty (data can be erased) DB and edit `.config/test.yml`.
|
||||||
|
|
||||||
|
Run all test.
|
||||||
|
```
|
||||||
|
yarn test
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Run specify test
|
||||||
|
```
|
||||||
|
TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT="./test/tsconfig.json" yarn dlx mocha test/foo.ts --require ts-node/register
|
||||||
|
```
|
||||||
|
|
||||||
|
### e2e tests
|
||||||
|
TODO
|
||||||
|
|
||||||
|
## Continuous integration
|
||||||
|
Misskey uses GitHub Actions for executing automated tests.
|
||||||
|
Configuration files are located in [`/.github/workflows`](/.github/workflows).
|
||||||
|
|
||||||
|
## Vue
|
||||||
|
Misskey uses Vue(v3) as its front-end framework.
|
||||||
|
- Use TypeScript.
|
||||||
|
- **When creating a new component, please use the Composition API (with [setup sugar](https://v3.vuejs.org/api/sfc-script-setup.html) and [ref sugar](https://github.com/vuejs/rfcs/discussions/369)) instead of the Options API.**
|
||||||
|
- Some of the existing components are implemented in the Options API, but it is an old implementation. Refactors that migrate those components to the Composition API are also welcome.
|
||||||
|
|
||||||
|
## nirax
|
||||||
|
niraxは、Misskeyで使用しているオリジナルのフロントエンドルーティングシステムです。
|
||||||
|
**vue-routerから影響を多大に受けているので、まずはvue-routerについて学ぶことをお勧めします。**
|
||||||
|
|
||||||
|
### ルート定義
|
||||||
|
ルート定義は、以下の形式のオブジェクトの配列です。
|
||||||
|
|
||||||
|
``` ts
|
||||||
|
{
|
||||||
|
name?: string;
|
||||||
|
path: string;
|
||||||
|
component: Component;
|
||||||
|
query?: Record<string, string>;
|
||||||
|
loginRequired?: boolean;
|
||||||
|
hash?: string;
|
||||||
|
globalCacheKey?: string;
|
||||||
|
children?: RouteDef[];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Warning**
|
||||||
|
> 現状、ルートは定義された順に評価されます。
|
||||||
|
> たとえば、`/foo/:id`ルート定義の次に`/foo/bar`ルート定義がされていた場合、後者がマッチすることはありません。
|
||||||
|
|
||||||
|
### 複数のルーター
|
||||||
|
vue-routerとの最大の違いは、niraxは複数のルーターが存在することを許可している点です。
|
||||||
|
これにより、アプリ内ウィンドウでブラウザとは個別にルーティングすることなどが可能になります。
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
### How to resolve conflictions occurred at yarn.lock?
|
||||||
|
|
||||||
|
Just execute `yarn` to fix it.
|
||||||
|
|
||||||
|
### INSERTするときにはsaveではなくinsertを使用する
|
||||||
|
#6441
|
||||||
|
|
||||||
|
### placeholder
|
||||||
|
SQLをクエリビルダで組み立てる際、使用するプレースホルダは重複してはならない
|
||||||
|
例えば
|
||||||
|
``` ts
|
||||||
|
query.andWhere(new Brackets(qb => {
|
||||||
|
for (const type of ps.fileType) {
|
||||||
|
qb.orWhere(`:type = ANY(note.attachedFileTypes)`, { type: type });
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
```
|
||||||
|
と書くと、ループ中で`type`というプレースホルダが複数回使われてしまいおかしくなる
|
||||||
|
だから次のようにする必要がある
|
||||||
|
```ts
|
||||||
|
query.andWhere(new Brackets(qb => {
|
||||||
|
for (const type of ps.fileType) {
|
||||||
|
const i = ps.fileType.indexOf(type);
|
||||||
|
qb.orWhere(`:type${i} = ANY(note.attachedFileTypes)`, { [`type${i}`]: type });
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
```
|
||||||
|
|
||||||
|
### Not `null` in TypeORM
|
||||||
|
```ts
|
||||||
|
const foo = await Foos.findOne({
|
||||||
|
bar: Not(null)
|
||||||
|
});
|
||||||
|
```
|
||||||
|
のようなクエリ(`bar`が`null`ではない)は期待通りに動作しない。
|
||||||
|
次のようにします:
|
||||||
|
```ts
|
||||||
|
const foo = await Foos.findOne({
|
||||||
|
bar: Not(IsNull())
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### `null` in SQL
|
||||||
|
SQLを発行する際、パラメータが`null`になる可能性のある場合はSQL文を出し分けなければならない
|
||||||
|
例えば
|
||||||
|
``` ts
|
||||||
|
query.where('file.folderId = :folderId', { folderId: ps.folderId });
|
||||||
|
```
|
||||||
|
という処理で、`ps.folderId`が`null`だと結果的に`file.folderId = null`のようなクエリが発行されてしまい、これは正しいSQLではないので期待した結果が得られない
|
||||||
|
だから次のようにする必要がある
|
||||||
|
``` ts
|
||||||
|
if (ps.folderId) {
|
||||||
|
query.where('file.folderId = :folderId', { folderId: ps.folderId });
|
||||||
|
} else {
|
||||||
|
query.where('file.folderId IS NULL');
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### `[]` in SQL
|
||||||
|
SQLを発行する際、`IN`のパラメータが`[]`(空の配列)になる可能性のある場合はSQL文を出し分けなければならない
|
||||||
|
例えば
|
||||||
|
``` ts
|
||||||
|
const users = await Users.find({
|
||||||
|
id: In(userIds)
|
||||||
|
});
|
||||||
|
```
|
||||||
|
という処理で、`userIds`が`[]`だと結果的に`user.id IN ()`のようなクエリが発行されてしまい、これは正しいSQLではないので期待した結果が得られない
|
||||||
|
だから次のようにする必要がある
|
||||||
|
``` ts
|
||||||
|
const users = userIds.length > 0 ? await Users.find({
|
||||||
|
id: In(userIds)
|
||||||
|
}) : [];
|
||||||
|
```
|
||||||
|
|
||||||
|
### 配列のインデックス in SQL
|
||||||
|
SQLでは配列のインデックスは**1始まり**。
|
||||||
|
`[a, b, c]`の `a`にアクセスしたいなら`[0]`ではなく`[1]`と書く
|
||||||
|
|
||||||
|
### null IN
|
||||||
|
nullが含まれる可能性のあるカラムにINするときは、そのままだとおかしくなるのでORなどでnullのハンドリングをしよう。
|
||||||
|
|
||||||
|
### `undefined`にご用心
|
||||||
|
MongoDBの時とは違い、findOneでレコードを取得する時に対象レコードが存在しない場合 **`undefined`** が返ってくるので注意。
|
||||||
|
MongoDBは`null`で返してきてたので、その感覚で`if (x === null)`とか書くとバグる。代わりに`if (x == null)`と書いてください
|
||||||
|
|
||||||
|
### Migration作成方法
|
||||||
|
packages/backendで:
|
||||||
|
```sh
|
||||||
|
yarn workspace backend run generatemigration src/migration/<migration name>
|
||||||
|
```
|
||||||
|
|
||||||
|
- 生成後、ファイルをmigration下に移してください
|
||||||
|
- 作成されたスクリプトは不必要な変更を含むため除去してください
|
||||||
|
|
||||||
|
### コネクションには`markRaw`せよ
|
||||||
|
**Vueのコンポーネントのdataオプションとして**misskey.jsのコネクションを設定するとき、必ず`markRaw`でラップしてください。インスタンスが不必要にリアクティブ化されることで、misskey.js内の処理で不具合が発生するとともに、パフォーマンス上の問題にも繋がる。なお、Composition APIを使う場合はこの限りではない(リアクティブ化はマニュアルなため)。
|
||||||
|
|
||||||
|
### JSONのimportに気を付けよう
|
||||||
|
TypeScriptでjsonをimportすると、tscでコンパイルするときにそのjsonファイルも一緒にdistディレクトリに吐き出されてしまう。この挙動により、意図せずファイルの書き換えが発生することがあるので、jsonをimportするときは書き換えられても良いものかどうか確認すること。書き換えされて欲しくない場合は、importで読み込むのではなく、`fs.readFileSync`などの関数を使って読み込むようにすればよい。
|
||||||
|
|
||||||
|
### コンポーネントのスタイル定義でmarginを持たせない
|
||||||
|
コンポーネント自身がmarginを設定するのは問題の元となることはよく知られている
|
||||||
|
marginはそのコンポーネントを使う側が設定する
|
||||||
|
|
||||||
|
## その他
|
||||||
|
### HTMLのクラス名で follow という単語は使わない
|
||||||
|
広告ブロッカーで誤ってブロックされる
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
Unless specified otherwise, the entirety of this repository is subject to the following:
|
||||||
|
Copyright © 2014-2023 syuilo and contributors
|
||||||
|
Copyright © 2022-2023 Kainoa Kanter and contributors
|
||||||
|
Copyright © 2023-2023 The Iceshrimp 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.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
These specific configuration directories:
|
||||||
|
|
||||||
|
- .config/
|
||||||
|
- custom/assets/
|
||||||
|
|
||||||
|
and their contents are
|
||||||
|
Copyright © 2023 The Iceshrimp contributors
|
||||||
|
|
||||||
|
And are distributed under The Apache License, Version 2.0, you should have received a copy of the license file as LICENSE in each specified directory.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Iceshrimp includes several third-party open-source softwares and software libraries.
|
||||||
|
|
||||||
|
RsaSignature2017 implementation by Transmute Industries Inc
|
||||||
|
License: MIT
|
||||||
|
https://github.com/transmute-industries/RsaSignature2017/blob/master/LICENSE
|
||||||
|
|
||||||
|
Licenses for all softwares and software libraries installed via the Node Package Manager ("npm") can be found by running the following shell command in the root directory of this repository:
|
||||||
|
|
||||||
|
`yarn -R info --manifest`
|
||||||
+57
@@ -0,0 +1,57 @@
|
|||||||
|
# syntax = docker/dockerfile:1.2
|
||||||
|
## Install dev and compilation dependencies, build files
|
||||||
|
FROM docker.io/library/alpine:edge as build
|
||||||
|
LABEL stage=build
|
||||||
|
WORKDIR /iceshrimp
|
||||||
|
|
||||||
|
# Install compilation dependencies
|
||||||
|
RUN apk add --no-cache --no-progress git alpine-sdk python3 py3-setuptools nodejs npm linux-headers brotli
|
||||||
|
|
||||||
|
# Copy in all files for the build
|
||||||
|
COPY . ./
|
||||||
|
|
||||||
|
# Prepare yarn cache
|
||||||
|
RUN --mount=type=cache,target=/iceshrimp/.yarncache cp -r .yarncache/. .yarn
|
||||||
|
|
||||||
|
# Configure corepack and install dev mode dependencies for compilation
|
||||||
|
RUN npm install -g corepack && corepack enable && corepack prepare --activate && yarn --immutable
|
||||||
|
|
||||||
|
# Save yarn cache
|
||||||
|
RUN --mount=type=cache,target=/iceshrimp/.yarncache rm -rf .yarncache/* && cp -r .yarn/. .yarncache
|
||||||
|
|
||||||
|
# Build the thing
|
||||||
|
RUN env NODE_ENV=production yarn build
|
||||||
|
|
||||||
|
# Optimize
|
||||||
|
RUN env NODE_ENV=production yarn build:optimize
|
||||||
|
|
||||||
|
# Prepare focused yarn cache
|
||||||
|
RUN --mount=type=cache,target=/iceshrimp/.yarncache_focused cp -r .yarncache_focused/. .yarn
|
||||||
|
|
||||||
|
# Remove dev deps
|
||||||
|
RUN yarn focus-production
|
||||||
|
|
||||||
|
# Save focused yarn cache
|
||||||
|
RUN --mount=type=cache,target=/iceshrimp/.yarncache_focused rm -rf .yarncache/* && cp -r .yarn/. .yarncache_focused
|
||||||
|
|
||||||
|
## Runtime container
|
||||||
|
FROM docker.io/library/alpine:edge
|
||||||
|
LABEL stage=runtime
|
||||||
|
WORKDIR /iceshrimp
|
||||||
|
|
||||||
|
# Install runtime dependencies
|
||||||
|
RUN apk add --no-cache --no-progress tini ffmpeg zip unzip nodejs npm libheif-dev
|
||||||
|
|
||||||
|
# Copy built files
|
||||||
|
COPY --from=build /iceshrimp /iceshrimp
|
||||||
|
|
||||||
|
# Configure corepack
|
||||||
|
RUN npm install -g corepack && corepack enable && corepack prepare --activate
|
||||||
|
|
||||||
|
# Remove unnecessary npm
|
||||||
|
RUN apk del npm
|
||||||
|
|
||||||
|
ENV NODE_ENV=production
|
||||||
|
VOLUME "/iceshrimp/files"
|
||||||
|
ENTRYPOINT [ "/sbin/tini", "--" ]
|
||||||
|
CMD [ "yarn", "run", "migrateandstart" ]
|
||||||
@@ -2,26 +2,59 @@ GNU AFFERO GENERAL PUBLIC LICENSE
|
|||||||
Version 3, 19 November 2007
|
Version 3, 19 November 2007
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
Preamble
|
Preamble
|
||||||
|
|
||||||
The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software.
|
The GNU Affero General Public License is a free, copyleft license for
|
||||||
|
software and other kinds of works, specifically designed to ensure
|
||||||
|
cooperation with the community in the case of network server software.
|
||||||
|
|
||||||
The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users.
|
The licenses for most software and other practical works are designed
|
||||||
|
to take away your freedom to share and change the works. By contrast,
|
||||||
|
our General Public Licenses are intended to guarantee your freedom to
|
||||||
|
share and change all versions of a program--to make sure it remains free
|
||||||
|
software for all its users.
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
them if you wish), that you receive source code or can get it if you
|
||||||
|
want it, that you can change the software or use pieces of it in new
|
||||||
|
free programs, and that you know you can do these things.
|
||||||
|
|
||||||
Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software.
|
Developers that use our General Public Licenses protect your rights
|
||||||
|
with two steps: (1) assert copyright on the software, and (2) offer
|
||||||
|
you this License which gives you legal permission to copy, distribute
|
||||||
|
and/or modify the software.
|
||||||
|
|
||||||
A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public.
|
A secondary benefit of defending all users' freedom is that
|
||||||
|
improvements made in alternate versions of the program, if they
|
||||||
|
receive widespread use, become available for other developers to
|
||||||
|
incorporate. Many developers of free software are heartened and
|
||||||
|
encouraged by the resulting cooperation. However, in the case of
|
||||||
|
software used on network servers, this result may fail to come about.
|
||||||
|
The GNU General Public License permits making a modified version and
|
||||||
|
letting the public access it on a server without ever releasing its
|
||||||
|
source code to the public.
|
||||||
|
|
||||||
The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version.
|
The GNU Affero General Public License is designed specifically to
|
||||||
|
ensure that, in such cases, the modified source code becomes available
|
||||||
|
to the community. It requires the operator of a network server to
|
||||||
|
provide the source code of the modified version running there to the
|
||||||
|
users of that server. Therefore, public use of a modified version, on
|
||||||
|
a publicly accessible server, gives the public access to the source
|
||||||
|
code of the modified version.
|
||||||
|
|
||||||
An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license.
|
An older license, called the Affero General Public License and
|
||||||
|
published by Affero, was designed to accomplish similar goals. This is
|
||||||
|
a different license, not a version of the Affero GPL, but Affero has
|
||||||
|
released a new version of the Affero GPL which permits relicensing under
|
||||||
|
this license.
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and modification follow.
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
TERMS AND CONDITIONS
|
TERMS AND CONDITIONS
|
||||||
|
|
||||||
@@ -29,207 +62,600 @@ The precise terms and conditions for copying, distribution and modification foll
|
|||||||
|
|
||||||
"This License" refers to version 3 of the GNU Affero General Public License.
|
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||||
|
|
||||||
"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
|
works, such as semiconductor masks.
|
||||||
|
|
||||||
"The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations.
|
"The Program" refers to any copyrightable work licensed under this
|
||||||
|
License. Each licensee is addressed as "you". "Licensees" and
|
||||||
|
"recipients" may be individuals or organizations.
|
||||||
|
|
||||||
To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work.
|
To "modify" a work means to copy from or adapt all or part of the work
|
||||||
|
in a fashion requiring copyright permission, other than the making of an
|
||||||
|
exact copy. The resulting work is called a "modified version" of the
|
||||||
|
earlier work or a work "based on" the earlier work.
|
||||||
|
|
||||||
A "covered work" means either the unmodified Program or a work based on the Program.
|
A "covered work" means either the unmodified Program or a work based
|
||||||
|
on the Program.
|
||||||
|
|
||||||
To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
|
To "propagate" a work means to do anything with it that, without
|
||||||
|
permission, would make you directly or secondarily liable for
|
||||||
|
infringement under applicable copyright law, except executing it on a
|
||||||
|
computer or modifying a private copy. Propagation includes copying,
|
||||||
|
distribution (with or without modification), making available to the
|
||||||
|
public, and in some countries other activities as well.
|
||||||
|
|
||||||
To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
|
To "convey" a work means any kind of propagation that enables other
|
||||||
|
parties to make or receive copies. Mere interaction with a user through
|
||||||
|
a computer network, with no transfer of a copy, is not conveying.
|
||||||
|
|
||||||
An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
|
An interactive user interface displays "Appropriate Legal Notices"
|
||||||
|
to the extent that it includes a convenient and prominently visible
|
||||||
|
feature that (1) displays an appropriate copyright notice, and (2)
|
||||||
|
tells the user that there is no warranty for the work (except to the
|
||||||
|
extent that warranties are provided), that licensees may convey the
|
||||||
|
work under this License, and how to view a copy of this License. If
|
||||||
|
the interface presents a list of user commands or options, such as a
|
||||||
|
menu, a prominent item in the list meets this criterion.
|
||||||
|
|
||||||
1. Source Code.
|
1. Source Code.
|
||||||
The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work.
|
|
||||||
|
|
||||||
A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
|
The "source code" for a work means the preferred form of the work
|
||||||
|
for making modifications to it. "Object code" means any non-source
|
||||||
|
form of a work.
|
||||||
|
|
||||||
The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
|
A "Standard Interface" means an interface that either is an official
|
||||||
|
standard defined by a recognized standards body, or, in the case of
|
||||||
|
interfaces specified for a particular programming language, one that
|
||||||
|
is widely used among developers working in that language.
|
||||||
|
|
||||||
The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those
|
The "System Libraries" of an executable work include anything, other
|
||||||
|
than the work as a whole, that (a) is included in the normal form of
|
||||||
|
packaging a Major Component, but which is not part of that Major
|
||||||
|
Component, and (b) serves only to enable use of the work with that
|
||||||
|
Major Component, or to implement a Standard Interface for which an
|
||||||
|
implementation is available to the public in source code form. A
|
||||||
|
"Major Component", in this context, means a major essential component
|
||||||
|
(kernel, window system, and so on) of the specific operating system
|
||||||
|
(if any) on which the executable work runs, or a compiler used to
|
||||||
|
produce the work, or an object code interpreter used to run it.
|
||||||
|
|
||||||
|
The "Corresponding Source" for a work in object code form means all
|
||||||
|
the source code needed to generate, install, and (for an executable
|
||||||
|
work) run the object code and to modify the work, including scripts to
|
||||||
|
control those activities. However, it does not include the work's
|
||||||
|
System Libraries, or general-purpose tools or generally available free
|
||||||
|
programs which are used unmodified in performing those activities but
|
||||||
|
which are not part of the work. For example, Corresponding Source
|
||||||
|
includes interface definition files associated with source files for
|
||||||
|
the work, and the source code for shared libraries and dynamically
|
||||||
|
linked subprograms that the work is specifically designed to require,
|
||||||
|
such as by intimate data communication or control flow between those
|
||||||
subprograms and other parts of the work.
|
subprograms and other parts of the work.
|
||||||
|
|
||||||
The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
|
The Corresponding Source need not include anything that users
|
||||||
|
can regenerate automatically from other parts of the Corresponding
|
||||||
|
Source.
|
||||||
|
|
||||||
The Corresponding Source for a work in source code form is that same work.
|
The Corresponding Source for a work in source code form is that
|
||||||
|
same work.
|
||||||
|
|
||||||
2. Basic Permissions.
|
2. Basic Permissions.
|
||||||
All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
|
|
||||||
|
|
||||||
You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
|
All rights granted under this License are granted for the term of
|
||||||
|
copyright on the Program, and are irrevocable provided the stated
|
||||||
|
conditions are met. This License explicitly affirms your unlimited
|
||||||
|
permission to run the unmodified Program. The output from running a
|
||||||
|
covered work is covered by this License only if the output, given its
|
||||||
|
content, constitutes a covered work. This License acknowledges your
|
||||||
|
rights of fair use or other equivalent, as provided by copyright law.
|
||||||
|
|
||||||
Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
|
You may make, run and propagate covered works that you do not
|
||||||
|
convey, without conditions so long as your license otherwise remains
|
||||||
|
in force. You may convey covered works to others for the sole purpose
|
||||||
|
of having them make modifications exclusively for you, or provide you
|
||||||
|
with facilities for running those works, provided that you comply with
|
||||||
|
the terms of this License in conveying all material for which you do
|
||||||
|
not control copyright. Those thus making or running the covered works
|
||||||
|
for you must do so exclusively on your behalf, under your direction
|
||||||
|
and control, on terms that prohibit them from making any copies of
|
||||||
|
your copyrighted material outside their relationship with you.
|
||||||
|
|
||||||
|
Conveying under any other circumstances is permitted solely under
|
||||||
|
the conditions stated below. Sublicensing is not allowed; section 10
|
||||||
|
makes it unnecessary.
|
||||||
|
|
||||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||||
No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
|
|
||||||
|
|
||||||
When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
|
No covered work shall be deemed part of an effective technological
|
||||||
|
measure under any applicable law fulfilling obligations under article
|
||||||
|
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||||
|
similar laws prohibiting or restricting circumvention of such
|
||||||
|
measures.
|
||||||
|
|
||||||
|
When you convey a covered work, you waive any legal power to forbid
|
||||||
|
circumvention of technological measures to the extent such circumvention
|
||||||
|
is effected by exercising rights under this License with respect to
|
||||||
|
the covered work, and you disclaim any intention to limit operation or
|
||||||
|
modification of the work as a means of enforcing, against the work's
|
||||||
|
users, your or third parties' legal rights to forbid circumvention of
|
||||||
|
technological measures.
|
||||||
|
|
||||||
4. Conveying Verbatim Copies.
|
4. Conveying Verbatim Copies.
|
||||||
You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
|
|
||||||
|
|
||||||
You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
|
You may convey verbatim copies of the Program's source code as you
|
||||||
|
receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice;
|
||||||
|
keep intact all notices stating that this License and any
|
||||||
|
non-permissive terms added in accord with section 7 apply to the code;
|
||||||
|
keep intact all notices of the absence of any warranty; and give all
|
||||||
|
recipients a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge any price or no price for each copy that you convey,
|
||||||
|
and you may offer support or warranty protection for a fee.
|
||||||
|
|
||||||
5. Conveying Modified Source Versions.
|
5. Conveying Modified Source Versions.
|
||||||
You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
|
You may convey a work based on the Program, or the modifications to
|
||||||
|
produce it from the Program, in the form of source code under the
|
||||||
|
terms of section 4, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices".
|
a) The work must carry prominent notices stating that you modified
|
||||||
|
it, and giving a relevant date.
|
||||||
|
|
||||||
c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
|
b) The work must carry prominent notices stating that it is
|
||||||
|
released under this License and any conditions added under section
|
||||||
|
7. This requirement modifies the requirement in section 4 to
|
||||||
|
"keep intact all notices".
|
||||||
|
|
||||||
d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
|
c) You must license the entire work, as a whole, under this
|
||||||
|
License to anyone who comes into possession of a copy. This
|
||||||
|
License will therefore apply, along with any applicable section 7
|
||||||
|
additional terms, to the whole of the work, and all its parts,
|
||||||
|
regardless of how they are packaged. This License gives no
|
||||||
|
permission to license the work in any other way, but it does not
|
||||||
|
invalidate such permission if you have separately received it.
|
||||||
|
|
||||||
A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
|
d) If the work has interactive user interfaces, each must display
|
||||||
|
Appropriate Legal Notices; however, if the Program has interactive
|
||||||
|
interfaces that do not display Appropriate Legal Notices, your
|
||||||
|
work need not make them do so.
|
||||||
|
|
||||||
|
A compilation of a covered work with other separate and independent
|
||||||
|
works, which are not by their nature extensions of the covered work,
|
||||||
|
and which are not combined with it such as to form a larger program,
|
||||||
|
in or on a volume of a storage or distribution medium, is called an
|
||||||
|
"aggregate" if the compilation and its resulting copyright are not
|
||||||
|
used to limit the access or legal rights of the compilation's users
|
||||||
|
beyond what the individual works permit. Inclusion of a covered work
|
||||||
|
in an aggregate does not cause this License to apply to the other
|
||||||
|
parts of the aggregate.
|
||||||
|
|
||||||
6. Conveying Non-Source Forms.
|
6. Conveying Non-Source Forms.
|
||||||
You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
|
|
||||||
|
|
||||||
a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
|
You may convey a covered work in object code form under the terms
|
||||||
|
of sections 4 and 5, provided that you also convey the
|
||||||
|
machine-readable Corresponding Source under the terms of this License,
|
||||||
|
in one of these ways:
|
||||||
|
|
||||||
b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
|
a) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by the
|
||||||
|
Corresponding Source fixed on a durable physical medium
|
||||||
|
customarily used for software interchange.
|
||||||
|
|
||||||
c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
|
b) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by a
|
||||||
|
written offer, valid for at least three years and valid for as
|
||||||
|
long as you offer spare parts or customer support for that product
|
||||||
|
model, to give anyone who possesses the object code either (1) a
|
||||||
|
copy of the Corresponding Source for all the software in the
|
||||||
|
product that is covered by this License, on a durable physical
|
||||||
|
medium customarily used for software interchange, for a price no
|
||||||
|
more than your reasonable cost of physically performing this
|
||||||
|
conveying of source, or (2) access to copy the
|
||||||
|
Corresponding Source from a network server at no charge.
|
||||||
|
|
||||||
d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
|
c) Convey individual copies of the object code with a copy of the
|
||||||
|
written offer to provide the Corresponding Source. This
|
||||||
|
alternative is allowed only occasionally and noncommercially, and
|
||||||
|
only if you received the object code with such an offer, in accord
|
||||||
|
with subsection 6b.
|
||||||
|
|
||||||
e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
|
d) Convey the object code by offering access from a designated
|
||||||
|
place (gratis or for a charge), and offer equivalent access to the
|
||||||
|
Corresponding Source in the same way through the same place at no
|
||||||
|
further charge. You need not require recipients to copy the
|
||||||
|
Corresponding Source along with the object code. If the place to
|
||||||
|
copy the object code is a network server, the Corresponding Source
|
||||||
|
may be on a different server (operated by you or a third party)
|
||||||
|
that supports equivalent copying facilities, provided you maintain
|
||||||
|
clear directions next to the object code saying where to find the
|
||||||
|
Corresponding Source. Regardless of what server hosts the
|
||||||
|
Corresponding Source, you remain obligated to ensure that it is
|
||||||
|
available for as long as needed to satisfy these requirements.
|
||||||
|
|
||||||
A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
|
e) Convey the object code using peer-to-peer transmission, provided
|
||||||
|
you inform other peers where the object code and Corresponding
|
||||||
|
Source of the work are being offered to the general public at no
|
||||||
|
charge under subsection 6d.
|
||||||
|
|
||||||
A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.
|
A separable portion of the object code, whose source code is excluded
|
||||||
|
from the Corresponding Source as a System Library, need not be
|
||||||
|
included in conveying the object code work.
|
||||||
|
|
||||||
"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
|
A "User Product" is either (1) a "consumer product", which means any
|
||||||
|
tangible personal property which is normally used for personal, family,
|
||||||
|
or household purposes, or (2) anything designed or sold for incorporation
|
||||||
|
into a dwelling. In determining whether a product is a consumer product,
|
||||||
|
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||||
|
product received by a particular user, "normally used" refers to a
|
||||||
|
typical or common use of that class of product, regardless of the status
|
||||||
|
of the particular user or of the way in which the particular user
|
||||||
|
actually uses, or expects or is expected to use, the product. A product
|
||||||
|
is a consumer product regardless of whether the product has substantial
|
||||||
|
commercial, industrial or non-consumer uses, unless such uses represent
|
||||||
|
the only significant mode of use of the product.
|
||||||
|
|
||||||
If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
|
"Installation Information" for a User Product means any methods,
|
||||||
|
procedures, authorization keys, or other information required to install
|
||||||
|
and execute modified versions of a covered work in that User Product from
|
||||||
|
a modified version of its Corresponding Source. The information must
|
||||||
|
suffice to ensure that the continued functioning of the modified object
|
||||||
|
code is in no case prevented or interfered with solely because
|
||||||
|
modification has been made.
|
||||||
|
|
||||||
The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
|
If you convey an object code work under this section in, or with, or
|
||||||
|
specifically for use in, a User Product, and the conveying occurs as
|
||||||
|
part of a transaction in which the right of possession and use of the
|
||||||
|
User Product is transferred to the recipient in perpetuity or for a
|
||||||
|
fixed term (regardless of how the transaction is characterized), the
|
||||||
|
Corresponding Source conveyed under this section must be accompanied
|
||||||
|
by the Installation Information. But this requirement does not apply
|
||||||
|
if neither you nor any third party retains the ability to install
|
||||||
|
modified object code on the User Product (for example, the work has
|
||||||
|
been installed in ROM).
|
||||||
|
|
||||||
Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
|
The requirement to provide Installation Information does not include a
|
||||||
|
requirement to continue to provide support service, warranty, or updates
|
||||||
|
for a work that has been modified or installed by the recipient, or for
|
||||||
|
the User Product in which it has been modified or installed. Access to a
|
||||||
|
network may be denied when the modification itself materially and
|
||||||
|
adversely affects the operation of the network or violates the rules and
|
||||||
|
protocols for communication across the network.
|
||||||
|
|
||||||
|
Corresponding Source conveyed, and Installation Information provided,
|
||||||
|
in accord with this section must be in a format that is publicly
|
||||||
|
documented (and with an implementation available to the public in
|
||||||
|
source code form), and must require no special password or key for
|
||||||
|
unpacking, reading or copying.
|
||||||
|
|
||||||
7. Additional Terms.
|
7. Additional Terms.
|
||||||
"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.
|
|
||||||
|
|
||||||
When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
|
"Additional permissions" are terms that supplement the terms of this
|
||||||
|
License by making exceptions from one or more of its conditions.
|
||||||
|
Additional permissions that are applicable to the entire Program shall
|
||||||
|
be treated as though they were included in this License, to the extent
|
||||||
|
that they are valid under applicable law. If additional permissions
|
||||||
|
apply only to part of the Program, that part may be used separately
|
||||||
|
under those permissions, but the entire Program remains governed by
|
||||||
|
this License without regard to the additional permissions.
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
|
When you convey a copy of a covered work, you may at your option
|
||||||
|
remove any additional permissions from that copy, or from any part of
|
||||||
|
it. (Additional permissions may be written to require their own
|
||||||
|
removal in certain cases when you modify the work.) You may place
|
||||||
|
additional permissions on material, added by you to a covered work,
|
||||||
|
for which you have or can give appropriate copyright permission.
|
||||||
|
|
||||||
a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
|
Notwithstanding any other provision of this License, for material you
|
||||||
|
add to a covered work, you may (if authorized by the copyright holders of
|
||||||
|
that material) supplement the terms of this License with terms:
|
||||||
|
|
||||||
b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
|
a) Disclaiming warranty or limiting liability differently from the
|
||||||
|
terms of sections 15 and 16 of this License; or
|
||||||
|
|
||||||
c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
|
b) Requiring preservation of specified reasonable legal notices or
|
||||||
|
author attributions in that material or in the Appropriate Legal
|
||||||
|
Notices displayed by works containing it; or
|
||||||
|
|
||||||
d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
|
c) Prohibiting misrepresentation of the origin of that material, or
|
||||||
|
requiring that modified versions of such material be marked in
|
||||||
|
reasonable ways as different from the original version; or
|
||||||
|
|
||||||
e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
|
d) Limiting the use for publicity purposes of names of licensors or
|
||||||
|
authors of the material; or
|
||||||
|
|
||||||
f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
|
e) Declining to grant rights under trademark law for use of some
|
||||||
|
trade names, trademarks, or service marks; or
|
||||||
|
|
||||||
All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
|
f) Requiring indemnification of licensors and authors of that
|
||||||
|
material by anyone who conveys the material (or modified versions of
|
||||||
|
it) with contractual assumptions of liability to the recipient, for
|
||||||
|
any liability that these contractual assumptions directly impose on
|
||||||
|
those licensors and authors.
|
||||||
|
|
||||||
If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
|
All other non-permissive additional terms are considered "further
|
||||||
|
restrictions" within the meaning of section 10. If the Program as you
|
||||||
|
received it, or any part of it, contains a notice stating that it is
|
||||||
|
governed by this License along with a term that is a further
|
||||||
|
restriction, you may remove that term. If a license document contains
|
||||||
|
a further restriction but permits relicensing or conveying under this
|
||||||
|
License, you may add to a covered work material governed by the terms
|
||||||
|
of that license document, provided that the further restriction does
|
||||||
|
not survive such relicensing or conveying.
|
||||||
|
|
||||||
Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
|
If you add terms to a covered work in accord with this section, you
|
||||||
|
must place, in the relevant source files, a statement of the
|
||||||
|
additional terms that apply to those files, or a notice indicating
|
||||||
|
where to find the applicable terms.
|
||||||
|
|
||||||
|
Additional terms, permissive or non-permissive, may be stated in the
|
||||||
|
form of a separately written license, or stated as exceptions;
|
||||||
|
the above requirements apply either way.
|
||||||
|
|
||||||
8. Termination.
|
8. Termination.
|
||||||
|
|
||||||
You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
|
You may not propagate or modify a covered work except as expressly
|
||||||
|
provided under this License. Any attempt otherwise to propagate or
|
||||||
|
modify it is void, and will automatically terminate your rights under
|
||||||
|
this License (including any patent licenses granted under the third
|
||||||
|
paragraph of section 11).
|
||||||
|
|
||||||
However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
|
However, if you cease all violation of this License, then your
|
||||||
|
license from a particular copyright holder is reinstated (a)
|
||||||
|
provisionally, unless and until the copyright holder explicitly and
|
||||||
|
finally terminates your license, and (b) permanently, if the copyright
|
||||||
|
holder fails to notify you of the violation by some reasonable means
|
||||||
|
prior to 60 days after the cessation.
|
||||||
|
|
||||||
Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, you do not qualify to receive new licenses for the same
|
||||||
|
material under section 10.
|
||||||
|
|
||||||
9. Acceptance Not Required for Having Copies.
|
9. Acceptance Not Required for Having Copies.
|
||||||
|
|
||||||
You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
|
You are not required to accept this License in order to receive or
|
||||||
|
run a copy of the Program. Ancillary propagation of a covered work
|
||||||
|
occurring solely as a consequence of using peer-to-peer transmission
|
||||||
|
to receive a copy likewise does not require acceptance. However,
|
||||||
|
nothing other than this License grants you permission to propagate or
|
||||||
|
modify any covered work. These actions infringe copyright if you do
|
||||||
|
not accept this License. Therefore, by modifying or propagating a
|
||||||
|
covered work, you indicate your acceptance of this License to do so.
|
||||||
|
|
||||||
10. Automatic Licensing of Downstream Recipients.
|
10. Automatic Licensing of Downstream Recipients.
|
||||||
|
|
||||||
Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
|
Each time you convey a covered work, the recipient automatically
|
||||||
|
receives a license from the original licensors, to run, modify and
|
||||||
|
propagate that work, subject to this License. You are not responsible
|
||||||
|
for enforcing compliance by third parties with this License.
|
||||||
|
|
||||||
An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
|
An "entity transaction" is a transaction transferring control of an
|
||||||
|
organization, or substantially all assets of one, or subdividing an
|
||||||
|
organization, or merging organizations. If propagation of a covered
|
||||||
|
work results from an entity transaction, each party to that
|
||||||
|
transaction who receives a copy of the work also receives whatever
|
||||||
|
licenses to the work the party's predecessor in interest had or could
|
||||||
|
give under the previous paragraph, plus a right to possession of the
|
||||||
|
Corresponding Source of the work from the predecessor in interest, if
|
||||||
|
the predecessor has it or can get it with reasonable efforts.
|
||||||
|
|
||||||
You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
|
You may not impose any further restrictions on the exercise of the
|
||||||
|
rights granted or affirmed under this License. For example, you may
|
||||||
|
not impose a license fee, royalty, or other charge for exercise of
|
||||||
|
rights granted under this License, and you may not initiate litigation
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||||
|
any patent claim is infringed by making, using, selling, offering for
|
||||||
|
sale, or importing the Program or any portion of it.
|
||||||
|
|
||||||
11. Patents.
|
11. Patents.
|
||||||
|
|
||||||
A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version".
|
A "contributor" is a copyright holder who authorizes use under this
|
||||||
|
License of the Program or a work on which the Program is based. The
|
||||||
|
work thus licensed is called the contributor's "contributor version".
|
||||||
|
|
||||||
A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
|
A contributor's "essential patent claims" are all patent claims
|
||||||
|
owned or controlled by the contributor, whether already acquired or
|
||||||
|
hereafter acquired, that would be infringed by some manner, permitted
|
||||||
|
by this License, of making, using, or selling its contributor version,
|
||||||
|
but do not include claims that would be infringed only as a
|
||||||
|
consequence of further modification of the contributor version. For
|
||||||
|
purposes of this definition, "control" includes the right to grant
|
||||||
|
patent sublicenses in a manner consistent with the requirements of
|
||||||
|
this License.
|
||||||
|
|
||||||
Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
|
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||||
|
patent license under the contributor's essential patent claims, to
|
||||||
|
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||||
|
propagate the contents of its contributor version.
|
||||||
|
|
||||||
In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
|
In the following three paragraphs, a "patent license" is any express
|
||||||
|
agreement or commitment, however denominated, not to enforce a patent
|
||||||
|
(such as an express permission to practice a patent or covenant not to
|
||||||
|
sue for patent infringement). To "grant" such a patent license to a
|
||||||
|
party means to make such an agreement or commitment not to enforce a
|
||||||
|
patent against the party.
|
||||||
|
|
||||||
If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent
|
If you convey a covered work, knowingly relying on a patent license,
|
||||||
license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.
|
and the Corresponding Source of the work is not available for anyone
|
||||||
|
to copy, free of charge and under the terms of this License, through a
|
||||||
|
publicly available network server or other readily accessible means,
|
||||||
|
then you must either (1) cause the Corresponding Source to be so
|
||||||
|
available, or (2) arrange to deprive yourself of the benefit of the
|
||||||
|
patent license for this particular work, or (3) arrange, in a manner
|
||||||
|
consistent with the requirements of this License, to extend the patent
|
||||||
|
license to downstream recipients. "Knowingly relying" means you have
|
||||||
|
actual knowledge that, but for the patent license, your conveying the
|
||||||
|
covered work in a country, or your recipient's use of the covered work
|
||||||
|
in a country, would infringe one or more identifiable patents in that
|
||||||
|
country that you have reason to believe are valid.
|
||||||
|
|
||||||
If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
|
If, pursuant to or in connection with a single transaction or
|
||||||
|
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||||
|
covered work, and grant a patent license to some of the parties
|
||||||
|
receiving the covered work authorizing them to use, propagate, modify
|
||||||
|
or convey a specific copy of the covered work, then the patent license
|
||||||
|
you grant is automatically extended to all recipients of the covered
|
||||||
|
work and works based on it.
|
||||||
|
|
||||||
A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
|
A patent license is "discriminatory" if it does not include within
|
||||||
|
the scope of its coverage, prohibits the exercise of, or is
|
||||||
|
conditioned on the non-exercise of one or more of the rights that are
|
||||||
|
specifically granted under this License. You may not convey a covered
|
||||||
|
work if you are a party to an arrangement with a third party that is
|
||||||
|
in the business of distributing software, under which you make payment
|
||||||
|
to the third party based on the extent of your activity of conveying
|
||||||
|
the work, and under which the third party grants, to any of the
|
||||||
|
parties who would receive the covered work from you, a discriminatory
|
||||||
|
patent license (a) in connection with copies of the covered work
|
||||||
|
conveyed by you (or copies made from those copies), or (b) primarily
|
||||||
|
for and in connection with specific products or compilations that
|
||||||
|
contain the covered work, unless you entered into that arrangement,
|
||||||
|
or that patent license was granted, prior to 28 March 2007.
|
||||||
|
|
||||||
Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
|
Nothing in this License shall be construed as excluding or limiting
|
||||||
|
any implied license or other defenses to infringement that may
|
||||||
|
otherwise be available to you under applicable patent law.
|
||||||
|
|
||||||
12. No Surrender of Others' Freedom.
|
12. No Surrender of Others' Freedom.
|
||||||
|
|
||||||
If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may
|
If conditions are imposed on you (whether by court order, agreement or
|
||||||
not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot convey a
|
||||||
|
covered work so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you may
|
||||||
|
not convey it at all. For example, if you agree to terms that obligate you
|
||||||
|
to collect a royalty for further conveying from those to whom you convey
|
||||||
|
the Program, the only way you could satisfy both those terms and this
|
||||||
|
License would be to refrain entirely from conveying the Program.
|
||||||
|
|
||||||
13. Remote Network Interaction; Use with the GNU General Public License.
|
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph.
|
Notwithstanding any other provision of this License, if you modify the
|
||||||
|
Program, your modified version must prominently offer all users
|
||||||
|
interacting with it remotely through a computer network (if your version
|
||||||
|
supports such interaction) an opportunity to receive the Corresponding
|
||||||
|
Source of your version by providing access to the Corresponding Source
|
||||||
|
from a network server at no charge, through some standard or customary
|
||||||
|
means of facilitating copying of software. This Corresponding Source
|
||||||
|
shall include the Corresponding Source for any work covered by version 3
|
||||||
|
of the GNU General Public License that is incorporated pursuant to the
|
||||||
|
following paragraph.
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License.
|
Notwithstanding any other provision of this License, you have
|
||||||
|
permission to link or combine any covered work with a work licensed
|
||||||
|
under version 3 of the GNU General Public License into a single
|
||||||
|
combined work, and to convey the resulting work. The terms of this
|
||||||
|
License will continue to apply to the part which is the covered work,
|
||||||
|
but the work with which it is combined will remain governed by version
|
||||||
|
3 of the GNU General Public License.
|
||||||
|
|
||||||
14. Revised Versions of this License.
|
14. Revised Versions of this License.
|
||||||
|
|
||||||
The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
|
The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the GNU Affero General Public License from time to time. Such new versions
|
||||||
|
will be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation.
|
Each version is given a distinguishing version number. If the
|
||||||
|
Program specifies that a certain numbered version of the GNU Affero General
|
||||||
|
Public License "or any later version" applies to it, you have the
|
||||||
|
option of following the terms and conditions either of that numbered
|
||||||
|
version or of any later version published by the Free Software
|
||||||
|
Foundation. If the Program does not specify a version number of the
|
||||||
|
GNU Affero General Public License, you may choose any version ever published
|
||||||
|
by the Free Software Foundation.
|
||||||
|
|
||||||
If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
|
If the Program specifies that a proxy can decide which future
|
||||||
|
versions of the GNU Affero General Public License can be used, that proxy's
|
||||||
|
public statement of acceptance of a version permanently authorizes you
|
||||||
|
to choose that version for the Program.
|
||||||
|
|
||||||
Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
|
Later license versions may give you additional or different
|
||||||
|
permissions. However, no additional obligations are imposed on any
|
||||||
|
author or copyright holder as a result of your choosing to follow a
|
||||||
|
later version.
|
||||||
|
|
||||||
15. Disclaimer of Warranty.
|
15. Disclaimer of Warranty.
|
||||||
|
|
||||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||||
|
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||||
|
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||||
|
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||||
|
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
16. Limitation of Liability.
|
16. Limitation of Liability.
|
||||||
|
|
||||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||||
|
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||||
|
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||||
|
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||||
|
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||||
|
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||||
|
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGES.
|
||||||
|
|
||||||
17. Interpretation of Sections 15 and 16.
|
17. Interpretation of Sections 15 and 16.
|
||||||
|
|
||||||
If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
|
If the disclaimer of warranty and limitation of liability provided
|
||||||
|
above cannot be given local legal effect according to their terms,
|
||||||
|
reviewing courts shall apply local law that most closely approximates
|
||||||
|
an absolute waiver of all civil liability in connection with the
|
||||||
|
Program, unless a warranty or assumption of liability accompanies a
|
||||||
|
copy of the Program in return for a fee.
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
state the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
FrozenFriendsYume
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
Copyright (C) 2026 yumehaki
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements.
|
If your software can interact with users remotely through a computer
|
||||||
|
network, you should also make sure that it provides a way for users to
|
||||||
|
get its source. For example, if your program is a web application, its
|
||||||
|
interface could display a "Source" link that leads users to an archive
|
||||||
|
of the code. There are many ways you could offer source, and different
|
||||||
|
solutions will be better for different programs; see section 13 for the
|
||||||
|
specific requirements.
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see <http://www.gnu.org/licenses/>.
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
|
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
|
|||||||
@@ -0,0 +1,723 @@
|
|||||||
|
# Lua4Frozen 仕様
|
||||||
|
|
||||||
|
Lua4Frozen は、Iceshrimp/FrozenFriendsYume 上で Lua プログラムを投稿・検索・閲覧・実行するためのブラウザ内サンドボックス実行環境です。
|
||||||
|
この仕様書は、現行実装に存在する Lua4Frozen 本体と関連機能をまとめます。
|
||||||
|
|
||||||
|
## 1. 対象範囲
|
||||||
|
|
||||||
|
この文書に含める範囲は次の通りです。
|
||||||
|
|
||||||
|
- Lua4Frozen 投稿の判定条件
|
||||||
|
- Lua4Frozen 一覧・検索
|
||||||
|
- ノート本文からの Lua4Frozen 導線
|
||||||
|
- 投稿添付 `.lua` の実行画面
|
||||||
|
- ブラウザ内テストランナー
|
||||||
|
- Lua 実行環境とサンドボックス
|
||||||
|
- `ffy` API
|
||||||
|
- 添付ファイル、仮想ファイル、Drive 連携
|
||||||
|
- 仮想キーボードとキーボード配列 JSON
|
||||||
|
- エラー、ログ、セキュリティ制約
|
||||||
|
|
||||||
|
## 2. 画面とルート
|
||||||
|
|
||||||
|
Lua4Frozen には次のルートがあります。
|
||||||
|
|
||||||
|
| ルート | 機能 |
|
||||||
|
| --- | --- |
|
||||||
|
| `/lua4frozen` | Lua4Frozen 投稿一覧・検索 |
|
||||||
|
| `/lua4frozen/:noteId` | 指定ノートの Lua プログラム実行 |
|
||||||
|
| `/lua4frozen/spec` | アプリ内仕様説明ページ |
|
||||||
|
| `/lua4frozen/test` | ブラウザ内テストランナー |
|
||||||
|
|
||||||
|
ナビゲーションには `Lua4Frozen` 項目があり、トップ画面からテストランナーと仕様ページへ移動できます。
|
||||||
|
|
||||||
|
## 3. Lua4Frozen 投稿
|
||||||
|
|
||||||
|
ノートが Lua4Frozen 投稿として扱われる条件は次の通りです。
|
||||||
|
|
||||||
|
1. ノートの可視性が `public` または `home`
|
||||||
|
2. ノートのタグに `lua4frozen` が含まれる
|
||||||
|
3. 添付ファイルに `.lua` 拡張子のファイルが 1 つ以上ある
|
||||||
|
|
||||||
|
タグ判定は小文字化されたタグ配列に対して行われます。
|
||||||
|
本文中の `#Lua4Frozen` はタグ化され、内部的には `lua4frozen` として扱われます。
|
||||||
|
|
||||||
|
### タイトルと説明
|
||||||
|
|
||||||
|
Lua4Frozen 一覧と実行画面では、ノート本文を次のように扱います。
|
||||||
|
|
||||||
|
- 1 行目: タイトル
|
||||||
|
- 2 行目以降: 説明
|
||||||
|
- 1 行目が空の場合: `(no title)`
|
||||||
|
|
||||||
|
説明は実行画面では MFM として表示されます。
|
||||||
|
|
||||||
|
## 4. ノートからの関連導線
|
||||||
|
|
||||||
|
通常のノート表示でも、次の条件を満たすと Lua4Frozen への導線が出ます。
|
||||||
|
|
||||||
|
1. ノートにファイルが 1 つ以上ある
|
||||||
|
2. 可視性が `public` または `home`
|
||||||
|
3. タグに `lua4frozen` が含まれる
|
||||||
|
4. `.lua` 拡張子の添付ファイルがある
|
||||||
|
|
||||||
|
この場合、メディアサービス用リンクのラベルは `Lua4Frozen` になり、遷移先は `/lua4frozen/:noteId` です。
|
||||||
|
|
||||||
|
## 5. 一覧・検索 API
|
||||||
|
|
||||||
|
Lua4Frozen 一覧は `notes/lua4frozen-search` を使います。
|
||||||
|
|
||||||
|
### エンドポイント
|
||||||
|
|
||||||
|
`notes/lua4frozen-search`
|
||||||
|
|
||||||
|
### 認証
|
||||||
|
|
||||||
|
- 通常時: 認証不要
|
||||||
|
- Private mode 時: 認証が必要
|
||||||
|
|
||||||
|
### パラメータ
|
||||||
|
|
||||||
|
| 名前 | 型 | 既定値 | 制約 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| `query` | string | `""` | 前後空白は除去 |
|
||||||
|
| `limit` | integer | `20` | `1` 以上 `50` 以下 |
|
||||||
|
| `offset` | integer | `0` | `0` 以上 |
|
||||||
|
|
||||||
|
### 検索条件
|
||||||
|
|
||||||
|
検索対象は次の通りです。
|
||||||
|
|
||||||
|
- ノート本文の部分一致
|
||||||
|
- 投稿者の `usernameLower` の部分一致
|
||||||
|
|
||||||
|
### 抽出条件
|
||||||
|
|
||||||
|
API は以下の条件でノートを抽出します。
|
||||||
|
|
||||||
|
- `visibility` が `public` または `home`
|
||||||
|
- `tags` に `lua4frozen` が含まれる
|
||||||
|
- `fileIds` が空でない
|
||||||
|
- pack 後に `.lua` ファイルを持つものだけ残す
|
||||||
|
|
||||||
|
並び順は `createdAt DESC` です。
|
||||||
|
|
||||||
|
## 6. 投稿実行画面
|
||||||
|
|
||||||
|
`/lua4frozen/:noteId` は指定ノートを取得し、Lua4Frozen として実行します。
|
||||||
|
|
||||||
|
### 読み込み時の検証
|
||||||
|
|
||||||
|
実行画面は次を検証します。
|
||||||
|
|
||||||
|
- ノートが存在すること
|
||||||
|
- タグに `lua4frozen` が含まれること
|
||||||
|
- 添付ファイルに `.lua` ファイルが 1 つ以上あること
|
||||||
|
|
||||||
|
条件を満たさない場合はエラー表示になります。
|
||||||
|
|
||||||
|
### Lua ファイル選択
|
||||||
|
|
||||||
|
`.lua` ファイルが複数添付されている場合、実行画面の `Lua file` セレクトで実行対象を選べます。
|
||||||
|
選択された `.lua` の内容を取得して実行します。
|
||||||
|
|
||||||
|
### 添付ファイルの事前読み込み
|
||||||
|
|
||||||
|
実行画面では、添付ファイルのうち次の条件を満たすものをテキストとして事前読み込みします。
|
||||||
|
|
||||||
|
- サイズが `512 KiB` 以下
|
||||||
|
- 拡張子が `.lua`, `.txt`, `.json`, `.csv`
|
||||||
|
|
||||||
|
読み込めない添付ファイルは無視されます。
|
||||||
|
|
||||||
|
## 7. テストランナー
|
||||||
|
|
||||||
|
`/lua4frozen/test` は投稿なしで Lua4Frozen を実行する開発・確認用画面です。
|
||||||
|
|
||||||
|
### 主な機能
|
||||||
|
|
||||||
|
- Lua ソースの編集
|
||||||
|
- サンプルコード読み込み
|
||||||
|
- 実行・停止
|
||||||
|
- 実行ログ表示
|
||||||
|
- Runtime error 表示
|
||||||
|
- Canvas 表示
|
||||||
|
- HTML 出力表示
|
||||||
|
- 仮想ファイルの追加、編集、削除
|
||||||
|
- 仮想キーボードの利用
|
||||||
|
- ユーザー定義キーボードの保存、削除
|
||||||
|
- プログラムからのキーボード配列登録
|
||||||
|
- `.lua` としてダウンロード
|
||||||
|
- ブラウザ内下書き保存
|
||||||
|
|
||||||
|
### サンプル
|
||||||
|
|
||||||
|
現在の実装では次のサンプルがあります。
|
||||||
|
|
||||||
|
- `Bouncing ball`
|
||||||
|
- `Keyboard and mouse`
|
||||||
|
- `Files and audio`
|
||||||
|
|
||||||
|
### ローカル保存
|
||||||
|
|
||||||
|
テストランナーはブラウザの `localStorage` を使います。
|
||||||
|
|
||||||
|
| キー | 用途 |
|
||||||
|
| --- | --- |
|
||||||
|
| `lua4frozen:test:source` | テストランナーの下書き Lua ソース |
|
||||||
|
| `lua4frozen:userKeyboards` | ユーザー定義キーボード配列 |
|
||||||
|
|
||||||
|
## 8. Lua 実行環境
|
||||||
|
|
||||||
|
Lua 実行には `fengari` を使います。
|
||||||
|
ブラウザ内で Lua state を作成し、安全な標準ライブラリだけを開きます。
|
||||||
|
|
||||||
|
### 開かれる標準ライブラリ
|
||||||
|
|
||||||
|
- `_G`
|
||||||
|
- `coroutine`
|
||||||
|
- `table`
|
||||||
|
- `string`
|
||||||
|
- `utf8`
|
||||||
|
- `math`
|
||||||
|
|
||||||
|
### 削除されるグローバル
|
||||||
|
|
||||||
|
安全性のため、次のグローバルは削除されます。
|
||||||
|
|
||||||
|
- `io`
|
||||||
|
- `os`
|
||||||
|
- `package`
|
||||||
|
- `require`
|
||||||
|
- `debug`
|
||||||
|
- `dofile`
|
||||||
|
- `loadfile`
|
||||||
|
|
||||||
|
Lua から外部ネットワークへ直接通信する API は公開されません。
|
||||||
|
|
||||||
|
## 9. 実行ライフサイクル
|
||||||
|
|
||||||
|
実行ボタンを押すと、次の順に処理します。
|
||||||
|
|
||||||
|
1. 既存の実行を停止
|
||||||
|
2. Runtime error とログを初期化
|
||||||
|
3. Drive 読み取り許可状態を `unknown` に戻す
|
||||||
|
4. Canvas を初期化
|
||||||
|
5. Lua state を作成
|
||||||
|
6. 安全な標準ライブラリを開く
|
||||||
|
7. 禁止グローバルを削除
|
||||||
|
8. `ffy` API を登録
|
||||||
|
9. Lua ソースを読み込み
|
||||||
|
10. 初期化コードを実行
|
||||||
|
11. `on_update` と `on_draw` の登録済み関数を取得
|
||||||
|
12. `requestAnimationFrame` でフレームループを開始
|
||||||
|
|
||||||
|
### フレーム処理
|
||||||
|
|
||||||
|
各フレームでは次を実行します。
|
||||||
|
|
||||||
|
1. 前フレームからの経過秒数 `dt` を計算
|
||||||
|
2. `dt` は最大 `0.1` 秒に丸める
|
||||||
|
3. `on_update` 登録関数があれば `dt` を渡して呼ぶ
|
||||||
|
4. `on_draw` 登録関数があれば呼ぶ
|
||||||
|
5. エラーがあれば停止してログに出す
|
||||||
|
|
||||||
|
### 命令数制限
|
||||||
|
|
||||||
|
Lua の実行には hook による命令数制限があります。
|
||||||
|
|
||||||
|
| 処理 | 制限 |
|
||||||
|
| --- | --- |
|
||||||
|
| 初期化コード | `250000` 命令相当 |
|
||||||
|
| `on_update` | `40000` 命令相当 |
|
||||||
|
| `on_draw` | `40000` 命令相当 |
|
||||||
|
|
||||||
|
制限を超えると `Lua instruction limit exceeded` で停止します。
|
||||||
|
|
||||||
|
## 10. グローバル関数
|
||||||
|
|
||||||
|
### `print(...)`
|
||||||
|
|
||||||
|
Lua の `print` は Lua4Frozen のログへ出力されます。
|
||||||
|
複数引数はタブ区切りで結合されます。
|
||||||
|
|
||||||
|
同じ関数は `ffy.print(...)` としても利用できます。
|
||||||
|
|
||||||
|
## 11. `ffy` API
|
||||||
|
|
||||||
|
Lua4Frozen はグローバルに `ffy` テーブルを公開します。
|
||||||
|
|
||||||
|
### `ffy.on_update(fn)`
|
||||||
|
|
||||||
|
毎フレームの更新関数を登録します。
|
||||||
|
関数でない値を渡した場合は無視されます。
|
||||||
|
|
||||||
|
```lua
|
||||||
|
function update(dt)
|
||||||
|
-- dt is seconds
|
||||||
|
end
|
||||||
|
|
||||||
|
ffy.on_update(update)
|
||||||
|
```
|
||||||
|
|
||||||
|
### `ffy.on_draw(fn)`
|
||||||
|
|
||||||
|
毎フレームの描画関数を登録します。
|
||||||
|
関数でない値を渡した場合は無視されます。
|
||||||
|
|
||||||
|
```lua
|
||||||
|
function draw()
|
||||||
|
ffy.gfx.clear("#111827")
|
||||||
|
end
|
||||||
|
|
||||||
|
ffy.on_draw(draw)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 12. `ffy.gfx`
|
||||||
|
|
||||||
|
Canvas 描画 API です。Canvas の内部サイズは `800 x 450` です。
|
||||||
|
|
||||||
|
### `ffy.gfx.size()`
|
||||||
|
|
||||||
|
Canvas の幅と高さを返します。
|
||||||
|
|
||||||
|
```lua
|
||||||
|
w, h = ffy.gfx.size()
|
||||||
|
```
|
||||||
|
|
||||||
|
### `ffy.gfx.color(color)`
|
||||||
|
|
||||||
|
現在の塗り色と線色を設定します。
|
||||||
|
`color` は CanvasRenderingContext2D の色指定として解釈されます。
|
||||||
|
|
||||||
|
```lua
|
||||||
|
ffy.gfx.color("#7dd3fc")
|
||||||
|
```
|
||||||
|
|
||||||
|
### `ffy.gfx.clear(color?)`
|
||||||
|
|
||||||
|
Canvas を消去します。
|
||||||
|
`color` が指定されている場合は、消去後に全体をその色で塗ります。
|
||||||
|
|
||||||
|
```lua
|
||||||
|
ffy.gfx.clear("#111827")
|
||||||
|
ffy.gfx.clear()
|
||||||
|
```
|
||||||
|
|
||||||
|
### `ffy.gfx.rect(x, y, w, h, fill?)`
|
||||||
|
|
||||||
|
矩形を描きます。
|
||||||
|
`fill` が省略または真なら塗り、偽なら線だけです。
|
||||||
|
|
||||||
|
```lua
|
||||||
|
ffy.gfx.rect(40, 40, 160, 80)
|
||||||
|
ffy.gfx.rect(40, 40, 160, 80, false)
|
||||||
|
```
|
||||||
|
|
||||||
|
### `ffy.gfx.circle(x, y, r, fill?)`
|
||||||
|
|
||||||
|
円を描きます。
|
||||||
|
`fill` が省略または真なら塗り、偽なら線だけです。
|
||||||
|
|
||||||
|
```lua
|
||||||
|
ffy.gfx.circle(120, 90, 24)
|
||||||
|
ffy.gfx.circle(120, 90, 24, false)
|
||||||
|
```
|
||||||
|
|
||||||
|
### `ffy.gfx.line(x1, y1, x2, y2)`
|
||||||
|
|
||||||
|
線を描きます。
|
||||||
|
|
||||||
|
```lua
|
||||||
|
ffy.gfx.line(10, 10, 300, 120)
|
||||||
|
```
|
||||||
|
|
||||||
|
### `ffy.gfx.text(text, x, y, size?)`
|
||||||
|
|
||||||
|
テキストを描きます。
|
||||||
|
`size` が未指定の場合は `18px` です。フォントは `sans-serif` です。
|
||||||
|
|
||||||
|
```lua
|
||||||
|
ffy.gfx.text("Hello", 40, 80, 24)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 12.5. `ffy.svg`
|
||||||
|
|
||||||
|
SVG ベクタ表示 API です。SVG レイヤーは Canvas の 1 つ上に重なります。Canvas 描画機能はそのまま利用でき、SVG レイヤーだけを差し替えまたは消去できます。
|
||||||
|
|
||||||
|
### `ffy.svg.set(markup)`
|
||||||
|
|
||||||
|
SVG 全体、または SVG 要素断片を表示します。断片を渡した場合は `viewBox="0 0 800 450"` の `<svg>` に包まれます。
|
||||||
|
|
||||||
|
危険なタグ、イベント属性、外部 URL 参照、`javascript:` 参照は除去されます。
|
||||||
|
|
||||||
|
```lua
|
||||||
|
ffy.svg.set('<circle cx="400" cy="225" r="80" fill="#f472b6" opacity="0.75" />')
|
||||||
|
```
|
||||||
|
|
||||||
|
### `ffy.svg.clear()`
|
||||||
|
|
||||||
|
SVG レイヤーを消去します。
|
||||||
|
|
||||||
|
```lua
|
||||||
|
ffy.svg.clear()
|
||||||
|
```
|
||||||
|
|
||||||
|
## 13. `ffy.input`
|
||||||
|
|
||||||
|
キーボードとマウスの状態を取得します。
|
||||||
|
Canvas にフォーカスがある間、実キーボード入力が反映されます。テストランナーでは仮想キーボード入力も反映されます。
|
||||||
|
|
||||||
|
### `ffy.input.key(name)`
|
||||||
|
|
||||||
|
指定キーが押されているかを返します。
|
||||||
|
キー名は小文字化して比較されます。
|
||||||
|
|
||||||
|
```lua
|
||||||
|
if ffy.input.key("arrowleft") then
|
||||||
|
x = x - 2
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
主なキー名例:
|
||||||
|
|
||||||
|
- `arrowleft`
|
||||||
|
- `arrowright`
|
||||||
|
- `arrowup`
|
||||||
|
- `arrowdown`
|
||||||
|
- `enter`
|
||||||
|
- `escape`
|
||||||
|
- `shift`
|
||||||
|
- `control`
|
||||||
|
- `alt`
|
||||||
|
- `altgraph`
|
||||||
|
- `meta`
|
||||||
|
- `backspace`
|
||||||
|
- `tab`
|
||||||
|
- `delete`
|
||||||
|
- ` `
|
||||||
|
|
||||||
|
### `ffy.input.mouse()`
|
||||||
|
|
||||||
|
マウス状態のテーブルを返します。
|
||||||
|
|
||||||
|
| フィールド | 型 | 内容 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `x` | number | Canvas 内 X 座標 |
|
||||||
|
| `y` | number | Canvas 内 Y 座標 |
|
||||||
|
| `down` | boolean | マウスボタンが押されているか |
|
||||||
|
| `button` | number | MouseEvent の `button` 値 |
|
||||||
|
|
||||||
|
座標は表示サイズではなく `800 x 450` の Canvas 座標へ変換されます。
|
||||||
|
|
||||||
|
## 14. `ffy.html`
|
||||||
|
|
||||||
|
Canvas 下の HTML 出力領域を操作します。
|
||||||
|
|
||||||
|
### `ffy.html.set(html)`
|
||||||
|
|
||||||
|
HTML 文字列を表示します。
|
||||||
|
|
||||||
|
```lua
|
||||||
|
ffy.html.set("<b>Status</b> Ready")
|
||||||
|
```
|
||||||
|
|
||||||
|
表示前にサニタイズされます。
|
||||||
|
削除されるものは次の通りです。
|
||||||
|
|
||||||
|
- `script`
|
||||||
|
- `iframe`
|
||||||
|
- `object`
|
||||||
|
- `embed`
|
||||||
|
- `link`
|
||||||
|
- `meta`
|
||||||
|
- `form`
|
||||||
|
- `on...` イベント属性
|
||||||
|
- `http://`, `https://`, `//` で始まる `src` または `href`
|
||||||
|
|
||||||
|
## 15. `ffy.audio`
|
||||||
|
|
||||||
|
### `ffy.audio.beep(frequency?, duration?)`
|
||||||
|
|
||||||
|
ビープ音を鳴らします。
|
||||||
|
|
||||||
|
| 引数 | 既定値 | 内容 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `frequency` | `440` | 周波数 Hz |
|
||||||
|
| `duration` | `0.12` | 秒数 |
|
||||||
|
|
||||||
|
音量は固定で小さめに設定されます。
|
||||||
|
`duration` は最大 `2` 秒に丸められます。
|
||||||
|
ブラウザの自動再生制限により、ユーザー操作なしでは鳴らない場合があります。
|
||||||
|
|
||||||
|
## 16. `ffy.fs`
|
||||||
|
|
||||||
|
Lua4Frozen のファイル API です。
|
||||||
|
|
||||||
|
### `ffy.fs.read(name)`
|
||||||
|
|
||||||
|
指定名のファイル内容を文字列で返します。
|
||||||
|
存在しない場合は空文字列を返します。
|
||||||
|
|
||||||
|
投稿実行画面では、添付ファイルと許可済み Drive ファイルが対象です。
|
||||||
|
テストランナーでは、仮想ファイルと許可済み Drive ファイルが対象です。
|
||||||
|
|
||||||
|
### `ffy.fs.write(name, content)`
|
||||||
|
|
||||||
|
Drive への保存を試みます。
|
||||||
|
保存前に確認ダイアログが表示されます。未ログインの場合は保存されません。
|
||||||
|
|
||||||
|
保存ファイル名は次の処理を受けます。
|
||||||
|
|
||||||
|
- `\ / : * ? " < > |` を `_` に置換
|
||||||
|
- 最大 120 文字に切り詰め
|
||||||
|
- 空の場合は `lua4frozen.txt`
|
||||||
|
- MIME type は `text/plain`
|
||||||
|
|
||||||
|
`.jsondb`, `.ffdb`, `.db.json` は Lua4Frozen データベースファイルとして扱われます。
|
||||||
|
データベースファイルは Drive ファイルとして保存されますが、Drive 容量ではなく Lua4Frozen データベース容量を使用します。
|
||||||
|
|
||||||
|
### `ffy.fs.list()`
|
||||||
|
|
||||||
|
見えているファイル名を Lua 配列として返します。
|
||||||
|
|
||||||
|
投稿実行画面では添付ファイル名と Drive ファイル名です。
|
||||||
|
テストランナーでは仮想ファイル名と Drive ファイル名です。
|
||||||
|
|
||||||
|
## 17. Drive 連携
|
||||||
|
|
||||||
|
Drive 読み取りは初回 `ffy.fs.read` 時に必要に応じて確認されます。
|
||||||
|
実行 1 回ごとに許可状態は初期化されます。
|
||||||
|
|
||||||
|
### 読み取り対象
|
||||||
|
|
||||||
|
Drive 読み取り許可後、最大 100 件の Drive ファイル一覧を取得します。
|
||||||
|
読み取り対象は次の条件を満たすものです。
|
||||||
|
|
||||||
|
- サイズが `512 KiB` 以下
|
||||||
|
- 拡張子が `.lua`, `.txt`, `.json`, `.csv`, `.jsondb`, `.ffdb`, `.db.json`
|
||||||
|
|
||||||
|
読み取りに失敗したファイルは無視されます。
|
||||||
|
|
||||||
|
### 書き込み対象
|
||||||
|
|
||||||
|
書き込みは Drive へアップロードされます。
|
||||||
|
`ffy.fs.write` はメモリ上の Drive ファイル map も更新するため、同じ実行中に `ffy.fs.read` で読み返せます。
|
||||||
|
|
||||||
|
### データベース容量
|
||||||
|
|
||||||
|
Lua4Frozen データベースファイルは、管理者がコントロールパネルで設定した Lua4Frozen データベース容量を使用します。
|
||||||
|
容量を超えた場合、新規書き込みは拒否されます。Drive 上の古いデータベースファイルを削除して空きを作ると、再び書き込めます。
|
||||||
|
|
||||||
|
## 18. `ffy.db` / `ffy.sql`
|
||||||
|
|
||||||
|
Lua4Frozen データベースファイルは JSON 形式の単純な key-value データベースとして扱われます。
|
||||||
|
|
||||||
|
### `ffy.db.get(name, key)`
|
||||||
|
|
||||||
|
指定した DB ファイルから値を取得します。存在しない場合は空文字列を返します。
|
||||||
|
|
||||||
|
### `ffy.db.set(name, key, value)`
|
||||||
|
|
||||||
|
指定した DB ファイルへ値を書き込みます。`name` に DB 拡張子がない場合は `.jsondb` が補われます。
|
||||||
|
|
||||||
|
### `ffy.db.delete(name, key)`
|
||||||
|
|
||||||
|
指定したキーを削除します。
|
||||||
|
|
||||||
|
### `ffy.db.list(name)`
|
||||||
|
|
||||||
|
指定した DB ファイルのキー一覧を Lua 配列として返します。
|
||||||
|
|
||||||
|
### `ffy.sql.exec(name, sql)`
|
||||||
|
|
||||||
|
簡易 SQL を実行します。対応する構文は次の通りです。
|
||||||
|
|
||||||
|
- `CREATE TABLE ...`
|
||||||
|
- `INSERT INTO table (key, value) VALUES ('key', 'value')`
|
||||||
|
- `SELECT value FROM table WHERE key = 'key'`
|
||||||
|
- `SELECT * FROM table`
|
||||||
|
- `DELETE FROM table WHERE key = 'key'`
|
||||||
|
|
||||||
|
## 19. 仮想キーボード
|
||||||
|
|
||||||
|
テストランナーには画面上の仮想キーボードがあります。
|
||||||
|
仮想キーボードは `ffy.input.key` の入力状態にも反映されます。
|
||||||
|
|
||||||
|
### 標準配列
|
||||||
|
|
||||||
|
現在の標準配列は次の通りです。
|
||||||
|
|
||||||
|
- `jis`
|
||||||
|
- `us-intl`
|
||||||
|
- `uk`
|
||||||
|
- `azerty-fr`
|
||||||
|
- `custom-jis`
|
||||||
|
- `custom-ansi`
|
||||||
|
- `custom-iso`
|
||||||
|
- `custom-azerty`
|
||||||
|
|
||||||
|
`custom-*` は編集用の空配列テンプレートです。
|
||||||
|
|
||||||
|
### 修飾キー
|
||||||
|
|
||||||
|
次のキーは修飾キーとして扱われます。
|
||||||
|
|
||||||
|
- `shift`
|
||||||
|
- `control`
|
||||||
|
- `alt`
|
||||||
|
- `altgraph`
|
||||||
|
- `meta`
|
||||||
|
|
||||||
|
修飾キーはタップ回数で状態を切り替えます。
|
||||||
|
|
||||||
|
| タップ回数 | 状態 |
|
||||||
|
| --- | --- |
|
||||||
|
| 0 | off |
|
||||||
|
| 1 | latched |
|
||||||
|
| 2 | locked |
|
||||||
|
|
||||||
|
通常キーを押すと、latched 状態の修飾キーは消費されます。
|
||||||
|
|
||||||
|
### テキスト挿入
|
||||||
|
|
||||||
|
仮想キーに `text` があり、フォーカス中の要素がテストランナーの Lua エディタである場合、その文字列をエディタへ挿入します。
|
||||||
|
|
||||||
|
## 20. キーボード配列 JSON
|
||||||
|
|
||||||
|
キーボード配列は JSON で定義します。
|
||||||
|
|
||||||
|
### レイアウト形式
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"id": "my-layout",
|
||||||
|
"name": "My Layout",
|
||||||
|
"cols": 16,
|
||||||
|
"rows": [
|
||||||
|
["Esc", "1", "2", { "label": "Backspace", "w": 2 }],
|
||||||
|
[{ "label": "Tab", "w": 2 }, "Q", "W", "E"],
|
||||||
|
[{ "label": "Shift", "w": 2 }, "Z", "X", "C"]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### レイアウトフィールド
|
||||||
|
|
||||||
|
| フィールド | 型 | 内容 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `id` | string | 配列 ID |
|
||||||
|
| `name` | string | 表示名 |
|
||||||
|
| `cols` | number | グリッド列数。`1` から `24` に丸められる |
|
||||||
|
| `rows` | array | キー行の配列 |
|
||||||
|
| `keys` | array | 旧形式。`rows` がない場合に `cols` ごとに行へ変換 |
|
||||||
|
|
||||||
|
### キーフィールド
|
||||||
|
|
||||||
|
キーは文字列またはオブジェクトで指定できます。
|
||||||
|
|
||||||
|
| フィールド | 型 | 内容 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `label` | string | 表示ラベル |
|
||||||
|
| `key` | string | `ffy.input.key` 用のキー名 |
|
||||||
|
| `text` | string | エディタへ挿入する文字 |
|
||||||
|
| `w` | number | 横幅。`1` から `6` に丸められる |
|
||||||
|
| `h` | number | 高さ。`0.5` から `4` に丸められる |
|
||||||
|
|
||||||
|
`key` が未指定の場合は、`label` からキー名が推定されます。
|
||||||
|
`text` が未指定かつ `label` が 1 文字の場合は、その文字が `text` になります。
|
||||||
|
|
||||||
|
## 20. `ffy.keyboard`
|
||||||
|
|
||||||
|
テストランナーでは、Lua プログラムから仮想キーボードを操作できます。
|
||||||
|
投稿実行画面には現在この API はありません。
|
||||||
|
|
||||||
|
### `ffy.keyboard.set_layout_json(name, json)`
|
||||||
|
|
||||||
|
プログラム由来のキーボード配列を登録し、選択します。
|
||||||
|
|
||||||
|
```lua
|
||||||
|
layout = [[
|
||||||
|
{
|
||||||
|
"id": "gamepad",
|
||||||
|
"name": "Gamepad",
|
||||||
|
"cols": 8,
|
||||||
|
"rows": [
|
||||||
|
["ArrowUp"],
|
||||||
|
["ArrowLeft", "ArrowDown", "ArrowRight"]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]]
|
||||||
|
|
||||||
|
ffy.keyboard.set_layout_json("Gamepad", layout)
|
||||||
|
```
|
||||||
|
|
||||||
|
登録された配列の ID は内部的に `program-` が付与されます。
|
||||||
|
|
||||||
|
### `ffy.keyboard.select(id)`
|
||||||
|
|
||||||
|
既存のキーボード配列 ID を選択します。
|
||||||
|
|
||||||
|
```lua
|
||||||
|
ffy.keyboard.select("jis")
|
||||||
|
```
|
||||||
|
|
||||||
|
存在しない ID を指定した場合は何もしません。
|
||||||
|
|
||||||
|
## 21. ログ
|
||||||
|
|
||||||
|
ログは画面上の `Log` に表示されます。
|
||||||
|
最大 200 行まで保持し、超えた分は古い行から削除されます。
|
||||||
|
|
||||||
|
ログに出る主な内容は次の通りです。
|
||||||
|
|
||||||
|
- `print` / `ffy.print` の出力
|
||||||
|
- Runtime error
|
||||||
|
- Drive 読み取り許可・拒否
|
||||||
|
- Drive 書き込み許可・拒否・失敗
|
||||||
|
- 下書き保存
|
||||||
|
- キーボード配列保存・読み込み結果
|
||||||
|
|
||||||
|
## 22. エラー処理
|
||||||
|
|
||||||
|
Lua の読み込み、初期実行、フレーム処理でエラーが起きると、Runtime error 表示とログ出力を行います。
|
||||||
|
フレーム処理中のエラーでは実行を停止します。
|
||||||
|
|
||||||
|
## 23. セキュリティ仕様
|
||||||
|
|
||||||
|
Lua4Frozen はブラウザ内実行であり、以下の制約により危険な操作を抑制します。
|
||||||
|
|
||||||
|
- ファイルシステムの直接アクセス不可
|
||||||
|
- 任意モジュール読み込み不可
|
||||||
|
- `debug` API 不可
|
||||||
|
- OS コマンド実行不可
|
||||||
|
- Lua からの直接ネットワーク不可
|
||||||
|
- Drive 読み取りはユーザー確認が必要
|
||||||
|
- Drive 書き込みは保存ごとにユーザー確認が必要
|
||||||
|
- HTML 出力はサニタイズされる
|
||||||
|
- Lua 命令数制限がある
|
||||||
|
|
||||||
|
## 24. 制限事項
|
||||||
|
|
||||||
|
現行仕様上の制限は次の通りです。
|
||||||
|
|
||||||
|
- Canvas は 2D のみ
|
||||||
|
- Canvas 内部サイズは `800 x 450`
|
||||||
|
- 画像読み込み API はない
|
||||||
|
- 外部 URL 読み込み API はない
|
||||||
|
- 永続ストレージは Drive 書き込みまたはテストランナーの `localStorage` に限られる
|
||||||
|
- 投稿実行画面では仮想キーボード API は使えない
|
||||||
|
- 添付ファイルの事前読み込みはテキスト系拡張子かつ `512 KiB` 以下のみ
|
||||||
|
- Drive 読み取りは同期 XHR を使うため、実行時に一時的に UI が止まる可能性がある
|
||||||
|
|
||||||
|
## 25. 実装ファイル
|
||||||
|
|
||||||
|
この仕様は主に以下の実装に対応しています。
|
||||||
|
|
||||||
|
- [lua4frozen.vue](/home/mihkskhk/ドキュメント/iceshrimp/packages/client/src/pages/lua4frozen.vue)
|
||||||
|
- [lua4frozen-test.vue](/home/mihkskhk/ドキュメント/iceshrimp/packages/client/src/pages/lua4frozen-test.vue)
|
||||||
|
- [lua4frozen-home.vue](/home/mihkskhk/ドキュメント/iceshrimp/packages/client/src/pages/lua4frozen-home.vue)
|
||||||
|
- [lua4frozen-spec.vue](/home/mihkskhk/ドキュメント/iceshrimp/packages/client/src/pages/lua4frozen-spec.vue)
|
||||||
|
- [lua4frozen-keyboards.json](/home/mihkskhk/ドキュメント/iceshrimp/packages/client/src/pages/lua4frozen-keyboards.json)
|
||||||
|
- [lua4frozen-search.ts](/home/mihkskhk/ドキュメント/iceshrimp/packages/backend/src/server/api/endpoints/notes/lua4frozen-search.ts)
|
||||||
|
- [MkNote.vue](/home/mihkskhk/ドキュメント/iceshrimp/packages/client/src/components/MkNote.vue)
|
||||||
@@ -1,3 +1,55 @@
|
|||||||
|
<p><img src="assets/logo.png" alt="Iceshrimp" width="400px"></p>
|
||||||
|
<p><strong>Iceshrimp</strong> is a decentralized and federated social networking service, implementing the <strong>ActivityPub</strong> standard.<br>
|
||||||
|
It was forked from <del>Calckey</del> Firefish (itself a fork of Misskey) in mid-2023, to focus on stability, performance and usability instead of new features.</p>
|
||||||
|
|
||||||
# FrozenFriendsYume
|
# FrozenFriendsYume
|
||||||
|
|
||||||
FrozenFriendsYume : Fork from Iceshrimp.
|
FrozenFriendsYume : forked from Iceshrimp.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
> This project is **not** inactive.
|
||||||
|
>
|
||||||
|
> Most of our current development efforts are going into the Iceshrimp.NET [rewrite](https://iceshrimp.dev/iceshrimp/Iceshrimp.NET) to further our goal of increasing stability and performance.<br/>
|
||||||
|
> This means that Iceshrimp.JS (this project) is only receiving security patches, bug fixes, and parity features. Support is of course still available on the usual channels.
|
||||||
|
>
|
||||||
|
> There is already an easy upgrade path available for existing Iceshrimp instances, though we don't recommend taking it just yet.<br/>
|
||||||
|
> With Iceshrimp.NET getting ever-closer to a stable release, we hope you're just as excited as we are. Check out the [repository](/iceshrimp/Iceshrimp.NET) for more information.
|
||||||
|
|
||||||
|
---
|
||||||
|
- Highlighted changes:
|
||||||
|
- First-class Mastodon client API support
|
||||||
|
- Significantly improved database performance
|
||||||
|
- Options to prune cached remote media automatically
|
||||||
|
- Proper support for split domain deployments, both local and remote
|
||||||
|
- So much more - Read the [changelog](CHANGELOG.md) to get an overview of all changes
|
||||||
|
- Don't like the Web UI? We test our Mastodon-compatible API against the following clients:
|
||||||
|
- [Elk](https://elk.zone), [Phanpy](https://phanpy.social/), [Enafore](https://enafore.social/), [Masto-FE-standalone](https://iceshrimp.dev/iceshrimp/masto-fe-standalone) (Web)
|
||||||
|
- [Mona](https://apps.apple.com/us/app/mona-for-mastodon/id1659154653), [Toot!](https://apps.apple.com/us/app/toot-for-mastodon/id1229021451), [Ice Cubes](https://apps.apple.com/us/app/ice-cubes-for-mastodon/id6444915884), [Tusker](https://apps.apple.com/us/app/tusker/id1498334597), [Feditext](https://github.com/feditext/feditext), [Mastodon](https://apps.apple.com/us/app/mastodon-for-iphone-and-ipad/id1571998974) (iOS)
|
||||||
|
- [Tusky](https://tusky.app/), [Moshidon](https://lucasggamerm.github.io/moshidon/), [Megalodon](https://sk22.github.io/megalodon/), [Mastodon](https://play.google.com/store/apps/details?id=org.joinmastodon.android) (Android)
|
||||||
|
- Project goals:
|
||||||
|
- No-nonsense bug fixes
|
||||||
|
- QoL improvements
|
||||||
|
- Better performance
|
||||||
|
- Change of focus to actual community needs
|
||||||
|
- Prioritization of user choice and configurability
|
||||||
|
- Project anti-goals:
|
||||||
|
- Flashy marketing
|
||||||
|
- Commercialization of any kind
|
||||||
|
- Documentation on installing (and updating) Iceshrimp using:
|
||||||
|
- [Binary packages](https://iceshrimp.dev/iceshrimp/packaging)
|
||||||
|
- [Docker Compose](docs/docker-compose-install.md)
|
||||||
|
- [Manual installation](docs/install.md)
|
||||||
|
- Documentation on migrating from Firefish can be found [here](docs/migrate.md).
|
||||||
|
- Want to sign up at an existing instance?
|
||||||
|
- 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`.
|
||||||
|
- Want to donate to the project?
|
||||||
|
- Our frontend dev (Lilian) needs help paying for healthcare costs. You can contribute [here](https://bunq.me/LilianHealthcare). 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)!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[](https://iceshrimp.dev/iceshrimp/packaging/src/branch/dev/archlinux)
|
||||||
|
[](https://iceshrimp.dev/iceshrimp/-/packages/container/iceshrimp/dev)
|
||||||
|
|||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
# Reporting Security Issues
|
||||||
|
|
||||||
|
## High Security Issues
|
||||||
|
|
||||||
|
If you discover a security issue, which is so high risk, that too much is affected by it, please dont send it over unencrypted communication. You can share your PGP keys with us using security@iceshrimp.dev and after we established a secure communication, send it over E-Mail, or message us using matrix' encrypted private messages at @zotan:161.rocks
|
||||||
|
|
||||||
|
|
||||||
|
This will allow us to assess the risk, and make a fix available before we add a
|
||||||
|
bug report to the Codeberg repository.
|
||||||
|
|
||||||
|
Thanks for helping make Iceshrimp safe for everyone.
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Dependencies: imagick/convert, inkscape
|
||||||
|
# Be sure to check out the submodule before running this
|
||||||
|
crop=branding/prepared/svg-crop
|
||||||
|
svg=branding/prepared/svg
|
||||||
|
png=branding/prepared/png
|
||||||
|
cd "${0%/*}"
|
||||||
|
|
||||||
|
# General assets
|
||||||
|
convert -background "#3B364C" -resize 1600x "$svg/full-light.svg" "logo.png"
|
||||||
|
|
||||||
|
# Client assets
|
||||||
|
cp "$crop/wordmark-white.svg" "../packages/client/assets/welcome-logo.svg"
|
||||||
|
convert -background "#E7EDFF" -resize 1024x "$svg/full-dark.svg" "../packages/client/assets/about-icon-dark.png"
|
||||||
|
convert -background "#3B364C" -resize 1024x "$svg/full-light.svg" "../packages/client/assets/about-icon-light.png"
|
||||||
|
|
||||||
|
# Backend assets
|
||||||
|
convert -background "#E7EDFF" -resize 1024x "$svg/full-dark.svg" "../packages/backend/assets/api-doc.png"
|
||||||
|
convert -background "#E7EDFF" -resize 1024x "$svg/wordmark-dark.svg" "../packages/backend/assets/mail-wordmark.png"
|
||||||
|
convert -background "#3B364C" -resize x750 -gravity center -extent 1024x1024 "$crop/logo-light.svg" "../packages/backend/assets/apple-touch-icon.png"
|
||||||
|
convert -background "#3B364C" -resize x192 -gravity center -extent 192x192 "$svg/logo-light.svg" "../packages/backend/assets/icons/192.png"
|
||||||
|
convert -background "#3B364C" -resize x512 -gravity center -extent 512x512 "$svg/logo-light.svg" "../packages/backend/assets/icons/512.png"
|
||||||
|
convert -background "#3B364C" -resize x480 -gravity center -extent 512x512 "$svg/logo-light.svg" "../packages/backend/assets/icons/maskable.png"
|
||||||
|
convert -background none -resize x512 -gravity center -extent 512x512 "$crop/logo-black.svg" "../packages/backend/assets/icons/monochrome.png"
|
||||||
|
convert \( -background "#3B364C" -resize x750 -gravity center -extent 1024x1024 "$crop/logo-light.svg" \) \( -size 1024x1024 xc:black -fill white -draw "roundRectangle 0,0,1024,1024 128,128" \) -alpha Off -compose CopyOpacity -composite "../packages/backend/assets/splash.png"
|
||||||
|
convert \( -background "#3B364C" -resize x200 -gravity center -extent 256x256 "$crop/logo-light.svg" \) \( -size 256x256 xc:black -fill white -draw "roundRectangle 0,0,256,256 32,32" \) -alpha Off -compose CopyOpacity -composite "../packages/backend/assets/favicon.png"
|
||||||
|
convert \( -background "#3B364C" -resize x200 -gravity center -extent 256x256 "$crop/logo-light.svg" \) \( -size 256x256 xc:black -fill white -draw "roundRectangle 0,0,256,256 32,32" \) -alpha Off -compose CopyOpacity -composite "../packages/backend/assets/favicon.ico"
|
||||||
LFS
BIN
Binary file not shown.
+23
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"$schema": "./.yarn/unplugged/@biomejs-biome-npm-1.3.1-6f9e52cf26/node_modules/@biomejs/biome/configuration_schema.json",
|
||||||
|
"linter": {
|
||||||
|
"enabled": true,
|
||||||
|
"rules": {
|
||||||
|
"recommended": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"formatter": {
|
||||||
|
"ignore": [
|
||||||
|
"packages/iceshrimp-sdk/api-extractor.json",
|
||||||
|
"packages/*/tsconfig.json",
|
||||||
|
"packages/*/built",
|
||||||
|
"packages/*/package-lock.json",
|
||||||
|
"packages/backend/src/server/web/manifest.ts",
|
||||||
|
"packages/backend/built/",
|
||||||
|
"*/model.json",
|
||||||
|
"*.md",
|
||||||
|
"**/tsconfig.json",
|
||||||
|
"*/.yml"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
# Patterns to ignore when building packages.
|
||||||
|
# This supports shell glob matching, relative path matching, and
|
||||||
|
# negation (prefixed with !). Only one pattern per line.
|
||||||
|
.DS_Store
|
||||||
|
# Common VCS dirs
|
||||||
|
.git/
|
||||||
|
.gitignore
|
||||||
|
.bzr/
|
||||||
|
.bzrignore
|
||||||
|
.hg/
|
||||||
|
.hgignore
|
||||||
|
.svn/
|
||||||
|
# Common backup files
|
||||||
|
*.swp
|
||||||
|
*.bak
|
||||||
|
*.tmp
|
||||||
|
*.orig
|
||||||
|
*~
|
||||||
|
# Various IDEs
|
||||||
|
.project
|
||||||
|
.idea/
|
||||||
|
*.tmproj
|
||||||
|
.vscode/
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
apiVersion: v2
|
||||||
|
name: iceshrimp
|
||||||
|
description: A fun, new, open way to experience social media https://iceshrimp.dev
|
||||||
|
|
||||||
|
# A chart can be either an 'application' or a 'library' chart.
|
||||||
|
#
|
||||||
|
# Application charts are a collection of templates that can be packaged into versioned archives
|
||||||
|
# to be deployed.
|
||||||
|
#
|
||||||
|
# Library charts provide useful utilities or functions for the chart developer. They're included as
|
||||||
|
# a dependency of application charts to inject those utilities and functions into the rendering
|
||||||
|
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
|
||||||
|
type: application
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
# Versions are expected to follow Semantic Versioning (https://semver.org/)
|
||||||
|
version: 0.1.4
|
||||||
|
|
||||||
|
# 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
|
||||||
|
# follow Semantic Versioning. They should reflect the version the application is using.
|
||||||
|
# It is recommended to use it with quotes.
|
||||||
|
appVersion: "rc"
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
- name: elasticsearch
|
||||||
|
version: 19.14.1
|
||||||
|
repository: https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami
|
||||||
|
condition: elasticsearch.enabled
|
||||||
|
- name: postgresql
|
||||||
|
version: 13.2.29
|
||||||
|
repository: https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami
|
||||||
|
condition: postgresql.enabled
|
||||||
|
- name: redis
|
||||||
|
version: 18.6.3
|
||||||
|
repository: https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami
|
||||||
|
condition: redis.enabled
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
# iceshrimp
|
||||||
|
|
||||||
|
  
|
||||||
|
|
||||||
|
A fun, new, open way to experience social media https://iceshrimp.dev
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
| Repository | Name | Version |
|
||||||
|
|------------|------|---------|
|
||||||
|
| https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami | elasticsearch | 19.0.1 |
|
||||||
|
| https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami | postgresql | 11.1.3 |
|
||||||
|
| https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami | redis | 16.13.2 |
|
||||||
|
|
||||||
|
## Values
|
||||||
|
|
||||||
|
| Key | Type | Default | Description |
|
||||||
|
|-----|------|---------|-------------|
|
||||||
|
| affinity | object | `{}` | |
|
||||||
|
| autoscaling.enabled | bool | `false` | |
|
||||||
|
| autoscaling.maxReplicas | int | `100` | |
|
||||||
|
| autoscaling.minReplicas | int | `1` | |
|
||||||
|
| autoscaling.targetCPUUtilizationPercentage | int | `80` | |
|
||||||
|
| iceshrimp.allowedPrivateNetworks | list | `[]` | If you want to allow iceshrimp to connect to private ips, enter the cidrs here. |
|
||||||
|
| iceshrimp.clusterLimit | integer | `1` | Number of worker processes per replica |
|
||||||
|
| iceshrimp.deepl.authKey | string | `""` | |
|
||||||
|
| iceshrimp.deepl.isPro | bool | `false` | |
|
||||||
|
| iceshrimp.deepl.managed | bool | `false` | |
|
||||||
|
| iceshrimp.domain | string | `"iceshrimp.local"` | |
|
||||||
|
| iceshrimp.isManagedHosting | bool | `true` | |
|
||||||
|
| iceshrimp.libreTranslate.apiKey | string | `""` | |
|
||||||
|
| iceshrimp.libreTranslate.apiUrl | string | `""` | |
|
||||||
|
| iceshrimp.libreTranslate.managed | bool | `false` | |
|
||||||
|
| iceshrimp.maxNoteLength | integer | `3000` | Max note length |
|
||||||
|
| iceshrimp.objectStorage.access_key | string | `""` | |
|
||||||
|
| iceshrimp.objectStorage.access_secret | string | `""` | |
|
||||||
|
| iceshrimp.objectStorage.baseUrl | string | `""` | |
|
||||||
|
| iceshrimp.objectStorage.bucket | string | `""` | |
|
||||||
|
| iceshrimp.objectStorage.endpoint | string | `""` | |
|
||||||
|
| iceshrimp.objectStorage.managed | bool | `true` | |
|
||||||
|
| iceshrimp.objectStorage.prefix | string | `"files"` | |
|
||||||
|
| iceshrimp.objectStorage.region | string | `""` | |
|
||||||
|
| iceshrimp.reservedUsernames[0] | string | `"root"` | |
|
||||||
|
| iceshrimp.reservedUsernames[1] | string | `"admin"` | |
|
||||||
|
| iceshrimp.reservedUsernames[2] | string | `"administrator"` | |
|
||||||
|
| iceshrimp.reservedUsernames[3] | string | `"me"` | |
|
||||||
|
| iceshrimp.reservedUsernames[4] | string | `"system"` | |
|
||||||
|
| iceshrimp.smtp.from_address | string | `"notifications@example.com"` | |
|
||||||
|
| iceshrimp.smtp.login | string | `""` | |
|
||||||
|
| iceshrimp.smtp.managed | bool | `true` | |
|
||||||
|
| iceshrimp.smtp.password | string | `""` | |
|
||||||
|
| iceshrimp.smtp.port | int | `587` | |
|
||||||
|
| iceshrimp.smtp.server | string | `"smtp.mailgun.org"` | |
|
||||||
|
| 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 |
|
||||||
|
| fullnameOverride | string | `""` | |
|
||||||
|
| image.pullPolicy | string | `"IfNotPresent"` | |
|
||||||
|
| image.repository | string | `"iceshrimp.dev/iceshrimp/iceshrimp"` | |
|
||||||
|
| image.tag | string | `""` | |
|
||||||
|
| imagePullSecrets | list | `[]` | |
|
||||||
|
| ingress.annotations | object | `{}` | |
|
||||||
|
| ingress.className | string | `""` | |
|
||||||
|
| ingress.enabled | bool | `false` | |
|
||||||
|
| ingress.hosts[0].host | string | `"chart-example.local"` | |
|
||||||
|
| ingress.hosts[0].paths[0].path | string | `"/"` | |
|
||||||
|
| ingress.hosts[0].paths[0].pathType | string | `"ImplementationSpecific"` | |
|
||||||
|
| ingress.tls | list | `[]` | |
|
||||||
|
| nameOverride | string | `""` | |
|
||||||
|
| nodeSelector | object | `{}` | |
|
||||||
|
| podAnnotations | object | `{}` | |
|
||||||
|
| podSecurityContext | object | `{}` | |
|
||||||
|
| postgresql.auth.database | string | `"iceshrimp_production"` | |
|
||||||
|
| postgresql.auth.password | string | `""` | |
|
||||||
|
| postgresql.auth.username | string | `"iceshrimp"` | |
|
||||||
|
| postgresql.enabled | bool | `true` | disable if you want to use an existing db; in which case the values below must match those of that external postgres instance |
|
||||||
|
| redis.auth.password | string | `""` | you must set a password; the password generated by the redis chart will be rotated on each upgrade: |
|
||||||
|
| redis.enabled | bool | `true` | |
|
||||||
|
| redis.hostname | string | `""` | |
|
||||||
|
| redis.port | int | `6379` | |
|
||||||
|
| replicaCount | int | `1` | |
|
||||||
|
| resources | object | `{}` | |
|
||||||
|
| securityContext | object | `{}` | |
|
||||||
|
| service.port | int | `80` | |
|
||||||
|
| service.type | string | `"ClusterIP"` | |
|
||||||
|
| serviceAccount.annotations | object | `{}` | |
|
||||||
|
| serviceAccount.create | bool | `true` | |
|
||||||
|
| serviceAccount.name | string | `""` | |
|
||||||
|
| tolerations | list | `[]` | |
|
||||||
|
|
||||||
|
----------------------------------------------
|
||||||
|
Autogenerated from chart metadata using [helm-docs v1.11.0](https://github.com/norwoodj/helm-docs/releases/v1.11.0)
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
1. Get the application URL by running these commands:
|
||||||
|
{{- if .Values.ingress.enabled }}
|
||||||
|
{{- range $host := .Values.ingress.hosts }}
|
||||||
|
{{- range .paths }}
|
||||||
|
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else if contains "NodePort" .Values.service.type }}
|
||||||
|
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "iceshrimp.fullname" . }})
|
||||||
|
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
|
||||||
|
echo http://$NODE_IP:$NODE_PORT
|
||||||
|
{{- else if contains "LoadBalancer" .Values.service.type }}
|
||||||
|
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
|
||||||
|
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "iceshrimp.fullname" . }}'
|
||||||
|
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "iceshrimp.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
|
||||||
|
echo http://$SERVICE_IP:{{ .Values.service.port }}
|
||||||
|
{{- else if contains "ClusterIP" .Values.service.type }}
|
||||||
|
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "iceshrimp.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
|
||||||
|
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
|
||||||
|
echo "Visit http://127.0.0.1:8080 to use your application"
|
||||||
|
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,332 @@
|
|||||||
|
{{/*
|
||||||
|
Expand the name of the chart.
|
||||||
|
*/}}
|
||||||
|
{{- define "iceshrimp.name" -}}
|
||||||
|
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create a default fully qualified app name.
|
||||||
|
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||||
|
If release name contains chart name it will be used as a full name.
|
||||||
|
*/}}
|
||||||
|
{{- define "iceshrimp.fullname" -}}
|
||||||
|
{{- if .Values.fullnameOverride }}
|
||||||
|
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- else }}
|
||||||
|
{{- $name := default .Chart.Name .Values.nameOverride }}
|
||||||
|
{{- if contains $name .Release.Name }}
|
||||||
|
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- else }}
|
||||||
|
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create chart name and version as used by the chart label.
|
||||||
|
*/}}
|
||||||
|
{{- define "iceshrimp.chart" -}}
|
||||||
|
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Common labels
|
||||||
|
*/}}
|
||||||
|
{{- define "iceshrimp.labels" -}}
|
||||||
|
helm.sh/chart: {{ include "iceshrimp.chart" . }}
|
||||||
|
{{ include "iceshrimp.selectorLabels" . }}
|
||||||
|
{{- if .Chart.AppVersion }}
|
||||||
|
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||||
|
{{- end }}
|
||||||
|
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Selector labels
|
||||||
|
*/}}
|
||||||
|
{{- define "iceshrimp.selectorLabels" -}}
|
||||||
|
app.kubernetes.io/name: {{ include "iceshrimp.name" . }}
|
||||||
|
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create the name of the service account to use
|
||||||
|
*/}}
|
||||||
|
{{- define "iceshrimp.serviceAccountName" -}}
|
||||||
|
{{- if .Values.serviceAccount.create }}
|
||||||
|
{{- default (include "iceshrimp.fullname" .) .Values.serviceAccount.name }}
|
||||||
|
{{- else }}
|
||||||
|
{{- default "default" .Values.serviceAccount.name }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create a default fully qualified name for dependent services.
|
||||||
|
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||||
|
*/}}
|
||||||
|
{{- define "iceshrimp.elasticsearch.fullname" -}}
|
||||||
|
{{- printf "%s-%s" .Release.Name "elasticsearch" | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- define "iceshrimp.redis.fullname" -}}
|
||||||
|
{{- printf "%s-%s" .Release.Name "redis" | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- define "iceshrimp.postgresql.fullname" -}}
|
||||||
|
{{- printf "%s-%s" .Release.Name "postgresql" | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
config/default.yml content
|
||||||
|
*/}}
|
||||||
|
{{- define "iceshrimp.configDir.default.yml" -}}
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# iceshrimp configuration
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
# ┌─────┐
|
||||||
|
#───┘ URL └─────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
# Final accessible URL seen by a user.
|
||||||
|
url: "https://{{ .Values.iceshrimp.domain }}/"
|
||||||
|
|
||||||
|
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||||
|
# URL SETTINGS AFTER THAT!
|
||||||
|
|
||||||
|
# ┌───────────────────────┐
|
||||||
|
#───┘ Port and TLS settings └───────────────────────────────────
|
||||||
|
|
||||||
|
#
|
||||||
|
# Misskey requires a reverse proxy to support HTTPS connections.
|
||||||
|
#
|
||||||
|
# +----- https://example.tld/ ------------+
|
||||||
|
# +------+ |+-------------+ +----------------+|
|
||||||
|
# | User | ---> || Proxy (443) | ---> | Misskey (3000) ||
|
||||||
|
# +------+ |+-------------+ +----------------+|
|
||||||
|
# +---------------------------------------+
|
||||||
|
#
|
||||||
|
# You need to set up a reverse proxy. (e.g. nginx)
|
||||||
|
# An encrypted connection with HTTPS is highly recommended
|
||||||
|
# because tokens may be transferred in GET requests.
|
||||||
|
|
||||||
|
# The port that your Misskey server should listen on.
|
||||||
|
port: 3000
|
||||||
|
|
||||||
|
# ┌──────────────────────────┐
|
||||||
|
#───┘ PostgreSQL configuration └────────────────────────────────
|
||||||
|
|
||||||
|
db:
|
||||||
|
{{- if .Values.postgresql.enabled }}
|
||||||
|
host: {{ template "iceshrimp.postgresql.fullname" . }}
|
||||||
|
port: 5432
|
||||||
|
{{- else }}
|
||||||
|
host: {{ .Values.postgresql.postgresqlHostname }}
|
||||||
|
port: {{ .Values.postgresql.postgresqlPort | default 5432 }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
# Database name
|
||||||
|
db: {{ .Values.postgresql.auth.database }}
|
||||||
|
|
||||||
|
# Auth
|
||||||
|
user: {{ .Values.postgresql.auth.username }}
|
||||||
|
pass: {{ .Values.postgresql.auth.password | quote }}
|
||||||
|
|
||||||
|
# Whether disable Caching queries
|
||||||
|
#disableCache: true
|
||||||
|
|
||||||
|
# Extra Connection options
|
||||||
|
#extra:
|
||||||
|
# ssl:
|
||||||
|
# host: localhost
|
||||||
|
# rejectUnauthorized: false
|
||||||
|
|
||||||
|
# ┌─────────────────────┐
|
||||||
|
#───┘ Redis configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
redis:
|
||||||
|
{{- if .Values.redis.enabled }}
|
||||||
|
host: {{ template "iceshrimp.redis.fullname" . }}-master
|
||||||
|
{{- else }}
|
||||||
|
host: {{ required "When the redis chart is disabled .Values.redis.hostname is required" .Values.redis.hostname }}
|
||||||
|
{{- end }}
|
||||||
|
port: {{ .Values.redis.port | default 6379 }}
|
||||||
|
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
||||||
|
pass: {{ .Values.redis.auth.password | quote }}
|
||||||
|
#prefix: example-prefix
|
||||||
|
#db: 1
|
||||||
|
#user: default
|
||||||
|
#tls:
|
||||||
|
# host: localhost
|
||||||
|
# rejectUnauthorized: false
|
||||||
|
|
||||||
|
# ┌─────────────────────┐
|
||||||
|
#───┘ Sonic configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
#sonic:
|
||||||
|
# host: localhost
|
||||||
|
# port: 1491
|
||||||
|
# auth: SecretPassword
|
||||||
|
# collection: notes
|
||||||
|
# bucket: default
|
||||||
|
|
||||||
|
# ┌─────────────────────────────┐
|
||||||
|
#───┘ Elasticsearch configuration └─────────────────────────────
|
||||||
|
|
||||||
|
{{- if .Values.elasticsearch.enabled }}
|
||||||
|
elasticsearch:
|
||||||
|
host: {{ template "mastodon.elasticsearch.fullname" . }}-master-hl
|
||||||
|
port: 9200
|
||||||
|
ssl: false
|
||||||
|
{{- else if .Values.elasticsearch.hostname }}
|
||||||
|
elasticsearch:
|
||||||
|
host: {{ .Values.elasticsearch.hostname | quote }}
|
||||||
|
port: {{ .Values.elasticsearch.port }}
|
||||||
|
ssl: {{ .Values.elasticsearch.ssl }}
|
||||||
|
{{- if .Values.elasticsearch.auth }}
|
||||||
|
user: {{ .Values.elasticsearch.auth.username | quote }}
|
||||||
|
pass: {{ .Values.elasticsearch.auth.password | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
# ┌───────────────┐
|
||||||
|
#───┘ ID generation └───────────────────────────────────────────
|
||||||
|
|
||||||
|
# You can select the ID generation method.
|
||||||
|
# You don't usually need to change this setting, but you can
|
||||||
|
# change it according to your preferences.
|
||||||
|
|
||||||
|
# Available methods:
|
||||||
|
# aid ... Short, Millisecond accuracy
|
||||||
|
# meid ... Similar to ObjectID, Millisecond accuracy
|
||||||
|
# ulid ... Millisecond accuracy
|
||||||
|
# objectid ... This is left for backward compatibility
|
||||||
|
|
||||||
|
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||||
|
# ID SETTINGS AFTER THAT!
|
||||||
|
|
||||||
|
id: 'aid'
|
||||||
|
|
||||||
|
# ┌─────────────────────┐
|
||||||
|
#───┘ Other configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
# Max note length, should be < 8000.
|
||||||
|
maxNoteLength: {{ .Values.iceshrimp.maxNoteLength | default 3000 }}
|
||||||
|
|
||||||
|
# Maximum lenght of an image caption or file comment (default 1500, max 8192)
|
||||||
|
#maxCaptionLength: 1500
|
||||||
|
|
||||||
|
# Reserved usernames that only the administrator can register with
|
||||||
|
reservedUsernames: {{ .Values.iceshrimp.reservedUsernames | toJson }}
|
||||||
|
|
||||||
|
# Whether disable HSTS
|
||||||
|
#disableHsts: true
|
||||||
|
|
||||||
|
# Number of worker processes
|
||||||
|
clusterLimit: {{ .Values.iceshrimp.clusterLimit | default 1 }}
|
||||||
|
|
||||||
|
# Job concurrency per worker
|
||||||
|
# deliverJobConcurrency: 128
|
||||||
|
# inboxJobConcurrency: 16
|
||||||
|
|
||||||
|
# Job rate limiter
|
||||||
|
# deliverJobPerSec: 128
|
||||||
|
# inboxJobPerSec: 16
|
||||||
|
|
||||||
|
# Job attempts
|
||||||
|
# deliverJobMaxAttempts: 12
|
||||||
|
# inboxJobMaxAttempts: 8
|
||||||
|
|
||||||
|
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
||||||
|
#outgoingAddressFamily: ipv4
|
||||||
|
|
||||||
|
# Syslog option
|
||||||
|
#syslog:
|
||||||
|
# host: localhost
|
||||||
|
# port: 514
|
||||||
|
|
||||||
|
# Proxy for HTTP/HTTPS
|
||||||
|
#proxy: http://127.0.0.1:3128
|
||||||
|
|
||||||
|
#proxyBypassHosts: [
|
||||||
|
# 'example.com',
|
||||||
|
# '192.0.2.8'
|
||||||
|
#]
|
||||||
|
|
||||||
|
# Proxy for SMTP/SMTPS
|
||||||
|
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
|
||||||
|
#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4
|
||||||
|
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
|
||||||
|
|
||||||
|
# Media Proxy
|
||||||
|
#mediaProxy: https://example.com/proxy
|
||||||
|
|
||||||
|
# Proxy remote files (default: false)
|
||||||
|
#proxyRemoteFiles: true
|
||||||
|
|
||||||
|
allowedPrivateNetworks: {{ .Values.iceshrimp.allowedPrivateNetworks | toJson }}
|
||||||
|
|
||||||
|
# TWA
|
||||||
|
#twa:
|
||||||
|
# nameSpace: android_app
|
||||||
|
# packageName: tld.domain.twa
|
||||||
|
# sha256CertFingerprints: ['AB:CD:EF']
|
||||||
|
|
||||||
|
# Upload or download file size limits (bytes)
|
||||||
|
#maxFileSize: 262144000
|
||||||
|
|
||||||
|
# Managed hosting settings
|
||||||
|
# !!!!!!!!!!
|
||||||
|
# >>>>>> NORMAL SELF-HOSTERS, STAY AWAY! <<<<<<
|
||||||
|
# >>>>>> YOU DON'T NEED THIS! <<<<<<
|
||||||
|
# !!!!!!!!!!
|
||||||
|
# Each category is optional, but if each item in each category is mandatory!
|
||||||
|
# If you mess this up, that's on you, you've been warned...
|
||||||
|
|
||||||
|
#maxUserSignups: 100
|
||||||
|
isManagedHosting: {{ .Values.iceshrimp.isManagedHosting }}
|
||||||
|
deepl:
|
||||||
|
managed: {{ .Values.iceshrimp.deepl.managed }}
|
||||||
|
authKey: {{ .Values.iceshrimp.deepl.authKey | quote}}
|
||||||
|
isPro: {{ .Values.iceshrimp.deepl.isPro }}
|
||||||
|
|
||||||
|
libreTranslate:
|
||||||
|
managed: {{ .Values.iceshrimp.libreTranslate.managed }}
|
||||||
|
apiUrl: {{ .Values.iceshrimp.libreTranslate.apiUrl | quote }}
|
||||||
|
apiKey: {{ .Values.iceshrimp.libreTranslate.apiKey | quote }}
|
||||||
|
|
||||||
|
email:
|
||||||
|
managed: {{ .Values.iceshrimp.smtp.managed }}
|
||||||
|
address: {{ .Values.iceshrimp.smtp.from_address | quote }}
|
||||||
|
host: {{ .Values.iceshrimp.smtp.server | quote }}
|
||||||
|
port: {{ .Values.iceshrimp.smtp.port }}
|
||||||
|
user: {{ .Values.iceshrimp.smtp.login | quote }}
|
||||||
|
pass: {{ .Values.iceshrimp.smtp.password | quote }}
|
||||||
|
useImplicitSslTls: {{ .Values.iceshrimp.smtp.useImplicitSslTls }}
|
||||||
|
objectStorage:
|
||||||
|
managed: {{ .Values.iceshrimp.objectStorage.managed }}
|
||||||
|
baseUrl: {{ .Values.iceshrimp.objectStorage.baseUrl | quote }}
|
||||||
|
bucket: {{ .Values.iceshrimp.objectStorage.bucket | quote }}
|
||||||
|
prefix: {{ .Values.iceshrimp.objectStorage.prefix | quote }}
|
||||||
|
endpoint: {{ .Values.iceshrimp.objectStorage.endpoint | quote }}
|
||||||
|
region: {{ .Values.iceshrimp.objectStorage.region | quote }}
|
||||||
|
accessKey: {{ .Values.iceshrimp.objectStorage.access_key | quote }}
|
||||||
|
secretKey: {{ .Values.iceshrimp.objectStorage.access_secret | quote }}
|
||||||
|
useSsl: true
|
||||||
|
connnectOverProxy: false
|
||||||
|
setPublicReadOnUpload: true
|
||||||
|
s3ForcePathStyle: true
|
||||||
|
|
||||||
|
# !!!!!!!!!!
|
||||||
|
# >>>>>> AGAIN, NORMAL SELF-HOSTERS, STAY AWAY! <<<<<<
|
||||||
|
# >>>>>> YOU DON'T NEED THIS, ABOVE SETTINGS ARE FOR MANAGED HOSTING ONLY! <<<<<<
|
||||||
|
# !!!!!!!!!!
|
||||||
|
|
||||||
|
# Seriously. Do NOT fill out the above settings if you're self-hosting.
|
||||||
|
# They're much better off being set from the control panel.
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
|
||||||
|
{{- define "iceshrimp.datapvc" -}}
|
||||||
|
{{- default (printf "%s-data-pvc" (include "iceshrimp.fullname" .) ) .Values.iceshrimp.localStorage.claimName }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: {{ include "iceshrimp.fullname" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "iceshrimp.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
{{- if not .Values.autoscaling.enabled }}
|
||||||
|
replicas: {{ .Values.replicaCount }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if .Values.iceshrimp.deploymentStrategy }}
|
||||||
|
strategy:
|
||||||
|
{{- toYaml .Values.iceshrimp.deploymentStrategy | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
{{- include "iceshrimp.selectorLabels" . | nindent 6 }}
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
checksum/secret-config: {{ include ( print $.Template.BasePath "/secret-config.yaml" ) . | sha256sum | quote }}
|
||||||
|
{{- with .Values.podAnnotations }}
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
labels:
|
||||||
|
{{- include "iceshrimp.selectorLabels" . | nindent 8 }}
|
||||||
|
spec:
|
||||||
|
{{- with .Values.imagePullSecrets }}
|
||||||
|
imagePullSecrets:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
serviceAccountName: {{ include "iceshrimp.serviceAccountName" . }}
|
||||||
|
securityContext:
|
||||||
|
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||||
|
volumes:
|
||||||
|
- name: config-volume
|
||||||
|
secret:
|
||||||
|
secretName: {{ template "iceshrimp.fullname" . }}-config
|
||||||
|
- name: data-volume
|
||||||
|
{{- if .Values.iceshrimp.localStorage.enabled }}
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: {{ include "iceshrimp.datapvc" . }}
|
||||||
|
{{- else }}
|
||||||
|
emptyDir:
|
||||||
|
{{- end }}
|
||||||
|
containers:
|
||||||
|
- name: {{ .Chart.Name }}
|
||||||
|
securityContext:
|
||||||
|
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||||
|
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
||||||
|
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||||
|
command:
|
||||||
|
- yarn
|
||||||
|
- run
|
||||||
|
- start
|
||||||
|
env:
|
||||||
|
- name: "NODE_ENV"
|
||||||
|
value: "production"
|
||||||
|
volumeMounts:
|
||||||
|
- name: config-volume
|
||||||
|
mountPath: /iceshrimp/.config
|
||||||
|
- name: data-volume
|
||||||
|
mountPath: /iceshrimp/files
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
containerPort: 3000
|
||||||
|
protocol: TCP
|
||||||
|
startupProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /
|
||||||
|
port: http
|
||||||
|
failureThreshold: 30
|
||||||
|
periodSeconds: 10
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /
|
||||||
|
port: http
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /
|
||||||
|
port: http
|
||||||
|
resources:
|
||||||
|
{{- toYaml .Values.resources | nindent 12 }}
|
||||||
|
{{- with .Values.nodeSelector }}
|
||||||
|
nodeSelector:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.affinity }}
|
||||||
|
affinity:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.tolerations }}
|
||||||
|
tolerations:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
{{- if .Values.autoscaling.enabled }}
|
||||||
|
apiVersion: autoscaling/v2beta1
|
||||||
|
kind: HorizontalPodAutoscaler
|
||||||
|
metadata:
|
||||||
|
name: {{ include "iceshrimp.fullname" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "iceshrimp.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
scaleTargetRef:
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
name: {{ include "iceshrimp.fullname" . }}
|
||||||
|
minReplicas: {{ .Values.autoscaling.minReplicas }}
|
||||||
|
maxReplicas: {{ .Values.autoscaling.maxReplicas }}
|
||||||
|
metrics:
|
||||||
|
{{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
|
||||||
|
- type: Resource
|
||||||
|
resource:
|
||||||
|
name: cpu
|
||||||
|
targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
||||||
|
- type: Resource
|
||||||
|
resource:
|
||||||
|
name: memory
|
||||||
|
targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
{{- if .Values.ingress.enabled -}}
|
||||||
|
{{- $fullName := include "iceshrimp.fullname" . -}}
|
||||||
|
{{- $svcPort := .Values.service.port -}}
|
||||||
|
{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
|
||||||
|
{{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
|
||||||
|
{{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
|
||||||
|
apiVersion: networking.k8s.io/v1beta1
|
||||||
|
{{- else -}}
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
{{- end }}
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: {{ $fullName }}
|
||||||
|
labels:
|
||||||
|
{{- include "iceshrimp.labels" . | nindent 4 }}
|
||||||
|
{{- with .Values.ingress.annotations }}
|
||||||
|
annotations:
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
{{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
|
||||||
|
ingressClassName: {{ .Values.ingress.className }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.ingress.tls }}
|
||||||
|
tls:
|
||||||
|
{{- range .Values.ingress.tls }}
|
||||||
|
- hosts:
|
||||||
|
{{- range .hosts }}
|
||||||
|
- {{ . | quote }}
|
||||||
|
{{- end }}
|
||||||
|
secretName: {{ .secretName }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
rules:
|
||||||
|
{{- range .Values.ingress.hosts }}
|
||||||
|
- host: {{ .host | quote }}
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
{{- range .paths }}
|
||||||
|
- path: {{ .path }}
|
||||||
|
{{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
|
||||||
|
pathType: {{ .pathType }}
|
||||||
|
{{- end }}
|
||||||
|
backend:
|
||||||
|
{{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
|
||||||
|
service:
|
||||||
|
name: {{ $fullName }}
|
||||||
|
port:
|
||||||
|
number: {{ $svcPort }}
|
||||||
|
{{- else }}
|
||||||
|
serviceName: {{ $fullName }}
|
||||||
|
servicePort: {{ $svcPort }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
apiVersion: batch/v1
|
||||||
|
kind: Job
|
||||||
|
metadata:
|
||||||
|
name: {{ include "iceshrimp.fullname" . }}-db-migrate
|
||||||
|
labels:
|
||||||
|
{{- include "iceshrimp.labels" . | nindent 4 }}
|
||||||
|
annotations:
|
||||||
|
"helm.sh/hook": post-install,pre-upgrade
|
||||||
|
"helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
|
||||||
|
"helm.sh/hook-weight": "-2"
|
||||||
|
spec:
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
name: {{ include "iceshrimp.fullname" . }}-db-migrate
|
||||||
|
{{- with .Values.podAnnotations }}
|
||||||
|
annotations:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
restartPolicy: Never
|
||||||
|
{{- with .Values.imagePullSecrets }}
|
||||||
|
imagePullSecrets:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
serviceAccountName: {{ include "iceshrimp.serviceAccountName" . }}
|
||||||
|
securityContext:
|
||||||
|
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||||
|
volumes:
|
||||||
|
- name: config-volume
|
||||||
|
secret:
|
||||||
|
secretName: {{ template "iceshrimp.fullname" . }}-config
|
||||||
|
containers:
|
||||||
|
- name: {{ .Chart.Name }}
|
||||||
|
securityContext:
|
||||||
|
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||||
|
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
||||||
|
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||||
|
command:
|
||||||
|
- yarn
|
||||||
|
- run
|
||||||
|
- migrate
|
||||||
|
env:
|
||||||
|
- name: "NODE_ENV"
|
||||||
|
value: "production"
|
||||||
|
volumeMounts:
|
||||||
|
- name: config-volume
|
||||||
|
mountPath: /iceshrimp/.config
|
||||||
|
{{- with .Values.nodeSelector }}
|
||||||
|
nodeSelector:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.affinity }}
|
||||||
|
affinity:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.tolerations }}
|
||||||
|
tolerations:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
{{- if .Values.iceshrimp.localStorage.enabled }}
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: {{ include "iceshrimp.datapvc" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "iceshrimp.labels" . | nindent 4 }}
|
||||||
|
annotations:
|
||||||
|
{{- .Values.iceshrimp.localStorage.annotations | toYaml | nindent 4}}
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
{{- .Values.iceshrimp.localStorage.accessModes | toYaml | nindent 4 }}
|
||||||
|
volumeMode: Filesystem
|
||||||
|
{{- if .Values.iceshrimp.localStorage.class }}
|
||||||
|
storageClassName: {{ .Values.iceshrimp.localStorage.class }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.iceshrimp.localStorage.volumeName }}
|
||||||
|
volumeName: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .Values.iceshrimp.localStorage.size }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: {{ template "iceshrimp.fullname" . }}-config
|
||||||
|
labels:
|
||||||
|
{{- include "iceshrimp.labels" . | nindent 4 }}
|
||||||
|
type: Opaque
|
||||||
|
data:
|
||||||
|
default.yml: {{ include "iceshrimp.configDir.default.yml" . | b64enc }}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ include "iceshrimp.fullname" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "iceshrimp.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
type: {{ .Values.service.type }}
|
||||||
|
ports:
|
||||||
|
- port: {{ .Values.service.port }}
|
||||||
|
targetPort: http
|
||||||
|
protocol: TCP
|
||||||
|
name: http
|
||||||
|
selector:
|
||||||
|
{{- include "iceshrimp.selectorLabels" . | nindent 4 }}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{{- if .Values.serviceAccount.create -}}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: {{ include "iceshrimp.serviceAccountName" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "iceshrimp.labels" . | nindent 4 }}
|
||||||
|
{{- with .Values.serviceAccount.annotations }}
|
||||||
|
annotations:
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Pod
|
||||||
|
metadata:
|
||||||
|
name: "{{ include "iceshrimp.fullname" . }}-test-connection"
|
||||||
|
labels:
|
||||||
|
{{- include "iceshrimp.labels" . | nindent 4 }}
|
||||||
|
annotations:
|
||||||
|
"helm.sh/hook": test
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: wget
|
||||||
|
image: busybox
|
||||||
|
command: ['wget']
|
||||||
|
args: ['{{ include "iceshrimp.fullname" . }}:{{ .Values.service.port }}']
|
||||||
|
restartPolicy: Never
|
||||||
@@ -0,0 +1,192 @@
|
|||||||
|
# Default values for iceshrimp.
|
||||||
|
# This is a YAML-formatted file.
|
||||||
|
# Declare variables to be passed into your templates.
|
||||||
|
|
||||||
|
replicaCount: 1
|
||||||
|
|
||||||
|
image:
|
||||||
|
repository: iceshrimp.dev/iceshrimp/iceshrimp
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
# Overrides the image tag whose default is the chart appVersion.
|
||||||
|
tag: latest
|
||||||
|
|
||||||
|
iceshrimp:
|
||||||
|
isManagedHosting: true
|
||||||
|
domain: iceshrimp.local
|
||||||
|
|
||||||
|
deepl:
|
||||||
|
managed: false
|
||||||
|
authKey: ""
|
||||||
|
isPro: false
|
||||||
|
|
||||||
|
libreTranslate:
|
||||||
|
managed: false
|
||||||
|
apiUrl: ""
|
||||||
|
apiKey: ""
|
||||||
|
|
||||||
|
smtp:
|
||||||
|
managed: true
|
||||||
|
from_address: notifications@example.com
|
||||||
|
port: 587
|
||||||
|
server: smtp.mailgun.org
|
||||||
|
useImplicitSslTls: false
|
||||||
|
login: ""
|
||||||
|
password: ""
|
||||||
|
|
||||||
|
objectStorage:
|
||||||
|
managed: true
|
||||||
|
access_key: ""
|
||||||
|
access_secret: ""
|
||||||
|
baseUrl: "" # e.g. "https://my-bucket.nyc3.cdn.digitaloceanspaces.com"
|
||||||
|
bucket: "" # e.g. "my-bucket"
|
||||||
|
prefix: files
|
||||||
|
endpoint: "" # e.g. "nyc3.digitaloceanspaces.com:443"
|
||||||
|
region: "" # e.g. "nyc3"
|
||||||
|
|
||||||
|
localStorage:
|
||||||
|
enabled: true
|
||||||
|
claimName: null
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteMany
|
||||||
|
labels: {}
|
||||||
|
class:
|
||||||
|
annotations:
|
||||||
|
helm.sh/resource-policy: keep
|
||||||
|
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.
|
||||||
|
allowedPrivateNetworks: []
|
||||||
|
# - "10.0.0.0/8"
|
||||||
|
|
||||||
|
reservedUsernames:
|
||||||
|
- root
|
||||||
|
- admin
|
||||||
|
- administrator
|
||||||
|
- me
|
||||||
|
- system
|
||||||
|
|
||||||
|
# Number of worker processes per replica
|
||||||
|
clusterLimit: 1
|
||||||
|
|
||||||
|
# Max note length
|
||||||
|
maxNoteLength: 3000
|
||||||
|
|
||||||
|
# https://github.com/bitnami/charts/tree/master/bitnami/postgresql#parameters
|
||||||
|
postgresql:
|
||||||
|
# -- disable if you want to use an existing db; in which case the values below
|
||||||
|
# must match those of that external postgres instance
|
||||||
|
enabled: true
|
||||||
|
# postgresqlHostname: preexisting-postgresql
|
||||||
|
# postgresqlPort: 5432
|
||||||
|
auth:
|
||||||
|
database: iceshrimp_production
|
||||||
|
username: iceshrimp
|
||||||
|
# you must set a password; the password generated by the postgresql chart will
|
||||||
|
# be rotated on each upgrade:
|
||||||
|
# https://github.com/bitnami/charts/tree/master/bitnami/postgresql#upgrade
|
||||||
|
password: ""
|
||||||
|
|
||||||
|
# https://github.com/bitnami/charts/tree/master/bitnami/redis#parameters
|
||||||
|
redis:
|
||||||
|
# disable if you want to use an existing redis instance; in which case the
|
||||||
|
# values below must match those of that external redis instance
|
||||||
|
enabled: true
|
||||||
|
hostname: ""
|
||||||
|
port: 6379
|
||||||
|
auth:
|
||||||
|
# -- you must set a password; the password generated by the redis chart will be
|
||||||
|
# rotated on each upgrade:
|
||||||
|
password: ""
|
||||||
|
|
||||||
|
# -- https://github.com/bitnami/charts/tree/master/bitnami/elasticsearch#parameters
|
||||||
|
elasticsearch:
|
||||||
|
# disable if you want to use an existing redis instance; in which case the
|
||||||
|
# values below must match those of that external elasticsearch instance
|
||||||
|
enabled: false
|
||||||
|
hostname: ""
|
||||||
|
port: 9200
|
||||||
|
ssl: false
|
||||||
|
auth: {}
|
||||||
|
# username: ""
|
||||||
|
# password: ""
|
||||||
|
# @ignored
|
||||||
|
image:
|
||||||
|
tag: 7
|
||||||
|
|
||||||
|
imagePullSecrets: []
|
||||||
|
nameOverride: ""
|
||||||
|
fullnameOverride: ""
|
||||||
|
|
||||||
|
serviceAccount:
|
||||||
|
# Specifies whether a service account should be created
|
||||||
|
create: true
|
||||||
|
# Annotations to add to the service account
|
||||||
|
annotations: {}
|
||||||
|
# The name of the service account to use.
|
||||||
|
# If not set and create is true, a name is generated using the fullname template
|
||||||
|
name: ""
|
||||||
|
|
||||||
|
podAnnotations: {}
|
||||||
|
|
||||||
|
podSecurityContext: {}
|
||||||
|
# fsGroup: 2000
|
||||||
|
|
||||||
|
securityContext: {}
|
||||||
|
# capabilities:
|
||||||
|
# drop:
|
||||||
|
# - ALL
|
||||||
|
# readOnlyRootFilesystem: true
|
||||||
|
# runAsNonRoot: true
|
||||||
|
# runAsUser: 1000
|
||||||
|
|
||||||
|
service:
|
||||||
|
type: ClusterIP
|
||||||
|
port: 80
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
enabled: false
|
||||||
|
className: ""
|
||||||
|
annotations: {}
|
||||||
|
# kubernetes.io/ingress.class: nginx
|
||||||
|
# kubernetes.io/tls-acme: "true"
|
||||||
|
hosts:
|
||||||
|
- host: chart-example.local
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: ImplementationSpecific
|
||||||
|
tls: []
|
||||||
|
# - secretName: chart-example-tls
|
||||||
|
# hosts:
|
||||||
|
# - chart-example.local
|
||||||
|
|
||||||
|
resources: {}
|
||||||
|
# We usually recommend not to specify default resources and to leave this as a conscious
|
||||||
|
# choice for the user. This also increases chances charts run on environments with little
|
||||||
|
# resources, such as Minikube. If you do want to specify resources, uncomment the following
|
||||||
|
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
|
||||||
|
# limits:
|
||||||
|
# cpu: 100m
|
||||||
|
# memory: 128Mi
|
||||||
|
# requests:
|
||||||
|
# cpu: 100m
|
||||||
|
# memory: 128Mi
|
||||||
|
|
||||||
|
autoscaling:
|
||||||
|
enabled: false
|
||||||
|
minReplicas: 1
|
||||||
|
maxReplicas: 100
|
||||||
|
targetCPUUtilizationPercentage: 80
|
||||||
|
# targetMemoryUtilizationPercentage: 80
|
||||||
|
|
||||||
|
nodeSelector: {}
|
||||||
|
|
||||||
|
tolerations: []
|
||||||
|
|
||||||
|
affinity: {}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
Copyright 2023 The Iceshrimp contributors
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
/*
|
||||||
|
* !!! WARNING !!!
|
||||||
|
* Editing this file may cause your instance to break for EVERYONE.
|
||||||
|
* Please know what you're doing and test it out with regular user custom CSS.
|
||||||
|
* With that said, GLHF!
|
||||||
|
* This may eventuallly be replaced with a function in the admin panel.
|
||||||
|
*/
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: iceshrimp.dev/iceshrimp/iceshrimp:dev
|
||||||
|
build: ..
|
||||||
|
container_name: iceshrimp_web
|
||||||
|
restart: always
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- redis
|
||||||
|
# - es
|
||||||
|
ports:
|
||||||
|
- "3000:3000"
|
||||||
|
networks:
|
||||||
|
- network
|
||||||
|
# - web
|
||||||
|
volumes:
|
||||||
|
- ../files:/iceshrimp/files
|
||||||
|
- ../.config:/iceshrimp/.config:ro
|
||||||
|
|
||||||
|
redis:
|
||||||
|
restart: always
|
||||||
|
container_name: iceshrimp_redis
|
||||||
|
image: docker.io/valkey/valkey:7-alpine
|
||||||
|
networks:
|
||||||
|
- network
|
||||||
|
volumes:
|
||||||
|
- ../redis:/data
|
||||||
|
|
||||||
|
db:
|
||||||
|
restart: always
|
||||||
|
image: docker.io/postgres:12.2-alpine
|
||||||
|
container_name: iceshrimp_db
|
||||||
|
networks:
|
||||||
|
- network
|
||||||
|
env_file:
|
||||||
|
- ../.config/docker.env
|
||||||
|
volumes:
|
||||||
|
- ../db:/var/lib/postgresql/data
|
||||||
|
|
||||||
|
# es:
|
||||||
|
# restart: always
|
||||||
|
# image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.2
|
||||||
|
# environment:
|
||||||
|
# - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
|
||||||
|
# - "TAKE_FILE_OWNERSHIP=111"
|
||||||
|
# networks:
|
||||||
|
# - network
|
||||||
|
# volumes:
|
||||||
|
# - ./elasticsearch:/usr/share/elasticsearch/data
|
||||||
|
|
||||||
|
networks:
|
||||||
|
network:
|
||||||
|
# web:
|
||||||
|
# external:
|
||||||
|
# name: web
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
# API Documentation
|
||||||
|
|
||||||
|
You can find interactive API documentation at any Iceshrimp instance. https://iceshrimp.social/api-doc
|
||||||
|
|
||||||
|
You can also find auto-generated documentation for iceshrimp-sdk [here](../packages/iceshrimp-sdk/markdown/iceshrimp-sdk.md).
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
# Installing Iceshrimp with Docker
|
||||||
|
|
||||||
|
This guide is based on `docker compose`/Docker Compose v2, but `docker-compose`/Docker Compose v1 should work as well. Docker 20.10+ is required for building your own images because of BuildKit usage, and Docker 20.10 users need to [enable BuildKit first](https://docs.docker.com/build/buildkit/#getting-started), or [upgrade to latest Docker](https://docs.docker.com/engine/install/#server).
|
||||||
|
|
||||||
|
## Preparations
|
||||||
|
|
||||||
|
### Getting needed files
|
||||||
|
|
||||||
|
If you want to use the prebuilt images:
|
||||||
|
```sh
|
||||||
|
GIT_LFS_SKIP_SMUDGE=1 git clone https://iceshrimp.dev/iceshrimp/iceshrimp.git --depth=1
|
||||||
|
```
|
||||||
|
|
||||||
|
If you want to build your own images (make sure to install `git-lfs` and to run `git lfs install` before running the command):
|
||||||
|
```sh
|
||||||
|
git clone https://iceshrimp.dev/iceshrimp/iceshrimp.git
|
||||||
|
```
|
||||||
|
|
||||||
|
### docker-compose.yml
|
||||||
|
|
||||||
|
First, run `cp docs/examples/docker-compose.yml docker-compose.yml`, and edit `docker-compose.yml` if you want to build the image yourself or choose a [different tag](https://iceshrimp.dev/iceshrimp/-/packages/container/iceshrimp/versions)
|
||||||
|
|
||||||
|
### .config
|
||||||
|
|
||||||
|
Run `cp .config/docker_example.env .config/docker.env`, and edit `.config/docker.env` and fill it with the database credentials you want.
|
||||||
|
Run `cp .config/example-docker.yml .config/default.yml`, and edit `.config/default.yml`
|
||||||
|
- Replace example database credentials with the ones you entered in `.config/docker.env`
|
||||||
|
- Change other configuration
|
||||||
|
|
||||||
|
If you are running Iceshrimp on a system with more than one CPU thread, you might want to set the `clusterLimit` config option to about half of your thread count, depending on your system configuration. Please note that each worker requires around 10 PostgreSQL connections, so be sure to set `max_connections` appropriately. To do this with docker-compose, add `args: ["-c", "max_connections=n"]` to the `db:` section of `docker-compose.yml`, with `n` being `(10 * no_workers) + 10`.
|
||||||
|
|
||||||
|
## Installation and first start
|
||||||
|
|
||||||
|
Choose a method, whether you chose to build the image yourself or not.
|
||||||
|
Note: Ctrl-C will shut down Iceshrimp gracefully.
|
||||||
|
|
||||||
|
### Pulling the image
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker compose pull
|
||||||
|
docker compose up
|
||||||
|
```
|
||||||
|
|
||||||
|
### Building the image
|
||||||
|
|
||||||
|
Depending on your machine specs, this can take well over 30 minutes
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker compose build
|
||||||
|
docker compose up
|
||||||
|
```
|
||||||
|
|
||||||
|
## Starting Iceshrimp automatically
|
||||||
|
|
||||||
|
Run `docker compose up -d` and Iceshrimp will start automatically on boot.
|
||||||
|
|
||||||
|
## Updating Iceshrimp
|
||||||
|
|
||||||
|
### Pulling the image
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker compose pull
|
||||||
|
docker compose down
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### Building the image
|
||||||
|
|
||||||
|
```sh
|
||||||
|
## Run git stash commands only if you have uncommitted changes
|
||||||
|
git stash
|
||||||
|
git pull
|
||||||
|
git stash pop
|
||||||
|
docker compose build
|
||||||
|
docker compose down
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
## Post-install
|
||||||
|
|
||||||
|
See [post-install](post-install.md).
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
# 🐳 Running a Iceshrimp server with Docker
|
||||||
|
|
||||||
|
## Pre-built docker container
|
||||||
|
[iceshrimp/iceshrimp](iceshrimp.dev/iceshrimp/iceshrimp)
|
||||||
|
|
||||||
|
## `docker-compose`
|
||||||
|
|
||||||
|
There is a `docker-compose.yml` in the root of the project that you can use to build the container from source
|
||||||
|
|
||||||
|
- .config/docker.env (**db config settings**)
|
||||||
|
- .config/default.yml (**Iceshrimp server settings**)
|
||||||
|
|
||||||
|
## Configuring
|
||||||
|
|
||||||
|
Rename the files:
|
||||||
|
|
||||||
|
`cp .config/example.yml .config/default.yml`
|
||||||
|
|
||||||
|
`cp .config/example.env .config/docker.env`
|
||||||
|
|
||||||
|
then edit them according to your environment.
|
||||||
|
You can configure `docker.env` with anything you like, but you will have to pay attention to the `default.yml` file:
|
||||||
|
- `url` should be set to the URL you will be hosting the web interface for the server at.
|
||||||
|
- `host`, `db`, `user`, `pass` will have to be configured in the `PostgreSQL configuration` section - `host` is the name of the postgres container (eg: *iceshrimp_db_1*), and the others should match your `docker.env`.
|
||||||
|
- `host`will need to be configured in the *Redis configuration* section - it is the name of the redis container (eg: *iceshrimp_redis_1*)
|
||||||
|
- `auth` will need to be configured in the *Sonic* section - cannot be the default `SecretPassword`
|
||||||
|
|
||||||
|
Everything else can be left as-is.
|
||||||
|
|
||||||
|
## Running docker-compose
|
||||||
|
|
||||||
|
The [prebuilt container for iceshrimp](https://iceshrimp.dev/iceshrimp/-/packages/container/iceshrimp/latest) is fairly large, and may take a few minutes to download and extract using docker.
|
||||||
|
|
||||||
|
Copy `docker-compose.yml` and the `config/` to a directory, then run the **docker-compose** command:
|
||||||
|
`docker-compose up -d`.
|
||||||
|
|
||||||
|
NOTE: This will take some time to come fully online, even after download and extracting the container images, and it may emit some error messages before completing successfully. Specifically, the `db` container needs to initialize and so isn't available to the `web` container right away. Only once the `db` container comes online does the `web` container start building and initializing the Iceshrimp tables.
|
||||||
|
|
||||||
|
Once the server is up you can use a web browser to access the web interface at `http://serverip:3000` (where `serverip` is the IP of the server you are running the Iceshrimp server on).
|
||||||
|
|
||||||
|
## Docker for development
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd dev/
|
||||||
|
docker-compose build
|
||||||
|
docker-compose run --rm web pnpm run init
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Iceshrimp PostgreSQL container
|
||||||
|
[Container]
|
||||||
|
Image=docker.io/postgres:15-alpine
|
||||||
|
ContainerName=iceshrimp_db
|
||||||
|
HostName=db
|
||||||
|
Network=iceshrimp.network
|
||||||
|
EnvironmentFile=%h/services/iceshrimp/.config/docker.env
|
||||||
|
Volume=%h/services/iceshrimp/db:/var/lib/postgresql/data:Z
|
||||||
|
[Service]
|
||||||
|
Restart=on-failure
|
||||||
|
TimeoutStartSec=900
|
||||||
|
[Install]
|
||||||
|
WantedBy=iceshrimp-web.service
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Iceshrimp Redis container
|
||||||
|
[Container]
|
||||||
|
Image=docker.io/redis:7.0-alpine
|
||||||
|
ContainerName=iceshrimp_redis
|
||||||
|
HostName=redis
|
||||||
|
Network=iceshrimp.network
|
||||||
|
Volume=%h/services/iceshrimp/redis:/data:Z
|
||||||
|
[Service]
|
||||||
|
Restart=on-failure
|
||||||
|
TimeoutStartSec=900
|
||||||
|
[Install]
|
||||||
|
WantedBy=iceshrimp-web.service
|
||||||
|
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Iceshrimp container
|
||||||
|
[Container]
|
||||||
|
Image=iceshrimp.dev/iceshrimp/iceshrimp:latest
|
||||||
|
ContainerName=iceshrimp_web
|
||||||
|
HostName=web
|
||||||
|
PublishPort=3000:3000
|
||||||
|
Network=iceshrimp.network
|
||||||
|
Environment=NODE_ENV=production
|
||||||
|
Volume=%h/services/iceshrimp/files:/iceshrimp/files:z
|
||||||
|
Volume=%h/services/iceshrimp/.config:/iceshrimp/.config:ro,z
|
||||||
|
[Service]
|
||||||
|
Restart=on-failure
|
||||||
|
TimeoutStartSec=900
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target default.target
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[Network]
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
if [ -d $HOME/.config/containers/systemd ]; then
|
||||||
|
mkdir -pv $(grep -F "Volume=" $HOME/.config/containers/systemd/iceshrimp-*.container | sed "s|%h|$HOME|g" | cut -d= -f2 | cut -d: -f1);
|
||||||
|
|
||||||
|
db_env=$(grep -F "EnvironmentFile=" $HOME/.config/containers/systemd/iceshrimp-db.container | sed "s|%h|$HOME|g" | cut -d= -f2)
|
||||||
|
config_dir=$(grep -F ":/iceshrimp/.config" $HOME/.config/containers/systemd/iceshrimp-web.container | sed "s|%h|$HOME|g" | cut -d= -f2 | cut -d: -f1)
|
||||||
|
|
||||||
|
if [ ! -f $config_dir/docker_example.env ]; then
|
||||||
|
wget -O $db_env \
|
||||||
|
https://iceshrimp.dev/iceshrimp/iceshrimp/raw/branch/dev/.config/docker_example.env;
|
||||||
|
else
|
||||||
|
cp -v $config_dir/docker_example.env $db_env;
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f $config_dir/example-docker.yml ]; then
|
||||||
|
wget -O $config_dir/default.yml \
|
||||||
|
https://iceshrimp.dev/iceshrimp/iceshrimp/raw/branch/dev/.config/example-docker.yml;
|
||||||
|
else
|
||||||
|
cp $config_dir/example-docker.yml $config_dir/default.yml
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "No $HOME/.config/containers/systemd found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: iceshrimp.dev/iceshrimp/iceshrimp:dev
|
||||||
|
### If you want to build the image locally
|
||||||
|
# build: .
|
||||||
|
### If you want to build the image locally AND use Docker 20.10
|
||||||
|
# build:
|
||||||
|
# context: .
|
||||||
|
# args:
|
||||||
|
# DOCKER_BUILDKIT: 1
|
||||||
|
container_name: iceshrimp_web
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- redis
|
||||||
|
ports:
|
||||||
|
- "3000:3000"
|
||||||
|
networks:
|
||||||
|
- ishnet
|
||||||
|
# - web
|
||||||
|
environment:
|
||||||
|
NODE_ENV: production
|
||||||
|
volumes:
|
||||||
|
- ./files:/iceshrimp/files
|
||||||
|
- ./.config:/iceshrimp/.config:ro
|
||||||
|
|
||||||
|
redis:
|
||||||
|
restart: unless-stopped
|
||||||
|
image: docker.io/valkey/valkey:7-alpine
|
||||||
|
container_name: iceshrimp_redis
|
||||||
|
networks:
|
||||||
|
- ishnet
|
||||||
|
volumes:
|
||||||
|
- ./redis:/data
|
||||||
|
|
||||||
|
db:
|
||||||
|
restart: unless-stopped
|
||||||
|
image: docker.io/postgres:16-alpine
|
||||||
|
container_name: iceshrimp_db
|
||||||
|
networks:
|
||||||
|
- ishnet
|
||||||
|
env_file:
|
||||||
|
- .config/docker.env
|
||||||
|
volumes:
|
||||||
|
- ./db:/var/lib/postgresql/data
|
||||||
|
|
||||||
|
networks:
|
||||||
|
ishnet:
|
||||||
|
# web:
|
||||||
|
# external:
|
||||||
|
# name: web
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
# Replace example.com with your domain
|
||||||
|
|
||||||
|
<VirtualHost *:80>
|
||||||
|
ServerName example.com
|
||||||
|
# For WebSocket
|
||||||
|
ProxyPass "/streaming" "ws://127.0.0.1:3000/streaming/"
|
||||||
|
# Proxy to Node
|
||||||
|
ProxyPass "/" "http://127.0.0.1:3000/"
|
||||||
|
ProxyPassReverse "/" "http://127.0.0.1:3000/"
|
||||||
|
ProxyPreserveHost On
|
||||||
|
# For files proxy
|
||||||
|
AllowEncodedSlashes On
|
||||||
|
</VirtualHost>
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
# Replace example.com with your domain
|
||||||
|
|
||||||
|
# For WebSocket
|
||||||
|
map $http_upgrade $connection_upgrade {
|
||||||
|
default upgrade;
|
||||||
|
'' close;
|
||||||
|
}
|
||||||
|
|
||||||
|
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=cache1:16m max_size=1g inactive=720m use_temp_path=off;
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
server_name example.com;
|
||||||
|
|
||||||
|
# For SSL domain validation
|
||||||
|
root /var/www/html;
|
||||||
|
location /.well-known/acme-challenge/ { allow all; }
|
||||||
|
location /.well-known/pki-validation/ { allow all; }
|
||||||
|
location / { return 301 https://$server_name$request_uri; }
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl http2;
|
||||||
|
listen [::]:443 ssl http2;
|
||||||
|
server_name example.com;
|
||||||
|
|
||||||
|
ssl_session_timeout 1d;
|
||||||
|
ssl_session_cache shared:ssl_session_cache:10m;
|
||||||
|
ssl_session_tickets off;
|
||||||
|
|
||||||
|
# To use Let's Encrypt certificate
|
||||||
|
ssl_certificate /etc/letsencrypt/live/example.tld/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/example.tld/privkey.pem;
|
||||||
|
|
||||||
|
# To use Debian/Ubuntu's self-signed certificate (For testing or before issuing a certificate)
|
||||||
|
#ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
|
||||||
|
#ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
|
||||||
|
|
||||||
|
# SSL protocol settings
|
||||||
|
ssl_protocols TLSv1.2 TLSv1.3;
|
||||||
|
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
|
||||||
|
ssl_prefer_server_ciphers off;
|
||||||
|
ssl_stapling on;
|
||||||
|
ssl_stapling_verify on;
|
||||||
|
|
||||||
|
# Change to your upload limit
|
||||||
|
client_max_body_size 80m;
|
||||||
|
|
||||||
|
# Gzip compression
|
||||||
|
gzip on;
|
||||||
|
gzip_proxied any;
|
||||||
|
gzip_comp_level 6;
|
||||||
|
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript application/activity+json application/atom+xml;
|
||||||
|
|
||||||
|
# Proxy to Node
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:3000;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_redirect off;
|
||||||
|
|
||||||
|
# If it's behind another reverse proxy or CDN, remove the following.
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto https;
|
||||||
|
|
||||||
|
# For WebSocket
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection $connection_upgrade;
|
||||||
|
|
||||||
|
# Cache settings
|
||||||
|
proxy_cache cache1;
|
||||||
|
proxy_cache_lock on;
|
||||||
|
proxy_cache_use_stale updating;
|
||||||
|
add_header X-Cache $upstream_cache_status;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Iceshrimp daemon
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=iceshrimp
|
||||||
|
ExecStart=/usr/bin/yarn start
|
||||||
|
WorkingDirectory=/home/iceshrimp/iceshrimp
|
||||||
|
Environment="NODE_ENV=production"
|
||||||
|
TimeoutSec=60
|
||||||
|
SyslogIdentifier=iceshrimp
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
diff --git a/packages/backend/built/services/chart/core.js b/packages/backend/built/services/chart/core.js
|
||||||
|
index 000b2f7..33d4031 100644
|
||||||
|
--- a/packages/backend/built/services/chart/core.js
|
||||||
|
+++ b/packages/backend/built/services/chart/core.js
|
||||||
|
@@ -3,7 +3,6 @@
|
||||||
|
*
|
||||||
|
* Tests located in test/chart
|
||||||
|
*/ import { db } from "../../db/postgre.js";
|
||||||
|
-import { getChartInsertLock } from "../../misc/app-lock.js";
|
||||||
|
import { addTime, dateUTC, isTimeBefore, isTimeSame, subtractTime } from "../../prelude/time.js";
|
||||||
|
import * as nestedProperty from "nested-property";
|
||||||
|
import promiseLimit from "promise-limit";
|
||||||
|
@@ -224,6 +223,7 @@ export function getJsonSchema(schema) {
|
||||||
|
}
|
||||||
|
const date = Chart.dateToTimestamp(current);
|
||||||
|
const lockKey = group ? `${this.name}:${date}:${span}:${group}` : `${this.name}:${date}:${span}`;
|
||||||
|
+ const { getChartInsertLock } = await import("../../misc/app-lock.js");
|
||||||
|
const lock = await getChartInsertLock(lockKey);
|
||||||
|
try {
|
||||||
|
// ロック内でもう1回チェックする
|
||||||
|
diff --git a/packages/backend/built/db/postgre.js b/packages/backend/built/db/postgre.js
|
||||||
|
index 81d6238..a133c02 100644
|
||||||
|
--- a/packages/backend/built/db/postgre.js
|
||||||
|
+++ b/packages/backend/built/db/postgre.js
|
||||||
|
@@ -71,7 +71,6 @@ import { User } from "../models/entities/user.js";
|
||||||
|
import { Webhook } from "../models/entities/webhook.js";
|
||||||
|
import { entities as charts } from "../services/chart/entities.js";
|
||||||
|
import { dbLogger } from "./logger.js";
|
||||||
|
-import { redisClient } from "./redis.js";
|
||||||
|
// TODO?: should we avoid importing things from built directory?
|
||||||
|
import { nativeInitDatabase } from "native-utils/built/index.js";
|
||||||
|
const sqlLogger = dbLogger.createSubLogger("sql", "gray", false);
|
||||||
|
@@ -221,6 +220,8 @@ export async function initDb(force = false) {
|
||||||
|
}
|
||||||
|
export async function resetDb() {
|
||||||
|
const reset = async ()=>{
|
||||||
|
+ const { redisClient } = await import("./redis.js");
|
||||||
|
+
|
||||||
|
await redisClient.flushdb();
|
||||||
|
const tables = await db.query(`SELECT relname AS "table"
|
||||||
|
FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
diff --git a/packages/backend/migration/1661376843000-remove-mentioned-remote-users-column.js b/packages/backend/migration/1661376843000-remove-mentioned-remote-users-column.js
|
||||||
|
index 42d79b5b5..1fd5e0f10 100644
|
||||||
|
--- a/packages/backend/migration/1661376843000-remove-mentioned-remote-users-column.js
|
||||||
|
+++ b/packages/backend/migration/1661376843000-remove-mentioned-remote-users-column.js
|
||||||
|
@@ -7,6 +7,22 @@ export class removeMentionedRemoteUsersColumn1661376843000 {
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" ADD "mentionedRemoteUsers" TEXT NOT NULL DEFAULT '[]'::text`);
|
||||||
|
- await queryRunner.query(`UPDATE "note" SET "mentionedRemoteUsers" = (SELECT COALESCE(json_agg(row_to_json("data"))::text, '[]') FROM (SELECT "url", "uri", "username", "host" FROM "user" JOIN "user_profile" ON "user"."id" = "user_profile". "userId" WHERE "user"."host" IS NOT NULL AND "user"."id" = ANY("note"."mentions")) AS "data")`);
|
||||||
|
+ await queryRunner.query(`
|
||||||
|
+ CREATE TEMP TABLE IF NOT EXISTS "temp_mentions" AS
|
||||||
|
+ SELECT "id", "url", "uri", "username", "host"
|
||||||
|
+ FROM "user"
|
||||||
|
+ JOIN "user_profile" ON "user"."id" = "user_profile"."userId" WHERE "user"."host" IS NOT NULL
|
||||||
|
+ `);
|
||||||
|
+
|
||||||
|
+ await queryRunner.query(`
|
||||||
|
+ CREATE UNIQUE INDEX "temp_mentions_id" ON "temp_mentions"("id")
|
||||||
|
+ `);
|
||||||
|
+
|
||||||
|
+ await queryRunner.query(`
|
||||||
|
+ UPDATE "note" SET "mentionedRemoteUsers" = (
|
||||||
|
+ SELECT COALESCE(json_agg(row_to_json("data")::jsonb - 'id')::text, '[]') FROM "temp_mentions" AS "data"
|
||||||
|
+ WHERE "data"."id" = ANY("note"."mentions")
|
||||||
|
+ )
|
||||||
|
+ `);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
diff --git a/packages/backend/migration/1663399074403-resize-comments-drive-file.js b/packages/backend/migration/1663399074403-resize-comments-drive-file.js
|
||||||
|
index a037f1655..0873aec9b 100644
|
||||||
|
--- a/packages/backend/migration/1663399074403-resize-comments-drive-file.js
|
||||||
|
+++ b/packages/backend/migration/1663399074403-resize-comments-drive-file.js
|
||||||
|
@@ -9,6 +9,6 @@ export class resizeCommentsDriveFile1663399074403 {
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
- await queryRunner.query(`ALTER TABLE "drive_file" ALTER COLUMN "comment" TYPE character varying(512)`);
|
||||||
|
- }
|
||||||
|
+ console.log('This migration cannot be reverted, skipping...');
|
||||||
|
+ }
|
||||||
|
}
|
||||||
+175
@@ -0,0 +1,175 @@
|
|||||||
|
# Installing Iceshrimp
|
||||||
|
|
||||||
|
This document will guide you through manual installation of Iceshrimp. We also provide prebuilt [packages](/iceshrimp/packaging) for various platforms, should you prefer those over a manual install.
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
- C/C++ compiler like **GCC** or **Clang**
|
||||||
|
- Build tools like **make**
|
||||||
|
- **Python 3**
|
||||||
|
|
||||||
|
### Required
|
||||||
|
|
||||||
|
- [**Node.js**](https://nodejs.org) v18.16.0+ (v20 recommended)
|
||||||
|
- [**PostgreSQL**](https://www.postgresql.org/) 12+ (including modules, usually packaged as postgresql-contrib)
|
||||||
|
- [**Valkey**](https://valkey.io/) (or any other Redis 6 compatible fork)
|
||||||
|
- [**libvips**](https://www.libvips.org/)
|
||||||
|
- **Web proxy**
|
||||||
|
- nginx
|
||||||
|
- Caddy
|
||||||
|
|
||||||
|
### Optional
|
||||||
|
|
||||||
|
- [**FFmpeg**](https://ffmpeg.org/) for video transcoding
|
||||||
|
|
||||||
|
## Preparations
|
||||||
|
|
||||||
|
### Download repository
|
||||||
|
|
||||||
|
Make sure you have `git-lfs` installed and have run `git lfs install` before cloning the repo, as we are using Git LFS for efficient storage of binary blobs.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git clone https://iceshrimp.dev/iceshrimp/iceshrimp.git
|
||||||
|
```
|
||||||
|
|
||||||
|
If you don't want to run the latest development version, pick a version from [here](https://iceshrimp.dev/iceshrimp/iceshrimp/releases) and run `git checkout <version>` before continuing.
|
||||||
|
|
||||||
|
### Creating a new user
|
||||||
|
|
||||||
|
In case you want to run Iceshrimp as a different user, run `adduser --disabled-password --disabled-login iceshrimp`
|
||||||
|
Following steps will require you to run them as the user you have made, so use `su - iceshrimp`, or `sudo -iu iceshrimp`, or whatever else method in order to temporarily log in as that user.
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
- Copy `.config/example.yml` to `.config/default.yml`
|
||||||
|
- Edit `.config/default.yml` with text editor
|
||||||
|
- Make sure to set PostgreSQL and Redis section correctly
|
||||||
|
|
||||||
|
## Installing project dependencies
|
||||||
|
|
||||||
|
This project uses corepack to manage yarn versions, please make sure you don't have a globally installed non-corepack yarn binary (e.g. by having run `npm install -g yarn` in the past, or via your operating system's package manager)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
corepack enable
|
||||||
|
corepack prepare --activate
|
||||||
|
yarn
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: If you get a lot of `The remote archive doesn't match the expected checksum` errors, please make sure you installed `git-lfs` and ran `git lfs install && git lfs pull`.
|
||||||
|
|
||||||
|
## Building Iceshrimp
|
||||||
|
|
||||||
|
```sh
|
||||||
|
yarn build
|
||||||
|
```
|
||||||
|
## Database
|
||||||
|
|
||||||
|
### Creating database
|
||||||
|
|
||||||
|
This will create a postgres user with your password and database, while also granting that user all privileges on database.
|
||||||
|
Using `psql` prompt:
|
||||||
|
```sh
|
||||||
|
sudo -u postgres psql
|
||||||
|
```
|
||||||
|
```postgresql
|
||||||
|
create database iceshrimp with encoding = 'UTF8';
|
||||||
|
create user iceshrimp with encrypted password '{YOUR_PASSWORD}';
|
||||||
|
grant all privileges on database iceshrimp to iceshrimp;
|
||||||
|
alter database iceshrimp owner to iceshrimp;
|
||||||
|
\q
|
||||||
|
```
|
||||||
|
|
||||||
|
### First migration
|
||||||
|
|
||||||
|
In order for Iceshrimp to work properly, you need to initialise the database using
|
||||||
|
```bash
|
||||||
|
yarn run init
|
||||||
|
```
|
||||||
|
|
||||||
|
### Optimizing performance
|
||||||
|
|
||||||
|
If you are running Iceshrimp on a system with more than one CPU thread, you might want to set the `clusterLimit` config option to about half of your thread count, depending on your system configuration. Please note that each worker requires around 10 PostgreSQL connections, so be sure to set `max_connections` appropriately (aim for `(10 * no_workers) + 10`, if you have no other applications accessing the PostgreSQL database).
|
||||||
|
|
||||||
|
For optimal database performance, it's highly recommended to configure PostgreSQL with [PGTune](https://pgtune.leopard.in.ua/) using the "Mixed type of application" profile. This is especially important should your database server use HDD instead of SATA or NVMe SSD storage.
|
||||||
|
|
||||||
|
## Setting up Webproxy
|
||||||
|
|
||||||
|
### Nginx
|
||||||
|
|
||||||
|
- Run `sudo cp docs/examples/iceshrimp.nginx.conf /etc/nginx/sites-available/ && cd /etc/nginx/sites-available/`
|
||||||
|
- Edit `iceshrimp.nginx.conf` to reflect your server properly
|
||||||
|
- Run `sudo ln -s ./iceshrimp.nginx.conf ../sites-enabled/iceshrimp.nginx.conf`
|
||||||
|
- Run `sudo nginx -t` to check that the config is valid, then restart the nginx service.
|
||||||
|
|
||||||
|
### Caddy
|
||||||
|
|
||||||
|
- Add the following to your Caddyfile, and replace `example.com` with your domain
|
||||||
|
```
|
||||||
|
example.com {
|
||||||
|
reverse_proxy localhost:3000
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Running Iceshrimp
|
||||||
|
|
||||||
|
### Running manually
|
||||||
|
|
||||||
|
- Start Iceshrimp by running `NODE_ENV=production yarn run start`.
|
||||||
|
If this is your first run, after Iceshrimp has started successfully, you'll be able to go to the URL you have specified in `.config/default.yml` and create first user.
|
||||||
|
- To stop the server, use `Ctrl-C`.
|
||||||
|
|
||||||
|
### Running using systemd
|
||||||
|
|
||||||
|
- Run `sudo cp docs/examples/iceshrimp.service /etc/systemd/system/`
|
||||||
|
- Edit `/etc/systemd/system/iceshrimp.service` with text editor, and change `User`, `WorkingDir`, `ExecStart` if necessary.
|
||||||
|
- Run `sudo systemctl daemon-reload`
|
||||||
|
- Run `sudo systemctl enable --now iceshrimp` in order to enable and start Iceshrimp.
|
||||||
|
- (Optional) Check if instance is running using `sudo systemctl status iceshrimp`
|
||||||
|
|
||||||
|
### Environment variables
|
||||||
|
- `ICESHRIMP_CONFIG` (default: `.config/default.yml`) to change where the the config file is located
|
||||||
|
- `ICESHRIMP_SECRETS` (default: unset) if you want to keep your secrets in a separate config file
|
||||||
|
- `ICESHRIMP_MEDIA_DIR` (default: `files`) to change where internally stored files are located
|
||||||
|
- `ICESHRIMP_CUSTOM_DIR` (default: `custom`) to change where custom assets and locales are located (caution: assets are copied at build time or when running `yarn gulp`, not during startup!)
|
||||||
|
|
||||||
|
Make sure you are specifying absolute paths when setting environment variables.
|
||||||
|
|
||||||
|
### Updating Iceshrimp
|
||||||
|
|
||||||
|
Before you start, if you cloned the iceshrimp repository before the Git LFS migration, please follow [these instructions](https://iceshrimp.dev/iceshrimp/iceshrimp/wiki/Git-LFS#fixing-up-a-preexisting-cloned-repo) to get your repository back in sync.
|
||||||
|
|
||||||
|
First, stop the Iceshrimp service and then run the following commands:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
## Run git stash commands only if you have uncommitted changes
|
||||||
|
git stash
|
||||||
|
```
|
||||||
|
|
||||||
|
If you were previously running a tagged release and/or want to upgrade to one, run:
|
||||||
|
```sh
|
||||||
|
git fetch --tags
|
||||||
|
git checkout <new-version>
|
||||||
|
```
|
||||||
|
|
||||||
|
If you were previously running a development version, and want to continue doing so or switch to the latest commit, run:
|
||||||
|
```sh
|
||||||
|
git switch dev
|
||||||
|
git pull
|
||||||
|
```
|
||||||
|
|
||||||
|
Regardless of which of the above you picked, run:
|
||||||
|
```sh
|
||||||
|
git stash pop
|
||||||
|
yarn
|
||||||
|
yarn build && yarn migrate
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: If you get a lot of `The remote archive doesn't match the expected checksum` errors, please make sure you installed `git-lfs` and ran `git lfs install && git lfs pull`.
|
||||||
|
|
||||||
|
Now restart the Iceshrimp service and everything should be up to date.
|
||||||
|
|
||||||
|
## Post-install
|
||||||
|
|
||||||
|
See [post-install](post-install.md).
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
# Running a iceshrimp server with Kubernetes and Helm
|
||||||
|
|
||||||
|
This is a [Helm](https://helm.sh/) chart directory in the root of the project
|
||||||
|
that you can use to deploy iceshrimp to a Kubernetes cluster
|
||||||
|
|
||||||
|
## Deployment
|
||||||
|
|
||||||
|
1. Copy the example helm values and make your changes:
|
||||||
|
```shell
|
||||||
|
cp .config/helm_values_example.yml .config/helm_values.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Update helm dependencies:
|
||||||
|
```shell
|
||||||
|
cd chart
|
||||||
|
helm dependency list $dir 2> /dev/null | tail +2 | head -n -1 | awk '{ print "helm repo add " $1 " " $3 }' | while read cmd; do $cmd; done;
|
||||||
|
cd ../
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Create the iceshrimp helm release (also used to update existing deployment):
|
||||||
|
```shell
|
||||||
|
helm upgrade \
|
||||||
|
--install \
|
||||||
|
--namespace iceshrimp \
|
||||||
|
--create-namespace \
|
||||||
|
iceshrimp chart/ \
|
||||||
|
-f .config/helm_values.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Watch your iceshrimp server spin up:
|
||||||
|
```shell
|
||||||
|
kubectl -n iceshrimp get po -w
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Initial the admin user and managed config:
|
||||||
|
```shell
|
||||||
|
export iceshrimp_USERNAME="my_desired_admin_handle" && \
|
||||||
|
export iceshrimp_PASSWORD="myDesiredInitialPassword" && \
|
||||||
|
export iceshrimp_HOST="iceshrimp.example.com" && \
|
||||||
|
export iceshrimp_TOKEN=$(curl -X POST https://$iceshrimp_HOST/api/admin/accounts/create -H "Content-Type: application/json" -d "{ \"username\":\"$iceshrimp_USERNAME\", \"password\":\"$iceshrimp_PASSWORD\" }" | jq -r '.token') && \
|
||||||
|
echo "Save this token: ${iceshrimp_TOKEN}" && \
|
||||||
|
curl -X POST -H "Authorization: Bearer $iceshrimp_TOKEN" https://$iceshrimp_HOST/api/admin/accounts/hosted
|
||||||
|
```
|
||||||
|
|
||||||
|
6. Enjoy!
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
# 🚚 Migrating from Firefish to Iceshrimp
|
||||||
|
|
||||||
|
> **Warning**
|
||||||
|
> Before proceeding, please **ensure you have an *up-to-date* backup of the database.**
|
||||||
|
|
||||||
|
## Preparations
|
||||||
|
First, follow Firefish's [downgrade guide](https://codeberg.org/firefish/firefish/src/branch/develop/docs/downgrade.md) to get back to v1.0.5-rc. When prompted to switch the docker image/git tag, make sure to pick `v1.0.5-rc`, and not `v20240206`. This is to make sure that the migration patch applies correctly.
|
||||||
|
|
||||||
|
### Docker
|
||||||
|
First, stop the container by running `docker compose down`.
|
||||||
|
|
||||||
|
Now, run `docker-compose run --rm --entrypoint '/bin/bash' web` to get a shell in the main container.
|
||||||
|
|
||||||
|
### Bare metal
|
||||||
|
First, stop the service. If using systemd, run `sudo systemctl stop firefish.service`.
|
||||||
|
|
||||||
|
Now, `cd` into the root of your firefish repository.
|
||||||
|
|
||||||
|
## Applying the migrations patch
|
||||||
|
To make sure migrations revert correctly, run `curl -s https://iceshrimp.dev/iceshrimp/iceshrimp/raw/branch/dev/docs/firefish-redis.patch | git apply --ignore-whitespace`. This will patch two built JS files related to redis. The patch is ephemeral, once you complete the migration process it will no longer apply. Iceshrimp-JS has the patch built in.
|
||||||
|
|
||||||
|
## Reverting the migrations
|
||||||
|
To begin, run `cd packages/backend` to switch to the backend workspace.
|
||||||
|
|
||||||
|
Now, revert all of the typeorm migrations. reverted. To do this, run the command `pnpm run revertmigration:typeorm` until the output confirms that the migration `FirefishRepo1689957674000` has been reverted successfully.
|
||||||
|
|
||||||
|
If migration `IncreaseHostCharLimit1692374635734` failed to revert, please run `DELETE FROM "migrations" WHERE "name" = 'IncreaseHostCharLimit1692374635734';` in the database shell.
|
||||||
|
|
||||||
|
If you get any other errors here please ask for support in the [chat room](https://chat.iceshrimp.dev).
|
||||||
|
|
||||||
|
Finally, revert all the cargo migrations, by running `pnpm run revertmigration:cargo` until `m20230806_170616_fix_antenna_stream_ids` has been reverted. Again, if you get any errors, please ask for support in the [chat room](https://chat.iceshrimp.dev).
|
||||||
|
|
||||||
|
## Switching to Iceshrimp
|
||||||
|
### Docker
|
||||||
|
First, run `docker compose down` to shut down firefish.
|
||||||
|
|
||||||
|
Now, switch out image for the `web` container with `iceshrimp.dev/iceshrimp/iceshrimp:latest`.
|
||||||
|
Furthermore, for every volume/mount that's mapped to /firefish, switch it out for /iceshrimp (leaving any trailing text intact).
|
||||||
|
|
||||||
|
Finally, run `docker compose up`, and make sure that it starts up correctly. If everything works, press CTRL+C and run `docker compoe up -d` to start it in the background.
|
||||||
|
|
||||||
|
If you get any errors on startup, please ask for support in the [chat room](https://chat.iceshrimp.dev).
|
||||||
|
|
||||||
|
### Bare metal
|
||||||
|
Before you begin, make sure `git-lfs` is installed on the system, and that the firefish service is stopped.
|
||||||
|
|
||||||
|
Then, switch back to the repository root directory and run `git remote set-url origin https://iceshrimp.dev/iceshrimp/iceshrimp.git`, as well as `git lfs install`.
|
||||||
|
|
||||||
|
Now, run `git fetch --all` to fetch the new commits.
|
||||||
|
|
||||||
|
If you get an error like `couldn't find remote ref` here, run `git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"`, followed by `git remote prune origin` and `git fetch --all`. If you still get any errors, please ask for support in the [chat room](https://chat.iceshrimp.dev).
|
||||||
|
|
||||||
|
Then, run `git checkout dev` to switch to the `dev` branch, or `git checkout <tag>` to switch to a versioned tag. Make sure to run `git lfs pull` as well, to get all the dependencies.
|
||||||
|
|
||||||
|
Now, run `yarn && yarn build && yarn migrate` to install dependencies, build the project & run all pending migrations.
|
||||||
|
|
||||||
|
Finally, to clean up now-unnecessary files, run `rm -rf packages/backend/native-utils packages/megalodon`.
|
||||||
|
|
||||||
|
You should now be able to start the service back up.
|
||||||
|
|
||||||
|
If you get any errors during this process, please ask for support in the [chat room](https://chat.iceshrimp.dev).
|
||||||
|
|
||||||
|
## Closing notes
|
||||||
|
Please check out the [example configuration file](https://iceshrimp.dev/iceshrimp/iceshrimp/src/branch/dev/.config/example.yml), as it's changed quite a bit since Firefish and you may want to make use of the new features.
|
||||||
|
|
||||||
|
If you need further assistance for any reason, please ask for help in the [chat room](https://chat.iceshrimp.dev), we will assist you with the migration.
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
diff --git a/packages/backend/migration/1672704017999-remove-lastCommunicatedAt.js b/packages/backend/migration/1672704017999-remove-lastCommunicatedAt.js
|
||||||
|
index 38a676985..c4ae690e0 100644
|
||||||
|
--- a/packages/backend/migration/1672704017999-remove-lastCommunicatedAt.js
|
||||||
|
+++ b/packages/backend/migration/1672704017999-remove-lastCommunicatedAt.js
|
||||||
|
@@ -6,6 +6,8 @@ export class removeLastCommunicatedAt1672704017999 {
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
- await queryRunner.query(`ALTER TABLE "instance" ADD "lastCommunicatedAt" TIMESTAMP WITH TIME ZONE NOT NULL`);
|
||||||
|
+ await queryRunner.query(`ALTER TABLE "instance" ADD "lastCommunicatedAt" TIMESTAMP WITH TIME ZONE`);
|
||||||
|
+ await queryRunner.query(`UPDATE "instance" SET "lastCommunicatedAt" = COALESCE("infoUpdatedAt", "caughtAt")`);
|
||||||
|
+ await queryRunner.query(`ALTER TABLE "instance" ALTER COLUMN "lastCommunicatedAt" SET NOT NULL`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
diff --git a/packages/backend/migration/1673336077243-PollChoiceLength.js b/packages/backend/migration/1673336077243-PollChoiceLength.js
|
||||||
|
index 810c626e0..5809528cb 100644
|
||||||
|
--- a/packages/backend/migration/1673336077243-PollChoiceLength.js
|
||||||
|
+++ b/packages/backend/migration/1673336077243-PollChoiceLength.js
|
||||||
|
@@ -6,6 +6,6 @@ export class PollChoiceLength1673336077243 {
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
- await queryRunner.query(`ALTER TABLE "poll" ALTER COLUMN "choices" TYPE character varying(128) array`);
|
||||||
|
+ //await queryRunner.query(`ALTER TABLE "poll" ALTER COLUMN "choices" TYPE character varying(128) array`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
diff --git a/packages/backend/migration/1674118260469-achievement.js b/packages/backend/migration/1674118260469-achievement.js
|
||||||
|
index 131ab96f8..57a922f83 100644
|
||||||
|
--- a/packages/backend/migration/1674118260469-achievement.js
|
||||||
|
+++ b/packages/backend/migration/1674118260469-achievement.js
|
||||||
|
@@ -18,12 +18,13 @@ export class achievement1674118260469 {
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`CREATE TYPE "public"."user_profile_mutingnotificationtypes_enum_old" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app', 'pollEnded')`);
|
||||||
|
+ await queryRunner.query(`CREATE TYPE "public"."notification_type_enum_old" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app')`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" DROP DEFAULT`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" TYPE "public"."user_profile_mutingnotificationtypes_enum_old"[] USING "mutingNotificationTypes"::"text"::"public"."user_profile_mutingnotificationtypes_enum_old"[]`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" SET DEFAULT '{}'`);
|
||||||
|
await queryRunner.query(`DROP TYPE "public"."user_profile_mutingnotificationtypes_enum"`);
|
||||||
|
await queryRunner.query(`ALTER TYPE "public"."user_profile_mutingnotificationtypes_enum_old" RENAME TO "user_profile_mutingnotificationtypes_enum"`);
|
||||||
|
- await queryRunner.query(`CREATE TYPE "public"."notification_type_enum_old" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app')`);
|
||||||
|
+ await queryRunner.query(`DELETE FROM "public"."notification" WHERE "type" = 'achievementEarned'`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "type" TYPE "public"."notification_type_enum_old" USING "type"::"text"::"public"."notification_type_enum_old"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "public"."notification_type_enum"`);
|
||||||
|
await queryRunner.query(`ALTER TYPE "public"."notification_type_enum_old" RENAME TO "notification_type_enum"`);
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
diff --git a/packages/backend/migration/1680491187535-cleanup.js b/packages/backend/migration/1680491187535-cleanup.js
|
||||||
|
index 1e609ca06..0e6accf3e 100644
|
||||||
|
--- a/packages/backend/migration/1680491187535-cleanup.js
|
||||||
|
+++ b/packages/backend/migration/1680491187535-cleanup.js
|
||||||
|
@@ -1,10 +1,40 @@
|
||||||
|
export class cleanup1680491187535 {
|
||||||
|
- name = 'cleanup1680491187535'
|
||||||
|
+ name = "cleanup1680491187535";
|
||||||
|
|
||||||
|
- async up(queryRunner) {
|
||||||
|
- await queryRunner.query(`DROP TABLE "antenna_note" `);
|
||||||
|
- }
|
||||||
|
+ async up(queryRunner) {
|
||||||
|
+ await queryRunner.query(`DROP TABLE "antenna_note" `);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- async down(queryRunner) {
|
||||||
|
- }
|
||||||
|
+ async down(queryRunner) {
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `CREATE TABLE antenna_note ( id character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, "antennaId" character varying(32) NOT NULL, read boolean DEFAULT false NOT NULL)`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `COMMENT ON COLUMN antenna_note."noteId" IS 'The note ID.'`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `COMMENT ON COLUMN antenna_note."antennaId" IS 'The antenna ID.'`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `ALTER TABLE ONLY antenna_note ADD CONSTRAINT "PK_fb28d94d0989a3872df19fd6ef8" PRIMARY KEY (id)`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `CREATE INDEX "IDX_0d775946662d2575dfd2068a5f" ON antenna_note USING btree ("antennaId")`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `CREATE UNIQUE INDEX "IDX_335a0bf3f904406f9ef3dd51c2" ON antenna_note USING btree ("noteId", "antennaId")`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `CREATE INDEX "IDX_9937ea48d7ae97ffb4f3f063a4" ON antenna_note USING btree (read)`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `CREATE INDEX "IDX_bd0397be22147e17210940e125" ON antenna_note USING btree ("noteId")`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `ALTER TABLE ONLY antenna_note ADD CONSTRAINT "FK_0d775946662d2575dfd2068a5f5" FOREIGN KEY ("antennaId") REFERENCES antenna(id) ON DELETE CASCADE`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `ALTER TABLE ONLY antenna_note ADD CONSTRAINT "FK_bd0397be22147e17210940e125b" FOREIGN KEY ("noteId") REFERENCES note(id) ON DELETE CASCADE`,
|
||||||
|
+ );
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
diff --git a/packages/backend/migration/1680582195041-cleanup.js b/packages/backend/migration/1680582195041-cleanup.js
|
||||||
|
index c587e456a..a91d6ff3c 100644
|
||||||
|
--- a/packages/backend/migration/1680582195041-cleanup.js
|
||||||
|
+++ b/packages/backend/migration/1680582195041-cleanup.js
|
||||||
|
@@ -1,11 +1,64 @@
|
||||||
|
export class cleanup1680582195041 {
|
||||||
|
- name = 'cleanup1680582195041'
|
||||||
|
+ name = "cleanup1680582195041";
|
||||||
|
|
||||||
|
- async up(queryRunner) {
|
||||||
|
- await queryRunner.query(`DROP TABLE "notification" `);
|
||||||
|
- }
|
||||||
|
+ async up(queryRunner) {
|
||||||
|
+ await queryRunner.query(`DROP TABLE "notification"`);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- async down(queryRunner) {
|
||||||
|
-
|
||||||
|
- }
|
||||||
|
+ async down(queryRunner) {
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `CREATE TABLE notification ( id character varying(32) NOT NULL, "createdAt" timestamp with time zone NOT NULL, "notifieeId" character varying(32) NOT NULL, "notifierId" character varying(32), "isRead" boolean DEFAULT false NOT NULL, "noteId" character varying(32), reaction character varying(128), choice integer, "followRequestId" character varying(32), type notification_type_enum NOT NULL, "customBody" character varying(2048), "customHeader" character varying(256), "customIcon" character varying(1024), "appAccessTokenId" character varying(32), achievement character varying(128))`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `COMMENT ON COLUMN notification."createdAt" IS 'The created date of the Notification.'`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `COMMENT ON COLUMN notification."notifieeId" IS 'The ID of recipient user of the Notification.'`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `COMMENT ON COLUMN notification."notifierId" IS 'The ID of sender user of the Notification.'`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `COMMENT ON COLUMN notification."isRead" IS 'Whether the Notification is read.'`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `COMMENT ON COLUMN notification.type IS 'The type of the Notification.'`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `ALTER TABLE ONLY notification ADD CONSTRAINT "PK_705b6c7cdf9b2c2ff7ac7872cb7" PRIMARY KEY (id)`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `CREATE INDEX "IDX_080ab397c379af09b9d2169e5b" ON notification USING btree ("isRead")`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `CREATE INDEX "IDX_33f33cc8ef29d805a97ff4628b" ON notification USING btree (type)`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `CREATE INDEX "IDX_3b4e96eec8d36a8bbb9d02aa71" ON notification USING btree ("notifierId")`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `CREATE INDEX "IDX_3c601b70a1066d2c8b517094cb" ON notification USING btree ("notifieeId")`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `CREATE INDEX "IDX_b11a5e627c41d4dc3170f1d370" ON notification USING btree ("createdAt")`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `CREATE INDEX "IDX_e22bf6bda77b6adc1fd9e75c8c" ON notification USING btree ("appAccessTokenId")`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `ALTER TABLE ONLY notification ADD CONSTRAINT "FK_3b4e96eec8d36a8bbb9d02aa710" FOREIGN KEY ("notifierId") REFERENCES "user"(id) ON DELETE CASCADE`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `ALTER TABLE ONLY notification ADD CONSTRAINT "FK_3c601b70a1066d2c8b517094cb9" FOREIGN KEY ("notifieeId") REFERENCES "user"(id) ON DELETE CASCADE`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `ALTER TABLE ONLY notification ADD CONSTRAINT "FK_769cb6b73a1efe22ddf733ac453" FOREIGN KEY ("noteId") REFERENCES note(id) ON DELETE CASCADE`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `ALTER TABLE ONLY notification ADD CONSTRAINT "FK_bd7fab507621e635b32cd31892c" FOREIGN KEY ("followRequestId") REFERENCES follow_request(id) ON DELETE CASCADE`,
|
||||||
|
+ );
|
||||||
|
+ await queryRunner.query(
|
||||||
|
+ `ALTER TABLE ONLY notification ADD CONSTRAINT "FK_e22bf6bda77b6adc1fd9e75c8c9" FOREIGN KEY ("appAccessTokenId") REFERENCES access_token(id) ON DELETE CASCADE`,
|
||||||
|
+ );
|
||||||
|
+ }
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
# 🌎 Iceshrimp Developer Docs
|
||||||
|
|
||||||
|
## Nix Dev Environment
|
||||||
|
The Iceshrimp repo comes with a Nix-based shell environment to help make development as easy as possible!
|
||||||
|
|
||||||
|
Please note, however, that this environment will not work on Windows outside of a WSL2 environment.
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
|
||||||
|
- Installed the [Nix Package Manager](https://nixos.org/download.html) (use the comman on their website)
|
||||||
|
- Installed [direnv](https://direnv.net/docs/installation.html) and added its hook to your shell. (package manager)
|
||||||
|
- Ensured all dependencies are pulled with `git-lfs`, which also needs to be installed.
|
||||||
|
|
||||||
|
Once the repo is cloned to your computer, follow these next few steps inside the Iceshrimp folder:
|
||||||
|
|
||||||
|
- Run `direnv allow`. This will build the environment and install all needed tools.
|
||||||
|
- Run `install-deps`, then `prepare-config`, to install the node dependencies and prepare the needed config files.
|
||||||
|
- In a second terminal, run `devenv up`. This will spawn a **Redis** server, a **Postgres** server, and the **Iceshrimp** server in dev mode.
|
||||||
|
- Once you see the Iceshrimp banner printed in your second terminal, run `migrate` in the first.
|
||||||
|
- Once migrations finish, open http://localhost:3000 in your web browser.
|
||||||
|
- You should now see the admin user creation screen!
|
||||||
|
|
||||||
|
Note: When you want to restart a dev server, all you need to do is run `devenv up`, no other steps are necessary.
|
||||||
|
|
||||||
|
### Windows Subsystem for Linux
|
||||||
|
if `devenv up` terminates because of wrong folder permissions,
|
||||||
|
|
||||||
|
create the file `/etc/wsl.conf` in your distro and add
|
||||||
|
```shell
|
||||||
|
[automount]
|
||||||
|
options = "metadata"
|
||||||
|
```
|
||||||
|
|
||||||
|
this allows `chmod` calls to actually have an effect.
|
||||||
|
the build scripts DO actually set the permissions, it just needs to work in wsl.
|
||||||
|
|
||||||
|
### Problems with the environment
|
||||||
|
|
||||||
|
We don't anticipate any problems with the environment, as it is kept stable and does not require much maintainence.
|
||||||
|
|
||||||
|
Nevertheless, if you do encounter nix-specific problems and are unable to solve these problems yourself, please join the [Matrix support Channel](https://matrix.to/#/%23iceshrimp-dev:161.rocks)
|
||||||
|
and ping @Pyrox with the specific error message you encounter.
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
# Installing Iceshrimp using Podman and Quadlet
|
||||||
|
Quadlet is a feature of Podman that is kind of like Docker Compose, but is better integrated with systemd, just like whole Podman.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
- Podman 4.4+ with aardvark
|
||||||
|
- Git with LFS installed (if building your own images)
|
||||||
|
|
||||||
|
## Preparations
|
||||||
|
|
||||||
|
### Getting needed files
|
||||||
|
|
||||||
|
If you want to use prebuilt images:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
GIT_LFS_SKIP_SMUDGE=1 git clone https://iceshrimp.dev/iceshrimp/iceshrimp.git --depth=1
|
||||||
|
mkdir -p $HOME/.config/containers/systemd
|
||||||
|
cp "iceshrimp/docs/examples/Podman (quadlet)"/* $HOME/.config/containers/systemd
|
||||||
|
```
|
||||||
|
|
||||||
|
Tweak quadlet files and change the image tag in `$HOME/.config/containers/systemd/iceshrimp-web.container` from `latest` to `dev` or `pre` if desired, and run `docs/examples/Podman\ \(quadlet\)/volume-dir-creation.sh`.
|
||||||
|
|
||||||
|
If you want to build your own images:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git lfs install
|
||||||
|
git clone https://iceshrimp.dev/iceshrimp/iceshrimp.git
|
||||||
|
mkdir -p $HOME/.config/containers/systemd
|
||||||
|
cp "iceshrimp/docs/examples/Podman (quadlet)"/* $HOME/.config/containers/systemd
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
Tweak quadlet files if needed, change content of `Image:` line in `$HOME/.config/containers/systemd/iceshrimp-web.container` to `Image: localhost/iceshrimp/iceshrimp:latest`, and run `docs/examples/Podman\ \(quadlet\)/volume-dir-creation.sh`.
|
||||||
|
|
||||||
|
### .config
|
||||||
|
|
||||||
|
Edit `.config/docker.env` and fill it with the database credentials you want.
|
||||||
|
Edit `.config/default.yml` and:
|
||||||
|
|
||||||
|
- Replace example database credentials with the ones you entered in `.config/docker.env`
|
||||||
|
- Change other configuration
|
||||||
|
|
||||||
|
## Installation and first start
|
||||||
|
|
||||||
|
Choose a method, whether you chose to build the image yourself or not.
|
||||||
|
|
||||||
|
### Pulling the image
|
||||||
|
|
||||||
|
```sh
|
||||||
|
podman pull $(grep -F "Image=" $HOME/.config/containers/systemd/iceshrimp-web.container | cut -d= -f2)
|
||||||
|
systemctl --user daemon-reload
|
||||||
|
systemctl --user start iceshrimp-web.service
|
||||||
|
```
|
||||||
|
|
||||||
|
### Building the image
|
||||||
|
|
||||||
|
Enter Iceshrimp repo and run:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
podman build . -t $(grep -F "Image=" $HOME/.config/containers/systemd/iceshrimp-web.container | cut -d= -f2) --ulimit nofile=16384:16384
|
||||||
|
systemctl --user daemon-reload
|
||||||
|
systemctl --user start iceshrimp-web.service
|
||||||
|
```
|
||||||
|
|
||||||
|
## Starting Iceshrimp automatically
|
||||||
|
|
||||||
|
Run `sudo loginctl enable-linger [user]` and Iceshrimp will start automatically on boot. You don't need to, and in fact [cannot enable Podman-generated systemd services](https://man.archlinux.org/man/extra/podman/podman-systemd.unit.5.en#Enabling_unit_files).
|
||||||
|
|
||||||
|
## Updating Iceshrimp
|
||||||
|
|
||||||
|
### Pulling the image
|
||||||
|
|
||||||
|
```sh
|
||||||
|
podman pull $(grep -F "Image=" $HOME/.config/containers/systemd/iceshrimp-web.container | cut -d= -f2)
|
||||||
|
systemctl --user restart iceshrimp-web.service
|
||||||
|
```
|
||||||
|
|
||||||
|
### Building the image
|
||||||
|
|
||||||
|
```sh
|
||||||
|
## Run git stash commands only if you have uncommitted changes
|
||||||
|
git stash
|
||||||
|
git pull
|
||||||
|
git stash pop
|
||||||
|
podman build . -t $(grep -F "Image=" $HOME/.config/containers/systemd/iceshrimp-web.container | cut -d= -f2) --ulimit nofile=16384:16384
|
||||||
|
systemctl --user restart iceshrimp-web.service
|
||||||
|
```
|
||||||
|
|
||||||
|
## Post-install
|
||||||
|
|
||||||
|
If you are running Iceshrimp on a system with more than one CPU thread, you might want to set the `clusterLimit` config option to about half of your thread count, depending on your system configuration. Please note that each worker requires around 10 PostgreSQL connections, so be sure to set `max_connections` appropriately. To do this, change `max_connections=n` line in `db/postgresql.conf`, with `n` being `(10 * no_workers) + 10`, and run `systemctl --user restart iceshrimp-db iceshrimp-web`.
|
||||||
|
|
||||||
|
See also [post-install](post-install.md).
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
# Post-install
|
||||||
|
|
||||||
|
This document describes things you can do after successfully installing Iceshrimp.
|
||||||
|
|
||||||
|
## Automatic translation
|
||||||
|
|
||||||
|
### DeepL
|
||||||
|
|
||||||
|
- Create a Free or Pro API account on [DeepL's website](https://www.deepl.com/pro#developer)
|
||||||
|
- Copy the API key to Control Panel > General > DeepL Translation
|
||||||
|
- Check the "Pro account" switch if you registered for paid account
|
||||||
|
|
||||||
|
### LibreTranslate
|
||||||
|
|
||||||
|
- Install [LibreTranslate](https://libretranslate.com/)
|
||||||
|
- Get an API URL and API key, copy and paste them into Control Panel > General > Libre Translate
|
||||||
|
|
||||||
|
## Object Storage (S3)
|
||||||
|
|
||||||
|
Recommended if using Docker
|
||||||
|
- Set up a bucket on provider's website (for example: AWS, Backblaze B2, Wasabi, minio or Google Cloud)
|
||||||
|
- Go to Control Panel > Object Storage and follow instructions
|
||||||
|
|
||||||
|
## Customising assets, locale
|
||||||
|
|
||||||
|
- To add custom CSS for all users, edit `custom/assets/instance.css`.
|
||||||
|
- To add static assets (such as images for the splash screen), place them in the `custom/assets/` directory. They'll then be available on https://example.com/static-assets/filename.ext.
|
||||||
|
- To add custom locales, place them in the `custom/locales/` directory. If you name your custom locale the same as an existing locale, it will overwrite it. If you give it a unique name, it will be added to the list. Also make sure that the first part of the filename matches the locale you're basing it on. (Example: en-FOO.yml)
|
||||||
|
- To add custom error images, place them in the `custom/assets/badges` directory, replacing the files already there.
|
||||||
|
- To add custom sounds, place only mp3 files in the `custom/assets/sounds` directory.
|
||||||
|
- To update custom assets without rebuilding, just run `yarn run gulp`.
|
||||||
|
|
||||||
|
## Another admin account
|
||||||
|
|
||||||
|
- Go to desired user's page, click 3 dots in upper right corner > About > Moderation, turn on "Moderator"
|
||||||
|
- Go back to Overview and copy their ID
|
||||||
|
- Run `psql -d iceshrimp`, replace `iceshrimp` with a name of your database if needed
|
||||||
|
- If instance is ran by a different system user: Prepend that command with `sudo -U iceshrimp`, replace `iceshrimp` with a name of that user if needed
|
||||||
|
- Docker Compose users: `docker compose exec db psql -d iceshrimp -U iceshrimp`, replace both `iceshrimp` with name of your db, and username owning that db respectively, if needed
|
||||||
|
- Run `UPDATE "user" SET "isAdmin" = true WHERE id='999999';`, where `999999` is the copied ID of that user
|
||||||
|
- Restart your Iceshrimp server
|
||||||
|
|
||||||
|
### Removing admin privileges
|
||||||
|
- Get ID of the user
|
||||||
|
- Run `psql` the same way when adding admin
|
||||||
|
- Run `UPDATE "user" SET "isAdmin" = false WHERE id='999999';`, where `999999` is the copied ID of that user
|
||||||
|
- Restart your Iceshrimp server
|
||||||
|
- Remove moderator privileges of the user
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
diff --git a/packages/backend/migration/1665091090561-add-renote-muting.js b/packages/backend/migration/1665091090561-add-renote-muting.js
|
||||||
|
index 2c76aaff5..f8541c818 100644
|
||||||
|
--- a/packages/backend/migration/1665091090561-add-renote-muting.js
|
||||||
|
+++ b/packages/backend/migration/1665091090561-add-renote-muting.js
|
||||||
|
@@ -4,18 +4,6 @@ export class addRenoteMuting1665091090561 {
|
||||||
|
}
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
- await queryRunner.query(
|
||||||
|
- `CREATE TABLE "renote_muting" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "muteeId" character varying(32) NOT NULL, "muterId" character varying(32) NOT NULL, CONSTRAINT "PK_renoteMuting_id" PRIMARY KEY ("id"))`,
|
||||||
|
- );
|
||||||
|
- await queryRunner.query(
|
||||||
|
- `CREATE INDEX "IDX_renote_muting_createdAt" ON "muting" ("createdAt") `,
|
||||||
|
- );
|
||||||
|
- await queryRunner.query(
|
||||||
|
- `CREATE INDEX "IDX_renote_muting_muteeId" ON "muting" ("muteeId") `,
|
||||||
|
- );
|
||||||
|
- await queryRunner.query(
|
||||||
|
- `CREATE INDEX "IDX_renote_muting_muterId" ON "muting" ("muterId") `,
|
||||||
|
- );
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {}
|
||||||
Generated
+273
@@ -0,0 +1,273 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"devenv": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-compat": "flake-compat",
|
||||||
|
"nix": "nix",
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"pre-commit-hooks": "pre-commit-hooks"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1698243190,
|
||||||
|
"narHash": "sha256-n+SbyNQRhUcaZoU00d+7wi17HJpw/kAUrXOL4zRcqE8=",
|
||||||
|
"owner": "cachix",
|
||||||
|
"repo": "devenv",
|
||||||
|
"rev": "86f476f7edb86159fd20764489ab4e4df6edb4b6",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "cachix",
|
||||||
|
"repo": "devenv",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-compat": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1673956053,
|
||||||
|
"narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-parts": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs-lib": "nixpkgs-lib"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1696343447,
|
||||||
|
"narHash": "sha256-B2xAZKLkkeRFG5XcHHSXXcP7To9Xzr59KXeZiRf4vdQ=",
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"rev": "c9afaba3dfa4085dbd2ccb38dfade5141e33d9d4",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1685518550,
|
||||||
|
"narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "a1720a10a6cfe8234c0e93907ffe81be440f4cef",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"gitignore": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"devenv",
|
||||||
|
"pre-commit-hooks",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1660459072,
|
||||||
|
"narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=",
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "gitignore.nix",
|
||||||
|
"rev": "a20de23b925fd8264fd7fad6454652e142fd7f73",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "gitignore.nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lowdown-src": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1633514407,
|
||||||
|
"narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=",
|
||||||
|
"owner": "kristapsdz",
|
||||||
|
"repo": "lowdown",
|
||||||
|
"rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "kristapsdz",
|
||||||
|
"repo": "lowdown",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nix": {
|
||||||
|
"inputs": {
|
||||||
|
"lowdown-src": "lowdown-src",
|
||||||
|
"nixpkgs": [
|
||||||
|
"devenv",
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"nixpkgs-regression": "nixpkgs-regression"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1676545802,
|
||||||
|
"narHash": "sha256-EK4rZ+Hd5hsvXnzSzk2ikhStJnD63odF7SzsQ8CuSPU=",
|
||||||
|
"owner": "domenkozar",
|
||||||
|
"repo": "nix",
|
||||||
|
"rev": "7c91803598ffbcfe4a55c44ac6d49b2cf07a527f",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "domenkozar",
|
||||||
|
"ref": "relaxed-flakes",
|
||||||
|
"repo": "nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1678875422,
|
||||||
|
"narHash": "sha256-T3o6NcQPwXjxJMn2shz86Chch4ljXgZn746c2caGxd8=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "126f49a01de5b7e35a43fd43f891ecf6d3a51459",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-lib": {
|
||||||
|
"locked": {
|
||||||
|
"dir": "lib",
|
||||||
|
"lastModified": 1696019113,
|
||||||
|
"narHash": "sha256-X3+DKYWJm93DRSdC5M6K5hLqzSya9BjibtBsuARoPco=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "f5892ddac112a1e9b3612c39af1b72987ee5783a",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"dir": "lib",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-regression": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1643052045,
|
||||||
|
"narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-stable": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1685801374,
|
||||||
|
"narHash": "sha256-otaSUoFEMM+LjBI1XL/xGB5ao6IwnZOXc47qhIgJe8U=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "c37ca420157f4abc31e26f436c1145f8951ff373",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-23.05",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1698266953,
|
||||||
|
"narHash": "sha256-jf72t7pC8+8h8fUslUYbWTX5rKsRwOzRMX8jJsGqDXA=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "75a52265bda7fd25e06e3a67dee3f0354e73243c",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pre-commit-hooks": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-compat": [
|
||||||
|
"devenv",
|
||||||
|
"flake-compat"
|
||||||
|
],
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"gitignore": "gitignore",
|
||||||
|
"nixpkgs": [
|
||||||
|
"devenv",
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"nixpkgs-stable": "nixpkgs-stable"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1688056373,
|
||||||
|
"narHash": "sha256-2+SDlNRTKsgo3LBRiMUcoEUb6sDViRNQhzJquZ4koOI=",
|
||||||
|
"owner": "cachix",
|
||||||
|
"repo": "pre-commit-hooks.nix",
|
||||||
|
"rev": "5843cf069272d92b60c3ed9e55b7a8989c01d4c7",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "cachix",
|
||||||
|
"repo": "pre-commit-hooks.nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"devenv": "devenv",
|
||||||
|
"flake-parts": "flake-parts",
|
||||||
|
"nixpkgs": "nixpkgs_2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
{
|
||||||
|
description = "Iceshrimp development flake";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||||
|
# Flake Parts framework(https://flake.parts)
|
||||||
|
flake-parts.url = "github:hercules-ci/flake-parts";
|
||||||
|
# Devenv for better devShells(https://devenv.sh)
|
||||||
|
devenv.url = "github:cachix/devenv";
|
||||||
|
};
|
||||||
|
outputs = inputs@{ flake-parts, ... }:
|
||||||
|
flake-parts.lib.mkFlake { inherit inputs; } {
|
||||||
|
imports = [
|
||||||
|
inputs.devenv.flakeModule
|
||||||
|
];
|
||||||
|
|
||||||
|
# Define the systems that this works on. Only tested with x86_64-linux, add more if you test and it works.
|
||||||
|
systems = [
|
||||||
|
"x86_64-linux"
|
||||||
|
"aarch64-linux"
|
||||||
|
];
|
||||||
|
# Expose these attributes for every system defined above.
|
||||||
|
perSystem = { config, pkgs, ... }: {
|
||||||
|
# Devenv shells
|
||||||
|
devenv = {
|
||||||
|
shells = {
|
||||||
|
# The default shell, used by nix-direnv
|
||||||
|
default = {
|
||||||
|
name = "iceshrimp-dev-shell";
|
||||||
|
# Add additional packages to our environment
|
||||||
|
packages = [
|
||||||
|
pkgs.python3
|
||||||
|
pkgs.corepack_20
|
||||||
|
];
|
||||||
|
# No need to warn on a new version, we'll update as needed.
|
||||||
|
devenv.warnOnNewVersion = false;
|
||||||
|
# Enable typescript support
|
||||||
|
languages.typescript.enable = true;
|
||||||
|
# Enable javascript for NPM and Yarn
|
||||||
|
languages.javascript.enable = true;
|
||||||
|
languages.javascript.package = pkgs.nodejs_20;
|
||||||
|
processes = {
|
||||||
|
dev-server.exec = "yarn run dev";
|
||||||
|
};
|
||||||
|
scripts = {
|
||||||
|
build.exec = "yarn run build";
|
||||||
|
clean.exec = "yarn run clean";
|
||||||
|
clear-state.exec = "rm -rf .devenv/state/redis .devenv/state/postgres";
|
||||||
|
format.exec = "yarn run format";
|
||||||
|
install-deps.exec = "yarn install";
|
||||||
|
migrate.exec = "yarn run migrate";
|
||||||
|
prepare-config.exec = "cp .config/devenv.yml .config/default.yml";
|
||||||
|
};
|
||||||
|
services = {
|
||||||
|
postgres = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.postgresql_12;
|
||||||
|
initialDatabases = [{
|
||||||
|
name = "iceshrimp";
|
||||||
|
}];
|
||||||
|
initialScript = ''
|
||||||
|
CREATE USER iceshrimp WITH PASSWORD 'iceshrimp';
|
||||||
|
ALTER USER iceshrimp WITH SUPERUSER;
|
||||||
|
GRANT ALL ON DATABASE iceshrimp TO iceshrimp;
|
||||||
|
'';
|
||||||
|
listen_addresses = "127.0.0.1";
|
||||||
|
port = 5432;
|
||||||
|
};
|
||||||
|
redis = {
|
||||||
|
enable = true;
|
||||||
|
bind = "127.0.0.1";
|
||||||
|
port = 6379;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
# **DO NOT edit locale files** except `ja-JP.yml`.
|
||||||
|
|
||||||
|
When you add text to the ja-JP file (of misskey-dev/misskey), it will automatically be applied to other language files.
|
||||||
|
Translations added in ja-JP file should contain the original Japanese strings.
|
||||||
|
|
||||||
|
Please see [Contribution guide](../CONTRIBUTING.md) for more information.
|
||||||
+1535
File diff suppressed because it is too large
Load Diff
+1660
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,823 @@
|
|||||||
|
username: Потребителско име
|
||||||
|
password: Парола
|
||||||
|
ok: Добре
|
||||||
|
_lang_: Български
|
||||||
|
forgotPassword: Забравена парола
|
||||||
|
error: Грешка
|
||||||
|
search: Търсене
|
||||||
|
notifications: Известия
|
||||||
|
fetchingAsApObject: Извличане от Федивселената
|
||||||
|
gotIt: Разбрах!
|
||||||
|
cancel: Отказ
|
||||||
|
noThankYou: Не, благодаря
|
||||||
|
enterUsername: Въведи потребителско име
|
||||||
|
noNotes: Няма публикации
|
||||||
|
noNotifications: Няма известия
|
||||||
|
instance: Сървър
|
||||||
|
settings: Настройки
|
||||||
|
basicSettings: Основни Настройки
|
||||||
|
otherSettings: Други Настройки
|
||||||
|
profile: Профил
|
||||||
|
timeline: Инфопоток
|
||||||
|
noAccountDescription: Този потребител все още не е написал своята биография.
|
||||||
|
login: Вписване
|
||||||
|
loggingIn: Влизане
|
||||||
|
logout: Отписване
|
||||||
|
signup: Регистриране
|
||||||
|
uploading: Качване…
|
||||||
|
save: Запазване
|
||||||
|
users: Потребители
|
||||||
|
addUser: Добавяне на потребител
|
||||||
|
addInstance: Добавяне на сървър
|
||||||
|
favorite: Добавяне към отметките
|
||||||
|
favorites: Отметки
|
||||||
|
alreadyFavorited: Вече е добавено към отметките.
|
||||||
|
cantFavorite: Неуспешно добавяне към отметките.
|
||||||
|
unpin: Откачане от профила
|
||||||
|
copyLink: Копиране на връзката
|
||||||
|
delete: Изтриване
|
||||||
|
deleted: Изтрито
|
||||||
|
deleteAndEdit: Изтриване и редактиране
|
||||||
|
edited: Редактирано на {date} {time}
|
||||||
|
addToList: Добавяне към списък
|
||||||
|
sendMessage: Изпращане на съобщение
|
||||||
|
copyUsername: Копиране на потребителското име
|
||||||
|
searchUser: Търсене на потребител
|
||||||
|
reply: Отговор
|
||||||
|
jumpToPrevious: Премини към предишно
|
||||||
|
loadMore: Зареди още
|
||||||
|
showMore: Покажи още
|
||||||
|
newer: по-ново
|
||||||
|
receiveFollowRequest: Заявка за последване получена
|
||||||
|
mention: Споменаване
|
||||||
|
mentions: Споменавания
|
||||||
|
directNotes: Директни съобщения
|
||||||
|
cw: Предупреждение за съдържание
|
||||||
|
importAndExport: Импорт/Експорт на Данни
|
||||||
|
import: Импортиране
|
||||||
|
files: Файлове
|
||||||
|
download: Изтегляне
|
||||||
|
lists: Списъци
|
||||||
|
noLists: Нямаш никакви списъци
|
||||||
|
note: Публикуване
|
||||||
|
following: Последвани
|
||||||
|
followers: Последователи
|
||||||
|
followsYou: Следва те
|
||||||
|
createList: Създаване на списък
|
||||||
|
privacy: Поверителност
|
||||||
|
follow: Последване
|
||||||
|
followRequest: Заявка за последване
|
||||||
|
followRequests: Заявки за последване
|
||||||
|
unfollow: Отследване
|
||||||
|
enterEmoji: Въведи емоджи
|
||||||
|
quote: Цитиране
|
||||||
|
pinnedNote: Закачена публикация
|
||||||
|
pinned: Закачено в профила
|
||||||
|
you: Ти
|
||||||
|
clickToShow: Щракни за показване
|
||||||
|
add: Добавяне
|
||||||
|
reaction: Реакции
|
||||||
|
enterFileName: Въведи име на файл
|
||||||
|
block: Блокиране
|
||||||
|
unblock: Отблокиране
|
||||||
|
emojiName: Име на емоджи
|
||||||
|
emojiUrl: URL адрес на емоджи
|
||||||
|
addEmoji: Добавяне
|
||||||
|
flagSpeakAsCat: Говорене като котка
|
||||||
|
flagShowTimelineReplies: Показване на отговори в инфопотока
|
||||||
|
addAccount: Добавяне на акаунт
|
||||||
|
showOnRemote: Отваряне на оригиналната страница
|
||||||
|
general: Общи
|
||||||
|
emoji: Емоджи
|
||||||
|
emojis: Емоджита
|
||||||
|
wallpaper: Тапет
|
||||||
|
setWallpaper: Задаване на тапет
|
||||||
|
searchWith: 'Търсене: {q}'
|
||||||
|
youHaveNoLists: Нямаш никакви списъци
|
||||||
|
host: Хост
|
||||||
|
selectUser: Избор на потребител
|
||||||
|
recipient: Получател(и)
|
||||||
|
instances: Сървъри
|
||||||
|
registeredAt: Регистриран на
|
||||||
|
latestRequestSentAt: Последно изпратена заявка
|
||||||
|
blockThisInstance: Блокиране на този сървър
|
||||||
|
operations: Операции
|
||||||
|
version: Версия
|
||||||
|
metadata: Метаданни
|
||||||
|
disk: Диск
|
||||||
|
instanceInfo: Информация за сървъра
|
||||||
|
statistics: Статистика
|
||||||
|
noUsers: Няма потребители
|
||||||
|
noInstances: Няма сървъри
|
||||||
|
editProfile: Редактиране на профила
|
||||||
|
done: Готово
|
||||||
|
preview: Преглед
|
||||||
|
default: По подразбиране
|
||||||
|
defaultValueIs: 'По подразбиране: {value}'
|
||||||
|
federating: Федериране
|
||||||
|
instanceFollowers: Последователи на сървъра
|
||||||
|
instanceUsers: Потребители на този сървър
|
||||||
|
changePassword: Промяна на паролата
|
||||||
|
security: Сигурност
|
||||||
|
newPassword: Нова парола
|
||||||
|
more: Още
|
||||||
|
featured: Представени
|
||||||
|
noSuchUser: Потребителят не е намерен
|
||||||
|
upload: Качване
|
||||||
|
explore: Разглеждане
|
||||||
|
start: Започване
|
||||||
|
activity: Дейност
|
||||||
|
images: Изображения
|
||||||
|
birthday: Рожден ден
|
||||||
|
yearsOld: на {age} години
|
||||||
|
location: Местоположение
|
||||||
|
theme: Теми
|
||||||
|
light: Светла
|
||||||
|
dark: Тъмна
|
||||||
|
lightThemes: Светли теми
|
||||||
|
darkThemes: Тъмни теми
|
||||||
|
fileName: Име на файл
|
||||||
|
selectFile: Избор на файл
|
||||||
|
selectFiles: Избор на файлове
|
||||||
|
selectFolder: Избор на папка
|
||||||
|
selectFolders: Избор на папки
|
||||||
|
renameFile: Преименуване на файла
|
||||||
|
folderName: Име на папка
|
||||||
|
createFolder: Създаване на папка
|
||||||
|
renameFolder: Преименуване на тази папка
|
||||||
|
addFile: Добавяне на файл
|
||||||
|
emptyFolder: Тази папка е празна
|
||||||
|
inputNewFileName: Въведи ново име на файл
|
||||||
|
inputNewFolderName: Въведи ново име на папка
|
||||||
|
copyUrl: Копиране на URL адреса
|
||||||
|
rename: Преименуване
|
||||||
|
reload: Опресняване
|
||||||
|
thisYear: Година
|
||||||
|
thisMonth: Месец
|
||||||
|
today: Днес
|
||||||
|
dayX: '{day}'
|
||||||
|
monthX: '{month}'
|
||||||
|
yearX: '{year}'
|
||||||
|
pages: Страници
|
||||||
|
integration: Интеграции
|
||||||
|
registration: Регистрация
|
||||||
|
markAsReadAllUnreadNotes: Маркиране на всички публикации като прочетени
|
||||||
|
markAsReadAllTalkMessages: Маркиране на всички съобщения като прочетени
|
||||||
|
help: Помощ
|
||||||
|
inputMessageHere: Въведи съобщение тук
|
||||||
|
close: Затваряне
|
||||||
|
group: Група
|
||||||
|
groups: Групи
|
||||||
|
invites: Покани
|
||||||
|
members: Членове
|
||||||
|
messagingWithGroup: Групов чат
|
||||||
|
title: Заглавие
|
||||||
|
text: Текст
|
||||||
|
enable: Включване
|
||||||
|
next: Следващо
|
||||||
|
retype: Въведи отново
|
||||||
|
noMessagesYet: Все още няма съобщения
|
||||||
|
newMessageExists: Има нови съобщения
|
||||||
|
invitations: Покани
|
||||||
|
invitationCode: Код на поканата
|
||||||
|
available: Свободно
|
||||||
|
tooShort: Твърде кратко
|
||||||
|
tooLong: Твърде дълго
|
||||||
|
weakPassword: Слаба парола
|
||||||
|
normalPassword: Средна парола
|
||||||
|
strongPassword: Силна парола
|
||||||
|
signinHistory: История на вписванията
|
||||||
|
passwordNotMatched: Не съвпада
|
||||||
|
or: Или
|
||||||
|
language: Език
|
||||||
|
aboutX: Относно {x}
|
||||||
|
unfavorite: Премахване от отметките
|
||||||
|
favorited: Добавено към отметките.
|
||||||
|
copyContent: Копиране на съдържанието
|
||||||
|
monthAndDay: '{day}/{month}'
|
||||||
|
deleteAndEditConfirm: Сигурен ли си, че искаш да изтриеш тази публикация и да я редактираш?
|
||||||
|
Ще загубиш всички реакции, подсилвания и отговори към нея.
|
||||||
|
older: по-старо
|
||||||
|
followRequestAccepted: Заявка за последване приета
|
||||||
|
export: Експортиране
|
||||||
|
notes: Публикации
|
||||||
|
manageLists: Управление на списъци
|
||||||
|
retry: Повторен опит
|
||||||
|
defaultNoteVisibility: Видимост по подразбиране
|
||||||
|
followRequestPending: Заявка за последване в изчакване
|
||||||
|
removeReaction: Премахване на реакцията
|
||||||
|
editWidgetsExit: Готово
|
||||||
|
flagAsCat: Котка ли си? 😺
|
||||||
|
loginFailed: Неуспешно вписване
|
||||||
|
removeWallpaper: Премахване на тапета
|
||||||
|
selectInstance: Избор на сървър
|
||||||
|
latestRequestReceivedAt: Последно получена заявка
|
||||||
|
stopActivityDelivery: Спиране на изпращането на дейности
|
||||||
|
software: Софтуер
|
||||||
|
blockedInstances: Блокирани сървъри
|
||||||
|
pinLimitExceeded: Не може да закачаш повече публикации
|
||||||
|
instanceFollowing: Последвани на сървъра
|
||||||
|
currentPassword: Текуща парола
|
||||||
|
keepOriginalUploading: Запазване на оригиналното изображение
|
||||||
|
themeForLightMode: Тема за използване в светъл режим
|
||||||
|
themeForDarkMode: Тема за използване в тъмен режим
|
||||||
|
syncDeviceDarkMode: Синхронизиране на тъмния режим с настройките на устройството
|
||||||
|
deleteFolder: Изтриване на тази папка
|
||||||
|
hasChildFilesOrFolders: Тъй като тази папка не е празна, тя не може да бъде изтрита.
|
||||||
|
signinRequired: Моля, регистрирайте се или се впишете, преди да продължите
|
||||||
|
signinFailed: Неуспешно вписване. Въведените потребителско име или парола са неправилни.
|
||||||
|
emailRequiredForSignup: Изискване на адрес на ел. поща за регистриране
|
||||||
|
createGroup: Създаване на група
|
||||||
|
noteOf: Публикация от {user}
|
||||||
|
unavailable: Не е свободно
|
||||||
|
passwordMatched: Съвпада
|
||||||
|
unmarkAsSensitive: Отмаркиране като деликатно
|
||||||
|
introIceshrimp: Добре дошли! Iceshrimp е децентрализирана социална медийна платформа
|
||||||
|
с отворен код, която е безплатна завинаги! 🚀
|
||||||
|
headlineIceshrimp: Децентрализирана социална медийна платформа с отворен код, която
|
||||||
|
е безплатна завинаги! 🚀
|
||||||
|
searchPlaceholder: Търсене във Федивселената
|
||||||
|
pin: Закачане в профила
|
||||||
|
youGotNewFollower: те последва
|
||||||
|
showLess: Покажи по-малко
|
||||||
|
markAsSensitive: Маркиране като деликатно
|
||||||
|
clearCachedFiles: Изчистване на кеша
|
||||||
|
inMb: В мегабайти
|
||||||
|
pinnedUsers: Закачени потребители
|
||||||
|
pinnedNotes: Закачени публикации
|
||||||
|
hcaptcha: hCaptcha
|
||||||
|
enableHcaptcha: Включване на hCaptcha
|
||||||
|
recaptcha: reCAPTCHA
|
||||||
|
enableRecaptcha: Включване на reCAPTCHA
|
||||||
|
license: Лиценз
|
||||||
|
_theme:
|
||||||
|
explore: Разглеждане на темите
|
||||||
|
description: Описание
|
||||||
|
color: Цвят
|
||||||
|
key: Ключ
|
||||||
|
func: Функции
|
||||||
|
argument: Аргумент
|
||||||
|
defaultValue: Стойност по подразбиране
|
||||||
|
installedThemes: Инсталирани теми
|
||||||
|
keys:
|
||||||
|
link: Връзка
|
||||||
|
hashtag: Хаштаг
|
||||||
|
mention: Споменаване
|
||||||
|
fg: Текст
|
||||||
|
renote: Подсилване
|
||||||
|
manage: Управление на темите
|
||||||
|
install: Инсталиране на тема
|
||||||
|
code: Код на темата
|
||||||
|
builtinThemes: Вградени теми
|
||||||
|
constant: Константа
|
||||||
|
addConstant: Добавяне на константа
|
||||||
|
_time:
|
||||||
|
second: Секунди
|
||||||
|
minute: Минути
|
||||||
|
hour: Часа
|
||||||
|
day: Дни
|
||||||
|
_ago:
|
||||||
|
future: Бъдеще
|
||||||
|
justNow: Току-що
|
||||||
|
secondsAgo: преди {n}сек
|
||||||
|
minutesAgo: "преди {n}мин {n2}сек"
|
||||||
|
hoursAgo: "преди {n}ч {n2}мин"
|
||||||
|
daysAgo: "преди {n}д {n2}ч"
|
||||||
|
weeksAgo: "преди {n}се {n2}д"
|
||||||
|
monthsAgo: "преди {n}мес {n2}сед"
|
||||||
|
yearsAgo: "преди {n}г {n2}мес"
|
||||||
|
_tutorial:
|
||||||
|
step1_1: Добре дошли!
|
||||||
|
step1_2: Нека да ви настроим. Ще бъдете готови за нула време!
|
||||||
|
step3_1: Сега е време да последвате няколко хора!
|
||||||
|
title: Как се използва Iceshrimp
|
||||||
|
step2_1: Първо, моля, попълнете своя профил.
|
||||||
|
step2_2: Предоставянето на известна информация за това кой сте вие ще улесни другите
|
||||||
|
да разберат дали искат да видят вашите публикации или да ви следват.
|
||||||
|
step4_2: За първата си публикация някои хора обичат да правят публикация {introduction}
|
||||||
|
или просто „Здравей свят!“
|
||||||
|
step5_2: Вашият сървър има активирани {timelines} различни инфопотоци.
|
||||||
|
step5_3: Началният {icon} инфопоток е мястото, където можеш да видиш публикации
|
||||||
|
от акаунтите, които следваш.
|
||||||
|
step5_4: Местният {icon} инфопоток е мястото, където можеш да видиш публикации от
|
||||||
|
всички останали на този сървър.
|
||||||
|
step5_5: Социалният {icon} инфопоток е комбинация от Началния и Местния инфопоток.
|
||||||
|
step5_6: Препоръчаният {icon} инфопоток е мястото, където можеш да видиш публикации
|
||||||
|
от сървъри, препоръчани от администраторите.
|
||||||
|
step6_1: И така, какво е това място?
|
||||||
|
step6_4: Сега отидете, изследвайте и се забавлявайте!
|
||||||
|
step6_3: Всеки сървър работи по различни начини и не всички сървъри работят с Iceshrimp.
|
||||||
|
Този обаче го прави! Малко е сложно, но ще разберете за нула време.
|
||||||
|
step5_7: Глобалният {icon} инфопоток е мястото, където можете да видиш публикации
|
||||||
|
от всеки друг свързан сървър.
|
||||||
|
_filters:
|
||||||
|
fromUser: От потребител
|
||||||
|
notesBefore: Публикации преди
|
||||||
|
notesAfter: Публикации след
|
||||||
|
followingOnly: Само последвани
|
||||||
|
followersOnly: Само последователи
|
||||||
|
_dialog:
|
||||||
|
word: дума
|
||||||
|
_permissions:
|
||||||
|
"write:favorites": Редактирай списъка си с отметки
|
||||||
|
"read:favorites": Виж списъка си с отметки
|
||||||
|
_2fa:
|
||||||
|
renewTOTPCancel: Отказ
|
||||||
|
_widgets:
|
||||||
|
timeline: Инфопоток
|
||||||
|
calendar: Календар
|
||||||
|
digitalClock: Дигитален часовник
|
||||||
|
clock: Часовник
|
||||||
|
notifications: Известия
|
||||||
|
button: Бутон
|
||||||
|
photos: Снимки
|
||||||
|
unixClock: UNIX часовник
|
||||||
|
activity: Дейност
|
||||||
|
slideshow: Слайдшоу
|
||||||
|
trends: Актуални
|
||||||
|
_userList:
|
||||||
|
chooseList: Избор на списък
|
||||||
|
_profile:
|
||||||
|
description: Биография
|
||||||
|
metadata: Допълнителна информация
|
||||||
|
metadataContent: Съдържание
|
||||||
|
name: Име
|
||||||
|
username: Потребителско име
|
||||||
|
metadataEdit: Редактиране на допълнителната информация
|
||||||
|
changeAvatar: Промяна на профилната снимка
|
||||||
|
metadataLabel: Етикет
|
||||||
|
_timelines:
|
||||||
|
recommended: Препоръчани
|
||||||
|
local: Местни
|
||||||
|
social: Социални
|
||||||
|
global: Глобални
|
||||||
|
home: Начало
|
||||||
|
_pages:
|
||||||
|
blocks:
|
||||||
|
_numberInput:
|
||||||
|
default: Стойност по подразбиране
|
||||||
|
text: Заглавие
|
||||||
|
_switch:
|
||||||
|
default: Стойност по подразбиране
|
||||||
|
text: Заглавие
|
||||||
|
_radioButton:
|
||||||
|
default: Стойност по подразбиране
|
||||||
|
title: Заглавие
|
||||||
|
_textInput:
|
||||||
|
default: Стойност по подразбиране
|
||||||
|
text: Заглавие
|
||||||
|
_textareaInput:
|
||||||
|
default: Стойност по подразбиране
|
||||||
|
text: Заглавие
|
||||||
|
button: Бутон
|
||||||
|
if: Ако
|
||||||
|
image: Изображения
|
||||||
|
text: Текст
|
||||||
|
_post:
|
||||||
|
text: Съдържание
|
||||||
|
_button:
|
||||||
|
_action:
|
||||||
|
_dialog:
|
||||||
|
content: Съдържание
|
||||||
|
text: Заглавие
|
||||||
|
_counter:
|
||||||
|
text: Заглавие
|
||||||
|
inc: Стъпка
|
||||||
|
_if:
|
||||||
|
variable: Променлива
|
||||||
|
script:
|
||||||
|
categories:
|
||||||
|
list: Списъци
|
||||||
|
value: Стойности
|
||||||
|
fn: Функции
|
||||||
|
blocks:
|
||||||
|
_join:
|
||||||
|
arg1: Списъци
|
||||||
|
add: Добави
|
||||||
|
_dailyRannum:
|
||||||
|
arg1: Минимална стойност
|
||||||
|
arg2: Максимална стойност
|
||||||
|
_seedRannum:
|
||||||
|
arg2: Минимална стойност
|
||||||
|
arg3: Максимална стойност
|
||||||
|
_rannum:
|
||||||
|
arg1: Минимална стойност
|
||||||
|
arg2: Максимална стойност
|
||||||
|
text: Текст
|
||||||
|
_strLen:
|
||||||
|
arg1: Текст
|
||||||
|
_strPick:
|
||||||
|
arg1: Текст
|
||||||
|
_strReplace:
|
||||||
|
arg1: Текст
|
||||||
|
_strReverse:
|
||||||
|
arg1: Текст
|
||||||
|
_if:
|
||||||
|
arg2: Тогава
|
||||||
|
arg3: Иначе
|
||||||
|
arg1: Ако
|
||||||
|
_stringToNumber:
|
||||||
|
arg1: Текст
|
||||||
|
_splitStrByLine:
|
||||||
|
arg1: Текст
|
||||||
|
ref: Променлива
|
||||||
|
fn: Функция
|
||||||
|
_listLen:
|
||||||
|
arg1: Списък
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: Списък
|
||||||
|
_seedRandomPick:
|
||||||
|
arg2: Списък
|
||||||
|
_pick:
|
||||||
|
arg1: Списък
|
||||||
|
_randomPick:
|
||||||
|
arg1: Списък
|
||||||
|
types:
|
||||||
|
string: Текст
|
||||||
|
array: Списък
|
||||||
|
contentBlocks: Съдържание
|
||||||
|
created: Страницата е създадена успешно
|
||||||
|
deleted: Страницата е изтрита успешно
|
||||||
|
newPage: Създаване на нова страница
|
||||||
|
editPage: Редактиране на тази страница
|
||||||
|
featured: Популярни
|
||||||
|
like: Харесване
|
||||||
|
contents: Съдържание
|
||||||
|
font: Шрифт
|
||||||
|
title: Заглавие
|
||||||
|
liked: Харесани страници
|
||||||
|
my: Моите страници
|
||||||
|
pageSetting: Настройки на страницата
|
||||||
|
editThisPage: Редактиране на тази страница
|
||||||
|
updated: Страницата е редактирана успешно
|
||||||
|
aboutIceshrimp: Относно Iceshrimp
|
||||||
|
token: Токен
|
||||||
|
moderator: Модератор
|
||||||
|
moderation: Модерация
|
||||||
|
userList: Списъци
|
||||||
|
_deck:
|
||||||
|
_columns:
|
||||||
|
tl: Инфопоток
|
||||||
|
direct: Директни съобщения
|
||||||
|
notifications: Известия
|
||||||
|
antenna: Антена
|
||||||
|
list: Списък
|
||||||
|
addColumn: Добавяне на колона
|
||||||
|
createNewClip: Създай нова подборка
|
||||||
|
unclip: Премахни от подборка
|
||||||
|
repliesCount: Брой изпратени отговори
|
||||||
|
repliedCount: Брой получени отговори
|
||||||
|
followersCount: Брой последователи
|
||||||
|
sentReactionsCount: Брой изпратени реакции
|
||||||
|
receivedReactionsCount: Брой получени реакции
|
||||||
|
value: Стойност
|
||||||
|
currentVersion: Настояща версия
|
||||||
|
latestVersion: Най-нова версия
|
||||||
|
createdAt: Създадено на
|
||||||
|
clips: Подборки
|
||||||
|
translate: Превеждане
|
||||||
|
translatedFrom: Преведено от {x}
|
||||||
|
whatIsNew: Показване на промените
|
||||||
|
searchResult: Резултати от търсенето
|
||||||
|
_aboutIceshrimp:
|
||||||
|
translation: Преводи
|
||||||
|
contributors: Основни сътрудници
|
||||||
|
source: Iceshrimp разработка
|
||||||
|
changelog: Дневник на промените
|
||||||
|
documentation: Документация
|
||||||
|
chatroom: Чат стая
|
||||||
|
allContributors: Всички сътрудници
|
||||||
|
pinnedPages: Закачени страници
|
||||||
|
about: Относно
|
||||||
|
administrator: Администратор
|
||||||
|
invalidValue: Невалидна стойност.
|
||||||
|
_notification:
|
||||||
|
_types:
|
||||||
|
follow: Нови последователи
|
||||||
|
reaction: Реакции
|
||||||
|
renote: Подсилвания
|
||||||
|
quote: Цитирания
|
||||||
|
pollVote: Гласувания в анкети
|
||||||
|
receiveFollowRequest: Получени заявки за следване
|
||||||
|
reply: Отговора
|
||||||
|
mention: Споменавания
|
||||||
|
followRequestAccepted: Приети заявки за следване
|
||||||
|
all: Всички
|
||||||
|
pollEnded: Приключване на анкети
|
||||||
|
groupInvited: Покани в групи
|
||||||
|
app: Известия от свързани приложения
|
||||||
|
youGotQuote: '{name} те цитира'
|
||||||
|
youGotReply: '{name} ти отговори'
|
||||||
|
youGotMention: '{name} те спомена'
|
||||||
|
youGotMessagingMessageFromUser: '{name} ти изпрати чат съобщение'
|
||||||
|
youWereFollowed: те последва
|
||||||
|
_actions:
|
||||||
|
renote: Подсилвания
|
||||||
|
reply: Отговор
|
||||||
|
fileUploaded: Файлът е качен успешно
|
||||||
|
apps: Приложения
|
||||||
|
remindMeLater: Може би по-късно
|
||||||
|
clip: Подборка
|
||||||
|
notesCount: Брой публикации
|
||||||
|
followingCount: Брой последвани акаунти
|
||||||
|
create: Създаване
|
||||||
|
oneHour: Един час
|
||||||
|
oneDay: Един ден
|
||||||
|
oneWeek: Една седмица
|
||||||
|
tenMinutes: 10 минути
|
||||||
|
numberOfColumn: Брой колони
|
||||||
|
video: Видео
|
||||||
|
file: Файл
|
||||||
|
image: Изображение
|
||||||
|
audio: Звук
|
||||||
|
failedToUpload: Неуспешно качване
|
||||||
|
openInWindow: Отваряне в прозорец
|
||||||
|
renotedBy: Подсилено от {user}
|
||||||
|
unfollowConfirm: Сигурен ли си, че искаш да спреш да следваш {name}?
|
||||||
|
somethingHappened: Възникна грешка
|
||||||
|
pageLoadError: Възникна грешка при зареждането на страницата.
|
||||||
|
enterListName: Въведи име за списъка
|
||||||
|
_mfm:
|
||||||
|
link: Връзка
|
||||||
|
hashtag: Хаштаг
|
||||||
|
url: URL адрес
|
||||||
|
mention: Споменаване
|
||||||
|
font: Шрифт
|
||||||
|
share: Споделяне
|
||||||
|
openInNewTab: Отваряне в нов раздел
|
||||||
|
showInPage: Показване в страницата
|
||||||
|
shareWithNote: Споделяне чрез публикация
|
||||||
|
flagAsBot: Маркиране на този акаунт като бот 🤖
|
||||||
|
nsfw: Деликатно
|
||||||
|
hideFromHome: Скриване от началния инфопоток
|
||||||
|
expandAllCws: Показване на съдържанието за всички отговори
|
||||||
|
collapseAllCws: Скриване на съдържанието за всички отговори
|
||||||
|
renoted: Подсилено.
|
||||||
|
renoteMute: Заглушаване на подсилванията
|
||||||
|
sensitive: Деликатно
|
||||||
|
mute: Заглушаване
|
||||||
|
attachCancel: Премахване на прикачен файл
|
||||||
|
renote: Подсилване
|
||||||
|
selectAntenna: Избор на антена
|
||||||
|
selectList: Избор на списък
|
||||||
|
selectChannel: Избор на канал
|
||||||
|
settingGuide: Препоръчителни настройки
|
||||||
|
annotation: Коментари
|
||||||
|
all: Всичко
|
||||||
|
muteAndBlock: Заглушени и блокирани
|
||||||
|
blockedUsers: Блокирани потребители
|
||||||
|
mutedUsers: Заглушени потребители
|
||||||
|
noteDeleteConfirm: Сигурен ли си, че искаш да изтриеш тази публикация?
|
||||||
|
hiddenTags: Скрити хаштагове
|
||||||
|
home: Начало
|
||||||
|
newPasswordRetype: Повтори новата парола
|
||||||
|
remove: Изтриване
|
||||||
|
removed: Успешно изтриване
|
||||||
|
deleteAreYouSure: Сигурен ли си, че искаш да изтриеш "{x}"?
|
||||||
|
saved: Запазени
|
||||||
|
startMessaging: Започване на нов чат
|
||||||
|
uploadFromUrl: Качване от URL адрес
|
||||||
|
imageUrl: URL адрес на изображение
|
||||||
|
fromUrl: От URL адрес
|
||||||
|
messaging: Чат
|
||||||
|
avatar: Профилна снимка
|
||||||
|
instanceName: Име на сървъра
|
||||||
|
instanceDescription: Описание на сървъра
|
||||||
|
accept: Приемане
|
||||||
|
name: Име
|
||||||
|
antennas: Антени
|
||||||
|
enableLocalTimeline: Включване на местния инфопоток
|
||||||
|
enableGlobalTimeline: Включване на глобалния инфопоток
|
||||||
|
findOtherInstance: Намиране на друг сървър
|
||||||
|
removeMember: Премахване на член
|
||||||
|
isAdmin: Администратор
|
||||||
|
isModerator: Модератор
|
||||||
|
_preferencesBackups:
|
||||||
|
save: Запазване на промените
|
||||||
|
loadFile: Зареждане от файл
|
||||||
|
list: Създадени резервни копия
|
||||||
|
cannotSave: Неуспешно запазване
|
||||||
|
apply: Прилагане към това устройство
|
||||||
|
saveConfirm: Запазване на резервното копие като {name}?
|
||||||
|
createdAt: 'Създадено на: {date} {time}'
|
||||||
|
updatedAt: 'Обновено на: {date} {time}'
|
||||||
|
cannotLoad: Неуспешно зареждане
|
||||||
|
saveNew: Запазване на ново резервно копие
|
||||||
|
inputName: Моля, въведи име за това резервно копие
|
||||||
|
deleteConfirm: Изтриване на резервното копие {name}?
|
||||||
|
delete: Изтриване на резервното копие
|
||||||
|
_registry:
|
||||||
|
createKey: Създаване на ключ
|
||||||
|
domain: Домейн
|
||||||
|
keys: Ключове
|
||||||
|
key: Ключ
|
||||||
|
_menuDisplay:
|
||||||
|
hide: Скриване
|
||||||
|
_channel:
|
||||||
|
nameOnly: Само име
|
||||||
|
notesCount: '{n} Публикации'
|
||||||
|
nameAndDescription: Име и описание
|
||||||
|
create: Създаване на канал
|
||||||
|
_messaging:
|
||||||
|
groups: Групи
|
||||||
|
dms: Лични
|
||||||
|
_sfx:
|
||||||
|
antenna: Антени
|
||||||
|
chat: Чат
|
||||||
|
note: Нова публикация
|
||||||
|
notification: Известия
|
||||||
|
_weekday:
|
||||||
|
sunday: Неделя
|
||||||
|
monday: Понеделник
|
||||||
|
tuesday: Вторник
|
||||||
|
wednesday: Сряда
|
||||||
|
thursday: Четвъртък
|
||||||
|
friday: Петък
|
||||||
|
saturday: Събота
|
||||||
|
_antennaSources:
|
||||||
|
all: Всички публикации
|
||||||
|
homeTimeline: Публикации от последвани потребители
|
||||||
|
users: Публикации от конкретни потребители
|
||||||
|
userList: Публикации от конкретен списък с потребители
|
||||||
|
userGroup: Публикации от потребители в конкретна група
|
||||||
|
instances: Публикации от всички потребители на сървър
|
||||||
|
_visibility:
|
||||||
|
localOnly: Само местни
|
||||||
|
public: Публична
|
||||||
|
publicDescription: Публикацията ще бъде видима във всички публични инфопотоци
|
||||||
|
home: Скрита
|
||||||
|
specified: Директна
|
||||||
|
localOnlyDescription: Не е видима за отдалечени потребители
|
||||||
|
specifiedDescription: Видима само за определени потребители
|
||||||
|
followersDescription: Видима само за последователите ти и споменатите потребители
|
||||||
|
followers: Последователи
|
||||||
|
homeDescription: Публикуване само в началния инфопоток
|
||||||
|
_exportOrImport:
|
||||||
|
allNotes: Всички публикации
|
||||||
|
exploreFediverse: Разглеждане на Федивселената
|
||||||
|
notesAndReplies: Публикации и отговори
|
||||||
|
popularUsers: Популярни потребители
|
||||||
|
recentlyUpdatedUsers: Последно активни потребители
|
||||||
|
newPasswordIs: Новата парола е "{password}"
|
||||||
|
cacheClear: Изчистване на кеша
|
||||||
|
notFound: Не е намерено
|
||||||
|
popularTags: Популярни тагове
|
||||||
|
local: Местни
|
||||||
|
total: Общо
|
||||||
|
remote: Отдалечени
|
||||||
|
signinWith: Вписване чрез {x}
|
||||||
|
uiLanguage: Език на потребителския интерфейс
|
||||||
|
accountSettings: Настройки на акаунта
|
||||||
|
dashboard: Табло
|
||||||
|
openImageInNewTab: Отваряне на изображенията в нов раздел
|
||||||
|
youHaveNoGroups: Нямаш групи
|
||||||
|
existingAccount: Съществуващ акаунт
|
||||||
|
createAccount: Създаване на акаунт
|
||||||
|
category: Категория
|
||||||
|
tags: Тагове
|
||||||
|
accessibility: Достъпност
|
||||||
|
details: Подробности
|
||||||
|
install: Инсталиране
|
||||||
|
email: Ел. поща
|
||||||
|
emailAddress: Адрес на ел. поща
|
||||||
|
addItem: Добавяне на елемент
|
||||||
|
menu: Меню
|
||||||
|
visibility: Видимост
|
||||||
|
smtpHost: Хост
|
||||||
|
smtpUser: Потребителско име
|
||||||
|
invisibleNote: Невидима публикация
|
||||||
|
deletedNote: Изтрита публикация
|
||||||
|
description: Описание
|
||||||
|
preferencesBackups: Резервни копия
|
||||||
|
poll: Анкета
|
||||||
|
_relayStatus:
|
||||||
|
accepted: Прието
|
||||||
|
_feeds:
|
||||||
|
rss: RSS
|
||||||
|
atom: Atom
|
||||||
|
jsonFeed: JSON feed
|
||||||
|
copyFeed: Копиране на емисия
|
||||||
|
overview: Обзор
|
||||||
|
other: Други
|
||||||
|
channel: Канали
|
||||||
|
renotedCount: Брой получени подсилвания
|
||||||
|
no: Не
|
||||||
|
yes: Да
|
||||||
|
accountInfo: Информация за акаунта
|
||||||
|
send: Изпращане
|
||||||
|
renotesCount: Брой изпратени подсилвания
|
||||||
|
clearCache: Изчистване на кеша
|
||||||
|
closeAccount: Затваряне на акаунта
|
||||||
|
saveConfirm: Запазване на промените?
|
||||||
|
onlineUsersCount: '{n} потребители на линия'
|
||||||
|
nNotes: '{n} Публикации'
|
||||||
|
nUsers: '{n} Потребители'
|
||||||
|
developer: Разработчик
|
||||||
|
gallery: Галерия
|
||||||
|
popularPosts: Популярни страници
|
||||||
|
recentPosts: Последни страници
|
||||||
|
info: Относно
|
||||||
|
user: Потребител
|
||||||
|
offline: Извън линия
|
||||||
|
online: На линия
|
||||||
|
onlineStatus: Онлайн състояние
|
||||||
|
addDescription: Добавяне на описание
|
||||||
|
goBack: Назад
|
||||||
|
editCode: Редактиране на кода
|
||||||
|
publish: Публикувай
|
||||||
|
manageAccounts: Управление на акаунти
|
||||||
|
breakFollow: Премахване на последовател
|
||||||
|
learnMore: Научи повече
|
||||||
|
hashtags: Хаштагове
|
||||||
|
priority: Приоритет
|
||||||
|
hide: Скриване
|
||||||
|
document: Документация
|
||||||
|
saveAs: Запазване като…
|
||||||
|
copy: Копиране
|
||||||
|
emailServer: Ел. пощенски сървър
|
||||||
|
uninstall: Деинсталиране
|
||||||
|
author: Автор
|
||||||
|
smtpPass: Парола
|
||||||
|
accounts: Акаунти
|
||||||
|
userInfo: Информация за потребителя
|
||||||
|
isBot: Този акаунт е бот
|
||||||
|
removeAreYouSure: Сигурен ли си, че искаш да премахнеш "{x}"?
|
||||||
|
searchByGoogle: Търсене
|
||||||
|
size: Размер
|
||||||
|
tablet: Таблет
|
||||||
|
smartphone: Смартфон
|
||||||
|
deleteAccount: Изтриване на акаунта
|
||||||
|
numberOfPageCache: Брой кеширани страници
|
||||||
|
localOnly: Само местни
|
||||||
|
remoteOnly: Само отдалечени
|
||||||
|
beta: Бета
|
||||||
|
fast: Бърза
|
||||||
|
slow: Бавна
|
||||||
|
speed: Скорост
|
||||||
|
account: Акаунт
|
||||||
|
move: Преместване
|
||||||
|
migration: Прехвърляне
|
||||||
|
moveTo: Преместване на текущия акаунт в нов акаунт
|
||||||
|
moveToLabel: 'Акаунт, към който се местиш:'
|
||||||
|
moveAccount: Преместване на акаунта!
|
||||||
|
_gallery:
|
||||||
|
like: Харесване
|
||||||
|
liked: Харесани публикации
|
||||||
|
my: Моята галерия
|
||||||
|
withFiles: С прикачени файлове
|
||||||
|
unmute: Отмяна на заглушаването
|
||||||
|
renoteUnmute: Отмяна на заглушаването на подсилванията
|
||||||
|
unrenote: Отмяна на подсилването
|
||||||
|
flagAsCatDescription: Ще получиш котешки уши и ще говориш като котка!
|
||||||
|
editWidgets: Редактиране на джаджите
|
||||||
|
selectWidget: Избор на джаджа
|
||||||
|
customEmojis: Персонализирани Емоджи
|
||||||
|
perHour: За час
|
||||||
|
perDay: За ден
|
||||||
|
announcements: Оповестявания
|
||||||
|
manageGroups: Управление на групи
|
||||||
|
remoteUserCaution: Информацията от отдалечени потребители може да е непълна.
|
||||||
|
registeredDate: Присъединяване
|
||||||
|
nUsersRead: прочетено от {n}
|
||||||
|
attachFile: Прикачване на файлове
|
||||||
|
watch: Наблюдаване
|
||||||
|
unwatch: Спиране на наблюдаването
|
||||||
|
invite: Поканване
|
||||||
|
manageAntennas: Управление на антени
|
||||||
|
searchEmptyQuery: Моля, въведете термин за търсене.
|
||||||
|
_wordMute:
|
||||||
|
mutedNotes: Заглушени публикации
|
||||||
|
_poll:
|
||||||
|
totalVotes: '{n} гласа общо'
|
||||||
|
votesCount: '{n} гласа'
|
||||||
|
choiceN: Избор {n}
|
||||||
|
expiration: Приключване на анкетата
|
||||||
|
infinite: Никога
|
||||||
|
_postForm:
|
||||||
|
_placeholders:
|
||||||
|
b: Какво се случва около теб?
|
||||||
|
recentlyDiscoveredUsers: Новооткрити потребители
|
||||||
|
recentlyRegisteredUsers: Новоприсъединени потребители
|
||||||
|
inviteToGroup: Поканване в група
|
||||||
|
groupName: Име на групата
|
||||||
|
nothing: Няма нищо за гледане тук
|
||||||
|
chooseEmoji: Избор на емоджи
|
||||||
|
deleteAll: Изтриване на всички
|
||||||
|
newNoteRecived: Има нови публикации
|
||||||
|
useCw: Скриване на съдържание
|
||||||
|
abuseReports: Доклади
|
||||||
|
reportAbuse: Докладване
|
||||||
|
reportAbuseOf: Докладване на {name}
|
||||||
|
switchUi: Превключване на оформление
|
||||||
|
reloadToApplySetting: Тази настройка ще се приложи само след презареждане на страницата.
|
||||||
|
Презареждане сега?
|
||||||
|
apply: Прилагане
|
||||||
|
selectAccount: Избор на акаунт
|
||||||
|
markAllAsRead: Маркиране на всички като прочетени
|
||||||
|
switchAccount: Превключване на акаунт
|
||||||
|
unread: Непрочетени
|
||||||
|
filter: Филтриране
|
||||||
|
previewNoteText: Показване на преглед
|
||||||
|
muteThread: Заглушаване на нишката
|
||||||
|
ffVisibility: Видимост на Последвани/Последователи
|
||||||
|
navbar: Навигационна лента
|
||||||
+2192
File diff suppressed because it is too large
Load Diff
+1009
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,236 @@
|
|||||||
|
_lang_: "Dansk"
|
||||||
|
monthAndDay: '{month}/{day}'
|
||||||
|
search: Søge
|
||||||
|
notifications: Notifikationer
|
||||||
|
username: Brugernavn
|
||||||
|
password: Adgangskode
|
||||||
|
forgotPassword: Glemt adgangskode
|
||||||
|
fetchingAsApObject: Henter fra Fediverset
|
||||||
|
ok: OK
|
||||||
|
gotIt: Forstået!
|
||||||
|
cancel: Annullere
|
||||||
|
enterUsername: Indtast brugernavn
|
||||||
|
instance: Instans
|
||||||
|
renotedBy: Forstærket fra {user}
|
||||||
|
noNotes: Ingen opslag
|
||||||
|
otherSettings: Andre Indstillinger
|
||||||
|
profile: Profil
|
||||||
|
timeline: Tidslinje
|
||||||
|
signup: Registrere
|
||||||
|
logout: Log Ud
|
||||||
|
login: Log ind
|
||||||
|
uploading: Uploader...
|
||||||
|
save: Gem
|
||||||
|
users: Brugere
|
||||||
|
favorited: Tilsat til bogmærker.
|
||||||
|
unfavorite: Fjerne fra bogmærker
|
||||||
|
alreadyFavorited: Allerede inden i bogmærker.
|
||||||
|
pin: Fastgøre til profil
|
||||||
|
unpin: Løse fra profil
|
||||||
|
delete: Slet
|
||||||
|
addToList: Tilsæt til liste
|
||||||
|
deleteAndEdit: Slet og ændre
|
||||||
|
reply: Svar
|
||||||
|
loadMore: Indlæs mere
|
||||||
|
receiveFollowRequest: Følgeanmodning er blevet sendt
|
||||||
|
import: Importere
|
||||||
|
export: Eksportere
|
||||||
|
driveFileDeleteConfirm: Er du sikker på at du vil slette filen "{name}"? Denne vil
|
||||||
|
blive slettet fra alle tilknyttede opslage.
|
||||||
|
unfollowConfirm: Er du sikker på at du vil ikke følge {name} længere?
|
||||||
|
privacy: Privatlivs
|
||||||
|
enterListName: Indtast navnen for denne list
|
||||||
|
makeFollowManuallyApprove: Følgeanmodninger kræver godkendelse
|
||||||
|
unrenote: Fratag forstærkelse
|
||||||
|
renote: Forstærk
|
||||||
|
add: Tilsæt
|
||||||
|
reactionSetting: Reaktioner til at vise i reaktion-vælgeren
|
||||||
|
reactionSettingDescription2: Bevæg til at flytte om på, tryk til at slette og indtast
|
||||||
|
"+" til at tilsætte.
|
||||||
|
rememberNoteVisibility: Husk opslagsynlidhedsindstillinger
|
||||||
|
emojis: Emoji
|
||||||
|
flagShowTimelineReplies: Vis svare i tidslinjen
|
||||||
|
flagAsCatDescription: Du kommer til at få katøre og tale som en kat!
|
||||||
|
showOnRemote: Vis på fjerninstans
|
||||||
|
general: Generelt
|
||||||
|
accountMoved: 'Bruger har flyttet til et nyt konto:'
|
||||||
|
settings: Indstillinger
|
||||||
|
basicSettings: Primær Indstillinger
|
||||||
|
openInWindow: Åben i vindue
|
||||||
|
noAccountDescription: Denne bruger har ikke skrevet deres bio endnu.
|
||||||
|
loggingIn: Logger ind
|
||||||
|
cantFavorite: Kunne ikke tilsætte til bogmærker.
|
||||||
|
copyUsername: Kopi brugernavn
|
||||||
|
copyContent: Kopi indholdet
|
||||||
|
copyLink: Kopi link
|
||||||
|
searchUser: Søg for en bruger
|
||||||
|
files: Filer
|
||||||
|
noLists: Du har ingen liste
|
||||||
|
lists: Lister
|
||||||
|
reaction: Reaktioner
|
||||||
|
sensitive: NSFW
|
||||||
|
emoji: Emoji
|
||||||
|
cacheRemoteFilesDescription: Når denne indstilling er deaktiveret, fremmed filer bliver
|
||||||
|
indlæset direkte fra denne fjerneinstans. Hvis du deaktivere dette så vil det formindske
|
||||||
|
brugte opbevaringsplads men det vil også få netværktraffic til at stige fordi miniaturebilleder
|
||||||
|
vil ikke blive skabt.
|
||||||
|
flagAsBot: Markere denne konto som en robot
|
||||||
|
flagShowTimelineRepliesDescription: Vis svare af brugere til opslage af andre brugere
|
||||||
|
i tidslinjen hvis den bliver tændt.
|
||||||
|
loginFailed: Kunne ikke logge ind
|
||||||
|
silenceThisInstance: Nedtone denne instans
|
||||||
|
deleteAndEditConfirm: Er du sikker på at du vil slet denne opslag og ændre det? Du
|
||||||
|
vil tabe alle reaktioner, forstærkninger og svarer indenfor denne opslag.
|
||||||
|
editNote: Ændre note
|
||||||
|
deleted: Slettet
|
||||||
|
edited: 'Ændret den {date} {time}'
|
||||||
|
sendMessage: Send en besked
|
||||||
|
youShouldUpgradeClient: Til at vise denne side, vær sød at refresh til at opdatere
|
||||||
|
din brugerenhed.
|
||||||
|
defaultNoteVisibility: Standard synlighed
|
||||||
|
follow: Følge
|
||||||
|
followRequest: Følge
|
||||||
|
followRequests: Følgeanmodninger
|
||||||
|
unfollow: Følge ikke længere
|
||||||
|
followRequestPending: Følgeanmodning ventes på
|
||||||
|
enterEmoji: Indtast en emoji
|
||||||
|
renoted: Forstærket.
|
||||||
|
cantRenote: Denne opslag kunne ikke forstærkes.
|
||||||
|
cantReRenote: En forstærkelse kan ikke forstærkes.
|
||||||
|
quote: Citere
|
||||||
|
pinnedNote: Fastgjort opslag
|
||||||
|
pinned: Fastgøre til profil
|
||||||
|
you: Dig
|
||||||
|
clickToShow: Tryk til at vise
|
||||||
|
unblock: Blokere ikke længere
|
||||||
|
suspend: Suspendere
|
||||||
|
unsuspend: Suspendere ikke længere
|
||||||
|
blockConfirm: Er du sikker på at du vil blokere denne konto?
|
||||||
|
unblockConfirm: Er du sikker på at du vil ikke blokere denne konto endnu længere?
|
||||||
|
suspendConfirm: Er du sikker på at du vil suspendere denne konto?
|
||||||
|
selectAntenna: Vælg en antenne
|
||||||
|
selectWidget: Vælg en widget
|
||||||
|
editWidgets: Ændre widgettere
|
||||||
|
customEmojis: Brugerdefineret emoji
|
||||||
|
emojiName: Emoji navn
|
||||||
|
operations: Operationer
|
||||||
|
software: Software
|
||||||
|
metadata: Metadata
|
||||||
|
version: Version
|
||||||
|
monitor: Vagt
|
||||||
|
jobQueue: Jobkø
|
||||||
|
statistics: Statistik
|
||||||
|
cpuAndMemory: CPU og hukommelse
|
||||||
|
network: Netværk
|
||||||
|
disk: Disk
|
||||||
|
instanceInfo: Instans information
|
||||||
|
noThankYou: Nej tak
|
||||||
|
noNotifications: Intet notifikationer
|
||||||
|
addUser: Indsæt en bruger
|
||||||
|
addInstance: Indsæt en instans
|
||||||
|
favorite: Indsæt til bogmærker
|
||||||
|
favorites: Bogmærker
|
||||||
|
showMore: Vis mere
|
||||||
|
showLess: Luk
|
||||||
|
youGotNewFollower: følgte dig
|
||||||
|
followRequestAccepted: Følgeanmodning accepteret
|
||||||
|
mention: Nævne
|
||||||
|
mentions: Nævnene
|
||||||
|
directNotes: Direkt beskeder
|
||||||
|
importAndExport: Importere/Eksporter data
|
||||||
|
download: Download
|
||||||
|
exportRequested: Du har bedt om en eksport. Det vil tage noget tid. Den vil blive
|
||||||
|
tilsæt til din Drev når den er færdig.
|
||||||
|
importRequested: Du har bedt om en eksport. Det vil tage noget tid.
|
||||||
|
note: Opslag
|
||||||
|
notes: Opslage
|
||||||
|
following: Følger
|
||||||
|
followers: Følgere
|
||||||
|
followsYou: Følger dig
|
||||||
|
createList: Skab en list
|
||||||
|
manageLists: Administrere lister
|
||||||
|
error: Fejl
|
||||||
|
somethingHappened: En fejl har opstået
|
||||||
|
retry: Gentage
|
||||||
|
pageLoadError: En fejl har opstået ved indlæsning af siden.
|
||||||
|
pageLoadErrorDescription: Dette er normalt på grund af netværksproblemer eller din
|
||||||
|
browser's cache. Prøv at ryd cachen og så gentage efter et styk tid.
|
||||||
|
serverIsDead: Serveren svarer ikke. Vær sød at vente et styk tid og prøv igen.
|
||||||
|
editWidgetsExit: Færdig
|
||||||
|
headlineIceshrimp: En åben-kildekode, decentraliseret social-media platform som er frit
|
||||||
|
forevigt! 🚀
|
||||||
|
introIceshrimp: Velkommen! Iceshrimp er en åbent-kildekode, decentraliseret social-media
|
||||||
|
platform som er frit forevigt!🚀
|
||||||
|
enableEmojiReactions: Aktivere emoji reaktioner
|
||||||
|
unsuspendConfirm: Er du sikker på at du vil ikke suspendere denne konto endnu længere?
|
||||||
|
selectList: Vælg en list
|
||||||
|
showEmojisInReactionNotifications: Vis emoji i reaktion notifikationer
|
||||||
|
attachCancel: Fjern tilknyttelse
|
||||||
|
markAsSensitive: Markere som NSFW
|
||||||
|
unmarkAsSensitive: Markere ikke som NSFW længere
|
||||||
|
enterFileName: Indtast filnavn
|
||||||
|
mute: Nedtone
|
||||||
|
unmute: Nedtone ikke længere
|
||||||
|
renoteMute: Nedtone forstærkninger
|
||||||
|
renoteUnmute: Nedtone forstærkninger ikke længere
|
||||||
|
block: Blokere
|
||||||
|
cacheRemoteFiles: Cachere fremmed filer
|
||||||
|
flagAsBotDescription: Aktivere denne valgmulighed hvis denne konto er kontrolleret
|
||||||
|
af en komputerprogram. Hvis den et tændt så vil det signalere til andre udviklere
|
||||||
|
som arbejder på komputer-kontrolleret social-media kontoer og det vil også adjustere
|
||||||
|
Iceshrimp's indresystemer til at behandle denne konto som en robot.
|
||||||
|
flagAsCat: Er du en kat? 😺
|
||||||
|
flagSpeakAsCat: Tale som en kat
|
||||||
|
emojiUrl: Emoji URL
|
||||||
|
addEmoji: Tilsæt
|
||||||
|
settingGuide: Anbefalet indstillinger
|
||||||
|
flagSpeakAsCatDescription: Din opslage vil blive nyaniferet når du er i kat-mode
|
||||||
|
autoAcceptFollowed: Automatisk godkende følgeanmodninger fra brugere som du selv følger
|
||||||
|
addAccount: Tilsæt konto
|
||||||
|
wallpaper: Baggrund
|
||||||
|
setWallpaper: Sæt baggrund
|
||||||
|
removeWallpaper: Fjern baggrund
|
||||||
|
host: Host
|
||||||
|
selectUser: Vælg en bruger
|
||||||
|
searchWith: 'Søge: {q}'
|
||||||
|
youHaveNoLists: Du har ingen liste
|
||||||
|
followConfirm: Er du sikker på at du vil gerne følge {name}?
|
||||||
|
proxyAccount: Proxykonto
|
||||||
|
proxyAccountDescription: En proxykonto er en konto som virker som en fremmed følger
|
||||||
|
for bruger under særlige konditioner. For eksempel, når en bruger tilsætter en fjernbruger
|
||||||
|
til denne list, vil denne fjernbruger's aktivitet ikke blive leveret til den instans
|
||||||
|
hvis ingen lokalebruger følger fjernbrugeren, så denne proxykonto vil følge den
|
||||||
|
istedetfor.
|
||||||
|
instances: Instanser
|
||||||
|
registeredAt: Registreret på
|
||||||
|
latestRequestSentAt: Sidste anmodning sendt
|
||||||
|
latestRequestReceivedAt: Sidste anmodning modtaget
|
||||||
|
selectInstance: Vælg en instans
|
||||||
|
recipient: Recipient(er)
|
||||||
|
annotation: Kommentarer
|
||||||
|
federation: Føderation
|
||||||
|
latestStatus: Senest status
|
||||||
|
storageUsage: Opbevaringspladsbrug
|
||||||
|
charts: Grafer
|
||||||
|
perHour: Hver time
|
||||||
|
perDay: Hver dag
|
||||||
|
stopActivityDelivery: Stop med at sende aktiviteter
|
||||||
|
blockThisInstance: Blokere denne instans
|
||||||
|
muteAndBlock: Mutes og blokeringer
|
||||||
|
mutedUsers: Mutede brugere
|
||||||
|
newer: nyere
|
||||||
|
older: ældre
|
||||||
|
silencedInstances: Nedtonede servere
|
||||||
|
clearQueue: Ryd kø
|
||||||
|
clearQueueConfirmTitle: Er du sikker på, at du ønsker at rydde køen?
|
||||||
|
clearCachedFiles: Ryd cache
|
||||||
|
clearCachedFilesConfirm: Er du sikker på, at du ønsker at slette alle cachede eksterne
|
||||||
|
filer?
|
||||||
|
blockedInstances: Blokerede servere
|
||||||
|
blockedInstancesDescription: Listen af navne på servere, du ønsker at blokere. Servere
|
||||||
|
på listen vil ikke længere kunne kommunikere med denne server.
|
||||||
|
hiddenTags: Skjulte hashtags
|
||||||
|
clearQueueConfirmText: De indlæg i denne kø, der ikke allerede er leveret, vil ikke
|
||||||
|
blive federeret. Denne operation er almindeligvis ikke påkrævet.
|
||||||
|
jumpToPrevious: Spring til tidligere
|
||||||
|
cw: Advarsel om indhold
|
||||||
+2238
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,819 @@
|
|||||||
|
_lang_: "Ελληνικά"
|
||||||
|
monthAndDay: "{day}/{month}"
|
||||||
|
search: "Αναζήτηση"
|
||||||
|
notifications: "Ειδοποιήσεις"
|
||||||
|
username: "Όνομα μέλους"
|
||||||
|
password: "Κωδικός πρόσβασης"
|
||||||
|
forgotPassword: "Ξέχασα τον κωδικό πρόσβασης"
|
||||||
|
fetchingAsApObject: "Άντληση από το Fediverse"
|
||||||
|
ok: "Εντάξει"
|
||||||
|
gotIt: "Τό'πιασα!"
|
||||||
|
cancel: "Ακύρωση"
|
||||||
|
enterUsername: "Εισαγωγή ονόματος μέλους"
|
||||||
|
renotedBy: "Προωθήθηκε από {user}"
|
||||||
|
noNotes: "Δεν υπάρχουν δημοσιεύσεις"
|
||||||
|
noNotifications: "Δεν υπάρχουν ειδοποιήσεις"
|
||||||
|
settings: "Ρυθμίσεις"
|
||||||
|
basicSettings: "Βασικές Ρυθμίσεις"
|
||||||
|
otherSettings: "Άλλες Ρυθμίσεις"
|
||||||
|
openInWindow: "Άνοιγμα σε παράθυρο"
|
||||||
|
profile: "Προφίλ"
|
||||||
|
timeline: "Χρονολόγιο"
|
||||||
|
noAccountDescription: "Αυτό το μέλος δεν έχει γράψει βιογραφικό ακόμη."
|
||||||
|
login: "Σύνδεση"
|
||||||
|
loggingIn: "Συνδέεστε"
|
||||||
|
logout: "Αποσύνδεση"
|
||||||
|
signup: "Εγγραφή"
|
||||||
|
uploading: "Ανέβασμα..."
|
||||||
|
save: "Αποθήκευση"
|
||||||
|
users: "Μέλη"
|
||||||
|
addUser: "Προσθήκη μέλους"
|
||||||
|
favorite: "Προσθήκη στους σελιδοδείκτες"
|
||||||
|
favorites: "Σελιδοδείκτες"
|
||||||
|
unfavorite: "Αφαίρεση από τους σελιδοδείκτες"
|
||||||
|
favorited: "Προστέθηκε στους σελιδοδείκτες."
|
||||||
|
alreadyFavorited: "Έχει ήδη προστεθεί στους σελιδοδείκτες."
|
||||||
|
cantFavorite: "Αδυναμία προσθήκης στους σελιδοδείκτες."
|
||||||
|
pin: "Καρφίτσωμα στο προφίλ"
|
||||||
|
unpin: "Ξεκαρφίτσωμα από το προφίλ"
|
||||||
|
copyContent: "Αντιγραφή περιεχομένων"
|
||||||
|
copyLink: "Αντιγραφή συνδέσμου"
|
||||||
|
delete: "Διαγραφή"
|
||||||
|
deleteAndEdit: "Διαγραφή και επεξεργασία"
|
||||||
|
deleteAndEditConfirm: "Σίγουρα θέλετε να διαγράψετε αυτή τη δημοσίευση και να την\
|
||||||
|
\ επεξεργαστείτε; Θα χάσετε όλες τις αντιδράσεις, προωθήσεις και απαντήσεις σε αυτήν."
|
||||||
|
addToList: "Προσθήκη στη λίστα"
|
||||||
|
sendMessage: "Αποστολή μηνύματος"
|
||||||
|
copyUsername: "Αντιγραφή ονόματος μέλους"
|
||||||
|
searchUser: "Αναζήτηση μέλους"
|
||||||
|
reply: "Απάντηση"
|
||||||
|
loadMore: "Φόρτωσε περισσότερα"
|
||||||
|
showMore: "Δείξε περισσότερα"
|
||||||
|
showLess: "Κλείσιμο"
|
||||||
|
youGotNewFollower: "σε ακολούθησε"
|
||||||
|
receiveFollowRequest: "Λάβατε αίτημα ακολούθησης"
|
||||||
|
followRequestAccepted: "Το αίτημα ακολούθησης έγινε δεκτό"
|
||||||
|
mention: "Επισήμανση"
|
||||||
|
mentions: "Επισημάνσεις"
|
||||||
|
directNotes: "Απευθείας μηνύματα"
|
||||||
|
importAndExport: "Εισαγωγή/Εξαγωγή Δεδομένων"
|
||||||
|
import: "Εισαγωγή"
|
||||||
|
export: "Εξαγωγή"
|
||||||
|
files: "Αρχεία"
|
||||||
|
download: "Κατέβασμα"
|
||||||
|
driveFileDeleteConfirm: "Θέλετε σίγουρα να διαγράψετε το αρχείο \"{name}\"; Οι δημοσιεύσεις\
|
||||||
|
\ με αυτό το συνημμένο αρχείο επίσης θα διαγραφούν."
|
||||||
|
unfollowConfirm: "Θέλετε σίγουρα να σταματήσετε να ακολουθείτε το μέλος {name};"
|
||||||
|
exportRequested: "Ζητήσατε μία εξαγωγή. Αυτό μπορεί να πάρει κάποιον χρόνο. Θα προστεθεί\
|
||||||
|
\ στον Αποθηκευτικό Χώρο σας μόλις ολοκληρωθεί."
|
||||||
|
importRequested: "Ζητήσατε μια εισαγωγή. Αυτό μπορεί να πάρει κάποιον χρόνο."
|
||||||
|
lists: "Λίστες"
|
||||||
|
noLists: "Δεν έχετε λίστες"
|
||||||
|
note: "Δημοσίευση"
|
||||||
|
notes: "Δημοσιεύσεις"
|
||||||
|
following: "Ακολουθεί"
|
||||||
|
followers: "Ακολουθούν"
|
||||||
|
followsYou: "Σε ακολουθεί"
|
||||||
|
createList: "Δημιουργία λίστας"
|
||||||
|
manageLists: "Διαχείριση λιστών"
|
||||||
|
error: "Σφάλμα"
|
||||||
|
somethingHappened: "Προέκυψε ένα σφάλμα"
|
||||||
|
retry: "Προσπάθεια ξανά"
|
||||||
|
pageLoadError: "Ένα σφάλμα προέκυψε φορτώνοντας τη σελίδα."
|
||||||
|
pageLoadErrorDescription: "Αυτό κανονικά προκαλείται από σφάλματα δικτύου ή από την\
|
||||||
|
\ προσωρινή μνήμη του προγράμματος περιήγησης. Δοκιμάστε να σβήσετε την προσωρινή\
|
||||||
|
\ μνήμη (cache) και να δοκιμάσετε ξανά μετά από λίγο."
|
||||||
|
serverIsDead: "Αυτός ο διακομιστής (server) δεν αποκρίνεται. Παρακαλώ περιμένετε λίγο\
|
||||||
|
\ και δοκιμάστε ξανά."
|
||||||
|
youShouldUpgradeClient: "Για να δείτε αυτή τη σελίδα, παρακαλώ επαναφορτώστε για να\
|
||||||
|
\ γίνει ενημέρωση."
|
||||||
|
enterListName: "Πληκτρολογήστε ένα όνομα για τη λίστα"
|
||||||
|
privacy: "Ιδιωτικότητα"
|
||||||
|
makeFollowManuallyApprove: "Τα αιτήματα ακολούθησης χρειάζονται έγκριση"
|
||||||
|
defaultNoteVisibility: "Προεπιλεγμένη ορατότητα"
|
||||||
|
follow: "Ακολουθήστε"
|
||||||
|
followRequest: "Ακολουθήστε"
|
||||||
|
followRequests: "Αιτήματα ακολούθησης"
|
||||||
|
unfollow: "Να μην ακολουθώ"
|
||||||
|
followRequestPending: "Το αίτημα ακολούθησης εκκρεμεί"
|
||||||
|
enterEmoji: "Εισάγετε ένα emoji"
|
||||||
|
renote: "Προώθηση"
|
||||||
|
unrenote: "Αναίρεση προώθησης"
|
||||||
|
renoted: "Προωθήθηκε."
|
||||||
|
cantRenote: "Αυτή η δημοσίευση δεν μπορεί να προωθηθεί."
|
||||||
|
cantReRenote: "Μία προώθηση δεν μπορεί να προωθηθεί."
|
||||||
|
quote: "Παράθεση"
|
||||||
|
pinnedNote: "Καρφιτσωμένη δημοσίευση"
|
||||||
|
pinned: "Καρφίτσωμα στο προφίλ"
|
||||||
|
you: "Εσύ"
|
||||||
|
clickToShow: "Κάντε κλικ για εμφάνιση"
|
||||||
|
add: "Προσθήκη"
|
||||||
|
reaction: "Αντιδράσεις"
|
||||||
|
reactionSetting: "Αντιδράσεις που θα εμφανίζονται στον επιλογέα"
|
||||||
|
reactionSettingDescription2: "Σύρετε για να αλλάξετε τη σειρά, κάντε κλικ για να διαγράψετε,\
|
||||||
|
\ πατήστε \"+\" για να προσθέσετε."
|
||||||
|
rememberNoteVisibility: "Θυμήσου τις ρυθμίσεις ορατότητας για τις δημοσιεύσεις"
|
||||||
|
attachCancel: "Αφαίρεση επισυναπτόμενου"
|
||||||
|
enterFileName: "Πληκτρολογήστε όνομα αρχείου"
|
||||||
|
mute: "Σίγαση"
|
||||||
|
unmute: "Διακοπή σίγασης"
|
||||||
|
block: "Μπλοκάρισμα"
|
||||||
|
unblock: "Διακοπή μπλοκαρίσματος"
|
||||||
|
suspend: "Αποβολή"
|
||||||
|
unsuspend: "Διακοπή αποβολής"
|
||||||
|
blockConfirm: "Θέλετε σίγουρα να μπλοκάρετε αυτόν τον λογαριασμό;"
|
||||||
|
unblockConfirm: "Θέλετε σίγουρα να ξεμπλοκάρετε αυτόν τον λογαριασμό;"
|
||||||
|
suspendConfirm: "Θέλετε σίγουρα να αποβάλετε αυτόν τον λογαριασμό;"
|
||||||
|
unsuspendConfirm: "Θέλετε σίγουρα να άρετε την αποβολή αυτού του λογαριασμού;"
|
||||||
|
selectList: "Επιλέξτε μια λίστα"
|
||||||
|
selectAntenna: "Επιλέξτε μια αντένα"
|
||||||
|
selectWidget: "Επιλέξτε ένα πρόσθετο"
|
||||||
|
editWidgets: "Επεξεργασία πρόσθετων"
|
||||||
|
editWidgetsExit: "Ολοκληρώθηκε"
|
||||||
|
customEmojis: "Προσαρμοσμένα Emoji"
|
||||||
|
emojiName: "Όνομα emoji"
|
||||||
|
addEmoji: "Προσθήκη"
|
||||||
|
settingGuide: "Προτεινόμενες ρυθμίσεις"
|
||||||
|
flagAsBot: "Δήλωση αυτού του λογαριασμού ως bot"
|
||||||
|
flagAsCat: "Είσαι γατί; \U0001F63A"
|
||||||
|
flagShowTimelineReplies: "Εμφάνιση απαντήσεων στο χρονολόγιο"
|
||||||
|
addAccount: "Προσθήκη λογαριασμού"
|
||||||
|
general: "Γενικές"
|
||||||
|
wallpaper: "Ταπετσαρία"
|
||||||
|
setWallpaper: "Ορισμός ταπετσαρίας"
|
||||||
|
removeWallpaper: "Αφαίρεση ταπετσαρίας"
|
||||||
|
searchWith: "Αναζήτηση: {q}"
|
||||||
|
youHaveNoLists: "Δεν έχετε λίστες"
|
||||||
|
followConfirm: "Θέλετε σίγουρα να ακολουθήσετε τον λογαριασμό {name};"
|
||||||
|
host: "Φιλοξενεί (Host)"
|
||||||
|
selectUser: "Επιλέξτε ένα μέλος"
|
||||||
|
recipient: "Αποδέκτης-τρια(-ες)"
|
||||||
|
annotation: "Σχόλια"
|
||||||
|
federation: "Ομοσπονδία"
|
||||||
|
storageUsage: "Χρήση χώρου"
|
||||||
|
version: "Έκδοση"
|
||||||
|
metadata: "Μεταδεδομένα"
|
||||||
|
network: "Δίκτυο"
|
||||||
|
disk: "Δίσκος"
|
||||||
|
instanceInfo: "Πληροφορίες Instance"
|
||||||
|
statistics: "Στατιστικά"
|
||||||
|
clearQueue: "Εκκαθάριση ουράς"
|
||||||
|
clearQueueConfirmTitle: "Θέλετε να διαγράψετε την ουρά;"
|
||||||
|
clearCachedFiles: "Εκκαθάριση προσωρινής μνήμης (cache)"
|
||||||
|
done: "Ολοκληρώθηκε"
|
||||||
|
attachFile: "Επισύναψη αρχείων"
|
||||||
|
more: "Περισσότερα!"
|
||||||
|
noSuchUser: "Το μέλος δεν βρέθηκε"
|
||||||
|
announcements: "Ανακοινώσεις"
|
||||||
|
imageUrl: "URL εικόνας"
|
||||||
|
remove: "Διαγραφή"
|
||||||
|
removed: "Η διαγραφή ολοκληρώθηκε επιτυχώς"
|
||||||
|
saved: "Αποθηκεύτηκε"
|
||||||
|
messaging: "Συνομιλία"
|
||||||
|
upload: "Ανεβάστε"
|
||||||
|
fromDrive: "Από τον Αποθηκευτικό Χώρο"
|
||||||
|
fromUrl: "Από URL"
|
||||||
|
uploadFromUrl: "Ανέβασμα από URL"
|
||||||
|
explore: "Εξερεύνηση"
|
||||||
|
messageRead: "Διαβάστηκε"
|
||||||
|
startMessaging: "Ξεκινήστε μια νέα συνομιλία"
|
||||||
|
nUsersRead: "διαβάστηκε από {n}"
|
||||||
|
tos: "Όροι Χρήσης"
|
||||||
|
start: "Ας αρχίσουμε"
|
||||||
|
home: "Κεντρικό"
|
||||||
|
activity: "Δραστηριότητα"
|
||||||
|
images: "Εικόνες"
|
||||||
|
birthday: "Γενέθλια"
|
||||||
|
registeredDate: "Έγινε μέλος στις"
|
||||||
|
location: "Τοποθεσία"
|
||||||
|
theme: "Θέματα"
|
||||||
|
light: "Φωτεινό"
|
||||||
|
dark: "Σκοτεινό"
|
||||||
|
drive: "Αποθηκευτικός Χώρος"
|
||||||
|
fileName: "Όνομα αρχείου"
|
||||||
|
selectFile: "Επιλέξτε ένα αρχείο"
|
||||||
|
selectFiles: "Επιλέξτε αρχεία"
|
||||||
|
selectFolder: "Επιλέξτε φάκελο"
|
||||||
|
selectFolders: "Επιλέξτε φακέλους"
|
||||||
|
renameFile: "Μετονομασία αρχείου"
|
||||||
|
addFile: "Προσθέστε ένα αρχείο"
|
||||||
|
emptyDrive: "Ο Αποθηκευτικός Χώρος σας είναι άδειος"
|
||||||
|
copyUrl: "Αντιγραφή διεύθυνσης URL"
|
||||||
|
rename: "Μετονομασία"
|
||||||
|
avatar: "Άβαταρ"
|
||||||
|
banner: "Εξώφυλλο"
|
||||||
|
reload: "Ανανέωση"
|
||||||
|
doNothing: "Αγνόηση"
|
||||||
|
watch: "Παρακολούθηση"
|
||||||
|
unwatch: "Διακοπή παρακολούθησης"
|
||||||
|
accept: "Αποδοχή"
|
||||||
|
reject: "Απόρριψη"
|
||||||
|
normal: "Κανονικό"
|
||||||
|
instanceName: "Όνομα instance"
|
||||||
|
thisYear: "Έτος"
|
||||||
|
thisMonth: "Μήνας"
|
||||||
|
today: "Σήμερα"
|
||||||
|
dayX: "{day}"
|
||||||
|
pages: "Σελίδες"
|
||||||
|
connectService: "Σύνδεση"
|
||||||
|
disconnectService: "Αποσύνδεση"
|
||||||
|
registration: "Εγγραφή"
|
||||||
|
pinnedPages: "Καρφιτσωμένες Σελίδες"
|
||||||
|
pinnedNotes: "Καρφιτσωμένες δημοσιεύσεις"
|
||||||
|
antennas: "Αντένες"
|
||||||
|
manageAntennas: "Διαχείριση Αντενών"
|
||||||
|
name: "Όνομα"
|
||||||
|
antennaSource: "Πηγή Αντένας"
|
||||||
|
antennaKeywords: "Λέξεις-κλειδιά για παρακολούθηση"
|
||||||
|
antennaExcludeKeywords: "Λέξεις-κλειδιά για εξαίρεση"
|
||||||
|
notifyAntenna: "Ειδοποίηση για νέες δημοσιεύσεις"
|
||||||
|
withFileAntenna: "Μόνο δημοσιεύσεις με αρχεία"
|
||||||
|
caseSensitive: "Διάκριση Πεζών-Κεφαλαίων"
|
||||||
|
popularTags: "Δημοφιλείς ετικέτες"
|
||||||
|
userList: "Λίστες"
|
||||||
|
about: "Σχετικά με"
|
||||||
|
moderator: "Συντονιστής/στρια"
|
||||||
|
moderation: "Συντονισμός"
|
||||||
|
cacheClear: "Εκκαθάριση προσωρινής μνήμης (cache)"
|
||||||
|
markAsReadAllNotifications: "Σημειώστε όλες τις ειδοποιήσεις ως διαβασμένες"
|
||||||
|
group: "Ομάδα"
|
||||||
|
groups: "Ομάδες"
|
||||||
|
createGroup: "Δημιουργία ομάδας"
|
||||||
|
ownedGroups: "Οι ομάδες σας"
|
||||||
|
groupName: "Όνομα ομάδας"
|
||||||
|
members: "Μέλη"
|
||||||
|
transfer: "Μεταφορά"
|
||||||
|
messagingWithUser: "Προσωπική συνομιλία"
|
||||||
|
messagingWithGroup: "Ομαδική συνομιλία"
|
||||||
|
title: "Τίτλος"
|
||||||
|
text: "Κείμενο"
|
||||||
|
enable: "Ενεργοποίηση"
|
||||||
|
next: "Επόμενο"
|
||||||
|
noteOf: "Δημοσίευση από {user}"
|
||||||
|
inviteToGroup: "Πρόσκληση στην ομάδα"
|
||||||
|
quoteAttached: "Παράθεση"
|
||||||
|
signinRequired: "Παρακαλούμε δημιουργήστε λογαριασμό ή συνδεθείτε πριν συνεχίσετε"
|
||||||
|
category: "Κατηγορία"
|
||||||
|
tags: "Ετικέτες"
|
||||||
|
createAccount: "Δημιουργία λογαριασμού"
|
||||||
|
local: "Τοπικό"
|
||||||
|
remote: "Απομακρυσμένο"
|
||||||
|
total: "Σύνολο"
|
||||||
|
appearance: "Εμφάνιση"
|
||||||
|
accountSettings: "Ρυθμίσεις Λογαριασμού"
|
||||||
|
sounds: "Ήχοι"
|
||||||
|
sound: "Ήχοι"
|
||||||
|
listen: "Ακρόαση"
|
||||||
|
showInPage: "Εμφάνιση στη σελίδα"
|
||||||
|
volume: "Ένταση"
|
||||||
|
masterVolume: "Κεντρική ένταση"
|
||||||
|
details: "Λεπτομέρειες"
|
||||||
|
install: "Εγκαταστήστε"
|
||||||
|
uninstall: "Απεγκατάσταση"
|
||||||
|
manage: "Διαχείριση"
|
||||||
|
smtpHost: "Φιλοξενεί (Host)"
|
||||||
|
smtpUser: "Όνομα μέλους"
|
||||||
|
smtpPass: "Κωδικός"
|
||||||
|
notificationSetting: "Ρυθμίσεις ειδοποιήσεων"
|
||||||
|
notificationSettingDesc: "Επιλέξτε τους τύπους ειδοποιήσεων για προβολή."
|
||||||
|
switchUi: "Διάταξη"
|
||||||
|
clip: "Κλιπ"
|
||||||
|
driveFilesCount: "Αριθμός αρχείων Αποθηκευτικού Χώρου"
|
||||||
|
driveUsage: "Χρήση Αποθηκευτικού Χώρου"
|
||||||
|
noteFavoritesCount: "Αριθμός αγαπημένων σημειωμάτων"
|
||||||
|
clips: "Κλιπ"
|
||||||
|
clearCache: "Εκκαθάριση προσωρινής μνήμης"
|
||||||
|
emailNotification: "Ειδοποιήσεις μέσω mail"
|
||||||
|
inChannelSearch: "Αναζήτηση στο κανάλι"
|
||||||
|
info: "Πληροφορίες"
|
||||||
|
notRecommended: "Δεν προτείνεται"
|
||||||
|
switchAccount: "Αλλαγή λογαριασμού"
|
||||||
|
user: "Μέλη"
|
||||||
|
administration: "Διαχείριση"
|
||||||
|
switch: "Εναλλαγή"
|
||||||
|
gallery: "Γκαλερί"
|
||||||
|
global: "Παγκόσμιο"
|
||||||
|
searchResult: "Αποτελέσματα αναζήτησης"
|
||||||
|
learnMore: "Μάθετε περισσότερα"
|
||||||
|
controlPanel: "Πίνακας ελέγχου"
|
||||||
|
manageAccounts: "Διαχείριση Λογαριασμών"
|
||||||
|
searchByGoogle: "Αναζήτηση"
|
||||||
|
file: "Αρχεία"
|
||||||
|
recommended: "Προτεινόμενα"
|
||||||
|
cannotUploadBecauseNoFreeSpace: "Το ανέβασμα απέτυχε λόγω ανεπαρκούς Αποθηκευτικού\
|
||||||
|
\ Χώρου."
|
||||||
|
_email:
|
||||||
|
_follow:
|
||||||
|
title: "Έχετε ένα νέο ακόλουθο"
|
||||||
|
_mfm:
|
||||||
|
mention: "Επισήμανση"
|
||||||
|
quote: "Παράθεση"
|
||||||
|
emoji: "Επιπλέον emoji"
|
||||||
|
search: "Αναζήτηση"
|
||||||
|
_channel:
|
||||||
|
featured: "Δημοφιλή"
|
||||||
|
_theme:
|
||||||
|
keys:
|
||||||
|
panel: "Πίνακας"
|
||||||
|
mention: "Επισήμανση"
|
||||||
|
renote: "Κοινοποίηση σημειώματος"
|
||||||
|
_sfx:
|
||||||
|
note: "Σημειώματα"
|
||||||
|
notification: "Ειδοποιήσεις"
|
||||||
|
chat: "Συνομιλία"
|
||||||
|
chatBg: "Συνομιλία (Παρασκήνιο)"
|
||||||
|
antenna: "Αντένες"
|
||||||
|
channel: "Ειδοποιήσεις καναλιών"
|
||||||
|
_ago:
|
||||||
|
future: "Μελλοντικό"
|
||||||
|
justNow: "Μόλις τώρα"
|
||||||
|
secondsAgo: "{n} δευτερόλεπτο(α) πριν"
|
||||||
|
minutesAgo: "{n} λεπτό(ά {n2} δευτερόλεπτο(α) πριν"
|
||||||
|
hoursAgo: "{n} ώρα(ες {n2} λεπτό(ά) πριν"
|
||||||
|
daysAgo: "{n} μέ {n2} ώρα(ες) πριν"
|
||||||
|
weeksAgo: "{n} εβδομάδ {n2} μέρα(ες) πριν"
|
||||||
|
monthsAgo: "{n} μήν {n2} εβδομάδα(ες) πριν"
|
||||||
|
yearsAgo: "{n} έτος(η {n2} μήνα(ες) πριν"
|
||||||
|
_permissions:
|
||||||
|
"write:drive": "Επεξεργαστείτε ή διαγράψτε τα αρχεία και τους φακέλους του Αποθηκευτικού\
|
||||||
|
\ Χώρου σας"
|
||||||
|
"read:favorites": "Δείτε τη λίστα με τους σελιδοδείκτες σας"
|
||||||
|
"write:favorites": "Επεξεργαστείτε τη λίστα με τους σελιδοδείκτες σας"
|
||||||
|
"read:messaging": "Δείτε τις συνομιλίες σας"
|
||||||
|
"write:messaging": "Γράψτε ή διαγράψτε μηνύματα συνομιλίας"
|
||||||
|
"read:notifications": "Δείτε τις ειδοποιήσεις σας"
|
||||||
|
"write:notifications": "Διαχειριστείτε τις ειδοποιήσεις σας"
|
||||||
|
"read:pages": "Δείτε τις Σελίδες σας"
|
||||||
|
"write:pages": "Επεξεργαστείτε ή διαγράψτε τις σελίδες σας"
|
||||||
|
"write:gallery-likes": Επεξεργασία της λίστας των αγαπημένων σας δημοσιεύσεων γκαλερί
|
||||||
|
"read:gallery": Δείτε την γκαλερί σας
|
||||||
|
"write:gallery": Επεξεργασία της γκαλερί σας
|
||||||
|
"read:gallery-likes": Δείτε τη λίστα των αγαπημένων σας δημοσιεύσεων γκαλερί
|
||||||
|
_antennaSources:
|
||||||
|
all: "Όλα τα σημειώματα"
|
||||||
|
homeTimeline: "Σημειώματα από μέλη που ακολουθείτε"
|
||||||
|
users: "Σημειώματα από συγκεκριμένα μέλη"
|
||||||
|
userList: "Σημειώματα από καθορισμένη λίστα μελών"
|
||||||
|
userGroup: "Σημειώματα από μέλη καθορισμένης ομάδας"
|
||||||
|
_widgets:
|
||||||
|
profile: "Προφίλ"
|
||||||
|
instanceInfo: "Πληροφορίες του instance"
|
||||||
|
notifications: "Ειδοποιήσεις"
|
||||||
|
timeline: "Χρονολόγιο"
|
||||||
|
calendar: "Ημερολόγιο"
|
||||||
|
trends: "Δημοφιλή"
|
||||||
|
clock: "Ρολόι"
|
||||||
|
activity: "Δραστηριότητα"
|
||||||
|
photos: "Φωτογραφίες"
|
||||||
|
digitalClock: "Ψηφιακό ρολόι"
|
||||||
|
federation: "Ομοσπονδία"
|
||||||
|
postForm: "Φόρμα δημοσίευσης"
|
||||||
|
button: "Κουμπί"
|
||||||
|
onlineUsers: "Συνδεδεμένα μέλη"
|
||||||
|
_userList:
|
||||||
|
chooseList: "Επιλέξτε μία λίστα"
|
||||||
|
_cw:
|
||||||
|
show: "Δείτε περισσότερα"
|
||||||
|
_visibility:
|
||||||
|
home: "Κεντρικό"
|
||||||
|
homeDescription: "Δημοσίευση στο κεντρικό χρονολόγιο μόνο"
|
||||||
|
followers: "Ακολουθούν"
|
||||||
|
_profile:
|
||||||
|
name: "Όνομα"
|
||||||
|
username: "Όνομα μέλους"
|
||||||
|
changeAvatar: Αλλαγή άβαταρ
|
||||||
|
_exportOrImport:
|
||||||
|
allNotes: "Όλα τα σημειώματα"
|
||||||
|
followingList: "Ακολουθεί"
|
||||||
|
muteList: "Μέλη σε σίγαση"
|
||||||
|
blockingList: "Μπλοκαρισμένα μέλη"
|
||||||
|
userLists: "Λίστες"
|
||||||
|
_charts:
|
||||||
|
federation: "Ομοσπονδία"
|
||||||
|
_timelines:
|
||||||
|
home: "Κεντρικό"
|
||||||
|
local: "Τοπικό"
|
||||||
|
social: "Κοινωνικό"
|
||||||
|
global: "Παγκόσμιο"
|
||||||
|
_pages:
|
||||||
|
viewPage: "Δείτε τις Σελίδες σας"
|
||||||
|
blocks:
|
||||||
|
image: "Εικόνες"
|
||||||
|
_notification:
|
||||||
|
youGotMessagingMessageFromUser: "{name} σάς έστειλε ένα μήνυμα συνομιλίας"
|
||||||
|
youWereFollowed: "σε ακολούθησε"
|
||||||
|
_types:
|
||||||
|
follow: "Νέοι ακόλουθοι"
|
||||||
|
mention: "Επισήμανση"
|
||||||
|
renote: "Κοινοποίηση σημειώματος"
|
||||||
|
quote: "Παράθεση"
|
||||||
|
reaction: "Αντιδράσεις"
|
||||||
|
_actions:
|
||||||
|
reply: "Απάντηση"
|
||||||
|
renote: "Κοινοποίηση σημειώματος"
|
||||||
|
_deck:
|
||||||
|
widgetsIntroduction: "Παρακαλούμε επιλέξτε \"Επεξεργασία πρόσθετων\" στο μενού και\
|
||||||
|
\ προσθέστε μαραφέτι."
|
||||||
|
_columns:
|
||||||
|
widgets: "Πρόσθετα"
|
||||||
|
notifications: "Ειδοποιήσεις"
|
||||||
|
tl: "Χρονολόγιο"
|
||||||
|
antenna: "Αντένες"
|
||||||
|
list: "Λίστα"
|
||||||
|
mentions: "Επισημάνσεις"
|
||||||
|
sensitive: Ευαίσθητο περιεχόμενο (NSFW)
|
||||||
|
createFolder: Δημιουργία φακέλου
|
||||||
|
uploadFromUrlDescription: Το URL του αρχείου που θέλετε να ανεβάσετε
|
||||||
|
emptyFolder: Αυτός ο φάκελος είναι άδειος
|
||||||
|
unableToDelete: Αδυναμία διαγραφής
|
||||||
|
recentlyUpdatedUsers: Πρόσφατα ενεργά μέλη
|
||||||
|
recentlyRegisteredUsers: Νέα μέλη
|
||||||
|
exploreUsersCount: Υπάρχουν {count} μέλη
|
||||||
|
help: Βοήθεια
|
||||||
|
inputNewFileName: Πληκτρολογήστε ένα νέο όνομα αρχείου
|
||||||
|
nothing: Δεν υπάρχει τίποτα να δείτε εδώ
|
||||||
|
newNoteRecived: Υπάρχουν νέες δημοσιεύσεις
|
||||||
|
passwordMatched: Ταιριάζει
|
||||||
|
unmarkAsSensitive: Αναίρεση επισήμανσης ως Ευαίσθητο Περιεχόμενο (NSFW)
|
||||||
|
blockedUsers: Μπλοκαρισμένα μέλη
|
||||||
|
noteDeleteConfirm: Θέλετε σίγουρα να διαγράψετε αυτή τη δημοσίευση;
|
||||||
|
preview: Προεπισκόπηση
|
||||||
|
noCustomEmojis: Δεν υπάρχουν emoji
|
||||||
|
tosUrl: URL Όρων Χρήσης
|
||||||
|
monthX: '{month}'
|
||||||
|
markAsReadAllTalkMessages: Σημειώστε όλα τα μηνύματα ως διαβασμένα
|
||||||
|
inputMessageHere: Γράψτε εδώ το μήνυμά σας
|
||||||
|
close: Κλείσιμο
|
||||||
|
newMessageExists: Υπάρχουν νέα μηνύματα
|
||||||
|
usernameInvalidFormat: Μπορείτε να χρησιμοποιήσετε κεφαλαία και μικρά γράμματα, αριθμούς,
|
||||||
|
και κάτω παύλες.
|
||||||
|
tooShort: Πολύ σύντομο
|
||||||
|
passwordNotMatched: Δεν ταιριάζει
|
||||||
|
existingAccount: Υπάρχων λογαριασμός
|
||||||
|
deleteAll: Διαγραφή όλων
|
||||||
|
chooseEmoji: Επιλέξτε ένα emoji
|
||||||
|
sort: Ταξινόμηση
|
||||||
|
descendingOrder: Φθίνουσα
|
||||||
|
deleteAllFiles: Διαγραφή όλων των αρχείων
|
||||||
|
userSuspended: Αυτό το μέλος έχει αποβληθεί.
|
||||||
|
menu: Μενού
|
||||||
|
divider: Χώρισμα
|
||||||
|
deletedNote: Διαγραμμένη δημοσίευση
|
||||||
|
useCw: Απόκρυψη περιεχομένου
|
||||||
|
description: Περιγραφή
|
||||||
|
width: Πλάτος
|
||||||
|
disableAll: Απενεργοποίηση όλων
|
||||||
|
notificationType: Τύπος ειδοποίησης
|
||||||
|
wordMute: Σίγαση λέξεων
|
||||||
|
userSaysSomething: '{name} είπε κάτι'
|
||||||
|
metrics: Μετρήσεις
|
||||||
|
overview: Γενική εικόνα
|
||||||
|
database: Βάση δεδομένων
|
||||||
|
channel: Κανάλια
|
||||||
|
other: Άλλα
|
||||||
|
abuseReports: Αναφορές
|
||||||
|
reportAbuse: Αναφορά
|
||||||
|
unclip: Ακύρωση κλιπ
|
||||||
|
public: Δημόσιο
|
||||||
|
renotedCount: Αριθμός προωθήσεων που ελήφθησαν
|
||||||
|
alwaysMarkSensitive: Επισήμανση ως ευαίσθητο περιεχόμενο (NSFW) ως προεπιλογή
|
||||||
|
markAllAsRead: Σημειώστε τα όλα ως διαβασμένα
|
||||||
|
_gallery:
|
||||||
|
like: Μου αρέσει
|
||||||
|
liked: Αγαπημένες δημοσιεύσεις
|
||||||
|
my: Η Γκαλερί μου
|
||||||
|
unlike: Δεν μου αρέσει
|
||||||
|
showOnRemote: Δείτε στο απομακρυσμένο instance
|
||||||
|
perDay: Ανά Ημέρα
|
||||||
|
software: Λογισμικό
|
||||||
|
cpuAndMemory: CPU και Μνήμη
|
||||||
|
noUsers: Δεν υπάρχουν μέλη
|
||||||
|
processing: Επεξεργασία
|
||||||
|
changePassword: Αλλαγή κωδικού
|
||||||
|
security: Ασφάλεια
|
||||||
|
featured: Προτεινόμενα
|
||||||
|
keepOriginalUploading: Διατήρηση πρωτότυπης εικόνας
|
||||||
|
manageGroups: Διαχείριση ομάδων
|
||||||
|
deleteFolder: Διαγραφή φακέλου
|
||||||
|
nsfw: Ευαίσθητο περιεχόμενο (NSFW)
|
||||||
|
nUsersMentioned: Έχει αναφερθεί από {n} μέλη
|
||||||
|
notFound: Δεν βρέθηκε
|
||||||
|
markAsReadAllUnreadNotes: Σημειώστε όλες τις δημοσιεύσεις ως διαβασμένες
|
||||||
|
invites: Προσκλήσεις
|
||||||
|
quoteQuestion: Να προστεθεί ως Παράθεση;
|
||||||
|
noMessagesYet: Δεν υπάρχουν μηνύματα ακόμη
|
||||||
|
onlyOneFileCanBeAttached: Μπορείτε να επισυνάψετε μόνο ένα αρχείο σε ένα μήνυμα
|
||||||
|
tooLong: Υπερβολικά μακροσκελές
|
||||||
|
or: Ή
|
||||||
|
language: Γλώσσα
|
||||||
|
groupInvited: Προσκληθήκατε σε μία ομάδα
|
||||||
|
ascendingOrder: Αύξουσα
|
||||||
|
visibility: Ορατότητα
|
||||||
|
invisibleNote: Αόρατη δημοσίευση
|
||||||
|
enableInfiniteScroll: Αυτόματη φόρτωση περισσοτέρων
|
||||||
|
poll: Ψηφοφορία
|
||||||
|
enablePlayer: Άνοιγμα προβολής βίντεο
|
||||||
|
large: Μεγάλο
|
||||||
|
medium: Μεσαίο
|
||||||
|
small: Μικρό
|
||||||
|
postToGallery: Δημιουργία νέας δημοσίευσης γκαλερί
|
||||||
|
reloadConfirm: Θα θέλατε να ανανεώσετε το χρονολόγιο;
|
||||||
|
enableAll: Ενεργοποίηση όλων
|
||||||
|
permission: Εξουσιοδοτήσεις
|
||||||
|
sample: Δείγμα
|
||||||
|
copy: Αντιγραφή
|
||||||
|
display: Προβολή
|
||||||
|
send: Αποστολή
|
||||||
|
behavior: Συμπεριφορά
|
||||||
|
useGlobalSetting: Χρήση παγκόσμιων ρυθμίσεων
|
||||||
|
abuseMarkAsResolved: Επισήμανση της αναφοράς ως επιλυμένης
|
||||||
|
openInNewTab: Άνοιγμα σε νέα καρτέλα
|
||||||
|
_sensitiveMediaDetection:
|
||||||
|
setSensitiveFlagAutomatically: Επισήμανση ως ευαίσθητο περιεχόμενο (NSFW)
|
||||||
|
defaultNavigationBehaviour: Προεπιλεγμένη συμπεριφορά περιήγησης
|
||||||
|
system: Σύστημα
|
||||||
|
createNew: Δημιουργία νέου
|
||||||
|
createNewClip: Δημιουργία νέου κλιπ
|
||||||
|
repliesCount: Αριθμός απεσταλμένων απαντήσεων
|
||||||
|
optional: Προαιρετικό
|
||||||
|
renotesCount: Αριθμός προωθήσεων σε δημοσιεύσεις άλλων
|
||||||
|
addItem: Προσθήκη αντικειμένου
|
||||||
|
disablePlayer: Κλείσιμο προβολής βίντεο
|
||||||
|
describeFile: Προσθήκη περιγραφής
|
||||||
|
enterFileDescription: Πληκτρολογήστε περιγραφή
|
||||||
|
author: Συντάκτης/τρια
|
||||||
|
setMultipleBySeparatingWithSpace: Διαχωρίστε πολλαπλές καταχωρήσεις με κενά.
|
||||||
|
random: Τυχαίο
|
||||||
|
accountInfo: Πληροφορίες Λογαριασμού
|
||||||
|
notesCount: Αριθμός δημοσιεύσεων
|
||||||
|
repliedCount: Αριθμός απαντήσεων που ελήφθησαν
|
||||||
|
flagAsCatDescription: Θα έχεις γατοαυτιά και θα μιλάς σαν γατί!
|
||||||
|
muteAndBlock: Σιγάσεις και Μπλοκαρίσματα
|
||||||
|
mutedUsers: Σιγασμένα μέλη
|
||||||
|
editProfile: Επεξεργασία προφίλ
|
||||||
|
pinLimitExceeded: Δεν μπορείτε να καρφιτσώσετε άλλες δημοσιεύσεις
|
||||||
|
currentPassword: Τρέχων κωδικός
|
||||||
|
newPassword: Νέος κωδικός
|
||||||
|
newPasswordRetype: Ξαναπληκτρολογήστε τον νέο κωδικό
|
||||||
|
notesAndReplies: Δημοσιεύσεις και απαντήσεις
|
||||||
|
popularUsers: Δημοφιλή μέλη
|
||||||
|
share: Κοινοποίηση
|
||||||
|
retype: Πληκτρολογήστε ξανά
|
||||||
|
invitations: Προσκλήσεις
|
||||||
|
available: Διαθέσιμο
|
||||||
|
unavailable: Μη διαθέσιμο
|
||||||
|
youHaveNoGroups: Δεν έχετε ομάδες
|
||||||
|
doing: Επεξεργασία...
|
||||||
|
yourAccountSuspendedTitle: Αυτός ο λογαριασμός έχει αποβληθεί
|
||||||
|
leaveConfirm: Υπάρχουν αλλαγές που δεν έχουν σωθεί. Θέλετε να τις απορρίψετε;
|
||||||
|
height: Ύψος
|
||||||
|
edit: Επεξεργασία
|
||||||
|
headlineIceshrimp: Μία ανοιχτού λογισμικού, αποκεντρωμένη πλατφόρμα κοινωνικής δικτύωσης
|
||||||
|
που θα είναι για πάντα ελεύθερη! 🚀
|
||||||
|
introIceshrimp: Καλώς ήρθατε! Το Iceshrimp είναι μία ανοιχτού λογισμικού, αποκεντρωμένη
|
||||||
|
πλατφόρμα κοινωνικής δικτύωσης που θα είναι για πάντα ελεύθερη! 🚀
|
||||||
|
markAsSensitive: Επισήμανση ως Ευαίσθητο Περιεχόμενο (NSFW)
|
||||||
|
autoAcceptFollowed: Αυτόματη έγκριση αιτημάτων ακολούθησης από λογαριασμούς που ακολουθείτε
|
||||||
|
loginFailed: Αποτυχία σύνδεσης
|
||||||
|
accountMoved: 'Έχει μεταφερθεί σε νέο λογαριασμό:'
|
||||||
|
perHour: Ανά Ώρα
|
||||||
|
remoteUserCaution: Οι πληροφορίες από απομακρυσμένους λογαριασμούς μπορεί να είναι
|
||||||
|
ατελείς.
|
||||||
|
folderName: Όνομα φακέλου
|
||||||
|
renameFolder: Μετονομασία φακέλου
|
||||||
|
recentUsed: Χρησιμοποιήθηκαν πρόσφατα
|
||||||
|
deleteAllFilesConfirm: Σίγουρα θέλετε να διαγράψετε όλα τα αρχεία;
|
||||||
|
removeAllFollowing: Διακοπή ακολούθησης όλων των ακολουθούμενων μελών
|
||||||
|
userSilenced: Αυτό το μέλος είναι υπό σιώπηση.
|
||||||
|
makeActive: Ενεργοποίηση
|
||||||
|
create: Δημιουργία
|
||||||
|
reportAbuseOf: Αναφορά {name}
|
||||||
|
cacheRemoteFilesDescription: Όταν αυτή η ρύθμιση είναι απενεργοποιημένη, τα απομακρυσμένα
|
||||||
|
αρχεία φορτώνονται απευθείας από το απομακρυσμένο instance. Η απενεργοποίηση θα
|
||||||
|
μειώσει τη χρήση του δίσκου σας, αλλά θα αυξήσει την κίνηση δεδομένων, καθώς δεν
|
||||||
|
θα δημιουργούνται σμικρύνσεις αρχείων (thumbnails).
|
||||||
|
registeredAt: Εγγράφηκε στις
|
||||||
|
latestStatus: Τελευταία κατάσταση
|
||||||
|
charts: Πίνακες
|
||||||
|
stopActivityDelivery: Σταμάτα να στέλνεις δραστηριότητες
|
||||||
|
operations: Λειτουργίες
|
||||||
|
monitor: Παρακολούθηση
|
||||||
|
jobQueue: Ουρά εργασιών
|
||||||
|
blockedInstances: Μπλοκαρισμένα Instances
|
||||||
|
blockedInstancesDescription: Παραθέστε τις διευθύνσεις (hostnames) των instances που
|
||||||
|
θέλετε να μπλοκάρετε. Τα παρακάτω instances δεν θα μπορούν πλέον να επικοινωνούν
|
||||||
|
με αυτό το instance.
|
||||||
|
intro: Η εγκατάσταση του Iceshrimp τελείωσε! Παρακαλώ δημιουργήστε ένα μέλος διαχειριστή/στρια.
|
||||||
|
noThankYou: Όχι, ευχαριστώ
|
||||||
|
addInstance: Προσθήκη instance
|
||||||
|
renoteMute: Σίγαση προωθήσεων
|
||||||
|
emojiUrl: Διεύθυνση emoji (URL)
|
||||||
|
cacheRemoteFiles: Προσωρινή αποθήκευση απομακρυσμένων αρχείων
|
||||||
|
flagSpeakAsCat: Να μιλάς σαν γατί
|
||||||
|
flagSpeakAsCatDescription: Οι δημοσιεύσεις σου θα nyaοποιούνται όταν είσαι γατί
|
||||||
|
selectInstance: Επιλέξτε ένα instance
|
||||||
|
latestRequestSentAt: Τελευταίο αίτημα στάλθηκε
|
||||||
|
hiddenTags: Κρυμμένες Ετικέτες (Hashtags)
|
||||||
|
noInstances: Δεν υπάρχουν instances
|
||||||
|
renoteUnmute: Διακοπή σίγασης προωθήσεων
|
||||||
|
flagAsBotDescription: Ενεργοποιήστε αυτή την επιλογή αν αυτός ο λογαριασμός ελέγχεται
|
||||||
|
από ένα πρόγραμμα. Αν ενεργοποιηθεί, θα λειτουργεί σαν σημάδι για τους προγραμματιστές,
|
||||||
|
ώστε να αποφύγουν ατέρμονη αλληλεπίδραση με άλλα bots και για να ρυθμίσει τα εσωτερικά
|
||||||
|
συστήματα του Iceshrimp ώστε να αντιμετωπίζουν αυτόν τον λογαριασμό ως bot.
|
||||||
|
flagShowTimelineRepliesDescription: Εμφάνιση απαντήσεων μελών σε δημοσιεύσεις άλλων
|
||||||
|
μελών στο χρονολόγιο.
|
||||||
|
latestRequestReceivedAt: Τελευταίο αίτημα ελήφθη
|
||||||
|
blockThisInstance: Μπλοκάρισμα αυτού του instance
|
||||||
|
clearQueueConfirmText: Τυχόν δημοσιεύσεις στην ουρά που δεν έχουν αποσταλεί δεν θα
|
||||||
|
ομοσπονδοποιηθούν. Συνήθως αυτή η λειτουργία δεν χρειάζεται.
|
||||||
|
clearCachedFilesConfirm: Σίγουρα θέλετε να διαγράψετε όλα τα προσωρινά αποθηκευμένα
|
||||||
|
απομακρυσμένα αρχεία;
|
||||||
|
default: Προεπιλεγμένο
|
||||||
|
defaultValueIs: 'Προεπιλεγμένο: {value}'
|
||||||
|
noJobs: Δεν υπάρχουν εργασίες (jobs)
|
||||||
|
federating: Ομοσπονδοποιείται
|
||||||
|
blocked: Μπλοκαρισμένο
|
||||||
|
suspended: Σε αποβολή
|
||||||
|
instanceFollowing: Ακολουθεί στο instance
|
||||||
|
instanceFollowers: Ακόλουθοι του instance
|
||||||
|
instanceUsers: Μέλη αυτού του instance
|
||||||
|
retypedNotMatch: Οι καταχωρήσεις δεν ταιριάζουν.
|
||||||
|
usernameOrUserId: Όνομα μέλους ή ταυτότητα μέλους (id)
|
||||||
|
removeAreYouSure: Θέλετε σίγουρα να αφαιρέσετε το "{x}";
|
||||||
|
deleteAreYouSure: Θέλετε σίγουρα να διαγράψετε το "{x}";
|
||||||
|
resetAreYouSure: Σίγουρα επανεκκίνηση;
|
||||||
|
uploadFromUrlMayTakeTime: Ίσως πάρει λίγο χρόνο μέχρι το ανέβασμα να ολοκληρωθεί.
|
||||||
|
noMoreHistory: Δεν υπάρχει περαιτέρω ιστορικό
|
||||||
|
agreeTo: Συμφωνώ στο {0}
|
||||||
|
yearsOld: '{age} ετών'
|
||||||
|
themeForDarkMode: Θέμα για τη Σκοτεινή Λειτουργία
|
||||||
|
syncDeviceDarkMode: Συγχρονισμός της Σκοτεινής Λειτουργίας με τις ρυθμίσεις της συσκευής
|
||||||
|
σας
|
||||||
|
inputNewDescription: Προσθέστε νέα περιγραφή
|
||||||
|
whenServerDisconnected: Όταν χάνεται η σύνδεση στον σέρβερ
|
||||||
|
disconnectedFromServer: Η σύνδεση στον σέρβερ έχει χαθεί
|
||||||
|
instanceDescription: Περιγραφή instance
|
||||||
|
maintainerEmail: Διεύθυνση email προγραμματιστή/στριας
|
||||||
|
yearX: '{year}'
|
||||||
|
enableGlobalTimeline: Ενεργοποίηση παγκόσμιου χρονολογίου
|
||||||
|
enableLocalTimeline: Ενεργοποίηση τοπικού χρονολογίου
|
||||||
|
enableRegistration: Ενεργοποίηση εγγραφής νέων μελών
|
||||||
|
invite: Πρόσκληση
|
||||||
|
disablingTimelinesInfo: Οι Διαχειρίστριες-ες και οι Συντονιστές-στριες θα έχουν πάντα
|
||||||
|
πρόσβαση σε όλα τα χρονολόγια, ακόμα κι αν δεν είναι ενεργοποιημένα.
|
||||||
|
inMb: Σε megabytes
|
||||||
|
iconUrl: Διεύθυνση URL εικονιδίου
|
||||||
|
bannerUrl: Διεύθυνση URL εικόνας Εξώφυλλου
|
||||||
|
pinnedUsers: Καρφιτσωμένα μέλη
|
||||||
|
hcaptchaSiteKey: Κλειδί του site
|
||||||
|
recaptcha: Προστασία reCAPTCHA
|
||||||
|
enableServiceworker: Ενεργοποίηση Ειδοποιήσεων Push για τον browser σας
|
||||||
|
recentlyDiscoveredUsers: Μέλη που ανακαλύφθηκαν πρόσφατα
|
||||||
|
twoStepAuthentication: Επαλήθευση δύο παραγόντων
|
||||||
|
securityKey: Κλειδί ασφάλειας
|
||||||
|
registerSecurityKey: Καταχωρήστε ένα κλειδί ασφάλειας
|
||||||
|
resetPassword: Επαναφορά κωδικού
|
||||||
|
newPasswordIs: Ο νέος κωδικός είναι "{password}"
|
||||||
|
uploadFolder: Προεπιλεγμένος φάκελος για ανέβασμα αρχείων
|
||||||
|
joinedGroups: Οι ομάδες που είστε μέλος
|
||||||
|
checking: Έλεγχος...
|
||||||
|
invitationCode: Κωδικός πρόσκλησης
|
||||||
|
normalPassword: Μέτριος κωδικός
|
||||||
|
weakPassword: Αδύναμος κωδικός
|
||||||
|
strongPassword: Δυνατός κωδικός
|
||||||
|
signinWith: Συνδεθείτε με {x}
|
||||||
|
tapSecurityKey: Βάλτε το κλειδί ασφάλειας
|
||||||
|
signinFailed: Αδυναμία σύνδεσης. Το όνομα μέλους ή ο κωδικός είναι λάθος.
|
||||||
|
aboutX: Σχετικά με {x}
|
||||||
|
useOsNativeEmojis: Χρήση των Emoji του λειτουργικού συστήματος
|
||||||
|
uiLanguage: Γλώσσα διεπαφής
|
||||||
|
disableDrawer: Να μη χρησιμοποιούνται μενού σε στιλ συρταριού
|
||||||
|
noHistory: Δεν υπάρχει διαθέσιμο ιστορικό
|
||||||
|
joinOrCreateGroup: Λάβετε πρόσκληση για μία ομάδα ή δημιουργήστε τη δική σας.
|
||||||
|
docSource: Πηγή αυτού του εγγράφου
|
||||||
|
regenerate: Επαναδημιουργία
|
||||||
|
fontSize: Μέγεθος γραμματοσειράς
|
||||||
|
noFollowRequests: Δεν έχετε αιτήματα ακολούθησης σε αναμονή
|
||||||
|
dashboard: Ταμπλό
|
||||||
|
clientSettings: Ρυθμίσεις διεπαφής
|
||||||
|
numberOfDays: Αριθμός ημερών
|
||||||
|
hideThisNote: Απόκρυψη αυτής της δημοσίευσης
|
||||||
|
showFeaturedNotesInTimeline: Εμφάνιση προτεινόμενων δημοσιεύσεων στα χρονολόγια
|
||||||
|
objectStorage: Αποθήκευση Object Storage
|
||||||
|
useObjectStorage: Χρήση object storage
|
||||||
|
objectStorageBucket: ''
|
||||||
|
showFixedPostForm: Εμφάνιση της φόρμας δημοσίευσης στο πάνω μέρος των χρονολογίων
|
||||||
|
none: Κανένα
|
||||||
|
unableToProcess: Η επιχείρηση ήταν αδύνατο να ολοκληρωθεί
|
||||||
|
installedApps: Εφαρμογές με εξουσιοδότηση
|
||||||
|
state: Κατάσταση
|
||||||
|
installedDate: Εξουσιοδοτήθηκε στις
|
||||||
|
lastUsedDate: Χρησιμοποιήθηκε τελευταία φορά στις
|
||||||
|
scratchpadDescription: Το σημειωματάριο παρέχει ένα περιβάλλον για πειραματισμό με
|
||||||
|
AiScript. Σε αυτό μπορείτε να γράψετε, να εκτελέσετε, και να δοκιμάσετε τα αποτελέσματα
|
||||||
|
της αλληλεπίδρασης του AiScript με το Iceshrimp.
|
||||||
|
scratchpad: Σημειωματάριο
|
||||||
|
output: Αποτέλεσμα
|
||||||
|
updateRemoteUser: Ανανέωση πληροφοριών απομακρυσμένου μέλους
|
||||||
|
disablePagesScript: Απενεργοποίηση του AiScript στις Σελίδες
|
||||||
|
removeAllFollowingDescription: Η εκτέλεση θα διακόψη την ακολούθηση όλων των μελών
|
||||||
|
από {host}. Παρακαλούμε εκτελέστε το αν το instance π.χ. δεν υπάρχει πια.
|
||||||
|
caption: Αυτόματη Περιγραφή
|
||||||
|
all: Όλα
|
||||||
|
subscribing: Εγγραφή σε συνδρομή
|
||||||
|
publishing: Δημοσιεύεται
|
||||||
|
notResponding: Δεν αποκρίνεται
|
||||||
|
keepOriginalUploadingDescription: Αποθηκεύει το πρωτότυπο αρχείο όπως είναι. Αν απενεργοποιηθεί,
|
||||||
|
μία έκδοση για προβολή στο ίντερνετ θα δημιουργηθεί κατά το ανέβασμα.
|
||||||
|
lookup: Αναζήτηση
|
||||||
|
lightThemes: Φωτεινά θέματα
|
||||||
|
darkThemes: Σκοτεινά θέματα
|
||||||
|
inputNewFolderName: Πληκτρολογήστε ένα νέο όνομα φακέλου
|
||||||
|
hasChildFilesOrFolders: Εφόσον αυτός ο φάκελος δεν είναι άδειος, δεν μπορεί να διαγραφεί.
|
||||||
|
integration: Ενσωματώσεις
|
||||||
|
enableRecommendedTimeline: Ενεργοποίηση χρονολογίου προτεινόμενων
|
||||||
|
driveCapacityPerLocalAccount: Μέγεθος Αποθηκευτικού Χώρου ανά τοπικό μέλος
|
||||||
|
driveCapacityPerRemoteAccount: Μέγεθος Αποθηκευτικού Χώρου ανά απομακρυσμένο μέλος
|
||||||
|
basicInfo: Βασικές πληροφορίες
|
||||||
|
pinnedClipId: Ταυτότητα (id) του κλιπ για καρφίτσωμα
|
||||||
|
hcaptcha: Προστασία hCaptcha
|
||||||
|
enableHcaptcha: Ενεργοποίηση hCaptcha
|
||||||
|
hcaptchaSecretKey: Μυστικό κλειδί
|
||||||
|
enableRecaptcha: Ενεργοποίηση reCAPTCHA
|
||||||
|
recaptchaSiteKey: Κλειδί του site
|
||||||
|
recaptchaSecretKey: Μυστικό κλειδί
|
||||||
|
antennaKeywordsDescription: Διαχωρίστε με κενά για συνθήκη ΚΑΙ ή με αλλαγή γραμμής
|
||||||
|
για συνθήκη Ή.
|
||||||
|
antennaUsersDescription: Παραθέστε ένα όνομα μέλους ανά γραμμή
|
||||||
|
antennaInstancesDescription: Παραθέστε ένα instance host ανά γραμμή
|
||||||
|
withReplies: Να περιλαμβάνονται οι απαντήσεις
|
||||||
|
withFiles: Να περιλαμβάνουν αρχεία
|
||||||
|
silence: Σιώπηση
|
||||||
|
silenceConfirm: Θέλετε σίγουρα να σιωπήσετε αυτό το μέλος;
|
||||||
|
unsilenceConfirm: Σίγουρα θέλετε να αναιρέσετε τη σιώπηση αυτού του μέλους;
|
||||||
|
securityKeyName: Όνομα κλειδιού
|
||||||
|
lastUsed: Τελευταία χρήση
|
||||||
|
unregister: Απεγγραφή
|
||||||
|
notFoundDescription: Δεν ήταν δυνατό να βρεθεί σελίδα που να ανταποκρίνεται σε αυτή
|
||||||
|
τη διεύθυνση URL.
|
||||||
|
signinHistory: Ιστορικό συνδέσεων
|
||||||
|
disableAnimatedMfm: Απενεργοποίηση του MFM με κίνηση
|
||||||
|
dayOverDayChanges: Αλλαγές την τελευταία ημέρα
|
||||||
|
promotion: Προμοταρισμένα
|
||||||
|
promote: Προμοτάρισμα
|
||||||
|
squareAvatars: Εμφάνιση τετραγωνισμένων άβαταρ
|
||||||
|
aboutIceshrimp: Σχετικά με το Iceshrimp
|
||||||
|
maintainerName: Προγραμματιστής/στρια
|
||||||
|
uploadFromUrlRequested: Το ανέβασμα ζητήθηκε
|
||||||
|
themeForLightMode: Θέμα για τη Φωτεινή Λειτουργία
|
||||||
|
circularReferenceFolder: Ο φάκελος του προορισμού είναι υποφάκελος του φακέλου που
|
||||||
|
θέλετε να μετακινήσετε.
|
||||||
|
backgroundImageUrl: Διεύθυνση URL εικόνας φόντου
|
||||||
|
pinnedUsersDescription: Παραθέστε τα ονόματα μελών που θα είναι καρφιτσωμένα στην
|
||||||
|
καρτέλα "Εξερεύνηση" χωρίζοντάς τα με αλλαγή γραμμής.
|
||||||
|
openImageInNewTab: Άνοιγμα εικόνων σε νέα καρτέλα
|
||||||
|
weekOverWeekChanges: Αλλαγές την τελευταία εβδομάδα
|
||||||
|
exploreFediverse: Εξερευνήστε το Fediverse
|
||||||
|
unsilence: Αναίρεση σιώπησης
|
||||||
|
administrator: Διαχειριστής/στρια
|
||||||
|
passwordLessLogin: Σύνδεση χωρίς κωδικό
|
||||||
|
reduceUiAnimation: Ελάττωση των κινούμενων εικόνων
|
||||||
|
serviceworkerInfo: Πρέπει να είναι ενεργοποιημένο για ειδοποιήσεις push.
|
||||||
|
expandTweet: Διεύρυνση τουιτ
|
||||||
|
themeEditor: Επεξεργασία θεμάτων
|
||||||
|
deck: Ντεκ
|
||||||
|
undeck: Έξοδος από το Ντεκ
|
||||||
|
useFullReactionPicker: Χρήση επιλογέα αντιδράσεων πλήρους μεγέθους
|
||||||
|
tokenRequested: Παροχή πρόσβασης στον λογαριασμό
|
||||||
|
emailServer: Σέρβερ email
|
||||||
|
enableEmail: Ενεργοποίηση του email distribution
|
||||||
|
emailAddress: Διεύθυνση email
|
||||||
|
emailConfigInfo: Χρησιμοποιείται για επιβεβαίωση του email σας κατά την εγγραφή ή
|
||||||
|
αν ξεχάσετε τον κωδικό σας
|
||||||
|
regenerateLoginToken: Επαναδημιουργία token σύνδεσης
|
||||||
|
fileIdOrUrl: Ταυτότητα αρχείου (ID) ή διεύθυνση URL
|
||||||
|
typingUsers: '{users} πληκτρολογεί'
|
||||||
|
yourAccountSuspendedDescription: Αυτός ο λογαριασμός έχει αποβληθεί λόγω μη συμμόρφωσης
|
||||||
|
με τους κανόνες του σέρβερ ή κάτι παρόμοιο. Επικοινωνήστε με τον διαχειριστή/στρια
|
||||||
|
αν θα θέλατε έναν πιο λεπτομερή λόγο. Παρακαλούμε μη δημιουργήσετε νέο λογαριασμό.
|
||||||
|
inboxUrl: Διεύθυνση URL των Εισερχομένων
|
||||||
|
generateAccessToken: Δημιουργία token πρόσβασης
|
||||||
|
emptyToDisableSmtpAuth: Αφήστε το όνομα μέλους και τον κωδικό άδεια για να απενεργοποιήσετε
|
||||||
|
την επαλήθευση SMTP
|
||||||
|
instanceMute: Σιγάσεις instance
|
||||||
|
userSaysSomethingReason: '{name} είπε {reason}'
|
||||||
|
logs: Αρχεία καταγραφής
|
||||||
|
abuseReported: Η αναφορά σας στάλθηκε. Ευχαριστούμε πολύ.
|
||||||
|
reporter: Έκανε την αναφορά
|
||||||
|
reporteeOrigin: Καταγωγή αναφερόμενου λογαριασμού
|
||||||
|
reporterOrigin: Καταγωγή λογαριασμού που έκανε την αναφορά
|
||||||
|
forwardReport: Προώθηση της αναφοράς στο απομακρυσμένο instance
|
||||||
|
openInSideView: Άνοιγμα σε προβολή παράθεσης
|
||||||
|
delayed: Με καθυστέρηση
|
||||||
|
useGlobalSettingDesc: Αν ενεργοποιηθεί, οι ρυθμίσεις ειδοποιήσεων του λογαριασμού
|
||||||
|
σας θα χρησιμοποιηθούν. Αν απενεργοποιηθεί, μπορούν να γίνουν ανεξάρτητες ρυθμίσεις.
|
||||||
|
fillAbuseReportDescription: Παρακαλούμε συμπληρώστε λεπτομέρειες σχετικά με αυτή την
|
||||||
|
αναφορά. Αν πρόκειται για συγκεκριμένη δημοσίευση, παρακαλούμε συμπεριλάβετε τη
|
||||||
|
διεύθυνση URL της δημοσίευσης.
|
||||||
|
forwardReportIsAnonymous: Αντί για τον λογαριασμό σας, μία ανώνυμη αναφορά από λογαριασμό
|
||||||
|
του συστήματος θα εμφανιστεί στο απομακρυσμένο instance.
|
||||||
+2228
File diff suppressed because it is too large
Load Diff
+2211
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
|||||||
|
_lang_: Eesti keel
|
||||||
+981
@@ -0,0 +1,981 @@
|
|||||||
|
_lang_: "Suomi"
|
||||||
|
username: Käyttäjänimi
|
||||||
|
fetchingAsApObject: Hae Fedeversestä
|
||||||
|
gotIt: Selvä!
|
||||||
|
cancel: Peruuta
|
||||||
|
enterUsername: Anna käyttäjänimi
|
||||||
|
renotedBy: Buustannut {user}
|
||||||
|
noNotes: Ei lähetyksiä
|
||||||
|
noNotifications: Ei ilmoituksia
|
||||||
|
instance: Instanssi
|
||||||
|
settings: Asetukset
|
||||||
|
basicSettings: Perusasetukset
|
||||||
|
otherSettings: Muut asetukset
|
||||||
|
openInWindow: Avaa ikkunaan
|
||||||
|
profile: Profiili
|
||||||
|
timeline: Aikajana
|
||||||
|
noAccountDescription: Käyttäjä ei ole vielä kirjoittanut kuvaustaan vielä.
|
||||||
|
login: Kirjaudu sisään
|
||||||
|
loggingIn: Kirjautuu sisään
|
||||||
|
logout: Kirjaudu ulos
|
||||||
|
uploading: Tallentaa ylös...
|
||||||
|
save: Tallenna
|
||||||
|
favorites: Kirjanmerkit
|
||||||
|
unfavorite: Poista kirjanmerkeistä
|
||||||
|
favorited: Lisätty kirjanmerkkeihin.
|
||||||
|
alreadyFavorited: Lisätty jo kirjanmerkkeihin.
|
||||||
|
cantFavorite: Ei voitu lisätä kirjanmerkkeihin.
|
||||||
|
pin: Kiinnitä profiiliin
|
||||||
|
unpin: Irroita profiilista
|
||||||
|
delete: Poista
|
||||||
|
forgotPassword: Unohtunut salasana
|
||||||
|
search: Etsi
|
||||||
|
notifications: Ilmoitukset
|
||||||
|
password: Salasana
|
||||||
|
ok: OK
|
||||||
|
noThankYou: Ei kiitos
|
||||||
|
signup: Rekisteröidy
|
||||||
|
users: Käyttäjät
|
||||||
|
addUser: Lisää käyttäjä
|
||||||
|
addInstance: Lisää instanssi
|
||||||
|
favorite: Lisää kirjanmerkkeihin
|
||||||
|
copyContent: Kopioi sisältö
|
||||||
|
deleteAndEdit: Poista ja muokkaa
|
||||||
|
copyLink: Kopioi linkki
|
||||||
|
makeFollowManuallyApprove: Seuraajapyyntö vaatii hyväksymistä
|
||||||
|
follow: Seuraa
|
||||||
|
pinned: Kiinnitä profiiliin
|
||||||
|
followRequestPending: Seuraajapyyntö odottaa
|
||||||
|
you: Sinä
|
||||||
|
unrenote: Peruuta buustaus
|
||||||
|
reaction: Reaktiot
|
||||||
|
reactionSettingDescription2: Vedä uudelleenjärjestelläksesi, napsauta poistaaksesi,
|
||||||
|
paina "+" lisätäksesi.
|
||||||
|
attachCancel: Poista liite
|
||||||
|
enterFileName: Anna tiedostonimi
|
||||||
|
mute: Hiljennä
|
||||||
|
unmute: Poista hiljennys
|
||||||
|
headlineIceshrimp: Avoimen lähdekoodin, hajautettu sosiaalisen median alusta, joka
|
||||||
|
on ikuisesti ilmainen! 🚀
|
||||||
|
monthAndDay: '{day}/{month}'
|
||||||
|
deleteAndEditConfirm: Oletko varma, että haluat poistaa tämän lähetyksen ja muokata
|
||||||
|
sitä? Menetät kaikki reaktiot, buustaukset ja vastaukset lähetyksestäsi.
|
||||||
|
addToList: Lisää listaan
|
||||||
|
sendMessage: Lähetä viesti
|
||||||
|
reply: Vastaa
|
||||||
|
loadMore: Lataa enemmän
|
||||||
|
showMore: Näytä enemmän
|
||||||
|
receiveFollowRequest: Seuraajapyyntö vastaanotettu
|
||||||
|
followRequestAccepted: Seuraajapyyntö hyväksytty
|
||||||
|
mentions: Maininnat
|
||||||
|
importAndExport: Tuo/Vie Tietosisältö
|
||||||
|
import: Tuo
|
||||||
|
export: Vie
|
||||||
|
files: Tiedostot
|
||||||
|
download: Lataa
|
||||||
|
unfollowConfirm: Oletko varma, ettet halua seurata enää käyttäjää {name}?
|
||||||
|
noLists: Sinulla ei ole listoja
|
||||||
|
note: Viesti
|
||||||
|
notes: Viestit
|
||||||
|
following: Seuraa
|
||||||
|
createList: Luo lista
|
||||||
|
manageLists: Hallitse listoja
|
||||||
|
error: Virhe
|
||||||
|
somethingHappened: On tapahtunut virhe
|
||||||
|
retry: Yritä uudelleen
|
||||||
|
pageLoadError: Virhe ladattaessa sivua.
|
||||||
|
serverIsDead: Tämä palvelin ei vastaa. Yritä hetken kuluttua uudelleen.
|
||||||
|
youShouldUpgradeClient: Nähdäksesi tämän sivun, virkistä päivittääksesi asiakasohjelmasi.
|
||||||
|
privacy: Tietosuoja
|
||||||
|
defaultNoteVisibility: Oletusnäkyvyys
|
||||||
|
followRequest: Seuraajapyyntö
|
||||||
|
followRequests: Seuraajapyynnöt
|
||||||
|
unfollow: Poista seuraaminen
|
||||||
|
enterEmoji: Syötä emoji
|
||||||
|
renote: Buustaa
|
||||||
|
renoted: Buustattu.
|
||||||
|
cantRenote: Tätä lähetystä ei voi buustata.
|
||||||
|
cantReRenote: Buustausta ei voi buustata.
|
||||||
|
quote: Lainaus
|
||||||
|
pinnedNote: Lukittu lähetys
|
||||||
|
clickToShow: Napsauta nähdäksesi
|
||||||
|
sensitive: Herkkää sisältöä (NSFW)
|
||||||
|
add: Lisää
|
||||||
|
enableEmojiReactions: Ota käyttöön emoji-reaktiot
|
||||||
|
showEmojisInReactionNotifications: Näytä emojit reaktioilmoituksissa
|
||||||
|
reactionSetting: Reaktiot näytettäväksi reaktiovalitsimessa
|
||||||
|
rememberNoteVisibility: Muista lähetyksen näkyvyysasetukset
|
||||||
|
markAsSensitive: Merkitse herkäksi sisällöksi (NSFW)
|
||||||
|
unmarkAsSensitive: Poista merkintä herkkää sisältöä (NSFW)
|
||||||
|
renoteMute: Hiljennä buustit
|
||||||
|
renoteUnmute: Poista buustien hiljennys
|
||||||
|
block: Estä
|
||||||
|
unblock: Poista esto
|
||||||
|
unsuspend: Poista keskeytys
|
||||||
|
suspend: Keskeytys
|
||||||
|
blockConfirm: Oletko varma, että haluat estää tämän tilin?
|
||||||
|
unblockConfirm: Oletko varma, että haluat poistaa tämän tilin eston?
|
||||||
|
selectAntenna: Valitse antenni
|
||||||
|
selectWidget: Valitse vimpain
|
||||||
|
editWidgets: Muokkaa vimpaimia
|
||||||
|
editWidgetsExit: Valmis
|
||||||
|
emoji: Emoji
|
||||||
|
emojis: Emojit
|
||||||
|
emojiName: Emojin nimi
|
||||||
|
emojiUrl: Emojin URL-linkki
|
||||||
|
cacheRemoteFiles: Taltioi etätiedostot välimuistiin
|
||||||
|
flagAsBot: Merkitse tili botiksi
|
||||||
|
flagAsBotDescription: Ota tämä vaihtoehto käyttöön, jos tätä tiliä ohjaa ohjelma.
|
||||||
|
Jos se on käytössä, se toimii lippuna muille kehittäjille, jotta estetään loputtomat
|
||||||
|
vuorovaikutusketjut muiden bottien kanssa ja säädetään Iceshrimpn sisäiset järjestelmät
|
||||||
|
käsittelemään tätä tiliä botina.
|
||||||
|
flagAsCat: Oletko kissa? 🐱
|
||||||
|
flagAsCatDescription: Saat kissan korvat ja puhut kuin kissa!
|
||||||
|
flagSpeakAsCat: Puhu kuin kissa
|
||||||
|
flagShowTimelineReplies: Näytä vastaukset aikajanalla
|
||||||
|
addAccount: Lisää tili
|
||||||
|
loginFailed: Kirjautuminen epäonnistui
|
||||||
|
showOnRemote: Katsele etäinstanssilla
|
||||||
|
general: Yleistä
|
||||||
|
accountMoved: 'Käyttäjä on muuttanut uuteen tiliin:'
|
||||||
|
wallpaper: Taustakuva
|
||||||
|
setWallpaper: Aseta taustakuva
|
||||||
|
searchWith: 'Etsi: {q}'
|
||||||
|
youHaveNoLists: Sinulla ei ole listoja
|
||||||
|
followConfirm: Oletko varma, että haluat seurata käyttäjää {name}?
|
||||||
|
host: Isäntä
|
||||||
|
selectUser: Valitse käyttäjä
|
||||||
|
annotation: Kommentit
|
||||||
|
registeredAt: Rekisteröity
|
||||||
|
latestRequestReceivedAt: Viimeisin pyyntö vastaanotettu
|
||||||
|
latestRequestSentAt: Viimeisin pyyntö lähetetty
|
||||||
|
storageUsage: Tallennustilan käyttö
|
||||||
|
charts: Kaaviot
|
||||||
|
stopActivityDelivery: Lopeta toimintojen lähettäminen
|
||||||
|
blockThisInstance: Estä tämä instanssi
|
||||||
|
operations: Toiminnot
|
||||||
|
metadata: Metatieto
|
||||||
|
monitor: Seuranta
|
||||||
|
jobQueue: Työjono
|
||||||
|
cpuAndMemory: Prosessori ja muisti
|
||||||
|
network: Verkko
|
||||||
|
disk: Levy
|
||||||
|
clearCachedFiles: Tyhjennä välimuisti
|
||||||
|
clearCachedFilesConfirm: Oletko varma, että haluat tyhjentää kaikki välimuistiin tallennetut
|
||||||
|
etätiedostot?
|
||||||
|
blockedInstances: Estetyt instanssit
|
||||||
|
hiddenTags: Piilotetut asiatunnisteet
|
||||||
|
mention: Maininta
|
||||||
|
copyUsername: Kopioi käyttäjänimi
|
||||||
|
searchUser: Etsi käyttäjää
|
||||||
|
showLess: Sulje
|
||||||
|
youGotNewFollower: seurasi sinua
|
||||||
|
directNotes: Yksityisviestit
|
||||||
|
driveFileDeleteConfirm: Oletko varma, että haluat poistaa tiedoston " {name}"? Se
|
||||||
|
poistetaan kaikista viesteistä, jotka sisältävät sen liitetiedostona.
|
||||||
|
importRequested: Olet pyytänyt viemistä. Tämä voi viedä hetken.
|
||||||
|
exportRequested: Olet pyytänyt tuomista. Tämä voi viedä hetken. Se lisätään asemaan
|
||||||
|
kun tuonti valmistuu.
|
||||||
|
lists: Listat
|
||||||
|
followers: Seuraajat
|
||||||
|
followsYou: Seuraa sinua
|
||||||
|
pageLoadErrorDescription: Tämä yleensä johtuu verkkovirheistä tai selaimen välimuistista.
|
||||||
|
Kokeile tyhjentämällä välimuisti ja yritä sitten hetken kuluttua uudelleen.
|
||||||
|
enterListName: Anna listalle nimi
|
||||||
|
instanceInfo: Instanssin tiedot
|
||||||
|
clearQueue: Tyhjennä jono
|
||||||
|
suspendConfirm: Oletko varma, että haluat keskeyttää tämän tilin?
|
||||||
|
unsuspendConfirm: Oletko varma, että haluat poistaa tämän tilin keskeytyksen?
|
||||||
|
selectList: Valitse lista
|
||||||
|
customEmojis: Kustomoitu Emoji
|
||||||
|
addEmoji: Lisää
|
||||||
|
settingGuide: Suositellut asetukset
|
||||||
|
cacheRemoteFilesDescription: Kun tämä asetus ei ole käytössä, etätiedostot on ladattu
|
||||||
|
suoraan etäinstanssilta. Asetuksen poistaminen käytöstä vähentää tallennustilan
|
||||||
|
käyttöä, mutta lisää verkkoliikennettä kun pienoiskuvat eivät muodostu.
|
||||||
|
flagSpeakAsCatDescription: Lähetyksesi nyanifioidaan, kun olet kissatilassa
|
||||||
|
flagShowTimelineRepliesDescription: Näyttää käyttäjien vastaukset muiden käyttäjien
|
||||||
|
lähetyksiin aikajanalla, jos se on päällä.
|
||||||
|
autoAcceptFollowed: Automaattisesti hyväksy seuraamispyynnöt käyttäjiltä, joita seuraat
|
||||||
|
perHour: Tunnissa
|
||||||
|
removeWallpaper: Poista taustakuva
|
||||||
|
recipient: Vastaanottaja(t)
|
||||||
|
federation: Federaatio
|
||||||
|
software: Ohjelmisto
|
||||||
|
proxyAccount: Proxy-tili
|
||||||
|
proxyAccountDescription: Välitystili (Proxy-tili) on tili, joka toimii käyttäjien
|
||||||
|
etäseuraajana tietyin edellytyksin. Kun käyttäjä esimerkiksi lisää etäkäyttäjän
|
||||||
|
luetteloon, etäkäyttäjän toimintaa ei toimiteta instanssiin, jos yksikään paikallinen
|
||||||
|
käyttäjä ei seuraa kyseistä käyttäjää, joten välitystili seuraa sen sijaan.
|
||||||
|
latestStatus: Viimeisin tila
|
||||||
|
selectInstance: Valitse instanssi
|
||||||
|
instances: Instanssit
|
||||||
|
perDay: Päivässä
|
||||||
|
version: Versio
|
||||||
|
statistics: Tilastot
|
||||||
|
clearQueueConfirmTitle: Oletko varma, että haluat tyhjentää jonon?
|
||||||
|
introIceshrimp: Tervetuloa! Iceshrimp on avoimen lähdekoodin, hajautettu sosiaalisen
|
||||||
|
median alusta, joka on ikuisesti ilmainen! 🚀
|
||||||
|
clearQueueConfirmText: Mitkään välittämättömät lähetykset, jotka ovat jonossa, eivät
|
||||||
|
federoidu. Yleensä tätä toimintoa ei tarvita.
|
||||||
|
blockedInstancesDescription: Lista instanssien isäntänimistä, jotka haluat estää.
|
||||||
|
Listatut instanssit eivät kykene kommunikoimaan enää tämän instanssin kanssa.
|
||||||
|
security: Turvallisuus
|
||||||
|
retypedNotMatch: Syöte ei kelpaa.
|
||||||
|
fromDrive: Asemasta
|
||||||
|
keepOriginalUploading: Säilytä alkuperäinen kuva
|
||||||
|
uploadFromUrlDescription: Tiedoston URL, jonka haluat ylösladata
|
||||||
|
themeForLightMode: Teema vaaleassa tilassa
|
||||||
|
theme: Teemat
|
||||||
|
themeForDarkMode: Teema tummassa tilassa
|
||||||
|
drive: Asema
|
||||||
|
darkThemes: Tummat teemat
|
||||||
|
copyUrl: Kopioi URL-linkki
|
||||||
|
rename: Uudelleennimeä
|
||||||
|
maintainerName: Ylläpitäjä
|
||||||
|
maintainerEmail: Ylläpitäjän sähköposti
|
||||||
|
tosUrl: Palvelun ehdot URL-linkki
|
||||||
|
thisYear: Vuosi
|
||||||
|
backgroundImageUrl: Taustakuvan URL-linkki
|
||||||
|
basicInfo: Perustiedot
|
||||||
|
pinnedPagesDescription: Kirjoita niiden sivujen polut, jotka haluat liittää tämän
|
||||||
|
instanssin yläsivulle rivinvaihdoin erotettuna.
|
||||||
|
hcaptchaSiteKey: Sivuston avain
|
||||||
|
hcaptchaSecretKey: Salausavain
|
||||||
|
silencedInstances: Hiljennetyt instanssit
|
||||||
|
muteAndBlock: Hiljennykset ja estetyt
|
||||||
|
mutedUsers: Hiljennetyt käyttäjät
|
||||||
|
blockedUsers: Estetyt käyttäjät
|
||||||
|
noUsers: Ei yhtään käyttäjää
|
||||||
|
noInstances: Ei yhtään instanssia
|
||||||
|
editProfile: Muokkaa profiilia
|
||||||
|
noteDeleteConfirm: Oletko varma, että haluat poistaa tämän viestin?
|
||||||
|
pinLimitExceeded: Et voi kiinnittää enempää viestejä
|
||||||
|
intro: Iceshrimp -asennus valmis! Ole hyvä ja luo admin-käyttäjä.
|
||||||
|
done: Valmis
|
||||||
|
processing: Suorittaa
|
||||||
|
preview: Esikatselu
|
||||||
|
default: Oletus
|
||||||
|
defaultValueIs: 'Oletus: {value}'
|
||||||
|
noCustomEmojis: Ei emojia
|
||||||
|
noJobs: Ei töitä
|
||||||
|
federating: Federoi
|
||||||
|
blocked: Estetty
|
||||||
|
silenced: Hiljennetty
|
||||||
|
suspended: Keskeytetty
|
||||||
|
all: Kaikki
|
||||||
|
publishing: Julkaisee
|
||||||
|
subscribing: Tilaa
|
||||||
|
notResponding: Ei vastaa
|
||||||
|
instanceFollowing: Seuraa instanssia
|
||||||
|
instanceFollowers: Instanssin seuraajat
|
||||||
|
instanceUsers: Instanssin käyttäjät
|
||||||
|
changePassword: Muuta salasana
|
||||||
|
newPasswordRetype: Uudelleensyötä uusi salasana
|
||||||
|
more: Lisää!
|
||||||
|
featured: Esillä
|
||||||
|
usernameOrUserId: Käyttäjänimi tai käyttäjä id
|
||||||
|
noSuchUser: Käyttäjää ei löydy
|
||||||
|
lookup: Hae
|
||||||
|
announcements: Tiedoitteet
|
||||||
|
imageUrl: Kuva URL-linkki
|
||||||
|
removed: Onnistuneesti poistettu
|
||||||
|
removeAreYouSure: Oletko varma, että haluat poistaa " {x}"?
|
||||||
|
resetAreYouSure: Haluatko nollata?
|
||||||
|
saved: Tallennettu
|
||||||
|
messaging: Juttele
|
||||||
|
upload: Lataa ylös
|
||||||
|
fromUrl: URL:stä
|
||||||
|
uploadFromUrl: Ylöslataa URL:stä
|
||||||
|
uploadFromUrlRequested: Ylöslataus pyydetty
|
||||||
|
uploadFromUrlMayTakeTime: Voi viedä hetki, kun ylöslataus on valmis.
|
||||||
|
explore: Tutustu
|
||||||
|
messageRead: Lue
|
||||||
|
noMoreHistory: Ei lisää historiaa
|
||||||
|
startMessaging: Aloita uusi juttelu
|
||||||
|
manageGroups: Hallitse ryhmiä
|
||||||
|
nUsersRead: lukenut {n}
|
||||||
|
agreeTo: Hyväksyn {0}
|
||||||
|
tos: Palvelun ehdot
|
||||||
|
start: Aloita
|
||||||
|
home: Koti
|
||||||
|
remoteUserCaution: Etäkäyttäjän tiedot saattavat olla puutteellisia.
|
||||||
|
light: Vaalea
|
||||||
|
dark: Tumma
|
||||||
|
lightThemes: Vaaleat teemat
|
||||||
|
syncDeviceDarkMode: Synkronoi tumma tila laitteen asetuksen mukaan
|
||||||
|
fileName: Tiedostonimi
|
||||||
|
selectFile: Valitse tiedosto
|
||||||
|
selectFiles: Valitse tiedostot
|
||||||
|
selectFolder: Valitse kansio
|
||||||
|
selectFolders: Valitse kansiot
|
||||||
|
renameFile: Uudelleennimeä tiedosto
|
||||||
|
folderName: Kansionimi
|
||||||
|
createFolder: Luo kansio
|
||||||
|
renameFolder: Uudelleennimeä kansio
|
||||||
|
deleteFolder: Poista kansio
|
||||||
|
addFile: Lisää tiedosto
|
||||||
|
emptyDrive: Asemasi on tyhjä
|
||||||
|
emptyFolder: Tämä kansio on tyhjä
|
||||||
|
unableToDelete: Ei voitu poistaa
|
||||||
|
inputNewFileName: Syötä uusi tiedostonimi
|
||||||
|
inputNewDescription: Syötä uusi kuvateksti
|
||||||
|
inputNewFolderName: Syötä uusi kansionimi
|
||||||
|
hasChildFilesOrFolders: Koska kansio ei ole tyhjä, sitä ei voi poistaa.
|
||||||
|
avatar: Kuvake
|
||||||
|
banner: Banneri
|
||||||
|
nsfw: Herkkää sisältöä (NSFW)
|
||||||
|
whenServerDisconnected: Kun yhteys palvelimeen menetetään
|
||||||
|
disconnectedFromServer: Yhteys palvelimeen katkennut
|
||||||
|
reload: Päivitä
|
||||||
|
doNothing: Hylkää
|
||||||
|
reloadConfirm: Haluaisitko päivittää aikajanan?
|
||||||
|
unwatch: Lopeta katselu
|
||||||
|
watch: Katsele
|
||||||
|
accept: Hyväksy
|
||||||
|
reject: Hylkää
|
||||||
|
normal: Normaali
|
||||||
|
instanceName: Instanssin nimi
|
||||||
|
thisMonth: Kuukausi
|
||||||
|
today: Tänään
|
||||||
|
monthX: '{month}'
|
||||||
|
connectService: Yhdistä
|
||||||
|
disconnectService: Katkaise yhteys
|
||||||
|
enableLocalTimeline: Ota käyttöön paikallinen aikajana
|
||||||
|
enableGlobalTimeline: Ota käyttöön globaali aikajana
|
||||||
|
enableRecommendedTimeline: Ota käyttöön suositellut -aikajana
|
||||||
|
registration: Rekisteröinti
|
||||||
|
enableRegistration: Ota käyttöön uuden käyttäjän rekisteröinti
|
||||||
|
driveCapacityPerLocalAccount: Aseman kapasiteetti paikallista käyttäjää kohti
|
||||||
|
driveCapacityPerRemoteAccount: Aseman kapasiteetti etäkäyttäjää kohti
|
||||||
|
inMb: megatavuissa
|
||||||
|
bannerUrl: Bannerikuvan URL-linkki
|
||||||
|
pinnedUsers: Kiinnitetyt käyttäjät
|
||||||
|
pinnedPages: Kiinnitetyt sivut
|
||||||
|
pinnedClipId: Kiinnitettävän leikkeen ID
|
||||||
|
enableHcaptcha: Ota käyttöön hCaptcha-tunnistus
|
||||||
|
recaptcha: CAPTCHA uudelleen
|
||||||
|
enableRecaptcha: Ota käyttöön CAPTCHA uudelleen
|
||||||
|
recaptchaSiteKey: Sivuston avain
|
||||||
|
recaptchaSecretKey: Salausavain
|
||||||
|
silenceThisInstance: Hiljennä tämä instanssi
|
||||||
|
silencedInstancesDescription: Lista isäntänimistä, joka haluat hiljentää. Tilejä listassa
|
||||||
|
kohdellaan "hiljennettynä", ne voivat tehdä seuraajapyyntöjä ja eivät voi tehdä
|
||||||
|
mainintoja paikallistileistä jossei seurattu. Tämä ei vaikuta estettyihin instansseihin.
|
||||||
|
hiddenTagsDescription: 'Listaa aihetunnisteet (ilman #-merkkiä) aihetunnisteet, jotka
|
||||||
|
haluat piilottaa trendaavista ja Tutustu-osiosta. Piilotetut aihetunnisteet ovat
|
||||||
|
kuitenkin löydettävissä muilla keinoilla. Estetyt instanssit eivät vaikuta, vaikka
|
||||||
|
listattu tähän.'
|
||||||
|
currentPassword: Nykyinen salasana
|
||||||
|
newPassword: Uusi salasana
|
||||||
|
attachFile: Liitetyt tiedostot
|
||||||
|
keepOriginalUploadingDescription: Tallentaa alkuperäisen kuvan sellaisenaan. Jos kytketty
|
||||||
|
päältä, webissä näytettävä versio luodaan ylöslatauksen yhteydessä.
|
||||||
|
remove: Poista
|
||||||
|
circularReferenceFolder: Kohdekansio on kansion alikansio, jonka haluat siirtää.
|
||||||
|
deleteAreYouSure: Oletko varma, että haluat poistaa kokonaan" {x}"?
|
||||||
|
yearsOld: '{age} vuotias'
|
||||||
|
activity: Aktiivisuus
|
||||||
|
images: Kuvat
|
||||||
|
birthday: Syntymäpäivä
|
||||||
|
registeredDate: Liittynyt
|
||||||
|
location: Sijainti
|
||||||
|
disablingTimelinesInfo: Järjestelmänvalvojilla ja moderaattoreilla on aina pääsy kaikille
|
||||||
|
aikajanoille, vaikka olisikin poistettu käytöstä.
|
||||||
|
dayX: '{day}'
|
||||||
|
yearX: '{year}'
|
||||||
|
pages: Sivut
|
||||||
|
integration: Integraatiot
|
||||||
|
instanceDescription: Instanssin kuvaus
|
||||||
|
invite: Kutsu
|
||||||
|
iconUrl: Ikoni URL-linkki
|
||||||
|
pinnedUsersDescription: Listaa käyttäjänimet eroteltuna rivivaihdoin kiinnittääksesi
|
||||||
|
ne "Tutustu" välilehteen.
|
||||||
|
pinnedNotes: Kiinnitetyt viestit
|
||||||
|
hcaptcha: hCaptcha-tunnistus
|
||||||
|
antennaSource: Antennin lähde
|
||||||
|
invitationCode: Kutsukoodi
|
||||||
|
checking: Tarkistetaan...
|
||||||
|
passwordNotMatched: Ei vastaa
|
||||||
|
doing: Käsittelee...
|
||||||
|
category: Kategoria
|
||||||
|
tags: Tagit
|
||||||
|
disableAnimatedMfm: Poista MFM -animaatiot käytöstä
|
||||||
|
openImageInNewTab: Avaa kuvat uuteen välilehteen
|
||||||
|
dashboard: Kojelauta
|
||||||
|
local: Paikallinen
|
||||||
|
remote: Etä
|
||||||
|
total: Yhteensä
|
||||||
|
weekOverWeekChanges: Muutokset viime viikkoon
|
||||||
|
objectStorageRegion: Alue
|
||||||
|
popout: Ulosvedettävä
|
||||||
|
volume: Äänenvoimakkuus
|
||||||
|
masterVolume: Master äänenvoimakkuus
|
||||||
|
details: Yksityiskohdat
|
||||||
|
chooseEmoji: Valitse emoji
|
||||||
|
descendingOrder: Laskevasti
|
||||||
|
scratchpad: Raaputusalusta
|
||||||
|
output: Ulostulo
|
||||||
|
invisibleNote: Näkymätön viesti
|
||||||
|
enableInfiniteScroll: Lataa enemmän automaattisesti
|
||||||
|
visibility: Näkyvyys
|
||||||
|
useCw: Piilota sisältö
|
||||||
|
poll: Kysely
|
||||||
|
enablePlayer: Avaa videotoistimeen
|
||||||
|
enterFileDescription: Syötä tiedostokuvaus
|
||||||
|
author: Kirjoittaja
|
||||||
|
manage: Hallinta
|
||||||
|
description: Kuvaus
|
||||||
|
describeFile: Lisää tiedostokuvaus
|
||||||
|
height: Korkeus
|
||||||
|
large: Suuri
|
||||||
|
medium: Keskikokoinen
|
||||||
|
small: Pieni
|
||||||
|
other: Muu
|
||||||
|
create: Luo
|
||||||
|
regenerateLoginTokenDescription: Luo uudelleen kirjautumisen aikana sisäisesti käytettävän
|
||||||
|
tunnuksen. Normaalisti tämä toiminto ei ole tarpeen. Jos tunniste luodaan uudelleen,
|
||||||
|
kaikki laitteet kirjautuvat ulos.
|
||||||
|
setMultipleBySeparatingWithSpace: Erottele useat merkinnät välilyönneillä.
|
||||||
|
fileIdOrUrl: Tiedosto ID tai URL-linkki
|
||||||
|
behavior: Käytös
|
||||||
|
instanceTicker: Viestejä koskevat instanssitiedot
|
||||||
|
waitingFor: Odottaa {x}
|
||||||
|
random: Satunnainen
|
||||||
|
system: Järjestelmä
|
||||||
|
switchUi: Ulkoasu
|
||||||
|
createNew: Luo uusi
|
||||||
|
followersCount: Seuraajien määrä
|
||||||
|
renotedCount: Saatujen buustausten määrä
|
||||||
|
followingCount: Seurattujen tilien määrä
|
||||||
|
notSet: Ei asetettu
|
||||||
|
nUsers: '{n} Käyttäjää'
|
||||||
|
nNotes: '{n} Viestiä'
|
||||||
|
sendErrorReports: Lähetä virheraportteja
|
||||||
|
backgroundColor: Taustaväri
|
||||||
|
accentColor: Korostusväri
|
||||||
|
textColor: Tekstin väri
|
||||||
|
advanced: Edistynyt
|
||||||
|
saveAs: Tallenna nimellä...
|
||||||
|
invalidValue: Epäkelpo arvo.
|
||||||
|
registry: Rekisteri
|
||||||
|
closeAccount: Sulje tili
|
||||||
|
currentVersion: Nykyinen versio
|
||||||
|
capacity: Kapasiteetti
|
||||||
|
clear: Palaa
|
||||||
|
_theme:
|
||||||
|
explore: Tutustu teemoihin
|
||||||
|
silenceConfirm: Oletko varma, että haluat hiljentää tämän käyttäjän?
|
||||||
|
notesAndReplies: Viestit ja vastaukset
|
||||||
|
withFiles: Tiedostot sisältyvät
|
||||||
|
silence: Hiljennä
|
||||||
|
popularTags: Suositut tagit
|
||||||
|
userList: Listat
|
||||||
|
about: Tietoja
|
||||||
|
aboutIceshrimp: Tietoja Iceshrimpstä
|
||||||
|
exploreFediverse: Tutustu fediverseen
|
||||||
|
recentlyUpdatedUsers: Vastikään lisätyt käyttäjät
|
||||||
|
recentlyRegisteredUsers: Uudet liittyneet jäyttäjät
|
||||||
|
recentlyDiscoveredUsers: Vastikään löydetyt käyttäjät
|
||||||
|
exploreUsersCount: Täällä on {count} käyttäjää
|
||||||
|
share: Jaa
|
||||||
|
moderation: Sisällön valvonta
|
||||||
|
nUsersMentioned: Mainittu {n} käyttäjältä
|
||||||
|
securityKey: Turva-avain
|
||||||
|
securityKeyName: Avainnimi
|
||||||
|
registerSecurityKey: Rekisteröi turva-avain
|
||||||
|
lastUsed: Viimeksi käytetty
|
||||||
|
unregister: Poista rekisteröinti
|
||||||
|
passwordLessLogin: Salasanaton sisäänkirjautuminen
|
||||||
|
cacheClear: Tyhjennä välimuisti
|
||||||
|
markAsReadAllNotifications: Merkitse kaikki ilmoitukset luetuksi
|
||||||
|
markAsReadAllUnreadNotes: Merkitse kaikki viestit luetuiksi
|
||||||
|
uploadFolder: Oletuskansio ylöslatauksille
|
||||||
|
createGroup: Luo ryhmä
|
||||||
|
group: Ryhmä
|
||||||
|
groups: Ryhmät
|
||||||
|
ownedGroups: Omistetut ryhmät
|
||||||
|
help: Apua
|
||||||
|
inputMessageHere: Syötä viesti tähän
|
||||||
|
close: Sulje
|
||||||
|
joinedGroups: Liittyneet ryhmät
|
||||||
|
invites: Kutsut
|
||||||
|
groupName: Ryhmänimi
|
||||||
|
members: Jäsenet
|
||||||
|
language: Kieli
|
||||||
|
signinHistory: Kirjautumishistoria
|
||||||
|
docSource: Tämän dokumentin lähde
|
||||||
|
createAccount: Luo tili
|
||||||
|
existingAccount: Olemassa oleva tili
|
||||||
|
promotion: Edistetty
|
||||||
|
promote: Edistää
|
||||||
|
numberOfDays: Päivien määrä
|
||||||
|
accountSettings: Tilin asetukset
|
||||||
|
objectStorage: Objektitallennus
|
||||||
|
useObjectStorage: Käytä objektitallennusta
|
||||||
|
objectStorageBaseUrl: Perus URL-linkki
|
||||||
|
objectStorageBaseUrlDesc: "Viitteenä käytetty URL-linkki. Määritä CDN:n tai välityspalvelimen
|
||||||
|
URL-linkki, jos käytät kumpaakin.\nKäytä S3:lle 'https://<bucket>.s3.amazonaws.com'
|
||||||
|
ja GCS:lle tai vastaaville palveluille 'https://storage.googleapis.com/<bucket>'
|
||||||
|
jne."
|
||||||
|
objectStorageBucket: Kauha
|
||||||
|
newNoteRecived: Uusia viestejä
|
||||||
|
smtpPort: Portti
|
||||||
|
instanceMute: Instanssin mykistys
|
||||||
|
repliesCount: Lähetettyjen vastausten määrä
|
||||||
|
updatedAt: Päivitetty
|
||||||
|
notFound: Ei löydy
|
||||||
|
useOsNativeEmojis: Käytä käyttöjärjestelmän natiivi-Emojia
|
||||||
|
joinOrCreateGroup: Tule kutsutuksi ryhmään tai luo oma ryhmä.
|
||||||
|
text: Teksti
|
||||||
|
usernameInvalidFormat: Käytä isoja ja pieniä kirjaimia, numeroita ja erikoismerkkejä.
|
||||||
|
unsilenceConfirm: Oletko varma, että haluat poistaa käyttäjän hiljennyksen?
|
||||||
|
popularUsers: Suositut käyttäjät
|
||||||
|
moderator: Moderaattori
|
||||||
|
twoStepAuthentication: Kaksivaiheinen tunnistus
|
||||||
|
notFoundDescription: URL-linkkiin liittyvää sivua ei löytynyt.
|
||||||
|
antennaKeywords: Kuunneltavat avainsanat
|
||||||
|
antennaExcludeKeywords: Poislasketut avainsanat
|
||||||
|
antennaKeywordsDescription: Erottele välilyönneillä AND-ehtoa varten tai rivinvaihdolla
|
||||||
|
OR-ehtoa varten.
|
||||||
|
notifyAntenna: Ilmoita uusista viesteistä
|
||||||
|
withFileAntenna: Vain viestit tiedoston kanssa
|
||||||
|
enableServiceworker: Ota käyttöön Push-notifikaatiot selaimessasi
|
||||||
|
antennaUsersDescription: Luettele yksi käyttäjänimi rivi kohti
|
||||||
|
antennaInstancesDescription: Luettele yksi instanssi riviä kohti
|
||||||
|
caseSensitive: Isot ja pienet kirjaimet
|
||||||
|
withReplies: Sisällytä vastaukset
|
||||||
|
connectedTo: Seuraavat tili(t) on yhdistetty
|
||||||
|
unsilence: Poista hiljennys
|
||||||
|
administrator: Järjestelmänvalvoja
|
||||||
|
token: Merkki
|
||||||
|
resetPassword: Resetoi salasana
|
||||||
|
reduceUiAnimation: Vähennä käyttöliittymän animaatioita
|
||||||
|
transfer: Siirrä
|
||||||
|
messagingWithUser: Yksityisjuttelu
|
||||||
|
title: Otsikko
|
||||||
|
enable: Ota käyttöön
|
||||||
|
next: Seuraava
|
||||||
|
retype: Syötä uudelleen
|
||||||
|
noteOf: Lähettänyt {user}
|
||||||
|
inviteToGroup: Kutsu ryhmään
|
||||||
|
quoteAttached: Lainaus
|
||||||
|
quoteQuestion: Liitä lainauksena?
|
||||||
|
noMessagesYet: Ei vielä viestejä
|
||||||
|
newMessageExists: Uusia viestejä
|
||||||
|
onlyOneFileCanBeAttached: Voit liittää vain yhden tiedoston viestiin
|
||||||
|
signinRequired: Ole hyvä ja rekisteröidy tai kirjaudu sisään jatkaaksesi
|
||||||
|
invitations: Kutsut
|
||||||
|
available: Saatavilla
|
||||||
|
unavailable: Ei saatavissa
|
||||||
|
tooShort: Liian lyhyt
|
||||||
|
tooLong: Liian pitkä
|
||||||
|
weakPassword: Heikko salasana
|
||||||
|
normalPassword: Kohtalainen salasana
|
||||||
|
strongPassword: Vahva salasana
|
||||||
|
passwordMatched: Vastaa
|
||||||
|
signinWith: Kirjaudu sisään {x}
|
||||||
|
signinFailed: Ei voitu kirjautua sisään. Annettu käyttäjänimi tai salasana virheellinen.
|
||||||
|
tapSecurityKey: Napsauta turva-avaintasi
|
||||||
|
or: Tai
|
||||||
|
uiLanguage: Anna käyttöliittymän kieli
|
||||||
|
groupInvited: Sinut on kutsuttu ryhmään
|
||||||
|
aboutX: Tietoja {x}
|
||||||
|
disableDrawer: Älä käytä laatikkotyyppisiä valikoita
|
||||||
|
youHaveNoGroups: Sinulla ei ole ryhmiä
|
||||||
|
noHistory: Ei historiaa saatavilla
|
||||||
|
regenerate: Uudelleenluo
|
||||||
|
fontSize: Kirjasinkoko
|
||||||
|
dayOverDayChanges: Muutokset eiliseen
|
||||||
|
clientSettings: Asiakkaan asetukset
|
||||||
|
hideThisNote: Piilota tämä viesti
|
||||||
|
showFeaturedNotesInTimeline: Näytä esillä olevat viestit aikajanalla
|
||||||
|
objectStorageBucketDesc: Määritä palveluntarjoajasi käyttämä kauhan nimi.
|
||||||
|
objectStoragePrefix: Etuliite
|
||||||
|
objectStorageEndpoint: Päätepiste
|
||||||
|
objectStorageRegionDesc: Määritä alue, kuten "xx-east-1". Jos palvelusi ei tee eroa
|
||||||
|
alueiden välillä, jätä tämä kohta tyhjäksi tai kirjoita "us-east-1".
|
||||||
|
objectStorageUseSSL: Käytä SSL-salausta
|
||||||
|
objectStorageUseSSLDesc: Poista tämä käytöstä, jos et aio käyttää HTTPS:ää API-yhteyksissä
|
||||||
|
objectStorageUseProxy: Yhdistä välityspalvelimen kautta
|
||||||
|
objectStorageUseProxyDesc: Poista tämä käytöstä, jos et aio käyttää välityspalvelinta
|
||||||
|
API-yhteyksiä varten
|
||||||
|
objectStorageSetPublicRead: Aseta "public-read" ylöslataukseen
|
||||||
|
serverLogs: Palvelimen lokit
|
||||||
|
deleteAll: Poista kaikki
|
||||||
|
showFixedPostForm: Näytä viesti-ikkuna aikajanan yläpuolella
|
||||||
|
sounds: Äänet
|
||||||
|
listen: Kuuntele
|
||||||
|
none: Ei mitään
|
||||||
|
showInPage: Näytä sivulla
|
||||||
|
recentUsed: Vastikään käytetty
|
||||||
|
install: Asenna
|
||||||
|
uninstall: Poista asennus
|
||||||
|
installedApps: Hyväksytyt sovellukset
|
||||||
|
nothing: Ei nähtävää täällä
|
||||||
|
state: Tila
|
||||||
|
sort: Järjestä
|
||||||
|
ascendingOrder: Nousevasti
|
||||||
|
scratchpadDescription: Raaputusalusta tarjoaa ympäristön AiScript-kokeiluja varten.
|
||||||
|
Voit kirjoittaa, suorittaa ja tarkistaa sen tulokset vuorovaikutuksessa siinä olevan
|
||||||
|
Iceshrimpn kanssa.
|
||||||
|
script: Skripti
|
||||||
|
disablePagesScript: Poista AiScript käytöstä sivuilla
|
||||||
|
updateRemoteUser: Päivitä etäkäyttäjän tiedot
|
||||||
|
deleteAllFiles: Poista kaikki tiedostot
|
||||||
|
deleteAllFilesConfirm: Oletko varma, että haluat poistaa kaikki tiedostot?
|
||||||
|
removeAllFollowing: Poista seuraaminen kaikista seuratuista käyttäjistä
|
||||||
|
removeAllFollowingDescription: Tämän suorittaminen poistaa kaikki {host}:n tilit.
|
||||||
|
Suorita tämä, jos instanssia ei esimerkiksi enää ole olemassa.
|
||||||
|
userSuspended: Tämä käyttäjä on hyllytetty.
|
||||||
|
userSilenced: Tämä käyttäjä on hiljennetty.
|
||||||
|
yourAccountSuspendedTitle: Tämä tili on hyllytetty
|
||||||
|
yourAccountSuspendedDescription: Tämä tili on hyllytetty palvelimen palveluehtojen
|
||||||
|
tai vastaavien rikkomisen vuoksi. Ota yhteyttä ylläpitäjään, jos haluat tietää tarkemman
|
||||||
|
syyn. Älä luo uutta tiliä.
|
||||||
|
menu: Valikko
|
||||||
|
divider: Jakaja
|
||||||
|
addItem: Lisää kohde
|
||||||
|
relays: Releet
|
||||||
|
addRelay: Lisää rele
|
||||||
|
inboxUrl: Saavuneen postin URL
|
||||||
|
addedRelays: Lisätyt releet
|
||||||
|
serviceworkerInfo: Pitää ottaa käyttöön Push-notifikaatioissa.
|
||||||
|
deletedNote: Poistetut viestit
|
||||||
|
disablePlayer: Sulje videotoistin
|
||||||
|
expandTweet: Laajenna twiittiä
|
||||||
|
themeEditor: Teemaeditori
|
||||||
|
leaveConfirm: Tallentamattomia muutoksia olemassa. Hylätäänkö ne?
|
||||||
|
plugins: Liitännäiset
|
||||||
|
preferencesBackups: Asetusten varmuuskopiot
|
||||||
|
deck: Kansi
|
||||||
|
undeck: Jätä kansi
|
||||||
|
useBlurEffectForModal: Käytä blur-efektiä modaaleissa
|
||||||
|
useFullReactionPicker: Käytä täysikokoista reaktiovalitsinta
|
||||||
|
width: Leveys
|
||||||
|
generateAccessToken: Luo käyttöoikeustunniste
|
||||||
|
enableAll: Ota käyttöön kaikki
|
||||||
|
disableAll: Poista käytöstä kaikki
|
||||||
|
tokenRequested: Myönnä oikeus tiliin
|
||||||
|
notificationType: Ilmoituksen tyyppi
|
||||||
|
edit: Muokkaa
|
||||||
|
emailServer: Sähköpostipalvelin
|
||||||
|
enableEmail: Ota sähköpostin jakelu käyttöön
|
||||||
|
emailConfigInfo: Käytetään vahvistamaan sähköpostiosoitteesi rekisteröitymisen yhteydessä
|
||||||
|
tai jos unohdat salasanasi
|
||||||
|
email: Sähköposti
|
||||||
|
smtpHost: Isäntä
|
||||||
|
smtpUser: Käyttäjänimi
|
||||||
|
smtpPass: Salasana
|
||||||
|
emptyToDisableSmtpAuth: Jätä käyttäjänimi ja salasana tyhjäksi ohittaaksesi SMTP verifioinnin
|
||||||
|
smtpSecureInfo: Kytke tämä päältä kun käytät STARTTLS
|
||||||
|
testEmail: Kokeile email-lähetystä
|
||||||
|
wordMute: Sanan hiljennys
|
||||||
|
regexpError: Säännöllinen lausekevirhe
|
||||||
|
userSaysSomething: '{name} sanoi jotakin'
|
||||||
|
userSaysSomethingReason: '{name} sanoi {reason}'
|
||||||
|
makeActive: Aktivoi
|
||||||
|
display: Näyttö
|
||||||
|
copy: Kopioi
|
||||||
|
metrics: Mittarit
|
||||||
|
overview: Yleiskatsaus
|
||||||
|
logs: Lokit
|
||||||
|
delayed: Viivästynyt
|
||||||
|
database: Tietokanta
|
||||||
|
channel: Kanavat
|
||||||
|
notificationSetting: Ilmoitusasetukset
|
||||||
|
notificationSettingDesc: Valitse näytettävät ilmoitustyypit.
|
||||||
|
useGlobalSetting: Käytä globaaleja asetuksia
|
||||||
|
regenerateLoginToken: Luo kirjautumistunniste uudelleen
|
||||||
|
sample: Näyte
|
||||||
|
abuseReports: Raportit
|
||||||
|
reportAbuse: Raportti
|
||||||
|
reportAbuseOf: Raportti {name}
|
||||||
|
fillAbuseReportDescription: Täytä tätä raporttia koskevat tiedot. Jos se koskee tiettyä
|
||||||
|
viestiä, ilmoita sen URL-linkki.
|
||||||
|
abuseReported: Raporttisi on lähetetty. Kiitoksia paljon.
|
||||||
|
reporter: Raportoija
|
||||||
|
reporteeOrigin: Ilmoittajan alkuperä
|
||||||
|
reporterOrigin: Raportoijan alkuperä
|
||||||
|
forwardReport: Välitä raportti etäinstanssille
|
||||||
|
forwardReportIsAnonymous: Tilisi sijasta anonyymi järjestelmätili näytetään toimittajana
|
||||||
|
etäinstanssissa.
|
||||||
|
send: Lähetä
|
||||||
|
abuseMarkAsResolved: Merkitse raportti ratkaistuksi
|
||||||
|
openInNewTab: Avaa uuteen välilehteen
|
||||||
|
openInSideView: Avaa sivunäkymään
|
||||||
|
defaultNavigationBehaviour: Navigoinnin oletuskäyttäytyminen
|
||||||
|
editTheseSettingsMayBreakAccount: Näiden asetusten muuttaminen voi vahingoittaa tiliäsi.
|
||||||
|
desktop: Työpöytä
|
||||||
|
clip: Leike
|
||||||
|
optional: Vaihtoehtoinen
|
||||||
|
createNewClip: Luo uusi leike
|
||||||
|
unclip: Poista leike
|
||||||
|
confirmToUnclipAlreadyClippedNote: Tämä viesti on jo osa "{name}"-leikettä. Haluatko
|
||||||
|
sen sijaan poistaa sen tästä leikkeestä?
|
||||||
|
manageAccessTokens: Hallitse käyttöoikeuskoodeja
|
||||||
|
accountInfo: Tilin tiedot
|
||||||
|
notesCount: Viestien määrä
|
||||||
|
renotesCount: Lähetettyjen buustausten määrä
|
||||||
|
repliedCount: Saatujen vastausten määrä
|
||||||
|
sentReactionsCount: Lähetettyjen reaktioiden määrä
|
||||||
|
receivedReactionsCount: Saatujen reaktioiden määrä
|
||||||
|
pollVotesCount: Lähetettyjen kyselyäänien määrä
|
||||||
|
pollVotedCount: Saatujen kyselyäänien määrä
|
||||||
|
yes: Kyllä
|
||||||
|
no: Ei
|
||||||
|
driveFilesCount: Tiedostojen määrä asemalla
|
||||||
|
driveUsage: Aseman tilankäyttö
|
||||||
|
noCrawle: Hylkää hakukoneindeksointi
|
||||||
|
noCrawleDescription: Pyydä hakukoneita olemaan indeksoimatta profiilisivuasi, viestejäsi,
|
||||||
|
sivujasi jne.
|
||||||
|
alwaysMarkSensitive: Merkitse oletusarvoisesti herkäksi sisällöksi (NSFW)
|
||||||
|
loadRawImages: Alkuperäisten kuvien lataaminen pikkukuvien näyttämisen sijaan
|
||||||
|
disableShowingAnimatedImages: Älä näytä animoituja kuvia
|
||||||
|
verificationEmailSent: Vahvistussähköposti on lähetetty. Seuraa mukana olevaa linkkiä
|
||||||
|
suorittaaksesi vahvistuksen loppuun.
|
||||||
|
emailVerified: Sähköposti on vahvistettu
|
||||||
|
noteFavoritesCount: Kirjanmerkittyjen viestien määrä
|
||||||
|
pageLikedCount: Saatujen Sivu-tykkäysten määrä
|
||||||
|
pageLikesCount: Sivut-tykkäysten määrä
|
||||||
|
contact: Yhteystieto
|
||||||
|
useSystemFont: Käytä järjestelmän oletuskirjasinta
|
||||||
|
clips: Leikkeet
|
||||||
|
experimentalFeatures: Kokeiluluontoiset ominaisuudet
|
||||||
|
developer: Kehittäjä
|
||||||
|
makeExplorable: Tee tili näkyväksi osiossa "Tutustu"
|
||||||
|
makeExplorableDescription: Jos otat tämän pois käytöstä, tilisi ei näy "Tutustu"-osiossa.
|
||||||
|
showGapBetweenNotesInTimeline: Näytä väli viestien välissä aikajanalla
|
||||||
|
duplicate: Monista
|
||||||
|
left: Vasen
|
||||||
|
center: Keskellä
|
||||||
|
wide: Leveä
|
||||||
|
narrow: Kapea
|
||||||
|
reloadToApplySetting: Asetus otetaan käyttöön vain uudelleenladattaessa. Ladataanko
|
||||||
|
uudelleen nyt?
|
||||||
|
showTitlebar: Näytä otsikkorivi
|
||||||
|
clearCache: Tyhjennä välimuisti
|
||||||
|
onlineUsersCount: '{n} käyttäjää online-tilassa'
|
||||||
|
myTheme: Minun teemani
|
||||||
|
value: Arvo
|
||||||
|
saveConfirm: Tallenna muutokset?
|
||||||
|
deleteConfirm: Poistetaanko tosiaan?
|
||||||
|
latestVersion: Uusin versio
|
||||||
|
newVersionOfClientAvailable: Asiakasohjelmiston uudempi versio saatavilla.
|
||||||
|
usageAmount: Käyttö
|
||||||
|
inUse: Käytetty
|
||||||
|
editCode: Muokkaa koodia
|
||||||
|
apply: Käytä
|
||||||
|
receiveAnnouncementFromInstance: Vastaanota ilmoituksia tästä instanssista
|
||||||
|
emailNotification: Sähköposti-ilmoitukset
|
||||||
|
publish: Julkaise
|
||||||
|
inChannelSearch: Etsi kanavalta
|
||||||
|
useReactionPickerForContextMenu: Avaa reaktiovalitsin napsauttamalla oikeaa
|
||||||
|
typingUsers: '{users} kirjoittaa'
|
||||||
|
jumpToSpecifiedDate: Hyppää tiettyyn päivään
|
||||||
|
markAllAsRead: Merkitse kaikki luetuksi
|
||||||
|
goBack: Takaisin
|
||||||
|
unlikeConfirm: Poistatko todella tykkäyksesi?
|
||||||
|
fullView: Täysi koko
|
||||||
|
quitFullView: Poistu täydestä koosta
|
||||||
|
addDescription: Lisää kuvaus
|
||||||
|
markAsReadAllTalkMessages: Merkitse kaikki yksityisviestit luetuiksi
|
||||||
|
appearance: Ulkonäkö
|
||||||
|
messagingWithGroup: Ryhmäjuttelu
|
||||||
|
newPasswordIs: Uusi salasana on "{password}"
|
||||||
|
noFollowRequests: Sinulla ei ole odottavia seuraajapyyntöjä
|
||||||
|
objectStoragePrefixDesc: Tiedostot tallennetaan hakemistoihin tällä etuliitteellä.
|
||||||
|
objectStorageEndpointDesc: Jätä tämä tyhjäksi, jos käytät AWS S3:a. Muuten määritä
|
||||||
|
päätepisteeksi '<host>' tai '<host>:<port>' käyttämästäsi palvelusta riippuen.
|
||||||
|
unableToProcess: Toimenpidettä ei voida suorittaa loppuun
|
||||||
|
installedDate: Hyväksynyt
|
||||||
|
lastUsedDate: Viimeksi käytetty
|
||||||
|
pluginTokenRequestedDescription: Tämä litännäinen voi käyttää tässä asetettuja käyttöoikeuksia.
|
||||||
|
permission: Oikeudet
|
||||||
|
smtpConfig: Lähtevän sähköpostin palvelimen (SMTP) asetukset
|
||||||
|
regexpErrorDescription: 'Säännöllisessä lausekkeessa tapahtui virhe rivillä {line}
|
||||||
|
sanan {tab} sanan mykistäminen rivillä {line}:'
|
||||||
|
emailAddress: Sähköpostiosoite
|
||||||
|
smtpSecure: Käytä implisiittistä SSL/TLS:ää SMTP-yhteyksissä
|
||||||
|
useGlobalSettingDesc: Jos se on päällä, käytetään tilisi ilmoitusasetuksia. Jos se
|
||||||
|
on pois päältä, voit tehdä yksilöllisiä asetuksia.
|
||||||
|
public: Julkinen
|
||||||
|
i18nInfo: Vapaaehtoiset kääntävät Iceshrimpta eri kielille. Voit auttaa osoitteessa
|
||||||
|
{link}.
|
||||||
|
lockedAccountInfo: Ellet aseta postauksen näkyvyydeksi "Vain seuraajille", postauksesi
|
||||||
|
näkyvät kaikille, vaikka vaatisitkin seuraajilta manuaalista hyväksyntää.
|
||||||
|
sendErrorReportsDescription: "Kun tämä on päällä, yksityiskohtaiset virhetiedot jaetaan
|
||||||
|
Iceshrimpn kanssa ongelman ilmetessä, mikä auttaa parantamaan Iceshrimpn laatua.\n
|
||||||
|
Näihin tietoihin sisältyy esimerkiksi käyttöjärjestelmäversio, käyttämäsi selain,
|
||||||
|
toimintasi Iceshrimpssä jne."
|
||||||
|
createdAt: Luotu
|
||||||
|
youAreRunningUpToDateClient: Käytössäsi on asiakasohjelman uusin versio.
|
||||||
|
needReloadToApply: Uudelleenlataus vaaditaan, jotta tämä näkyy.
|
||||||
|
showingPastTimeline: Näytetään parhaillaan vanhaa aikajanaa
|
||||||
|
userPagePinTip: Voit näyttää viestit täällä valitsemalla yksittäisten viestien valikosta
|
||||||
|
"Kiinnitä profiiliin".
|
||||||
|
notSpecifiedMentionWarning: Tämä viesti sisältää mainintoja käyttäjistä, joita ei
|
||||||
|
ole mainittu vastaanottajina
|
||||||
|
name: Nimi
|
||||||
|
allowedInstances: Sallitut (allowlisted) instanssit
|
||||||
|
hashtags: Aihetunnisteet
|
||||||
|
troubleshooting: Vianetsintä
|
||||||
|
received: Vastaanotettu
|
||||||
|
searchResult: Hakutulokset
|
||||||
|
filter: Suodatin
|
||||||
|
antennas: Antennit
|
||||||
|
noMaintainerInformationWarning: Ylläpitäjän tietoja ei ole konfiguroitu.
|
||||||
|
controlPanel: Hallintapaneeli
|
||||||
|
manageAccounts: Hallitse tilejä
|
||||||
|
makeReactionsPublic: Aseta reaktiohistoria julkiseksi
|
||||||
|
unread: Lukematon
|
||||||
|
deleted: Poistettu
|
||||||
|
editNote: Muokkaa viestiä
|
||||||
|
edited: 'Muokattu klo {date} {time}'
|
||||||
|
avoidMultiCaptchaConfirm: Useiden Captcha-järjestelmien käyttö voi aiheuttaa häiriöitä
|
||||||
|
niiden välillä. Haluatko poistaa käytöstä muut tällä hetkellä käytössä olevat Captcha-järjestelmät?
|
||||||
|
Jos haluat, että ne pysyvät käytössä, paina peruutusnäppäintä.
|
||||||
|
manageAntennas: Hallitse antenneja
|
||||||
|
info: Tietoja
|
||||||
|
userInfo: Käyttäjätiedot
|
||||||
|
unknown: Tuntematon
|
||||||
|
onlineStatus: Online-tila
|
||||||
|
hideOnlineStatus: Piilota Online-tila
|
||||||
|
hideOnlineStatusDescription: Online-tilasi piilottaminen vähentää joidenkin toimintojen,
|
||||||
|
kuten haun, käyttömukavuutta.
|
||||||
|
online: Online
|
||||||
|
active: Aktiivinen
|
||||||
|
offline: Offline
|
||||||
|
botProtection: Botti-suojaus
|
||||||
|
instanceBlocking: Federaatio Esto/Hiljennys
|
||||||
|
enabled: Otettu käyttöön
|
||||||
|
quickAction: Pikatoiminnot
|
||||||
|
user: Käyttäjä
|
||||||
|
accounts: Tilit
|
||||||
|
switch: Vaihda
|
||||||
|
noBotProtectionWarning: Botti-suojausta ei ole konfiguroitu.
|
||||||
|
configure: Konfiguroi
|
||||||
|
postToGallery: Luo uusi galleriaviesti
|
||||||
|
gallery: Galleria
|
||||||
|
recentPosts: Viimeaikaiset sivut
|
||||||
|
popularPosts: Suositut sivut
|
||||||
|
ads: Mainokset
|
||||||
|
expiration: Aikaraja
|
||||||
|
memo: Muistio
|
||||||
|
priority: Prioriteetti
|
||||||
|
high: Korkea
|
||||||
|
middle: Keskitaso
|
||||||
|
low: Alhainen
|
||||||
|
emailNotConfiguredWarning: Sähköpostiosoitetta ei ole asetettu.
|
||||||
|
ratio: Suhde
|
||||||
|
secureMode: Suojattu moodi (Valtuutettu nouto)
|
||||||
|
instanceSecurity: Instanssiturvallisuus
|
||||||
|
allowedInstancesDescription: Federaatiota varten sallitulle listalle (allowlisted)
|
||||||
|
otettavien instanssien isännät, kukin erotettuna uudella rivillä (sovelletaan vain
|
||||||
|
yksityisessä tilassa).
|
||||||
|
previewNoteText: Näytä esikatselu
|
||||||
|
customCss: Kustomoitu CSS
|
||||||
|
customCssWarn: Tätä asetusta tulisi käyttää vain, jos tiedät, mitä se tekee. Vääränlaisten
|
||||||
|
arvojen syöttäminen voi aiheuttaa sen, että asiakasohjelma lakkaa toimimasta normaalisti.
|
||||||
|
recommended: Suositeltu
|
||||||
|
squareAvatars: Näytä neliön malliset kuvakkeet
|
||||||
|
seperateRenoteQuote: Erilliset buustaa ja lainaa -napit
|
||||||
|
sent: Lähetetty
|
||||||
|
useBlurEffect: Käytä blur-efektejä käyttöliittymässä
|
||||||
|
iceshrimpUpdated: Iceshrimp on päivitetty!
|
||||||
|
whatIsNew: Näytä muutokset
|
||||||
|
translate: Käännä
|
||||||
|
translatedFrom: Käännetty kielestä {x}
|
||||||
|
accountDeletionInProgress: Tilin poistaminen on parhaillaan menossa
|
||||||
|
usernameInfo: Nimi, joka erottaa tilisi muista tällä palvelimella olevista tileistä. Voit
|
||||||
|
käyttää aakkosia (a~z, A~Z), numeroita (0~9) tai alaviivoja (_). Käyttäjätunnuksia
|
||||||
|
ei voi muuttaa myöhemmin.
|
||||||
|
aiChanMode: Ai-chan klassisessa käyttöliittymässä
|
||||||
|
keepCw: Pidä sisältövaroitukset
|
||||||
|
pubSub: Pub/Sub tilit
|
||||||
|
lastCommunication: Viimeisin kommunikaatio
|
||||||
|
unresolved: Ratkaisematon
|
||||||
|
breakFollow: Poista seuraaja
|
||||||
|
breakFollowConfirm: Oletko varma, että haluat poistaa seuraajan?
|
||||||
|
itsOn: Otettu käyttöön
|
||||||
|
itsOff: Poistettu käytöstä
|
||||||
|
emailRequiredForSignup: Vaadi sähköpostiosoitetta sisäänkirjautumiseen
|
||||||
|
makeReactionsPublicDescription: Tämä laittaa viimeisimmät reaktiosi julkisesti näkyväksi.
|
||||||
|
classic: Klassinen
|
||||||
|
muteThread: Mykistä lanka
|
||||||
|
unmuteThread: Poista langan mykistys
|
||||||
|
ffVisibility: Seurataan/Seurattavien näkyvyys
|
||||||
|
notRecommended: Ei suositeltu
|
||||||
|
disabled: Poistettu käytöstä
|
||||||
|
selectAccount: Valitse tili
|
||||||
|
switchAccount: Vaihda tili
|
||||||
|
administration: Hallinta
|
||||||
|
shareWithNote: Jaa viestin kanssa
|
||||||
|
secureModeInfo: Kun pyydät muista instansseista, älä lähetä takaisin ilman todisteita.
|
||||||
|
privateMode: Yksityinen moodi
|
||||||
|
privateModeInfo: Kun tämä on käytössä, vain sallittujen (allowlisted) luetteloon merkityt
|
||||||
|
instanssit voivat liittyä instansseihisi. Kaikki viestit piilotetaan yleisöltä.
|
||||||
|
global: Globaali
|
||||||
|
resolved: Ratkaistu
|
||||||
|
learnMore: Opi lisää
|
||||||
|
continueThread: Jatka lankaa
|
||||||
|
file: Tiedosto
|
||||||
|
cropImageAsk: Haluatko rajata tätä kuvaa?
|
||||||
|
recentNHours: Viimeiset {n} tuntia
|
||||||
|
rateLimitExceeded: Nopeusraja ylittynyt
|
||||||
|
cropImage: Rajaa kuvaa
|
||||||
|
socialTimeline: Sosiaalinen aikajana
|
||||||
|
themeColor: Instanssi Ticker Väri
|
||||||
|
check: Tarkista
|
||||||
|
ffVisibilityDescription: Antaa sinun konfiguroida, kuka voi nähdä ketä seuraat ja
|
||||||
|
kuka seuraa sinua.
|
||||||
|
homeTimeline: Koti aikajana
|
||||||
|
size: Koko
|
||||||
|
showLocalPosts: 'Näytä paikalliset viestit:'
|
||||||
|
oneDay: Päivä
|
||||||
|
instanceDefaultDarkTheme: Instanssikattava tumma oletusteema
|
||||||
|
recentNDays: Viimeiset {n} päivää
|
||||||
|
reflectMayTakeTime: Voi kestää jonkin aikaa, ennen kuin tämä näkyy.
|
||||||
|
failedToFetchAccountInformation: Ei voitu hakea tietoja
|
||||||
|
requireAdminForView: Sinun tulee kirjautua järjestelmänvalvojana nähdäksesi tämän.
|
||||||
|
driveCapOverrideCaption: Resetoi oletusarvoon syöttämällä arvo 0 tai alempi.
|
||||||
|
isSystemAccount: Järjestelmän luoma ja automaattisesti käyttämä tili.
|
||||||
|
userSaysSomethingReasonReply: '{name} vastasi viestiin sisältäen {reason}'
|
||||||
|
userSaysSomethingReasonRenote: '{name} buustasi viestiin sisältäen {reason}'
|
||||||
|
voteConfirm: Vahvista äänesi vaihtoehdolle "{choice}"?
|
||||||
|
hide: Piilota
|
||||||
|
leaveGroup: Poistu ryhmästä
|
||||||
|
leaveGroupConfirm: Oletko varma, että haluat poistua ryhmästä "{name}"?
|
||||||
|
clickToFinishEmailVerification: Klikkaa [{ok}] viimeistelläksesi sähköpostivahvistuksen.
|
||||||
|
overridedDeviceKind: Laitetyyppi
|
||||||
|
tablet: Tabletti
|
||||||
|
numberOfColumn: Sarakkeiden määrä
|
||||||
|
searchByGoogle: Etsi
|
||||||
|
mutePeriod: Vaiennuksen kesto
|
||||||
|
indefinitely: Pysyvästi
|
||||||
|
tenMinutes: 10 minuuttia
|
||||||
|
oneHour: Tunti
|
||||||
|
thereIsUnresolvedAbuseReportWarning: On ratkaisemattomia raportteja.
|
||||||
|
driveCapOverrideLabel: Muuta aseman kapasiteetti tälle käyttäjälle
|
||||||
|
userSaysSomethingReasonQuote: '{name} lainasi viestiä sisältäen {reason}'
|
||||||
|
deleteAccountConfirm: Tämä peruuttamattomasti poistaa tilisi. Jatketaanko?
|
||||||
|
incorrectPassword: Väärä salasana.
|
||||||
|
useDrawerReactionPickerForMobile: Näytä reaktiovalitsin mobiilissa laatikkomallisena
|
||||||
|
smartphone: Älypuhelin
|
||||||
|
auto: Automaattinen
|
||||||
|
oneWeek: Viikko
|
||||||
|
instanceDefaultLightTheme: Instanssin kattava vaalea oletusteema
|
||||||
|
instanceDefaultThemeDescription: Anna teemakoodi objektiformaatille.
|
||||||
|
noEmailServerWarning: Sähköpostipalvelinta ei konfiguroituna.
|
||||||
|
bite: Puraise
|
||||||
|
bitYourNote: puraisi postaustasi
|
||||||
|
_sensitiveMediaDetection:
|
||||||
|
description: Pienentää moderaatiovaateita tunnistamalla mediasensitiivisyyttä koneoppimista
|
||||||
|
käyttäen. Tämä kasvattaa serverin vaatimaa suorituskykyä hieman.
|
||||||
|
sensitivity: Tunnistussensitiivisyys
|
||||||
|
sensitivityDescription: Sensitiivisyyden pienennys aiheuttaa vähemmän väärintunnistuksia
|
||||||
|
ja kasvatus aiheuttaa vähemmän tunnistamattajättöä.
|
||||||
|
setSensitiveFlagAutomatically: Merkkaa sensitiiviseksi
|
||||||
|
biteBack: Puraise takaisin
|
||||||
|
bitYou: puraisi sinua
|
||||||
|
bitYouBack: puraisi sinua takaisin
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
_lang_: "Filipino"
|
||||||
|
monthAndDay: '{month}/{day}'
|
||||||
|
noThankYou: Hindi, salamat
|
||||||
|
you: Ikaw
|
||||||
|
yearX: '{year}'
|
||||||
|
language: Wika
|
||||||
|
latestVersion: Pinakabagong bersiyon
|
||||||
|
textColor: Kulay ng teksto
|
||||||
|
_weekday:
|
||||||
|
monday: Lunes
|
||||||
|
tuesday: Martes
|
||||||
|
wednesday: Miyerkules
|
||||||
|
thursday: Huwebes
|
||||||
|
friday: Biyernes
|
||||||
|
saturday: Sabado
|
||||||
|
_widgets:
|
||||||
|
notifications: Mga Abiso
|
||||||
|
clock: Orasan
|
||||||
|
calendar: Kalendaryo
|
||||||
|
notifications: Mga Abiso
|
||||||
|
currentVersion: Kasalukuyang bersiyon
|
||||||
|
_tutorial:
|
||||||
|
step1_1: Maligayang pagdating!
|
||||||
|
_mfm:
|
||||||
|
url: URL
|
||||||
|
monthX: '{month}'
|
||||||
+2321
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,17 @@
|
|||||||
|
_lang_: Inglés
|
||||||
|
introIceshrimp: Benvida! Iceshrimp é unha plataforma de medios sociais de código aberto,
|
||||||
|
descentralizada e gratuíta para sempre!🚀
|
||||||
|
monthAndDay: '{day}/{month}'
|
||||||
|
notifications: Notificacións
|
||||||
|
password: Contrasinal
|
||||||
|
forgotPassword: Esquecín o contrasinal
|
||||||
|
gotIt: Vale!
|
||||||
|
cancel: Cancelar
|
||||||
|
noThankYou: Non, grazas
|
||||||
|
headlineIceshrimp: Plataforma de medios sociais de código aberto e descentralizada,
|
||||||
|
gratuíta para sempre!🚀
|
||||||
|
search: Buscar
|
||||||
|
searchPlaceholder: Buscar en Iceshrimp
|
||||||
|
username: Identificador
|
||||||
|
fetchingAsApObject: Descargando desde o Fediverso
|
||||||
|
ok: OK
|
||||||
+1791
File diff suppressed because it is too large
Load Diff
Vendored
+3
@@ -0,0 +1,3 @@
|
|||||||
|
declare const locales: { [lang: string]: any };
|
||||||
|
|
||||||
|
export = locales;
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user