• This repository has been archived on 27/Dec/2022
  • Stars
    star
    406
  • Rank 106,421 (Top 3 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 6 years ago
  • Updated about 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Self-deployable tool for hosting hyper:// websites

homebase

homebase is a self-deployable tool for managing websites published with the Hypercore protocol.

homebase is for you if:

  • You're comfortable with some server administration (or want to learn!)
  • You want to keep your hyper:// website/s online
  • You want to publish your hyper:// website/s to http://

Table of contents

Install

If you already have Node.js (12.0+) and npm installed on your server, get started by installing Homebase with npm or npx.

npm install -g @beaker/homebase

Otherwise, install Node.js and npm first:

Having trouble installing? See Troubleshooting.

Running homebase

To run homebase manually, simply invoke the homebase command:

homebase

To keep homebase running, you'll need to daemonize it. We like using pm2.

# install pm2
npm i -g pm2

# start homebase with pm2
pm2 start homebase

To stop the daemon, run:

# stop homebase
pm2 stop homebase

Command line flags

  • --config <path>
    • Use the config file at the given path instead of the default ~/.homebase.yml. Overrides the value of the HOMEBASE_CONFIG env var.

Environment variables

  • HOMEBASE_CONFIG=cfg_file_path
    • Specify an alternative path to the config than ~/.homebase.yml
  • NODE_ENV=debug|staging|production
    • Set to debug or staging to use the Let's Encrypt testing servers.

Examples

homebase uses a configuration file (~/.homebase.yml by default) for managing its behavior. These examples show various configurations.

See all configuration options

Example: set up a hyperdrive with HTTP mirroring

This configuration file will host the files at hyper://123...456 and mirror those files to http://alice.com.

This example uses a domain name, so in order for the domain name to resolve correctly, you'll need to update your DNS configuration first. In this case, you could set an A record that points to the homebase server's IP address.

hyperdrives:
  - url: hyper://123...456
    domains:
      - alice.com
httpMirror: true

Example: host multiple websites, with no HTTP mirroring

This configuration simply hosts the files at hyper://123...456 and hyper:///456...789. No domain name is required for this configuration.

hyperdrives:
  - url: hyper://123...456
  - url: hyper://456...789

Configuration

Configuration file

homebase uses ~/.homebase.yml as its default configuration file. You can specify an alternative config file using a command line flag or an environment variable.

directory: ~/.homebase # where your data will be stored
httpMirror: true       # enables HTTP mirroring
ports:
  http: 80             # HTTP port for redirects or non-TLS serving
dashboard:             # set to false to disable
  port: 8089           # port for accessing the metrics dashboard

# enter your hosted hyperdrives here
hyperdrives:
  - url:               # URL of the hyperdrive to be hosted
    domains:           # (optional) the domains of the hyperdrive

# enter any proxied routes here
proxies:
  - from:              # the domain to accept requests from
    to:                # the domain (& port) to target

# enter any redirect routes here
redirects:
  - from:              # the domain to accept requests from
    to:                # the domain to redirect to

dashboard

Default false

Set to true to enable the Prometheus metrics dashboard.

dashboard:             # set to false to disable
  port: 8089           # port for accessing the metrics dashboard

dashboard.port

Default: 8089

The port to serve the Prometheus metrics dashboard.

hyperdrives

A listing of the Hyperdrives to host.

hyperdrives:
  - url: hyper://1f968afe867f06b0d344c11efc23591c7f8c5fb3b4ac938d6000f330f6ee2a03/
    domains:
      - mysite.com
      - my-site.com

hyperdrives.*.url

The Hyperdrive URL of the site to host. Should be a 'raw' hyper url (no DNS hostname).

Example values:

# raw key
1f968afe867f06b0d344c11efc23591c7f8c5fb3b4ac938d6000f330f6ee2a03

# URL with trailing slash
hyper://1f968afe867f06b0d344c11efc23591c7f8c5fb3b4ac938d6000f330f6ee2a03/

# URL with no trailing slash
hyper://1f968afe867f06b0d344c11efc23591c7f8c5fb3b4ac938d6000f330f6ee2a03

hyperdrives.*.domains

Additional domains of the Hyperdrive. Can be a string or a list of strings. Each string should be a domain name.

To use hyperdrives.*.domains, you'll first need to configure the DNS entry for your domain name to point to your server. For instance, to point alice.com with homebase, you'll need to update your DNS configuration to point alice.com to your homebase server's IP address.

Example values:

mysite.com
foo.bar.edu
best-site-ever.link

directory

Default: ~/.homebase

The directory where homebase will store your data.

domain

DEPRECATED. See the v2.0.0 migration guide.

The DNS domain of your homebase instance.

httpMirror

Default: false

Set to true to provide http mirroring of your Hyperdrives.

ports

The ports for HTTP.

ports:
  http: 80

ports.http

Default: 80

The port for serving HTTP sites.

proxies

A listing of domains to proxy. Useful when your server has other services running that you need available.

proxies:
  - from: my-proxy.com
    to: http://localhost:8080

proxies.*.from

The domain to proxy from. Should be a domain name.

Example values:

mysite.com
foo.bar.edu
best-site-ever.link

proxies.*.to

The protocol, domain, and port to proxy to. Should be an origin.

Example values:

https://mysite.com/
http://localhost:8080/
http://127.0.0.1:123/

redirects

A listing of domains to redirect.

redirects:
  - from: my-old-site.com
    to: https://my-site.com

redirects.*.from

The domain to redirect from. Should be a domain name.

Example values:

mysite.com
foo.bar.edu
best-site-ever.link

redirects.*.to

The base URL to redirect to. Should be an origin.

Example values:

https://mysite.com/
http://localhost:8080/
http://127.0.0.1:123/

Advanced examples

Example: proxies

If your homebase instance is running on ports 80/443, and you have other Web servers running on your server, you might need homebase to proxy to those other servers. You can do that with the proxies config. Here's an example proxy rule:

See full proxies reference

proxies:
  - from: my-proxy.com
    to: http://localhost:8080

Example: redirecting requests

Sometimes you need to redirect old domains to new ones. You can do that with the redirects rule. Here's an example redirect rule:

See full redirects reference

redirects:
  - from: my-old-site.com
    to: https://my-site.com

Example: using a metrics dashboard

homebase has built-in support for Prometheus, which can be visualized with Grafana.

./grafana-screenshot.png

Homebase exposes its metrics at port 8089. Prometheus periodically scrapes the metrics and stores them in a database. Grafana uses those metrics and provides a provides a nice dashboard visualization. It's a little daunting at first, but setup should be relatively painless.

Steps:

  1. Install Prometheus on your server
  2. Install Grafana on your server
  3. Update the prometheus.yml config
  4. Start Prometheus and Grafana
  5. Login to Grafana
  6. Add Prometheus as a data source to Grafana (it should be running at localhost:9090
  7. Import this Grafana dashboard

Your prometheus.yml config should include have the scrape_configs option set like this:

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
  - job_name: 'homebase'
    static_configs:
      - targets: ['localhost:8089']

Example: running homebase behind Apache or Nginx

If you're running homebase on a server that uses Apache or Nginx, you may need to change your config to disable HTTPS. For instance, if you're using nginx and proxying to port 8080, update your config to set the HTTP port:

ports:
  http: 8080

You will need to add all domains to your Nginx/Apache config.

Example: running homebase in a docker container

  1. Install Docker. If you're on Linux, remember to configure Docker to start on boot. Don't know of the equivalent for other systems.

  2. Clone the project. Edit .homebase.yml according to your needs. Most importantly: Change username and password.
    If you don't want to think of a username and a password, just use this but increase the length.

  3. In the project root, run this command:

docker build -t homebase:latest . && docker run -d --name=homebase --restart=always -p 80:80 -p 443:443 -p 3282:3282 homebase:latest

Notes:

  1. Not an expert in Docker security or configuration.
  2. if you have Beaker on the same machine, you may want to change the hyperdrive port -p 3282:3282 to something like -p 9999:3282.
  3. To debug the running container:
    • Run docker ps -a to see the container running status.
    • Run docker logs homebase to see the logs.
    • Run docker exec -it homebase sh to get into a terminal.
  4. Didn't think about how you'd install a newer version of homebase while keeping the old configuration and data.

Troubleshooting

Installing build dependencies

When installing homebase, you may need to install additional build dependencies:

sudo apt-get install libtool m4 automake libcap2-bin build-essential

Port setup (EACCES error)

For homebase to work correctly, you need to be able to access port 80 (http), 443 (https), and 3282 (hyperdrive). Your firewall should be configured to allow traffic on those ports.

If you get an EACCES error on startup, you either have a process using the port already, or you lack permission to use the port. Try lsof -i tcp:80 or lsof -i tcp:443 to see if there are any processes bound to the ports you need.

If the ports are not in use, then it's probably a permissions problem. We recommend using the following command to solve that:

# give node perms to use ports 80 and 443
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

This will give nodejs the rights to use ports 80 and 443. This is preferable to running homebase as root, because that carries some risk of a bug in homebase allowing somebody to control your server.

Support

homebase is built by the Beaker Browser team. Become a backer and help support the development of an open, friendly, and fun Web. You can help us continue our work on Beaker, hashbase.io, homebase, and more. Thank you!

Become a backer

Changelog

v3.0.0

  • Added Hyperdrive support.
  • Deprecated Dat support. If you still need dat support, you'll need to use Homebase v2.
  • Deprecated the Web API.
  • Deprecated Lets Encrypt due to Greenlock changing too much to keep up with.

v2.0.0

  • Removed the dats.*.name field. You can now set the domains for your dats directly with the dat.*.domains field.
  • Moved the domain config from the top of the yaml file to the webapi field. This makes it clearer what the domain applies to. Optional, unless you want to use Let's Encrypt.

The original release of homebase tried to mimic Hashbase as closely as possible. As a result, it had a concept of a root domain and each dat was given a name which became a subdomain under that root domain. This confused most users and was generally regarded as "the worst." To simplify the config process, we removed the concept of the root domain and name attribute. Now, you just set the domains directly on each dat.

More Repositories

1

beaker

An experimental peer-to-peer Web browser
JavaScript
6,750
star
2

webdb

The Web is your database.
JavaScript
399
star
3

fritter

A peer-to-peer social feed app. (proof of concept)
JavaScript
364
star
4

dathttpd

Replaced by Homebase! See https://github.com/beakerbrowser/homebase.
JavaScript
280
star
5

hashbase

A Dat-hosting service for multiple users
JavaScript
239
star
6

explore

A curated list of peer-to-peer websites and apps
HTML
181
star
7

unwalled.garden

Schemas for a p2p social-media network built on the Dat Web.
HTML
131
star
8

dat-photos-app

A peer-to-peer photos app
JavaScript
86
star
9

libfritter

Methods for Fritter, a Dat-based Twitter clone
JavaScript
47
star
10

beaker-core

Beaker browser's core software [outdated]
JavaScript
45
star
11

pauls-dat-api

Library of functions that make working with dat / hyperdrive easier.
JavaScript
44
star
12

beaker.social

A social networking app built on Beaker's unwalled.garden open standards.
JavaScript
40
star
13

bkr

Beaker headless runtime for the hyper:// space network.
JavaScript
39
star
14

beakerbrowser.com

Source code for https://beakerbrowser.com
HTML
39
star
15

dat-node

A toolkit for writing Dat-based services in nodejs
JavaScript
37
star
16

dat-rssreader-app

Read RSS feeds for blogs hosted over dat://
JavaScript
25
star
17

dat-archive-map-reduce

Index files in Dat archives with map-reduce to create queryable data views.
JavaScript
23
star
18

beaker.dev

Developer portal for templates, tutorials, and news
JavaScript
19
star
19

dat-pinning-service-client

Client API for Dat pinning services
JavaScript
14
star
20

social

Peer-to-peer social media
JavaScript
13
star
21

dat-ephemeral-ext-msg

Methods for DEP-0000: Ephemeral Message (Extension Message)
JavaScript
11
star
22

beaker-profiles-api

An API for reading and writing profile archives as used by Beaker.
JavaScript
11
star
23

beaker-browser.gitbook.io

This repo mirrors the content in beaker-browser.gitbook.io
11
star
24

dat-editor-app

A simple but well-featured code editor
JavaScript
11
star
25

beaker.network

A social aggregator application
JavaScript
10
star
26

docs.beakerbrowser.com

Beaker Browser documentation site
JavaScript
9
star
27

p2p-web-workshop

A collection of resources for running a peer-to-peer Web workshop
9
star
28

hyperdrive.network

An application for viewing and modifying Hyperdrives. Requires a Hyperdrive-enabled browser.
JavaScript
9
star
29

webterm

Specs and discussions for the Webterm environment
9
star
30

userlist

A simple service for listing your profile drive under your Twitter username.
JavaScript
8
star
31

beaker-uplink

Peer-to-peer bookmark sharing.
JavaScript
8
star
32

beaker-sidebar-app

Web application that drives Beaker's sidebar view
JavaScript
8
star
33

beaker-editor-app

In-browser editor application.
JavaScript
8
star
34

dat-legacy-tools

Tools to access legacy dats stored in Beaker
JavaScript
7
star
35

pauls-dat-api2

DatArchive implementation for Dat 2.0
JavaScript
7
star
36

beaker-reader

Publish and read blogposts.
JavaScript
7
star
37

dat-wysiwywiki-app

A wiki app with a wysiwyg interface
JavaScript
7
star
38

beaker-compare-app

A builtin app for comparing, diffing, and merging two dats
JavaScript
6
star
39

pauls-hyper-mirror

A simple seeding servce
JavaScript
6
star
40

beaker-user-website-template

The template for new user websites.
JavaScript
5
star
41

beaker-library-app

The Beaker "Library" app
JavaScript
5
star
42

beaker.cloud

An open-source dat server that scales
5
star
43

record-protocols-spec

(Dead Spec) A standard for building interoperable applications on the Web.
5
star
44

pauls-embedded-analytics

A sqlite-backed embedded analytics module for nodejs.
JavaScript
5
star
45

beaker-search-app

The Beaker "Search" app
JavaScript
5
star
46

beaker-virtual-fs

An object-oriented files interface used by Beaker to render the user's filesystem
JavaScript
5
star
47

dat-serve-resolve-path

Beaker's method to find the file to serve in dat:// requests
JavaScript
4
star
48

dat-nexus-app

A social feeds and profiles application
JavaScript
4
star
49

beaker-bookmarks-app

The Beaker "Bookmarks" app
JavaScript
4
star
50

beaker-app-stdlib

Assets which are reused across Beaker apps
JavaScript
4
star
51

viewer-apps

Beaker's builtin hyperdrive-viewer applications
JavaScript
3
star
52

hypercloud-ui-hashbase

Hashbase UI module for hypercloud [DEPRECATED]
CSS
3
star
53

library-tools

Module for managing the library.json file (spec: beakerbrowser.com/library)
JavaScript
3
star
54

beaker-error-constants

Module containing the errors used by beaker and its submodules
JavaScript
3
star
55

basic-user-site-template

Template used to create new user sites
JavaScript
3
star
56

uwg-bash

Bash CLI tools for reading/writing Unwalled Garden data
3
star
57

beaker-start-app

The Beaker "Start Page" app
JavaScript
2
star
58

beaker-analytics-server

Server to collect Beaker usage pings.
JavaScript
2
star
59

dat-workshop-server

A server for the "dat workshop" application (created for the Decentralized Web Summit 2018)
HTML
2
star
60

datignore

A module for reading and using .datignore files
JavaScript
2
star
61

builtin-pages-lib

Some common library code for Beaker's builtin pages.
JavaScript
2
star
62

beaker-index

An indexer driven from the beaker userlist
JavaScript
2
star
63

beaker-profile-app

The Beaker "Profile" App
JavaScript
2
star
64

beaker-feed-app

The Beaker "Feed" App
JavaScript
2
star
65

dat-session-data-ext-msg

Methods for DEP-0006: Session Data (Extension Message)
JavaScript
2
star
66

discussions

Repo for having org-wide discussions.
2
star
67

dat-archive-file-diff

Get line-by-line diffs of text files in Dat archives
JavaScript
1
star
68

dat-nexus-api

API for interacting with Dat Nexus profiles
JavaScript
1
star
69

simple-cloud-announcer

A fork of discovery-swarm that announces a peer and waits for connections.
JavaScript
1
star
70

assets

Images, logos, etc
1
star
71

site-schema.org

A machine-readable description format used to validate and describe the file structures of websites.
1
star