Mastodon 网站可以单独运行。就像传统网站一样,人们在上面注册、发布消息、上传图片并相互交谈
什么是Mastodon?
与博客向网站发布更新的行为类似, 微博是将小更新发布到您个人资料上的更新流的行为。您可以发布文本帖子,并选择性地附加媒体,例如图片、音频、视频或投票。Mastodon 可让您关注朋友并发现新朋友。
什么是联合身份验证?
Federation 是去中心化的一种形式。不是所有人都使用的单个中央服务,而是任意数量的人都可以使用的多个服务。
集中化等级 | 例子 |
---|---|
集中 | 推特、脸书、Instagram |
联邦 | 电子邮件、XMPP、电话网络、物理邮件 |
分散式 | BitTorrent、IPFS、Scuttlebutt |
Mastodon 网站可以单独运行。就像传统网站一样,人们在上面注册、发布消息、上传图片并相互交谈。 与传统网站不同 ,Mastodon 网站可以互作,让用户相互交流;就像您可以从您的 Gmail 帐户向 Outlook、Fastmail、Protonmail 或任何其他电子邮件提供商的某人发送电子邮件一样,只要您知道他们的电子邮件地址, 您就可以使用他们的地址在任何网站上提及或向任何人发送消息 。
什么是 ActivityPub?
Mastodon 使用标准化的开放协议来实现联合。它称为 ActivityPub。任何同样通过 ActivityPub 实现联合的软件都可以与 Mastodon 无缝通信,就像 Mastodon 网站相互通信一样。
- fediverse (“联合宇宙”) 是可以通过 ActivityPub 和万维网相互通信的所有网站的名称。这包括所有 Mastodon 服务器,但也包括其他实现:
- Pleroma,一个模块化的微博引擎
- Pixelfed,联合图像共享平台,可让您共享和使用媒体帖子
- Misskey,其中包括微博和可定制的仪表板
- PeerTube,可让您将视频上传到频道
- Plume,允许您发布较长格式的文章还有更多,包括个人和个人网站!
- fediverse 没有自己的品牌,所以你可能更经常听到 “follow me on the Mastodon” 而不是 “follow me on the fediverse”,但从技术上讲,后者更正确。
实际意义
因为 Mastodon 只是一个可以用来驱动任何网站的软件,所以 Mastodon 的潜在用户可以选择从现有的 Mastodon 网站中选择服务提供商,或者如果他们愿意,可以创建自己的 Mastodon 网站。Mastodon 项目在 joinmastodon.org 上维护着一个推荐的服务提供商列表,可以按类别和/或语言排序。一些网站可能有超出此范围的审核政策,例如要求在潜在的敏感内容上使用某些标签,有些网站可能有更宽松的审核政策,但选择器中列出的网站都同意采用 Mastodon 服务器契约 ,这意味着他们承诺积极审核仇恨言论,每天进行备份, 至少有一名紧急管理员,并在关闭时至少提前 3 个月提供通知。
准备您的机器
如果要设置新计算机,建议您先保护它。假设您运行的是 Ubuntu 22.04:
禁止密码登录SSH(仅允许密钥登录)
首先,确保您实际上是使用密钥而不是密码登录服务器,否则,这将锁定您。许多托管服务提供商支持上传公钥,并在新计算机上自动为您设置基于密钥的 root 登录。
编辑 /etc/ssh/sshd_config 并找到 PasswordAuthentication。确保它未注释并设置为 no。如果您进行了任何更改,请重新启动 sshd:
安装 fail2ban 以阻止重复的登录尝试
首先,安装 fail2ban:
编辑 /etc/fail2ban/jail.local 并放入以下内容:
最后,重新启动 fail2ban:
安装防火墙,仅允许 SSH、HTTP 和 HTTPS 端口
首先,安装 iptables-persistent。在安装过程中,它会询问您是否要保留当前规则 – decline。
编辑 /etc/iptables/rules.v4 并放入以下内容:
使用 iptables-persistent,该配置将在启动时加载。但是由于我们现在没有重启,因此我们需要第一次手动加载它:
如果您的服务器也可以通过 IPv6 访问,请编辑 /etc/iptables/rules.v6 并在其中添加以下内容:
iptables-persistent 将在机器启动时自动加载配置。但是由于我们现在不会立刻重启,我们需要第一次手动加载它:
禁止密码登录SSH(仅允许密钥登录)
首先,确保您实际上是使用密钥而不是密码登录服务器,否则,这将锁定您。许多托管服务提供商支持上传公钥,并在新计算机上自动为您设置基于密钥的 root 登录。
编辑 /etc/ssh/sshd_config 并找到 PasswordAuthentication。确保它未注释并设置为 no。如果您进行了任何更改,请重新启动 sshd:
XML:
systemctl restart ssh.service
更新系统软件包
XML:
apt update && apt upgrade -y
安装 fail2ban 以阻止重复的登录尝试
首先,安装 fail2ban:
Bash:
apt install fail2ban
编辑 /etc/fail2ban/jail.local 并放入以下内容:
Bash:
[DEFAULT]
destemail = [email protected]
sendername = Fail2Ban
[sshd]
enabled = true
port = 22
mode = aggressive
最后,重新启动 fail2ban:
Bash:
systemctl restart fail2ban
安装防火墙,仅允许 SSH、HTTP 和 HTTPS 端口
首先,安装 iptables-persistent。在安装过程中,它会询问您是否要保留当前规则 – decline。
代码:
apt install -y iptables-persistent
编辑 /etc/iptables/rules.v4 并放入以下内容:
代码:
*filter
# Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
# Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT
# Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
# (optional) Allow HTTP/3 connections from anywhere.
-A INPUT -p udp --dport 443 -j ACCEPT
# Allow SSH connections
# The -dport number should be the same port number you set in sshd_config
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# Allow destination unreachable messages, especially code 4 (fragmentation required) is required or PMTUD breaks
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT
# Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
# Reject all other inbound - default deny unless explicitly allowed policy
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT
使用 iptables-persistent,该配置将在启动时加载。但是由于我们现在没有重启,因此我们需要第一次手动加载它:
代码:
iptables-restore < /etc/iptables/rules.v4
如果您的服务器也可以通过 IPv6 访问,请编辑 /etc/iptables/rules.v6 并在其中添加以下内容:
代码:
*filter
# Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d ::1/128 -j REJECT
# Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT
# Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
# (optional) Allow HTTP/3 connections from anywhere.
-A INPUT -p udp --dport 443 -j ACCEPT
# Allow SSH connections
# The -dport number should be the same port number you set in sshd_config
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
# Allow ping
-A INPUT -p icmpv6 -j ACCEPT
# Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
# Reject all other inbound - default deny unless explicitly allowed policy
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT
iptables-persistent 将在机器启动时自动加载配置。但是由于我们现在不会立刻重启,我们需要第一次手动加载它:
代码:
iptables-restore < /etc/iptables/rules.v4
从源中安装
前提条件
- 一台你有root访问权限的运行 Ubuntu 18.04 的机器
- 一个用于Mastodon站点的域名(或一个子域名),例如:example.com
- 一个电子邮件发送服务提供商,或其他SMTP服务器
软件仓库
首先确保已经安装curl:
Node.js
代码:
curl -sL https://deb.nodesource.com/setup_12.x | bash -
yam
代码:
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
软件包
代码:
apt update
apt install -y \
imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file git-core \
g++ libprotobuf-dev protobuf-compiler pkg-config nodejs gcc autoconf \
bison build-essential libssl-dev libyaml-dev libreadline6-dev \
zlib1g-dev libncurses5-dev libffi-dev libgdbm5 libgdbm-dev \
nginx redis-server redis-tools postgresql postgresql-contrib \
certbot python-certbot-nginx yarn libidn11-dev libicu-dev libjemalloc-dev
安装 Ruby
因为使用 rbenv 可以更容易的获得正确的版本并在新版本发布后进行更新,我们将使用 rbenv 来管理Ruby版本。rbenv 必须安装在单个Linux用户中,因此,我们首先需要使用以下命令创建一个Mastodon用户:
代码:
adduser --disabled-login mastodon
切换到mastodon用户:
代码:
su - mastodon
执行以下步骤安装 rbenv 和 rbenv-build:
代码:
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
cd ~/.rbenv && src/configure && make -C src
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec bash
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
上述操作完成,我们便可以安装正确的 Ruby 版本:
代码:
RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 2.6.6
rbenv global 2.6.6
我们同样需要安装 bundler:
代码:
gem install bundler --no-document
返回root用户:
代码:
exit
配置
配置 PostgreSQL
性能调优(可选)
为了优化性能,你可以使用 pgTune 生成一个合适的配置文件。编辑 /etc/postgresql/9.6/main/postgresql.conf 中的相应数值并使用 systemctl restart postgresql 命令重启 PostgreSQL。创建帐户
你需创建一个供Mastodon使用的PostgreSQL帐户。创建一个使用“ident”认证方式的帐户是最容易的配置方法,即PostgreSQL帐户不需要独立的密码并由同名Linux用户使用。打开控制台:
代码:
sudo -u postgres psql
在控制台中执行:
代码:
CREATE USER mastodon CREATEDB;
\q
完成!
配置 Mastodon
现在该下载Mastodon代码了。切换至mastodon用户:su - mastodon
检出代码
使用git下载最新稳定版Mastodon:
代码:
git clone https://github.com/mastodon/mastodon.git live && cd live
git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)
安装依赖
现在,安装Ruby和JavaScript依赖:
代码:
bundle config deployment 'true'
bundle config without 'development test'
bundle install -j$(getconf _NPROCESSORS_ONLN)
yarn install --pure-lockfile
两个bundle config命令仅仅第一次安装依赖时需要。如果你之后进行升级或重安装依赖,只需要bundle install就够了。
生成配置文件
运行交互式安装向导:RAILS_ENV=production bundle exec rake mastodon:setup
它将:
- 创建一个配置文件
- 预编译静态文件
- 创建数据库schema
你已经完成需使用mastodon用户进行的操作,请切换回root用户:
exit
配置 nginx
从Mastodon目录复制配置文件模版到nginx:
代码:
cp /home/mastodon/live/dist/nginx.conf /etc/nginx/sites-available/mastodon
ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/mastodon
编辑 /etc/nginx/sites-available/mastodon
- 替换 example.com 为你自己的域名
- 启用 ssl_certificate 和 ssl_certificate_key 这两行,并把它们替换成如下两行(如果你使用自己的证书的话则可以忽略这一步)
代码:
ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
- 你还可以根据自己的需求做出其它的一些调整。
获取SSL证书
我们将使用 Let’s Encrypt 获取一个免费的SSL证书:certbot --nginx -d example.com
这个命令将获取一个证书,自动更新 /etc/nginx/sites-available/mastodon 以使用新证书并重载nginx以使变更生效。
现在你应该能够通过浏览器访问你的域名,然后看到一只大象锤击电脑屏幕的错误页面。这是因为我们还没有启动Mastodon进程。
配置 systemd 服务
从Mastodon目录复制systemd服务模版:cp /home/mastodon/live/dist/mastodon-*.service /etc/systemd/system/
然后修改以下文件,以保证用户名与路径是正确的:
- /etc/systemd/system/mastodon-web.service
- /etc/systemd/system/mastodon-sidekiq.service
- /etc/systemd/system/mastodon-streaming.service
代码:
systemctl daemon-reload
systemctl start mastodon-web mastodon-sidekiq mastodon-streaming
systemctl enable mastodon-*
他们将在开机启动时自动开始运行。
设置你的环境
Mastodon使用环境变量作为其的配置。
为了方便起见,Mastodon从Mastodon目录中的 .env.production 文件读取环境变量,但是始终可以用特定方式覆盖它们。例如:在 systemd service 文件中可以使用 EnvironmentFile 从特定文件中读取环境变量或使用 Environment 定义环境变量,因此你可以为不同服务指定不同的环境变量。也可以在从命令行调用运行Mastodon时指定环境变量。
这可以阻止被屏蔽的域名拉取你的公开嘟文,但代价是可能增加计算量,并与不支持附带签名的拉取请求的软件不兼容(如低于3.0版本的Mastodon)。
请注意:这个模式并不能保证你的公开嘟文(public、unlisted)不被恶意操作者获取,这仅仅是增加了一点难度。
当一个现存实例站点切换至白名单模式,以下命令可以被用来移除非白名单站点的数据:
请注意:虽然Mastodon 3.0 版本便引入了白名单模式 WHITELIST_MODE,但在Mastodon 3.0和3.0.1版中并没有正确实现。
为了方便起见,Mastodon从Mastodon目录中的 .env.production 文件读取环境变量,但是始终可以用特定方式覆盖它们。例如:在 systemd service 文件中可以使用 EnvironmentFile 从特定文件中读取环境变量或使用 Environment 定义环境变量,因此你可以为不同服务指定不同的环境变量。也可以在从命令行调用运行Mastodon时指定环境变量。
基本参数
站点互联
- LOCAL_DOMAIN
- WEB_DOMAIN
- ALTERNATE_DOMAINS
AUTHORIZED_FETCH
当设置为 true 时,Mastodon将停止内联签名活动,并要求远程服务器在拉取公开(public)和不公开(unlisted)的嘟文时进行身份验证。这可以阻止被屏蔽的域名拉取你的公开嘟文,但代价是可能增加计算量,并与不支持附带签名的拉取请求的软件不兼容(如低于3.0版本的Mastodon)。
请注意:这个模式并不能保证你的公开嘟文(public、unlisted)不被恶意操作者获取,这仅仅是增加了一点难度。
WHITELIST_MODE
当设置为 true 时,Mastodon将仅与白名单内的服务器互联,同时关闭公开页面和一些客户端API。 白名单模式会启用 authorized fetch 模式。当一个现存实例站点切换至白名单模式,以下命令可以被用来移除非白名单站点的数据:
tootctl domain purge --whitelist-mode
请注意:虽然Mastodon 3.0 版本便引入了白名单模式 WHITELIST_MODE,但在Mastodon 3.0和3.0.1版中并没有正确实现。
密钥
- SECRET_KEY_BASE
- OTP_SECRET
- VAPID_PRIVATE_KEY
- VAPID_PUBLIC_KEY
部署
- RAILS_ENV
- RAILS_SERVE_STATIC_FILES
- RAILS_LOG_LEVEL
- TRUSTED_PROXY_IP
- SOCKET
- PORT
- NODE_ENV
- BIND
缩放选项
- WEB_CONCURRENCY
- MAX_THREADS
- PREPARED_STATEMENTS
- STREAMING_API_BASE_URL
- STREAMING_CLUSTER_NUM
数据库连接
PostgreSQL
- DB_HOST
- DB_USER
- DB_NAME
- DB_PASS
- DB_PORT
- DB_SSLMODE
- DATABASE_URL
Redis
- REDIS_HOST
- REDIS_PORT
- REDIS_URL
- REDIS_NAMESPACE
- CACHE_REDIS_HOST
- CACHE_REDIS_PORT
- CACHE_REDIS_URL
- CACHE_REDIS_NAMESPACE
Elasticsearch
- ES_ENABLED
- ES_HOST
- ES_PORT
- ES_PREFIX
StatsD
- STATSD_ADDR
- STATSD_NAMESPACE
限制
- SINGLE_USER_MODE
- EMAIL_DOMAIN_WHITELIST
- DEFAULT_LOCALE
- MAX_SESSION_ACTIVATIONS
- USER_ACTIVE_DAYS
电子邮件
- SMTP_SERVER
- SMTP_PORT
- SMTP_LOGIN
- SMTP_PASSWORD
- SMTP_FROM_ADDRESS
- SMTP_DOMAIN
- SMTP_DELIVERY_METHOD
- SMTP_AUTH_METHOD
- SMTP_CA_FILE
- SMTP_OPENSSL_VERIFY_MODE
- SMTP_ENABLE_STARTTLS_AUTO
- SMTP_TLS
文件存储
- CDN_HOST
- S3_ALIAS_HOST
本地文件存储
- PAPERCLIP_ROOT_PATH
- PAPERCLIP_ROOT_URL
Amazon S3 及其兼容存储
- S3_ENABLED
- S3_BUCKET
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- S3_REGION
- S3_PROTOCOL
- S3_HOSTNAME
- S3_ENDPOINT
- S3_SIGNATURE_VERSION
- S3_BATCH_DELETE_LIMIT
- S3_BATCH_DELETE_RETRY
Swift
- SWIFT_ENABLED
- SWIFT_USERNAME
- SWIFT_TENANT
- SWIFT_PASSWORD
- SWIFT_PROJECT_ID
- SWIFT_AUTH_URL
- SWIFT_CONTAINER
- SWIFT_OBJECT_URL
- SWIFT_REGION
- SWIFT_DOMAIN_NAME
- SWIFT_CACHE_TTL
外部认证
- OAUTH_REDIRECT_AT_SIGN_IN
LDAP
- LDAP_ENABLED
- LDAP_HOST
- LDAP_PORT
- LDAP_METHOD
- LDAP_BASE
- LDAP_BIND_DN
- LDAP_PASSWORD
- LDAP_UID
- LDAP_SEARCH_FILTER
PAM
- PAM_ENABLED
- PAM_EMAIL_DOMAIN
- PAM_DEFAULT_SERVICE
- PAM_CONTROLLED_SERVICE
CAS
- CAS_ENABLED
- CAS_URL
- CAS_HOST
- CAS_PORT
- CAS_SSL
- CAS_VALIDATE_URL
- CAS_CALLBACK_URL
- CAS_LOGOUT_URL
- CAS_LOGIN_URL
- CAS_UID_FIELD
- CAS_CA_PATH
- CAS_DISABLE_SSL_VERIFICATION
- CAS_UID_KEY
- CAS_NAME_KEY
- CAS_EMAIL_KEY
- CAS_NICKNAME_KEY
- CAS_FIRST_NAME_KEY
- CAS_LAST_NAME_KEY
- CAS_LOCATION_KEY
- CAS_IMAGE_KEY
- CAS_PHONE_KEY
SAML
- SAML_ENABLED
- SAML_ACS_URL
- SAML_ISSUER
- SAML_IDP_SSO_TARGET_URL
- SAML_IDP_CERT
- SAML_IDP_CERT_FINGERPRINT
- SAML_NAME_IDENTIFIER_FORMAT
- SAML_CERT
- SAML_PRIVATE_KEY
- SAML_SECURITY_WANT_ASSERTION_SIGNED
- SAML_SECURITY_WANT_ASSERTION_ENCRYPTED
- SAML_SECURITY_ASSUME_EMAIL_IS_VERIFIED
- SAML_ATTRIBUTES_STATEMENTS_UID
- SAML_ATTRIBUTES_STATEMENTS_EMAIL
- SAML_ATTRIBUTES_STATEMENTS_FULL_NAME
- SAML_ATTRIBUTES_STATEMENTS_FIRST_NAME
- SAML_ATTRIBUTES_STATEMENTS_LAST_NAME
- SAML_UID_ATTRIBUTE
- SAML_ATTRIBUTES_STATEMENTS_VERIFIED
- SAML_ATTRIBUTES_STATEMENTS_VERIFIED_EMAIL
隐藏服务
- http_proxy
- ALLOW_ACCESS_TO_HIDDEN_SERVICE
其它
- SKIP_POST_DEPLOYMENT_MIGRATIONS
配置全文搜索
设置 Elasticsearch 以搜索状态(authored、favorites 或 mentioned)、公有可索引状态和帐户
当 Elasticsearch 可用时,Mastodon 支持全文搜索。强烈建议配置此功能。
Mastodon 的全文搜索允许登录用户从以下位置查找结果:
将官方 Elasticsearch 仓库添加到 apt:
现在您可以安装 Elasticsearch:
启动Elasticsearch:
编辑.env.production添加以下变量:
Note :如果使用TLS,请使用https://预留主机名。例如:https://elastic.example.com。
要配置它,请参考<SD1>官方文档。它将指导您:
例如(请调整此片段以使用弹性管理密码):
用于创建角色的 Elasticsearch 文档
创建角色后,你可以创建一个用户供 Mastodon 服务器使用,并为其分配角色。
例如(请调整此代码段以使用您的 Elastic 管理员密码,并自定义您的新用户 mastodon 用户密码):
用于创建用户的 Elasticsearch 文档
完成此作后,你需要配置 Mastodon 以使用新创建的用户的凭据。
在 .env.production 中,调整您的配置
一切就绪,您的 Elasticsearch 服务器应该会更加安全!
保存新配置后,重新启动 Mastodon 进程以使其生效:
标准分析仪是Elasticsearch的默认设备,但是对于某些语言,例如中文可能不是最佳选择。为了增强搜索体验,请考虑安装特定语言的分析仪。在Elasticsearch创建索引之前,请确保安装以下扩展名:
然后修改Mastodon的索引定义如下:
当 Elasticsearch 可用时,Mastodon 支持全文搜索。强烈建议配置此功能。
Mastodon 的全文搜索允许登录用户从以下位置查找结果:
- 选择显示在搜索结果中的账户的公开状态
- 他们自己的状态
- 他们的提及
- 他们的最爱
- 他们的书签
- 帐户(显示名称、用户名和 BIOS)
安装 Elasticsearch
将官方 Elasticsearch 仓库添加到 apt:
代码:
wget -O /usr/share/keyrings/elasticsearch.asc https://artifacts.elastic.co/GPG-KEY-elasticsearch
echo "deb [signed-by=/usr/share/keyrings/elasticsearch.asc] https://artifacts.elastic.co/packages/7.x/apt stable main" > /etc/apt/sources.list.d/elastic-7.x.list
现在您可以安装 Elasticsearch:
代码:
apt update
apt install elasticsearch
启动Elasticsearch:
代码:
systemctl daemon-reload
systemctl enable --now elasticsearch
配置 Mastodon
编辑.env.production添加以下变量:
代码:
ES_ENABLED=true
ES_HOST=localhost
ES_PORT=9200
ES_PRESET= # single_node_cluster, small_cluster or large_cluster
# ES_USER=
# ES_PASS=
Note :如果使用TLS,请使用https://预留主机名。例如:https://elastic.example.com。
选择正确的预设
ES_PRESET取决于您的elasticsearch的大小,并将用于设置索引的碎片和副本的数量,以使您的设置为最佳值:- single_node_cluster如果您的elasticsearch群集中只有一个节点。索引将被配置而没有任何副本
- small_cluster如果群集中的节点少于6个节点。索引将配置为1个复制品
- large_cluster如果群集中有6个或更多节点。与small_cluster设置相比,索引将配置更多的碎片,以允许它们通过更多节点分布
安全
默认情况下,Elasticsearch不处理任何身份验证,并且每个请求均通过完整的管理权制定。我们强烈建议您在群集上配置Elasticsearch安全功能。要配置它,请参考<SD1>官方文档。它将指导您:
- 启用安全功能(xpack.security.enabled: true)
- 为内置用户创建密码
例如(请调整此片段以使用弹性管理密码):
代码:
curl -X POST -u elastic:admin_password "localhost:9200/_security/role/mastodon_full_access?pretty" -H 'Content-Type: application/json' -d'
{
"cluster": ["monitor"],
"indices": [{
"names": ["*"],
"privileges": ["read", "monitor", "write", "manage"]
}]
}
'
用于创建角色的 Elasticsearch 文档
创建角色后,你可以创建一个用户供 Mastodon 服务器使用,并为其分配角色。
例如(请调整此代码段以使用您的 Elastic 管理员密码,并自定义您的新用户 mastodon 用户密码):
代码:
curl -X POST -u elastic:admin_password "localhost:9200/_security/user/mastodon?pretty" -H 'Content-Type: application/json' -d'
{
"password" : "l0ng-r4nd0m-p@ssw0rd",
"roles" : ["mastodon_full_access"]
}
'
用于创建用户的 Elasticsearch 文档
完成此作后,你需要配置 Mastodon 以使用新创建的用户的凭据。
在 .env.production 中,调整您的配置
代码:
ES_USER=mastodon
ES_PASS=l0ng-r4nd0m-p@ssw0rd
一切就绪,您的 Elasticsearch 服务器应该会更加安全!
填充索引
保存新配置后,重新启动 Mastodon 进程以使其生效:
代码:
su - mastodon
cd live
RAILS_ENV=production bin/tootctl search deploy
其他语言的搜索优化
中文搜索优化
标准分析仪是Elasticsearch的默认设备,但是对于某些语言,例如中文可能不是最佳选择。为了增强搜索体验,请考虑安装特定语言的分析仪。在Elasticsearch创建索引之前,请确保安装以下扩展名:
然后修改Mastodon的索引定义如下:
Git:
diff --git a/app/chewy/accounts_index.rb b/app/chewy/accounts_index.rb
--- a/app/chewy/accounts_index.rb
+++ b/app/chewy/accounts_index.rb
@@ -4,7 +4,7 @@ class AccountsIndex < Chewy::Index
settings index: { refresh_interval: '5m' }, analysis: {
analyzer: {
content: {
- tokenizer: 'whitespace',
+ tokenizer: 'ik_max_word',
filter: %w(lowercase asciifolding cjk_width),
},
diff --git a/app/chewy/statuses_index.rb b/app/chewy/statuses_index.rb
--- a/app/chewy/statuses_index.rb
+++ b/app/chewy/statuses_index.rb
@@ -16,9 +16,17 @@ class StatusesIndex < Chewy::Index
language: 'possessive_english',
},
},
+ char_filter: {
+ tsconvert: {
+ type: 'stconvert',
+ keep_both: false,
+ delimiter: '#',
+ convert_type: 't2s',
+ },
+ },
analyzer: {
content: {
- tokenizer: 'uax_url_email',
+ tokenizer: 'ik_max_word',
filter: %w(
english_possessive_stemmer
lowercase
@@ -27,6 +35,7 @@ class StatusesIndex < Chewy::Index
english_stop
english_stemmer
),
+ char_filter: %w(tsconvert),
},
},
}
diff --git a/app/chewy/tags_index.rb b/app/chewy/tags_index.rb
--- a/app/chewy/tags_index.rb
+++ b/app/chewy/tags_index.rb
@@ -2,10 +2,19 @@
class TagsIndex < Chewy::Index
settings index: { refresh_interval: '15m' }, analysis: {
+ char_filter: {
+ tsconvert: {
+ type: 'stconvert',
+ keep_both: false,
+ delimiter: '#',
+ convert_type: 't2s',
+ },
+ },
analyzer: {
content: {
- tokenizer: 'keyword',
+ tokenizer: 'ik_max_word',
filter: %w(lowercase asciifolding cjk_width),
+ char_filter: %w(tsconvert),
},
edge_ngram: {