mastodon媒体文件缓存非常占用硬盘空间,尤其是加入中续站以后。使用便宜vps搭建的mastodon实例难以承受庞大的媒体文件缓存需求。在决定使用s3存储服务商后对比了wasabi,idrive e2和backblaze b2后决定使用idrive e2.

价格:
idrive e2 : 0.004/GB/月, api不收费,免费下载流量是存储的3倍。对mastodon的来说完全足够。
wasabi : 6.99/1T/月, api免费, 免下载流量。,
backblaze : 0.005/GB/月, api B类和C类收费,下载流量0.01/GB,使用cloudflare后免流量。

开始使用:
注册地址:https://app.idrivee2.com/

1.在控制面版添加存储位置。建议添加离服务器近的位置。
添加位置

2.添加一个公共存储桶存储桶。
2023-08-02T10:56:31.png

3.设置公共访问权限,此时可能需要绑定手机号和有些才能下一步。
2023-08-02T11:10:19.png

4.给刚才建立的存储桶设置访问密钥。请把生成的账户密钥信息保存好。
2023-08-02T11:18:18.png

此时已经可以使用了。但是使用默认的公共访问地址并不优雅。我们在cloudflare设置CNAME.使用自定义域名访问文件。还能省下载流量以及防止被DDOS攻击。

1.复制你选用位置的S3 endpoint地址。
2023-08-02T11:39:26.png

2.在cloudflare设置一个CNAME。
Snipaste_2023-08-02_19-37-36.png
3.生成一个源证书,把公钥和私钥复制好。
2023-08-05T00:45:35.png
3.回到idrive控制面板设置CNAME。
2023-08-02T11:44:21.png
4.2023-08-05T00:57:35.png
此时应该已经添加完成了。在存储桶上传的文件可以通过 https://media.exampla.com/Buckets/* 这个路径访问了。

mastodon配置文件

S3_ENABLED =true
S3_BUCKET =Bucketname
S3_ENDPOINT =https://*
S3_PROTOCOL =https
S3_ALIAS_HOST =media.example.com/Bucketname
S3_HOSTNAME =media.example.com
S3_OPEN_TIMEOUT =10
S3_READ_TIMEOUT =10
AWS_ACCESS_KEY_ID =
AWS_SECRET_ACCESS_KEY =

如果域名被墙,在大陆无法正常访问时在另一台vps上设置一个备用域名供大陆用户正常使用。

首先需要一台IP在大陆能正常访问的vps.和一个域名。

nginx配置文件:
(请注意替换自己的域名,fedi.bar为主域名。cn.fedi.bar为备用域名)

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''            close;
}
map $http_origin $fedi_site_origin {
    default $http_origin;
    https://cn.fedi.bar https://fedi.bar;
}

