Modern ActivityPub compliant server, designed for simplicity and accessibility. Includes calendar, news and sharing economy features to empower your federated community. We spent a year testing this for a hyper local indymedia codebase.
 
 
 
 
 
Go to file
Bob Mottram 9874130bd8 Less line length 2019-08-29 12:57:16 +01:00
emoji We don't really need national flags, or nationalism 2019-08-26 09:13:36 +01:00
img Change colors 2019-08-28 15:19:41 +01:00
LICENSE Initial 2019-06-28 19:55:29 +01:00
Makefile Run test in its own subdirectory 2019-08-09 10:46:33 +01:00
README.md Less line length 2019-08-29 12:57:16 +01:00
README_commandline.md Commandline readme 2019-08-29 11:09:16 +00:00
README_customizations.md Separate customizations information 2019-08-29 11:23:58 +00:00
README_goals.md Link to goals 2019-08-29 11:16:33 +00:00
acceptreject.py @context headers 2019-08-18 12:07:06 +01:00
announce.py Preferred name becomes display name - less ambiguous 2019-08-22 19:36:07 +01:00
auth.py Reduce some line lengths 2019-07-06 18:00:22 +01:00
availability.py Preferred name becomes display name - less ambiguous 2019-08-22 19:36:07 +01:00
blocking.py Preferred name becomes display name - less ambiguous 2019-08-22 19:36:07 +01:00
blurhash.py Functions for image attachments 2019-07-12 20:08:46 +01:00
cache.py Check for presence of cache directory 2019-08-20 22:26:24 +01:00
capabilities.py Check for no actor 2019-08-18 21:43:10 +01:00
code-of-conduct.md Add CoC 2019-07-04 22:52:39 +01:00
config.py Configuration file functions 2019-07-05 10:20:54 +01:00
content.py s 2019-08-21 13:29:30 +01:00
daemon.py Max number of skills results 2019-08-28 11:11:06 +01:00
default_about.txt About screen 2019-08-26 17:02:47 +01:00
default_tos.txt Not all emojis 2019-08-19 14:56:47 +01:00
delete.py Preferred name becomes display name - less ambiguous 2019-08-22 19:36:07 +01:00
epicyon-follow.css Follow style 2019-08-28 16:45:37 +01:00
epicyon-login.css Login screen style for mobile 2019-08-27 15:34:27 +01:00
epicyon-profile.css Different page icon size for mobile 2019-08-28 13:11:50 +01:00
epicyon-suspended.css Submit button spacing 2019-08-13 11:04:18 +01:00
epicyon.py Optionally limit skills searches to the instance 2019-08-28 10:59:19 +01:00
filters.py Use not 2019-07-14 22:00:33 +01:00
follow.py Check if already a follower 2019-08-26 23:38:09 +01:00
httpsig.py Tidying 2019-08-23 12:39:16 +01:00
inbox.py Application activity 2019-08-23 21:09:00 +01:00
like.py Preferred name becomes display name - less ambiguous 2019-08-22 19:36:07 +01:00
manualapprove.py Ensure that followers are updated when accepting follow request 2019-08-26 23:22:01 +01:00
media.py Ensure port numbers are attached when needed 2019-08-16 21:35:11 +01:00
ocaps.md Separate ocaps document 2019-07-19 10:06:55 +01:00
person.py Instance actor url 2019-08-26 16:20:14 +01:00
posts.py with 2019-08-26 18:44:21 +01:00
roles.py Preferred name becomes display name - less ambiguous 2019-08-22 19:36:07 +01:00
session.py Set user agent for commands 2019-08-26 15:08:41 +01:00
shares.py Shared inbox actor on @domain@domain 2019-08-23 14:47:29 +01:00
skills.py Preferred name becomes display name - less ambiguous 2019-08-22 19:36:07 +01:00
tests.py Optionally limit skills searches to the instance 2019-08-28 10:59:19 +01:00
threads.py Move tests to their own file 2019-06-30 21:14:03 +01:00
utils.py Timeline for DMs 2019-08-25 17:09:56 +01:00
webfinger.py Instance actor url 2019-08-26 16:20:14 +01:00
webinterface.py Embedded videos appear inside of cw 2019-08-29 09:49:22 +01:00

README.md

A minimal ActivityPub server.

Commandline interface.

W3C Specification

Includes emojis designed by OpenMoji the open-source emoji and icon project. License: CC BY-SA 4.0

Project Goals

Customizations

Package Dependencies

On Arch/Parabola:

sudo pacman -S tor python-pip python-pysocks python-pycryptodome \
               python-beautifulsoup4 imagemagick python-pillow \
	       python-numpy python-dateutil certbot
sudo pip install commentjson

Or on Debian:

sudo apt-get -y install tor python3-pip python3-socks imagemagick \
                python3-numpy python3-setuptools python3-crypto \
		python3-dateutil python3-pil.imagetk certbot
sudo pip3 install commentjson beautifulsoup4 pycryptodome

Installation

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.

adduser --system --home=/etc/epicyon --group epicyon

Edit /etc/systemd/system/epicyon.service and add the following:

[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 }

Here the server was installed to /etc/epicyon, but you can change that to wherever you installed it.

Then run the daemon:

systemctl enable epicyon
chown -R epicyon:epicyon /etc/epicyon
systemctl start epicyon

Check the status of the daemon with:

systemctl status epicyon

If it's not running then you can also look at the log:

journalctl -u epicyon

You'll also need to set up a web server configuration. For Nginx edit /etc/nginx/sites-available/YOUR_DOMAIN as follows:

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:

ln -s /etc/nginx/sites-available/YOUR_DOMAIN /etc/nginx/sites-enabled/

Generate a LetsEncrypt certificate.

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:

systemctl restart nginx

Object Capabilities Security

A description of the proposed object capabilities model is here.

Running Unit Tests

To run the unit tests:

python3 epicyon.py --tests

To run the network tests. These simulate instances exchanging messages.

python3 epicyon.py --testsnetwork