A minimal document server with support for markdown, pug, and secured paths
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
example
LICENSE
README.md
main.go
misc.go
server.go

README.md

servemd

servemd is an minimalist HTTP server which supports markdown, pug (formerly jade), authentication for secured paths, caching, and TLS. Files are served in accordance with their MIME type, allowing for native viewing (e.g. PDFs or videos on mobile). The example directory shows typical usage (viewable live here), which could look as follows:

.
├── secret         #(you can require auth for this dir)
│   └── index.md   # /secret
├── index.md       # / or /index
├── page.html      # /page.html or /page
├── paper.pdf      # /paper.pdf or /paper
└── video.mp4      # /video.mp4 or /video

Installation

Standalone

servemd can easily be installed as an executable. Download from the latest compiled binaries and put it anywhere in your executable path (e.g. /usr/local).

Source

To install servemd from source, you need to have a Go development environment. If you've done Go development before and your $GOPATH/bin directory is already in your PATH:

go get github.com/lucasem/servemd

Usage

To run the server, simply run:

servemd settings.yaml

The settings.yaml file specifies all configuration information for the server. The only required field is dir, the path to serve.

dir: path/to/docs              # required
port: 8080                     # optional, defaults to 80
host: localhost                # optional, defaults to kernel-reported hostname
log: server.log                # optional, log file; defaults to stderr
template: path/to/md.tpl       # optional, but you should set it
ttl: 240                       # optional, defaults to 0 (in minutes)
secrets:                       # optional
  my_dir: my_password
  other_dir: other_password
tls:                           # optional
  cert: fullchain.pem          # TLS required
  privkey: privkey.pem         # TLS required
  only: false                  # optional, defaults to false
  required: secrets            # optional, 'all', 'secrets', or 'none' (default)
  port: 8443                   # optional, defaults to 443

Markdown and Pug(/Jade)

Markdown is parsed using blackfriday's MarkdownCommon implementation, which features common extensions including fenced code blocks and strikethroughs. Syntax highlighting can be done easily with Prism in the markdown template.

The template file uses the format described in text/template with {{ .Content }} substituted by the HTML from rendered markdown. See the example template.

Pug files are automatically rendered before a request is served.

Caching

Caching is enabled by setting ttl to a non-zero value (in minutes). If ttl is negative, the cache will never expire any cached response. The cache can be forced to empty by sending SIGUSR1 to the servemd process:

$ killall -USR1 servemd

Caching is particularly useful when serving markdown and pug files, because these files will never have to be re-rendered (dramatically reducing response time) until they expire.

Secrets and Authentication

servemd authenticates using HTTP Digest Access Authentication (RFC 2617). The username isn't affirmed, only the password needs to match.

TLS

The configuration servemd uses for TLS yields an A+ on SSL Labs!

When specifying TLS, two servers (one HTTP and one HTTPS) will be spawned unless tls.only is set to true.

The required option, when set to all, will redirect all HTTP traffic to use HTTPS. When set to secrets, this is only done for traffic that hits a secret path (if at least this isn't set, then your secrets may not be very secret because it's very easy to read HTTP traffic over wifi).