diff --git a/go.mod b/go.mod index acf4225..9cd30fc 100644 --- a/go.mod +++ b/go.mod @@ -37,6 +37,7 @@ require ( github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7 golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 + golang.org/x/net/http2/h2demo v0.0.0-20190926025831-c00fd9afed17 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 mellium.im/sasl v0.2.1 // indirect ) diff --git a/go.sum b/go.sum index c85ef76..41b5edb 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw= +cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -21,12 +23,14 @@ github.com/adjust/gorails v0.0.0-20171013043634-2786ed0c03d3/go.mod h1:FlkD11Rtg github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= 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/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737 h1:rRISKWyXfVxvoa702s91Zl5oREZTrR3yv+tXrrX7G/g= github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= github.com/brianvoe/gofakeit v3.18.0+incompatible h1:wDOmHc9DLG4nRjUVVaxA+CEglKOW72Y5+4WNxUIkjM8= @@ -41,6 +45,7 @@ github.com/containerd/containerd v1.2.7/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMX github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= @@ -77,11 +82,13 @@ github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk= github.com/garyburd/redigo v1.6.0 h1:0VruCpn7yAIIu7pWVClQC8wxCJEcG3nyzpMSHKi1PQc= github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-pg/pg v8.0.1+incompatible h1:gi93AxXmqlFGT0os5z2kTnbDqCk6BHXnA9MMApVxAkY= @@ -107,28 +114,33 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/googleapis/gax-go/v2 v2.0.4 h1:hU4mGcQI4DaAYW+IbTun+2qEZVFxK0ySjQLTbS0VQKc= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= @@ -177,6 +189,7 @@ github.com/jackc/puddle v1.0.0 h1:rbjAshlgKscNa7j0jAM0uNQflis5o2XUogPMVAwtcsM= github.com/jackc/puddle v1.0.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/tern v1.8.2 h1:+d9eK83fRS0dbf6nt+2tjILYF4FKG1O5xTFB8Lzc66U= github.com/jackc/tern v1.8.2/go.mod h1:AMppp2oyCT6rYnJHLLMmPWwahfFvdIVi6mr9gH81Nxs= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a h1:eeaG9XMUvRBYXJi4pg1ZKM7nxc5AfXfojeLLW7O5J3k= github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= @@ -192,6 +205,7 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -284,6 +298,7 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -300,12 +315,18 @@ github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxt gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE= go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.21.0 h1:mU6zScU4U1YAFPHEHYk+3JC4SY7JxgkqS10ZOSyksNg= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +go4.org v0.0.0-20190218023631-ce4c26f7be8e h1:m9LfARr2VIOW0vsV19kEKp/sWQvZnGobA8JHui/XJoY= +go4.org v0.0.0-20190218023631-ce4c26f7be8e/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +golang.org/x/build v0.0.0-20190509182522-45de920fc22c h1:lgCiAYQNZHWRJOB1au5nVtnBZS1ZmKN1DpViRg23ZZc= +golang.org/x/build v0.0.0-20190509182522-45de920fc22c/go.mod h1:fYw7AShPAhGMdXqA9gRadk/CcMsvLlClpE5oBwnS3dM= golang.org/x/crypto v0.0.0-20151201002508-7b85b097bf75/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180910181607-0e37d006457b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -315,6 +336,7 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90Pveol golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190424203555-c05e17bb3b2d/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734 h1:p/H982KKEjUnLJkM3tt/LemDnOc1GiZL5FCVlORJ5zo= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -339,13 +361,18 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJV golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190502183928-7f726cade0ab/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 h1:fHDIZ2oxGnUZRN6WgWFCbYBjH9uqVPRCUVUDhs0wnbA= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net/http2/h2demo v0.0.0-20190926025831-c00fd9afed17 h1:HLxL0rPmXwnTzaufKhoVoTZppVikFwjiQ2RznVT1hHw= +golang.org/x/net/http2/h2demo v0.0.0-20190926025831-c00fd9afed17/go.mod h1:BwaQRRDNz+WpW5eSSswiThgs7CY09/mjSLOpjZRj6VA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a h1:tImsplftrFpALCYumobsd0K86vlAs/eXGFms2txfJfA= golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -369,6 +396,7 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190426135247-a129542de9ae h1:mQLHiymj/JXKnnjc62tb7nD5pZLs940/sXJu+Xp3DBA= golang.org/x/sys v0.0.0-20190426135247-a129542de9ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456 h1:ng0gs1AKnRRuEMZoTLLlbOd+C17zUDepwGQBb/n+JVg= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -395,6 +423,7 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+y golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.4.0 h1:KKgc1aqhV8wDPbDzlDtpvyjZFY3vjz85FP7p4wcQUyI= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -403,9 +432,13 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 h1:nfPFGzJkUDX6uBmpN/pSw7MbOAWegH5QDQuoXFHedLg= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1 h1:Hz2g2wirWK7H0qIIhGIqRGTuMwTE8HEKFnDZZ7lm9NU= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= @@ -422,6 +455,7 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/serv/cmd.go b/serv/cmd.go index 7af1c36..8a03716 100644 --- a/serv/cmd.go +++ b/serv/cmd.go @@ -35,102 +35,98 @@ var ( qcompile *qcode.Compiler pcompile *psql.Compiler authFailBlock int - - rootCmd *cobra.Command - servCmd *cobra.Command - seedCmd *cobra.Command - migrateCmd *cobra.Command - statusCmd *cobra.Command - newMigrationCmd *cobra.Command - initCmd *cobra.Command ) func Init() { - rootCmd = &cobra.Command{ + logger = initLog() + + rootCmd := &cobra.Command{ Use: "super-graph", Short: "An instant high-performance GraphQL API. No code needed. https://supergraph.dev", - //Run: cmdServ, } - seedCmd = &cobra.Command{ - Use: "seed", - Short: "Run the seed script to seed the database", - Run: cmdSeed, - } - - servCmd = &cobra.Command{ + rootCmd.AddCommand(&cobra.Command{ Use: "serv", Short: "Run the super-graph service", Run: cmdServ, - } + }) - migrateCmd = &cobra.Command{ - Use: "migrate", + rootCmd.AddCommand(&cobra.Command{ + Use: "db:create", + Short: "Create database", + Run: cmdDBCreate, + }) + + rootCmd.AddCommand(&cobra.Command{ + Use: "db:drop", + Short: "Drop database", + Run: cmdDBDrop, + }) + + rootCmd.AddCommand(&cobra.Command{ + Use: "db:seed", + Short: "Run the seed script to seed the database", + Run: cmdDBSeed, + }) + + rootCmd.AddCommand(&cobra.Command{ + Use: "db:migrate", Short: "Migrate the database", Long: `Migrate the database to destination migration version. Destination migration version can be one of the following value types: -An integer: +Migrate to the most recent migration. +e.g. migrate up + +Rollback the most recent migration. +e.g. migrate down + Migrate to a specific migration. -e.g. tern migrate -d 42 +e.g. migrate 42 -"+" and an integer: Migrate forward N steps. -e.g. tern migrate -d +3 +e.g. migrate +3 -"-" and an integer: Migrate backward N steps. -e.g. tern migrate -d -2 +e.g. migrate -2 -"-+" and an integer: Redo previous N steps (migrate backward N steps then forward N steps). -e.g. tern migrate -d -+1 - -The word "last": -Migrate to the most recent migration. This is the default value, so it is -never needed to specify directly. -e.g. tern migrate -e.g. tern migrate -d last +e.g. migrate -+1 `, - Run: cmdMigrate, - } + Run: cmdDBMigrate, + }) - statusCmd = &cobra.Command{ - Use: "status", + rootCmd.AddCommand(&cobra.Command{ + Use: "db:status", Short: "Print current migration status", - Run: cmdStatus, - } + Run: cmdDBStatus, + }) - newMigrationCmd = &cobra.Command{ - Use: "new NAME", + rootCmd.AddCommand(&cobra.Command{ + Use: "db:new NAME", Short: "Generate a new migration", Long: "Generate a new migration with the next sequence number and provided name", - Run: cmdNewMigration, - } + Run: cmdDBNew, + }) - initCmd = &cobra.Command{ - Use: "init APP-NAME", - Short: "Initialize a new application", + rootCmd.AddCommand(&cobra.Command{ + Use: "db:setup", + Short: "Setup database", + Long: "This command will create, migrate and seed the database", + Run: cmdDBSetup, + }) + + rootCmd.AddCommand(&cobra.Command{ + Use: "new APP-NAME", + Short: "Create a new application", Long: "Generate all the required files to start on a new Super Graph app", - Run: cmdInit, - } - - logger = initLog() + Run: cmdNew, + }) rootCmd.Flags().StringVar(&confPath, "path", "./config", "path to config files") - //cmdMigrate.Flags().StringVarP(&cliOptions.destinationVersion, - // "destination", "d", "last", "destination migration version") - - rootCmd.AddCommand(initCmd) - rootCmd.AddCommand(servCmd) - rootCmd.AddCommand(seedCmd) - rootCmd.AddCommand(migrateCmd) - rootCmd.AddCommand(statusCmd) - rootCmd.AddCommand(newMigrationCmd) - if err := rootCmd.Execute(); err != nil { logger.Fatal().Err(err).Send() } @@ -209,11 +205,10 @@ func initConf() (*config, error) { return c, nil } -func initDB(c *config) (*pgx.Conn, error) { +func initDB(c *config, useDB bool) (*pgx.Conn, error) { config, _ := pgx.ParseConfig("") config.Host = c.DB.Host config.Port = c.DB.Port - config.Database = c.DB.DBName config.User = c.DB.User config.Password = c.DB.Password config.RuntimeParams = map[string]string{ @@ -221,6 +216,10 @@ func initDB(c *config) (*pgx.Conn, error) { "search_path": c.DB.Schema, } + if useDB { + config.Database = c.DB.DBName + } + switch c.LogLevel { case "debug": config.LogLevel = pgx.LogLevelDebug diff --git a/serv/cmd_init.go b/serv/cmd_init.go index 9741513..a832151 100644 --- a/serv/cmd_init.go +++ b/serv/cmd_init.go @@ -2,17 +2,19 @@ package serv import ( "bytes" + "fmt" + "io" "io/ioutil" "os" "path" "strings" - "text/template" rice "github.com/GeertJohan/go.rice" "github.com/spf13/cobra" + "github.com/valyala/fasttemplate" ) -func cmdInit(cmd *cobra.Command, args []string) { +func cmdNew(cmd *cobra.Command, args []string) { if len(args) != 1 { cmd.Help() os.Exit(1) @@ -32,8 +34,8 @@ func cmdInit(cmd *cobra.Command, args []string) { return os.Mkdir(p, os.ModePerm) }) - ifNotExists(path.Join(appPath, "seed.js"), func(p string) error { - if v, err := tmpl.get("docker-compose.yml"); err == nil { + ifNotExists(path.Join(appPath, "Dockerfile"), func(p string) error { + if v, err := tmpl.get("Dockerfile"); err == nil { return ioutil.WriteFile(p, v, 0644) } else { return err @@ -72,6 +74,14 @@ func cmdInit(cmd *cobra.Command, args []string) { } }) + ifNotExists(path.Join(appConfigPath, "seed.js"), func(p string) error { + if v, err := tmpl.get("docker-compose.yml"); err == nil { + return ioutil.WriteFile(p, v, 0644) + } else { + return err + } + }) + // Create app migrations folder and add relevant files appMigrationsPath := path.Join(appConfigPath, "migrations") @@ -103,11 +113,14 @@ func newTempl(data map[string]string) *Templ { func (t *Templ) get(name string) ([]byte, error) { v := t.MustString(name) b := bytes.Buffer{} - tm := template.Must(template.New(name).Parse(v)) + tmpl := fasttemplate.New(v, "{%", "%}") - if err := tm.Execute(&b, t.data); err != nil { - return nil, err - } + tmpl.ExecuteFunc(&b, func(w io.Writer, tag string) (int, error) { + if val, ok := t.data[strings.TrimSpace(tag)]; ok { + return w.Write([]byte(val)) + } + return 0, fmt.Errorf("unknown template variable '%s'", tag) + }) return b.Bytes(), nil } diff --git a/serv/cmd_tern.go b/serv/cmd_migrate.go similarity index 73% rename from serv/cmd_tern.go rename to serv/cmd_migrate.go index 2b17499..1591966 100644 --- a/serv/cmd_tern.go +++ b/serv/cmd_migrate.go @@ -34,7 +34,63 @@ var newMigrationText = `-- Write your migrate up statements here -- Then delete the separator line above. ` -func cmdNewMigration(cmd *cobra.Command, args []string) { +func cmdDBSetup(cmd *cobra.Command, args []string) { + cmdDBCreate(cmd, []string{}) + cmdDBMigrate(cmd, []string{"up"}) + cmdDBSeed(cmd, []string{}) +} + +func cmdDBCreate(cmd *cobra.Command, args []string) { + var err error + + if conf, err = initConf(); err != nil { + logger.Fatal().Err(err).Msg("failed to read config") + } + + ctx := context.Background() + + conn, err := initDB(conf, false) + if err != nil { + logger.Fatal().Err(err).Msg("failed to connect to database") + } + defer conn.Close(ctx) + + sql := fmt.Sprintf("create database %s", conf.DB.DBName) + + _, err = conn.Exec(ctx, sql) + if err != nil { + logger.Fatal().Err(err).Msg("failed to create database") + } + + logger.Info().Msgf("created database '%s'", conf.DB.DBName) +} + +func cmdDBDrop(cmd *cobra.Command, args []string) { + var err error + + if conf, err = initConf(); err != nil { + logger.Fatal().Err(err).Msg("failed to read config") + } + + ctx := context.Background() + + conn, err := initDB(conf, false) + if err != nil { + logger.Fatal().Err(err).Msg("failed to connect to database") + } + defer conn.Close(ctx) + + sql := fmt.Sprintf("drop database if exists %s", conf.DB.DBName) + + _, err = conn.Exec(ctx, sql) + if err != nil { + logger.Fatal().Err(err).Msg("failed to create database") + } + + logger.Info().Msgf("dropped database '%s'", conf.DB.DBName) +} + +func cmdDBNew(cmd *cobra.Command, args []string) { if len(args) != 1 { cmd.Help() os.Exit(1) @@ -73,14 +129,21 @@ func cmdNewMigration(cmd *cobra.Command, args []string) { logger.Info().Msgf("created migration '%s'", mpath) } -func cmdMigrate(cmd *cobra.Command, args []string) { +func cmdDBMigrate(cmd *cobra.Command, args []string) { var err error + if len(args) == 0 { + cmd.Help() + os.Exit(1) + } + + dest := args[0] + if conf, err = initConf(); err != nil { logger.Fatal().Err(err).Msg("failed to read config") } - conn, err := initDB(conf) + conn, err := initDB(conf, true) if err != nil { logger.Fatal().Err(err).Msg("failed to connect to database") } @@ -90,7 +153,8 @@ func cmdMigrate(cmd *cobra.Command, args []string) { if err != nil { logger.Fatal().Err(err).Msg("failed to initializing migrator") } - //m.Data = config.Data + + m.Data = getMigrationVars() err = m.LoadMigrations(conf.MigrationsPath) if err != nil { @@ -113,7 +177,6 @@ func cmdMigrate(cmd *cobra.Command, args []string) { os.Exit(1) } - dest := args[0] mustParseDestination := func(d string) int32 { var n int64 n, err = strconv.ParseInt(d, 10, 32) @@ -123,9 +186,12 @@ func cmdMigrate(cmd *cobra.Command, args []string) { return int32(n) } - if dest == "last" { + if dest == "up" { err = m.Migrate() + } else if dest == "down" { + err = m.MigrateTo(currentVersion - 1) + } else if len(dest) >= 3 && dest[0:2] == "-+" { err = m.MigrateTo(currentVersion - mustParseDestination(dest[2:])) if err == nil { @@ -139,7 +205,8 @@ func cmdMigrate(cmd *cobra.Command, args []string) { err = m.MigrateTo(currentVersion + mustParseDestination(dest[1:])) } else { - //err = make(type, 0).MigrateTo(mustParseDestination(dest)) + cmd.Help() + os.Exit(1) } if err != nil { @@ -168,14 +235,14 @@ func cmdMigrate(cmd *cobra.Command, args []string) { } -func cmdStatus(cmd *cobra.Command, args []string) { +func cmdDBStatus(cmd *cobra.Command, args []string) { var err error if conf, err = initConf(); err != nil { logger.Fatal().Err(err).Msg("failed to read config") } - conn, err := initDB(conf) + conn, err := initDB(conf, true) if err != nil { logger.Fatal().Err(err).Msg("failed to connect to database") } @@ -185,7 +252,8 @@ func cmdStatus(cmd *cobra.Command, args []string) { if err != nil { logger.Fatal().Err(err).Msg("failed to initialize migrator") } - //m.Data = config.Data + + m.Data = getMigrationVars() err = m.LoadMigrations(conf.MigrationsPath) if err != nil { @@ -247,3 +315,11 @@ func ExtractErrorLine(source string, position int) (ErrorLineExtract, error) { return ele, nil } + +func getMigrationVars() map[string]interface{} { + return map[string]interface{}{ + "app_name": strings.Title(conf.AppName), + "app_name_slug": strings.ToLower(strings.Replace(conf.AppName, " ", "_", -1)), + "env": strings.ToLower(os.Getenv("GO_ENV")), + } +} diff --git a/serv/cmd_seed.go b/serv/cmd_seed.go index bb39d37..3aaa35d 100644 --- a/serv/cmd_seed.go +++ b/serv/cmd_seed.go @@ -14,7 +14,7 @@ import ( "github.com/spf13/cobra" ) -func cmdSeed(cmd *cobra.Command, args []string) { +func cmdDBSeed(cmd *cobra.Command, args []string) { var err error if conf, err = initConf(); err != nil { diff --git a/serv/serv.go b/serv/serv.go index 15a3e49..fa26f0a 100644 --- a/serv/serv.go +++ b/serv/serv.go @@ -133,9 +133,12 @@ func getConfigName() string { case strings.HasPrefix(ge, "tes"): return "test" + + case strings.HasPrefix(ge, "dev"): + return "dev" } - return "dev" + return ge } func getAuthFailBlock(c *config) int { diff --git a/tmpl/100_init.sql b/tmpl/100_init.sql index be5deb1..2f1436f 100644 --- a/tmpl/100_init.sql +++ b/tmpl/100_init.sql @@ -1,6 +1,6 @@ -- Write your migrate up statements here -CREATE DATABASE {{ .app_name_slug }}_database +CREATE DATABASE {{ .app_name_slug }}_{{ .env }} -- CREATE TABLE public.users ( -- id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY, @@ -18,4 +18,4 @@ CREATE DATABASE {{ .app_name_slug }}_database -- DROP TABLE public.users -DROP DATABASE IF EXISTS {{ .app_name_slug }}_database +DROP DATABASE IF EXISTS {{ .app_name_slug }}_{{ .env }} diff --git a/tmpl/Dockerfile b/tmpl/Dockerfile new file mode 100644 index 0000000..93c6c1d --- /dev/null +++ b/tmpl/Dockerfile @@ -0,0 +1,4 @@ +FROM dosco/super-graph:latest +WORKDIR / + +COPY config/* /config/ \ No newline at end of file diff --git a/tmpl/dev.yml b/tmpl/dev.yml index 346e84f..8a5bee6 100644 --- a/tmpl/dev.yml +++ b/tmpl/dev.yml @@ -1,4 +1,4 @@ -app_name: "{{ .app_name }} Development" +app_name: "{% app_name %} Development" host_port: 0.0.0.0:8080 web_ui: true @@ -84,7 +84,7 @@ database: type: postgres host: db port: 5432 - dbname: {{ .app_name_slug }}_database + dbname: {% app_name_slug %}_development user: postgres password: '' diff --git a/tmpl/docker-compose.yml b/tmpl/docker-compose.yml index d89773c..6d0406c 100644 --- a/tmpl/docker-compose.yml +++ b/tmpl/docker-compose.yml @@ -5,7 +5,7 @@ services: ports: - "5432:5432" - {{ .app_name_slug }}_api: + {% app_name_slug %}_api: image: dosco/super-graph:latest environment: GO_ENV: "development" diff --git a/tmpl/prod.yml b/tmpl/prod.yml index dc36a87..3f60b5c 100644 --- a/tmpl/prod.yml +++ b/tmpl/prod.yml @@ -1,4 +1,4 @@ -app_name: "{{ .app_name }} Production" +app_name: "{% app_name %} Production" host_port: 0.0.0.0:8080 web_ui: false @@ -80,7 +80,7 @@ database: type: postgres host: db port: 5432 - dbname: {{ .app_name_slug }}_database + dbname: {% app_name_slug %}_production user: postgres password: '' #pool_size: 10