2023年1月

Send是非常好用的端到端加密的文件传送服务,界面简洁,非常好用。是Firefox Send停止维护后另有人接手开发的软件。
官方提供了docker-compose的配置文件和详细的教程。但是我本人部署过程中遇到了nginx-proxy和ssl证书配置出错的问题,所以自行配置了nginx相关的配置。

官方源码:[https://github.com/timvisee/send-docker-compose

我部署的过程:

  • 1 克隆到服务器 git clone https://github.com/timvisee/send-docker-compose && cd send-docker-compose
  • 2 运行cp .env.example .env和然后编辑.env文件

    
    #Host to expose Send on
    HOST=你的域名
    
    #Base URL for Send
    SEND_BASE_URL=你的域名
    
    #Optional: for LetsEncrypt SSL, same as HOST
    LETSENCRYPT_HOST=
    
    #Optional: for LetsEncrypt SSL, your email address
    LETSENCRYPT_EMAIL=
  • 3 编辑docker-compose.yaml文件,此处我没有使用nginx-proxy和ssl证书相关的配置。

    
    services:
      send:
        image: '${DOCKER_SEND_IMAGE}'
        restart: always
        ports:
          - '1234:1234'
        volumes:
          - ./uploads:/uploads
        environment:
          - VIRTUAL_HOST=${HOST}
          - VIRTUAL_PORT=1234
          - DHPARAM_GENERATION=false
          - LETSENCRYPT_HOST
          - LETSENCRYPT_EMAIL
          - NODE_ENV=production
          - BASE_URL=${SEND_BASE_URL}
          - PORT=1234
          - REDIS_HOST=redis
    
          #For local uploads storage
          - FILE_DIR=/uploads
    
          #For S3 object storage (disable volume and FILE_DIR variable)
          #- AWS_ACCESS_KEY_ID=
          #- AWS_SECRET_ACCESS_KEY=
          #- S3_BUCKET=
          #- S3_ENDPOINT=
    
          #To customize upload limits
          #- EXPIRE_TIMES_SECONDS=3600,86400,604800,2592000,31536000
          #- DEFAULT_EXPIRE_SECONDS=3600
          #- MAX_EXPIRE_SECONDS=31536000
          - DOWNLOAD_COUNTS=1,2,5,10,15,25,50,100
          - MAX_DOWNLOADS=100
          - MAX_FILE_SIZE=268435456
      
      redis:
        image: 'redis:alpine'
        restart: always
        volumes:
          - send-redis:/data
    
    volumes:
      send-redis:
      proxy-certs:
      proxy-vhost:
      proxy-html:
  • 4 自行配置nginx和ssl证书,我的nginx反代配置
server {
    listen      0.0.0.0:80;
    listen      0.0.0.0:443;
    server_name 你的域名;
    
    client_max_body_size 0;
    
    location /
{
    proxy_pass http://127.0.0.1:1234;
    proxy_set_header Host $host;
            # set headers to support websocket
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";

        set $upstream_app send;
        set $upstream_port 1234;
        set $upstream_proto http;
}

    ssl_certificate      /etc/letsencrypt/live/你的域名/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/你的域名/privkey.pem;
}

  • 5 运行docker-compose up -d等会打开你的域名就在运行了。

mastodon通过sidekiq处理通知、时间线、点赞和跟其他实例通讯的任务。当实例上的注册的人变多或者整个联邦宇宙交换的信息量变多时候sidekiq容易堵塞从而时间线会延迟。

解决办法是增加sidekiq进程和队列,默认是所有队列仅用一个sidekiq进程。
/etc/systemd/system/目录创建一个名为mastodon-sidekiq2.service的文件。
复制粘贴以下内容:

[Unit]
Description=mastodon-sid
After=network.target

[Service]
Type=simple
User=mastodon
WorkingDirectory=/home/mastodon/live
Environment="RAILS_ENV=production"
Environment="DB_POOL=20"
Environment="MALLOC_ARENA_MAX=2"
ExecStart=/home/mastodon/.rbenv/shims/bundle exec sidekiq -c 20 -q default -q pull -q ingress
TimeoutSec=15
Restart=always

[Install]
WantedBy=multi-user.target

保存后运行
systemctl daemon-reload 重载systemd配置。
然后启动
systemctl start mastodon-sidekiq2
之后在mastodon后台里看到多一个有default,pull,ingress线程的sidekiq进程。
当然也可以单独拆分队列。但是线程总数量不能超过PostgreSQL数据库的最大连接数。并且保证只有一个scheduler进程。

friendica非常依赖worker进程来完成跟其他实例通讯,清理数据库,联系人同步等其他任务。
它可以通过cron计划任务定时工作,也可以通过守护进程进行完成。设置好守护进程可以立即发送任务,而不是等几分钟cron计划任务开始工作。

假设,系统是Ubuntu20.04 friendica的安装目录是/var/www/fedibar/

按照官方提供的教程运行 cd /var/www/fedibar/ php bin/daemon.php start时它会在 /run 目录创建一个PID。friendica会使用config/local.config.php文件system 下的pidfile目录配置。

'system' > [
     ...
  'pidfile' => '/run/friendica/daemon.pid',
     ...
  ],

我们将设置 systemd 以www-data用户身份运行该进程。但是只有root权在该/run目录中。所以我们创建一个 Friendica 指定的拥有www-data的子目录。当然可以手动创建,但是重启就消失。因此我们通过/etc/tmpfiles.d中的配置文件来执行此操作。首先通过命令在该目录创建 friendica.conf

sudo nano /etc/tmpfiles.d/friendica.conf

复制粘贴以下文件

d /run/friendica 0755 www-data www-data -

保存退出,这就systemd 可以通过www-data 用户组操作/run/friendica 的文件了。

如果现在执行

cd /var/www/fedibar/ php bin/daemon.php start

你会看到类似 信息

Starting worker daemon.
Child process started with pid 1276.

如果不是,您可能在config/local.config.php文件的 pidfile 目录填写错误了。
如果没有问题现在可以创建systemd文件了。

sudo nano /etc/systemd/system/friendica-daemon.service

复制粘贴以下文件

[Unit]
Description=Friendica daemon
After=network.target mariadb.service
Requires=network.target remote-fs.target nss-lookup.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/fedibar
Type=simple
StandardOutput=null
StandardError=syslog
ExecStart=/usr/bin/php ./bin/daemon.php start
ExecStop=/usr/bin/php ./bin/daemon.php stop
PIDFile=friendica/daemon.pid
PrivateTmp=true
InaccessibleDirectories=/home /root /boot /opt /mnt /media
ReadOnlyDirectories=/etc /usr
Restart=always

[Install]
WantedBy=multi-user.target

请注意,如果您使用的是MySQL 那第二行改成

After=network.target mysql.service

还有注意检查 WorkingDirectory 这是你安装friendica的目录。
确认没有问题后重新加载systemd配置

sudo systemctl daemon-reload

然后可以通过systemd启动守护进程了

sudo systemctl start friendica-daemon.service

检查状态

systemctl status friendica-daemon.service 

开机自动启动

systemctl enable friendica-daemon.service

搞定!