microblog.pub/README.md

277 lines
6.9 KiB
Markdown
Raw Normal View History

2018-05-18 18:41:41 +00:00
# microblog.pub
<p align="center">
<img
src="https://sos-ch-dk-2.exo.io/microblogpub/microblobpub.png"
width="200" height="200" border="0" alt="microblog.pub">
</p>
<p align="center">
<a href="https://travis-ci.org/tsileo/microblog.pub"><img src="https://travis-ci.org/tsileo/microblog.pub.svg?branch=master" alt="Build Status"></a>
2018-05-20 10:28:11 +00:00
<a href="https://github.com/tsileo/microblog.pub/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-AGPL_3.0-blue.svg?style=flat" alt="License"></a>
2018-05-18 18:41:41 +00:00
</p>
<p align="center">A self-hosted, single-user, <a href="https://activitypub.rocks">ActivityPub</a> powered microblog.</p>
2018-05-20 10:28:11 +00:00
**Still in early development.**
2018-05-18 18:41:41 +00:00
## Features
- Implements a basic [ActivityPub](https://activitypub.rocks/) server (with federation)
- Compatible with [Mastodon](https://github.com/tootsuite/mastodon) and others (Pleroma, Hubzilla...)
- Also implements a remote follow compatible with Mastodon instances
2018-05-20 10:28:11 +00:00
- Exposes your outbox as a basic microblog
- Implements [IndieAuth](https://indieauth.spec.indieweb.org/) endpoints (authorization and token endpoint)
2018-05-18 18:41:41 +00:00
- U2F support
- You can use your ActivityPub identity to login to other websites/app
- Admin UI with notifications and the stream of people you follow
2018-05-20 10:28:11 +00:00
- Allows you to attach files to your notes
- Privacy-aware image upload endpoint that strip EXIF meta data before storing the file
2018-05-18 18:41:41 +00:00
- No JavaScript, that's it, even the admin UI is pure HTML/CSS
- Easy to customize (the theme is written Sass)
2018-05-25 21:57:29 +00:00
- mobile-friendly theme
- with dark and light version
2018-05-18 18:41:41 +00:00
- Microformats aware (exports `h-feed`, `h-entry`, `h-cards`, ...)
- Exports RSS/Atom feeds
- Comes with a tiny HTTP API to help posting new content and performing basic actions
2018-05-21 15:23:54 +00:00
- Easy to "cache" (the external/public-facing microblog part)
2018-05-21 15:24:38 +00:00
- With a good setup, cached content can be served most of the time
2018-05-21 15:23:54 +00:00
- You can setup a "purge" hook to let you invalidate cache when the microblog was updated
2018-05-26 08:43:05 +00:00
- Deployable with Docker (Docker compose for everything: dev, test and deployment)
- Focus on testing
- Tested against the [official ActivityPub test suite](https://test.activitypub.rocks/) ([ ] TODO submit the report)
- CI runs some local "federation" tests
- Manually tested against [Mastodon](https://github.com/tootsuite/mastodon)
- Project is running an up-to-date instance
2018-05-18 18:41:41 +00:00
## ActivityPub
microblog.pub implements an [ActivityPub](http://activitypub.rocks/) server, it implements both the client to server API and the federated server to server API.
Compatible with [Mastodon](https://github.com/tootsuite/mastodon) (which is not following the spec closely), but will drop OStatus messages.
Activities are verified using HTTP Signatures or by fetching the content on the remote server directly.
2018-05-18 18:41:41 +00:00
## Running your instance
### Installation
```shell
$ git clone https://github.com/tsileo/microblog.pub
$ cd microblog.pub
$ pip install -r requirements.txt
2018-05-18 18:41:41 +00:00
$ make css
2018-05-20 10:28:11 +00:00
$ cp -r config/me.sample.yml config/me.yml
2018-05-18 18:41:41 +00:00
```
### Configuration
```shell
$ make password
2018-06-03 14:39:46 +00:00
Password: <enter a password; nothing will show on screen>
$2b$12$iW497g...
```
Edit `config/me.yml` to add the above-generated password, like so:
```
username: 'username'
name: 'You Name'
icon_url: 'https://you-avatar-url'
domain: 'your-domain.tld'
summary: 'your summary'
https: true
pass: $2b$12$iW497g...
2018-05-18 18:41:41 +00:00
```
### Deployment
```shell
$ docker-compose up -d
```
## Development
The most convenient way to hack on microblog.pub is to run the server locally, and run
```shell
# One-time setup
$ pip install -r requirements.txt
# Start the Celery worker, RabbitMQ and MongoDB
$ docker-compose -f docker-compose-dev.yml up -d
# Run the server locally
2018-05-22 22:57:34 +00:00
$ MICROBLOGPUB_DEBUG=1 FLASK_APP=app.py flask run -p 5005 --with-threads
2018-05-18 18:41:41 +00:00
```
2018-06-01 18:29:44 +00:00
## ActivityPub API
### GET /
Returns the actor profile, with links to all the "standard" collections.
### GET /tags/:tag
Special collection that reference notes with the given tag.
### GET /stream
Special collection that returns the stream/inbox as displayed in the UI.
2018-05-29 19:36:05 +00:00
## User API
The user API is used by the admin UI (and requires a CSRF token when used with a regular user session), but it can also be accessed with an API key.
2018-05-29 19:47:28 +00:00
All the examples are using [HTTPie](https://httpie.org/).
2018-05-29 19:36:05 +00:00
### POST /api/note/delete{?id}
2018-06-01 18:29:44 +00:00
Deletes the given note `id` (the note must from the instance outbox).
2018-05-29 19:36:05 +00:00
Answers a **201** (Created) status code.
You can pass the `id` via JSON, form data or query argument.
#### Example
```shell
2018-06-01 18:29:44 +00:00
$ http POST https://microblog.pub/api/note/delete Authorization:'Bearer <token>' id=http://microblob.pub/outbox/<note_id>/activity
2018-05-29 19:36:05 +00:00
```
#### Response
```json
{
"activity": "https://microblog.pub/outbox/<delete_id>"
}
```
2018-06-01 18:29:44 +00:00
### POST /api/like{?id}
Likes the given activity.
Answers a **201** (Created) status code.
You can pass the `id` via JSON, form data or query argument.
#### Example
```shell
$ http POST https://microblog.pub/api/like Authorization:'Bearer <token>' id=http://activity-iri.tld
```
#### Response
```json
{
"activity": "https://microblog.pub/outbox/<like_id>"
}
```
### POST /api/boost{?id}
Boosts/Announces the given activity.
Answers a **201** (Created) status code.
You can pass the `id` via JSON, form data or query argument.
#### Example
```shell
$ http POST https://microblog.pub/api/boost Authorization:'Bearer <token>' id=http://activity-iri.tld
```
#### Response
```json
{
"activity": "https://microblog.pub/outbox/<announce_id>"
}
```
### POST /api/block{?actor}
Blocks the given actor, all activities from this actor will be dropped after that.
Answers a **201** (Created) status code.
You can pass the `id` via JSON, form data or query argument.
#### Example
```shell
$ http POST https://microblog.pub/api/block Authorization:'Bearer <token>' actor=http://actor-iri.tld/
```
#### Response
```json
{
"activity": "https://microblog.pub/outbox/<block_id>"
}
```
### POST /api/follow{?actor}
Follows the given actor.
Answers a **201** (Created) status code.
You can pass the `id` via JSON, form data or query argument.
#### Example
```shell
$ http POST https://microblog.pub/api/follow Authorization:'Bearer <token>' actor=http://actor-iri.tld/
```
#### Response
```json
{
"activity": "https://microblog.pub/outbox/<follow_id>"
}
```
### POST /api/new_note{?content,reply}
Creates a new note. `reply` is the IRI of the "replied" note if any.
Answers a **201** (Created) status code.
You can pass the `content` and `reply` via JSON, form data or query argument.
#### Example
```shell
$ http POST https://microblog.pub/api/new_note Authorization:'Bearer <token>' content=hello
```
#### Response
```json
{
"activity": "https://microblog.pub/outbox/<create_id>"
}
```
### GET /api/stream
#### Example
```shell
$ http GET https://microblog.pub/api/stream Authorization:'Bearer <token>'
```
#### Response
```json
```
2018-05-18 18:41:41 +00:00
## Contributions
PRs are welcome, please open an issue to start a discussion before your start any work.