Compare commits
4 Commits
1b3ca1af4b
...
cef74151d2
Author | SHA1 | Date | |
---|---|---|---|
|
cef74151d2 | ||
|
4f01edb923 | ||
|
5485984e05 | ||
|
b1641d1af9 |
28
Makefile
28
Makefile
@ -1,22 +1,22 @@
|
||||
|
||||
CONFIG = ./config.nix
|
||||
BASH = $$(nix-build --no-out-link -A pkgs.bash)/bin/bash
|
||||
|
||||
entrypoint:
|
||||
nix-build -A entrypoint \
|
||||
--arg baseConfig '(import ${CONFIG})'
|
||||
nix-build -A entrypoint --arg config '(import ${CONFIG})'
|
||||
|
||||
install:
|
||||
$$(nix-build -A install --arg baseConfig '(import ${CONFIG})')
|
||||
install-systemd:
|
||||
$$(nix-build --no-out-link -A install --arg config '(import ${CONFIG})')
|
||||
|
||||
test:
|
||||
$$(nix-build --no-out-link -A pkgs.bash)/bin/bash srv-dev-env.sh \
|
||||
--run "cd srv/src && go test ./... -count=1 -tags integration"
|
||||
@echo "\nTESTS PASSED!\n"
|
||||
${BASH} tmp-dev-env.sh \
|
||||
--run "cd src; go test ./... -count=1 -tags integration"
|
||||
|
||||
srv.dev-shell:
|
||||
$$(nix-build --no-out-link -A pkgs.bash)/bin/bash srv-dev-env.sh \
|
||||
--command "cd srv/src; return"
|
||||
|
||||
srv.shell:
|
||||
nix-shell -A srv.shellWithBuild --arg baseConfig '(import ${CONFIG})' \
|
||||
--command 'cd srv/src; return'
|
||||
shell:
|
||||
${BASH} tmp-dev-env.sh \
|
||||
--command " \
|
||||
cd src; \
|
||||
echo 'Loading test data...'; \
|
||||
(cd cmd/load-test-data && go run main.go); \
|
||||
return; \
|
||||
"
|
||||
|
99
default.nix
99
default.nix
@ -1,78 +1,69 @@
|
||||
{
|
||||
|
||||
pkgsArg ? import (fetchTarball {
|
||||
pkgs ? import (fetchTarball {
|
||||
name = "nixpkgs-21-05";
|
||||
url = "https://github.com/NixOS/nixpkgs/archive/7e9b0dff974c89e070da1ad85713ff3c20b0ca97.tar.gz";
|
||||
sha256 = "1ckzhh24mgz6jd1xhfgx0i9mijk6xjqxwsshnvq789xsavrmsc36";
|
||||
}) {},
|
||||
|
||||
baseConfig ? import ./config.nix,
|
||||
skipServices ? [],
|
||||
config ? import ./config.nix,
|
||||
|
||||
}: rec {
|
||||
|
||||
pkgs = pkgsArg;
|
||||
inherit pkgs;
|
||||
|
||||
config = baseConfig // {
|
||||
redisListenPath = "${config.runDir}/redis";
|
||||
init = pkgs.writeText "mediocre-blog-init" ''
|
||||
|
||||
export MEDIOCRE_BLOG_DATA_DIR="${config.dataDir}"
|
||||
|
||||
# mailing list
|
||||
export MEDIOCRE_BLOG_ML_SMTP_ADDR="${config.mlSMTPAddr}"
|
||||
export MEDIOCRE_BLOG_ML_SMTP_AUTH="${config.mlSMTPAuth}"
|
||||
export MEDIOCRE_BLOG_ML_PUBLIC_URL="${config.publicURL}"
|
||||
|
||||
# pow
|
||||
export MEDIOCRE_BLOG_POW_SECRET="${config.powSecret}"
|
||||
|
||||
# http
|
||||
export MEDIOCRE_BLOG_HTTP_PUBLIC_URL="${config.publicURL}"
|
||||
export MEDIOCRE_BLOG_HTTP_LISTEN_PROTO="${config.httpListenProto}"
|
||||
export MEDIOCRE_BLOG_HTTP_LISTEN_ADDR="${config.httpListenAddr}"
|
||||
export MEDIOCRE_BLOG_HTTP_AUTH_USERS='${builtins.toJSON config.httpAuthUsers}'
|
||||
export MEDIOCRE_BLOG_HTTP_AUTH_RATELIMIT='${config.httpAuthRatelimit}'
|
||||
'';
|
||||
|
||||
bin = pkgs.buildGoModule {
|
||||
pname = "mediocre-blog";
|
||||
version = "dev";
|
||||
src = ./src;
|
||||
vendorSha256 = "sha256:1vazrrg8rs9n8x40c9r53h9qnyxw59xkp0aq7jl15fliigk6q0cr";
|
||||
|
||||
subPackages = [ "cmd/mediocre-blog" ];
|
||||
|
||||
# disable tests
|
||||
checkPhase = '''';
|
||||
};
|
||||
|
||||
srv = pkgs.callPackage (import ./srv) {
|
||||
inherit config;
|
||||
};
|
||||
|
||||
redisCfg = pkgs.writeText "mediocre-blog-redisCfg" ''
|
||||
port 0
|
||||
unixsocket ${config.redisListenPath}
|
||||
daemonize no
|
||||
loglevel notice
|
||||
logfile ""
|
||||
appendonly yes
|
||||
appendfilename "appendonly.aof"
|
||||
dir ${config.dataDir}/redis
|
||||
'';
|
||||
|
||||
redisBin = pkgs.writeScript "mediocre-blog-redisBin" ''
|
||||
#!/bin/sh
|
||||
mkdir -p ${config.dataDir}/redis
|
||||
exec ${pkgs.redis}/bin/redis-server ${redisCfg}
|
||||
'';
|
||||
|
||||
srvCircusCfg = ''
|
||||
[watcher:srv]
|
||||
cmd = ${srv.bin}
|
||||
numprocesses = 1
|
||||
'';
|
||||
|
||||
redisCircusCfg = ''
|
||||
[watcher:redis]
|
||||
cmd = ${redisBin}
|
||||
numprocesses = 1
|
||||
'';
|
||||
|
||||
circusCfg = pkgs.writeText "mediocre-blog-circusCfg" ''
|
||||
[circus]
|
||||
endpoint = tcp://127.0.0.1:0
|
||||
pubsub_endpoint = tcp://127.0.0.1:0
|
||||
|
||||
${if (!builtins.elem "srv" skipServices) then srvCircusCfg else ""}
|
||||
|
||||
${if (!builtins.elem "redis" skipServices) then redisCircusCfg else ""}
|
||||
'';
|
||||
|
||||
entrypoint = pkgs.writeScript "mediocre-blog-entrypoint" ''
|
||||
#!/bin/sh
|
||||
#!${pkgs.bash}/bin/bash
|
||||
|
||||
set -e
|
||||
source ${init}
|
||||
|
||||
if [ ! -d ${config.runDir} ]; then
|
||||
mkdir -p ${config.runDir}
|
||||
fi
|
||||
|
||||
mkdir -p ${config.dataDir}
|
||||
exec ${pkgs.circus}/bin/circusd ${circusCfg}
|
||||
|
||||
exec ${bin}/bin/mediocre-blog "$@"
|
||||
'';
|
||||
|
||||
shell = pkgs.stdenv.mkDerivation {
|
||||
name = "mediocre-blog-shell";
|
||||
buildInputs = [ pkgs.go pkgs.sqlite ];
|
||||
shellHook = ''
|
||||
source ${init}
|
||||
'';
|
||||
};
|
||||
|
||||
service = pkgs.writeText "mediocre-blog" ''
|
||||
[Unit]
|
||||
Description=mediocregopher mediocre blog
|
||||
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 68 KiB |
@ -8,7 +8,6 @@ import (
|
||||
"time"
|
||||
|
||||
cfgpkg "github.com/mediocregopher/blog.mediocregopher.com/srv/cfg"
|
||||
"github.com/mediocregopher/blog.mediocregopher.com/srv/chat"
|
||||
"github.com/mediocregopher/blog.mediocregopher.com/srv/http"
|
||||
"github.com/mediocregopher/blog.mediocregopher.com/srv/mailinglist"
|
||||
"github.com/mediocregopher/blog.mediocregopher.com/srv/post"
|
||||
@ -45,14 +44,6 @@ func main() {
|
||||
httpParams.SetupCfg(cfg)
|
||||
ctx = mctx.WithAnnotator(ctx, &httpParams)
|
||||
|
||||
var radixClient cfgpkg.RadixClient
|
||||
radixClient.SetupCfg(cfg)
|
||||
defer radixClient.Close()
|
||||
ctx = mctx.WithAnnotator(ctx, &radixClient)
|
||||
|
||||
chatGlobalRoomMaxMsgs := cfg.Int("chat-global-room-max-messages", 1000, "Maximum number of messages the global chat room can retain")
|
||||
chatUserIDCalcSecret := cfg.String("chat-user-id-calc-secret", "", "Secret to use when calculating user ids")
|
||||
|
||||
// initialization
|
||||
err := cfg.Init(ctx)
|
||||
|
||||
@ -66,10 +57,6 @@ func main() {
|
||||
logger.Fatal(ctx, "initializing", err)
|
||||
}
|
||||
|
||||
ctx = mctx.Annotate(ctx,
|
||||
"chatGlobalRoomMaxMsgs", *chatGlobalRoomMaxMsgs,
|
||||
)
|
||||
|
||||
clock := clock.Realtime()
|
||||
|
||||
powStore := pow.NewMemoryStore(clock)
|
||||
@ -100,19 +87,6 @@ func main() {
|
||||
|
||||
ml := mailinglist.New(mlParams)
|
||||
|
||||
chatGlobalRoom, err := chat.NewRoom(ctx, chat.RoomParams{
|
||||
Logger: logger.WithNamespace("global-chat-room"),
|
||||
Redis: radixClient.Client,
|
||||
ID: "global",
|
||||
MaxMessages: *chatGlobalRoomMaxMsgs,
|
||||
})
|
||||
if err != nil {
|
||||
logger.Fatal(ctx, "initializing global chat room", err)
|
||||
}
|
||||
defer chatGlobalRoom.Close()
|
||||
|
||||
chatUserIDCalc := chat.NewUserIDCalculator([]byte(*chatUserIDCalcSecret))
|
||||
|
||||
postSQLDB, err := post.NewSQLDB(dataDir)
|
||||
if err != nil {
|
||||
logger.Fatal(ctx, "initializing sql db for post data", err)
|
||||
@ -129,8 +103,6 @@ func main() {
|
||||
httpParams.PostAssetStore = postAssetStore
|
||||
httpParams.PostDraftStore = postDraftStore
|
||||
httpParams.MailingList = ml
|
||||
httpParams.GlobalRoom = chatGlobalRoom
|
||||
httpParams.UserIDCalculator = chatUserIDCalc
|
||||
|
||||
logger.Info(ctx, "listening")
|
||||
httpAPI, err := http.New(httpParams)
|
@ -3,17 +3,14 @@ module github.com/mediocregopher/blog.mediocregopher.com/srv
|
||||
go 1.16
|
||||
|
||||
require (
|
||||
github.com/adrg/frontmatter v0.2.0
|
||||
github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21
|
||||
github.com/emersion/go-smtp v0.15.0
|
||||
github.com/gomarkdown/markdown v0.0.0-20220510115730-2372b9aa33e5
|
||||
github.com/google/uuid v1.3.0
|
||||
github.com/gorilla/feeds v1.1.1 // indirect
|
||||
github.com/gorilla/websocket v1.4.2
|
||||
github.com/hashicorp/golang-lru v0.5.4 // indirect
|
||||
github.com/gorilla/feeds v1.1.1
|
||||
github.com/hashicorp/golang-lru v0.5.4
|
||||
github.com/mattn/go-sqlite3 v1.14.8
|
||||
github.com/mediocregopher/mediocre-go-lib/v2 v2.0.0-beta.0.0.20220506011745-cbeee71cb1ee
|
||||
github.com/mediocregopher/radix/v4 v4.0.0-beta.1.0.20210726230805-d62fa1b2e3cb
|
||||
github.com/rubenv/sql-migrate v0.0.0-20210614095031-55d5740dbbcc
|
||||
github.com/stretchr/testify v1.7.0
|
||||
github.com/tilinna/clock v1.1.0
|
||||
@ -22,5 +19,5 @@ require (
|
||||
golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9
|
||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
)
|
@ -1,12 +1,9 @@
|
||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
|
||||
github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
|
||||
github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o=
|
||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||
github.com/adrg/frontmatter v0.2.0 h1:/DgnNe82o03riBd1S+ZDjd43wAmC6W35q67NHeLkPd4=
|
||||
github.com/adrg/frontmatter v0.2.0/go.mod h1:93rQCj3z3ZlwyxxpQioRKC1wDLto4aXHrbqIsnH9wmE=
|
||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||
@ -68,8 +65,6 @@ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
|
||||
github.com/gorilla/feeds v1.1.1 h1:HwKXxqzcRNg9to+BbvJog4+f3s/xzvtZXICcQGutYfY=
|
||||
github.com/gorilla/feeds v1.1.1/go.mod h1:Nk0jZrvPFZX1OBe5NPiddPw7CfwF6Q9eqzaBbaightA=
|
||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
|
||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
@ -117,8 +112,6 @@ github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/mediocregopher/mediocre-go-lib/v2 v2.0.0-beta.0.0.20220506011745-cbeee71cb1ee h1:AWRuhgn7iumyhPuxKwed1F1Ri2dXMwxKfp5YIdpnQIY=
|
||||
github.com/mediocregopher/mediocre-go-lib/v2 v2.0.0-beta.0.0.20220506011745-cbeee71cb1ee/go.mod h1:wOZVlnKYvIbkzyCJ3dxy1k40XkirvCd1pisX2O91qoQ=
|
||||
github.com/mediocregopher/radix/v4 v4.0.0-beta.1.0.20210726230805-d62fa1b2e3cb h1:7Y2vAC5q44VJzbBUdxRUEqfz88ySJ/6yXXkpQ+sxke4=
|
||||
github.com/mediocregopher/radix/v4 v4.0.0-beta.1.0.20210726230805-d62fa1b2e3cb/go.mod h1:ajchozX/6ELmydxWeWM6xCFHVpZ4+67LXHOTOVR0nCE=
|
||||
github.com/mitchellh/cli v1.1.2/go.mod h1:6iaV0fGdElS6dPBx0EApTxHrcWvmJphyh2n8YBLPPZ4=
|
||||
github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
|
||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
@ -167,7 +160,6 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
|
||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/tilinna/clock v1.0.2/go.mod h1:ZsP7BcY7sEEz7ktc0IVy8Us6boDrK8VradlKRUGfOao=
|
||||
github.com/tilinna/clock v1.1.0 h1:6IQQQCo6KoBxVudv6gwtY8o4eDfhHo8ojA5dP0MfhSs=
|
||||
github.com/tilinna/clock v1.1.0/go.mod h1:ZsP7BcY7sEEz7ktc0IVy8Us6boDrK8VradlKRUGfOao=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
@ -252,9 +244,7 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
@ -17,7 +17,6 @@ import (
|
||||
|
||||
lru "github.com/hashicorp/golang-lru"
|
||||
"github.com/mediocregopher/blog.mediocregopher.com/srv/cfg"
|
||||
"github.com/mediocregopher/blog.mediocregopher.com/srv/chat"
|
||||
"github.com/mediocregopher/blog.mediocregopher.com/srv/http/apiutil"
|
||||
"github.com/mediocregopher/blog.mediocregopher.com/srv/mailinglist"
|
||||
"github.com/mediocregopher/blog.mediocregopher.com/srv/post"
|
||||
@ -41,9 +40,6 @@ type Params struct {
|
||||
|
||||
MailingList mailinglist.MailingList
|
||||
|
||||
GlobalRoom chat.Room
|
||||
UserIDCalculator *chat.UserIDCalculator
|
||||
|
||||
// PublicURL is the base URL which site visitors can navigate to.
|
||||
PublicURL *url.URL
|
||||
|
||||
@ -176,16 +172,9 @@ func (a *api) apiHandler() http.Handler {
|
||||
mux.Handle("/mailinglist/finalize", a.mailingListFinalizeHandler())
|
||||
mux.Handle("/mailinglist/unsubscribe", a.mailingListUnsubscribeHandler())
|
||||
|
||||
mux.Handle("/chat/global/", http.StripPrefix("/chat/global", newChatHandler(
|
||||
a.params.GlobalRoom,
|
||||
a.params.UserIDCalculator,
|
||||
a.requirePowMiddleware,
|
||||
)))
|
||||
|
||||
// disallowGetMiddleware is used rather than a MethodMux because it has an
|
||||
// exception for websockets, which is needed for chat.
|
||||
return disallowGetMiddleware(mux)
|
||||
|
||||
return apiutil.MethodMux(map[string]http.Handler{
|
||||
"POST": mux,
|
||||
})
|
||||
}
|
||||
|
||||
func (a *api) blogHandler() http.Handler {
|
@ -155,7 +155,7 @@ func (a *api) postPostAssetHandler() http.Handler {
|
||||
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
||||
|
||||
id := r.PostFormValue("id")
|
||||
if id == "/" {
|
||||
if id == "" {
|
||||
apiutil.BadRequest(rw, r, errors.New("id is required"))
|
||||
return
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user