2019-07-04 20:50:46 +00:00
< img src = "https://code.freedombone.net/bashrc/epicyon/raw/master/img/logo.png?raw=true" width = 256/ >
2019-07-04 21:20:26 +00:00
A minimal ActivityPub server.
2019-06-28 18:55:29 +00:00
2019-08-29 12:00:30 +00:00
[W3C Specification ](https://www.w3.org/TR/activitypub ) - [Project Goals ](README_goals.md ) - [Commandline interface ](README_commandline.md ) - [Customizations ](README_customizations.md )
2019-06-29 10:08:59 +00:00
2019-08-29 11:09:16 +00:00
Includes emojis designed by [OpenMoji ](https://openmoji.org ) – the open-source emoji and icon project. License: [CC BY-SA 4.0 ](https://creativecommons.org/licenses/by-sa/4.0 )
2019-08-09 12:52:52 +00:00
2019-08-29 11:52:42 +00:00
## Package Dependencies
2019-06-28 18:55:29 +00:00
2019-07-13 13:39:52 +00:00
On Arch/Parabola:
2019-06-28 18:55:29 +00:00
``` bash
2019-08-29 11:57:16 +00:00
sudo pacman -S tor python-pip python-pysocks python-pycryptodome \
python-beautifulsoup4 imagemagick python-pillow \
python-numpy python-dateutil certbot
2019-07-02 17:11:59 +00:00
sudo pip install commentjson
2019-07-04 20:44:03 +00:00
```
2019-07-13 13:39:52 +00:00
Or on Debian:
``` bash
2019-08-29 11:57:16 +00:00
sudo apt-get -y install tor python3-pip python3-socks imagemagick \
python3-numpy python3-setuptools python3-crypto \
python3-dateutil python3-pil.imagetk certbot
2019-07-13 13:39:52 +00:00
sudo pip3 install commentjson beautifulsoup4 pycryptodome
```
2019-08-29 11:52:42 +00:00
## Installation
2019-07-04 20:44:03 +00:00
2019-08-29 11:37:31 +00:00
In the most common case you'll be using systemd to set up a daemon to run the server.
Add a dedicated user so that we don't have to run as root.
2019-07-04 20:44:03 +00:00
``` bash
2019-08-29 11:37:31 +00:00
adduser --system --home=/etc/epicyon --group epicyon
2019-07-04 20:44:03 +00:00
```
2019-08-29 11:37:31 +00:00
Edit */etc/systemd/system/epicyon.service* and add the following:
2019-07-04 20:44:03 +00:00
2019-08-29 11:53:52 +00:00
``` systemd
2019-08-29 11:37:31 +00:00
[Unit]
Description=epicyon
After=syslog.target
After=network.target
Documentation=$EPICYON_REPO";
[Service]
Type=simple
User=epicyon
Group=epicyon
WorkingDirectory=/etc/epicyon
ExecStart=/usr/bin/python3 /etc/epicyon/epicyon.py --port 443 --proxy 7156 --domain YOUR_DOMAIN --registration open --debug";
Environment=USER=epicyon
Restart=always
StandardError=syslog
[Install]
WantedBy=multi-user.target }
2019-07-04 20:44:03 +00:00
```
2019-07-04 21:32:18 +00:00
2019-08-29 11:37:31 +00:00
Here the server was installed to */etc/epicyon* , but you can change that to wherever you installed it.
2019-07-12 14:42:43 +00:00
2019-08-29 11:37:31 +00:00
Then run the daemon:
2019-07-04 21:32:18 +00:00
``` bash
2019-08-29 11:37:31 +00:00
systemctl enable epicyon
chown -R epicyon:epicyon /etc/epicyon
systemctl start epicyon
2019-07-04 21:32:18 +00:00
```
2019-08-29 11:37:31 +00:00
Check the status of the daemon with:
2019-07-04 21:32:18 +00:00
2019-08-29 11:37:31 +00:00
``` bash
systemctl status epicyon
2019-07-04 21:32:18 +00:00
```
2019-08-29 11:37:31 +00:00
If it's not running then you can also look at the log:
2019-07-04 21:32:18 +00:00
``` bash
2019-08-29 11:37:31 +00:00
journalctl -u epicyon
2019-07-04 21:32:18 +00:00
```
2019-08-29 11:52:42 +00:00
You'll also need to set up a web server configuration. For Nginx edit */etc/nginx/sites-available/YOUR_DOMAIN* as follows:
``` nginx
server {
listen 80;
listen [::]:80;
server_name YOUR_DOMAIN;
root /var/www/YOUR_DOMAIN/htdocs;
access_log /dev/null;
error_log /dev/null;
client_max_body_size 20m;
client_body_buffer_size 128k;
limit_conn conn_limit_per_ip 10;
limit_req zone=req_limit_per_ip burst=10 nodelay;
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;
root /var/www/YOUR_DOMAIN/htdocs;
index index.html;
location / {
proxy_http_version 1.1;
client_max_body_size 11M;
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 off;
proxy_buffering off;
proxy_pass http://localhost:7156;
}
}
```
Changing your domain name as appropriate. Active the configuration with:
``` bash
ln -s /etc/nginx/sites-available/YOUR_DOMAIN /etc/nginx/sites-enabled/
```
Generate a LetsEncrypt certificate.
``` bash
certbot certonly -n --server https://acme-v01.api.letsencrypt.org/directory --standalone -d YOUR_DOMAIN --renew-by-default --agree-tos --email YOUR_EMAIL
```
And restart the web server:
2019-07-04 21:32:18 +00:00
``` bash
2019-08-29 11:52:42 +00:00
systemctl restart nginx
2019-07-04 21:32:18 +00:00
```
2019-07-04 21:40:30 +00:00
2019-08-29 11:37:31 +00:00
## Object Capabilities Security
2019-07-17 12:31:10 +00:00
2019-08-29 11:37:31 +00:00
A description of the proposed object capabilities model [is here ](ocaps.md ).
2019-07-19 09:01:39 +00:00
2019-08-29 11:37:31 +00:00
## Running Unit Tests
2019-07-19 09:01:39 +00:00
2019-08-29 11:37:31 +00:00
To run the unit tests:
2019-07-19 09:01:39 +00:00
2019-08-29 11:37:31 +00:00
``` bash
python3 epicyon.py --tests
```
2019-07-23 22:00:17 +00:00
2019-08-29 11:37:31 +00:00
To run the network tests. These simulate instances exchanging messages.
2019-07-19 09:06:55 +00:00
2019-08-29 11:37:31 +00:00
``` bash
python3 epicyon.py --testsnetwork
```
2019-08-11 16:55:22 +00:00