map $http_referrer $fedi_site_referrer {
    default '';
    ~^https://cn.fedi.bar/(?<referrer_path>.*)$ https://fedi.bar/$referrer_path;
}
//更改缓存文件夹,此处为/data/cn.fedi.bar/
proxy_cache_path /data/cn.fedi.bar/ levels=1:2 keys_zone=fedi.bar:10m inactive=7d max_size=1g;
server {
    listen 80;
    listen 443 ssl http2;
    server_name fedi.bar cn.fedi.bar;
    if ($scheme = http) { return 301 https://$host$request_uri; }
    keepalive_timeout     70;
    sendfile              on;
    client_max_body_size 100m;

    gzip on;
    gzip_disable "msie6";
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    location / {
        try_files $uri @proxy;
    }
    
    location @proxy {
        proxy_ssl_server_name on;
        proxy_ssl_protocols TLSv1.2 TLSv1.3;
        proxy_ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
        proxy_redirect https://fedi.bar https://cn.fedi.bar;
        sub_filter 'https://fedi.bar' 'https://cn.fedi.bar';
        sub_filter '<a href="https://fedi.bar' '<a href="https://cn.fedi.bar';
        sub_filter 'https://fedi.bar/photos/' 'https://cn.fedi.bar/photos/';

        sub_filter_once off;
        proxy_set_header Accept-Encoding "";
        proxy_hide_header Alt-Svc;
        proxy_set_header Host $origin_domain;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header User-Agent $http_user_agent;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_hide_header Content-Security-Policy;
        proxy_set_header Origin $fedi_site_origin;
        proxy_set_header Referer $fedi_site_referrer;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Proxy "";
        proxy_pass_header Server;
        proxy_cookie_domain https://fedi.bar https://cn.fedi.bar;

        proxy_pass https://127.0.0.1:443;  //替换自己的主服务器的IP
        proxy_buffering on;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        proxy_cache fedi.bar;
        proxy_cache_valid 200 7d;
        proxy_cache_valid 410 24h;
        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
        add_header X-Cached $upstream_cache_status;
        add_header Strict-Transport-Security "max-age=31536000" always;
        
        tcp_nodelay on;
  }
    
    ssl_certificate /etc/letsencrypt/live/cn.fedi.bar/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/cn.fedi.bar/privkey.pem; # managed by Certbot

}

配置好ssl证书 nginx -s reload 即可。

1.安装 iptables-persistent

`apt install -y iptables-persistent`

2.按需编辑 /etc/iptables/rules.v4 文件添加规则。

    #  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
    
    #  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
  1. 重载规则iptables-restore < /etc/iptables/rules.v4

ipv6规则

#  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

#  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

在共享主机上搭建friendica入住联邦宇宙是最方便和省钱的办法。

前提

根据我的经验,在共享主机上部署friendica需要一些条件。

  1. 需要支持Mariadb数据库。mysql虽然能成功运行,后续升级会出错。
  2. 共享主机需要支持网页Terminal或者允许ssh连接操作。如果没有将无法成功安装
  3. 共享主机支持添加Cron后台计划任务。friendica的发帖更新,好友状态同步等都需要后台任务定时运行。

如果是基于cpanel的共享主机应该都能满足以上条件,购买前需要跟供应商客服联系确认。
本人使用RackNred的一年/15美元的共享主机运行良好,推荐单人或者几个人使用没有太大问题。

购买

选择一个合适的套餐,推荐硬盘大一点的。然后填写您的域名 点USE。进行下单付款。
1
成功购买后系统会给你邮箱发送共享IP,登录等信息。你需要把自己的域名指向这个共享IP地址或者直接把NS记录改成邮件里的地址。

开始部署:

1.创建用于friendica的数据库:
打开控制面板 选择mysql数据库。屏幕截图 2022-12-05 191104.png

创建数据库用户名 请记住密码。然后创建数据库。
11
向数据库添加用户并给对数据库操作权限。
12

2.下载friendica的最新版到网站根目录。
可以点这里下载到电脑然后通过文件管理器上传,然后解压。
屏幕截图_20230222_195948.png
也可以通过ssh连接通过命令下载。

cd /home/xxx/html_public/
git clone https://github.com/friendica/friendica.git -b stable

此时如果打开域名会提示 运行bin/composer.phar install --no-dev命令。
3.安装
首先确保网站根目录可写入。
连接ssh

cd /home/xxx/html_public/
bin/composer.phar install --no-dev

这样就开始安装完成。不过此时打开网页应该是500错误或者404.
4.配置
1.在config文件夹的local-sample.config.php文件改名为local.config.php
并配置您的数据库信息,网站基本信息。管理员邮箱等信息。请注意,邮箱必须可以收到邮件。您的登录信息系统通过邮件发送给您。
以下根据您的需要替换内容:

<?php

return [
    'database' => [
        'hostname' => 'localhost',
        'username' => '数据库用户名',
        'password' => '数据库密码',
        'database' => '数据库名',
        'charset' => 'utf8mb4',
    ],

    'config' => [
        'php_path' => '/usr/local/bin/php', //php目录
        'admin_email' => '邮箱',
        'sitename' => 'Friendica Social Network',
        'hostname' => '域名',
        'register_policy' => \Friendica\Module\Register::OPEN,
        'max_import_size' => 200000,
    ],
    'system' => [
        'urlpath' => '',
        'pidfile' => '',
        'url' => '域名',
        'ssl_policy' => 1,
        'basepath' => '网站根目录',
        'default_timezone' => 'Asia/Shanghai',
        'language' => 'zh-cn',
    ],
];

保存后退出。
此时如果顺利应该可以访问安装页面了。如果提示404,在网站根目录的.htaccess-dist文件改名为.htaccess就可以了。
会检测php扩展安装情况,如果没有安装在控制面板里安装相应的扩展。
注册时候一定要填写在config里的邮箱。不然管理面板进不去。

5.设置后台任务
在控制面板 Cron 里添加一个定时后台任务。它会定时执行帖子同步,联系人更新等任务。

/usr/local/bin/php /home/fedibar/public_html/bin/worker.php

2
到此安装过程基本完成了。

故障排查:

未写完