High performance guppe setup (#62)
* add worker script and container * remove port bindings from worker * another worker * try replicas * 8 workers * try replicating web server * document docker swarm commands * use image instead of build as required by swarm
This commit is contained in:
parent
eb0871c9eb
commit
1a10e2ce9f
4 changed files with 79 additions and 5 deletions
|
@ -19,14 +19,15 @@ fallback user profile discovery.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
`Dockerfile` and `docker-compose.yml` are provided for easy install
|
Guppe uses Docker Swarm for easy load balancing Web server replicas
|
||||||
|
|
||||||
```
|
```
|
||||||
git clone https://github.com/wmurphyrd/guppe.git
|
git clone https://github.com/wmurphyrd/guppe.git
|
||||||
cd guppe
|
cd guppe
|
||||||
cp .env.defaults .env
|
cp .env.defaults .env
|
||||||
echo DOMAIN=yourdomain.com >> .env
|
echo DOMAIN=yourdomain.com >> .env
|
||||||
docker-compose up --build -d
|
docker swarm init --advertise-addr 127.0.0.1
|
||||||
|
docker stack deploy --compose-file docker-compose.yml guppe
|
||||||
```
|
```
|
||||||
|
|
||||||
## Updating
|
## Updating
|
||||||
|
@ -41,7 +42,7 @@ Fetch latest code & restart server:
|
||||||
|
|
||||||
```
|
```
|
||||||
git pull
|
git pull
|
||||||
docker-compose up --build -d
|
docker stack deploy --compose-file docker-compose.yml guppe
|
||||||
```
|
```
|
||||||
|
|
||||||
## Optional configuration
|
## Optional configuration
|
||||||
|
|
52
deliveryWorker.js
Normal file
52
deliveryWorker.js
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
require('dotenv').config()
|
||||||
|
const MongoClient = require('mongodb').MongoClient
|
||||||
|
const { onShutdown } = require('node-graceful-shutdown')
|
||||||
|
const ActivitypubExpress = require('activitypub-express')
|
||||||
|
|
||||||
|
const { DOMAIN, DB_URL, DB_NAME } = process.env
|
||||||
|
|
||||||
|
const client = new MongoClient(DB_URL)
|
||||||
|
|
||||||
|
const routes = {
|
||||||
|
actor: '/u/:actor',
|
||||||
|
object: '/o/:id',
|
||||||
|
activity: '/s/:id',
|
||||||
|
inbox: '/u/:actor/inbox',
|
||||||
|
outbox: '/u/:actor/outbox',
|
||||||
|
followers: '/u/:actor/followers',
|
||||||
|
following: '/u/:actor/following',
|
||||||
|
liked: '/u/:actor/liked',
|
||||||
|
collections: '/u/:actor/c/:id',
|
||||||
|
blocked: '/u/:actor/blocked',
|
||||||
|
rejections: '/u/:actor/rejections',
|
||||||
|
rejected: '/u/:actor/rejected',
|
||||||
|
shares: '/s/:id/shares',
|
||||||
|
likes: '/s/:id/likes'
|
||||||
|
}
|
||||||
|
const apex = ActivitypubExpress({
|
||||||
|
domain: DOMAIN,
|
||||||
|
actorParam: 'actor',
|
||||||
|
objectParam: 'id',
|
||||||
|
itemsPerPage: 100,
|
||||||
|
routes
|
||||||
|
})
|
||||||
|
|
||||||
|
client.connect()
|
||||||
|
.then(async () => {
|
||||||
|
apex.store.db = client.db(DB_NAME)
|
||||||
|
let resumeDeliveryTimer
|
||||||
|
function deliver () {
|
||||||
|
apex.startDelivery()
|
||||||
|
// delivery will stop if the queue empties, ensure it keeps running when new work is available
|
||||||
|
// no effect if called while already running
|
||||||
|
resumeDeliveryTimer = setTimeout(deliver, 5000)
|
||||||
|
}
|
||||||
|
deliver()
|
||||||
|
onShutdown(async () => {
|
||||||
|
clearTimeout(resumeDeliveryTimer)
|
||||||
|
// time for last delivery to finish (need to fix in apex)
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 3000))
|
||||||
|
await client.close()
|
||||||
|
console.log('Guppe delivery worker closed')
|
||||||
|
})
|
||||||
|
})
|
|
@ -2,7 +2,10 @@ version: "3.8"
|
||||||
|
|
||||||
services:
|
services:
|
||||||
guppe:
|
guppe:
|
||||||
build: .
|
image: datatitian/guppe
|
||||||
|
deploy:
|
||||||
|
mode: replicated
|
||||||
|
replicas: 4
|
||||||
restart: always
|
restart: always
|
||||||
ports:
|
ports:
|
||||||
- 443:443
|
- 443:443
|
||||||
|
@ -21,7 +24,24 @@ services:
|
||||||
driver: local
|
driver: local
|
||||||
options:
|
options:
|
||||||
max-size: '10m'
|
max-size: '10m'
|
||||||
|
|
||||||
|
worker1:
|
||||||
|
image: datatitian/guppe
|
||||||
|
command: [ "node", "deliveryWorker.js" ]
|
||||||
|
deploy:
|
||||||
|
mode: replicated
|
||||||
|
replicas: 8
|
||||||
|
restart: always
|
||||||
|
env_file: '.env'
|
||||||
|
environment:
|
||||||
|
DB_URL: 'mongodb://mongodb:27017'
|
||||||
|
depends_on:
|
||||||
|
- mongodb
|
||||||
|
logging:
|
||||||
|
driver: local
|
||||||
|
options:
|
||||||
|
max-size: '10m'
|
||||||
|
|
||||||
mongodb:
|
mongodb:
|
||||||
image: mongo:4.2
|
image: mongo:4.2
|
||||||
restart: always
|
restart: always
|
||||||
|
|
1
index.js
1
index.js
|
@ -49,6 +49,7 @@ const apex = ActivitypubExpress({
|
||||||
actorParam: 'actor',
|
actorParam: 'actor',
|
||||||
objectParam: 'id',
|
objectParam: 'id',
|
||||||
itemsPerPage: 100,
|
itemsPerPage: 100,
|
||||||
|
offlineMode: true, // delivery done in workers only
|
||||||
routes
|
routes
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue