实现 S2S 和 C2S 协议的现代 ActivityPub 兼容服务器。
项目描述
Epicyon,意思是“不仅仅是一条狗”。20-500 万年前生活在北美的最大的食蚁兽科。
Epicyon 是现代ActivityPub兼容服务器,实现 S2S 和 C2S 协议,适合安装在单板计算机上。它包括审核工具、帖子过期、内容警告、图像描述、新闻提要和针对对手的外围防御等功能。它不包含 javascript,并使用带有 Python 后端的 HTML+CSS。
矩阵室:#epicyon:matrix.freedombone.net
包括由OpenMoji设计的表情符号——开源表情符号和图标项目。许可证:CC BY-SA 4.0。Blob Cat Emoji 和 Meowmoji 由 Nitro Blob Hub 制作,在Apache 2.0下获得许可。Digital Pets 表情符号由 Tomcat94 制作并在 CC0 下获得许可。
包依赖
您将需要 python 版本 3.7 或更高版本。
在拱门/抛物线:
sudo pacman -S tor python-pip python-pysocks python-cryptography \
imagemagick python-requests \
perl-image-exiftool python-dateutil \
certbot flake8 bandit
sudo pip3 install pyqrcode pypng
或者在 Debian 上:
sudo apt install -y \
tor python3-socks imagemagick \
python3-setuptools \
python3-cryptography \
python3-dateutil \
python3-idna python3-requests \
python3-django-timezone-field \
libimage-exiftool-perl python3-flake8 \
python3-pyqrcode python3-png python3-bandit \
certbot nginx wget
安装
在最常见的情况下,您将使用 systemd 设置一个守护进程来运行服务器。
以下说明将 Epicyon 安装到/opt目录。它不必安装在那里,它可以在任何其他首选目录中。
添加一个专用用户,这样我们就不必以 root 身份运行。
adduser --system --home=/opt/epicyon --group epicyon
链接新闻镜像:
mkdir /var/www/YOUR_DOMAIN
mkdir -p /opt/epicyon/accounts/newsmirror
ln -s /opt/epicyon/accounts/newsmirror /var/www/YOUR_DOMAIN/newsmirror
编辑/etc/systemd/system/epicyon.service并添加以下内容:
[Unit]
Description=epicyon
After=syslog.target
After=network.target
[Service]
Type=simple
User=epicyon
Group=epicyon
WorkingDirectory=/opt/epicyon
ExecStart=/usr/bin/python3 /opt/epicyon/epicyon.py --port 443 --proxy 7156 --domain YOUR_DOMAIN --registration open
Environment=USER=epicyon
Environment=PYTHONUNBUFFERED=true
Restart=always
StandardError=syslog
[Install]
WantedBy=multi-user.target
此处服务器安装到/opt/epicyon,但您可以将其更改为安装它的任何位置。
然后运行守护进程:
systemctl enable epicyon
chown -R epicyon:epicyon /opt/epicyon
systemctl start epicyon
使用以下命令检查守护程序的状态:
systemctl status epicyon
如果它没有运行,那么您还可以查看日志:
journalctl -u epicyon
您还需要设置 Web 服务器配置。对于 Nginx 编辑/etc/nginx/sites-available/YOUR_DOMAIN如下:
server {
listen 80;
listen [::]:80;
server_name YOUR_DOMAIN;
access_log /dev/null;
error_log /dev/null;
client_max_body_size 31m;
client_body_buffer_size 128k;
index index.html;
rewrite ^ https://$server_name$request_uri? permanent;
}
server {
listen 443 ssl;
server_name YOUR_DOMAIN;
ssl_stapling off;
ssl_stapling_verify off;
ssl on;
ssl_certificate /etc/letsencrypt/live/YOUR_DOMAIN/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/YOUR_DOMAIN/privkey.pem;
#ssl_dhparam /etc/ssl/certs/YOUR_DOMAIN.dhparam;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_session_timeout 60m;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive";
add_header Strict-Transport-Security max-age=15768000;
access_log /dev/null;
error_log /dev/null;
index index.html;
location /newsmirror {
root /var/www/YOUR_DOMAIN;
try_files $uri =404;
}
location / {
proxy_http_version 1.1;
client_max_body_size 31M;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forward-Proto http;
proxy_set_header X-Nginx-Proxy true;
proxy_temp_file_write_size 64k;
proxy_connect_timeout 10080s;
proxy_send_timeout 10080;
proxy_read_timeout 10080;
proxy_buffer_size 64k;
proxy_buffers 16 32k;
proxy_busy_buffers_size 64k;
proxy_redirect off;
proxy_request_buffering on;
proxy_buffering on;
proxy_pass http://localhost:7156;
}
}
根据需要更改您的域名。激活配置:
ln -s /etc/nginx/sites-available/YOUR_DOMAIN /etc/nginx/sites-enabled/
生成 LetsEncrypt 证书。
certbot certonly -n --server https://acme-v02.api.letsencrypt.org/directory --standalone -d YOUR_DOMAIN --renew-by-default --agree-tos --email YOUR_EMAIL
并重新启动 Web 服务器:
systemctl restart nginx
如果您使用的是Caddy Web 服务器,请参阅caddy.example.conf
运行静态分析
静态分析可以运行:
./static_analysis
运行安全审计
要运行安全审核:
./security_audit
请注意,并非所有已确定的问题都必然与该项目相关。将其输出视为可能可以调查但通常结果不相关的事物的列表。
在 Onion 或 i2p 域上安装
如果您无法访问 clearnet,或者不想使用它,那么可以从您的笔记本电脑轻松运行 Epicyon 实例。目录中有一些脚本deploy可用于在 Debian 或 Arch/Parabola 操作系统上安装实例。通过对包名称进行一些修改,它们也可以与其他发行版一起使用。
请注意,此类安装不会与 clearnet 上的普通 fediverse 实例联合,除非这些实例经过特殊修改。但是洋葱实例将与其他洋葱实例和 i2p 实例与其他 i2p 实例联合。
自定义字体
如果要使用特定字体,请将其复制到字体目录中,将其重命名为custom.ttf/woff/woff2/otf,然后重新启动 epicyon 守护进程。
systemctl restart epicyon
自定义网站图标
如果您想使用自己的 favicon,请将您的favicon.ico文件复制到安装 Epicyon 的基本目录。
改变主题
更改主题时,您可能需要确保清除 nginx 缓存 (/var/www/cache/*) 并清除站点的本地浏览器缓存 (Shift + Reload)。否则可能会保留上一个主题的图像和图标。
添加主题
如果要添加新主题,请先将主题名称添加到翻译文件中。
在theme目录中创建一个以您的主题名称命名的目录并添加图标和横幅。作为一种快速的开始方式,您可以复制 的内容theme/default,然后编辑图形。保持图像的大小尽可能小,以避免创建滞后的用户界面。
epicyon.css在正在运行的实例上,您可以通过编辑然后重新加载网页来试验颜色或字体。一旦您对结果感到满意,您就可以更新文件中更改的变量值theme/yourtheme/theme.json。
Epicyon 通常使用一组 CSS 文件,然后根据主题更改其变量。如果您想使用完全定制的 CSS,请复制epicyon-*.css到您的主题目录并根据您的要求对其进行编辑。这将被使用而不是默认的 CSS 文件。请注意,如果您自己维护 CSS 文件,那么您可能需要跟上上游发生的任何更改,否则您的用户界面将会中断。
运行单元测试
要运行单元测试:
python3 epicyon.py --tests
运行网络测试。这些模拟实例交换消息。
python3 epicyon.py --testsnetwork
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。