Skip to content

Mastodon S3同步工具 [zh]

一个用于同步Mastodon S3对象的工具。

本文档由 ChatGPT 翻译自英文文档

用途

知识

Mastodon在S3存储中有四种类型的文件夹:media_attachmentsaccountscustom_emojispreview_cards。对于每一种类型,数据库中都有一个表来存储文件名、文件内容类型以及文件远程URL(如果文件被从远程缓存)。

在这个程序中,首先我们从数据库读取所有记录,这些记录应该包含这四种类型的所有可用文件。然后从源S3存储下载它们,最后上传到目标S3存储。

我们为每种类型的文件提供了四个作业,您可以单独运行它们。每个作业从数据库中获取其类型的所有记录,并将每个记录添加到队列中作为任务。

配置

您可以使用环境变量定义配置文件路径,或者使用默认路径private/config.ini。配置文件模板是private/config.sample.ini。有一些需要解释的内容:

pg.tunnel

在大多数情况下,我们不应该将数据库暴露在公共网络中,所以我们使用ssh隧道连接到远程数据库。但是,如果您在同一远程服务器上运行此程序,则可能不需要此选项。如果使用隧道,则只需在pg.database.host中填写127.0.0.1(或任何其他私有网络地址),因为我们是通过ssh隧道到达数据库的。

celery.concurrency

我们使用内存缓存已下载的临时文件,任务完成后内存将被释放。根据Mastodon的默认媒体附件大小限制,每个任务(并发)最多使用150Mb内存,在我的个人用例中,平均需要53 Mb。您可以增加swap空间以使用更高的并发性并避免OOM。此外,您还应考虑网络带宽和CPU使用率。某些S3存储提供者有速率限制,您可能需要设置较低的并发性以避免被阻止。

Docker

要求:

  • docker>=20.10.16
  • docker-compose >= 2.6.0
#复制并编辑配置文件,默认配置文件位于
#private/config.docker.ini in docker-compose.yml
cp private/config.sample.ini private/config.docker.ini

#启动队列(默认web UI端口5555)
make du
#添加作业
make dj

#您也可以单独运行作业:
#(您可以在后台运行它们,请参见docker-compose.yml中的注释块)
docker compose exec celery sh -c 'python -m s3_sync.jobs.media_attachments'
docker compose exec celery sh -c 'python -m s3_sync.jobs.accounts'
docker compose exec celery sh -c 'python -m s3_sync.jobs.custom_emojis'
docker compose exec celery sh -c 'python -m s3_sync.jobs.preview_cards'

手动

要求:

  • python>=3.9
  • redis>=6
#创建虚拟环境
make virtualenv
# **运行上面打印的命令来激活虚拟环境**
#安装依赖项
make install
#复制并编辑配置文件
cp private/config.sample.ini private/config.ini
#我们使用三个进程运行下面的服务,您可能需要三个终端:
# 1. 启动队列
make celery
# 2. 启动web UI(默认端口5555)
make flower
# 3.添加作业
make jobs

# 3.如果您想分别运行作业:
python -m s3_sync.jobs.media_attachments
python -m s3_sync.jobs.accounts
python -m s3_sync.jobs.custom_emojis
python -m s3_sync.jobs.preview_cards

日志

我不是Celery队列库的专家。您可以通过Celery的Web UI-Flower获取其所有日志,Flower提供了Web界面和REST API以检查日志。

常见问题解答

怎样在同步被中断后继续同步?如何限制同步范围?

你可以使用 --limit 选项来限制同步记录的数量。例如,如果你想同步1000条记录,可以运行以下命令:

python -m s3_sync.jobs.media_attachments --limit 1000

如果你想在同步中断后继续同步,可以使用 --offset 选项来跳过前N条记录。例如,如果你想跳过前1000条记录并继续同步,可以运行以下命令:

python -m s3_sync.jobs.media_attachments --offset 1000

同时使用 --limit--offset 选项也是可以的。

开发

python -m s3_sync.jobs.media_attachments --dev --limit 10
python -m s3_sync.jobs.accounts --dev --limit 10
python -m s3_sync.jobs.custom_emojis --dev --limit 10
python -m s3_sync.jobs.preview_cards --dev --limit 10