Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/wincent/masochist
⛓ Website infrastructure for over-engineers
https://github.com/wincent/masochist
graphql markdown react relay vim
Last synced: 2 months ago
JSON representation
⛓ Website infrastructure for over-engineers
- Host: GitHub
- URL: https://github.com/wincent/masochist
- Owner: wincent
- License: mit
- Created: 2015-09-25T06:31:41.000Z (over 9 years ago)
- Default Branch: main
- Last Pushed: 2024-04-10T07:43:46.000Z (9 months ago)
- Last Synced: 2024-04-10T08:39:26.799Z (9 months ago)
- Topics: graphql, markdown, react, relay, vim
- Language: Hack
- Homepage:
- Size: 708 MB
- Stars: 79
- Watchers: 4
- Forks: 26
- Open Issues: 23
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# What
This repo contains the source code and content for my website at [wincent.dev].
Content is authored in plain-text-friendly markup formats like [Markdown] and
served using a dynamic stack (described below). New code can be deployed and
content added or updated via `git push`.## Stack
- [React]: Declarative, component-oriented view layer.
- [Relay]: Declarative data-management.
- [GraphQL]: Hierarchical data querying language, type system and server.
- [Git]: Main content storage.
- [Redis]: Indexing and caching.
- [memcached]: Ephemeral caching.Supporting tools and technologies:
- [Markdown]: Preferred content markup.
- [Neovim], with help from [Corpus]: Content editing.
- [Marked 2]: Local content previewing.## Questions
### Why not use a static site generator?
A static site generator would very much be the right tool for this job, however, building the site on a custom [React]/[Relay]/[GraphQL] stack was much more fun, so I did that instead.
### Why the name "Masochist"?
Please see the introductory blog post, "[Introducing Masochist](https://github.com/wincent/masochist/blob/content/content/blog/masochist.md)".
# Development
## Quickstart
### Prerequisites
```
brew install git memcached redis
```### Webpack-based hot-loading workflow
```
git clone https://github.com/wincent/masochist.git
cd masochist
yarn
yarn update-schema
yarn update-indices # Whenever content changes.
yarn start
```### Running in production-like environment
```
yarn run build # Builds files under `dist/`.
yarn start-prod
```### Running in production
```
export NODE_ENV=production
yarn
yarn build
node dist/bin/updateIndices.js # Whenever content changes.
node dist/server/main.js
```### Configuration
In `__DEV__`, Masochist will look for content in the current repo (ie. `.`).
In production, it expects to find a content repo at `/srv/masochist/content`.
In `__DEV__`, you can override this with `npm config set`. For example, in my local development environment, I have the Masochist Git repo checked out in one folder, and a second copy of it with the `content` branch checked out within it (using `git-worktree`) at `./content` (see below for more details on this set-up). I can override the `__DEV__` default of `.` with:
```
# Use npm, not yarn, for this:
npm config set masochist:content-repo './content'
```### Deployment cheatsheet
You could do this in any number of ways but the way I'm doing it is using two local repositories as follows:
#### Local "masochist" repository
##### Structure
* `main` branch checked out.
* `origin` remote pointing at git.wincent.dev.
* `github` remote pointing at [GitHub](https://github.com/wincent/masochist).
* `masochist` remote set up to do Heroku-style deploy-on-push, pointing at an Amazon EC2 instance configured using Ansible.
* `content` remote set up to do a Heroku-style update-on-push for content changes, pointing at the corresponding repository on EC2.##### Commands
```
$ git push masochist main # Deploy app (after initial provisioning).
$ git push masochist # Subsequent deployments.
$ git push origin # Propagate code, but no deploy.
$ git push # Shorthand for `git push origin`.
$ git push github # If you can't be bothered waiting for it to auto-replicate.
```#### Local "content" worktree
##### Structure
* `content` branch checked out.
* `content` remote configured to do Heroku-style push-to-publish.
* `origin` remote pointing at git.wincent.dev.
* `github` remote pointing at [GitHub](https://github.com/wincent/masochist).##### Commands
```
$ git push content content # First push after initial provisioning.
$ git push content # Subsequent pushes.
$ git config branch.content.merge refs/heads/content # For laziness.
$ git push # Simple.
```##### Rollback to a prior rev `$HASH`
```
$ git push masochist +$HASH:main
```Or just switch symlinks and `sudo monit restart masochist`.
#### Force a deploy without actual code changes
```
$ git commit -m Deploy --allow-empty
$ git push masochist
```[Corpus]: https://github.com/wincent/corpus
[Git]: https://git-scm.com/
[GraphQL]: http://graphql.org/
[Markdown]: https://en.wikipedia.org/wiki/Markdown
[Marked 2]: http://marked2app.com/
[memcached]: http://memcached.org/
[React]: http://facebook.github.io/react/
[Redis]: http://redis.io/
[Relay]: http://facebook.github.io/relay/
[Neovim]: https://github.com/neovim/neovim
[wincent.dev]: https://wincent.dev/