From b893fd05770996e76cb3f3f84fe1fd2e346760e1 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Thu, 13 Sep 2018 11:40:45 +0200 Subject: [PATCH 01/85] start work on traefik integration the generator --- docker-compose-generator/src/Program.cs | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/docker-compose-generator/src/Program.cs b/docker-compose-generator/src/Program.cs index 9d0d293..9f028d1 100644 --- a/docker-compose-generator/src/Program.cs +++ b/docker-compose-generator/src/Program.cs @@ -19,7 +19,7 @@ namespace DockerGenerator var productionLocation = Path.GetFullPath(Path.Combine(root, "Production")); var testLocation = Path.GetFullPath(Path.Combine(root, "Production-NoReverseProxy")); - foreach(var proxy in new[] { "nginx", "no-reverseproxy" }) + foreach(var proxy in new[] { "nginx", "no-reverseproxy", "traefik", "emit-traefik-labels" }) { foreach(var lightning in new[] { "clightning", "" }) { @@ -40,7 +40,7 @@ namespace DockerGenerator composition.SelectedCryptos.Add(ltc); composition.SelectedLN = lightning; composition.SelectedProxy = proxy; - new Program().Run(composition, name, proxy == "nginx" ? productionLocation : testLocation); + new Program().Run(composition, name, new string[] {"nginx", "traefik"}.Contains(proxy)? productionLocation : testLocation); } } } @@ -67,13 +67,21 @@ namespace DockerGenerator fragmentLocation = Path.GetFullPath(Path.Combine(fragmentLocation, "docker-fragments")); var fragments = new List(); - if(composition.SelectedProxy == "nginx") + switch (@composition.SelectedProxy) { - fragments.Add("nginx"); - } - else - { - fragments.Add("btcpayserver-noreverseproxy"); + case "nginx": + + fragments.Add("nginx"); + break; + case "traefik": + + fragments.Add("traefik"); + break; + case "emit-traefik-labels": + case "no-reverseproxy": + + fragments.Add("btcpayserver-noreverseproxy"); + break; } fragments.Add("btcpayserver"); foreach(var crypto in CryptoDefinition.GetDefinitions()) From 16cd65c37fbcb790477867b3c733399208280df1 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Thu, 13 Sep 2018 13:18:36 +0200 Subject: [PATCH 02/85] add in fragments and additional fragments related to traefik --- .../docker-fragments/traefik-labels.yml | 10 +++++++ .../docker-fragments/traefik.yml | 21 ++++++++++++++ .../src/DockerComposition.cs | 9 ++++++ docker-compose-generator/src/Program.cs | 9 +++--- .../src/docker-compose-generator.csproj | 29 +++++++++++++++++++ 5 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 docker-compose-generator/docker-fragments/traefik-labels.yml create mode 100644 docker-compose-generator/docker-fragments/traefik.yml diff --git a/docker-compose-generator/docker-fragments/traefik-labels.yml b/docker-compose-generator/docker-fragments/traefik-labels.yml new file mode 100644 index 0000000..e98062e --- /dev/null +++ b/docker-compose-generator/docker-fragments/traefik-labels.yml @@ -0,0 +1,10 @@ +version: "3" + +services: + btcpayserver: + labels: + - "traefik.backend=btcpayserver" + - "traefik.backend.loadbalancer.sticky=true" + - "traefik.enable=true" + - "traefik.frontend.rule=Host:${BTCPAY_HOST}" + - "traefik.port.rule=49392" diff --git a/docker-compose-generator/docker-fragments/traefik.yml b/docker-compose-generator/docker-fragments/traefik.yml new file mode 100644 index 0000000..a470f24 --- /dev/null +++ b/docker-compose-generator/docker-fragments/traefik.yml @@ -0,0 +1,21 @@ +version: "3" + +services: + traefik: + restart: unless-stopped + image: traefik + container_name: traefik + ports: + - "80:80" + - "443:443" + volumes: + - "/var/run/docker.sock:/var/run/docker.sock" + - "./traefik.toml:/traefik.toml" + - "./acme.json:/acme.json" + - "./servers.toml:/servers.toml" + - "./traefik_logs:/traefik_logs" + links: + - btcpayserver + +volumes: + traefik_logs: \ No newline at end of file diff --git a/docker-compose-generator/src/DockerComposition.cs b/docker-compose-generator/src/DockerComposition.cs index b9c8f9d..65f4256 100644 --- a/docker-compose-generator/src/DockerComposition.cs +++ b/docker-compose-generator/src/DockerComposition.cs @@ -42,6 +42,15 @@ namespace DockerGenerator composition.SelectedProxy = (Environment.GetEnvironmentVariable("BTCPAYGEN_REVERSEPROXY") ?? "").ToLowerInvariant(); composition.SelectedLN = (Environment.GetEnvironmentVariable("BTCPAYGEN_LIGHTNING") ?? "").ToLowerInvariant(); composition.AdditionalFragments = (Environment.GetEnvironmentVariable("BTCPAYGEN_ADDITIONAL_FRAGMENTS") ?? "").ToLowerInvariant().Split(';').Where(t => !string.IsNullOrWhiteSpace(t)).ToArray(); + if (composition.SelectedProxy == "traefik" && !composition.AdditionalFragments.Contains("traefik-labels")) + { + var additionalFragments = new List(); + additionalFragments.AddRange(composition.AdditionalFragments); + additionalFragments.Add("traefik-labels"); + + composition.AdditionalFragments = additionalFragments.ToArray(); + } + return composition; } } diff --git a/docker-compose-generator/src/Program.cs b/docker-compose-generator/src/Program.cs index 9f028d1..07fbb35 100644 --- a/docker-compose-generator/src/Program.cs +++ b/docker-compose-generator/src/Program.cs @@ -19,7 +19,7 @@ namespace DockerGenerator var productionLocation = Path.GetFullPath(Path.Combine(root, "Production")); var testLocation = Path.GetFullPath(Path.Combine(root, "Production-NoReverseProxy")); - foreach(var proxy in new[] { "nginx", "no-reverseproxy", "traefik", "emit-traefik-labels" }) + foreach(var proxy in new[] { "nginx", "no-reverseproxy", "traefik" }) { foreach(var lightning in new[] { "clightning", "" }) { @@ -40,6 +40,10 @@ namespace DockerGenerator composition.SelectedCryptos.Add(ltc); composition.SelectedLN = lightning; composition.SelectedProxy = proxy; + if (composition.SelectedProxy == "traefik") + { + composition.AdditionalFragments = new []{"traefik-labels"}; + } new Program().Run(composition, name, new string[] {"nginx", "traefik"}.Contains(proxy)? productionLocation : testLocation); } } @@ -74,12 +78,9 @@ namespace DockerGenerator fragments.Add("nginx"); break; case "traefik": - fragments.Add("traefik"); break; - case "emit-traefik-labels": case "no-reverseproxy": - fragments.Add("btcpayserver-noreverseproxy"); break; } diff --git a/docker-compose-generator/src/docker-compose-generator.csproj b/docker-compose-generator/src/docker-compose-generator.csproj index ba248d8..f9be2ab 100644 --- a/docker-compose-generator/src/docker-compose-generator.csproj +++ b/docker-compose-generator/src/docker-compose-generator.csproj @@ -10,4 +10,33 @@ + + + + + + + + + + + + + + + + + + + + + + opt-save-storage.yml + + + nginx.yml + + + + From 34e263d12b9da90350b0a4a2dcd529e3139cda5a Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Thu, 13 Sep 2018 13:35:20 +0200 Subject: [PATCH 03/85] traefik specific labels and files --- Generated/.gitignore | 3 +- Production/traefilk.toml | 35 +++++++++++++++++++ build.ps1 | 4 +++ build.sh | 8 +++++ .../docker-fragments/traefik-labels.yml | 2 ++ .../docker-fragments/traefik.yml | 11 +++--- 6 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 Production/traefilk.toml diff --git a/Generated/.gitignore b/Generated/.gitignore index 5c11526..d3ac46f 100644 --- a/Generated/.gitignore +++ b/Generated/.gitignore @@ -1,2 +1,3 @@ *.yml -*.tmpl \ No newline at end of file +*.tmpl +*.toml \ No newline at end of file diff --git a/Production/traefilk.toml b/Production/traefilk.toml new file mode 100644 index 0000000..25f823a --- /dev/null +++ b/Production/traefilk.toml @@ -0,0 +1,35 @@ +defaultEntryPoints = ["https","http"] + +logLevel="ERROR" + +[entryPoints] + useXForwardedFor = true + [entryPoints.http] + address = ":80" + [entryPoints.http.redirect] + entryPoint = "https" + [entryPoints.https] + address = ":443" + [entryPoints.https.tls] + +[retry] + +[docker] +endpoint = "unix:///var/run/docker.sock" +watch = true +exposedByDefault = false + +[acme] +storage = "acme.json" +entryPoint = "https" +onHostRule = true +[acme.httpChallenge] +entryPoint = "http" + +[traefikLog] + filePath = "/traefik_logs/traefik.log" + format = "json" + +[accessLog] + filePath = "/traefik_logs/access.log" + format = "json" \ No newline at end of file diff --git a/build.ps1 b/build.ps1 index 840d9a4..2eb4277 100755 --- a/build.ps1 +++ b/build.ps1 @@ -21,3 +21,7 @@ docker run -v "$(Get-Location)\Generated:/app/Generated" ` If ($BTCPAYGEN_REVERSEPROXY -eq "nginx") { Copy-Item ".\Production\nginx.tmpl" -Destination ".\Generated" } + +If ($BTCPAYGEN_REVERSEPROXY -eq "traefik") { + Copy-Item ".\Production\traefik.toml" -Destination ".\Generated" +} diff --git a/build.sh b/build.sh index 62b1a65..bc66030 100755 --- a/build.sh +++ b/build.sh @@ -22,3 +22,11 @@ docker run -v "$(pwd)/Generated:/app/Generated" \ if [ "$BTCPAYGEN_REVERSEPROXY" == "nginx" ]; then cp Production/nginx.tmpl Generated/nginx.tmpl fi + +if [ "$BTCPAYGEN_REVERSEPROXY" == "traefik" ]; then + cp Production/traefik.toml Generated/traefik.toml +fi + + + + diff --git a/docker-compose-generator/docker-fragments/traefik-labels.yml b/docker-compose-generator/docker-fragments/traefik-labels.yml index e98062e..e361858 100644 --- a/docker-compose-generator/docker-fragments/traefik-labels.yml +++ b/docker-compose-generator/docker-fragments/traefik-labels.yml @@ -8,3 +8,5 @@ services: - "traefik.enable=true" - "traefik.frontend.rule=Host:${BTCPAY_HOST}" - "traefik.port.rule=49392" + - "traefik.acme.domains=${BTCPAY_HOST},www.${BTCPAY_HOST}" + - "traefik.acme.email=${LETSENCRYPT_EMAIL}" diff --git a/docker-compose-generator/docker-fragments/traefik.yml b/docker-compose-generator/docker-fragments/traefik.yml index a470f24..f1fd316 100644 --- a/docker-compose-generator/docker-fragments/traefik.yml +++ b/docker-compose-generator/docker-fragments/traefik.yml @@ -9,11 +9,12 @@ services: - "80:80" - "443:443" volumes: - - "/var/run/docker.sock:/var/run/docker.sock" - - "./traefik.toml:/traefik.toml" - - "./acme.json:/acme.json" - - "./servers.toml:/servers.toml" - - "./traefik_logs:/traefik_logs" + - "/var/run/docker.sock:/var/run/docker.sock" + - "./traefik.toml:/traefik.toml" + - "./acme.json:/acme.json" + - "./servers.toml:/servers.toml" + - "./traefik_logs:/traefik_logs" + links: - btcpayserver From de0eacb35cfb70bf11cfa580a8b1fa55b01fe006 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Thu, 13 Sep 2018 19:41:22 +0200 Subject: [PATCH 04/85] fixes --- Production/{traefilk.toml => traefik.toml} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename Production/{traefilk.toml => traefik.toml} (93%) diff --git a/Production/traefilk.toml b/Production/traefik.toml similarity index 93% rename from Production/traefilk.toml rename to Production/traefik.toml index 25f823a..e54e954 100644 --- a/Production/traefilk.toml +++ b/Production/traefik.toml @@ -1,6 +1,6 @@ defaultEntryPoints = ["https","http"] -logLevel="ERROR" +logLevel = "ERROR" [entryPoints] useXForwardedFor = true @@ -32,4 +32,4 @@ entryPoint = "http" [accessLog] filePath = "/traefik_logs/access.log" - format = "json" \ No newline at end of file + format = "json" From 72912fabe6c83ca747636243c6181266d54b1438 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 16 Sep 2018 11:18:44 +0200 Subject: [PATCH 05/85] more work on traefik --- Production-NoReverseProxy/README.md | 2 +- Production-Traefik/Production.png | Bin 0 -> 54471 bytes Production-Traefik/README.md | 73 ++++++++++++++++++ Production-Traefik/traefik.toml | 35 +++++++++ build-pregen.ps1 | 1 + build-pregen.sh | 1 + build.ps1 | 2 +- build.sh | 2 +- .../docker-fragments/btcpayserver-nginx.yml | 15 ++++ .../docker-fragments/btcpayserver.yml | 31 +------- .../docker-fragments/nbxplorer.yml | 17 ++++ .../docker-fragments/postgres.yml | 11 +++ .../src/DockerComposition.cs | 9 --- docker-compose-generator/src/Program.cs | 23 +++--- 14 files changed, 170 insertions(+), 52 deletions(-) create mode 100644 Production-Traefik/Production.png create mode 100644 Production-Traefik/README.md create mode 100644 Production-Traefik/traefik.toml create mode 100644 docker-compose-generator/docker-fragments/btcpayserver-nginx.yml create mode 100644 docker-compose-generator/docker-fragments/nbxplorer.yml create mode 100644 docker-compose-generator/docker-fragments/postgres.yml diff --git a/Production-NoReverseProxy/README.md b/Production-NoReverseProxy/README.md index 25de599..eb2ec15 100644 --- a/Production-NoReverseProxy/README.md +++ b/Production-NoReverseProxy/README.md @@ -1,6 +1,6 @@ # About those pre-generated docker-compose -All `docker-compose` files in this folder are generated by running the [build-pregen.sh](build-pregen.sh) (or [build-pregen.ps1](build-pregen.ps1)) script from the fragments located in [docker-compose-generator/docker-fragments](docker-compose-generator/docker-fragments). +All `docker-compose` files in [Production](Production), [Production-NoReverseProxy](Production-NoReverseProxy) and [Production-Traefik](Production-Traefik) are generated by running the [build-pregen.sh](build-pregen.sh) (or [build-pregen.ps1](build-pregen.ps1)) script from the fragments located in [docker-compose-generator/docker-fragments](docker-compose-generator/docker-fragments). The pre-generated `docker-compose` files only cover `btc`, `ltc`, `clightning` without reverse proxy. diff --git a/Production-Traefik/Production.png b/Production-Traefik/Production.png new file mode 100644 index 0000000000000000000000000000000000000000..6a27ef0f07c2bc17ce1637587bc6d0adbee441cc GIT binary patch literal 54471 zcmdSAXH-*N*EWiJD+&TC2qH~IdX*|&L_~TA>Cy?khfpmb0sX@AJ;sz6kZdR4bpD_zx-n>t13%GR1r;zGrtM^e#iBlfd>&0 zdB@eywQiRJE8rrnr~G?QZ5JC)u(`W6k*hh#*^}4V+VhDJFF)@Kv9XCtV9=PT;u~2V zAJgr*oBrBst=;=ky{RriAL#Bf{eEHoWro8lb#_UXRQUNPU42kZO(pFbum_@#_g_J8Tzz?TGe_*- z3!4A87YY=IS{RZmrFgAv^~xe#DS=ybNPs)pAO6iZsJ}JtP3{x@Rlzm(TQG~*S<9bP z;O`pkKhQ)^e)LgF%C&fs7OgNMzkM~*kVv&8@fkyne8O(y zZ+Kk#*_Ond78t`W^Uj0lUfd6~WBtu>@Eu$aPl4L2!y%3&8d8$ye|}!=iScSr!!c-R zE^vDr%bw+Ao1r>0@pJ2xIIhZI6d;=n$A5<;pvg?GJ2c!1DB98Ry)oIQZhS-LIAT5i zhYd$;K8eGX5apf%`_70#JIj(abr>qJx$NC>86x&|a{4qsEc`n`c~PNd$z)l}ThXfG zPXjRiRnR++;b$D&OB*IG(GhBl6H$yJYF#2YN2wKDc1S?Tfi^dM>nsGEIh$K~T0bU5 zwGg*RwLEh}s-RZ+1KI9xk+_4iQH|Qyz*NJeqx54v2iAdg&Ag@JULSCSQgV~Kv`x-K zAI|NKEeTUQGd%Vg>sxo8ESPjEI=zljzyN#Yu)+QEs#Fw@xn@DyEkc zouJ_O?u-CIrsi>XoLWAmw|kh%loz`o1E|cKmKydi|iv_%nrPD7NLV#6W%x9NNt$5Kpv9@F}60~ zkt0dy>aUlb=(zshr`B6bAis{e&!kj0|J?Xk$)O4r48IPtpFp*(YvPC>jC+!nm2bPF zG8$8ENc%h%e)s+s@HA<}AaeQbQjDS6lwz-guyyp&0-GaV%v{VZ(bQ|u>uhRgQq=U@ z0l9jl(m~acB)+i|U-8gmJH^`(88zEj)^iXd$eZz9DIFa`GFs(A+^zEA>0p8u6Pd{k z8BKQg;49PDc$OnZ1*<-fn=XKdvhKP`gJ>><#3%R;F!Ni)Y&*OGsR)%~&_zN2Gzlpc z$!u!k^bT?okfwsu^a(aEphI-j2SdxZy(pEeqMQ^tDjBXGk#6eBFC&reMBev~AVg!e z)*uyz>*c9WQ;H+)VA*3%k~H~646MxZ8Y&m#(I2I8&FmEGW0N(k<%S<&3tVuK_KmQ= zM{0@mjxej$lHziiCTw|!?`|cRVk_OJmsbZd4#Zs^AT`?Npn+Ns<>)ErR{w>=uDRyP zvN8#iGD;-OcOh@bE4f8N7dT`?S9PrHhLT4Gj&2`p~zYcS{pRyw9F}PP^x8xV*9w zlHB(L9k!u2pUD%E4#qsz=@(qx`h4BLNCq&L!YA;|o-=C&4tU`&kI@jpd(Xunw$w&R zk=zOBm3q0E?zQ*ysUW3k_zaX`^tg3bJL8@fx8RE}hAB2$iQ00rJFO2f)G6`5p7!<* z_4lZfDDPDrHPzxJ>u$xzn$~~WYIUr@Z`F6RtOaM(H+`pvrpL$8q9`#we=w`a8*!(O z5iB_{9o8zpQ`i29Qtfd)P@*O{(h@Is~2Y#xu%`n+ngsLO1{%BNHl*=yh^zra9ze6hYL z!UWe$C+ai<^Q&tNB{oV}MWIYu+~vj0JMvWhR8_xx`7+&1o0ODiW8(-Hns7ndIh)7) z`0)xna^4)^zs`$l?%QAZN~RFapscDa;fJB$p)e98^KJ4w#z?szuJ6p&S*|QkvFeNr zPR+M8o3C^!YUka3Bvhcj(9*4zat|ZO4rduH_%Q|I{ltW@vW~%KKb>2rJy*4#U@_+e zluMFgls^2oP(F1&IkmIz@%AVbfo^r2BRGtFa_X}PU!hBON<$tWv|xO_D;|P(U-H7E z;R4E$YSan-#{(yMq2puC=o@*Rga@w=ZZX$#{KpiO6yin`OzC(s_n1s+Iq1R>e76Hk=Sh|pe1&P zPh#`ca;@_Hw6(N+k1?v?=F53M&s{o~R+B0{o^Vhtx1y5LV{w0I-dB9l7Ir!U0Q z&C)F`Op|4*TRDw(P53Ul$kx-(4e6LHAsPSG+jE_@#p0#`mq)yFjoJ$o^pdB9c}Qrf zftbDjp=Pm&lMOsc?%|;K&#>@t!@5AJIeBb|!X-MnSg)KKGa&;pSm?fj3N&fWu4*WO$SO#%}NV3jKc zO(w6PfG`bspWWr)(j*%jAMHC{r0aN{BMq(otUj8avn=D)DpSCoac zh%V_g+Bk+~0PqnXM`ZyR#rDI576@C%?7RF+dA38wgEK~|^VupM=U*Qn=ejg`PSxb%zWU*c1K z93CEKc7!5!gxDdVVeu_d$43tyygo5)bz33K2PRWnfh!(rom3%A-o5vES(>ib!|J*f zbTrQ7dy?09fW;EX+vu|1{LiIFyfM<1_Wkhgxwz19RGQaa`qxn+P^(X=ygLwV_r*;M(O0 z=+cvh=QTJ$rJ>JhI zCVu)GJPy57*53D=%!|AlS_>vjIjK8J#pmm4gj~q%HP`H9&3!W3sNmRs`(TICZM7}{ zon4z^3j z$#I7XdNJR_kGU+?1<~a$uJ3yE;mKUgM=LV`Mx8A17#V2`R=KoXsIAY~j~4|U-k0!A zg+ga)1N`*bN=geI3cr*aH*>})i8{|5o+rC-?xGIPe9P%ZZy88RK;NbbpJB|j< zpTiWZ%3JfsS@U!5(o6n|uXCLQB)%$hYPoqR$%#l2Pd>KAAYq>U09>6UC7Cn^N=ZsK z4XMjis3OE$UFK%S$B#1Nbx)WAHRj(pnl=L=z-cfD|T zw#uBH9c9AaLj6KSn$UQIP@ax*8OW0XpJQ&8txE8FI;A}ewu-TAx*OTutBRk43xU(g zU<0_%(y0GGiRh?qrgt78*<<^kDgX*H#6V>mIuJC6aqA6R{x#Rn!Cqgx^!aSPG&Fx( zHIh?Y9OFMT@4j3nNJ?S-m&Qbb56N@7{j;N*v$)W2t~7$YdCeM~26X}L_lv9{qT{#{ zR~6}_<|QQO;?P&*h(o77;dUnh;U}%9ef%pDSpr3C6?%^RWN~S_6d~1q>@-u?3c=d= z`uduhnyRU(>FMbKUN=e5cK&klM!1QRY0+l7LX?V%3bzKkfS_QV(*iySw_M(YKX-6x z5er;?W9anS!eZ_g+0->JB_r?eDHFflu;{Vs>K7|r6;7JFl>l<7wwylWQ1m%+UqP!* zU=HIGa>ax))h^GYnPkXGDF`Kslrv<8;nex%hXFN{rgY-|FO6#1;h>mXWRAS1Im?NC zRu977@Fps}l`qVLBx2@3_kD9hDVS^sBOi}rO<&_)xXj~jl1{ClYLB|;=KPNR57+NY z%_Ey6eMhHi-|Y*vqQzJzc)QJaU{NfNx*=xL3 zcZi5Syadka{;2=`U>4KfIrdF#})(somNCs2B)nfSkC(|y@o zpOLZHW#drfe<25sW4aTU81Ls%RdX}wseHr>qf&xcrsTEM$8$EQLb+IQw=~bW@yYFz z;gwdSU(xdxgQ@G4h&8CuC*zmTnO0~ZR_D@)`}UwTK>sVf943Yjk1h$9LkGi8#}A)V z)dbs^gPUf@kyHriy`ENDBVrEY6wHSBP=K~zZ!&QTBR z-rJtur(_EjD%UIZo@=0FRbBS}DdVVKhbaC`$);YJ^td|j%r@w#q`A7AK<$m6#&svB zd0jGZ`UV$xL*x?MpwdeWqm?fISJ0SwI~|?O0UzR#N{LTtcg}g+)O38e^M%(L05Xz% zV#N#sYauUhX|S6uSe2Go_3c+FlWPZsN*?Q{Ek8g%@bt`cb^hM@%PBNyHaV5snB?my z?)>dmm2yd(TltUPT}<;^x1f(EDQ>vIP-17UAz5`2mH=ZlVv~SMuB={mtN?An>f3Q^^A|(2vaG^lc|Mj065)$4P z;&W505qxj)2c+OdT)e)xH)eZv^-YYbAV?}Z@J!xkcY~|k|6n6uzsxlEAsU6cyx48s z?xJuQd&F-yOk)<%DR5brBv{x4Qm@}GGYjgg2K5OMiXhlSPmGK(eRZV;NbN{HB08Pl zeD3_Hc(P==#Ztk}&JHk8O=#;u-$|*Fgt%C0tE>6mZ}UD=!a=f&Ub)G|gx~H+G!kK9 z@w!pfZAivgwPCbr{=oDo;iRPEw?eVk95*K5QYh;am|e7+r=ZMXvAexO`yiLE|7a25 zSe#S8ZP=(uiNltN-QMa3VuelZx8-cyh?L*Se61z%2{RKWxz5>oVY1XLXsyg-q1LXQ z^DIc%0c!Amm;~e@XbZOxoxrWeo{>`H1iZN~-(?4MM`3Artw4CE{)BwB^uU$UI`+bi z?jfki5f+=>N%1gG44&_|Vf_k7E7*^foE_CI%-2H%MR+mYEdd502z_73@MS2Iw9CYH zGlk4*?dfK*OUuy&6BeB+6_nOo_JIO&`t3f>ay$z#nAXp9>D(Kt3w+{;KH+u2^kMb6 zFLd3x+q^z`mxkh3o`df{o@3Q!^TXr&7$i#J(QdJ`o;EC^+Q-yelZsIwUrCRVJW<(N zw03G(2qht$-PFMWrBI*CmgFt_!BtkeB5m@`H#PSxOy+nk=Z?O3qOw)uWJ;i&q8r~| z@M{h3QdysijryIjL$&UmxV5})=`eADfb=9^sEq&NH)Rie1D8(L4PuHxL<0KD*Snf| zXWcdS5MN)ClYP*9u92uUbkbpJxC7yVK*N#d2lnIZTYr0FnWm-#G@8YEF4_rr1rC)? z6+s!oLBGQBaX{dCn9*LmKHy-!wCa`RJj~0r zMq!HdBE84EClmGhN1Fhjp)+4yF944x9-}oRz_4q&h!oagOmjQa;2QPP&{~psz`1r1 z!Kls!@vQm*=Ba-1+j6qg?xIc)M9SM#>t+Y;O+=7wV`Ga zRY8IK>6Fy1do+B6_=}I3TXdz^su0Unhyg60hM`i%T^-U#(s{YGk+)qS=7nnyYy83} z&7pC7mb4n1txsx`U0aX`i>?D7L4^xdIdnPHB|JC(4)*HF*L^=nC1z!#)BTs%SDz!h z^C8K#PVu1m#j2r#Uu!(?+m66B_E%BcfehjMx9>OrBJ@oIj*dhZa&Xp8bIrEuBq+C) zZV#D*#8;W$@*lE3e_m}rn{X3csxDJgQ2`??UIS;Onx#1G>zf5&=fL{7BYmGYZ?f}L zrw5?v{uaGKtTE$D9mclU3oH;63gL0sgi^x*L=z<1wAoIoqN1XY($G%hyv}YsoYiB) z#bUJDK(J9E+K%NgJft?uUn79{?jmE6NUkEbq2G7hXrj0?&pEb?+~ZpSH#gvCiBQ*o zeA9bq)zBs6L!fq2lYt_wZ6f{gZ?~)_o4R-I*xl`xWiTR^p)1c+EfUSEJIMRAjzM8Wo#O+Hnc1h2mFoNH88dMTmpl)-co8ONn^J1RRW2#6*G;Ah$BivbwLvpHEa zb$FEum;VLm)9d}yset}F5^#m$T!^tT(pD9!!Coa@rd^&E+DD8Qgu!4z1IY>-1EWpn z3QQ)=fhP6Qt&fyf@>D?v&SXH4g%Vu=Lc2(MDQJWV{{891&MX3f=*FLOMfgGATH}IT zS}!koB+o#KgU?3$&8 z#f;Z>&yH@5{cgbN612tv9*5wJrjF8vZG$1=0lw4Xm8Fff>SmO*Ol7wViZ zcN@I=#sdLY5?WGX$1*Q1eJE8L%;JYl;JI=A228#JgnQ` z?`c3>OE-ZCES&*qv5x{kTI~K)_*umB8JyQMiQK(6u1U!K(;MTYRd4D;=#!n?oG#Cr zzGn^Lb<*IkL4&Dj($3wPy^V+!t?5Y5Vr*fk&MKh7?{Ssm=jAILoLq+u+wOLKX+RQ; zb4YJUu|IF}hEURZGH1H?E7SKoXVVZG{q(HV94mcQY)VQB5Qb@g8O`_*fK3Hc^O({z z@fo|vWCqOI+AD!IgAgAkUr}NFjt541HvqV<6e>TSaR9U`!@|ZkU3)w5efF)+G9Au2 zAja6j9o>UXmFh({UhXY5H8pu{O;*jquH!KhzDhV8Zr=CA#9R5xkTfX?xtg*v-3#~U zb@)Ge&SN=u=F;Ngggz|3a+WJ^ep^nTH}p&P!qRK?Hc$UtPx`5v{NQnHn3k#sWvpqy zxsQ*p2wLW47f^%o+|@R0eG9GP zde~yt+%P;*-fCJGcv(ZhZ(%Tuj~_pN@OYEy-YaX|)X09eVa@witE(GrKDiB#`R_SC@u)o(VYhU`CkjeeLZgCekO0*EV_s zN=AXapPd`^a=I|+wL#Dc#stNq3NX~q?^$Cn_%2x$nx`IUrT9p;RbX8qxx zGATb(+t9PZK{LOdsv(($O0VMRXmz{yzwEQOl(5k>V1g$o@hS1!yDh`cd%00msJ<7g z7K!PDb&TNBg&kK+xDaq88r1JR*tO!&xDB-V;HN%O-=gqia+&?^z^V}=yQqExV%VE^ z-YiO3Yu>Y;12096pe})akf9vmD}nzu}PTd*pk(Aqd(WyA#WL zDQQnt2^8+vQ)RN!ss42fNMBrjsQlX{W0b~2`(j+g97h{$Z8%`t^^lAn{ck74Kx)`I$ z3?A$xS_AI-mzHd5>{Q`^XoMY+zuXhNHj{Uo zJQfKb2@frW(i_zGq1Urpd75NvL&%Am2_Lc+(DjsmOJ8;qN?+pE>9WMcD z3x}%)q8=9Em=&V&b|4;qvv6XKBy7>(oTyRk+leX%`J zYEq+@EF z1BxEy#bte5oC5Ai+hd=<#G#4p{sf!w+V1FL4Ij>7+$Y-Y`%DvN4v)q@%W2Nvzj^Zy zjQ8=+*OX;Azl3DTs9D8Q5O2Jadb*Ty>Uk?v*Z{BfMJwkgkXOB!+Fuc3lVGz2BA>{| zqIvTuR`&ha;-JHkZ<^Utek`R?^yZPun<92?YJ?wqwD3~o-_;%P!d#^jUEPxHP};43 zTtS1`U-4VJt@(swx_(~)t0{gF9u5xB@NnjKm-^PY-}d@DQEGN7APKVlR;%1xt`V>h z4wuZ(jD~bv?l4eI@IBgK#yMJyW_sAx;<+Zv+!Dc7MY?nsTjghGX8?N$C1N>%lu$ z3GG)va)=$cr`raaTjalYFGd-K>!#R2%6KR9I}IEIMJ(3PhpF*us}H6N&-|g-Eiq}^ z)=AyE?Nx5n^ky*HipAP@>Lo+EWqU&kAkM~u?Ag9emj(Ze9Uyd`26D13mlxV`Rh>KA z+bw4piSUbK1_|lkRhFV%U0qsCqD~Xv-xk+8>Eq7UQe^O_K%fc@-0z%(Clk&l%^V-= z9z+3U4Ipy*njSC#ZX-HwPhTCJYxHEE)tki3xy&~~+Gn87nfs_ov*M_?=>a1Ct37QQ z861eb5r62by6+rKA0Up#$lx$a5EFES^|2^M)b)wPRC;0}7^poZRoMnjR$8Z?AIaq9 zqhi%XoRK{V&pJn&(#+n__>Mn8mSVK_k~H;wwIdwH&WN_iFL|ryHY+)W%hz{+Ga}M> ze04|(Xq*_&r#|H{Y*tf;I^OMLqllPHXmVFjcuU8~#o4rc0C!@qdQ~+gF_tcR97zALPuQb;qP-a@-H&h*2DA zxu2G3!b|X*aKBzBkFqiW4ZcxO&=z88Qx zr@yRlL*%vUml-#EmlhUo>_~tuEJ99dIjO>b3~O-OG>jY{JF&5`p?XgY3=F`#bJ?Rc zey99`+Vyd&K>Cl_&kw4yGJkn7KR=IQWCWjD@6I=GG2Ls+8&S&2%CaNpQQNW-{TVl= zQ_Bs{AJI&Sg>KbMDFxoRd*j@EhK^}9Rg;<`(Q5GJJp@VPA<14ESqD)2ZI5Te_Xo) zp5!34U(pXnQyR}t>vv9$P4ojfHPj4iccPTX;6*H|UuMqNRjP<2WKgnh<3hF_xWrN* zQltc_w#1)=jDPg0Lzd4`E#ACaog8zY(nT$-+PEgQ(tU93IqZH4}uDIjm3l1 z1Xwm2r9=)}hXXTeX5x+P4y6`sPIEDna-|_xIp94>Kx^EG4#my7LfDGG&j$KO$)^N) zetHemU%_?W)zF4ezp6YX`YKseK;YTPyK;Wm8@&wncVQ~x`xk-O5qXf>m(R)0SFHt} ze_7A_Oj_lo_Jwab^*BC<=l3Q9tpU7@`_(TcF61E`p6tvwMpGb<0&EZ9nUA~w^`!VU zWf^vovH5UdFGLMMx!~P5ZK9f&iDS5AZWxZC@p3S&I8*JD^V;?XFKK+Nq7JdHKyDSh zNIS6B^giaPH?=5*>U^m$T2cNkP%bx6oyPu6Xw0bJ1NuSkDtmCcB>IGkfxE~mH*#Xo zSFpyZ%$c%x)j`7|2b`UvTFcxuqq3rISDLq0p}Esx?4kKPxu?|5W8z)Tf^^NO)7^_9 z9tmH&QQq++VoxRp{lO9N`|s1$8y1CQS0Q!GWxRp>0Uy0Cmh~Mn zuNWMFr|5oV@s-=aazJ-W2CJ0F(MYC*f-Tel-+*xcqt?GK0pp6oYN{>BfL+sv#eBJV zvV579UB{o<%6UaGepx8)&_0=;1M_gG?8u#FUUf1Uj1ClMuC2|d4)4C61t{W3eU}*B zW$EmR_{H49u}6qCu+~+BMg|9$m|zcnW5tpJgMoS5PL5YbM-;0uq%datOMnk3BFnbrTAwrppuQBv@w}zThESdwNxOP2yu$ti#aW)aarx6DpVLy0E(+H?h z*$`}(&6LUi?+~}#XEUIo=oRQGT(%Ln-Sqv`vu~j?IymDc&?U2$K%Ys!V0H?UjoYxL zW(=qJJ`U!h-3LKvXJp!L_q}s~%5eRt^joR2jFPGNv;gJkrL&)jsb81>SOT-4 z3L?ubc>KKv)bFeR5{=;kS59UmxJqWX4u7V#CcS0|YCiA#kgO(?<|5qIaOvJ?K#}FF zxGK+Na+MbPDhut1h@nqg^qp7&Sd23bJ?cS{D_4_799lXv-E8mNqBm89Y9WBnlgTmL zU{&arW?Z_1Jg8+fu*I?@HH&C69tg160blN8PC|9_MN5q4{8FF#X()~I)970F%QOi$ zV}&@1YRuFc@}z^;+i0yG$=q)6{w}a|-<_*AF4{9U%5pH%hte}%^~X0#B@V?V-B(ej zv&NH>ipLMAfpH(*LxhNlWG&Qiza!>^d3B}R8l>dUeih5?V3AZmsh_9-?R6hXK3f^_3E!H!@>U^)$Rps7pauh=oVz8EN>U)B!6 zT-X-Y!P{XFfA11kCSZsTKhVxr5H{%VD}h_S>{0H8oxWlR7E!v|2=L-30h-IMUfEZx z07MyO$hw*xL~Nl>fbf)vE`ig^Nvnr4}DhP>{yVk zUqj`drQGgK_OP$&i~RF@x9TbP&(`D!OVmzCe2MqU^=R!o+vo%RuR?1~G?hRhw(a&4 zxS6-{SLY}zw>#g@J$^R1wPz>Qiv3ZSv?iuu6kbCYOz^0Fh$x^IG{ZgAUAvOlM@}LT zzS2(&VVpE*2$E#$EY^pRDtllQ7=|*>D~;P-4ygm#%{svkfJb~o3=Bo2qB+-GsD#ru z6&d=p&EC5mC`5(K#v^nn9wfR$%T#?*4x&;DMPP@11!1pit3hdPPCD87;|R&J;Khkl zwBd1Va>)T;`Nf&J>q}he9a(Ft)^bQ_#Buj*>pEnSNqOmQ1T~*=0#AW8ir!f&gmlw~ z;i{q2I#?)Z+U+u5g*Vcb+fhkL6z>hEBTbI(OxZm7<2zK7PVkee$P zuRj}7^awl&)^ub+l4FgQMkV7(ZjiZ5P9Q_U*kuTc*! zooM^0>4@aiy2lHxrOBCx7-!S$cq~=gbFDe+NV^`LU7fS+4>X^|&SjBsr%rUMd;Qo7 zrN$YVLhgNGYK~4J_|E9FZG{?ZF~bv$wdLz@G+JT*?WB)dy@{^hqP&Dzkr3ZZ!i-X! zj!6E`l^KWkQjNN4)bVTD3ee(G4JWmwN^$B{S31t6&MRw-BLx&f%@69J_fj4E)|#fs zt4fL4zPE8rW#vG##u}#SPf1_uSK#5MT7C53wKi64Nx!&(5jD64c^yF#X~Kg{aYxJq z@mT|6IPi#uIvD*}qFy`ETidz^OwP{y@8s8u@`3Jw;(eC<3Ap`>qS|*Hd7wF71t){3 zi6n8F$u~xPtwL)Hw~G9^H>($NTV5Z*D-?=i7L_*ZiX~0s$>QVCeKa>_7}a_~rr#Qy zb<_obsngnfFRA3q|{kf?;f=n4z(Vi_Msj-Ft;+b5A+68VPj8QQp zaS}tLDY>|Jw8&&g!uJ5s>Zg+H6y$-CR06W%T!1MM<&EwCew%F8; zeLwYRL#QFmWHj1CtHdr|0w{4P1T=ZW~a*Xt7q%On;@XS2)CP zET1DbIV?UX$>9JkF43zR1JLElO0V73zXlrYtixaz$<#e+OZp%j>+V-KeYv_RBxU$& z20pI;H{kMrghcKpJg~gA6 zCWnvjfGc-H0sLPH79zgK@n7QmkOCm{Gr&*q(*xe^JLM?-tDOJB>W^*!Qhx(#jBT#K zto&-gTg-oB_y6A(%lO9~CMhOnkg0K7Mh@sY{ol`JvTR}5EGcy(04ar>;}{Mx%B%!b z@V`a($_)r4s8Ht8yc?q4wkGdY%{YbwnwmAj-Ti|5OGzczV$aBbE=Yw!ZASgg6$>8y41APM)v{9XnX#S1C3*!~ZxF-t zbDJckR#ujSy<}nk<6(V3BdrY5^QN-W&Kr~7R;d@=zh(Qsp4Mw+o%m;Go=B?GWm0caNHcbzr5%VDMf3&Pa`7<8= zEh>C@zHuXvZ)@A^q3AMwxyCtyl&DFr`n&08A-+Z8SL5w?%oQ*IHNiw#d;6lqeB1g& zOLQlhfi1pdJ;u%4D{fZGm-ZeFT`{hX|DIO!B2TD?2`_0Qx5vWsq3?^=88Vdq_szQT>FG@C zgt5tf<_*l!fOfyx*t_OhuHo5KQ^uyLKC0}Z6!aKsN%Z-|9E+Y;PBb-pWwz#;hVbuJ ziT@a7=4MPkDrO1kC$+M}XO(7Xf0ucqEIz%CxLK!7;*D~-eLn1P$-ftW!a{8SZm=ei zt>Gy=)Bb;N;2|Xq-PRI@aRdM4a@#D4E%DLNkAEb??^2MF-@WHem6jjQBn*DfDt212 z`hll+y7u57+Z-_+vh7`RK>K6_>wFIl_6klP{r>w@So@jE^?P*3rbGOE`QJ$$1k||& z(qeYKH51|!R=p8x%YiwN4c&bqupvuD5wqCo9q^cB`%MtJ?v0B^0ECC5o7F4d##Ncy zQ*sUv-HQiGMrjLp@E34GNjA49m($oIZ zICMCdF|<7HeL#^ql!mH|e$wclmCk<;_)rhmCPtq0<&k3U=#Pw7OngIs8x;hi;i73V zPR(zj_n_$ywrW7%cZQgTUqQE&tw5%GDrt$&)Q`1SZ4XjSEM9G;qLB|xR+D1F2X2QL z>lK|7``rJJBF~32z3hJKagXL)^a-cHpN=`Ht|cw>2<)wp8ei<&^S(;N=O|o&-(O;( zALy_5wV{aWl1CdIGCBDzvGb|V)DO_wMkkfVPy%yB5j^*7+IvWBGUas&`U0x#6!;^} zfs0hK@Q1Q8lwxoBKL;*X!1(WaiKj0y&1p**icvN0!IuZ2```W3jVep3*SFB#v6~A^ zjr1UAez#oMc47SLd&{uSMk?f}asX<|I<>nz906hm8F@G{7gcv+y5iY_sh8}CjR>9Um?C9CM;g~_=Wh0<)<0NnhSUP zye+$QGq6#DmZz?yP@lXF^Z~CDzrzYV(1-S~q~wT5Jtvl4Rnr#JQTELv1N#^~Ma&P! zZF8vSOnz023gX4imj6J5B79o=O3Br#Ki{7goSVt}zB3!DNcW$#NjDd)iQs z)q`(zT3Z+-%Y9gEkIYYc7fvjaHSxFhPz2Wx+c!PhX|AcIM~mWKkf!Xz^C7Bp>HX%YHub|Ys ztqz+VBjZeaCQ(9se9x3UcoR_v&-pgsW~V>VTex>O3NKh8rVR<=`DdQYbe)=s3Ue{0 znEujWb&riO8-ene=S6+ zf1-9verVro-X2_Z?{zicz0Z=7GY5vGx6VMMWC;G$UQptmk2OUv=omhs(YyZP@4wbW z^h&oY7nX1N6-5Op37TJtr6ta5Dv0r$R7r@5V_4m;%1OmeZAMuZGsC%}ULsNylodU! zMoz3gbw32j8pqHuawjUx$IK=3)?l8AU6!t{ivH9FGJ%JVbQ`(pR?b@wlVbdXuypZO z`wlOAQ=v`Cc?AEP@ zOT#&9W3L>DJf$0y((ngQ|3k4Lb}2!_V;|VzAs89Pn;;D1f-+fTQ-fc_tjT&uy0o^+ zDu4HLFT>>5xr`oO+-h5|_!qZ776EcTi9&BmPRJ}^4I4UhlpgC<<&Fd%l#CTzR!Md1 zpPbf+k2bk~lYrlm2ndnsluu*iZWIhD--9A+^vEX>0_2*NlRr{Uwb0;?jVaIcS3?|# z?%ny3};Xi84ccQ+VTVYG_+;8V5Y9jQ!Uc7ZTyIIW?a zbLAmk1@lfU7iJhW$wSX6%9tTeP@=XlnL-g+{JAoKOqHyv>;Nr)WGpg0M@q2=C};8{ ze=E5?WTn1KwVTuQd?|0V_ovNBrRKEeIk_RHn2f=D<-*RjE<~Vju21~$^e{-6(5Jjk z^j{Luc-b^bzURz;nWw+#J&L>kMur5u{^Mu*a`I+BtMWswrHRT+w(!7}>cPeDACj)` zetvijF0>%X88Fm?Y_z!vqlNIUjl#S2|Mqyi%!R)|}=L^soVVPVbhKl?-Qoj~%1&nsxF&4`Kd+;w>_ zjOy}Fz)&o&qS;zY*;Z#+bNTTE*t2oWY32*)(BjqmN$fD;mjvs}sCuzwp8mRdvD3j| z3CeIjqrH+go?a*9j@vGye_|e4%Zt;%?EuIp<9eeY^Ca^_qE;EgCEdk>j|U+cJ|tqc z+mdFga~n(}rzzdx{1)CJydc@8I=|HXMaiUoNJD28fl<$1cv*^V^jO$Ano|zC8+_6B z9;AvroMRRsSBdXF@27l?pui_MA3H!Iw;hsE8+Xp`&zl!FNTuq`xoCOioROMugG}4f zua|kTdz?)RLYk_^^4P$6;gwB=e<%W}PxA*rxrc+#d&Bt7T=i4;D#pCNJd?>T z7!(%C6xUe$AoL$8e*WxOxS~ZVNJ*(piQ%I2Q?WN3N3Jxo=_havAP}VmMqW`9FQ)bD z|Cq3v@OecJgi~R7W4wMH5y&sg?F^c4NrgAFYBQ<;3U#NLE5@wIY%L;H)tiR5rQd2X z^3&t)&M%{10_$-%=2!-%oenNxyQ!3^A&p0eLPs0wK;|%&YC^Amuton|TGfwJMeBab zedLaNU6xc1as7~0!`$KDrZ?ta@tD8Jv*UrfLnA$tHR>TAYsiaR@vrou`8(%gPHVp< zFS2jKHeeLwImwY+D?O5p#?(yDl_MhNr8z&ilM#ByW6*p*H1i?tf&iv-uYVtK${w&Z z8gV^Sr}oWV|8fYELrXkYcx*jQ$F8jT99YD)@xFNhap)`K+alj|nIF2Ysz@*eBSbF2=?iQC{UW>z+vwxesW zZL4ZHx_M&@De`RI2@$TDqH2{2Y*8xbZt1<%#E82Ry9EXP@mx6-LpjqMHfnd&{ygVb zV#$ZhL_JLkwdK-!_Ryd=Zet_Ql8iP1k+Xz37|6+~D*l}3PxTT7#bl#9`(ns*je^g zk;!jDl8~P~AY%+m^VLKfrDo3+=tla+MZisktB2qN9~$S!AMgK5bu;P~zb|4E8?_S( zb)oLt!XW>weLxfcY->dfgs&bzf9k_HTUgh`1}JUTpYZ)KlC1C{6m|L@kBdtT_J# zQsy9d@iX$f|86oAWwM-ccCcN2C~+Z2uzMhM#GC_*;hz`Er^9OHh<;Tbm|rXl^wF>$ zjz+umG4g1w=DHy&S8^v6sB+IT)midezL9kV!XcRqCbJSl8qSV zx3TbTZ|f(5=lR6~0*P#oX0ai#kxF)!-Xk7tzx^-S9G=atSJ-9pZ_Oc}w;V;kPG&1S zzl4$W-=*`h%&>v(3MXCK)$+>`r&Fazi7?azXSaM=K(0$?>9OUw=OvB8 z$DJZaCtyz1PFO*BjZCu*>tT4oDd`P<&LYtK?ggt$>sj8}->6Q6q?0mXOjX93K81tK zoBPM=yBj+Qp8UMzC=T=0X(ml8mNlR0uY8wj5$+;C&|U35h!o~{;?(#w5Ipsbvu>l^ z`-!-j!&T`y?WZe0#d|{~wB;dLXYJ9slV5waZ=4C~cLxX%STSRXav}LG?aY%OV$)k_t?C>5OkxA;@!ab%7Bd$ zR#x;@A6&`x^mYww^~6C>4N4=) z^^(@Va=yYBSyoi0V7V=D){SB^PkQYaaN;go?$xd}DYnxV*+XZRjyGH*-$u{h%{a0G z^D`EKq|06UyLfI1;ft_;oy{Cnv14QbT9YR#3xbBr0nM*iHLad&WZN2*t1XDW^%~|m zsIJG|-Yp;mW>HT9=>p3SV<1zFj34M;#AlRZ+QD;|_$8L1+xk7ZLZ7G;6y{c>Ph%xi zLt5W0w?ivuDebP$b@G;K3E5RndiPdz;cil&^(Ks4rx}r2K|E>n=OLhjI5y+?B3QU_0A@^h>DLC;P=lPZp|6Z6*brlBc?20zwnhgZux!9iIWY^#3t$NRW^=I z-!x$j5+ks1YqN{-K}IhX%P|4E7fZ)~#H0JeD5;0hzN<&&YC*YG{U=FdFW;}I^w64% zJmQL^G-UO@_&VBT(7n$?H%Yd@ui*gA$4^QfEtG+_e63PVp}UZpCv2rpWQ@}2V|D{y zU=Otn{C`MFJ@p>)QF1l80mA>GJ<;?aY0eVt6#l9uJLUxQVw=u{Rx*3R+zRq=n7`K< zXl`lvxWqCLRBUvWfBF9w2m0opF72**%Ug2E%Yi)(C_ed7DWT^7`i@McyHC>|J8(*w zzbJULt@sxDWnL*BEp(jZ|KY6tRy0{|Q&#OYP#SYTV2vUt_;;vhLMp0w7Xkqu_;U6| z`@ZRbl*yMrlejQQY^-XvWWpTl7ni%dOFx2Gav*Q?uDFi!k)(sN$AdV=Lu_ff*<611 zAZS}K$p@S@L0SeVU_CXYbd|RpQjoVnsck%iJbfrLiS)PVzU4(1FzuijNkORd?g2N9 zN_wg0$Bi>+>D4G3jEgvRFK%?iy@Iy7cBP@kf9Gad#x|wB zIe%%4l@{roZ7M(cB#Y$V-SRLGDGyC{c~!lOaILxjXvL#{VAj39uJhxcUYSvz7WL1~ z>A|)(9yDZ>A{zG9Y@iJTysW0QddHNWe_AjLOMXAGzYO7wsJqw`BA%cP}oULZ)>gDj7=+^DIg&nf=R%jK-X zEQF-o&lhLyR()ph{J21F{PV4M9uHFP%Ch2ZxC)VAwQeRi$wr183w! z-6wIvk#_b>4b=PBRQ34pt{RyZ$zsbekf{(mTrM$?>D9i;0U$Oz3l$Hj`p(5dZESOB z>AJ9^{BEYQFGUK%ukHK%4VweYx4W`Ihm5sNCqqF;jQISS45P2y>rx-|mQ(@-<^)oV zhT1BM%NM*g+3N|-4{CKtgwD!R*VYT^8Ym2vlGla(k&gSx`M z+7qhSuz2R(`>_)N3o9pjQfs4fjh1VQVA>|Z>O1GY=;e-2mU@@`R!KA1LZ{)BYnFN= zddx%u3oD)!g*uT0TU zdrYr%Y#sN)3_wnP9ZKrtw$5Mb_H#uxv#P2I!5+Km{>m?VjgVANtD6WYO{fcmCN){$ zm4qYg?L|j{+CcE8|7q!xaq3n})?kibY@BUv9NGsGDJMLPdX^;&M}VWhEr=i1nJy$H z8LXm|f5yhvm7BUbsQEd8=1sl!K=T40lp@!@|I6z1SaQx(*Mi4XcDng)7b|AIR0>6> zH@LQ{mcz&lRUBt*ln}KDXl?Rz^<_!ci1S;7h;|Jb6qh`s^4L>3xlnaRrIauiET(+Y z`PZFkmfNwA%I+YSE{frTH>VSJRGp@^J9{Ug+gZ;TiqOs*kiegDaY}mkkB$?!+KEPb z=NVjVL>j3w3I=E!zbY*v0*VNN2%`u{ zR}3IsKzi@eMWlodp|_}js0fJk&}-;5^b!RDDWQcPAksolfP@ao|2X%Vd!Knfy`LdF zC;P0u_Nu>iOD0Z&3I(3?H!}a@VA$K4=G!)Ow3f0!QXCYJ1M~tS??@)Dse66DX=H=4 zPsvQY&>E=OWVNofEWlq8Y6;e|Q1Sk$IW#%L7I#l9Vs-Dk1YojZ(~gwXKjKB#g7bY1 zjN%_@D|Y5L<~;Lw`pbQ*qqcT)&@v9V-OV!GikPQ33&iK6)02Yi`Yhu<9&lAlK(&$x zB1Qg{1u5)J<{AcQsb1$}0`l4itW26kHs{JX{xoeg%rA3v>D!MyKWgf}iuGX6mn1R3 zMEv=cF@83mS%t_{NIw#^Ba?YvomIm{zV?y?mM;L_*f>_pIJ=?~5Q6r%^QSR2!|Fm$ zq~^&q|0B8U0xN8xNx^eIyk$!pS~Deol*HBDip6a4lOs;|#<u9>OYOG;n`SGY!7l>Hro5C7)1dGc`Ev z>r!r2K%T_u)+;BR%IyT?H)?;oMb0nM;^Ok?IB&l+q83CM*Bjqefm9Wyfe1Cf zZqSsyb$tP2e;N>aToHs$Gp!pOga#bFU$2z~HI9s=2@&i$;H7Re0lW1Uc2%hKW|9uq zO|5ooZQMu5!Sr4V#UBF(y&XvtmVVTbhCX$2MLls??xd2Y!yY_?m1M*33rIWd;cjBR zV8dyYvfv4q{a%{xRi9((zcfau>i-&Hy_O|{LQ0+G+gIDa49MD7|4ej4nJ*w7C?|51 z<|mK9{Q*0&7UPHte)PoOn@|EcjlG5I16XxL!F)XQd(; z*)Bcb>B@A;`zRZR)9xQ$&dH6%WzVZp__5pGXRyGoT1|{NKk+aK9HjGB9Qp=nJ?$WC?|ki`5`AUQqG zcdcphcndChiugtJ(GR4vx^bg3xamoAy#wE=U4yOKbM$J7BMfb`DdVt~Nns=VVv0mk zwH-bu+=;2cct}Wxo+zi4y-i$U&w3R9$>%*Lc4hMl(s?)o{jlxB^!qT(C&t&rF`Pqr z)`xZ0J;N&sx6F{`t@lX=Im2&CnPFDPAn5gzH_g?by8Q13HUwuihp8UtIta=< z@KoL5>mRamC^9dWhzceccYuk}$k-NkWzqf?;yKe1E$uNjGiNu$F%Q#qzXtt7(~9O)eR^O?)dp)jINyRQq~HJ^-QiG z?p#A+Ov9X0`@1Y+u_|%mux()ETZhub|PA_Qis~xH`HQV1| zs(*aBO(eu7Eo1CVuiL{cCi(6LX*@ z(C1W@kIesWF_059s%C#|kKuc2(Qu15QVFJhQz3V-Y^J6sXmSAq>H2(3f)Y;0C?yL_ z+FmeBfNsotZ>Q4=yC`iLGGZ+wTT_3+E9WhUsjqMvJdo-2{Zi6%mIKGnz1oodNzNlZ z`-3-I1>=1ard3togDDK1lqYd_&63fDBqG7pGa)-8^w+Cj$%YIw&cHkJNwFgBQtt(` z;J26(Q~LzIeueojkWUsWpKRxZJ zf$TcS`4WC@6^QnYvra=vN?KZM(h==x+|~$VvRte)-%QuleB0MVzIj|_u$G$YU|-xJ zLpioj?7?5jt=~)k0^J`c{W5f|7-uzYT{}bty7CmwK;P$hSJ#fjkjx-n{t|BC;%B-` zP^Tv_-;})*;U`v5d_cVRX-AyCFlayf^=UyYE(^I*(D?k`)I#mDOJsd53Ck8|v|@IY zcUYNHtd@dfk{1f{+g3n{5FUe_X2&Hv&5~dL3DjbK`lECHTSsk-L*T{=TbwAh3G&#%MCf7CwD|uigWp`YltQE3(bPuy{ zazH*BWK&40-IR%_%bD4V4rbbCtvijl*B5Zjgpq!rRTGPYDb&lUv(%=>x?~RPo!rf!RyzW5McnapoesFcK zYY!tRd(C1lc&NIrb%h7&1ezvgOhjVG?jg$?gW@Fb86ADgj4WdX(*^{(!s7B;@=Rjv z44;%0_(%T70kC2_He3FSu8_DPYSKw+s0Lt`qj;LDdPVA zU&HbcjePy!kSpGnDc}LNy;!vG!)aLEa=G}SV)L36LWl(+%94H}AQ6DmY6}bO0!-YW zD_aF(jv{M(dmR)|qiSkVW-aWw?+*B6b2X)zw4{@&mutTQ_&a${qL~g;X9rzn1wq5E zEWYn0T;8?KBS)$;>r<6Z2q+|_*6;3!%WsX;JvjZfpZ$&<#4Gy>;=*01>9=xzRmp8{ zcuL;{+q#SccyT-q+-$W=V9mF01DoMbR3UZTT=1%~>aDqk#cBH=R-iaWco~`%)*ls( z93Fs<2dEJR5%PR6)hSKeenGPZilvVAgL#?4dONHyuh;$lnAWc2qxS`n1aiJ+L2 z^f*t~TiCNd^-*XPpY}2h7$>M}rXo^C^7a^x)%aK?tOZ(IK7LR;%sE30wyiKZix-_~ zQ;)lft5yiEz8%UK67-Ug_?NwqOde|31}}ZreWFqF3PWuH-)0 zCtcgNM^xyeLuC}U*2c#J*IPhcv-xKGR^xgx=zUQS5W;EyBfo&JcPhDdER-zXUD*HF z4Sv#D5)(O+hAj6V*b4Snjl~;5u`iBlj^3%-tfaF(B^)<5&w_U&E#OohNFuC@I6<^4pY=JizI+knJ4;^{s#oMW zk|zC{w+=Y@dTCX0tdoa3E3!pzz}k~BQD)j}Bhc7Ls)H5(v4TacS4Jl?RL7+r%u<#O zn0y9l{3wO?SJFZ9Ig4MXy16ad=0~dt_jwJLgIE-)ck|T~QecTi-Vq`rX=Pzw5!ls) z3*F^xPkj>BS1EnPfTCiT@QAde9iG0NFCPB%BA;2Mf09XAfG6_l^g|bmy#)H!r{H0i z0kD%~(dUzu7}0>UX!V$Tec-_7;Ih zzpeum=bGn04rV@6F!}N&c^oo%by@=1&TQqA_IT}JORuO>@tB2y9$j!CCHj`p8SRuY zR)q1A%oi_Un+l}RJzoQ|kg++pU`{P?RzJ8D+;>2MP_*w09kY`F2?AoX?03m3PYw=XAX)UO z?hJ>u-n}CErdg*GKD!Ecd)LaW3E!dKgOnEAopCKfdb^r`-eV=`7;Fv$ z!HsDb@t+sjgfWSp$*>miJ}z?ritBBx4=LtN0vR(rbZ&QUlR2wRWYQ|`h(9SE`sq9m zIvAmj9sr^nMZ(>N5w#Ydjol@bY@?~l=Urn&&{Dw%ANq44#G4(t=B}2fPCsIqXN@#7 zg+1|W=ZP-d+UDbD8^?s!qvI?$r@Ob0IDHSzZ2{)p=(z7+C_WP)a;O-zGz3rU4^~Id}4QPwYdsQJ#(!#tRKbE`!rKCXw2TiyPz);=68DWauToKA# z$tD&X+vq=v-9PCD2vn_RUKm9o2CNF)SjBCFog971j?2yv17dDLIUJ*`Vad+ebLMO3 zgMX@^EhM0YE|i<9d$=Ny&}XD~;S-nw<7RwQv0vt=?hgLJr}3hv-4 z&F`{37|9C6?3p}Mk4kH411{y!Ws6IKjl^%EY!6V{8b<067LAZ?0|)}R)t|< zyBI-yup%muc5N*mYvKOlnzV-LM-4%w-)yW^SaVX{9AwgS{|_N4VM`Gdm=?SIL;|oN zyyv2KYU+K~kjWvh1J$kW)WhVPVQDb(x4FR4QJM~J@`UX-`hB0*`w6(1jJll_)s2Gw zS?fS-sOVcz#8u;C5O;l!TX4Xpe(f(o^Spsr3GR1Vmx*dgxT$LAt465W9W>WW>bG+1 z9EN1JpB9mohac|;L`icgxY0!Q;L7io7znb9$8+>$=Y@>5Oz!FRYgkSl^d?K%#Jimt z8193Tn0^X{Svmyd6yeZ?-kT!Kfq|vtl>0m8rWexHbQ|vQM&hmrgo88cHdYYn9o4R> zI5=lR+MGv_QH;%#CYMxckC7GyQY!2*_SN)uwrrgeO$#Njq~Oj#S}npW5|>vIor zSKS8R_AxUn5{lz{mz?U;oQGX#x9B;&iGojf3Tmo77jL2+uH8i@!ZPYQ%ZFb1pW10S z3(vCM$-E!y&U8Lk^ZN07BSq{rW@LefQ;5t&(Gv@)KcQoN&_VhZN{4YYZ<>g@&&_f_HMVpSWrD{>#0l~+7m@6lDCsA2nl7}iM z8x9%B^HRjUnAPn?`KBZs$cbWBk^yDNK=1ND;j`~F<(sea%Ig+(T60wQNm7EL#RQrL zkDO+$DOrViOQaupq&HcGP*GO>aq%-x%swn|xBaZ8C1`r(+ppF961u9Ss|Y*Ov4w=h zQybMNZH;{Uk9B$hGZ%nt!g-P!%{DtE zfdq-9DZ#mLI)X;LOHvfjW8zfr)!70y9odTf1xaa@UGjjLw7z&jn=Z(CuPSjC<23TU zAXHiSK(Dz$xIo+`iA@XKoE9bhenNcsvR9t}GM_jK?Q=~PE5_A#W@_a8;bhH)iD|F3 zVY@pwvb+36lTH6Z-x-t4i^|hCA3v(DLuV&{0hO%Ogex<;?!T|MuZCkFxZD9*0z%Ds z1BG<&Y{PuxG*D-O7*KTrAzX3kS1B6gjZ%Rq6HDK;;ktvM{Tq3uQEPm`(C&en?qB%` zt-5v&IAOcbQ%TFDB4FqFhEuz2^mC4iDFH;;AjY%e{3Kp8rFn6|ySp&?`F{VCrlz!^ zbdup92nocbrqVo~h;noCQGVV^W^00o)xHlG^)`FDLsy_orc#VAbi_-_y~;%1_~(g7?BjfB3v7 zBfQpuevLM&z#Ic~+FgBkf_ue%gD}M|if}Lo#^qQI!bpa^nN5gGMfz;0j)AONcb+y! z&Sz}s*+l+@l5;yQ@J|FeC2SOnp|JcRe#wlRo<-^^N|!bHY=5T|C)a9-fGge*nD7L= zDasrKsa!wW7@itdaHAc&HZ?-`B+fCgz)V%e*VIuw(zz&_OTz8W5MY zkL0IJe8SSyMs$fD{~S)r@R{Fx)(o~d7V-g%*PqCPpBos#8lLpE$0Nl`+OyA8QEtit zD1d`UD`epd5GzH{VxtFC(X)BBCP`wh(zbxxHAQ@eY%@%aE-4U~emm3NWW|v1#_T$n z_7c!RscP;z6Lxa5f#U~@w5BZVYUVt9=1tk{u5T*^;#YbvuLsxG<7ARyqfZTNGO;q& z^aPb(u`zVP{ir-Sr*R3dyGB@>-Q^S^_AXh5@%$Wqu$FJQUD$rZs6wBaED-+&{P#Y1 zqBD&t^Y2P!Aj%!$V~&B#RmlmZtqMk2eev9U%-s z=Coj{+Du4!{4^Jkp~)tlk|VHdJi;|iiE({*P3aSLm7TIGdO`5k{O`d_I$rl}eUa|IxvGOS-iotqT+5qD zS#WSE25ZH{lKoz=whd@CGjZL@G5e}7tfV>njn)nQI^Y%}kkVPYIkP9J#g{pmD2;Q* z_`c;rE3Hw0qs~Tq)+HS*KNmm{2eOyui zhlPZ!L!#vB#h%Xnsy(YHDvNl}e88MWX*lI5RZ0I2mKn6Rd}X;ORWiToe06``HRK6UnN8@ql;4Pb$H>Mob&19oINn9=U@iaAf{7N4&&-u8 zP_ok)Vmpu4BDA>V>xk3?CBRGq5%dsuI;j$7gwUc&oexH;fz`Raj9(ip0LEO?wHF$Z z?xD!S%UisLLR(538Bq5LgPs+#=8Z&MIpqE0;#ge%>Cbz|1%5EXqZ(aJA`q+r-pwui zuhR!20yX-`aDdV!-DM_NHkL_h~r!mH+m19IzSuF6 z_VkCO4!cuPM=Mt*+nHC!nG`;ZaZGSD9akk@wMdAbn4x)6zDw~qQ~sVg0)K9O4B9Hv ze;22o6WQhW_4suZ2Ijku%w_Hk)M&E8<1=wWrSj=-!EKn=KrurkD^shT?&e}hzee#^ ziRcdbd4PHQuEgyxIN|Wk=R+Try6=GfaZ{5{dMEB%=6 zV)&11hl(nY=@QytCbp*mM4WWJx)^K1;;tsQ=~jZ7R+8IO%NFus)y7Sqm#GeUM~!_k zYFZFS*(NbDp%_bg^M+SQ&&8@X4vOoXE#nq%;4e*#=9X-Lt#i<)@q|j2aSfu0nI5_^ zvT60NKly^~U%=q@uYK{z!tJm`W~_Jm9+3Xt1lm@0`V>T6LzMws;XSf)Ssft_hSK< zG&F<#cr0l4WAnE@ARF!=yH>scZled&CJg=pagS$@XR?x?s~@GnS^~Fcf!t~_XEpwB zs~g<-Wq~aYXP+v`eKm7p&m4RNM$Q~55@)^!a}n75fP#z0M@6?UplAB?aPzRSvSKEJ zXF#%rkdFWgp0b{bEA6|(=2UpZr%&6~7ju!#hPYPyed#1ly_|TXUMcK#&VZr<0fZfD z4!bwlx0{ZAcNOys(1fgpGAJIxWY0a8dM0)doIVS$szBg3k$e>LYa0g73Za{r8T#ie{!hUFhPfs(10hsXwx>-PT>F2w~X*y zeoxYb1h`H(i+|6cxJh`}pZeZy2usZ0QEUcpLDQh~pDth&MXf|oJk2~6%G#J`Vj~u6 zGf+C_W*8e6hAN%xD0YBnDn%3?1oX#2OA6qR0ZkYTAjIY>%csz^0TIf~7#UbyH z;0zwrQn^sM$Ae_XDSKh!yvE0OC+r_qs;^cCoP5K;FtZ)$!yT%fII~&&6I%$WdUyaj zNWs3_o&Gid2~@!V?6taVVSaB0&RLp+tHP>f#B&O!pl-y@&r-s_Lb1KU@;x|_Ja-`p zNtySpqkxbrL(2zj0oCw#js6oZK+aB-Aj6dT(_-pN26u>=BUtOLN|BgT&)ne;1Jgvk zgsrcLXBp9iF zbTni10Z9KlpflRC1+HSR^%63+GjGVaNxBS8j+vOucqdN1J_ZzSW6!C2ya&=HU};tT z=I-u;3AbjgKkAK=hoOa{_aQU=s2(0>#2r(p2dB-(bD#pD z_bcuJr>t#T$Eh*Oa*V!+C6sGb3$g%PItB~~k>49_&n;6!TQiXR;fviGOXIFN(g2xR zPR{fH3H%M-Ez`;xVlw$&^gY~v2MEF*e_xNdKuaAdtqnA-7Jt!85|bD&ToROJc|kh1 z{J0(j=)po_u^bYForEvRK}%Xz>a$t|`+%_QA9;byIT)pN@%D4->ZdKHNGK}In<6+(X zYYHOb7S6m?T+M;p5VaqTr=ccSAKG^eH~d)}r{@qN_qKh%?SxJtQJ-i3?%n|sqXlHb zKQux2aEtNNqs@p*rgs!w{9eCXuU0cfr@imW)u&w_AT*)onzS22a?XRv-!e{wI#hX> zFLak4=gfMU-ka^5IC3K)hWg-b07RTSt!^xv&<;eQik!i1ZD6f>Kq(GdRwudH&iB0T z8_{p_>ANy5yFWSgItpa}WbKAGb7cdz5W4EE)!jy&P?A$Y3e$$w2w2I-#GjPet}Nl_ zpdT~bm;W@yWOFJ#I(Sv)YC#_bG&lm09jtOS#n}|HcR&P`KVygD}VyR zS}x>$)B4)@;r3U9`n@0_KO=X+CG(!{K3VDAqOKiJ!ODTx4Oem zP*8qTE|LxK`3y)5G360a6Qo{4yJ*^Kuh%v=fuc8MPt zbtw+5-mD>T^T_V39J?gpLlZ^7(#w2pV=``HQ5QMA1-7mPI>h^etnr>tmf?R48wZ%= z1U!B|eSPm?8FVrXI%TFf6}=Njy_tS`9DNE0!s!T4*f@}?*_Rbu9d)~*2%TS;i9V~v zt0*Z&dzu*XGe-hKO7-)Sto{34{fKLt5Pa-h@ahy0uqlS@GgM)9<3#mW#j|gXaOAAO z0h{4~&4VX1?Q1qc7ZUK2)U+(Q_p1PFGx0W(x}xpAMnM9DHUy7g3}I)f$N79b>pjHS z55>%063XY!geD^dTp_fA+A#0ra`Ow)cS!1aR3m|hnVYgEm+$ahg#E5vtFMNO@2KrK z2Dga_6xOjt?X-Zn->$s{x)mlo@5$?vi$8G2EO3u)J_dV~cS5ucg))IA^JDQfa^4|p zEo55Fs2Aj`>UFfgS#O%bD0+A>n{iq2_@Pl*;Q(AJSx+yWAZoIX0GSz$V26Saxu8@U42ha`}KdYdp@9X!=y&EXf6E6Xr`+L8mz$0tv9fk;7;FnQ~`M4$J4G zE({JT##I1GZHbqvKy(^h_^qyD><=@|4{G-6 zGqreB#Z}Dag<+T z9o-xKE+?gcYq$T!5?m<)uzfqdDX~mj)S6k{L70I>z{{-ZR*}?*61;{tR-&_K>BQ$G z%ux9h`fRE2F|Cwli^X@Vq*kC5V}e#z zAXx@#48ap^;WgMlFr0W@MEZCUA%~d6KK!oNK4JXJS6G!_J}1gvTP78owfrNaBk|7m zyT6a-@>krF7AgI>dt*bYR6SId+&bw|Rr!Wi`Hz?u8_P|4zDw7h!~u@~>EM~Hb!$@s z7s|M?oR`T|lCk_LU1gdX*ZR9&J;XKX38~r|Xj`G!7c74I zbfU4&R&w%4t1ln>-7h{3S4V6zHOnM^@@rZhY68m!r#BV3^(bWY!H-_xD}7CXkW9|U z#{k8>v~&hN?xVkgzb)e3F^LsT2p$Rma#iln+~X^w^m5aYb{p+h8#c$j7WPSx+O~uv zr$Bj=E_RK*NsLdJZPM3xKg+sa^O*K`*HivZ7Ou%Y+T`O*_ z$uEa~HbE#>@4LQr%}Qp79OA-?5F|lf@~{3yd%z5Btvj+_-HnI|j?QdW7AlW#evZ5t zu=#{(%fpknB5P@|#gl&v@OK0(Acfu){-BhzM6hA7GT`L`@X!Q#W0>qG=!5=;wKi|N zi_MHC{B?XXdrl(eCJq_07hZY3LYUijzNzZYn@F&fW0q?V@Lrq?DUO{T?FO<5&O1LA zXd+*+n-sGKYRJg$9knJ00!q=b(_*i*At%Jp$=|0SvlK8Qc<%Z$iUr?If*zqx|}`h${uMdq4N4Al57I`id`^R4}_z zJ}rTM-4w|+q*0_{gvfa4DvcO)=4={zhbZ$7XMge|+%vTZ2w$? zo-0-*Ts6OAJO(JBosDWVLzTizy?%#h`zJz*W~Ph-dSaJLz0FFbPaHNy!NJ+JK&tx@ z!0wElXo#d=S34c~4EP~;g9drOsR0eZMop!o*RZWz8&cy}e2Fc3Ez>6TX!1Mj7}Y(6 zu{GO|j||ys*inKRIF?i{fK_F=gDxbMuuSRG632)SpKcdo01TBMYCY9 z=6m$Ro7R>eCpB6xt2>$*HH31{v`P5liw7D2xBbpfd`CP%l(vOJFWcZhtD>}Tjlalwa?id&U9kFYK~-Pg+)jYl zeG%%h(~n0HC$dZXpG32R%$qe=yHJ*?%NIFY(FROFD9sHIjl+P-qC{J}ms%AF7FUrE zW-L~pZ-1mKm3er4cLyU<+Q)3P;+9-|3Uf$r*0?l#J8Y0j#B)%3B4}&1Zc(g1#UsE4 znQ5BmvSziL1@g_ry!+a8=w8*lh2Q+;>0Gmzcg*6O@CbM-&w&Q4&Y>sYGp;KcV~Q3s zn{x6qn!_Bw3b)_ApS{B{9MgXHIQM-)#TxTeiRj(jQF7CEdIO*Vz1*|M^WkbP%ZSH! z!2>9R*~d{Ay>(5VL(KBOC;oN>R<$uxUura?MXbSxO-CDBF4IZNLtuH=Kf=9pZK8@z z3>JIcDtc0>=1$j1#%8VcSD&bT2bvWyHP|-Duk-`D)(S#aewzewtoEle4<@%wXlQCvGEAagZRM&kY1v1mxDC9|xP=$JJa!}% z;h$+5+}rwf%4xT$bAuFyjcF8`q3K$01QK1r+tW7$#I!epf?bnJstfUokn#1VaxcJ?Uqq+5l~#EGRorW` z%sM`SO_i-ZI3H*ra-acDw9C$P4&iX{49R!HSgq}4&U-J_rlXt0OcyAdN8pd)Z@G=a z_)?j&H2U;JNg?(Sr^BH;3Q6etd~%+i#mFwYKO=d#2Gs8JBm0el$q4^Et@rL9M@N;! zMM4xj1xQApDoz@-sZOEwa>fS3?8B86so&-iX5bw1E& zy5o;2+Jc(9k0qXjWi8Zdirq(@KbNJKz>BJ<;avt6Kg+$i=e3iq0pSu68C$GMUo3Cj zUz8b6E_w_|F~F7=qC1XDOiyq2?5L_Z+^B$}tOm(^WY0AqX4Gnj-U-@s;^G~S0*D#s z3JnrcZ~(it9r;KqMT3#?aCC3ZJEC(I#8pBIRsivgF<$FY2 zA>WHv$sc~Ks(bq3v)1P*?Vi4*%Lj%M6Ou|hD(k8S@D{(xOhR||skCQ_F+nx5h3l5zc0Av^umRwP zh7>bty(c0SDVJXw08IiR-5*4w9G&mX7W0Ggr-9VX!()+jiMZ+&Rc&owNYGLP#jUw2 zvrrHqDOdr&^B=6s-*7mF3l%!FI^v*cShpL+-*cs_!)%Ni`!rb{A`R?0I*l=YxRWa1 z-^Zs8;nlA2M>_jla6?}GIt!3q#w@NMOUzuMyCsuPmjOKNUlRXeEvP^qg_sVC)Td3h zd3UVW5u2Uj4j`|&CKqLV|E z95^E-C8Yu$7WU_a@&T(4%CKBn1U0*lBJR3VUnM1}HTKafto;TqMf?w;0YKq(X)hKw zF6Ys@u#EXNAjEvjkILsUN_C}HXFyUAn`8$V>Lfa~3^MS+IAv0Hwt~_0wA!giRa`dA^eL zQNIG@<#qtL$HS~h8aP!wz(os7<31RfPkjowJceH@U!~A zfST`z;5_kWzgMSq);7~3tmNRcoQs=rIW# zB186M2DbNK62YR3;t-{~GgnLorUNe4)8vjuPl8^D5bPLMjmfL!n}j!%OXck2IsUVB zvi=lJ7|=w=_!1cswepB)hj7!>D=7h1d91v%m2@V8=smJNzxqkQI2B;)-)@~ z;{pPkYG~Wq49TWx`4FMC$td~<`Ofnv_WOtC{^~toU~ECW<^7El@i?(whh)FEpM-i@b^O2$a`y^lQ;q=dON8?>oRvzwcn ze@o0$$A9k*Np`m_gRO`$4m6T>Y44y{4yzZLnF>r*$pr+d8{u~N-K>Jn%@FIU7Z{}k zWb}-HZ)(_xcDklUY-nhBJ==B0r>_ZNK@z@PK3IFk_Z)Ty7Y+vyWS9QuCw!1Mb*!#P zQl8FE2?v*pwiwf`?isqU06&7q?K75K1DpYamC;q=Nl;Ns`pD^UDQ*)YAp)qv2eZcl zu}*p7G~5KxysOI>+@=45T3wG!OJgl2#>e%=$Cf=FK&?*~=+dxs!+niffvH_bgtlIG zbuD6Ya`K7lE!H~7K-n$f>ckY33zVF7m<6Jvql+040P#1i1fd|N zmnyzo@pV%8z3;$|{{wiF%Uf7{1z^h-T-o(Rf&K5-Zi@ynMl+biN;JdJ0ie~d48P!j!) zJtDfivv1u;(Ezxoe^_yU`2Z|5%M7*~T4MSrZbyTL@oYZSU1K_;JH*4+m+tD-tHEr( znIA0Raf8@s>dV(|x{kaZe-9G7_J8m*gK74%+8p1m=hqz#{7wk#kqbk49fLr zbf+91q3r0$8{QTX5fKwZ$La0vfBEv|XaD-)*}YlMVm?Oiy8F_RJfoYz--9cWb#h>` zyB*O?7W!-vztq)MXFoGLyRfhjR=dsK&&JHG`WC;jap#2{nM_uJbo>|H%|N=Rrw4c= zEmAYNtb*KAr4zqz3?Ki12Ia5_T{N|N@lO;Am@P#lk@D(jABMuUGylCMI)=Jt`aS?; zNnBD=cF%{-w<*Ehg-#tpSlnopmj2@`6SpF}LI(wiWx(M~N@BWIXI)76x0Dv{GF(+O zH8nLb7`egc?9Npg#73knVfKAUY%2grdEa4`U& zzj@oZxHyg=cnl!wLPA2?+S+O^vcWn-9RGTA=kk-jeEEgP56s;&RRh@J|K5c+mP?-E zCk*$1&u8iZyM68d#O(aFF9`{XVEp{N+_Hr*?B6f*!fk$0(ZuRhi*`jO;EVr#WU~14 z^uRA){zdIoyuBbL1vr-feKg-x=R)5&@D{&;zXU`v{(<&2-oA&b?Gdk?dXbTcK!84Z8XHd(C*Ts! zu5tX={{Yc8#aO~}Q=C#f?s>KjFbqO3UQ$x>-y8QT48#-(Y^|)UEO094?T4uTPnIKN z1BQ3Ig_$bn30eN?^BQiH95Yd6B}XkA>Z@X|B(1rJGk6bPxrR`9_2qg~7|x?t($j8U z!?ims0dn6(`j8#W(`0OuKJB9yg_l-+X=Xq>FPH#V?5>`P%QC0)B`CS=xAK++s;@HE zQuXNvGlUOXSCy3>d|CIiL+F{qJB2d~xMI!8P;obAZJDhaV}Zq!^wzH8X0@ zYiRI7%Tc^<)m%ql;xLQBQ{M~=DKV7Y?ia8uO&yyks*XR_avZASc5KcTRkn3$V!s&3 zE6UU=^-yVIjxn&(v4peu<|nssv$Anx21mqPK19K>IdA`Uu|UqojiO;ceybsEk8f@~5L&J5e)|VGPW_|<4&0O?`CnWZd(EIncqf-KS)xnz& zpwEmOp8$Jd)&f!n_!ghq%N|-47P`f|4%OCovX$a)=7`GK@I5~Ydx*T@YB1ZB$lVx5 zQ{hw+5vtAgmUhlM82t$l0+hXRQE`zD~R)PJOBF*}?@Ak_Wpmv{z zcON8G-mA6H3ltt>9Nzgbsl_-~zWYvYrN$U>CA~TCBxQpA-(uicX6C9jpKT%{pR#6J z8HUg^3mYFC5D|izf53nyQ0vr;jNH()7o2+t`~&6gj3F@z#$i8Gg!HGJh^#<#(|+Ay z=(4MBu)G1D_# z`;_&u02}eo1=gt|&>ps}7u`<3&=J`jZs!?p0D@PhAp~D|n(oMTU8=v}2!0Xfq7_V6 zYgMb@%`LJvb8{^2nZv`CLMegiB*S3CZ$6fLVR7iB|)fMVu~>(6z-kmCFpeS|1RZ-U2fK7rjU{T+G<@oY;{+r z=yGE{43wGDs~a0rc>ljBs_~NL8IiQPUw5@22?pcLr$B{r_R8k``~Jm9yp=i(?N| z^vKBxd^fqypKH0bsa?nWC0-Y=*&eJ}x1jBgS4MgBZ){amv*9hb*wcz^&f4Gl z&nxW@=Qa7#livPk;kT1-A*{kwJ1_5+ew|I_;AnJfq-B)3km&)lj;ei-FJq@zvK6kG8^4&3Y?CR6ZW(M%U>;P_6O2~ZWI5N@j?LR9gf|7u0 z4(|9)hHi#lEy0X+jOWWC+JYN7pxPi-G}J`UfFr}PT6^$B;C20fRo8GonlGrkdXH=So3 zT(7UMue*Lu=VIZC_tAvAVg)8xAIkO6ayq^95(cJ5qGdwxyt6>b=(h25>z5MUrE@GJ?jxcD-Liug+4n+hF_ zH*1-6Ba@^GN15=IvLQVwmS8_W*{GP9Zj8qHXU?B84fWc11J1H8{+4@QQ51S)r0^$? z8IL88^@)Jqnbk_MD9+Wp^63U?Xl`n(Bgyj9LxzR|fE3^IH-xvi5TvcC>Fu>s*|sLH zSRPwx7}7ueBRaQPsk`fnHh{f<_BTe@;0WGm!0WxYEggumZJ$mO>^1DJytSXWlAdlZ z1%W`q;lSL6EWO{>NpTulikrK8V9tBIAV~uFzj(?fVX~2n6Mj`2fQ~=w{Czzc_!s!Q zy5e0VC%*R$Ej#97bCgBvXLMEowmSH?9dDQc#xE^^A53tF)jf6&KU1I*Gk-bUz`*bW z4m(n&q4`koxL-Cvw6%49od zS)HSOaV79iF^?;yJuxw>B~Cg5nU%CRuJn0wo^O{rckXWpv_WIOzn2$j*(^pRfI&gr zhuxQSaKMzo@Ao_4`TT((oYj}+cvQL}w%1{mD{;D=(i_R4=mGnELJ9Y6E+bJ;K6w)Ek(B?G6&2~>S zxT9I|LHW;t0|v$m=dRQJ)ep_j#&;+RwF&wA@0{(Vsri|9&3%#g(U2 zL4~?YEFA)cZBDjd`A;__06$ zVygE$X>@TfkyZu5al_~n$Uao^-N3~Fh0MzRY>%3e8iEwxw}_TM-uz~i|9+ckue{a- zPx$JhNrtsLRs)Zn;#yHO-N5sZq(^4_!a6B<)@|9St3uWd7scFZikI0&ze%>ZsBFfM zmiAo@fBu5$+#B7$&&Cm4Jj$AHQ&U^o?(LjgtZ7->1Dko;6a6H1_8NaFyL@+QV7=8; zTzKdot#xKP(u7K*w~vtpuhaA&Zi`o(d-CB!@+p1z8O9QaAI);E^n{1~cxT~CZONZ$tr5H60S$_Rr?6T(`N&MDe z#os{oHrv7{w*t4y1f@cjeyIStHeR1wNgLEREL1Jvnu{dX)tO*aA;;mc9D0CsYibwK6^;7FRz*Pn? z$$=v+gfff}b{Vt`-dtT(vErF38ioJA^1d=G%CCKJ6afVV3lT|0LJ*J=hE}9O8l(lJ z5rm=JKvcS=kuDh}r3IuJx*0%f=%Ksz42-|m_x=Ar?6tese%Sq_7xO&l+~@9k&J8bC zkB@yR@HRTe!Lm;GOP!fdI2#LBo8~=z8ic>ZZfeN` z5HHemC%TRv!CfDA{HbR96H6+b);)EZM+>UZsdUtp@osWq>`{KhMZApG`!f}08@ zf1HTVvw3OxYVf!F{KVAs1Q50pwEA%&WT=#nt`S)SK8ELjj|usY5bx`onN2&ygHhs1 zc4nhq)R%lmbhD~G)f8E_f7gRy-nElpE*mCM7}Wozlp*^+Ny(hbS!z31!Fw*ci=kz9@!4jAuEzHo?_ zFg>7X4`OSkm_0Bd!R1*YvY@2kB*Q=(e(Ls}zM=@)_2T1Uk;ctaO;II8w|Rb^1su6qQCmsuM->`tqxq##e;)^;08;Rn1O_|>17xb?`Yp3To_B-ViRnf& zCE|2n*9cyY-%?4peBI`*7ObV9v)r+KHpzz}O{;0zti~A3ZNbJt;UM*0FFM9$GW98E z(G5O3b!k-p<*o=^uSf)5DEFe-4b~^o|X3ifn>!kHJR;~zvJmAH%K2WMi_Gj!iaU2n9VS3r_mLw zcpY>;yqWB7J-p-c1Gks?qMhg%1C!fl(|m?26-lA}(^8_|2nginiJ6ncVrq-a&Xo; zRk2Ul{4=>@=C3?_7nZ=^?X=g_o2D{r9zq}+r$Ycv&&LRmLJ)uNZr(sxtIQ*ILon&O z47Z;}E3yAec*+Z1Mn;A6KL zFPOD8PGxG81OQ7U0N4??w|}5{U0k$3Q9gei`Of~#e>`ty*7hnvHEdy?8afcp|F(Ri zp^e<>9al@!_Km)?ki-+q0eYQI2$Gua>>#@)4(~vLsokKOkZSlULHznnK@PoJ_i}Jg zCjDU|Rdq1al02|kc74&UJ#k>Q0F;?Na`B|N_BdY3iVX8eN)(~bIsYF|OUtaMY)pCt z3zihW#_R1Jc=9n>h~;YhHx(xND{AK;iP%95r*P1vl&C~pkJ>3#pDng}lrX=J*YO@% zy%|KW*tC$cc2{2q0@*taS<6H4fR<6Qi#D0&1KN6As5F89S#HC=(8!yG-S>`CP31J| zF9;XTLLQvQsKy}FDUBw&$`eK6gB&_|%CngrugVDe_s&y=EpKK{zBNpLG2?7Y%|ZZC zcz7C3oF11z8us!2LjnCvlScJ}hDE^S>F7r~y6viA@)y*3soobJaY!3@;5if$DrbG7qU7XkpyoYSdgNCzcMl7`p!-Nr_}xUFJr$_ z(c#UZ-hdy%s81u56Wlhyx{<<3N6%W?grnNFKCE7e=%g3ikMQiFDNb~8(JhKCvu){a zten#*`t-&PgXrnMMGxpT;t!S&S__t3*F8;(jdt!il54zHd6pNX9ZVjYH^NZ<^^v-P z*<~tWVK!kA3`TG<(ZY4`wHt;`Ve|-zXvdvbkCx>l>~;<8tESZ-{xYh+Kq%}Q!EoWC zf6Uw!e1a9`HMb7Ev1DcT(-xx zQbPKaf}-<3@E3Lm_pANyT#KBM5%mTWVltlpMIT~!FqOSxx+~Vc6?!aaejT+P$2on{C=lmEEJT5S51zld-r!V_rY36}zgD+vy zec8k7lZi-lzM`ucT-0XKpG7V_H+iPw1-PiM#eLCUF9Mz{Dk_(^odSrc3$IVff`Rl4X_? z-XTs^cf*9?yVE(IkJ6fS!Qup3xR8t|n3HjIformUjvWnh?i-42N7#O#Lxd}~fnGQc z@L8N$j}CD2^23E&g?r~KtwRkMieCZ#edj3M#>=AqTlhWXr|(JFs+dyJka=$UBWn{m z;S6l@nQbTZ!G)$Rv2FtOLMVrlGa=7Fu#={9Tc+V6tAlTVT*g;n+xKe@hdvw#5Q&4U z?v0oXPcX6k-gE0#Ied~#V!Dat(qQ%yan~t3N6W1Miay7Y6c0bC(pxLeyq@l z?}%oKmZU)a`C44S*z0UWsnxKR+XBT-l)5BNdyp}E6FFVpGkqE0P@QNEzpa;v-XpD) z#cEK$uMS)~spW(|n$g*X-2G!&gg4??lB0gxvF$6i>|FxAW07e5R%Dj@OUZRxigYUp zsTTy}?Wqr^!F`tlO)PT9bI^sIZQ?`M7t`AJf0``gcwNB=NLXilhZ3)}G;CZ#Xxh7o z^-vME$)#R-_wsx5U+cvgMP;`|!E~kydD~Tyh6^m=nG~mdXwI@UV&UjR;wZkG>U18k zi4&&2c!zF_i;V)w1+p^f&fkY_SgFge&xAXU?{QnRZFV@3XNY6IX;gMjg^EG_jhS6H z_&auI2;+RT7uh%aK9GNTcoj+%i}RE4B-4>B4~yvcE{4GhDk<|Hzn(D0l-4%3RBSm} z$~IQdp&%AqnA;{w0TlW3Z*G|Uy|j&*$D zMvxKM!GGJ0<7YS-$*#L>*gM1Vm|Zr9x~FGgaXva|z73`RFQnd&?1dH$`so}v1+MA5 z19MMR_%ND}Offog|96@8^oyIUg{tlTnLR)PMd_GjqVq$aRcapAdcBR47_y^Ey9#D& z52SU|#5}!beX;bW8}ajs^EW#emLb6 znXnuBj4MeS`hJC>*zX4t7PAoj`Mw(sBLvI^10bkQbM<>fHxpufLw%9x{>fZ}Bhf<= zL6_wPuDk)M`=#|F3jrJUM-@%1t3(G0kHCaF(8YB*Gb;`yj&;u9W#uMuMuM70!xlA} z`jhYtD!1?5LB2XF*UH}ksMl#?0;+VWUp@RSS;QqXfCC2Uoo1>|9hnYh#KQgk@$OW? zJ@lo-nk2J^i#m3UH**cIW?MLW=B=H z?(_E-6g|a?y-hrbpKiEq`R%_`%zQi_HJdk8Z4IXW5rJWvisN(_qlJH^wJbZ&|g^l)lwv zD85)Q$BQx_o0Q)&L8V^+c02={Ek8BN;C6~v-3}GS#GcpfWYQ*+1z|?e{>N;xB~VK* zdslNS?5S$m?Dh7Yq$D-HzOe!i_HV>ESw*{g_XsTrOiJZ=HbtrilQzcRbv@pF)%M&1 z{TP)h?A9h%G$&B&u<@2rE9x;*4iO~r;BPAr%rNU~?hsBkg8T#qI<_XH#lkGJJKi(L zn+D25eCb@&rX#N-_-6ANSlGlc1`&E%i2cVPa@tw~7a@qDrSMV}$B4s}7okf6l4DV6 z+jDVdH+_cyoSBjMFB=rtmEx?qbxGf0j*$R#D$1)5wWt54dhvCviA80-+lr`)(nIV{ zwa#Jz6_%_DS~)m%hRVZQFsJO zR#t85#!NV1>@WS9Ghi4h9Ht!+63O^q{8`WqdNue;UXK-?qp>g5Oq?T?W1*fTpHM3` z=7JJG9a9>H|HCu!Ba}-C1ZSa$op)6b_$KG2<_k?OnK@9P4&%fh}y!S#eYFy$# z)-#_HdZ4uZsE=}!FUA`WL2XlFqA;Ya?++Z>za1qN)99A#T|osRF!)PlD6XNN#g*y3(r4|90(8;AM{c&1M~MfMI&v z)_9#mf9XHA0uj0l$<^h%#d2-OepNz2HPK0K-@Ygc{Q@e5+-mjGQ&0NodO}Q;^KV3; z=oZk6U%qv`Gu9weud~3@lSW8Ay%(pPOHuF}C{R&W2QvHAZL96g3s9Sru ze`EOcki^*jum>7&B06`j-uXn}<9B9h~#DF&5nDKf+ZK+)o<^JquqR zg4?ag>`VHeqvN9Y+z%?}pDPM2DivSg!HaQzc}b4=SFkOFQQ|MT1HPZOE{%Mf+_wut zyZdpgw5*2;5sc}nrZ%6}#!1WM%Qo}Fmn$1vJKUTrF_{xvi~|1?Cj)I~fz+oxLB8_WgDtr#ZiAgVE0rmv)VPuFS_0eV&Lnz=@HN9#*n|;5<~JVTIsctv z0CrR(tXsW5QC!_kXn35=xJzfdEvFCrCUfm>nRgon*{5^3*4H!ok}bFWL|6oa~Rt|`G) zx7H~Ps9s2M5)u%+dx-;4A^3|I@MU1_m(f8`v0bx3_>B=W{yp1BFoPJFA8|cZ<+6>p zI+L+)JT}5dkD;vgzK*TI#)L8FAQ{?!A(dDf*8lUkK*pJXFui%c zE%PxJR%Z7Qft995kQIZ!qpmv>o}L>8^`694>5SBt%0wqzv)YfpXsbv1dGA~T#W_g* z-#EWQC2aCmN0eaUQQvzBsG~nDCZLwhA;He@1DI~!u|ab|2znmk2bxO%2~H=iR+2ud zS1nqP$R!uaa1Mwyn_aBxF&z4OMXho_DX(S~!1UbmZ<}qHAPmju zZjW?nEfqu+RH?c-+&|gjZ{an}UdS3X(E^{6U3lwm+wnZ6jh6NJ!Sd*nnBU4xB_DUD zXdn;%EiC<-%j}xKtQt-HeGd3?lb3~>Nd-SU(6-VG3ajdZ=|@0LbN&q=-E4dvQ^mCl zERVxr)H8#yx@72fvX!xP*Q!lCgysf@2u#IX?M+SJ-G3)_Cf{s+1lOAF^<8;UO}NRs zx6>0Nyiw8dh_+$yIp7t)Qlx8P?VE=04$!=uHzqs0@{r5dFsuL)-ptnt@EHQxnYlx+ zzs2Ov7Z-I>l*)}d7#j&wQ1PC`1y)Veq->wosvn0r9!)m~E>J|e-sPPPeG55h0Jx)S z1->a&jkMIcC(2!OeR7IqX6N1AakI0uK@p_iyX{9m$WY=9+ueLV5)ZWQ7BGIdTvKO^ zXX+}Ytag7$LLnc>FqCWNL`W&w&QtRDgQT)W!JG{L`>)@ME9b6~P_hX;dd{^rJy=}Z zdR#;BF#6nHcS`v z8+?eYK!Z_@GLCp!qDTZ=dsDd4Ok>_$wn{*^IwbMaNj(l^$`u)}cd~!q3e@?U6Q@^0 zJ4<`)QLz3wIj%xR^4UA>07Bppix{1hQoK{3qOapWf1aJ1aNhpXQbZfbkn?rIU&wem zIoz12h*+C~LWedvX*EqAgcOP=(7iUx4U35(zjkeMc48IOg(h;kbL3RBI_KybMnj)& ztWACob$uoI4D|1=d;{Z3bx-uRs(3Ur7+ANn^gh|wCqKp!lms;? zAdp`t!FPQKs;+6;b_m>~@MPXTVlk|d3!v$TfrFi!X?vmTs?An3VYc%_Ml?75H=FG* z-{Knro?0UASDR_AuC5l$9k^+a-HNXrWzg6mg8cl9aUq+Xx(`ZHlsmY=?}A! z85E!xy<0{Zkcs?(j7lvT@+TB{O1GkX21{(vb2VL;>a70?By;{XLYno5x30+#XjZYG zww3Ub(k=I7zEC!g9w?+-@>CVqw#Wz~e0_ePSdf8C>mS$N-Pnve9Uu*oFK+)l!-BYW z$K=Ms+zg)My)Ny|jhmkMNA&)``klOifpPfrn6L2qlR-qZ#IKKw&cV3Afhq!Flv&zEKDPgao?^q!uJ{xZCaUA&kPOkl@_Ry=WHD5``mziz%{!n$gc!Mtomz zA&E7ofz9ch^8deQ<94(g?f;5Z?JYf1m zoSGhbmBDG=7oZR3PhYEOim^1_eVd=R|DHDdff6%D6Y}8kpBMkjAJA#AH!GA7FLrG2 zFQ~U?{U7_UF6##V=y2^LKiZBl87DA!ydB#STdtjyl(fip3_dN}P9hHo2&gdxR)p%* zcN?F6Y<9GQ>~ZCneZm7Yw1Uei^tCNuiYkQdqy&voBmg~Lk!Mc%dc_t1{j&wzBjr>A znDjT+t%sItgGE+2{zxDzSj~wH%f)P@paH2I8`Anj5`r<#x_GDCiIPZo*4%5ju&)lX z+y89)yp5lBjQS5yP}qFHFvT z{djA*7t?RSD0qswFQ1rQqsg28ZQXx=893@*k(W<#rcei%@i!fIptTD3mGMWTR76}# z%F1&R7_7X*SVwOzpRD&u2jg>{Tam|U1nJblf1l`<^g2F%Rr--QIJ6ArTN9uNGt8R> z5xa%A(5uz&Z!vRO0!$}v{8KccFD&mdTWXWasaIjQ*up%i+-n~?t& znE!9K*g4)p3&;kn39UHAn;bW>ic^&04E(}>nDa6|hte>AAb>JvGx&MTVkoc8BCpTO zg71`C?L!*FHXkV8(B4IO6WM88l{C2QLw8P+CWtPD%kA@w%7fY>EqB4`qvbWV$ zmwQyy)wk``ixWrD%QKlivg-Z4f=d!(ndLgY7%c~AAQy}>+g+Iu_0lIZuHwzF4Yys$O`iV;-889v2ATF`!7NGAt&jw)uUy9tl=eRh)zPx$n=L!}IIaM>N zR(vmUAi5{ZX9-$V?nb5S4pwQQ(r?VPoKf+`t`sJ}{uZCufo0z#2;~t6uUgK|b2DcU zkHX2gfd%+p0tyEQC#FnYI>2W^VEURFQKBaHglTTkzHi~nV|iwWD0`WLsE79Z5=0Qt zyKsu2+O!gRq21C4a>|rk5EX!qlT(LDuahQ>p}lh-S`KgNU4i@q%CEHD(vsz|0tZFA zM9EL-a`J5M=t0(Fk~1QOe~x7tEm8R_>c|XWMT-Z%{rB4!V*pBYb~Zxbjc3i`OCt`0 zxbTB+{_6~*g74#z#WT3h52t^0U-tU-XUSczv6T*%iVFCS%vq7-KcG){yN$$V7g@Os z@iWKi9=s(;6vv*~c;Gu~0ad9NFSqoI5e6v)edQcPKi`Am&aW|xU;Aj056Pg! zZvHXFnKjaNZWjS?D8Wh*KV;V3EmQn*y6pgB{)a$!%+Q>2%0ly{zcGJ(f+d?lHw7db zXx9_QxzMF8G@vwdYi@a29exI44tVN>wg+5#JTpw0F#oh%65&YN|M)FXd+Y9DCiD3D{>^_moHZf&N>K7r3(T4?@WgSQ5x z2dKvrFg~X2)~kjFQ1Yk6<9MO|@b4Y7N~<>27@pklD6{wg3KvyMK}ZiUBPXvodomg5({yM1spvH zm`vP#5k2^Yh!Qdnlr3N;97qR{9E{vSAQ*A`U-(lHGR$>5mb@_o9})yKEke+9c?(A|jCj{l)wGw-qa<3XaUx^<+9PZ~{*;}(+F#&t$< zlQCg=IhG<}1Q;|sEHAzAh#uqpp00&plwNPDs5p9i@KH+i%5tI8N|@HXsMdMFKq)|| zFqooUw=GfUud(yNdCFphzki;ktD^AXgfzP-skiVO%rvHL_RDZTRw>N z!Sj{q);9XiFr7ege`*vi)m)r^=kIJZ(-#{RJUZWa@md3+!*IB*w5LoO^MTW zD^t#7E;vW{q*7B8iS$^&53N!LPRG|%UQ>VyBYJVJROUhSr+{-4FEKfguJV8s}JG}SPY-ll1O8{#B$N{vK5owBD-l8_0;ti$jKh*$Bg zQygWfxlP0>qaaG4DHJ29s?0(*ZTDc1%u^ls`fd$F8`Ox1=H)4tgP!dCf~L2gNdXoW zgW{`e^0BaH3K8(3AI9d=+&(`28C;)=`8i}ieTy=d13&2TA0bAHh##JVn4PYE27lev!Ml#{J<%MWJC$Fx_j zSTv=7HS*Ml@7fp-`yneO;wH;dey`IXo1f(cxo?c(QlLyKI*VK?a+|y$&^(fGBXD$THDI z21DNTZKL=Y6P8^+tpPN2ji!P2g6{5hrp+yORI8&#HvN>Y-tx`#o~LIL@lFxQh-iYE z=pro5IA=TuOsS^>#DYTtgxPd!r+8fUO=0!nTcN_Q0xTzoll~a8*G_FeKQ0n(Yx)Y` z>$EIzHB_Icn#S#Zp4eVVU-mN1@IfW6h%I(;6fcA8VngNh4cPGP5MHhdw5hUO7-z9} z4EA(ISQc^t%VP@0G-WgT>+$4%eKI4~=Hgwuh$y~#vX`_7I?q^FBYUApMSMI6$*FPv zdAUI#bi_6tx)1JyNEjPuu6>H$mO~7xn>dby7Vr12o)IxRrA8tz%FK01-ha;8kgAo93e>VRA=Zl*b%rSA+FZ4_a4;J^x5=-HrXa zNFA1i+qJ9*EIbWl%a9eu&MAJ~4@%Un$ikiXW}I_fh!QzYk1W@YZWn-+K_{iR4ekfi zKYdt2x1@KbVm9+vsO8tq5ZV5hyMCEOB|SpytiO-P+}Sxx5vm!!)d z{nXyW1w9%5Wa?Rb*5uPiXB1j+$&4oR;WqG$S>Acj5(h#sj1!BRjvX~&JvbJ_Cav_Lc7&qEl}UH+){t<(_fxpzH*5-0xEK2#uPOzZ~6mp6Q`F zrh|ywKV8c>oa~#rXFI>YPQ#<|N&g664mMWBvLLRps^-|^+t$xob{5;b2S-|#xP^<* z$05)K!3*2N?7EMI^T#81{l09Sfry==I9g?^?x|s$Cy(Z}OYDwSVNecZyH9rOe#|g@ zo-Fr9-T2*b_Cw06-KdI$3kmZ@)JM@gpXfVv{Q2sm@*>saTlt}dPzWQ|-wN9c)FK`c zc(7Sxx~aw`<#}8QJ+4KSTZ~w{N$VGDPX*9M%34#u6nqs5bAb=}hUTlgjeO>Nd}q|d zHi`3rlfLa_SmDMx`d~JKIToqU(w8UfxJQ(E>8!|Y?5V>Bk@NAbPapm+a}V46t)90} z?I@9+bNKPVl6CJLbQ{MiP5ww{zxa6Z^V?&J%1(%FHV2aY)`ue!2! zFp}z<=l*fdz7Ru2E=u}M)j=ZrzPVvDuJ~{xvf89ad$;zvOpL32U9^=o*XW_{+*>`H zHYx>jTrUuCV;CUK(7L?#vxnH4MM{Bg^hky5%j}%RTyIp8{4LHg7S9X340>v?X$aLm zzICii(rZ-pR08iS=l z$)nI7vVx8Lf{~p|s1RWXxcyBtWLEmB)eRXXdFL3{?Sv;riyM>(%ehzh$;JL0LlUG* zNg-xHv-d3?#KN}h3l;yh#^Snf>tKHmpWj`9LLGB>dEFd;lEdYR*x4pZ&rzuBw}Y4b zFo`0KmZKU_5v?gBRpoUyK>`NP1fe9zh+v|sk3i3$M#wWf98uO}!Gp-?_GokbGm|NW zQ{AYX?Po2=O!=8&U4u|Z1wqwcbHWDjg9ulZU{_x?4tqbIAqk^|xZrk8a~LKb9Rgl1 zS6;;CiXO3S35{lPQ~Ij-LgQkks`>uylF>p`P2dk&6QtrCEl?TK$tI4+^wx38GS_Vb zs!Z)iX9M^H(FOxeWlvkOmU(d+dWtalk^%ss22kud`{pHr9-Tex_1dp=(6dB^Z-W;5 zh=9=~dzoCZ9OIJQH9b?L7==E5CEep}ysomW^`%$$rOrd4KJ5*gnO0_V(LVs*x7}Ck zb#Xmt?0MMbv9UbTIVHBJT72_mUQq~u= z_(#YjdE(jmacYVWFjrA}ey>YzkJ?85&Lz=J4QY~FXOEIoUfc2-y5W@uyiZJQa+hMi zvkGn!UF=^#z3(&d8Wn{eZgr;SGSqOw*E zb>}e(mZAO!p)shfp#(k@Ss@EV4qRx4;VbBiy|2@H*)!qSWG-<<3ZHGGY+lkcvMv`L z8gZF5UKnlv>?@?ta+q{DP;BcXjU;D`{I2fNK#9NXk)Cg=S1YR<4L@RN;LR+;OPs?h z0o(@OrBOTB{P3sJhl5j>xW=eCJIX)9(BEJOVhv514K}u})a)}l3%WgYrODDjxD$3N zIbS_~NhH#ZwSWWx&h?sGs)o{WUF91h>+{f(S}i~y*`a9;XS1UnM=2Nt*6-9^ zk%}%PwW$X>Xvpb9x8tul{@8Y-o=FZ{2lPPOVn7M%4RKjyKyXdKVro~Du*DG|i3m19 z1N~u$IL@*%Llbc=e;_lBpDXS^`sJ}nDDKME*Cb!!kadFR4=^u$d0y1#}>pGV3e&Yu?Ev;~9TI9$3Xf+|lQ3 zIsyg@sR{D@QIi6HrXiWS&{C&~sqztc5#c{*BXr%|UV!ys4!j6kZyi*3jawRv@bq(? zJT!|O&aMpQ?;zoCu4|g%Y;WU2yEv}#ZCgVNCi{`L=l`5X<3-CPd$}uBamUuQBJ)Y|-diKEKBj5f_`Y+UVh0#^Dq( zxI3=HWyN^g_^7jx=`&w_^!C_P?2;<^Sxge|1~7lYg*hai%9|B?TC5>=sORToTc6t` z+<(|%``z`EU>+{FKWADwOFqm)XsakuqgHdTF6-Fx6~i`vVidQqtzWmf@}Dz5Sws&b zpRj7Q*M+`Y9zdd}%?~*!8Z>v8UT=N3ij%MCsCXc=Ah|96_=v{dnRoN?di;XSh)56g z=uOG&HUjur4(b1j!t11D>}-}8BE;5s<_8wlLT`{ z_kJz(Ac}oIngR!L<~lZ+aVNleNb@MNzUL~b;=OoHHk;)Z$kvgOW2 z^mJ6*dOn*2N>^*)+4PZrfx3suEWra+S@b>F{>NoL9EM)dRE^DEX>+t6q_Zz=BMD*P-Uz=t!j2hj*Nn>BiGZ+6!{B+3> z;d+z~L#YhAvdYgB~^@TkfGOH-Fe_ z@Rz|VK_nq19#xjCA#VJzm_O=FA@{%5$#bQ8h|;krQ1gUd_Y4t9urb=HjE|CI*`gh5 zwKRhfSv3!bzt8J-yj$iT!Mc+w?P#6e&<_C_k$E#;QfC2$VncKzsnZcufUA3PK7~`ftR^P1#79G*PF%z)VO6lAOtr&wkHbNbr$(a!I zHpI81U0ZeSec6|6w}%sgm(;oZBPZMKMotL@prM~ucR38}HLDGnfuaa+; zHExG5IymfSEN07Rmh8GY>|4V6RMFcK!xCk;(W4%wEA&tDx_>F6pHBMmH<&oGHk!zc zMqd{R#hL-7woE~Qlr^iL8gg`we%vM%JZ`0Y-R@=3LjtK+3+M${LxMVt?l55|o_tzW zFRT1b=H^w4x-niHhMssxA}D-gpj&UQ#5lt9^HzalLiL(E-xp=JWd>&uJZk}l!h3R# zTrxnErddELpm46$%l|k%BG_jpA>O9ZN zT^Pu2T-i{1oYvYc+-{k$G|G~(d3A0dSRM1^T{rY^`gQbzf5ekW-Fuw&e%yTZAP`@A zAy>!%`G6IVp4cP9zN`yY(dyi@0zZfqTk7W39(|28?mN~3%szn_(y6PV*&tvzDtkT-u(p?|A*RlZ-S=7Dx zJpcz`r2IAV8SzMKh42{_P?!XafwPOWu=rZ%ITeo!XHV-L+>n`fuhcF*P_mdKrL=l* z?oaso%4l2An6u%lZ)+cLT6J14#3lNgilFH8@pgcgN#;#dGjw8mji%8G}_Ncs8_wcRTD>-pU z2KbyAlj|XvB6?XwbyVs)Q9e|5rPs!GTc{>>|F!Hke63Hz{slyV{lxkcJptxzaN$_4 z`NxsoY|aZ?_!MuS=HBjNOO+!2If&{hf<(#}(MEluo~WX=o-1fa_S#Li__Qtd`Y=KS zw0}VUr~{fWPl*pvIdzC|=%6OVFG@X)SdR)ih1xD{tZ#2Bd|b;Uz17WHj6Sq<=)W_V z&vzCgc`98vwT+aX)w=u2uucZ#mzk@xXr3nvTzD1kIh`)6UQc#g9W~<;^2@9yrSC)L zv3MtGqI72kacauOg=zG<5sSD_%Tb!>uo1ZWZHs zMtp2DFRft*nL) z36i46iY1xK4RgpRUM3?=MiQ%jR;;vaIDU52vpz(%FQJF?@k`f;YSke<*mbYY@rR5Q zbL5xQc}%$WtyS5{xOX-noPjNIfwM0WnAyQ=*lfw&>%&n<;^=MUbC$z5g^Sr+*TxW* z<+S@lL*=20F=xG8PDNORlGjA9opQEqOCZeI>M1JfxS;=_(PL3-YkqlH{y2Neb*ruo z`T7!?*Onn&4dS)_@su_HN&Ek{y$NpWe0>^>(Rgmmc2>A$8I+9{zCSCMS@RA zsjDK(OSx#AKWV_r@CS%V=JFy?Lte+`M^_2D4zLw~4eA}S(S`VRR&HeKb7RxCU-4Gf z5o{`3XpT^a(iv1mU6CWzrZJAlozrB`2U1E4Do4DE*&OHUnZ=!kPrTs7wedmK$EonVLzbB;~#P zwK(m7m)YiEXZ7&*nu6eKJ1ptTKc8WFOH9}$5WCE7h^Vl3c#nEgEEOF|e>;Pq_#Fwe z+Q!Dl&G%o_Brn;!@ufTK>5cV$)#`0wyd%&3Q;*W$|CAF}nRahwcruN+J3Od7T%Rx} z;pXH@Pn?um*SE8`&%8>}ma9|N!#9^mBs0uKy%l&T;eMK$$lfWxK<<&G?0zC)Mt;A3 zd#z`p&iBy7eeHoDPFXMeToh`}F@VpdU0Gg`&U(it@Zd5uJh$)BUvHKiBpQ>1tc1VX zh`chF39}cul~(ern9pwc@V@fQOIi|sV3TKkX9$O9f zn;fPn8Fh6~jc%T7c`uws434&@fA&mPk9j+Kq320-R~QDf*S)uS7vZWZ`%>rsLF?29 zfSm9fejYbc@kD&^l}JNNnS^cmc;gN791DXa5dJc-3%r}!bIh^t^km+JX)HdZ$9}(oT2?_YnNPgx^}fb=zg%N5^FFK<%+2XtaTKGs5? zxxK6WeLvHZQ_07+^^w;N>J(wU9ei5Co$Qt~?}&3QYSfKA_Fi_#xix08iKKC^s3vC= zK1aeVe9l^Ir~meHmay`#BWG|AfhB`eq+8x6VZC2ex-4*3-iI2Bh+B85FFHf#s}p}E zyu+rngOqyHoHM8Cj1G2_RId5t%PL7BHYKlTF-V_F2tvHymtvumUY9NvaElGTMR-nw z3@YiF2A9nZ|Dwj~?o^w#>V9MXg1pVw_nucCkA9kf)vpa5nivXm9w}E&EctTys841S zde|7X!SKy@@18qVBMRKxtnt;CgnZCApZK!XqkZH>vNUYoWcfacvHL7swKlaGN$L?T zp)PwB9s z%JU9apcOik+3O|*O;+651)4$^PICf8Ds^QG9*hli-3&Qsbz%keRHd>or52gHyX&dO zJvqGN%JJqA3?IHW$MovyN(xCc;xq8J*p-|QP!4#4V6r{fvGI&jnvUen>D}YD{8GQI zkx@dIr*)3jSK9q=Iak1aE%o2g88)j@yVNl6L19k!biH~%OYRE4WWBIB*N zmDL7EOY$Ax@WVinI_g^4O@lD$B_#u&J7LnP2IFTct3$%!RB37}ZRL2v88g!7iCr>- zG`o|HRbfF_%nzHNF5JjI@c-nV;BIa;$5MX5jB51pgPpqq`K_f%t=WWa-uqMfiw{2YZdK6+{GI= zx;*=|Gp42Q-y057zjEN|oVYB#m%cGi*@^RE;>;pQjE;J)^CfiR(iML3pE&3`#x9>G%K z&2t+;?86GnH13`26>AKrc};bcFNe5gMF{Ri!PGtz3DA<^1KD)+0u}+bO!Dh1kg0 z_Zxtm>Z|lA&Y;@8!znhQPRhKKFDG={T&-@O3G49ouE@Lk%p)n;&_Z_C%Ae z8Rcz=P}H3^qdIz{W3z+T9x?XxvQ%((XPrk`fqzYp|F&*(xp$|$6`2VS-X_T2Ka_?J%jxDymIqBV-1UIgI?~f&Nc^YP3`HD}XEx<>@rP09L>dPe6X5tfr_wDKRROuT@E~R+T1z8`#6kolj)66t{_5e3hBJFGKJ60b9Xg6G&uw(z+JJL zoN9LiFD7d%^zvyG1W{s|6>hq|3#Iu!(N4^Ke7qM)q}Jm6LcfVaif-4MSKKgE=A0Pg z3o;Ec)cM`pl8nw75v(zvtE(H(%(kPNMQjqRzQ=ykC+`zD0q{#q)BBXZMA!Q;y+`W_6@V9Lke|68W z?i0!P+ay=!vJ6sPI!UF9&x22aOUmWY#v*DPq(O3-8n=&>Yvhk7szg%yWe!y@OK#1-$p3E9 zMAdSjANBhm)JF%{DJ2d?girTI_rkSU3S%Cbqhn+y1G?LYA#9G8aZ zj&VVdQ+*t%bEr%#LS1Dz>>w{6c;I{q0=f0}poR6gGTU?h%bb1aO1W%pUd4_i&J2}DZl>66^Y&)@tHJ+R+n literal 0 HcmV?d00001 diff --git a/Production-Traefik/README.md b/Production-Traefik/README.md new file mode 100644 index 0000000..2ef4dc2 --- /dev/null +++ b/Production-Traefik/README.md @@ -0,0 +1,73 @@ +# About those docker-compose + +All `docker-compose` files in [Production](Production), [Production-NoReverseProxy](Production-NoReverseProxy) and [Production-Traefik](Production-Traefik) are generated by running the [build-pregen.sh](build-pregen.sh) (or [build-pregen.ps1](build-pregen.ps1)) script from the fragments located in [docker-compose-generator/docker-fragments](docker-compose-generator/docker-fragments). + +The pre-generated `docker-compose` files only cover `btc`, `ltc`, `clightning` with `traefik`. + +--- + +We strongly advise you to not use the pre-generated docker-compose of this folder, they are deprecated and kept only for backward compatibility. +Instead use the [build.sh](../build.sh) as documented in (README)(../Readme.md) to generate a docker-compose which fit your needs. + +--- + +The `docker-compose` can be used for production purpose. + +It is composed of: + +1. One full node per supported cryptocurrency (bitcoind/litecoind) +2. A lightweight block explorer ([NBxplorer](https://github.com/dgarage/NBXplorer)) +3. A [BTCPay Server](https://github.com/btcpayserver/btcpayserver) +4. A database (Postgres) +5. A reverse proxy (Traefik) xontainer that also handles SSL certificate renewal + +![Architecture](Production.png) + +[The Deploy on Azure Button](https://github.com/btcpayserver/btcpayserver-azure) is using this `docker-compose` under the hood on an Ubuntu machine. You can use it on any docker supporting host. + +The relevant environment variables are: + +* `NBITCOIN_NETWORK`: The blockchain identifier used by NBitcoin (eg., `regtest`, `testnet`, `mainnet`) +* `BTCPAY_HOST`: The external url used to access the NGINX server from internet. This domain name must point to this machine for Let's Encrypt to create your certificate. (typically with a CNAME or A record) +* `BTCPAY_ROOTPATH`: The root path directory where BTCPay is accessed, more information below. (default: /) +* `LETSENCRYPT_EMAIL`: The email Let's Encrypt will use to notify you about certificate expiration. +* `LIGHTNING_ALIAS`: Optional, if using the integrated lightning feature, customize the alias of your nodes +* `BTCPAY_SSHKEYFILE`: Optional, SSH private key that BTCPay can use to connect to this VM's SSH server (You need to copy the key file on BTCPay's datadir volume) +* `BTCPAY_SSHTRUSTEDFINGERPRINTS`: Optional, BTCPay will ensure that it is connecting to the expected SSH server by checking the host public's key against those fingerprints + +If `BTCPAY_HOST` is `btcpay.example.com` and `BTCPAY_ROOTPATH` is `/btcpay`, then you can access the site via `https://btcpay.example.com/btcpay` + +Use `docker-compose.btc-ltc.yml` for bitcoin and litecoin support, or `docker-compose.btc.yml` for only bitcoin. + +Any unset or empty environment variable will be set for a `regtest` deployment. + +The ports mapped on the host are: + +1. `80` for Let's encrypt +2. `443` for the website +3. `9735` for the bitcoin lightning network node (if used) +4. `9736` for the litecoin lightning network node (if used) + +Example for running on `mainnet`: + +For linux: + +``` +docker-compose up \ + -e "NBITCOIN_NETWORK=mainnet" \ + -e "BTCPAY_HOST=btcpay.example.com" \ + -e "LETSENCRYPT_EMAIL=me@example.com" +``` + +For powershell: + +``` +docker-compose up ` + -e "NBITCOIN_NETWORK=mainnet" ` + -e "BTCPAY_HOST=btcpay.example.com" ` + -e "LETSENCRYPT_EMAIL=me@example.com" +``` + +See also [The guide for docker noobs](../README.md#fornoobs). + +Make sure the domain `btcpay.example.com` point to your server and that port `80` and `443` are open. \ No newline at end of file diff --git a/Production-Traefik/traefik.toml b/Production-Traefik/traefik.toml new file mode 100644 index 0000000..e54e954 --- /dev/null +++ b/Production-Traefik/traefik.toml @@ -0,0 +1,35 @@ +defaultEntryPoints = ["https","http"] + +logLevel = "ERROR" + +[entryPoints] + useXForwardedFor = true + [entryPoints.http] + address = ":80" + [entryPoints.http.redirect] + entryPoint = "https" + [entryPoints.https] + address = ":443" + [entryPoints.https.tls] + +[retry] + +[docker] +endpoint = "unix:///var/run/docker.sock" +watch = true +exposedByDefault = false + +[acme] +storage = "acme.json" +entryPoint = "https" +onHostRule = true +[acme.httpChallenge] +entryPoint = "http" + +[traefikLog] + filePath = "/traefik_logs/traefik.log" + format = "json" + +[accessLog] + filePath = "/traefik_logs/access.log" + format = "json" diff --git a/build-pregen.ps1 b/build-pregen.ps1 index b8faf78..0c1ce52 100755 --- a/build-pregen.ps1 +++ b/build-pregen.ps1 @@ -3,5 +3,6 @@ docker pull btcpayserver/docker-compose-generator docker run -v "$(Get-Location)\Production:/app/Production" ` -v "$(Get-Location)\Production-NoReverseProxy:/app/Production-NoReverseProxy" ` + -v "$(Get-Location)\Production-Traefik:/app/Production-Traefik" ` -v "$(Get-Location)\docker-compose-generator\docker-fragments:/app/docker-fragments" ` --rm btcpayserver/docker-compose-generator pregen \ No newline at end of file diff --git a/build-pregen.sh b/build-pregen.sh index 27fe54c..f430474 100755 --- a/build-pregen.sh +++ b/build-pregen.sh @@ -4,5 +4,6 @@ docker pull btcpayserver/docker-compose-generator docker run -v "$(pwd)/Production:/app/Production" \ -v "$(pwd)/Production-NoReverseProxy:/app/Production-NoReverseProxy" \ + -v "$(pwd)/Production-Traefik:/app/Production-Traefik" \ -v "$(pwd)/docker-compose-generator/docker-fragments:/app/docker-fragments" \ --rm btcpayserver/docker-compose-generator pregen diff --git a/build.ps1 b/build.ps1 index 2eb4277..23ddca3 100755 --- a/build.ps1 +++ b/build.ps1 @@ -23,5 +23,5 @@ If ($BTCPAYGEN_REVERSEPROXY -eq "nginx") { } If ($BTCPAYGEN_REVERSEPROXY -eq "traefik") { - Copy-Item ".\Production\traefik.toml" -Destination ".\Generated" + Copy-Item ".\Production-Traefik\traefik.toml" -Destination ".\Generated" } diff --git a/build.sh b/build.sh index bc66030..d86749e 100755 --- a/build.sh +++ b/build.sh @@ -24,7 +24,7 @@ if [ "$BTCPAYGEN_REVERSEPROXY" == "nginx" ]; then fi if [ "$BTCPAYGEN_REVERSEPROXY" == "traefik" ]; then - cp Production/traefik.toml Generated/traefik.toml + cp Production-Traefik/traefik.toml Generated/traefik.toml fi diff --git a/docker-compose-generator/docker-fragments/btcpayserver-nginx.yml b/docker-compose-generator/docker-fragments/btcpayserver-nginx.yml new file mode 100644 index 0000000..366353a --- /dev/null +++ b/docker-compose-generator/docker-fragments/btcpayserver-nginx.yml @@ -0,0 +1,15 @@ +version: "3" + +services: + + btcpayserver: + environment: + # NGINX settings + VIRTUAL_NETWORK: nginx-proxy + VIRTUAL_PORT: 49392 + VIRTUAL_HOST: ${BTCPAY_HOST} + SSL_POLICY: Mozilla-Modern + + # Let's encrypt settings + LETSENCRYPT_HOST: ${BTCPAY_HOST} + LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/btcpayserver.yml b/docker-compose-generator/docker-fragments/btcpayserver.yml index 2cf8a8c..7425cc5 100644 --- a/docker-compose-generator/docker-fragments/btcpayserver.yml +++ b/docker-compose-generator/docker-fragments/btcpayserver.yml @@ -16,16 +16,6 @@ services: BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - - # NGINX settings - VIRTUAL_NETWORK: nginx-proxy - VIRTUAL_PORT: 49392 - VIRTUAL_HOST: ${BTCPAY_HOST} - SSL_POLICY: Mozilla-Modern - - # Let's encrypt settings - LETSENCRYPT_HOST: ${BTCPAY_HOST} - LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} links: - nbxplorer @@ -34,24 +24,5 @@ services: - "btcpay_datadir:/datadir" - "nbxplorer_datadir:/root/.nbxplorer" - nbxplorer: - restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 - expose: - - "32838" - environment: - NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} - NBXPLORER_BIND: 0.0.0.0:32838 - volumes: - - "nbxplorer_datadir:/datadir" - - postgres: - restart: unless-stopped - image: postgres:9.6.5 - volumes: - - "postgres_datadir:/var/lib/postgresql/data" - volumes: - postgres_datadir: - btcpay_datadir: - nbxplorer_datadir: \ No newline at end of file + btcpay_datadir: \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/nbxplorer.yml b/docker-compose-generator/docker-fragments/nbxplorer.yml new file mode 100644 index 0000000..4edc651 --- /dev/null +++ b/docker-compose-generator/docker-fragments/nbxplorer.yml @@ -0,0 +1,17 @@ +version: "3" + +services: + + nbxplorer: + restart: unless-stopped + image: nicolasdorier/nbxplorer:1.0.2.31 + expose: + - "32838" + environment: + NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} + NBXPLORER_BIND: 0.0.0.0:32838 + volumes: + - "nbxplorer_datadir:/datadir" + +volumes: + nbxplorer_datadir: \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/postgres.yml b/docker-compose-generator/docker-fragments/postgres.yml new file mode 100644 index 0000000..d558564 --- /dev/null +++ b/docker-compose-generator/docker-fragments/postgres.yml @@ -0,0 +1,11 @@ +version: "3" + +services: + postgres: + restart: unless-stopped + image: postgres:9.6.5 + volumes: + - "postgres_datadir:/var/lib/postgresql/data" + +volumes: + postgres_datadir: \ No newline at end of file diff --git a/docker-compose-generator/src/DockerComposition.cs b/docker-compose-generator/src/DockerComposition.cs index 65f4256..b9c8f9d 100644 --- a/docker-compose-generator/src/DockerComposition.cs +++ b/docker-compose-generator/src/DockerComposition.cs @@ -42,15 +42,6 @@ namespace DockerGenerator composition.SelectedProxy = (Environment.GetEnvironmentVariable("BTCPAYGEN_REVERSEPROXY") ?? "").ToLowerInvariant(); composition.SelectedLN = (Environment.GetEnvironmentVariable("BTCPAYGEN_LIGHTNING") ?? "").ToLowerInvariant(); composition.AdditionalFragments = (Environment.GetEnvironmentVariable("BTCPAYGEN_ADDITIONAL_FRAGMENTS") ?? "").ToLowerInvariant().Split(';').Where(t => !string.IsNullOrWhiteSpace(t)).ToArray(); - if (composition.SelectedProxy == "traefik" && !composition.AdditionalFragments.Contains("traefik-labels")) - { - var additionalFragments = new List(); - additionalFragments.AddRange(composition.AdditionalFragments); - additionalFragments.Add("traefik-labels"); - - composition.AdditionalFragments = additionalFragments.ToArray(); - } - return composition; } } diff --git a/docker-compose-generator/src/Program.cs b/docker-compose-generator/src/Program.cs index 07fbb35..a62987f 100644 --- a/docker-compose-generator/src/Program.cs +++ b/docker-compose-generator/src/Program.cs @@ -8,18 +8,21 @@ namespace DockerGenerator { class Program { - static void Main(string[] args) { var root = Environment.GetEnvironmentVariable("INSIDE_CONTAINER") == "1" ? FindRoot("app") : Path.GetFullPath(Path.Combine(FindRoot("docker-compose-generator"), "..")); - + + Dictionary ProxyMapping = new Dictionary() + { + {"nginx", Path.GetFullPath(Path.Combine(root, "Production"))}, + {"no-reverseproxy", Path.GetFullPath(Path.Combine(root, "Production-NoReverseProxy"))}, + {"traefik", Path.GetFullPath(Path.Combine(root, "Production-Traefik"))} + }; if(args.Any(a => a == "pregen")) { - var productionLocation = Path.GetFullPath(Path.Combine(root, "Production")); - var testLocation = Path.GetFullPath(Path.Combine(root, "Production-NoReverseProxy")); - foreach(var proxy in new[] { "nginx", "no-reverseproxy", "traefik" }) + foreach(var proxy in ProxyMapping.Keys) { foreach(var lightning in new[] { "clightning", "" }) { @@ -40,11 +43,7 @@ namespace DockerGenerator composition.SelectedCryptos.Add(ltc); composition.SelectedLN = lightning; composition.SelectedProxy = proxy; - if (composition.SelectedProxy == "traefik") - { - composition.AdditionalFragments = new []{"traefik-labels"}; - } - new Program().Run(composition, name, new string[] {"nginx", "traefik"}.Contains(proxy)? productionLocation : testLocation); + new Program().Run(composition, name, ProxyMapping[proxy]); } } } @@ -76,15 +75,19 @@ namespace DockerGenerator case "nginx": fragments.Add("nginx"); + fragments.Add("btcpayserver-nginx"); break; case "traefik": fragments.Add("traefik"); + fragments.Add("traefik-labels"); break; case "no-reverseproxy": fragments.Add("btcpayserver-noreverseproxy"); break; } fragments.Add("btcpayserver"); + fragments.Add("nbxplorer"); + fragments.Add("postgres"); foreach(var crypto in CryptoDefinition.GetDefinitions()) { if(!composition.SelectedCryptos.Contains(crypto.Crypto)) From 8c312362513966be9fab60d72e89045a6ef3a98d Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 16 Sep 2018 14:31:09 +0200 Subject: [PATCH 06/85] generate pregen --- .../docker-compose.btc-clightning.yml | 8 +- .../docker-compose.btc-ltc-clightning.yml | 8 +- .../docker-compose.btc-ltc.yml | 8 +- .../docker-compose.btc.yml | 8 +- .../docker-compose.ltc-clightning.yml | 8 +- .../docker-compose.ltc.yml | 8 +- .../docker-compose.btc-clightning.yml | 117 ++++++++++++ .../docker-compose.btc-ltc-clightning.yml | 167 ++++++++++++++++++ Production-Traefik/docker-compose.btc-ltc.yml | 109 ++++++++++++ Production-Traefik/docker-compose.btc.yml | 88 +++++++++ .../docker-compose.ltc-clightning.yml | 117 ++++++++++++ Production-Traefik/docker-compose.ltc.yml | 88 +++++++++ Production/docker-compose.btc-clightning.yml | 2 +- .../docker-compose.btc-ltc-clightning.yml | 2 +- Production/docker-compose.btc-ltc.yml | 2 +- Production/docker-compose.btc.yml | 2 +- Production/docker-compose.ltc-clightning.yml | 2 +- Production/docker-compose.ltc.yml | 2 +- 18 files changed, 698 insertions(+), 48 deletions(-) create mode 100644 Production-Traefik/docker-compose.btc-clightning.yml create mode 100644 Production-Traefik/docker-compose.btc-ltc-clightning.yml create mode 100644 Production-Traefik/docker-compose.btc-ltc.yml create mode 100644 Production-Traefik/docker-compose.btc.yml create mode 100644 Production-Traefik/docker-compose.ltc-clightning.yml create mode 100644 Production-Traefik/docker-compose.ltc.yml diff --git a/Production-NoReverseProxy/docker-compose.btc-clightning.yml b/Production-NoReverseProxy/docker-compose.btc-clightning.yml index b864866..dcaca2c 100644 --- a/Production-NoReverseProxy/docker-compose.btc-clightning.yml +++ b/Production-NoReverseProxy/docker-compose.btc-clightning.yml @@ -13,12 +13,6 @@ services: BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - VIRTUAL_NETWORK: nginx-proxy - VIRTUAL_PORT: 49392 - VIRTUAL_HOST: ${BTCPAY_HOST} - SSL_POLICY: Mozilla-Modern - LETSENCRYPT_HOST: ${BTCPAY_HOST} - LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} BTCPAY_CHAINS: "btc" BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ BTCPAY_BTCLIGHTNING: "type=clightning;server=unix://etc/clightning_bitcoin/lightning-rpc" @@ -94,8 +88,8 @@ services: - nbxplorer - bitcoind volumes: - postgres_datadir: btcpay_datadir: nbxplorer_datadir: + postgres_datadir: bitcoin_datadir: clightning_bitcoin_datadir: diff --git a/Production-NoReverseProxy/docker-compose.btc-ltc-clightning.yml b/Production-NoReverseProxy/docker-compose.btc-ltc-clightning.yml index 656de1b..7045f21 100644 --- a/Production-NoReverseProxy/docker-compose.btc-ltc-clightning.yml +++ b/Production-NoReverseProxy/docker-compose.btc-ltc-clightning.yml @@ -13,12 +13,6 @@ services: BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - VIRTUAL_NETWORK: nginx-proxy - VIRTUAL_PORT: 49392 - VIRTUAL_HOST: ${BTCPAY_HOST} - SSL_POLICY: Mozilla-Modern - LETSENCRYPT_HOST: ${BTCPAY_HOST} - LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ BTCPAY_CHAINS: "ltc,btc" BTCPAY_LTCLIGHTNING: "type=clightning;server=unix://etc/clightning_litecoin/lightning-rpc" @@ -142,9 +136,9 @@ services: - nbxplorer - bitcoind volumes: - postgres_datadir: btcpay_datadir: nbxplorer_datadir: + postgres_datadir: litecoin_datadir: clightning_litecoin_datadir: bitcoin_datadir: diff --git a/Production-NoReverseProxy/docker-compose.btc-ltc.yml b/Production-NoReverseProxy/docker-compose.btc-ltc.yml index 1ea6983..bbce59b 100644 --- a/Production-NoReverseProxy/docker-compose.btc-ltc.yml +++ b/Production-NoReverseProxy/docker-compose.btc-ltc.yml @@ -13,12 +13,6 @@ services: BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - VIRTUAL_NETWORK: nginx-proxy - VIRTUAL_PORT: 49392 - VIRTUAL_HOST: ${BTCPAY_HOST} - SSL_POLICY: Mozilla-Modern - LETSENCRYPT_HOST: ${BTCPAY_HOST} - LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ BTCPAY_CHAINS: "ltc,btc" BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ @@ -86,8 +80,8 @@ services: volumes: - "bitcoin_datadir:/data" volumes: - postgres_datadir: btcpay_datadir: nbxplorer_datadir: + postgres_datadir: litecoin_datadir: bitcoin_datadir: diff --git a/Production-NoReverseProxy/docker-compose.btc.yml b/Production-NoReverseProxy/docker-compose.btc.yml index 321de1a..6755b91 100644 --- a/Production-NoReverseProxy/docker-compose.btc.yml +++ b/Production-NoReverseProxy/docker-compose.btc.yml @@ -13,12 +13,6 @@ services: BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - VIRTUAL_NETWORK: nginx-proxy - VIRTUAL_PORT: 49392 - VIRTUAL_HOST: ${BTCPAY_HOST} - SSL_POLICY: Mozilla-Modern - LETSENCRYPT_HOST: ${BTCPAY_HOST} - LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} BTCPAY_CHAINS: "btc" BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ links: @@ -66,7 +60,7 @@ services: volumes: - "bitcoin_datadir:/data" volumes: - postgres_datadir: btcpay_datadir: nbxplorer_datadir: + postgres_datadir: bitcoin_datadir: diff --git a/Production-NoReverseProxy/docker-compose.ltc-clightning.yml b/Production-NoReverseProxy/docker-compose.ltc-clightning.yml index cacaf23..6eaa39e 100644 --- a/Production-NoReverseProxy/docker-compose.ltc-clightning.yml +++ b/Production-NoReverseProxy/docker-compose.ltc-clightning.yml @@ -13,12 +13,6 @@ services: BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - VIRTUAL_NETWORK: nginx-proxy - VIRTUAL_PORT: 49392 - VIRTUAL_HOST: ${BTCPAY_HOST} - SSL_POLICY: Mozilla-Modern - LETSENCRYPT_HOST: ${BTCPAY_HOST} - LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ BTCPAY_CHAINS: "ltc" BTCPAY_LTCLIGHTNING: "type=clightning;server=unix://etc/clightning_litecoin/lightning-rpc" @@ -94,8 +88,8 @@ services: - nbxplorer - litecoind volumes: - postgres_datadir: btcpay_datadir: nbxplorer_datadir: + postgres_datadir: litecoin_datadir: clightning_litecoin_datadir: diff --git a/Production-NoReverseProxy/docker-compose.ltc.yml b/Production-NoReverseProxy/docker-compose.ltc.yml index bb8c013..0f3a0d2 100644 --- a/Production-NoReverseProxy/docker-compose.ltc.yml +++ b/Production-NoReverseProxy/docker-compose.ltc.yml @@ -13,12 +13,6 @@ services: BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - VIRTUAL_NETWORK: nginx-proxy - VIRTUAL_PORT: 49392 - VIRTUAL_HOST: ${BTCPAY_HOST} - SSL_POLICY: Mozilla-Modern - LETSENCRYPT_HOST: ${BTCPAY_HOST} - LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ BTCPAY_CHAINS: "ltc" links: @@ -66,7 +60,7 @@ services: volumes: - "litecoin_datadir:/data" volumes: - postgres_datadir: btcpay_datadir: nbxplorer_datadir: + postgres_datadir: litecoin_datadir: diff --git a/Production-Traefik/docker-compose.btc-clightning.yml b/Production-Traefik/docker-compose.btc-clightning.yml new file mode 100644 index 0000000..c62f12d --- /dev/null +++ b/Production-Traefik/docker-compose.btc-clightning.yml @@ -0,0 +1,117 @@ +version: "3" +services: + traefik: + restart: unless-stopped + image: traefik + container_name: traefik + ports: + - "80:80" + - "443:443" + volumes: + - "/var/run/docker.sock:/var/run/docker.sock" + - "./traefik.toml:/traefik.toml" + - "./acme.json:/acme.json" + - "./servers.toml:/servers.toml" + - "./traefik_logs:/traefik_logs" + links: + - btcpayserver + btcpayserver: + restart: unless-stopped + image: nicolasdorier/btcpayserver:1.0.2.103 + expose: + - "49392" + environment: + BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} + BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} + BTCPAY_BIND: 0.0.0.0:49392 + BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ + BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} + BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} + BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} + BTCPAY_CHAINS: "btc" + BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ + BTCPAY_BTCLIGHTNING: "type=clightning;server=unix://etc/clightning_bitcoin/lightning-rpc" + links: + - nbxplorer + - postgres + - clightning_bitcoin + volumes: + - "btcpay_datadir:/datadir" + - "nbxplorer_datadir:/root/.nbxplorer" + - "clightning_bitcoin_datadir:/etc/clightning_bitcoin" + labels: + - "traefik.backend=btcpayserver" + - "traefik.backend.loadbalancer.sticky=true" + - "traefik.enable=true" + - "traefik.frontend.rule=Host:${BTCPAY_HOST}" + - "traefik.port.rule=49392" + - "traefik.acme.domains=${BTCPAY_HOST},www.${BTCPAY_HOST}" + - "traefik.acme.email=${LETSENCRYPT_EMAIL}" + nbxplorer: + restart: unless-stopped + image: nicolasdorier/nbxplorer:1.0.2.31 + expose: + - "32838" + environment: + NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} + NBXPLORER_BIND: 0.0.0.0:32838 + NBXPLORER_CHAINS: "btc" + NBXPLORER_BTCRPCURL: http://bitcoind:43782/ + NBXPLORER_BTCNODEENDPOINT: bitcoind:39388 + volumes: + - "nbxplorer_datadir:/datadir" + - "bitcoin_datadir:/root/.bitcoin" + links: + - bitcoind + postgres: + restart: unless-stopped + image: postgres:9.6.5 + volumes: + - "postgres_datadir:/var/lib/postgresql/data" + bitcoind: + restart: unless-stopped + container_name: btcpayserver_bitcoind + image: nicolasdorier/docker-bitcoin:0.16.0 + environment: + BITCOIN_EXTRA_ARGS: | + rpcport=43782 + ${NBITCOIN_NETWORK:-regtest}=1 + port=39388 + whitelist=0.0.0.0/0 + expose: + - "43782" + - "39388" + volumes: + - "bitcoin_datadir:/data" + clightning_bitcoin: + image: nicolasdorier/clightning:634f19a7b230edc686be56ab950b80784e56252c + container_name: btcpayserver_clightning_bitcoin + restart: unless-stopped + environment: + LIGHTNINGD_NETWORK: ${NBITCOIN_NETWORK:-regtest} + LIGHTNINGD_CHAIN: btc + LIGHTNINGD_EXPLORERURL: "http://nbxplorer:32838/" + LIGHTNINGD_OPT: | + bitcoin-datadir=/etc/bitcoin + bitcoin-rpcconnect=bitcoind + announce-addr=${BTCPAY_HOST}:9735 + bind-addr=0.0.0.0:9735 + network=${NBITCOIN_NETWORK:-regtest} + alias=${LIGHTNING_ALIAS} + chain=btc + volumes: + - "clightning_bitcoin_datadir:/root/.lightning" + - "bitcoin_datadir:/etc/bitcoin" + - "nbxplorer_datadir:/root/.nbxplorer" + ports: + - "9735:9735" + links: + - nbxplorer + - bitcoind +volumes: + traefik_logs: + btcpay_datadir: + nbxplorer_datadir: + postgres_datadir: + bitcoin_datadir: + clightning_bitcoin_datadir: diff --git a/Production-Traefik/docker-compose.btc-ltc-clightning.yml b/Production-Traefik/docker-compose.btc-ltc-clightning.yml new file mode 100644 index 0000000..3b79b0b --- /dev/null +++ b/Production-Traefik/docker-compose.btc-ltc-clightning.yml @@ -0,0 +1,167 @@ +version: "3" +services: + traefik: + restart: unless-stopped + image: traefik + container_name: traefik + ports: + - "80:80" + - "443:443" + volumes: + - "/var/run/docker.sock:/var/run/docker.sock" + - "./traefik.toml:/traefik.toml" + - "./acme.json:/acme.json" + - "./servers.toml:/servers.toml" + - "./traefik_logs:/traefik_logs" + links: + - btcpayserver + btcpayserver: + restart: unless-stopped + image: nicolasdorier/btcpayserver:1.0.2.103 + expose: + - "49392" + environment: + BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} + BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} + BTCPAY_BIND: 0.0.0.0:49392 + BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ + BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} + BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} + BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} + BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ + BTCPAY_CHAINS: "ltc,btc" + BTCPAY_LTCLIGHTNING: "type=clightning;server=unix://etc/clightning_litecoin/lightning-rpc" + BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ + BTCPAY_BTCLIGHTNING: "type=clightning;server=unix://etc/clightning_bitcoin/lightning-rpc" + links: + - nbxplorer + - postgres + - clightning_litecoin + - clightning_bitcoin + volumes: + - "btcpay_datadir:/datadir" + - "nbxplorer_datadir:/root/.nbxplorer" + - "clightning_litecoin_datadir:/etc/clightning_litecoin" + - "clightning_bitcoin_datadir:/etc/clightning_bitcoin" + labels: + - "traefik.backend=btcpayserver" + - "traefik.backend.loadbalancer.sticky=true" + - "traefik.enable=true" + - "traefik.frontend.rule=Host:${BTCPAY_HOST}" + - "traefik.port.rule=49392" + - "traefik.acme.domains=${BTCPAY_HOST},www.${BTCPAY_HOST}" + - "traefik.acme.email=${LETSENCRYPT_EMAIL}" + nbxplorer: + restart: unless-stopped + image: nicolasdorier/nbxplorer:1.0.2.31 + expose: + - "32838" + environment: + NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} + NBXPLORER_BIND: 0.0.0.0:32838 + NBXPLORER_CHAINS: "ltc,btc" + NBXPLORER_LTCRPCURL: http://litecoind:43782/ + NBXPLORER_LTCNODEENDPOINT: litecoind:39388 + NBXPLORER_BTCRPCURL: http://bitcoind:43782/ + NBXPLORER_BTCNODEENDPOINT: bitcoind:39388 + volumes: + - "nbxplorer_datadir:/datadir" + - "litecoin_datadir:/root/.litecoin" + - "bitcoin_datadir:/root/.bitcoin" + links: + - litecoind + - bitcoind + postgres: + restart: unless-stopped + image: postgres:9.6.5 + volumes: + - "postgres_datadir:/var/lib/postgresql/data" + litecoind: + restart: unless-stopped + container_name: btcpayserver_litecoind + image: nicolasdorier/docker-litecoin:0.15.1 + environment: + BITCOIN_EXTRA_ARGS: | + rpcport=43782 + ${NBITCOIN_NETWORK:-regtest}=1 + port=39388 + whitelist=0.0.0.0/0 + expose: + - "43782" + - "39388" + volumes: + - "litecoin_datadir:/data" + clightning_litecoin: + image: nicolasdorier/clightning:634f19a7b230edc686be56ab950b80784e56252c + container_name: btcpayserver_clightning_litecoin + restart: unless-stopped + environment: + LIGHTNINGD_NETWORK: ${NBITCOIN_NETWORK:-regtest} + LIGHTNINGD_CHAIN: ltc + LIGHTNINGD_EXPLORERURL: "http://nbxplorer:32838/" + LIGHTNINGD_OPT: | + bitcoin-datadir=/etc/litecoin + bitcoin-rpcconnect=litecoind + bind-addr=0.0.0.0:9735 + announce-addr=${BTCPAY_HOST}:9736 + network=${NBITCOIN_NETWORK:-regtest} + alias=${LIGHTNING_ALIAS} + chain=ltc + volumes: + - "clightning_litecoin_datadir:/root/.lightning" + - "litecoin_datadir:/etc/litecoin" + - "nbxplorer_datadir:/root/.nbxplorer" + ports: + - "9736:9735" + links: + - nbxplorer + - litecoind + bitcoind: + restart: unless-stopped + container_name: btcpayserver_bitcoind + image: nicolasdorier/docker-bitcoin:0.16.0 + environment: + BITCOIN_EXTRA_ARGS: | + rpcport=43782 + ${NBITCOIN_NETWORK:-regtest}=1 + port=39388 + whitelist=0.0.0.0/0 + expose: + - "43782" + - "39388" + volumes: + - "bitcoin_datadir:/data" + clightning_bitcoin: + image: nicolasdorier/clightning:634f19a7b230edc686be56ab950b80784e56252c + container_name: btcpayserver_clightning_bitcoin + restart: unless-stopped + environment: + LIGHTNINGD_NETWORK: ${NBITCOIN_NETWORK:-regtest} + LIGHTNINGD_CHAIN: btc + LIGHTNINGD_EXPLORERURL: "http://nbxplorer:32838/" + LIGHTNINGD_OPT: | + bitcoin-datadir=/etc/bitcoin + bitcoin-rpcconnect=bitcoind + announce-addr=${BTCPAY_HOST}:9735 + bind-addr=0.0.0.0:9735 + network=${NBITCOIN_NETWORK:-regtest} + alias=${LIGHTNING_ALIAS} + chain=btc + volumes: + - "clightning_bitcoin_datadir:/root/.lightning" + - "bitcoin_datadir:/etc/bitcoin" + - "nbxplorer_datadir:/root/.nbxplorer" + ports: + - "9735:9735" + links: + - nbxplorer + - bitcoind +volumes: + traefik_logs: + btcpay_datadir: + nbxplorer_datadir: + postgres_datadir: + litecoin_datadir: + clightning_litecoin_datadir: + bitcoin_datadir: + clightning_bitcoin_datadir: diff --git a/Production-Traefik/docker-compose.btc-ltc.yml b/Production-Traefik/docker-compose.btc-ltc.yml new file mode 100644 index 0000000..83caf8f --- /dev/null +++ b/Production-Traefik/docker-compose.btc-ltc.yml @@ -0,0 +1,109 @@ +version: "3" +services: + traefik: + restart: unless-stopped + image: traefik + container_name: traefik + ports: + - "80:80" + - "443:443" + volumes: + - "/var/run/docker.sock:/var/run/docker.sock" + - "./traefik.toml:/traefik.toml" + - "./acme.json:/acme.json" + - "./servers.toml:/servers.toml" + - "./traefik_logs:/traefik_logs" + links: + - btcpayserver + btcpayserver: + restart: unless-stopped + image: nicolasdorier/btcpayserver:1.0.2.103 + expose: + - "49392" + environment: + BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} + BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} + BTCPAY_BIND: 0.0.0.0:49392 + BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ + BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} + BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} + BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} + BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ + BTCPAY_CHAINS: "ltc,btc" + BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ + links: + - nbxplorer + - postgres + volumes: + - "btcpay_datadir:/datadir" + - "nbxplorer_datadir:/root/.nbxplorer" + labels: + - "traefik.backend=btcpayserver" + - "traefik.backend.loadbalancer.sticky=true" + - "traefik.enable=true" + - "traefik.frontend.rule=Host:${BTCPAY_HOST}" + - "traefik.port.rule=49392" + - "traefik.acme.domains=${BTCPAY_HOST},www.${BTCPAY_HOST}" + - "traefik.acme.email=${LETSENCRYPT_EMAIL}" + nbxplorer: + restart: unless-stopped + image: nicolasdorier/nbxplorer:1.0.2.31 + expose: + - "32838" + environment: + NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} + NBXPLORER_BIND: 0.0.0.0:32838 + NBXPLORER_CHAINS: "ltc,btc" + NBXPLORER_LTCRPCURL: http://litecoind:43782/ + NBXPLORER_LTCNODEENDPOINT: litecoind:39388 + NBXPLORER_BTCRPCURL: http://bitcoind:43782/ + NBXPLORER_BTCNODEENDPOINT: bitcoind:39388 + volumes: + - "nbxplorer_datadir:/datadir" + - "litecoin_datadir:/root/.litecoin" + - "bitcoin_datadir:/root/.bitcoin" + links: + - litecoind + - bitcoind + postgres: + restart: unless-stopped + image: postgres:9.6.5 + volumes: + - "postgres_datadir:/var/lib/postgresql/data" + litecoind: + restart: unless-stopped + container_name: btcpayserver_litecoind + image: nicolasdorier/docker-litecoin:0.15.1 + environment: + BITCOIN_EXTRA_ARGS: | + rpcport=43782 + ${NBITCOIN_NETWORK:-regtest}=1 + port=39388 + whitelist=0.0.0.0/0 + expose: + - "43782" + - "39388" + volumes: + - "litecoin_datadir:/data" + bitcoind: + restart: unless-stopped + container_name: btcpayserver_bitcoind + image: nicolasdorier/docker-bitcoin:0.16.0 + environment: + BITCOIN_EXTRA_ARGS: | + rpcport=43782 + ${NBITCOIN_NETWORK:-regtest}=1 + port=39388 + whitelist=0.0.0.0/0 + expose: + - "43782" + - "39388" + volumes: + - "bitcoin_datadir:/data" +volumes: + traefik_logs: + btcpay_datadir: + nbxplorer_datadir: + postgres_datadir: + litecoin_datadir: + bitcoin_datadir: diff --git a/Production-Traefik/docker-compose.btc.yml b/Production-Traefik/docker-compose.btc.yml new file mode 100644 index 0000000..a7fbf83 --- /dev/null +++ b/Production-Traefik/docker-compose.btc.yml @@ -0,0 +1,88 @@ +version: "3" +services: + traefik: + restart: unless-stopped + image: traefik + container_name: traefik + ports: + - "80:80" + - "443:443" + volumes: + - "/var/run/docker.sock:/var/run/docker.sock" + - "./traefik.toml:/traefik.toml" + - "./acme.json:/acme.json" + - "./servers.toml:/servers.toml" + - "./traefik_logs:/traefik_logs" + links: + - btcpayserver + btcpayserver: + restart: unless-stopped + image: nicolasdorier/btcpayserver:1.0.2.103 + expose: + - "49392" + environment: + BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} + BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} + BTCPAY_BIND: 0.0.0.0:49392 + BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ + BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} + BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} + BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} + BTCPAY_CHAINS: "btc" + BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ + links: + - nbxplorer + - postgres + volumes: + - "btcpay_datadir:/datadir" + - "nbxplorer_datadir:/root/.nbxplorer" + labels: + - "traefik.backend=btcpayserver" + - "traefik.backend.loadbalancer.sticky=true" + - "traefik.enable=true" + - "traefik.frontend.rule=Host:${BTCPAY_HOST}" + - "traefik.port.rule=49392" + - "traefik.acme.domains=${BTCPAY_HOST},www.${BTCPAY_HOST}" + - "traefik.acme.email=${LETSENCRYPT_EMAIL}" + nbxplorer: + restart: unless-stopped + image: nicolasdorier/nbxplorer:1.0.2.31 + expose: + - "32838" + environment: + NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} + NBXPLORER_BIND: 0.0.0.0:32838 + NBXPLORER_CHAINS: "btc" + NBXPLORER_BTCRPCURL: http://bitcoind:43782/ + NBXPLORER_BTCNODEENDPOINT: bitcoind:39388 + volumes: + - "nbxplorer_datadir:/datadir" + - "bitcoin_datadir:/root/.bitcoin" + links: + - bitcoind + postgres: + restart: unless-stopped + image: postgres:9.6.5 + volumes: + - "postgres_datadir:/var/lib/postgresql/data" + bitcoind: + restart: unless-stopped + container_name: btcpayserver_bitcoind + image: nicolasdorier/docker-bitcoin:0.16.0 + environment: + BITCOIN_EXTRA_ARGS: | + rpcport=43782 + ${NBITCOIN_NETWORK:-regtest}=1 + port=39388 + whitelist=0.0.0.0/0 + expose: + - "43782" + - "39388" + volumes: + - "bitcoin_datadir:/data" +volumes: + traefik_logs: + btcpay_datadir: + nbxplorer_datadir: + postgres_datadir: + bitcoin_datadir: diff --git a/Production-Traefik/docker-compose.ltc-clightning.yml b/Production-Traefik/docker-compose.ltc-clightning.yml new file mode 100644 index 0000000..0ba8d96 --- /dev/null +++ b/Production-Traefik/docker-compose.ltc-clightning.yml @@ -0,0 +1,117 @@ +version: "3" +services: + traefik: + restart: unless-stopped + image: traefik + container_name: traefik + ports: + - "80:80" + - "443:443" + volumes: + - "/var/run/docker.sock:/var/run/docker.sock" + - "./traefik.toml:/traefik.toml" + - "./acme.json:/acme.json" + - "./servers.toml:/servers.toml" + - "./traefik_logs:/traefik_logs" + links: + - btcpayserver + btcpayserver: + restart: unless-stopped + image: nicolasdorier/btcpayserver:1.0.2.103 + expose: + - "49392" + environment: + BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} + BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} + BTCPAY_BIND: 0.0.0.0:49392 + BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ + BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} + BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} + BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} + BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ + BTCPAY_CHAINS: "ltc" + BTCPAY_LTCLIGHTNING: "type=clightning;server=unix://etc/clightning_litecoin/lightning-rpc" + links: + - nbxplorer + - postgres + - clightning_litecoin + volumes: + - "btcpay_datadir:/datadir" + - "nbxplorer_datadir:/root/.nbxplorer" + - "clightning_litecoin_datadir:/etc/clightning_litecoin" + labels: + - "traefik.backend=btcpayserver" + - "traefik.backend.loadbalancer.sticky=true" + - "traefik.enable=true" + - "traefik.frontend.rule=Host:${BTCPAY_HOST}" + - "traefik.port.rule=49392" + - "traefik.acme.domains=${BTCPAY_HOST},www.${BTCPAY_HOST}" + - "traefik.acme.email=${LETSENCRYPT_EMAIL}" + nbxplorer: + restart: unless-stopped + image: nicolasdorier/nbxplorer:1.0.2.31 + expose: + - "32838" + environment: + NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} + NBXPLORER_BIND: 0.0.0.0:32838 + NBXPLORER_CHAINS: "ltc" + NBXPLORER_LTCRPCURL: http://litecoind:43782/ + NBXPLORER_LTCNODEENDPOINT: litecoind:39388 + volumes: + - "nbxplorer_datadir:/datadir" + - "litecoin_datadir:/root/.litecoin" + links: + - litecoind + postgres: + restart: unless-stopped + image: postgres:9.6.5 + volumes: + - "postgres_datadir:/var/lib/postgresql/data" + litecoind: + restart: unless-stopped + container_name: btcpayserver_litecoind + image: nicolasdorier/docker-litecoin:0.15.1 + environment: + BITCOIN_EXTRA_ARGS: | + rpcport=43782 + ${NBITCOIN_NETWORK:-regtest}=1 + port=39388 + whitelist=0.0.0.0/0 + expose: + - "43782" + - "39388" + volumes: + - "litecoin_datadir:/data" + clightning_litecoin: + image: nicolasdorier/clightning:634f19a7b230edc686be56ab950b80784e56252c + container_name: btcpayserver_clightning_litecoin + restart: unless-stopped + environment: + LIGHTNINGD_NETWORK: ${NBITCOIN_NETWORK:-regtest} + LIGHTNINGD_CHAIN: ltc + LIGHTNINGD_EXPLORERURL: "http://nbxplorer:32838/" + LIGHTNINGD_OPT: | + bitcoin-datadir=/etc/litecoin + bitcoin-rpcconnect=litecoind + bind-addr=0.0.0.0:9735 + announce-addr=${BTCPAY_HOST}:9736 + network=${NBITCOIN_NETWORK:-regtest} + alias=${LIGHTNING_ALIAS} + chain=ltc + volumes: + - "clightning_litecoin_datadir:/root/.lightning" + - "litecoin_datadir:/etc/litecoin" + - "nbxplorer_datadir:/root/.nbxplorer" + ports: + - "9736:9735" + links: + - nbxplorer + - litecoind +volumes: + traefik_logs: + btcpay_datadir: + nbxplorer_datadir: + postgres_datadir: + litecoin_datadir: + clightning_litecoin_datadir: diff --git a/Production-Traefik/docker-compose.ltc.yml b/Production-Traefik/docker-compose.ltc.yml new file mode 100644 index 0000000..7579d02 --- /dev/null +++ b/Production-Traefik/docker-compose.ltc.yml @@ -0,0 +1,88 @@ +version: "3" +services: + traefik: + restart: unless-stopped + image: traefik + container_name: traefik + ports: + - "80:80" + - "443:443" + volumes: + - "/var/run/docker.sock:/var/run/docker.sock" + - "./traefik.toml:/traefik.toml" + - "./acme.json:/acme.json" + - "./servers.toml:/servers.toml" + - "./traefik_logs:/traefik_logs" + links: + - btcpayserver + btcpayserver: + restart: unless-stopped + image: nicolasdorier/btcpayserver:1.0.2.103 + expose: + - "49392" + environment: + BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} + BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} + BTCPAY_BIND: 0.0.0.0:49392 + BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ + BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} + BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} + BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} + BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ + BTCPAY_CHAINS: "ltc" + links: + - nbxplorer + - postgres + volumes: + - "btcpay_datadir:/datadir" + - "nbxplorer_datadir:/root/.nbxplorer" + labels: + - "traefik.backend=btcpayserver" + - "traefik.backend.loadbalancer.sticky=true" + - "traefik.enable=true" + - "traefik.frontend.rule=Host:${BTCPAY_HOST}" + - "traefik.port.rule=49392" + - "traefik.acme.domains=${BTCPAY_HOST},www.${BTCPAY_HOST}" + - "traefik.acme.email=${LETSENCRYPT_EMAIL}" + nbxplorer: + restart: unless-stopped + image: nicolasdorier/nbxplorer:1.0.2.31 + expose: + - "32838" + environment: + NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} + NBXPLORER_BIND: 0.0.0.0:32838 + NBXPLORER_CHAINS: "ltc" + NBXPLORER_LTCRPCURL: http://litecoind:43782/ + NBXPLORER_LTCNODEENDPOINT: litecoind:39388 + volumes: + - "nbxplorer_datadir:/datadir" + - "litecoin_datadir:/root/.litecoin" + links: + - litecoind + postgres: + restart: unless-stopped + image: postgres:9.6.5 + volumes: + - "postgres_datadir:/var/lib/postgresql/data" + litecoind: + restart: unless-stopped + container_name: btcpayserver_litecoind + image: nicolasdorier/docker-litecoin:0.15.1 + environment: + BITCOIN_EXTRA_ARGS: | + rpcport=43782 + ${NBITCOIN_NETWORK:-regtest}=1 + port=39388 + whitelist=0.0.0.0/0 + expose: + - "43782" + - "39388" + volumes: + - "litecoin_datadir:/data" +volumes: + traefik_logs: + btcpay_datadir: + nbxplorer_datadir: + postgres_datadir: + litecoin_datadir: diff --git a/Production/docker-compose.btc-clightning.yml b/Production/docker-compose.btc-clightning.yml index 92878ba..ff26c4e 100644 --- a/Production/docker-compose.btc-clightning.yml +++ b/Production/docker-compose.btc-clightning.yml @@ -140,8 +140,8 @@ volumes: nginx_vhost: nginx_html: nginx_certs: - postgres_datadir: btcpay_datadir: nbxplorer_datadir: + postgres_datadir: bitcoin_datadir: clightning_bitcoin_datadir: diff --git a/Production/docker-compose.btc-ltc-clightning.yml b/Production/docker-compose.btc-ltc-clightning.yml index b809400..b9a0107 100644 --- a/Production/docker-compose.btc-ltc-clightning.yml +++ b/Production/docker-compose.btc-ltc-clightning.yml @@ -188,9 +188,9 @@ volumes: nginx_vhost: nginx_html: nginx_certs: - postgres_datadir: btcpay_datadir: nbxplorer_datadir: + postgres_datadir: litecoin_datadir: clightning_litecoin_datadir: bitcoin_datadir: diff --git a/Production/docker-compose.btc-ltc.yml b/Production/docker-compose.btc-ltc.yml index a6bafe6..235a09b 100644 --- a/Production/docker-compose.btc-ltc.yml +++ b/Production/docker-compose.btc-ltc.yml @@ -132,8 +132,8 @@ volumes: nginx_vhost: nginx_html: nginx_certs: - postgres_datadir: btcpay_datadir: nbxplorer_datadir: + postgres_datadir: litecoin_datadir: bitcoin_datadir: diff --git a/Production/docker-compose.btc.yml b/Production/docker-compose.btc.yml index 0d3f639..e0701a4 100644 --- a/Production/docker-compose.btc.yml +++ b/Production/docker-compose.btc.yml @@ -112,7 +112,7 @@ volumes: nginx_vhost: nginx_html: nginx_certs: - postgres_datadir: btcpay_datadir: nbxplorer_datadir: + postgres_datadir: bitcoin_datadir: diff --git a/Production/docker-compose.ltc-clightning.yml b/Production/docker-compose.ltc-clightning.yml index 797b53e..6a3f9ad 100644 --- a/Production/docker-compose.ltc-clightning.yml +++ b/Production/docker-compose.ltc-clightning.yml @@ -140,8 +140,8 @@ volumes: nginx_vhost: nginx_html: nginx_certs: - postgres_datadir: btcpay_datadir: nbxplorer_datadir: + postgres_datadir: litecoin_datadir: clightning_litecoin_datadir: diff --git a/Production/docker-compose.ltc.yml b/Production/docker-compose.ltc.yml index 6808b1f..03ca439 100644 --- a/Production/docker-compose.ltc.yml +++ b/Production/docker-compose.ltc.yml @@ -112,7 +112,7 @@ volumes: nginx_vhost: nginx_html: nginx_certs: - postgres_datadir: btcpay_datadir: nbxplorer_datadir: + postgres_datadir: litecoin_datadir: From 7c59a96f439c79189b40c4f6dede960ea43853bc Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 16 Sep 2018 16:18:43 +0200 Subject: [PATCH 07/85] allow to specify generator image when building --- btcpay-setup.sh | 3 +++ build.ps1 | 3 ++- build.sh | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/btcpay-setup.sh b/btcpay-setup.sh index 79fd939..75edb6b 100755 --- a/btcpay-setup.sh +++ b/btcpay-setup.sh @@ -87,6 +87,9 @@ if [ ! -z $BTCPAY_DOCKER_COMPOSE ] && [ ! -z $DOWNLOAD_ROOT ] && [ -z $BTCPAYGEN if [[ $(dirname $BTCPAY_DOCKER_COMPOSE) == *Production ]]; then BTCPAYGEN_REVERSEPROXY='nginx' + fi + if [[ $(dirname $BTCPAY_DOCKER_COMPOSE) == *Production-Traefik ]]; then + BTCPAYGEN_REVERSEPROXY='traefik' fi if [[ $(dirname $BTCPAY_DOCKER_COMPOSE) == *Production-NoReverseProxy ]]; then BTCPAYGEN_REVERSEPROXY='none' diff --git a/build.ps1 b/build.ps1 index 23ddca3..170d1cf 100755 --- a/build.ps1 +++ b/build.ps1 @@ -1,6 +1,7 @@ # This script will run docker-compose-generator in a container to generate the yml files +if (-not ($BTCPAYGEN_DOCKER_IMAGE)) { $BTCPAYGEN_DOCKER_IMAGE = "btcpayserver/docker-compose-generator" } -docker pull btcpayserver/docker-compose-generator +docker pull $BTCPAYGEN_DOCKER_IMAGE: docker run -v "$(Get-Location)\Generated:/app/Generated" ` -v "$(Get-Location)\docker-compose-generator\docker-fragments:/app/docker-fragments" ` -e "BTCPAYGEN_CRYPTO1=$BTCPAYGEN_CRYPTO1" ` diff --git a/build.sh b/build.sh index d86749e..648b3a6 100755 --- a/build.sh +++ b/build.sh @@ -1,7 +1,7 @@ #!/bin/bash # This script will run docker-compose-generator in a container to generate the yml files -docker pull btcpayserver/docker-compose-generator +docker pull ${BTCPAYGEN_DOCKER_IMAGE:-"btcpayserver/docker-compose-generator"} docker run -v "$(pwd)/Generated:/app/Generated" \ -v "$(pwd)/docker-compose-generator/docker-fragments:/app/docker-fragments" \ -e "BTCPAYGEN_CRYPTO1=$BTCPAYGEN_CRYPTO1" \ From 18d7c14afef00d3edd0e46adb566b399e21486ad Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 16 Sep 2018 18:29:38 +0200 Subject: [PATCH 08/85] run cusom image as well --- build.ps1 | 2 +- build.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.ps1 b/build.ps1 index 170d1cf..82159ab 100755 --- a/build.ps1 +++ b/build.ps1 @@ -17,7 +17,7 @@ docker run -v "$(Get-Location)\Generated:/app/Generated" ` -e "BTCPAYGEN_ADDITIONAL_FRAGMENTS=$BTCPAYGEN_ADDITIONAL_FRAGMENTS" ` -e "BTCPAYGEN_LIGHTNING=$BTCPAYGEN_LIGHTNING" ` -e "BTCPAYGEN_SUBNAME=$BTCPAYGEN_SUBNAME" ` - --rm btcpayserver/docker-compose-generator + --rm $BTCPAYGEN_DOCKER_IMAGE If ($BTCPAYGEN_REVERSEPROXY -eq "nginx") { Copy-Item ".\Production\nginx.tmpl" -Destination ".\Generated" diff --git a/build.sh b/build.sh index 648b3a6..9f5f59a 100755 --- a/build.sh +++ b/build.sh @@ -17,7 +17,7 @@ docker run -v "$(pwd)/Generated:/app/Generated" \ -e "BTCPAYGEN_ADDITIONAL_FRAGMENTS=$BTCPAYGEN_ADDITIONAL_FRAGMENTS" \ -e "BTCPAYGEN_LIGHTNING=$BTCPAYGEN_LIGHTNING" \ -e "BTCPAYGEN_SUBNAME=$BTCPAYGEN_SUBNAME" \ - --rm btcpayserver/docker-compose-generator + --rm ${BTCPAYGEN_DOCKER_IMAGE:-"btcpayserver/docker-compose-generator"} if [ "$BTCPAYGEN_REVERSEPROXY" == "nginx" ]; then cp Production/nginx.tmpl Generated/nginx.tmpl From 3a665c627b8ba05e00b8c4abfea61835df9808f3 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 16 Sep 2018 19:03:47 +0200 Subject: [PATCH 09/85] fix traefik toml --- Production-Traefik/traefik.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/Production-Traefik/traefik.toml b/Production-Traefik/traefik.toml index e54e954..b85e505 100644 --- a/Production-Traefik/traefik.toml +++ b/Production-Traefik/traefik.toml @@ -3,7 +3,6 @@ defaultEntryPoints = ["https","http"] logLevel = "ERROR" [entryPoints] - useXForwardedFor = true [entryPoints.http] address = ":80" [entryPoints.http.redirect] From 665ad886330146b86058fcff2533fc9e560aa778 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 16 Sep 2018 19:08:05 +0200 Subject: [PATCH 10/85] fix traefik.yml --- docker-compose-generator/docker-fragments/traefik.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/traefik.yml b/docker-compose-generator/docker-fragments/traefik.yml index f1fd316..a42dadf 100644 --- a/docker-compose-generator/docker-fragments/traefik.yml +++ b/docker-compose-generator/docker-fragments/traefik.yml @@ -11,7 +11,7 @@ services: volumes: - "/var/run/docker.sock:/var/run/docker.sock" - "./traefik.toml:/traefik.toml" - - "./acme.json:/acme.json" + - "./acme.json:/acme.json:ro" - "./servers.toml:/servers.toml" - "./traefik_logs:/traefik_logs" From bf6fa20655423dadc43c858a5169053e049018f1 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 16 Sep 2018 19:33:01 +0200 Subject: [PATCH 11/85] acme.json related changes --- Generated/.gitignore | 3 ++- Production-Traefik/acme.json | 0 build.ps1 | 2 ++ build.sh | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Production-Traefik/acme.json diff --git a/Generated/.gitignore b/Generated/.gitignore index d3ac46f..2fb9890 100644 --- a/Generated/.gitignore +++ b/Generated/.gitignore @@ -1,3 +1,4 @@ *.yml *.tmpl -*.toml \ No newline at end of file +*.toml +*.json \ No newline at end of file diff --git a/Production-Traefik/acme.json b/Production-Traefik/acme.json new file mode 100644 index 0000000..e69de29 diff --git a/build.ps1 b/build.ps1 index 82159ab..5b6e7ab 100755 --- a/build.ps1 +++ b/build.ps1 @@ -25,4 +25,6 @@ If ($BTCPAYGEN_REVERSEPROXY -eq "nginx") { If ($BTCPAYGEN_REVERSEPROXY -eq "traefik") { Copy-Item ".\Production-Traefik\traefik.toml" -Destination ".\Generated" + + New-Item ".\Generated\acme.json" -type file } diff --git a/build.sh b/build.sh index 9f5f59a..1257cc1 100755 --- a/build.sh +++ b/build.sh @@ -25,6 +25,7 @@ fi if [ "$BTCPAYGEN_REVERSEPROXY" == "traefik" ]; then cp Production-Traefik/traefik.toml Generated/traefik.toml + chmod 600 acme.json>>!#:2 fi From d49a39e33e814a9e61ee969406ee8d4d866942f3 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 16 Sep 2018 19:43:49 +0200 Subject: [PATCH 12/85] modify build --- build.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 1257cc1..959b201 100755 --- a/build.sh +++ b/build.sh @@ -25,7 +25,8 @@ fi if [ "$BTCPAYGEN_REVERSEPROXY" == "traefik" ]; then cp Production-Traefik/traefik.toml Generated/traefik.toml - chmod 600 acme.json>>!#:2 + :> Generated/acme.json + chmod 600 Generated/acme.json fi From 5f58554f1774b08d5d16572ebd649a958474f4a5 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 16 Sep 2018 21:24:21 +0200 Subject: [PATCH 13/85] pregen for update --- Production-Traefik/docker-compose.btc-clightning.yml | 2 +- Production-Traefik/docker-compose.btc-ltc-clightning.yml | 2 +- Production-Traefik/docker-compose.btc-ltc.yml | 2 +- Production-Traefik/docker-compose.btc.yml | 2 +- Production-Traefik/docker-compose.ltc-clightning.yml | 2 +- Production-Traefik/docker-compose.ltc.yml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Production-Traefik/docker-compose.btc-clightning.yml b/Production-Traefik/docker-compose.btc-clightning.yml index c62f12d..b06b74b 100644 --- a/Production-Traefik/docker-compose.btc-clightning.yml +++ b/Production-Traefik/docker-compose.btc-clightning.yml @@ -10,7 +10,7 @@ services: volumes: - "/var/run/docker.sock:/var/run/docker.sock" - "./traefik.toml:/traefik.toml" - - "./acme.json:/acme.json" + - "./acme.json:/acme.json:ro" - "./servers.toml:/servers.toml" - "./traefik_logs:/traefik_logs" links: diff --git a/Production-Traefik/docker-compose.btc-ltc-clightning.yml b/Production-Traefik/docker-compose.btc-ltc-clightning.yml index 3b79b0b..e4fd4a9 100644 --- a/Production-Traefik/docker-compose.btc-ltc-clightning.yml +++ b/Production-Traefik/docker-compose.btc-ltc-clightning.yml @@ -10,7 +10,7 @@ services: volumes: - "/var/run/docker.sock:/var/run/docker.sock" - "./traefik.toml:/traefik.toml" - - "./acme.json:/acme.json" + - "./acme.json:/acme.json:ro" - "./servers.toml:/servers.toml" - "./traefik_logs:/traefik_logs" links: diff --git a/Production-Traefik/docker-compose.btc-ltc.yml b/Production-Traefik/docker-compose.btc-ltc.yml index 83caf8f..fb86e58 100644 --- a/Production-Traefik/docker-compose.btc-ltc.yml +++ b/Production-Traefik/docker-compose.btc-ltc.yml @@ -10,7 +10,7 @@ services: volumes: - "/var/run/docker.sock:/var/run/docker.sock" - "./traefik.toml:/traefik.toml" - - "./acme.json:/acme.json" + - "./acme.json:/acme.json:ro" - "./servers.toml:/servers.toml" - "./traefik_logs:/traefik_logs" links: diff --git a/Production-Traefik/docker-compose.btc.yml b/Production-Traefik/docker-compose.btc.yml index a7fbf83..06289c5 100644 --- a/Production-Traefik/docker-compose.btc.yml +++ b/Production-Traefik/docker-compose.btc.yml @@ -10,7 +10,7 @@ services: volumes: - "/var/run/docker.sock:/var/run/docker.sock" - "./traefik.toml:/traefik.toml" - - "./acme.json:/acme.json" + - "./acme.json:/acme.json:ro" - "./servers.toml:/servers.toml" - "./traefik_logs:/traefik_logs" links: diff --git a/Production-Traefik/docker-compose.ltc-clightning.yml b/Production-Traefik/docker-compose.ltc-clightning.yml index 0ba8d96..e1b6aa7 100644 --- a/Production-Traefik/docker-compose.ltc-clightning.yml +++ b/Production-Traefik/docker-compose.ltc-clightning.yml @@ -10,7 +10,7 @@ services: volumes: - "/var/run/docker.sock:/var/run/docker.sock" - "./traefik.toml:/traefik.toml" - - "./acme.json:/acme.json" + - "./acme.json:/acme.json:ro" - "./servers.toml:/servers.toml" - "./traefik_logs:/traefik_logs" links: diff --git a/Production-Traefik/docker-compose.ltc.yml b/Production-Traefik/docker-compose.ltc.yml index 7579d02..0cd5b87 100644 --- a/Production-Traefik/docker-compose.ltc.yml +++ b/Production-Traefik/docker-compose.ltc.yml @@ -10,7 +10,7 @@ services: volumes: - "/var/run/docker.sock:/var/run/docker.sock" - "./traefik.toml:/traefik.toml" - - "./acme.json:/acme.json" + - "./acme.json:/acme.json:ro" - "./servers.toml:/servers.toml" - "./traefik_logs:/traefik_logs" links: From 14f7fda15585a80982922e1da9c532e9c3d8e176 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Mon, 17 Sep 2018 08:07:22 +0200 Subject: [PATCH 14/85] Update build.sh --- build.sh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/build.sh b/build.sh index 959b201..9234020 100755 --- a/build.sh +++ b/build.sh @@ -28,7 +28,3 @@ if [ "$BTCPAYGEN_REVERSEPROXY" == "traefik" ]; then :> Generated/acme.json chmod 600 Generated/acme.json fi - - - - From 92a91a7f96da2a2bc8e0e448a2825093c5af43c9 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Mon, 17 Sep 2018 08:08:02 +0200 Subject: [PATCH 15/85] Update docker-compose-generator.csproj --- .../src/docker-compose-generator.csproj | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/docker-compose-generator/src/docker-compose-generator.csproj b/docker-compose-generator/src/docker-compose-generator.csproj index f9be2ab..2e96faf 100644 --- a/docker-compose-generator/src/docker-compose-generator.csproj +++ b/docker-compose-generator/src/docker-compose-generator.csproj @@ -9,34 +9,4 @@ - - - - - - - - - - - - - - - - - - - - - - - opt-save-storage.yml - - - nginx.yml - - - - From e87149bf7c29dfe2617ddd664c72bdecb9240c84 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Mon, 17 Sep 2018 10:12:46 +0200 Subject: [PATCH 16/85] remove acme.json as it is created from script --- Production-Traefik/acme.json | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Production-Traefik/acme.json diff --git a/Production-Traefik/acme.json b/Production-Traefik/acme.json deleted file mode 100644 index e69de29..0000000 From af56b44aee04ce3b0c5dcff4515b8d10a5948a37 Mon Sep 17 00:00:00 2001 From: ChekaZ Date: Sun, 23 Sep 2018 14:01:17 +0200 Subject: [PATCH 17/85] update Feathercoin --- docker-compose-generator/docker-fragments/feathercoin.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/feathercoin.yml b/docker-compose-generator/docker-fragments/feathercoin.yml index 313cdb4..5d97802 100644 --- a/docker-compose-generator/docker-fragments/feathercoin.yml +++ b/docker-compose-generator/docker-fragments/feathercoin.yml @@ -4,7 +4,7 @@ services: feathercoind: restart: unless-stopped container_name: btcpayserver_feathercoind - image: chekaz/docker-feathercoin:0.16.0 + image: chekaz/docker-feathercoin:0.16.3 environment: BITCOIN_EXTRA_ARGS: | rpcport=43782 From 7684f486883642b1d94c0772fee7dab4513edf66 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 23 Sep 2018 23:35:45 +0200 Subject: [PATCH 18/85] Update btcpay-setup.sh --- btcpay-setup.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/btcpay-setup.sh b/btcpay-setup.sh index 75edb6b..ca50862 100755 --- a/btcpay-setup.sh +++ b/btcpay-setup.sh @@ -51,16 +51,16 @@ Environment variables: BTCPAY_HOST: The hostname of your website (eg. btcpay.example.com) LETSENCRYPT_EMAIL: A mail will be sent to this address if certificate expires and fail to renew automatically (eg. me@example.com) NBITCOIN_NETWORK: The type of network to use (eg. mainnet, testnet or regtest. Default: mainnet) - LIGHTNING_ALIAS: An alias for your lightning network node if used + LIGHTNING_ALIAS: An alias for your lightning network node if used BTCPAYGEN_CRYPTO1: First supported crypto currency (eg. btc, ltc, btg, grs, ftc, via, none. Default: btc) BTCPAYGEN_CRYPTO2: Second supported crypto currency (Default: empty) BTCPAYGEN_CRYPTON: N th supported crypto currency where N is maximum at maximum 9. (Default: none) - BTCPAYGEN_REVERSEPROXY: Whether to use or not a reverse proxy. NGinx setup HTTPS for you. (eg. nginx, none. Default: nginx) + BTCPAYGEN_REVERSEPROXY: Whether to use or not a reverse proxy. NGinx setup HTTPS for you. (eg. nginx, traefik, none. Default: nginx) BTCPAYGEN_LIGHTNING: Lightning network implementation to use (eg. clightning, lnd, none) BTCPAYGEN_ADDITIONAL_FRAGMENTS: Semi colon separated list of additional fragments you want to use (eg. opt-save-storage) ACME_CA_URI: The API endpoint to ask for HTTPS certificate (default: https://acme-v01.api.letsencrypt.org/directory) BTCPAY_HOST_SSHKEYFILE: Optional, SSH private key that BTCPay can use to connect to this VM's SSH server. This key will be copied on BTCPay's data directory - + BTCPAYGEN_DOCKER_IMAGE: Allows you to specify a custom docker image for the generator (Default: btcpayserver/docker-compose-generator) END } From dd0c6d1e86c9d0d15ff2162d3b521f83a9722183 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 23 Sep 2018 23:47:14 +0200 Subject: [PATCH 19/85] Update README.md --- Production-Traefik/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Production-Traefik/README.md b/Production-Traefik/README.md index 2ef4dc2..0a6cf0b 100644 --- a/Production-Traefik/README.md +++ b/Production-Traefik/README.md @@ -19,7 +19,7 @@ It is composed of: 2. A lightweight block explorer ([NBxplorer](https://github.com/dgarage/NBXplorer)) 3. A [BTCPay Server](https://github.com/btcpayserver/btcpayserver) 4. A database (Postgres) -5. A reverse proxy (Traefik) xontainer that also handles SSL certificate renewal +5. A reverse proxy (Traefik) container that also handles SSL certificate renewal ![Architecture](Production.png) @@ -70,4 +70,4 @@ docker-compose up ` See also [The guide for docker noobs](../README.md#fornoobs). -Make sure the domain `btcpay.example.com` point to your server and that port `80` and `443` are open. \ No newline at end of file +Make sure the domain `btcpay.example.com` point to your server and that port `80` and `443` are open. From fe175a2c72051926b95aeaa4d75a4ebc01eaebc0 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 23 Sep 2018 23:54:06 +0200 Subject: [PATCH 20/85] Add files via upload --- Production-Traefik/Production.png | Bin 54471 -> 53750 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Production-Traefik/Production.png b/Production-Traefik/Production.png index 6a27ef0f07c2bc17ce1637587bc6d0adbee441cc..e28875a51994655f0376175f6fd62f6fcbe12c5f 100644 GIT binary patch literal 53750 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 From 10e2ff08c9fecc6528ca11b9fa4e0bbfa5c6c7dd Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Tue, 25 Sep 2018 09:54:38 +0200 Subject: [PATCH 21/85] add in lnd auto pilot for all other lnd supporting coins and add in pruning options for all other coins --- .../docker-fragments/opt-bgold-lnd-autopilot.yml | 9 +++++++++ .../docker-fragments/opt-bgold-save-storage-s.yml | 8 ++++++++ .../docker-fragments/opt-bgold-save-storage-xs.yml | 8 ++++++++ .../docker-fragments/opt-bgold-save-storage-xxs.yml | 8 ++++++++ .../docker-fragments/opt-bgold-save-storage.yml | 8 ++++++++ .../docker-fragments/opt-btc-lnd-autopilot.yml | 9 +++++++++ .../docker-fragments/opt-btc-save-storage-s.yml | 8 ++++++++ .../docker-fragments/opt-btc-save-storage-xs.yml | 8 ++++++++ .../docker-fragments/opt-btc-save-storage-xxs.yml | 8 ++++++++ .../docker-fragments/opt-btc-save-storage.yml | 8 ++++++++ .../docker-fragments/opt-feathercoin-save-storage-s.yml | 8 ++++++++ .../docker-fragments/opt-feathercoin-save-storage-xs.yml | 8 ++++++++ .../opt-feathercoin-save-storage-xxs.yml | 8 ++++++++ .../docker-fragments/opt-feathercoin-save-storage.yml | 8 ++++++++ .../docker-fragments/opt-groestlcoin-save-storage-s.yml | 8 ++++++++ .../docker-fragments/opt-groestlcoin-save-storage-xs.yml | 8 ++++++++ .../opt-groestlcoin-save-storage-xxs.yml | 8 ++++++++ .../docker-fragments/opt-groestlcoin-save-storage.yml | 8 ++++++++ .../docker-fragments/opt-ltc-lnd-autopilot.yml | 9 +++++++++ .../docker-fragments/opt-ltc-save-storage-s.yml | 8 ++++++++ .../docker-fragments/opt-ltc-save-storage-xs.yml | 8 ++++++++ .../docker-fragments/opt-ltc-save-storage-xxs.yml | 8 ++++++++ .../docker-fragments/opt-ltc-save-storage.yml | 8 ++++++++ 23 files changed, 187 insertions(+) create mode 100644 docker-compose-generator/docker-fragments/opt-bgold-lnd-autopilot.yml create mode 100644 docker-compose-generator/docker-fragments/opt-bgold-save-storage-s.yml create mode 100644 docker-compose-generator/docker-fragments/opt-bgold-save-storage-xs.yml create mode 100644 docker-compose-generator/docker-fragments/opt-bgold-save-storage-xxs.yml create mode 100644 docker-compose-generator/docker-fragments/opt-bgold-save-storage.yml create mode 100644 docker-compose-generator/docker-fragments/opt-btc-lnd-autopilot.yml create mode 100644 docker-compose-generator/docker-fragments/opt-btc-save-storage-s.yml create mode 100644 docker-compose-generator/docker-fragments/opt-btc-save-storage-xs.yml create mode 100644 docker-compose-generator/docker-fragments/opt-btc-save-storage-xxs.yml create mode 100644 docker-compose-generator/docker-fragments/opt-btc-save-storage.yml create mode 100644 docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-s.yml create mode 100644 docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-xs.yml create mode 100644 docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-xxs.yml create mode 100644 docker-compose-generator/docker-fragments/opt-feathercoin-save-storage.yml create mode 100644 docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-s.yml create mode 100644 docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-xs.yml create mode 100644 docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-xxs.yml create mode 100644 docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage.yml create mode 100644 docker-compose-generator/docker-fragments/opt-ltc-lnd-autopilot.yml create mode 100644 docker-compose-generator/docker-fragments/opt-ltc-save-storage-s.yml create mode 100644 docker-compose-generator/docker-fragments/opt-ltc-save-storage-xs.yml create mode 100644 docker-compose-generator/docker-fragments/opt-ltc-save-storage-xxs.yml create mode 100644 docker-compose-generator/docker-fragments/opt-ltc-save-storage.yml diff --git a/docker-compose-generator/docker-fragments/opt-bgold-lnd-autopilot.yml b/docker-compose-generator/docker-fragments/opt-bgold-lnd-autopilot.yml new file mode 100644 index 0000000..c92ce27 --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-bgold-lnd-autopilot.yml @@ -0,0 +1,9 @@ +version: "3" + +services: + lnd_bitcoingold: + environment: + LND_EXTRA_ARGS: | + autopilot.active=1 + autopilot.maxchannels=5 + autopilot.allocation=0.6 diff --git a/docker-compose-generator/docker-fragments/opt-bgold-save-storage-s.yml b/docker-compose-generator/docker-fragments/opt-bgold-save-storage-s.yml new file mode 100644 index 0000000..cea27b6 --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-bgold-save-storage-s.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + bgoldd: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=50000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-bgold-save-storage-xs.yml b/docker-compose-generator/docker-fragments/opt-bgold-save-storage-xs.yml new file mode 100644 index 0000000..f5b4dc7 --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-bgold-save-storage-xs.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + bgoldd: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=25000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-bgold-save-storage-xxs.yml b/docker-compose-generator/docker-fragments/opt-bgold-save-storage-xxs.yml new file mode 100644 index 0000000..831e419 --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-bgold-save-storage-xxs.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + bgoldd: + environment: + # If you don't use Lightning Network, you want this + # This save about 2 weeks worth of block + BITCOIN_EXTRA_ARGS: prune=5000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-bgold-save-storage.yml b/docker-compose-generator/docker-fragments/opt-bgold-save-storage.yml new file mode 100644 index 0000000..b737700 --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-bgold-save-storage.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + bgoldd: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. + BITCOIN_EXTRA_ARGS: prune=100000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-btc-lnd-autopilot.yml b/docker-compose-generator/docker-fragments/opt-btc-lnd-autopilot.yml new file mode 100644 index 0000000..aff861e --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-btc-lnd-autopilot.yml @@ -0,0 +1,9 @@ +version: "3" + +services: + lnd_bitcoin: + environment: + LND_EXTRA_ARGS: | + autopilot.active=1 + autopilot.maxchannels=5 + autopilot.allocation=0.6 diff --git a/docker-compose-generator/docker-fragments/opt-btc-save-storage-s.yml b/docker-compose-generator/docker-fragments/opt-btc-save-storage-s.yml new file mode 100644 index 0000000..11177d2 --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-btc-save-storage-s.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + bitcoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=50000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-btc-save-storage-xs.yml b/docker-compose-generator/docker-fragments/opt-btc-save-storage-xs.yml new file mode 100644 index 0000000..a089417 --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-btc-save-storage-xs.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + bitcoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=25000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-btc-save-storage-xxs.yml b/docker-compose-generator/docker-fragments/opt-btc-save-storage-xxs.yml new file mode 100644 index 0000000..22fd776 --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-btc-save-storage-xxs.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + bitcoind: + environment: + # If you don't use Lightning Network, you want this + # This save about 2 weeks worth of block + BITCOIN_EXTRA_ARGS: prune=5000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-btc-save-storage.yml b/docker-compose-generator/docker-fragments/opt-btc-save-storage.yml new file mode 100644 index 0000000..103a3e6 --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-btc-save-storage.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + bitcoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. + BITCOIN_EXTRA_ARGS: prune=100000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-s.yml b/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-s.yml new file mode 100644 index 0000000..8717b81 --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-s.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + feathercoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=50000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-xs.yml b/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-xs.yml new file mode 100644 index 0000000..9a0d789 --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-xs.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + feathercoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=25000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-xxs.yml b/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-xxs.yml new file mode 100644 index 0000000..d2ea1cd --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-xxs.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + feathercoind: + environment: + # If you don't use Lightning Network, you want this + # This save about 2 weeks worth of block + BITCOIN_EXTRA_ARGS: prune=5000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage.yml b/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage.yml new file mode 100644 index 0000000..37d258f --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + feathercoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. + BITCOIN_EXTRA_ARGS: prune=100000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-s.yml b/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-s.yml new file mode 100644 index 0000000..e858e75 --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-s.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + groestlcoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=50000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-xs.yml b/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-xs.yml new file mode 100644 index 0000000..d750170 --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-xs.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + groestlcoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=25000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-xxs.yml b/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-xxs.yml new file mode 100644 index 0000000..27391ec --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-xxs.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + groestlcoind: + environment: + # If you don't use Lightning Network, you want this + # This save about 2 weeks worth of block + BITCOIN_EXTRA_ARGS: prune=5000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage.yml b/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage.yml new file mode 100644 index 0000000..2386e9b --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + groestlcoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. + BITCOIN_EXTRA_ARGS: prune=100000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-ltc-lnd-autopilot.yml b/docker-compose-generator/docker-fragments/opt-ltc-lnd-autopilot.yml new file mode 100644 index 0000000..a6a30b7 --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-ltc-lnd-autopilot.yml @@ -0,0 +1,9 @@ +version: "3" + +services: + lnd_litecoin: + environment: + LND_EXTRA_ARGS: | + autopilot.active=1 + autopilot.maxchannels=5 + autopilot.allocation=0.6 diff --git a/docker-compose-generator/docker-fragments/opt-ltc-save-storage-s.yml b/docker-compose-generator/docker-fragments/opt-ltc-save-storage-s.yml new file mode 100644 index 0000000..fb5f00e --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-ltc-save-storage-s.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + litecoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=50000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-ltc-save-storage-xs.yml b/docker-compose-generator/docker-fragments/opt-ltc-save-storage-xs.yml new file mode 100644 index 0000000..f1607dc --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-ltc-save-storage-xs.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + litecoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=25000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-ltc-save-storage-xxs.yml b/docker-compose-generator/docker-fragments/opt-ltc-save-storage-xxs.yml new file mode 100644 index 0000000..c0216ee --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-ltc-save-storage-xxs.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + litecoind: + environment: + # If you don't use Lightning Network, you want this + # This save about 2 weeks worth of block + BITCOIN_EXTRA_ARGS: prune=5000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-ltc-save-storage.yml b/docker-compose-generator/docker-fragments/opt-ltc-save-storage.yml new file mode 100644 index 0000000..82ef2e1 --- /dev/null +++ b/docker-compose-generator/docker-fragments/opt-ltc-save-storage.yml @@ -0,0 +1,8 @@ +version: "3" + +services: + litecoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. + BITCOIN_EXTRA_ARGS: prune=100000 \ No newline at end of file From 51333f15afbe779ced95c954ced291c2a9ac4314 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Tue, 25 Sep 2018 10:00:44 +0200 Subject: [PATCH 22/85] add in gitignore traefik generated files --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index c85785c..69ccb05 100644 --- a/.gitignore +++ b/.gitignore @@ -297,3 +297,8 @@ Production/.env .vscode/ *docker-compose.generated.yml +Generated/acme.json +Generated/traefik_logs/ +Generated/error + + From 08bc7667fc45311cd7daf9c23f684892cb6342fd Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Mon, 17 Sep 2018 10:20:49 +0200 Subject: [PATCH 23/85] allow to specify generator image when building --- build.ps1 | 3 ++- build.sh | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/build.ps1 b/build.ps1 index 840d9a4..89ed908 100755 --- a/build.ps1 +++ b/build.ps1 @@ -1,6 +1,7 @@ # This script will run docker-compose-generator in a container to generate the yml files +if (-not ($BTCPAYGEN_DOCKER_IMAGE)) { $BTCPAYGEN_DOCKER_IMAGE = "btcpayserver/docker-compose-generator" } -docker pull btcpayserver/docker-compose-generator +docker pull $BTCPAYGEN_DOCKER_IMAGE: docker run -v "$(Get-Location)\Generated:/app/Generated" ` -v "$(Get-Location)\docker-compose-generator\docker-fragments:/app/docker-fragments" ` -e "BTCPAYGEN_CRYPTO1=$BTCPAYGEN_CRYPTO1" ` diff --git a/build.sh b/build.sh index 62b1a65..eba13bd 100755 --- a/build.sh +++ b/build.sh @@ -1,7 +1,7 @@ #!/bin/bash # This script will run docker-compose-generator in a container to generate the yml files -docker pull btcpayserver/docker-compose-generator +docker pull ${BTCPAYGEN_DOCKER_IMAGE:-"btcpayserver/docker-compose-generator"} docker run -v "$(pwd)/Generated:/app/Generated" \ -v "$(pwd)/docker-compose-generator/docker-fragments:/app/docker-fragments" \ -e "BTCPAYGEN_CRYPTO1=$BTCPAYGEN_CRYPTO1" \ From 6f2865617d7d8f4725ffd26f7eaf9dd6a030daae Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 16 Sep 2018 18:29:38 +0200 Subject: [PATCH 24/85] run cusom image as well --- build.ps1 | 2 +- build.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.ps1 b/build.ps1 index 89ed908..d02efbd 100755 --- a/build.ps1 +++ b/build.ps1 @@ -17,7 +17,7 @@ docker run -v "$(Get-Location)\Generated:/app/Generated" ` -e "BTCPAYGEN_ADDITIONAL_FRAGMENTS=$BTCPAYGEN_ADDITIONAL_FRAGMENTS" ` -e "BTCPAYGEN_LIGHTNING=$BTCPAYGEN_LIGHTNING" ` -e "BTCPAYGEN_SUBNAME=$BTCPAYGEN_SUBNAME" ` - --rm btcpayserver/docker-compose-generator + --rm $BTCPAYGEN_DOCKER_IMAGE If ($BTCPAYGEN_REVERSEPROXY -eq "nginx") { Copy-Item ".\Production\nginx.tmpl" -Destination ".\Generated" diff --git a/build.sh b/build.sh index eba13bd..7f82e69 100755 --- a/build.sh +++ b/build.sh @@ -17,7 +17,7 @@ docker run -v "$(pwd)/Generated:/app/Generated" \ -e "BTCPAYGEN_ADDITIONAL_FRAGMENTS=$BTCPAYGEN_ADDITIONAL_FRAGMENTS" \ -e "BTCPAYGEN_LIGHTNING=$BTCPAYGEN_LIGHTNING" \ -e "BTCPAYGEN_SUBNAME=$BTCPAYGEN_SUBNAME" \ - --rm btcpayserver/docker-compose-generator + --rm ${BTCPAYGEN_DOCKER_IMAGE:-"btcpayserver/docker-compose-generator"} if [ "$BTCPAYGEN_REVERSEPROXY" == "nginx" ]; then cp Production/nginx.tmpl Generated/nginx.tmpl From add439ddfac7a3af4d7f41d2dcaf12cfa63eed0d Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Tue, 25 Sep 2018 10:17:55 +0200 Subject: [PATCH 25/85] allow way to build a local generator image instead of relying of existing one --- build.ps1 | 9 +++++++-- build.sh | 8 +++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/build.ps1 b/build.ps1 index d02efbd..3c4da33 100755 --- a/build.ps1 +++ b/build.ps1 @@ -1,7 +1,12 @@ # This script will run docker-compose-generator in a container to generate the yml files -if (-not ($BTCPAYGEN_DOCKER_IMAGE)) { $BTCPAYGEN_DOCKER_IMAGE = "btcpayserver/docker-compose-generator" } -docker pull $BTCPAYGEN_DOCKER_IMAGE: +If (-not ($BTCPAYGEN_DOCKER_IMAGE)) { $BTCPAYGEN_DOCKER_IMAGE = "btcpayserver/docker-compose-generator" } +If($BTCPAYGEN_DOCKER_IMAGE -eq "build"){ + docker build docker-compose-generator --tag build +} Else { + docker pull $BTCPAYGEN_DOCKER_IMAGE: +} + docker run -v "$(Get-Location)\Generated:/app/Generated" ` -v "$(Get-Location)\docker-compose-generator\docker-fragments:/app/docker-fragments" ` -e "BTCPAYGEN_CRYPTO1=$BTCPAYGEN_CRYPTO1" ` diff --git a/build.sh b/build.sh index 7f82e69..2820aaa 100755 --- a/build.sh +++ b/build.sh @@ -1,7 +1,13 @@ #!/bin/bash +if [ "$BTCPAYGEN_DOCKER_IMAGE" == "build" ] +then + docker build docker-compose-generator --tag build +else + docker pull ${BTCPAYGEN_DOCKER_IMAGE:-"btcpayserver/docker-compose-generator"} +fi + # This script will run docker-compose-generator in a container to generate the yml files -docker pull ${BTCPAYGEN_DOCKER_IMAGE:-"btcpayserver/docker-compose-generator"} docker run -v "$(pwd)/Generated:/app/Generated" \ -v "$(pwd)/docker-compose-generator/docker-fragments:/app/docker-fragments" \ -e "BTCPAYGEN_CRYPTO1=$BTCPAYGEN_CRYPTO1" \ From 4ccb55af27d4c968bc5d821caa822ecc93cb81ba Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Fri, 28 Sep 2018 17:32:52 +0900 Subject: [PATCH 26/85] bump --- .../docker-compose.btc-clightning.yml | 8 ++++++-- .../docker-compose.btc-ltc-clightning.yml | 14 +++++++++++--- .../docker-compose.btc-ltc.yml | 10 +++++++++- Production-NoReverseProxy/docker-compose.btc.yml | 6 +++++- .../docker-compose.ltc-clightning.yml | 8 ++++++-- Production-NoReverseProxy/docker-compose.ltc.yml | 6 +++++- Production/docker-compose.btc-clightning.yml | 8 ++++++-- Production/docker-compose.btc-ltc-clightning.yml | 14 +++++++++++--- Production/docker-compose.btc-ltc.yml | 10 +++++++++- Production/docker-compose.btc.yml | 6 +++++- Production/docker-compose.ltc-clightning.yml | 8 ++++++-- Production/docker-compose.ltc.yml | 6 +++++- .../docker-fragments/bitcoin-clightning.yml | 2 +- .../docker-fragments/bitcoin-lnd.yml | 8 +++++--- .../docker-fragments/bitcoin.yml | 4 ++++ .../docker-fragments/btcpayserver.yml | 2 +- .../docker-fragments/litecoin-clightning.yml | 2 +- .../docker-fragments/litecoin-lnd.yml | 8 +++++--- .../docker-fragments/litecoin.yml | 4 ++++ 19 files changed, 105 insertions(+), 29 deletions(-) diff --git a/Production-NoReverseProxy/docker-compose.btc-clightning.yml b/Production-NoReverseProxy/docker-compose.btc-clightning.yml index 58a6a96..75203e5 100644 --- a/Production-NoReverseProxy/docker-compose.btc-clightning.yml +++ b/Production-NoReverseProxy/docker-compose.btc-clightning.yml @@ -2,7 +2,7 @@ version: "3" services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.105 + image: nicolasdorier/btcpayserver:1.0.2.106 expose: - "49392" environment: @@ -63,13 +63,17 @@ services: ${NBITCOIN_NETWORK:-regtest}=1 port=39388 whitelist=0.0.0.0/0 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 expose: - "43782" - "39388" + - "28332" + - "28333" volumes: - "bitcoin_datadir:/data" clightning_bitcoin: - image: nicolasdorier/clightning:634f19a7b230edc686be56ab950b80784e56252c + image: nicolasdorier/clightning:v0.6.1 container_name: btcpayserver_clightning_bitcoin restart: unless-stopped environment: diff --git a/Production-NoReverseProxy/docker-compose.btc-ltc-clightning.yml b/Production-NoReverseProxy/docker-compose.btc-ltc-clightning.yml index 1045401..460e0a3 100644 --- a/Production-NoReverseProxy/docker-compose.btc-ltc-clightning.yml +++ b/Production-NoReverseProxy/docker-compose.btc-ltc-clightning.yml @@ -2,7 +2,7 @@ version: "3" services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.105 + image: nicolasdorier/btcpayserver:1.0.2.106 expose: - "49392" environment: @@ -70,14 +70,18 @@ services: rpcport=43782 ${NBITCOIN_NETWORK:-regtest}=1 port=39388 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 whitelist=0.0.0.0/0 expose: - "43782" - "39388" + - "28332" + - "28333" volumes: - "litecoin_datadir:/data" clightning_litecoin: - image: nicolasdorier/clightning:634f19a7b230edc686be56ab950b80784e56252c + image: nicolasdorier/clightning:v0.6.1 container_name: btcpayserver_clightning_litecoin restart: unless-stopped environment: @@ -111,13 +115,17 @@ services: ${NBITCOIN_NETWORK:-regtest}=1 port=39388 whitelist=0.0.0.0/0 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 expose: - "43782" - "39388" + - "28332" + - "28333" volumes: - "bitcoin_datadir:/data" clightning_bitcoin: - image: nicolasdorier/clightning:634f19a7b230edc686be56ab950b80784e56252c + image: nicolasdorier/clightning:v0.6.1 container_name: btcpayserver_clightning_bitcoin restart: unless-stopped environment: diff --git a/Production-NoReverseProxy/docker-compose.btc-ltc.yml b/Production-NoReverseProxy/docker-compose.btc-ltc.yml index a0a57a8..3f43a3c 100644 --- a/Production-NoReverseProxy/docker-compose.btc-ltc.yml +++ b/Production-NoReverseProxy/docker-compose.btc-ltc.yml @@ -2,7 +2,7 @@ version: "3" services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.105 + image: nicolasdorier/btcpayserver:1.0.2.106 expose: - "49392" environment: @@ -64,10 +64,14 @@ services: rpcport=43782 ${NBITCOIN_NETWORK:-regtest}=1 port=39388 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 whitelist=0.0.0.0/0 expose: - "43782" - "39388" + - "28332" + - "28333" volumes: - "litecoin_datadir:/data" bitcoind: @@ -80,9 +84,13 @@ services: ${NBITCOIN_NETWORK:-regtest}=1 port=39388 whitelist=0.0.0.0/0 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 expose: - "43782" - "39388" + - "28332" + - "28333" volumes: - "bitcoin_datadir:/data" volumes: diff --git a/Production-NoReverseProxy/docker-compose.btc.yml b/Production-NoReverseProxy/docker-compose.btc.yml index a91fb9d..8df42f2 100644 --- a/Production-NoReverseProxy/docker-compose.btc.yml +++ b/Production-NoReverseProxy/docker-compose.btc.yml @@ -2,7 +2,7 @@ version: "3" services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.105 + image: nicolasdorier/btcpayserver:1.0.2.106 expose: - "49392" environment: @@ -60,9 +60,13 @@ services: ${NBITCOIN_NETWORK:-regtest}=1 port=39388 whitelist=0.0.0.0/0 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 expose: - "43782" - "39388" + - "28332" + - "28333" volumes: - "bitcoin_datadir:/data" volumes: diff --git a/Production-NoReverseProxy/docker-compose.ltc-clightning.yml b/Production-NoReverseProxy/docker-compose.ltc-clightning.yml index 04ebada..e29675f 100644 --- a/Production-NoReverseProxy/docker-compose.ltc-clightning.yml +++ b/Production-NoReverseProxy/docker-compose.ltc-clightning.yml @@ -2,7 +2,7 @@ version: "3" services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.105 + image: nicolasdorier/btcpayserver:1.0.2.106 expose: - "49392" environment: @@ -62,14 +62,18 @@ services: rpcport=43782 ${NBITCOIN_NETWORK:-regtest}=1 port=39388 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 whitelist=0.0.0.0/0 expose: - "43782" - "39388" + - "28332" + - "28333" volumes: - "litecoin_datadir:/data" clightning_litecoin: - image: nicolasdorier/clightning:634f19a7b230edc686be56ab950b80784e56252c + image: nicolasdorier/clightning:v0.6.1 container_name: btcpayserver_clightning_litecoin restart: unless-stopped environment: diff --git a/Production-NoReverseProxy/docker-compose.ltc.yml b/Production-NoReverseProxy/docker-compose.ltc.yml index 410e25e..ff13738 100644 --- a/Production-NoReverseProxy/docker-compose.ltc.yml +++ b/Production-NoReverseProxy/docker-compose.ltc.yml @@ -2,7 +2,7 @@ version: "3" services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.105 + image: nicolasdorier/btcpayserver:1.0.2.106 expose: - "49392" environment: @@ -59,10 +59,14 @@ services: rpcport=43782 ${NBITCOIN_NETWORK:-regtest}=1 port=39388 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 whitelist=0.0.0.0/0 expose: - "43782" - "39388" + - "28332" + - "28333" volumes: - "litecoin_datadir:/data" volumes: diff --git a/Production/docker-compose.btc-clightning.yml b/Production/docker-compose.btc-clightning.yml index 7a58a45..55d4bf5 100644 --- a/Production/docker-compose.btc-clightning.yml +++ b/Production/docker-compose.btc-clightning.yml @@ -46,7 +46,7 @@ services: - nginx-gen btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.105 + image: nicolasdorier/btcpayserver:1.0.2.106 expose: - "49392" environment: @@ -105,13 +105,17 @@ services: ${NBITCOIN_NETWORK:-regtest}=1 port=39388 whitelist=0.0.0.0/0 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 expose: - "43782" - "39388" + - "28332" + - "28333" volumes: - "bitcoin_datadir:/data" clightning_bitcoin: - image: nicolasdorier/clightning:634f19a7b230edc686be56ab950b80784e56252c + image: nicolasdorier/clightning:v0.6.1 container_name: btcpayserver_clightning_bitcoin restart: unless-stopped environment: diff --git a/Production/docker-compose.btc-ltc-clightning.yml b/Production/docker-compose.btc-ltc-clightning.yml index 984ee55..3f594d6 100644 --- a/Production/docker-compose.btc-ltc-clightning.yml +++ b/Production/docker-compose.btc-ltc-clightning.yml @@ -46,7 +46,7 @@ services: - nginx-gen btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.105 + image: nicolasdorier/btcpayserver:1.0.2.106 expose: - "49392" environment: @@ -112,14 +112,18 @@ services: rpcport=43782 ${NBITCOIN_NETWORK:-regtest}=1 port=39388 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 whitelist=0.0.0.0/0 expose: - "43782" - "39388" + - "28332" + - "28333" volumes: - "litecoin_datadir:/data" clightning_litecoin: - image: nicolasdorier/clightning:634f19a7b230edc686be56ab950b80784e56252c + image: nicolasdorier/clightning:v0.6.1 container_name: btcpayserver_clightning_litecoin restart: unless-stopped environment: @@ -153,13 +157,17 @@ services: ${NBITCOIN_NETWORK:-regtest}=1 port=39388 whitelist=0.0.0.0/0 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 expose: - "43782" - "39388" + - "28332" + - "28333" volumes: - "bitcoin_datadir:/data" clightning_bitcoin: - image: nicolasdorier/clightning:634f19a7b230edc686be56ab950b80784e56252c + image: nicolasdorier/clightning:v0.6.1 container_name: btcpayserver_clightning_bitcoin restart: unless-stopped environment: diff --git a/Production/docker-compose.btc-ltc.yml b/Production/docker-compose.btc-ltc.yml index bdf658e..2452d91 100644 --- a/Production/docker-compose.btc-ltc.yml +++ b/Production/docker-compose.btc-ltc.yml @@ -46,7 +46,7 @@ services: - nginx-gen btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.105 + image: nicolasdorier/btcpayserver:1.0.2.106 expose: - "49392" environment: @@ -106,10 +106,14 @@ services: rpcport=43782 ${NBITCOIN_NETWORK:-regtest}=1 port=39388 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 whitelist=0.0.0.0/0 expose: - "43782" - "39388" + - "28332" + - "28333" volumes: - "litecoin_datadir:/data" bitcoind: @@ -122,9 +126,13 @@ services: ${NBITCOIN_NETWORK:-regtest}=1 port=39388 whitelist=0.0.0.0/0 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 expose: - "43782" - "39388" + - "28332" + - "28333" volumes: - "bitcoin_datadir:/data" volumes: diff --git a/Production/docker-compose.btc.yml b/Production/docker-compose.btc.yml index 6ca058e..3d569ac 100644 --- a/Production/docker-compose.btc.yml +++ b/Production/docker-compose.btc.yml @@ -46,7 +46,7 @@ services: - nginx-gen btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.105 + image: nicolasdorier/btcpayserver:1.0.2.106 expose: - "49392" environment: @@ -102,9 +102,13 @@ services: ${NBITCOIN_NETWORK:-regtest}=1 port=39388 whitelist=0.0.0.0/0 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 expose: - "43782" - "39388" + - "28332" + - "28333" volumes: - "bitcoin_datadir:/data" volumes: diff --git a/Production/docker-compose.ltc-clightning.yml b/Production/docker-compose.ltc-clightning.yml index 5e58b31..157b1be 100644 --- a/Production/docker-compose.ltc-clightning.yml +++ b/Production/docker-compose.ltc-clightning.yml @@ -46,7 +46,7 @@ services: - nginx-gen btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.105 + image: nicolasdorier/btcpayserver:1.0.2.106 expose: - "49392" environment: @@ -104,14 +104,18 @@ services: rpcport=43782 ${NBITCOIN_NETWORK:-regtest}=1 port=39388 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 whitelist=0.0.0.0/0 expose: - "43782" - "39388" + - "28332" + - "28333" volumes: - "litecoin_datadir:/data" clightning_litecoin: - image: nicolasdorier/clightning:634f19a7b230edc686be56ab950b80784e56252c + image: nicolasdorier/clightning:v0.6.1 container_name: btcpayserver_clightning_litecoin restart: unless-stopped environment: diff --git a/Production/docker-compose.ltc.yml b/Production/docker-compose.ltc.yml index 7551060..060e9d3 100644 --- a/Production/docker-compose.ltc.yml +++ b/Production/docker-compose.ltc.yml @@ -46,7 +46,7 @@ services: - nginx-gen btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.105 + image: nicolasdorier/btcpayserver:1.0.2.106 expose: - "49392" environment: @@ -101,10 +101,14 @@ services: rpcport=43782 ${NBITCOIN_NETWORK:-regtest}=1 port=39388 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 whitelist=0.0.0.0/0 expose: - "43782" - "39388" + - "28332" + - "28333" volumes: - "litecoin_datadir:/data" volumes: diff --git a/docker-compose-generator/docker-fragments/bitcoin-clightning.yml b/docker-compose-generator/docker-fragments/bitcoin-clightning.yml index 31403e7..ceda8ec 100644 --- a/docker-compose-generator/docker-fragments/bitcoin-clightning.yml +++ b/docker-compose-generator/docker-fragments/bitcoin-clightning.yml @@ -2,7 +2,7 @@ version: "3" services: clightning_bitcoin: - image: nicolasdorier/clightning:634f19a7b230edc686be56ab950b80784e56252c + image: nicolasdorier/clightning:v0.6.1 container_name: btcpayserver_clightning_bitcoin restart: unless-stopped environment: diff --git a/docker-compose-generator/docker-fragments/bitcoin-lnd.yml b/docker-compose-generator/docker-fragments/bitcoin-lnd.yml index b4eeedb..18a6bb2 100644 --- a/docker-compose-generator/docker-fragments/bitcoin-lnd.yml +++ b/docker-compose-generator/docker-fragments/bitcoin-lnd.yml @@ -2,7 +2,7 @@ version: "3" services: lnd_bitcoin: - image: btcpayserver/lnd:0.4.2.0.1 + image: btcpayserver/lnd:0.5-beta container_name: btcpayserver_lnd_bitcoin restart: unless-stopped environment: @@ -15,10 +15,12 @@ services: rpclisten=0.0.0.0:10009 bitcoin.node=bitcoind bitcoind.rpchost=bitcoind:43782 - bitcoind.zmqpath=tcp://bitcoind:28332 + bitcoind.zmqpubrawblock=tcp://bitcoind:28332 + bitcoind.zmqpubrawtx=tcp://bitcoind:28333 externalip=${BTCPAY_HOST}:9735 alias=${LIGHTNING_ALIAS} - noencryptwallet=1 + adminmacaroonpath=/data/admin.macaroon + noseedbackup=1 notls=1 ports: - "9735:9735" diff --git a/docker-compose-generator/docker-fragments/bitcoin.yml b/docker-compose-generator/docker-fragments/bitcoin.yml index f23221a..81ec724 100644 --- a/docker-compose-generator/docker-fragments/bitcoin.yml +++ b/docker-compose-generator/docker-fragments/bitcoin.yml @@ -11,9 +11,13 @@ services: ${NBITCOIN_NETWORK:-regtest}=1 port=39388 whitelist=0.0.0.0/0 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 expose: - "43782" - "39388" + - "28332" # ZMQ + - "28333" # ZMQ volumes: - "bitcoin_datadir:/data" nbxplorer: diff --git a/docker-compose-generator/docker-fragments/btcpayserver.yml b/docker-compose-generator/docker-fragments/btcpayserver.yml index b1ffc14..c9ac995 100644 --- a/docker-compose-generator/docker-fragments/btcpayserver.yml +++ b/docker-compose-generator/docker-fragments/btcpayserver.yml @@ -4,7 +4,7 @@ services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.105 + image: nicolasdorier/btcpayserver:1.0.2.106 expose: - "49392" environment: diff --git a/docker-compose-generator/docker-fragments/litecoin-clightning.yml b/docker-compose-generator/docker-fragments/litecoin-clightning.yml index 602a566..8156e08 100644 --- a/docker-compose-generator/docker-fragments/litecoin-clightning.yml +++ b/docker-compose-generator/docker-fragments/litecoin-clightning.yml @@ -2,7 +2,7 @@ version: "3" services: clightning_litecoin: - image: nicolasdorier/clightning:634f19a7b230edc686be56ab950b80784e56252c + image: nicolasdorier/clightning:v0.6.1 container_name: btcpayserver_clightning_litecoin restart: unless-stopped environment: diff --git a/docker-compose-generator/docker-fragments/litecoin-lnd.yml b/docker-compose-generator/docker-fragments/litecoin-lnd.yml index be9ba0e..df68428 100644 --- a/docker-compose-generator/docker-fragments/litecoin-lnd.yml +++ b/docker-compose-generator/docker-fragments/litecoin-lnd.yml @@ -2,7 +2,7 @@ version: "3" services: lnd_litecoin: - image: btcpayserver/lnd:0.4.2.0.1 + image: btcpayserver/lnd:0.5-beta container_name: btcpayserver_lnd_litecoin restart: unless-stopped environment: @@ -13,10 +13,12 @@ services: restlisten=0.0.0.0:8080 litecoin.node=litecoind litecoind.rpchost=litecoind:43782 - litecoind.zmqpath=tcp://litecoind:28332 + litecoind.zmqpubrawblock=tcp://litecoind:28332 + litecoind.zmqpubrawtx=tcp://litecoind:28333 externalip=${BTCPAY_HOST}:9736 alias=${LIGHTNING_ALIAS} - noencryptwallet=1 + adminmacaroonpath=/data/admin.macaroon + noseedbackup=1 notls=1 ports: - "9736:9735" diff --git a/docker-compose-generator/docker-fragments/litecoin.yml b/docker-compose-generator/docker-fragments/litecoin.yml index 3391261..2d2d0b7 100644 --- a/docker-compose-generator/docker-fragments/litecoin.yml +++ b/docker-compose-generator/docker-fragments/litecoin.yml @@ -10,10 +10,14 @@ services: rpcport=43782 ${NBITCOIN_NETWORK:-regtest}=1 port=39388 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 whitelist=0.0.0.0/0 expose: - "43782" - "39388" + - "28332" # ZMQ + - "28333" # ZMQ volumes: - "litecoin_datadir:/data" nbxplorer: From 612d34d79e8f66987f0b7a8f38d9a9e2a0731d77 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Fri, 28 Sep 2018 17:32:52 +0900 Subject: [PATCH 27/85] bump --- docker-compose-generator/docker-fragments/bitcoin-lnd.yml | 2 +- docker-compose-generator/docker-fragments/bitcoin.yml | 4 ---- docker-compose-generator/docker-fragments/litecoin-lnd.yml | 3 ++- docker-compose-generator/docker-fragments/litecoin.yml | 4 ---- 4 files changed, 3 insertions(+), 10 deletions(-) diff --git a/docker-compose-generator/docker-fragments/bitcoin-lnd.yml b/docker-compose-generator/docker-fragments/bitcoin-lnd.yml index 18a6bb2..74931cc 100644 --- a/docker-compose-generator/docker-fragments/bitcoin-lnd.yml +++ b/docker-compose-generator/docker-fragments/bitcoin-lnd.yml @@ -47,8 +47,8 @@ services: bitcoind: environment: BITCOIN_EXTRA_ARGS: | - zmqpubrawtx=tcp://0.0.0.0:28332 zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 expose: - "28332" - "28333" diff --git a/docker-compose-generator/docker-fragments/bitcoin.yml b/docker-compose-generator/docker-fragments/bitcoin.yml index 81ec724..f23221a 100644 --- a/docker-compose-generator/docker-fragments/bitcoin.yml +++ b/docker-compose-generator/docker-fragments/bitcoin.yml @@ -11,13 +11,9 @@ services: ${NBITCOIN_NETWORK:-regtest}=1 port=39388 whitelist=0.0.0.0/0 - zmqpubrawblock=tcp://0.0.0.0:28332 - zmqpubrawtx=tcp://0.0.0.0:28333 expose: - "43782" - "39388" - - "28332" # ZMQ - - "28333" # ZMQ volumes: - "bitcoin_datadir:/data" nbxplorer: diff --git a/docker-compose-generator/docker-fragments/litecoin-lnd.yml b/docker-compose-generator/docker-fragments/litecoin-lnd.yml index df68428..ed96f06 100644 --- a/docker-compose-generator/docker-fragments/litecoin-lnd.yml +++ b/docker-compose-generator/docker-fragments/litecoin-lnd.yml @@ -44,10 +44,11 @@ services: litecoind: environment: BITCOIN_EXTRA_ARGS: | - zmqpubrawtx=tcp://0.0.0.0:28332 zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 expose: - "28332" + - "28333" volumes: lnd_litecoin_datadir: \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/litecoin.yml b/docker-compose-generator/docker-fragments/litecoin.yml index 2d2d0b7..3391261 100644 --- a/docker-compose-generator/docker-fragments/litecoin.yml +++ b/docker-compose-generator/docker-fragments/litecoin.yml @@ -10,14 +10,10 @@ services: rpcport=43782 ${NBITCOIN_NETWORK:-regtest}=1 port=39388 - zmqpubrawblock=tcp://0.0.0.0:28332 - zmqpubrawtx=tcp://0.0.0.0:28333 whitelist=0.0.0.0/0 expose: - "43782" - "39388" - - "28332" # ZMQ - - "28333" # ZMQ volumes: - "litecoin_datadir:/data" nbxplorer: From 9acb5d8067cb5c46f59858137feb699b41ac9f19 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Sat, 29 Sep 2018 13:26:07 +0900 Subject: [PATCH 28/85] Fix macaroonpath for utilities --- bitcoin-lncli.ps1 | 2 +- bitcoin-lncli.sh | 2 +- litecoin-lncli.ps1 | 2 +- litecoin-lncli.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bitcoin-lncli.ps1 b/bitcoin-lncli.ps1 index f42a002..f40e82e 100755 --- a/bitcoin-lncli.ps1 +++ b/bitcoin-lncli.ps1 @@ -1 +1 @@ -docker exec -ti btcpayserver_lnd_bitcoin lncli $args +docker exec -ti btcpayserver_lnd_bitcoin lncli --macaroonpath /root/.lnd/admin.macaroon $args diff --git a/bitcoin-lncli.sh b/bitcoin-lncli.sh index e94deb1..34b1b55 100755 --- a/bitcoin-lncli.sh +++ b/bitcoin-lncli.sh @@ -1,3 +1,3 @@ #!/bin/bash -docker exec -ti btcpayserver_lnd_bitcoin lncli "$@" +docker exec -ti btcpayserver_lnd_bitcoin lncli --macaroonpath /root/.lnd/admin.macaroon "$@" diff --git a/litecoin-lncli.ps1 b/litecoin-lncli.ps1 index 5eea0cc..e286ac9 100755 --- a/litecoin-lncli.ps1 +++ b/litecoin-lncli.ps1 @@ -1 +1 @@ -docker exec -ti btcpayserver_lnd_litecoin lncli $args +docker exec -ti btcpayserver_lnd_litecoin lncli --macaroonpath /root/.lnd/admin.macaroon $args diff --git a/litecoin-lncli.sh b/litecoin-lncli.sh index c2bb713..5178674 100755 --- a/litecoin-lncli.sh +++ b/litecoin-lncli.sh @@ -1,3 +1,3 @@ #!/bin/bash -docker exec -ti btcpayserver_lnd_litecoin lncli "$@" +docker exec -ti btcpayserver_lnd_litecoin lncli --macaroonpath /root/.lnd/admin.macaroon "$@" From 612d8ec6f0ddaf203b849dc1b15dbeb826965fca Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Sat, 29 Sep 2018 21:56:08 +0900 Subject: [PATCH 29/85] Remove legacy pregen docker compose --- Production-NoReverseProxy/README.md | 15 +- .../docker-compose.btc-clightning.yml | 105 --------- .../docker-compose.btc-ltc-clightning.yml | 159 -------------- .../docker-compose.btc-ltc.yml | 101 --------- .../docker-compose.btc.yml | 76 ------- .../docker-compose.ltc-clightning.yml | 105 --------- .../docker-compose.ltc.yml | 76 ------- Production/README.md | 18 +- Production/docker-compose.btc-clightning.yml | 151 ------------- .../docker-compose.btc-ltc-clightning.yml | 205 ------------------ Production/docker-compose.btc-ltc.yml | 147 ------------- Production/docker-compose.btc.yml | 122 ----------- Production/docker-compose.ltc-clightning.yml | 151 ------------- Production/docker-compose.ltc.yml | 122 ----------- README.md | 5 +- btcpay-setup.sh | 49 +---- btcpay-update.sh | 5 + build-pregen.ps1 | 7 - build-pregen.sh | 8 - docker-compose-generator/src/Program.cs | 83 ++----- 20 files changed, 39 insertions(+), 1671 deletions(-) delete mode 100644 Production-NoReverseProxy/docker-compose.btc-clightning.yml delete mode 100644 Production-NoReverseProxy/docker-compose.btc-ltc-clightning.yml delete mode 100644 Production-NoReverseProxy/docker-compose.btc-ltc.yml delete mode 100644 Production-NoReverseProxy/docker-compose.btc.yml delete mode 100644 Production-NoReverseProxy/docker-compose.ltc-clightning.yml delete mode 100644 Production-NoReverseProxy/docker-compose.ltc.yml delete mode 100644 Production/docker-compose.btc-clightning.yml delete mode 100644 Production/docker-compose.btc-ltc-clightning.yml delete mode 100644 Production/docker-compose.btc-ltc.yml delete mode 100644 Production/docker-compose.btc.yml delete mode 100644 Production/docker-compose.ltc-clightning.yml delete mode 100644 Production/docker-compose.ltc.yml delete mode 100755 build-pregen.ps1 delete mode 100755 build-pregen.sh diff --git a/Production-NoReverseProxy/README.md b/Production-NoReverseProxy/README.md index 25de599..6a7bc47 100644 --- a/Production-NoReverseProxy/README.md +++ b/Production-NoReverseProxy/README.md @@ -1,17 +1,4 @@ -# About those pre-generated docker-compose - -All `docker-compose` files in this folder are generated by running the [build-pregen.sh](build-pregen.sh) (or [build-pregen.ps1](build-pregen.ps1)) script from the fragments located in [docker-compose-generator/docker-fragments](docker-compose-generator/docker-fragments). - -The pre-generated `docker-compose` files only cover `btc`, `ltc`, `clightning` without reverse proxy. - ---- - -We strongly advise you to not use the pre-generated docker-compose of this folder, they are deprecated and kept only for backward compatibility. -Instead use the [build.sh](../build.sh) as documented in (README)(../Readme.md) to generate a docker-compose which fit your needs. - ---- - -This `docker-compose` files can be used for production purpose. +# How to use docker-compose without reverse proxy ![Architecture](https://github.com/btcpayserver/btcpayserver-doc/raw/master/img/Architecture.png) diff --git a/Production-NoReverseProxy/docker-compose.btc-clightning.yml b/Production-NoReverseProxy/docker-compose.btc-clightning.yml deleted file mode 100644 index 75203e5..0000000 --- a/Production-NoReverseProxy/docker-compose.btc-clightning.yml +++ /dev/null @@ -1,105 +0,0 @@ -version: "3" -services: - btcpayserver: - restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.106 - expose: - - "49392" - environment: - BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} - BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} - BTCPAY_BIND: 0.0.0.0:49392 - BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ - BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} - BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} - BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - VIRTUAL_NETWORK: nginx-proxy - VIRTUAL_PORT: 49392 - VIRTUAL_HOST: ${BTCPAY_HOST} - SSL_POLICY: Mozilla-Modern - LETSENCRYPT_HOST: ${BTCPAY_HOST} - LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} - BTCPAY_CHAINS: "btc" - BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ - BTCPAY_BTCLIGHTNING: "type=clightning;server=unix://etc/clightning_bitcoin/lightning-rpc" - links: - - nbxplorer - - postgres - - clightning_bitcoin - volumes: - - "btcpay_datadir:/datadir" - - "nbxplorer_datadir:/root/.nbxplorer" - - "clightning_bitcoin_datadir:/etc/clightning_bitcoin" - ports: - - "80:49392" - nbxplorer: - restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 - expose: - - "32838" - environment: - NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} - NBXPLORER_BIND: 0.0.0.0:32838 - NBXPLORER_CHAINS: "btc" - NBXPLORER_BTCRPCURL: http://bitcoind:43782/ - NBXPLORER_BTCNODEENDPOINT: bitcoind:39388 - volumes: - - "nbxplorer_datadir:/datadir" - - "bitcoin_datadir:/root/.bitcoin" - links: - - bitcoind - postgres: - restart: unless-stopped - image: postgres:9.6.5 - volumes: - - "postgres_datadir:/var/lib/postgresql/data" - bitcoind: - restart: unless-stopped - container_name: btcpayserver_bitcoind - image: nicolasdorier/docker-bitcoin:0.16.3 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - whitelist=0.0.0.0/0 - zmqpubrawblock=tcp://0.0.0.0:28332 - zmqpubrawtx=tcp://0.0.0.0:28333 - expose: - - "43782" - - "39388" - - "28332" - - "28333" - volumes: - - "bitcoin_datadir:/data" - clightning_bitcoin: - image: nicolasdorier/clightning:v0.6.1 - container_name: btcpayserver_clightning_bitcoin - restart: unless-stopped - environment: - LIGHTNINGD_NETWORK: ${NBITCOIN_NETWORK:-regtest} - LIGHTNINGD_CHAIN: btc - LIGHTNINGD_EXPLORERURL: "http://nbxplorer:32838/" - LIGHTNINGD_OPT: | - bitcoin-datadir=/etc/bitcoin - bitcoin-rpcconnect=bitcoind - announce-addr=${BTCPAY_HOST}:9735 - bind-addr=0.0.0.0:9735 - network=${NBITCOIN_NETWORK:-regtest} - alias=${LIGHTNING_ALIAS} - chain=btc - volumes: - - "clightning_bitcoin_datadir:/root/.lightning" - - "bitcoin_datadir:/etc/bitcoin" - - "nbxplorer_datadir:/root/.nbxplorer" - ports: - - "9735:9735" - links: - - nbxplorer - - bitcoind -volumes: - postgres_datadir: - btcpay_datadir: - nbxplorer_datadir: - bitcoin_datadir: - clightning_bitcoin_datadir: diff --git a/Production-NoReverseProxy/docker-compose.btc-ltc-clightning.yml b/Production-NoReverseProxy/docker-compose.btc-ltc-clightning.yml deleted file mode 100644 index 460e0a3..0000000 --- a/Production-NoReverseProxy/docker-compose.btc-ltc-clightning.yml +++ /dev/null @@ -1,159 +0,0 @@ -version: "3" -services: - btcpayserver: - restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.106 - expose: - - "49392" - environment: - BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} - BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} - BTCPAY_BIND: 0.0.0.0:49392 - BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ - BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} - BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} - BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - VIRTUAL_NETWORK: nginx-proxy - VIRTUAL_PORT: 49392 - VIRTUAL_HOST: ${BTCPAY_HOST} - SSL_POLICY: Mozilla-Modern - LETSENCRYPT_HOST: ${BTCPAY_HOST} - LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} - BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ - BTCPAY_CHAINS: "ltc,btc" - BTCPAY_LTCLIGHTNING: "type=clightning;server=unix://etc/clightning_litecoin/lightning-rpc" - BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ - BTCPAY_BTCLIGHTNING: "type=clightning;server=unix://etc/clightning_bitcoin/lightning-rpc" - links: - - nbxplorer - - postgres - - clightning_litecoin - - clightning_bitcoin - volumes: - - "btcpay_datadir:/datadir" - - "nbxplorer_datadir:/root/.nbxplorer" - - "clightning_litecoin_datadir:/etc/clightning_litecoin" - - "clightning_bitcoin_datadir:/etc/clightning_bitcoin" - ports: - - "80:49392" - nbxplorer: - restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 - expose: - - "32838" - environment: - NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} - NBXPLORER_BIND: 0.0.0.0:32838 - NBXPLORER_CHAINS: "ltc,btc" - NBXPLORER_LTCRPCURL: http://litecoind:43782/ - NBXPLORER_LTCNODEENDPOINT: litecoind:39388 - NBXPLORER_BTCRPCURL: http://bitcoind:43782/ - NBXPLORER_BTCNODEENDPOINT: bitcoind:39388 - volumes: - - "nbxplorer_datadir:/datadir" - - "litecoin_datadir:/root/.litecoin" - - "bitcoin_datadir:/root/.bitcoin" - links: - - litecoind - - bitcoind - postgres: - restart: unless-stopped - image: postgres:9.6.5 - volumes: - - "postgres_datadir:/var/lib/postgresql/data" - litecoind: - restart: unless-stopped - container_name: btcpayserver_litecoind - image: nicolasdorier/docker-litecoin:0.16.3 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - zmqpubrawblock=tcp://0.0.0.0:28332 - zmqpubrawtx=tcp://0.0.0.0:28333 - whitelist=0.0.0.0/0 - expose: - - "43782" - - "39388" - - "28332" - - "28333" - volumes: - - "litecoin_datadir:/data" - clightning_litecoin: - image: nicolasdorier/clightning:v0.6.1 - container_name: btcpayserver_clightning_litecoin - restart: unless-stopped - environment: - LIGHTNINGD_NETWORK: ${NBITCOIN_NETWORK:-regtest} - LIGHTNINGD_CHAIN: ltc - LIGHTNINGD_EXPLORERURL: "http://nbxplorer:32838/" - LIGHTNINGD_OPT: | - bitcoin-datadir=/etc/litecoin - bitcoin-rpcconnect=litecoind - bind-addr=0.0.0.0:9735 - announce-addr=${BTCPAY_HOST}:9736 - network=${NBITCOIN_NETWORK:-regtest} - alias=${LIGHTNING_ALIAS} - chain=ltc - volumes: - - "clightning_litecoin_datadir:/root/.lightning" - - "litecoin_datadir:/etc/litecoin" - - "nbxplorer_datadir:/root/.nbxplorer" - ports: - - "9736:9735" - links: - - nbxplorer - - litecoind - bitcoind: - restart: unless-stopped - container_name: btcpayserver_bitcoind - image: nicolasdorier/docker-bitcoin:0.16.3 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - whitelist=0.0.0.0/0 - zmqpubrawblock=tcp://0.0.0.0:28332 - zmqpubrawtx=tcp://0.0.0.0:28333 - expose: - - "43782" - - "39388" - - "28332" - - "28333" - volumes: - - "bitcoin_datadir:/data" - clightning_bitcoin: - image: nicolasdorier/clightning:v0.6.1 - container_name: btcpayserver_clightning_bitcoin - restart: unless-stopped - environment: - LIGHTNINGD_NETWORK: ${NBITCOIN_NETWORK:-regtest} - LIGHTNINGD_CHAIN: btc - LIGHTNINGD_EXPLORERURL: "http://nbxplorer:32838/" - LIGHTNINGD_OPT: | - bitcoin-datadir=/etc/bitcoin - bitcoin-rpcconnect=bitcoind - announce-addr=${BTCPAY_HOST}:9735 - bind-addr=0.0.0.0:9735 - network=${NBITCOIN_NETWORK:-regtest} - alias=${LIGHTNING_ALIAS} - chain=btc - volumes: - - "clightning_bitcoin_datadir:/root/.lightning" - - "bitcoin_datadir:/etc/bitcoin" - - "nbxplorer_datadir:/root/.nbxplorer" - ports: - - "9735:9735" - links: - - nbxplorer - - bitcoind -volumes: - postgres_datadir: - btcpay_datadir: - nbxplorer_datadir: - litecoin_datadir: - clightning_litecoin_datadir: - bitcoin_datadir: - clightning_bitcoin_datadir: diff --git a/Production-NoReverseProxy/docker-compose.btc-ltc.yml b/Production-NoReverseProxy/docker-compose.btc-ltc.yml deleted file mode 100644 index 3f43a3c..0000000 --- a/Production-NoReverseProxy/docker-compose.btc-ltc.yml +++ /dev/null @@ -1,101 +0,0 @@ -version: "3" -services: - btcpayserver: - restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.106 - expose: - - "49392" - environment: - BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} - BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} - BTCPAY_BIND: 0.0.0.0:49392 - BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ - BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} - BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} - BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - VIRTUAL_NETWORK: nginx-proxy - VIRTUAL_PORT: 49392 - VIRTUAL_HOST: ${BTCPAY_HOST} - SSL_POLICY: Mozilla-Modern - LETSENCRYPT_HOST: ${BTCPAY_HOST} - LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} - BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ - BTCPAY_CHAINS: "ltc,btc" - BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ - links: - - nbxplorer - - postgres - volumes: - - "btcpay_datadir:/datadir" - - "nbxplorer_datadir:/root/.nbxplorer" - ports: - - "80:49392" - nbxplorer: - restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 - expose: - - "32838" - environment: - NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} - NBXPLORER_BIND: 0.0.0.0:32838 - NBXPLORER_CHAINS: "ltc,btc" - NBXPLORER_LTCRPCURL: http://litecoind:43782/ - NBXPLORER_LTCNODEENDPOINT: litecoind:39388 - NBXPLORER_BTCRPCURL: http://bitcoind:43782/ - NBXPLORER_BTCNODEENDPOINT: bitcoind:39388 - volumes: - - "nbxplorer_datadir:/datadir" - - "litecoin_datadir:/root/.litecoin" - - "bitcoin_datadir:/root/.bitcoin" - links: - - litecoind - - bitcoind - postgres: - restart: unless-stopped - image: postgres:9.6.5 - volumes: - - "postgres_datadir:/var/lib/postgresql/data" - litecoind: - restart: unless-stopped - container_name: btcpayserver_litecoind - image: nicolasdorier/docker-litecoin:0.16.3 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - zmqpubrawblock=tcp://0.0.0.0:28332 - zmqpubrawtx=tcp://0.0.0.0:28333 - whitelist=0.0.0.0/0 - expose: - - "43782" - - "39388" - - "28332" - - "28333" - volumes: - - "litecoin_datadir:/data" - bitcoind: - restart: unless-stopped - container_name: btcpayserver_bitcoind - image: nicolasdorier/docker-bitcoin:0.16.3 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - whitelist=0.0.0.0/0 - zmqpubrawblock=tcp://0.0.0.0:28332 - zmqpubrawtx=tcp://0.0.0.0:28333 - expose: - - "43782" - - "39388" - - "28332" - - "28333" - volumes: - - "bitcoin_datadir:/data" -volumes: - postgres_datadir: - btcpay_datadir: - nbxplorer_datadir: - litecoin_datadir: - bitcoin_datadir: diff --git a/Production-NoReverseProxy/docker-compose.btc.yml b/Production-NoReverseProxy/docker-compose.btc.yml deleted file mode 100644 index 8df42f2..0000000 --- a/Production-NoReverseProxy/docker-compose.btc.yml +++ /dev/null @@ -1,76 +0,0 @@ -version: "3" -services: - btcpayserver: - restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.106 - expose: - - "49392" - environment: - BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} - BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} - BTCPAY_BIND: 0.0.0.0:49392 - BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ - BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} - BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} - BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - VIRTUAL_NETWORK: nginx-proxy - VIRTUAL_PORT: 49392 - VIRTUAL_HOST: ${BTCPAY_HOST} - SSL_POLICY: Mozilla-Modern - LETSENCRYPT_HOST: ${BTCPAY_HOST} - LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} - BTCPAY_CHAINS: "btc" - BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ - links: - - nbxplorer - - postgres - volumes: - - "btcpay_datadir:/datadir" - - "nbxplorer_datadir:/root/.nbxplorer" - ports: - - "80:49392" - nbxplorer: - restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 - expose: - - "32838" - environment: - NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} - NBXPLORER_BIND: 0.0.0.0:32838 - NBXPLORER_CHAINS: "btc" - NBXPLORER_BTCRPCURL: http://bitcoind:43782/ - NBXPLORER_BTCNODEENDPOINT: bitcoind:39388 - volumes: - - "nbxplorer_datadir:/datadir" - - "bitcoin_datadir:/root/.bitcoin" - links: - - bitcoind - postgres: - restart: unless-stopped - image: postgres:9.6.5 - volumes: - - "postgres_datadir:/var/lib/postgresql/data" - bitcoind: - restart: unless-stopped - container_name: btcpayserver_bitcoind - image: nicolasdorier/docker-bitcoin:0.16.3 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - whitelist=0.0.0.0/0 - zmqpubrawblock=tcp://0.0.0.0:28332 - zmqpubrawtx=tcp://0.0.0.0:28333 - expose: - - "43782" - - "39388" - - "28332" - - "28333" - volumes: - - "bitcoin_datadir:/data" -volumes: - postgres_datadir: - btcpay_datadir: - nbxplorer_datadir: - bitcoin_datadir: diff --git a/Production-NoReverseProxy/docker-compose.ltc-clightning.yml b/Production-NoReverseProxy/docker-compose.ltc-clightning.yml deleted file mode 100644 index e29675f..0000000 --- a/Production-NoReverseProxy/docker-compose.ltc-clightning.yml +++ /dev/null @@ -1,105 +0,0 @@ -version: "3" -services: - btcpayserver: - restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.106 - expose: - - "49392" - environment: - BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} - BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} - BTCPAY_BIND: 0.0.0.0:49392 - BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ - BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} - BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} - BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - VIRTUAL_NETWORK: nginx-proxy - VIRTUAL_PORT: 49392 - VIRTUAL_HOST: ${BTCPAY_HOST} - SSL_POLICY: Mozilla-Modern - LETSENCRYPT_HOST: ${BTCPAY_HOST} - LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} - BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ - BTCPAY_CHAINS: "ltc" - BTCPAY_LTCLIGHTNING: "type=clightning;server=unix://etc/clightning_litecoin/lightning-rpc" - links: - - nbxplorer - - postgres - - clightning_litecoin - volumes: - - "btcpay_datadir:/datadir" - - "nbxplorer_datadir:/root/.nbxplorer" - - "clightning_litecoin_datadir:/etc/clightning_litecoin" - ports: - - "80:49392" - nbxplorer: - restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 - expose: - - "32838" - environment: - NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} - NBXPLORER_BIND: 0.0.0.0:32838 - NBXPLORER_CHAINS: "ltc" - NBXPLORER_LTCRPCURL: http://litecoind:43782/ - NBXPLORER_LTCNODEENDPOINT: litecoind:39388 - volumes: - - "nbxplorer_datadir:/datadir" - - "litecoin_datadir:/root/.litecoin" - links: - - litecoind - postgres: - restart: unless-stopped - image: postgres:9.6.5 - volumes: - - "postgres_datadir:/var/lib/postgresql/data" - litecoind: - restart: unless-stopped - container_name: btcpayserver_litecoind - image: nicolasdorier/docker-litecoin:0.16.3 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - zmqpubrawblock=tcp://0.0.0.0:28332 - zmqpubrawtx=tcp://0.0.0.0:28333 - whitelist=0.0.0.0/0 - expose: - - "43782" - - "39388" - - "28332" - - "28333" - volumes: - - "litecoin_datadir:/data" - clightning_litecoin: - image: nicolasdorier/clightning:v0.6.1 - container_name: btcpayserver_clightning_litecoin - restart: unless-stopped - environment: - LIGHTNINGD_NETWORK: ${NBITCOIN_NETWORK:-regtest} - LIGHTNINGD_CHAIN: ltc - LIGHTNINGD_EXPLORERURL: "http://nbxplorer:32838/" - LIGHTNINGD_OPT: | - bitcoin-datadir=/etc/litecoin - bitcoin-rpcconnect=litecoind - bind-addr=0.0.0.0:9735 - announce-addr=${BTCPAY_HOST}:9736 - network=${NBITCOIN_NETWORK:-regtest} - alias=${LIGHTNING_ALIAS} - chain=ltc - volumes: - - "clightning_litecoin_datadir:/root/.lightning" - - "litecoin_datadir:/etc/litecoin" - - "nbxplorer_datadir:/root/.nbxplorer" - ports: - - "9736:9735" - links: - - nbxplorer - - litecoind -volumes: - postgres_datadir: - btcpay_datadir: - nbxplorer_datadir: - litecoin_datadir: - clightning_litecoin_datadir: diff --git a/Production-NoReverseProxy/docker-compose.ltc.yml b/Production-NoReverseProxy/docker-compose.ltc.yml deleted file mode 100644 index ff13738..0000000 --- a/Production-NoReverseProxy/docker-compose.ltc.yml +++ /dev/null @@ -1,76 +0,0 @@ -version: "3" -services: - btcpayserver: - restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.106 - expose: - - "49392" - environment: - BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} - BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} - BTCPAY_BIND: 0.0.0.0:49392 - BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ - BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} - BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} - BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - VIRTUAL_NETWORK: nginx-proxy - VIRTUAL_PORT: 49392 - VIRTUAL_HOST: ${BTCPAY_HOST} - SSL_POLICY: Mozilla-Modern - LETSENCRYPT_HOST: ${BTCPAY_HOST} - LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} - BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ - BTCPAY_CHAINS: "ltc" - links: - - nbxplorer - - postgres - volumes: - - "btcpay_datadir:/datadir" - - "nbxplorer_datadir:/root/.nbxplorer" - ports: - - "80:49392" - nbxplorer: - restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 - expose: - - "32838" - environment: - NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} - NBXPLORER_BIND: 0.0.0.0:32838 - NBXPLORER_CHAINS: "ltc" - NBXPLORER_LTCRPCURL: http://litecoind:43782/ - NBXPLORER_LTCNODEENDPOINT: litecoind:39388 - volumes: - - "nbxplorer_datadir:/datadir" - - "litecoin_datadir:/root/.litecoin" - links: - - litecoind - postgres: - restart: unless-stopped - image: postgres:9.6.5 - volumes: - - "postgres_datadir:/var/lib/postgresql/data" - litecoind: - restart: unless-stopped - container_name: btcpayserver_litecoind - image: nicolasdorier/docker-litecoin:0.16.3 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - zmqpubrawblock=tcp://0.0.0.0:28332 - zmqpubrawtx=tcp://0.0.0.0:28333 - whitelist=0.0.0.0/0 - expose: - - "43782" - - "39388" - - "28332" - - "28333" - volumes: - - "litecoin_datadir:/data" -volumes: - postgres_datadir: - btcpay_datadir: - nbxplorer_datadir: - litecoin_datadir: diff --git a/Production/README.md b/Production/README.md index 5f4868a..02a94bb 100644 --- a/Production/README.md +++ b/Production/README.md @@ -1,19 +1,7 @@ -# About those docker-compose +# How to use docker-compose with NGinx -All `docker-compose` files in [Production](Production) and [Production-NoReverseProxy](Production-NoReverseProxy) are generated by running the [build-pregen.sh](build-pregen.sh) (or [build-pregen.ps1](build-pregen.ps1)) script from the fragments located in [docker-compose-generator/docker-fragments](docker-compose-generator/docker-fragments). - -The pre-generated `docker-compose` files only cover `btc`, `ltc`, `clightning` with `nginx`. - ---- - -We strongly advise you to not use the pre-generated docker-compose of this folder, they are deprecated and kept only for backward compatibility. -Instead use the [build.sh](../build.sh) as documented in (README)(../Readme.md) to generate a docker-compose which fit your needs. - ---- - -The `docker-compose` can be used for production purpose. - -It is composed of: +NGinx acts as a reverse proxy, and take care of renewing HTTPS certificates for you. +BTCPay Server deployment using NGinx are typically composed of: 1. One full node per supported cryptocurrency (bitcoind/litecoind) 2. A lightweight block explorer ([NBxplorer](https://github.com/dgarage/NBXplorer)) diff --git a/Production/docker-compose.btc-clightning.yml b/Production/docker-compose.btc-clightning.yml deleted file mode 100644 index 55d4bf5..0000000 --- a/Production/docker-compose.btc-clightning.yml +++ /dev/null @@ -1,151 +0,0 @@ -version: "3" -services: - nginx: - restart: unless-stopped - image: nginx:stable - container_name: nginx - ports: - - "80:80" - - "443:443" - volumes: - - "nginx_conf:/etc/nginx/conf.d" - - "nginx_vhost:/etc/nginx/vhost.d" - - "nginx_html:/usr/share/nginx/html" - - "nginx_certs:/etc/nginx/certs:ro" - links: - - btcpayserver - nginx-gen: - restart: unless-stopped - image: jwilder/docker-gen - container_name: nginx-gen - volumes: - - "/var/run/docker.sock:/tmp/docker.sock:ro" - - "./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro" - - "nginx_conf:/etc/nginx/conf.d" - - "nginx_vhost:/etc/nginx/vhost.d" - - "nginx_html:/usr/share/nginx/html" - - "nginx_certs:/etc/nginx/certs:ro" - entrypoint: /usr/local/bin/docker-gen -notify-sighup nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf - links: - - nginx - letsencrypt-nginx-proxy-companion: - restart: unless-stopped - image: jrcs/letsencrypt-nginx-proxy-companion - container_name: letsencrypt-nginx-proxy-companion - volumes: - - "/var/run/docker.sock:/var/run/docker.sock:ro" - - "nginx_conf:/etc/nginx/conf.d" - - "nginx_vhost:/etc/nginx/vhost.d" - - "nginx_html:/usr/share/nginx/html" - - "nginx_certs:/etc/nginx/certs:rw" - environment: - NGINX_DOCKER_GEN_CONTAINER: "nginx-gen" - NGINX_PROXY_CONTAINER: "nginx" - ACME_CA_URI: ${ACME_CA_URI:-https://acme-staging.api.letsencrypt.org/directory} - links: - - nginx-gen - btcpayserver: - restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.106 - expose: - - "49392" - environment: - BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} - BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} - BTCPAY_BIND: 0.0.0.0:49392 - BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ - BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} - BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} - BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - VIRTUAL_NETWORK: nginx-proxy - VIRTUAL_PORT: 49392 - VIRTUAL_HOST: ${BTCPAY_HOST} - SSL_POLICY: Mozilla-Modern - LETSENCRYPT_HOST: ${BTCPAY_HOST} - LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} - BTCPAY_CHAINS: "btc" - BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ - BTCPAY_BTCLIGHTNING: "type=clightning;server=unix://etc/clightning_bitcoin/lightning-rpc" - links: - - nbxplorer - - postgres - - clightning_bitcoin - volumes: - - "btcpay_datadir:/datadir" - - "nbxplorer_datadir:/root/.nbxplorer" - - "clightning_bitcoin_datadir:/etc/clightning_bitcoin" - nbxplorer: - restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 - expose: - - "32838" - environment: - NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} - NBXPLORER_BIND: 0.0.0.0:32838 - NBXPLORER_CHAINS: "btc" - NBXPLORER_BTCRPCURL: http://bitcoind:43782/ - NBXPLORER_BTCNODEENDPOINT: bitcoind:39388 - volumes: - - "nbxplorer_datadir:/datadir" - - "bitcoin_datadir:/root/.bitcoin" - links: - - bitcoind - postgres: - restart: unless-stopped - image: postgres:9.6.5 - volumes: - - "postgres_datadir:/var/lib/postgresql/data" - bitcoind: - restart: unless-stopped - container_name: btcpayserver_bitcoind - image: nicolasdorier/docker-bitcoin:0.16.3 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - whitelist=0.0.0.0/0 - zmqpubrawblock=tcp://0.0.0.0:28332 - zmqpubrawtx=tcp://0.0.0.0:28333 - expose: - - "43782" - - "39388" - - "28332" - - "28333" - volumes: - - "bitcoin_datadir:/data" - clightning_bitcoin: - image: nicolasdorier/clightning:v0.6.1 - container_name: btcpayserver_clightning_bitcoin - restart: unless-stopped - environment: - LIGHTNINGD_NETWORK: ${NBITCOIN_NETWORK:-regtest} - LIGHTNINGD_CHAIN: btc - LIGHTNINGD_EXPLORERURL: "http://nbxplorer:32838/" - LIGHTNINGD_OPT: | - bitcoin-datadir=/etc/bitcoin - bitcoin-rpcconnect=bitcoind - announce-addr=${BTCPAY_HOST}:9735 - bind-addr=0.0.0.0:9735 - network=${NBITCOIN_NETWORK:-regtest} - alias=${LIGHTNING_ALIAS} - chain=btc - volumes: - - "clightning_bitcoin_datadir:/root/.lightning" - - "bitcoin_datadir:/etc/bitcoin" - - "nbxplorer_datadir:/root/.nbxplorer" - ports: - - "9735:9735" - links: - - nbxplorer - - bitcoind -volumes: - nginx_conf: - nginx_vhost: - nginx_html: - nginx_certs: - postgres_datadir: - btcpay_datadir: - nbxplorer_datadir: - bitcoin_datadir: - clightning_bitcoin_datadir: diff --git a/Production/docker-compose.btc-ltc-clightning.yml b/Production/docker-compose.btc-ltc-clightning.yml deleted file mode 100644 index 3f594d6..0000000 --- a/Production/docker-compose.btc-ltc-clightning.yml +++ /dev/null @@ -1,205 +0,0 @@ -version: "3" -services: - nginx: - restart: unless-stopped - image: nginx:stable - container_name: nginx - ports: - - "80:80" - - "443:443" - volumes: - - "nginx_conf:/etc/nginx/conf.d" - - "nginx_vhost:/etc/nginx/vhost.d" - - "nginx_html:/usr/share/nginx/html" - - "nginx_certs:/etc/nginx/certs:ro" - links: - - btcpayserver - nginx-gen: - restart: unless-stopped - image: jwilder/docker-gen - container_name: nginx-gen - volumes: - - "/var/run/docker.sock:/tmp/docker.sock:ro" - - "./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro" - - "nginx_conf:/etc/nginx/conf.d" - - "nginx_vhost:/etc/nginx/vhost.d" - - "nginx_html:/usr/share/nginx/html" - - "nginx_certs:/etc/nginx/certs:ro" - entrypoint: /usr/local/bin/docker-gen -notify-sighup nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf - links: - - nginx - letsencrypt-nginx-proxy-companion: - restart: unless-stopped - image: jrcs/letsencrypt-nginx-proxy-companion - container_name: letsencrypt-nginx-proxy-companion - volumes: - - "/var/run/docker.sock:/var/run/docker.sock:ro" - - "nginx_conf:/etc/nginx/conf.d" - - "nginx_vhost:/etc/nginx/vhost.d" - - "nginx_html:/usr/share/nginx/html" - - "nginx_certs:/etc/nginx/certs:rw" - environment: - NGINX_DOCKER_GEN_CONTAINER: "nginx-gen" - NGINX_PROXY_CONTAINER: "nginx" - ACME_CA_URI: ${ACME_CA_URI:-https://acme-staging.api.letsencrypt.org/directory} - links: - - nginx-gen - btcpayserver: - restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.106 - expose: - - "49392" - environment: - BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} - BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} - BTCPAY_BIND: 0.0.0.0:49392 - BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ - BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} - BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} - BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - VIRTUAL_NETWORK: nginx-proxy - VIRTUAL_PORT: 49392 - VIRTUAL_HOST: ${BTCPAY_HOST} - SSL_POLICY: Mozilla-Modern - LETSENCRYPT_HOST: ${BTCPAY_HOST} - LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} - BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ - BTCPAY_CHAINS: "ltc,btc" - BTCPAY_LTCLIGHTNING: "type=clightning;server=unix://etc/clightning_litecoin/lightning-rpc" - BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ - BTCPAY_BTCLIGHTNING: "type=clightning;server=unix://etc/clightning_bitcoin/lightning-rpc" - links: - - nbxplorer - - postgres - - clightning_litecoin - - clightning_bitcoin - volumes: - - "btcpay_datadir:/datadir" - - "nbxplorer_datadir:/root/.nbxplorer" - - "clightning_litecoin_datadir:/etc/clightning_litecoin" - - "clightning_bitcoin_datadir:/etc/clightning_bitcoin" - nbxplorer: - restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 - expose: - - "32838" - environment: - NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} - NBXPLORER_BIND: 0.0.0.0:32838 - NBXPLORER_CHAINS: "ltc,btc" - NBXPLORER_LTCRPCURL: http://litecoind:43782/ - NBXPLORER_LTCNODEENDPOINT: litecoind:39388 - NBXPLORER_BTCRPCURL: http://bitcoind:43782/ - NBXPLORER_BTCNODEENDPOINT: bitcoind:39388 - volumes: - - "nbxplorer_datadir:/datadir" - - "litecoin_datadir:/root/.litecoin" - - "bitcoin_datadir:/root/.bitcoin" - links: - - litecoind - - bitcoind - postgres: - restart: unless-stopped - image: postgres:9.6.5 - volumes: - - "postgres_datadir:/var/lib/postgresql/data" - litecoind: - restart: unless-stopped - container_name: btcpayserver_litecoind - image: nicolasdorier/docker-litecoin:0.16.3 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - zmqpubrawblock=tcp://0.0.0.0:28332 - zmqpubrawtx=tcp://0.0.0.0:28333 - whitelist=0.0.0.0/0 - expose: - - "43782" - - "39388" - - "28332" - - "28333" - volumes: - - "litecoin_datadir:/data" - clightning_litecoin: - image: nicolasdorier/clightning:v0.6.1 - container_name: btcpayserver_clightning_litecoin - restart: unless-stopped - environment: - LIGHTNINGD_NETWORK: ${NBITCOIN_NETWORK:-regtest} - LIGHTNINGD_CHAIN: ltc - LIGHTNINGD_EXPLORERURL: "http://nbxplorer:32838/" - LIGHTNINGD_OPT: | - bitcoin-datadir=/etc/litecoin - bitcoin-rpcconnect=litecoind - bind-addr=0.0.0.0:9735 - announce-addr=${BTCPAY_HOST}:9736 - network=${NBITCOIN_NETWORK:-regtest} - alias=${LIGHTNING_ALIAS} - chain=ltc - volumes: - - "clightning_litecoin_datadir:/root/.lightning" - - "litecoin_datadir:/etc/litecoin" - - "nbxplorer_datadir:/root/.nbxplorer" - ports: - - "9736:9735" - links: - - nbxplorer - - litecoind - bitcoind: - restart: unless-stopped - container_name: btcpayserver_bitcoind - image: nicolasdorier/docker-bitcoin:0.16.3 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - whitelist=0.0.0.0/0 - zmqpubrawblock=tcp://0.0.0.0:28332 - zmqpubrawtx=tcp://0.0.0.0:28333 - expose: - - "43782" - - "39388" - - "28332" - - "28333" - volumes: - - "bitcoin_datadir:/data" - clightning_bitcoin: - image: nicolasdorier/clightning:v0.6.1 - container_name: btcpayserver_clightning_bitcoin - restart: unless-stopped - environment: - LIGHTNINGD_NETWORK: ${NBITCOIN_NETWORK:-regtest} - LIGHTNINGD_CHAIN: btc - LIGHTNINGD_EXPLORERURL: "http://nbxplorer:32838/" - LIGHTNINGD_OPT: | - bitcoin-datadir=/etc/bitcoin - bitcoin-rpcconnect=bitcoind - announce-addr=${BTCPAY_HOST}:9735 - bind-addr=0.0.0.0:9735 - network=${NBITCOIN_NETWORK:-regtest} - alias=${LIGHTNING_ALIAS} - chain=btc - volumes: - - "clightning_bitcoin_datadir:/root/.lightning" - - "bitcoin_datadir:/etc/bitcoin" - - "nbxplorer_datadir:/root/.nbxplorer" - ports: - - "9735:9735" - links: - - nbxplorer - - bitcoind -volumes: - nginx_conf: - nginx_vhost: - nginx_html: - nginx_certs: - postgres_datadir: - btcpay_datadir: - nbxplorer_datadir: - litecoin_datadir: - clightning_litecoin_datadir: - bitcoin_datadir: - clightning_bitcoin_datadir: diff --git a/Production/docker-compose.btc-ltc.yml b/Production/docker-compose.btc-ltc.yml deleted file mode 100644 index 2452d91..0000000 --- a/Production/docker-compose.btc-ltc.yml +++ /dev/null @@ -1,147 +0,0 @@ -version: "3" -services: - nginx: - restart: unless-stopped - image: nginx:stable - container_name: nginx - ports: - - "80:80" - - "443:443" - volumes: - - "nginx_conf:/etc/nginx/conf.d" - - "nginx_vhost:/etc/nginx/vhost.d" - - "nginx_html:/usr/share/nginx/html" - - "nginx_certs:/etc/nginx/certs:ro" - links: - - btcpayserver - nginx-gen: - restart: unless-stopped - image: jwilder/docker-gen - container_name: nginx-gen - volumes: - - "/var/run/docker.sock:/tmp/docker.sock:ro" - - "./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro" - - "nginx_conf:/etc/nginx/conf.d" - - "nginx_vhost:/etc/nginx/vhost.d" - - "nginx_html:/usr/share/nginx/html" - - "nginx_certs:/etc/nginx/certs:ro" - entrypoint: /usr/local/bin/docker-gen -notify-sighup nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf - links: - - nginx - letsencrypt-nginx-proxy-companion: - restart: unless-stopped - image: jrcs/letsencrypt-nginx-proxy-companion - container_name: letsencrypt-nginx-proxy-companion - volumes: - - "/var/run/docker.sock:/var/run/docker.sock:ro" - - "nginx_conf:/etc/nginx/conf.d" - - "nginx_vhost:/etc/nginx/vhost.d" - - "nginx_html:/usr/share/nginx/html" - - "nginx_certs:/etc/nginx/certs:rw" - environment: - NGINX_DOCKER_GEN_CONTAINER: "nginx-gen" - NGINX_PROXY_CONTAINER: "nginx" - ACME_CA_URI: ${ACME_CA_URI:-https://acme-staging.api.letsencrypt.org/directory} - links: - - nginx-gen - btcpayserver: - restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.106 - expose: - - "49392" - environment: - BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} - BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} - BTCPAY_BIND: 0.0.0.0:49392 - BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ - BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} - BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} - BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - VIRTUAL_NETWORK: nginx-proxy - VIRTUAL_PORT: 49392 - VIRTUAL_HOST: ${BTCPAY_HOST} - SSL_POLICY: Mozilla-Modern - LETSENCRYPT_HOST: ${BTCPAY_HOST} - LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} - BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ - BTCPAY_CHAINS: "ltc,btc" - BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ - links: - - nbxplorer - - postgres - volumes: - - "btcpay_datadir:/datadir" - - "nbxplorer_datadir:/root/.nbxplorer" - nbxplorer: - restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 - expose: - - "32838" - environment: - NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} - NBXPLORER_BIND: 0.0.0.0:32838 - NBXPLORER_CHAINS: "ltc,btc" - NBXPLORER_LTCRPCURL: http://litecoind:43782/ - NBXPLORER_LTCNODEENDPOINT: litecoind:39388 - NBXPLORER_BTCRPCURL: http://bitcoind:43782/ - NBXPLORER_BTCNODEENDPOINT: bitcoind:39388 - volumes: - - "nbxplorer_datadir:/datadir" - - "litecoin_datadir:/root/.litecoin" - - "bitcoin_datadir:/root/.bitcoin" - links: - - litecoind - - bitcoind - postgres: - restart: unless-stopped - image: postgres:9.6.5 - volumes: - - "postgres_datadir:/var/lib/postgresql/data" - litecoind: - restart: unless-stopped - container_name: btcpayserver_litecoind - image: nicolasdorier/docker-litecoin:0.16.3 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - zmqpubrawblock=tcp://0.0.0.0:28332 - zmqpubrawtx=tcp://0.0.0.0:28333 - whitelist=0.0.0.0/0 - expose: - - "43782" - - "39388" - - "28332" - - "28333" - volumes: - - "litecoin_datadir:/data" - bitcoind: - restart: unless-stopped - container_name: btcpayserver_bitcoind - image: nicolasdorier/docker-bitcoin:0.16.3 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - whitelist=0.0.0.0/0 - zmqpubrawblock=tcp://0.0.0.0:28332 - zmqpubrawtx=tcp://0.0.0.0:28333 - expose: - - "43782" - - "39388" - - "28332" - - "28333" - volumes: - - "bitcoin_datadir:/data" -volumes: - nginx_conf: - nginx_vhost: - nginx_html: - nginx_certs: - postgres_datadir: - btcpay_datadir: - nbxplorer_datadir: - litecoin_datadir: - bitcoin_datadir: diff --git a/Production/docker-compose.btc.yml b/Production/docker-compose.btc.yml deleted file mode 100644 index 3d569ac..0000000 --- a/Production/docker-compose.btc.yml +++ /dev/null @@ -1,122 +0,0 @@ -version: "3" -services: - nginx: - restart: unless-stopped - image: nginx:stable - container_name: nginx - ports: - - "80:80" - - "443:443" - volumes: - - "nginx_conf:/etc/nginx/conf.d" - - "nginx_vhost:/etc/nginx/vhost.d" - - "nginx_html:/usr/share/nginx/html" - - "nginx_certs:/etc/nginx/certs:ro" - links: - - btcpayserver - nginx-gen: - restart: unless-stopped - image: jwilder/docker-gen - container_name: nginx-gen - volumes: - - "/var/run/docker.sock:/tmp/docker.sock:ro" - - "./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro" - - "nginx_conf:/etc/nginx/conf.d" - - "nginx_vhost:/etc/nginx/vhost.d" - - "nginx_html:/usr/share/nginx/html" - - "nginx_certs:/etc/nginx/certs:ro" - entrypoint: /usr/local/bin/docker-gen -notify-sighup nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf - links: - - nginx - letsencrypt-nginx-proxy-companion: - restart: unless-stopped - image: jrcs/letsencrypt-nginx-proxy-companion - container_name: letsencrypt-nginx-proxy-companion - volumes: - - "/var/run/docker.sock:/var/run/docker.sock:ro" - - "nginx_conf:/etc/nginx/conf.d" - - "nginx_vhost:/etc/nginx/vhost.d" - - "nginx_html:/usr/share/nginx/html" - - "nginx_certs:/etc/nginx/certs:rw" - environment: - NGINX_DOCKER_GEN_CONTAINER: "nginx-gen" - NGINX_PROXY_CONTAINER: "nginx" - ACME_CA_URI: ${ACME_CA_URI:-https://acme-staging.api.letsencrypt.org/directory} - links: - - nginx-gen - btcpayserver: - restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.106 - expose: - - "49392" - environment: - BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} - BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} - BTCPAY_BIND: 0.0.0.0:49392 - BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ - BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} - BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} - BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - VIRTUAL_NETWORK: nginx-proxy - VIRTUAL_PORT: 49392 - VIRTUAL_HOST: ${BTCPAY_HOST} - SSL_POLICY: Mozilla-Modern - LETSENCRYPT_HOST: ${BTCPAY_HOST} - LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} - BTCPAY_CHAINS: "btc" - BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ - links: - - nbxplorer - - postgres - volumes: - - "btcpay_datadir:/datadir" - - "nbxplorer_datadir:/root/.nbxplorer" - nbxplorer: - restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 - expose: - - "32838" - environment: - NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} - NBXPLORER_BIND: 0.0.0.0:32838 - NBXPLORER_CHAINS: "btc" - NBXPLORER_BTCRPCURL: http://bitcoind:43782/ - NBXPLORER_BTCNODEENDPOINT: bitcoind:39388 - volumes: - - "nbxplorer_datadir:/datadir" - - "bitcoin_datadir:/root/.bitcoin" - links: - - bitcoind - postgres: - restart: unless-stopped - image: postgres:9.6.5 - volumes: - - "postgres_datadir:/var/lib/postgresql/data" - bitcoind: - restart: unless-stopped - container_name: btcpayserver_bitcoind - image: nicolasdorier/docker-bitcoin:0.16.3 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - whitelist=0.0.0.0/0 - zmqpubrawblock=tcp://0.0.0.0:28332 - zmqpubrawtx=tcp://0.0.0.0:28333 - expose: - - "43782" - - "39388" - - "28332" - - "28333" - volumes: - - "bitcoin_datadir:/data" -volumes: - nginx_conf: - nginx_vhost: - nginx_html: - nginx_certs: - postgres_datadir: - btcpay_datadir: - nbxplorer_datadir: - bitcoin_datadir: diff --git a/Production/docker-compose.ltc-clightning.yml b/Production/docker-compose.ltc-clightning.yml deleted file mode 100644 index 157b1be..0000000 --- a/Production/docker-compose.ltc-clightning.yml +++ /dev/null @@ -1,151 +0,0 @@ -version: "3" -services: - nginx: - restart: unless-stopped - image: nginx:stable - container_name: nginx - ports: - - "80:80" - - "443:443" - volumes: - - "nginx_conf:/etc/nginx/conf.d" - - "nginx_vhost:/etc/nginx/vhost.d" - - "nginx_html:/usr/share/nginx/html" - - "nginx_certs:/etc/nginx/certs:ro" - links: - - btcpayserver - nginx-gen: - restart: unless-stopped - image: jwilder/docker-gen - container_name: nginx-gen - volumes: - - "/var/run/docker.sock:/tmp/docker.sock:ro" - - "./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro" - - "nginx_conf:/etc/nginx/conf.d" - - "nginx_vhost:/etc/nginx/vhost.d" - - "nginx_html:/usr/share/nginx/html" - - "nginx_certs:/etc/nginx/certs:ro" - entrypoint: /usr/local/bin/docker-gen -notify-sighup nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf - links: - - nginx - letsencrypt-nginx-proxy-companion: - restart: unless-stopped - image: jrcs/letsencrypt-nginx-proxy-companion - container_name: letsencrypt-nginx-proxy-companion - volumes: - - "/var/run/docker.sock:/var/run/docker.sock:ro" - - "nginx_conf:/etc/nginx/conf.d" - - "nginx_vhost:/etc/nginx/vhost.d" - - "nginx_html:/usr/share/nginx/html" - - "nginx_certs:/etc/nginx/certs:rw" - environment: - NGINX_DOCKER_GEN_CONTAINER: "nginx-gen" - NGINX_PROXY_CONTAINER: "nginx" - ACME_CA_URI: ${ACME_CA_URI:-https://acme-staging.api.letsencrypt.org/directory} - links: - - nginx-gen - btcpayserver: - restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.106 - expose: - - "49392" - environment: - BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} - BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} - BTCPAY_BIND: 0.0.0.0:49392 - BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ - BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} - BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} - BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - VIRTUAL_NETWORK: nginx-proxy - VIRTUAL_PORT: 49392 - VIRTUAL_HOST: ${BTCPAY_HOST} - SSL_POLICY: Mozilla-Modern - LETSENCRYPT_HOST: ${BTCPAY_HOST} - LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} - BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ - BTCPAY_CHAINS: "ltc" - BTCPAY_LTCLIGHTNING: "type=clightning;server=unix://etc/clightning_litecoin/lightning-rpc" - links: - - nbxplorer - - postgres - - clightning_litecoin - volumes: - - "btcpay_datadir:/datadir" - - "nbxplorer_datadir:/root/.nbxplorer" - - "clightning_litecoin_datadir:/etc/clightning_litecoin" - nbxplorer: - restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 - expose: - - "32838" - environment: - NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} - NBXPLORER_BIND: 0.0.0.0:32838 - NBXPLORER_CHAINS: "ltc" - NBXPLORER_LTCRPCURL: http://litecoind:43782/ - NBXPLORER_LTCNODEENDPOINT: litecoind:39388 - volumes: - - "nbxplorer_datadir:/datadir" - - "litecoin_datadir:/root/.litecoin" - links: - - litecoind - postgres: - restart: unless-stopped - image: postgres:9.6.5 - volumes: - - "postgres_datadir:/var/lib/postgresql/data" - litecoind: - restart: unless-stopped - container_name: btcpayserver_litecoind - image: nicolasdorier/docker-litecoin:0.16.3 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - zmqpubrawblock=tcp://0.0.0.0:28332 - zmqpubrawtx=tcp://0.0.0.0:28333 - whitelist=0.0.0.0/0 - expose: - - "43782" - - "39388" - - "28332" - - "28333" - volumes: - - "litecoin_datadir:/data" - clightning_litecoin: - image: nicolasdorier/clightning:v0.6.1 - container_name: btcpayserver_clightning_litecoin - restart: unless-stopped - environment: - LIGHTNINGD_NETWORK: ${NBITCOIN_NETWORK:-regtest} - LIGHTNINGD_CHAIN: ltc - LIGHTNINGD_EXPLORERURL: "http://nbxplorer:32838/" - LIGHTNINGD_OPT: | - bitcoin-datadir=/etc/litecoin - bitcoin-rpcconnect=litecoind - bind-addr=0.0.0.0:9735 - announce-addr=${BTCPAY_HOST}:9736 - network=${NBITCOIN_NETWORK:-regtest} - alias=${LIGHTNING_ALIAS} - chain=ltc - volumes: - - "clightning_litecoin_datadir:/root/.lightning" - - "litecoin_datadir:/etc/litecoin" - - "nbxplorer_datadir:/root/.nbxplorer" - ports: - - "9736:9735" - links: - - nbxplorer - - litecoind -volumes: - nginx_conf: - nginx_vhost: - nginx_html: - nginx_certs: - postgres_datadir: - btcpay_datadir: - nbxplorer_datadir: - litecoin_datadir: - clightning_litecoin_datadir: diff --git a/Production/docker-compose.ltc.yml b/Production/docker-compose.ltc.yml deleted file mode 100644 index 060e9d3..0000000 --- a/Production/docker-compose.ltc.yml +++ /dev/null @@ -1,122 +0,0 @@ -version: "3" -services: - nginx: - restart: unless-stopped - image: nginx:stable - container_name: nginx - ports: - - "80:80" - - "443:443" - volumes: - - "nginx_conf:/etc/nginx/conf.d" - - "nginx_vhost:/etc/nginx/vhost.d" - - "nginx_html:/usr/share/nginx/html" - - "nginx_certs:/etc/nginx/certs:ro" - links: - - btcpayserver - nginx-gen: - restart: unless-stopped - image: jwilder/docker-gen - container_name: nginx-gen - volumes: - - "/var/run/docker.sock:/tmp/docker.sock:ro" - - "./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro" - - "nginx_conf:/etc/nginx/conf.d" - - "nginx_vhost:/etc/nginx/vhost.d" - - "nginx_html:/usr/share/nginx/html" - - "nginx_certs:/etc/nginx/certs:ro" - entrypoint: /usr/local/bin/docker-gen -notify-sighup nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf - links: - - nginx - letsencrypt-nginx-proxy-companion: - restart: unless-stopped - image: jrcs/letsencrypt-nginx-proxy-companion - container_name: letsencrypt-nginx-proxy-companion - volumes: - - "/var/run/docker.sock:/var/run/docker.sock:ro" - - "nginx_conf:/etc/nginx/conf.d" - - "nginx_vhost:/etc/nginx/vhost.d" - - "nginx_html:/usr/share/nginx/html" - - "nginx_certs:/etc/nginx/certs:rw" - environment: - NGINX_DOCKER_GEN_CONTAINER: "nginx-gen" - NGINX_PROXY_CONTAINER: "nginx" - ACME_CA_URI: ${ACME_CA_URI:-https://acme-staging.api.letsencrypt.org/directory} - links: - - nginx-gen - btcpayserver: - restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.106 - expose: - - "49392" - environment: - BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} - BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} - BTCPAY_BIND: 0.0.0.0:49392 - BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ - BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} - BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} - BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - VIRTUAL_NETWORK: nginx-proxy - VIRTUAL_PORT: 49392 - VIRTUAL_HOST: ${BTCPAY_HOST} - SSL_POLICY: Mozilla-Modern - LETSENCRYPT_HOST: ${BTCPAY_HOST} - LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} - BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ - BTCPAY_CHAINS: "ltc" - links: - - nbxplorer - - postgres - volumes: - - "btcpay_datadir:/datadir" - - "nbxplorer_datadir:/root/.nbxplorer" - nbxplorer: - restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 - expose: - - "32838" - environment: - NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} - NBXPLORER_BIND: 0.0.0.0:32838 - NBXPLORER_CHAINS: "ltc" - NBXPLORER_LTCRPCURL: http://litecoind:43782/ - NBXPLORER_LTCNODEENDPOINT: litecoind:39388 - volumes: - - "nbxplorer_datadir:/datadir" - - "litecoin_datadir:/root/.litecoin" - links: - - litecoind - postgres: - restart: unless-stopped - image: postgres:9.6.5 - volumes: - - "postgres_datadir:/var/lib/postgresql/data" - litecoind: - restart: unless-stopped - container_name: btcpayserver_litecoind - image: nicolasdorier/docker-litecoin:0.16.3 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - zmqpubrawblock=tcp://0.0.0.0:28332 - zmqpubrawtx=tcp://0.0.0.0:28333 - whitelist=0.0.0.0/0 - expose: - - "43782" - - "39388" - - "28332" - - "28333" - volumes: - - "litecoin_datadir:/data" -volumes: - nginx_conf: - nginx_vhost: - nginx_html: - nginx_certs: - postgres_datadir: - btcpay_datadir: - nbxplorer_datadir: - litecoin_datadir: diff --git a/README.md b/README.md index 277e5a1..9dcc178 100644 --- a/README.md +++ b/README.md @@ -306,9 +306,12 @@ Yes, run the following commands to update: ```bash sudo su - -btcpay-update.sh cd $DOWNLOAD_ROOT/btcpayserver-docker +git checkout 9acb5d8067cb5c46f59858137feb699b41ac9f19 +btcpay-update.sh . ./btcpay-setup.sh -i +git checkout master +btcpay-update.sh exit ``` diff --git a/btcpay-setup.sh b/btcpay-setup.sh index 79fd939..21a1edc 100755 --- a/btcpay-setup.sh +++ b/btcpay-setup.sh @@ -71,53 +71,8 @@ fi ######### Migration: old pregen environment to new environment ############ if [ ! -z $BTCPAY_DOCKER_COMPOSE ] && [ ! -z $DOWNLOAD_ROOT ] && [ -z $BTCPAYGEN_OLD_PREGEN ]; then - echo "Old pregen docker deployment detected. Migrating..." - rm "$DOWNLOAD_ROOT/btcpay-restart.sh" - rm "$DOWNLOAD_ROOT/btcpay-update.sh" - rm "$DOWNLOAD_ROOT/changedomain.sh" - rm "$DOWNLOAD_ROOT/entrypoint.sh" - DOWNLOAD_ROOT="" - BTCPAYGEN_OLD_PREGEN="true" - # Migration: old deployment store those in BTCPAY_ENV_FILE - BTCPAY_HOST=$(cat $BTCPAY_ENV_FILE | sed -n 's/^BTCPAY_HOST=\(.*\)$/\1/p') - ACME_CA_URI=$(cat $BTCPAY_ENV_FILE | sed -n 's/^ACME_CA_URI=\(.*\)$/\1/p') - NBITCOIN_NETWORK=$(cat $BTCPAY_ENV_FILE | sed -n 's/^NBITCOIN_NETWORK=\(.*\)$/\1/p') - LETSENCRYPT_EMAIL=$(cat $BTCPAY_ENV_FILE | sed -n 's/^LETSENCRYPT_EMAIL=\(.*\)$/\1/p') - LIGHTNING_ALIAS=$(cat $BTCPAY_ENV_FILE | sed -n 's/^LIGHTNING_ALIAS=\(.*\)$/\1/p') - - if [[ $(dirname $BTCPAY_DOCKER_COMPOSE) == *Production ]]; then - BTCPAYGEN_REVERSEPROXY='nginx' - fi - if [[ $(dirname $BTCPAY_DOCKER_COMPOSE) == *Production-NoReverseProxy ]]; then - BTCPAYGEN_REVERSEPROXY='none' - fi - - if [[ $BTCPAY_DOCKER_COMPOSE == *docker-compose.btc.yml ]]; then - BTCPAYGEN_CRYPTO1='btc' - BTCPAYGEN_LIGHTNING='none' - fi - if [[ $BTCPAY_DOCKER_COMPOSE == *docker-compose.btc-clightning.yml ]]; then - BTCPAYGEN_CRYPTO1='btc' - BTCPAYGEN_LIGHTNING='clightning' - fi - if [[ $BTCPAY_DOCKER_COMPOSE == *docker-compose.ltc.yml ]]; then - BTCPAYGEN_CRYPTO1='ltc' - BTCPAYGEN_LIGHTNING='none' - fi - if [[ $BTCPAY_DOCKER_COMPOSE == *docker-compose.ltc-clightning.yml ]]; then - BTCPAYGEN_CRYPTO1='ltc' - BTCPAYGEN_LIGHTNING='clightning' - fi - if [[ $BTCPAY_DOCKER_COMPOSE == *docker-compose.btc-ltc.yml ]]; then - BTCPAYGEN_CRYPTO1='btc' - BTCPAYGEN_CRYPTO2='ltc' - BTCPAYGEN_LIGHTNING='none' - fi - if [[ $BTCPAY_DOCKER_COMPOSE == *docker-compose.btc-ltc-clightning.yml ]]; then - BTCPAYGEN_CRYPTO1='btc' - BTCPAYGEN_CRYPTO2='ltc' - BTCPAYGEN_LIGHTNING='clightning' - fi + echo "Your deployment is too old, you need to migrate by following instructions on this link https://github.com/btcpayserver/btcpayserver-docker/tree/master#i-deployed-before-btcpay-setupsh-existed-before-may-17-can-i-migrate-to-this-new-system" + return fi ######################################################### diff --git a/btcpay-update.sh b/btcpay-update.sh index 5b6819b..327ab25 100755 --- a/btcpay-update.sh +++ b/btcpay-update.sh @@ -4,6 +4,11 @@ set -e . /etc/profile.d/btcpay-env.sh +if [ ! -z $BTCPAY_DOCKER_COMPOSE ] && [ ! -z $DOWNLOAD_ROOT ] && [ -z $BTCPAYGEN_OLD_PREGEN ]; then + echo "Your deployment is too old, you need to migrate by following instructions on this link https://github.com/btcpayserver/btcpayserver-docker/tree/master#i-deployed-before-btcpay-setupsh-existed-before-may-17-can-i-migrate-to-this-new-system" + exit +fi + cd "$BTCPAY_BASE_DIRECTORY/btcpayserver-docker" git pull --force diff --git a/build-pregen.ps1 b/build-pregen.ps1 deleted file mode 100755 index b8faf78..0000000 --- a/build-pregen.ps1 +++ /dev/null @@ -1,7 +0,0 @@ -# This script will run docker-compose-generator in a container to generate the yml files - -docker pull btcpayserver/docker-compose-generator -docker run -v "$(Get-Location)\Production:/app/Production" ` - -v "$(Get-Location)\Production-NoReverseProxy:/app/Production-NoReverseProxy" ` - -v "$(Get-Location)\docker-compose-generator\docker-fragments:/app/docker-fragments" ` - --rm btcpayserver/docker-compose-generator pregen \ No newline at end of file diff --git a/build-pregen.sh b/build-pregen.sh deleted file mode 100755 index 27fe54c..0000000 --- a/build-pregen.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -# This script will run docker-compose-generator in a container to generate the yml files -docker pull btcpayserver/docker-compose-generator -docker run -v "$(pwd)/Production:/app/Production" \ - -v "$(pwd)/Production-NoReverseProxy:/app/Production-NoReverseProxy" \ - -v "$(pwd)/docker-compose-generator/docker-fragments:/app/docker-fragments" \ - --rm btcpayserver/docker-compose-generator pregen diff --git a/docker-compose-generator/src/Program.cs b/docker-compose-generator/src/Program.cs index 9d0d293..f47f7a9 100644 --- a/docker-compose-generator/src/Program.cs +++ b/docker-compose-generator/src/Program.cs @@ -14,50 +14,15 @@ namespace DockerGenerator var root = Environment.GetEnvironmentVariable("INSIDE_CONTAINER") == "1" ? FindRoot("app") : Path.GetFullPath(Path.Combine(FindRoot("docker-compose-generator"), "..")); - if(args.Any(a => a == "pregen")) - { - var productionLocation = Path.GetFullPath(Path.Combine(root, "Production")); - var testLocation = Path.GetFullPath(Path.Combine(root, "Production-NoReverseProxy")); - - foreach(var proxy in new[] { "nginx", "no-reverseproxy" }) - { - foreach(var lightning in new[] { "clightning", "" }) - { - foreach(var btc in new[] { "btc", "" }) - { - foreach(var ltc in new[] { "ltc", "" }) - { - if(btc == "" && ltc == "") - continue; - string name = $"{btc}-{ltc}-{lightning}".Replace("--", "-"); - if(name.EndsWith("-")) - name = name.Substring(0, name.Length - 1); - if(name.StartsWith("-")) - name = name.Substring(1, name.Length - 1); - var composition = new DockerComposition(); - composition.SelectedCryptos = new HashSet(); - composition.SelectedCryptos.Add(btc); - composition.SelectedCryptos.Add(ltc); - composition.SelectedLN = lightning; - composition.SelectedProxy = proxy; - new Program().Run(composition, name, proxy == "nginx" ? productionLocation : testLocation); - } - } - } - } - } - else - { - var composition = DockerComposition.FromEnvironmentVariables(); - Console.WriteLine("Crypto: " + string.Join(", ", composition.SelectedCryptos.ToArray())); - Console.WriteLine("Lightning: " + composition.SelectedLN); - Console.WriteLine("ReverseProxy: " + composition.SelectedProxy); - var generatedLocation = Path.GetFullPath(Path.Combine(root, "Generated")); + var composition = DockerComposition.FromEnvironmentVariables(); + Console.WriteLine("Crypto: " + string.Join(", ", composition.SelectedCryptos.ToArray())); + Console.WriteLine("Lightning: " + composition.SelectedLN); + Console.WriteLine("ReverseProxy: " + composition.SelectedProxy); + var generatedLocation = Path.GetFullPath(Path.Combine(root, "Generated")); - var name = Environment.GetEnvironmentVariable("BTCPAYGEN_SUBNAME"); - name = string.IsNullOrEmpty(name) ? "generated" : name; - new Program().Run(composition, name, generatedLocation); - } + var name = Environment.GetEnvironmentVariable("BTCPAYGEN_SUBNAME"); + name = string.IsNullOrEmpty(name) ? "generated" : name; + new Program().Run(composition, name, generatedLocation); } private void Run(DockerComposition composition, string name, string output) @@ -67,7 +32,7 @@ namespace DockerGenerator fragmentLocation = Path.GetFullPath(Path.Combine(fragmentLocation, "docker-fragments")); var fragments = new List(); - if(composition.SelectedProxy == "nginx") + if (composition.SelectedProxy == "nginx") { fragments.Add("nginx"); } @@ -76,26 +41,26 @@ namespace DockerGenerator fragments.Add("btcpayserver-noreverseproxy"); } fragments.Add("btcpayserver"); - foreach(var crypto in CryptoDefinition.GetDefinitions()) + foreach (var crypto in CryptoDefinition.GetDefinitions()) { - if(!composition.SelectedCryptos.Contains(crypto.Crypto)) + if (!composition.SelectedCryptos.Contains(crypto.Crypto)) continue; fragments.Add(crypto.CryptoFragment); - if(composition.SelectedLN == "clightning" && crypto.CLightningFragment != null) + if (composition.SelectedLN == "clightning" && crypto.CLightningFragment != null) { fragments.Add(crypto.CLightningFragment); } - if(composition.SelectedLN == "lnd" && crypto.LNDFragment != null) - { - fragments.Add(crypto.LNDFragment); - } - } + if (composition.SelectedLN == "lnd" && crypto.LNDFragment != null) + { + fragments.Add(crypto.LNDFragment); + } + } - foreach(var fragment in composition.AdditionalFragments) - { - fragments.Add(fragment.Trim()); - } + foreach (var fragment in composition.AdditionalFragments) + { + fragments.Add(fragment.Trim()); + } var def = new DockerComposeDefinition(name, fragments); def.FragmentLocation = fragmentLocation; @@ -107,11 +72,11 @@ namespace DockerGenerator { string directory = Directory.GetCurrentDirectory(); int i = 0; - while(true) + while (true) { - if(i > 10) + if (i > 10) throw new DirectoryNotFoundException(rootDirectory); - if(directory.EndsWith(rootDirectory)) + if (directory.EndsWith(rootDirectory)) return directory; directory = Path.GetFullPath(Path.Combine(directory, "..")); i++; From a756f91c1c22e4e3d3d912ed9e4326d5e682f2cb Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sat, 29 Sep 2018 18:03:09 +0200 Subject: [PATCH 30/85] pr changes --- build.ps1 | 6 +++--- build.sh | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build.ps1 b/build.ps1 index 3c4da33..0303c5f 100755 --- a/build.ps1 +++ b/build.ps1 @@ -1,10 +1,10 @@ # This script will run docker-compose-generator in a container to generate the yml files If (-not ($BTCPAYGEN_DOCKER_IMAGE)) { $BTCPAYGEN_DOCKER_IMAGE = "btcpayserver/docker-compose-generator" } -If($BTCPAYGEN_DOCKER_IMAGE -eq "build"){ - docker build docker-compose-generator --tag build +If($BTCPAYGEN_DOCKER_IMAGE -eq "btcpayserver/docker-compose-generator:local"){ + docker build docker-compose-generator --tag $BTCPAYGEN_DOCKER_IMAGE } Else { - docker pull $BTCPAYGEN_DOCKER_IMAGE: + docker pull $BTCPAYGEN_DOCKER_IMAGE } docker run -v "$(Get-Location)\Generated:/app/Generated" ` diff --git a/build.sh b/build.sh index 2820aaa..b0d1b24 100755 --- a/build.sh +++ b/build.sh @@ -1,8 +1,8 @@ #!/bin/bash -if [ "$BTCPAYGEN_DOCKER_IMAGE" == "build" ] +if [ "$BTCPAYGEN_DOCKER_IMAGE" == "btcpayserver/docker-compose-generator:local" ] then - docker build docker-compose-generator --tag build + docker build docker-compose-generator --tag $BTCPAYGEN_DOCKER_IMAGE else docker pull ${BTCPAYGEN_DOCKER_IMAGE:-"btcpayserver/docker-compose-generator"} fi From dbce1bd8751f6499c400c3882e6d511c07b53571 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 30 Sep 2018 09:59:37 +0200 Subject: [PATCH 31/85] update readme --- README.md | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 9dcc178..ac93170 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,7 @@ You can read [the article](https://medium.com/@BtcpayServer/hosting-btcpay-serve * `ACME_CA_URI`: The API endpoint to ask for HTTPS certificate (Default: `https://acme-v01.api.letsencrypt.org/directory`) * `BTCPAY_HOST_SSHKEYFILE`: Optional, SSH private key that BTCPay can use to connect to this VM's SSH server. This key will be copied to BTCPay's data directory * `BTCPAY_SSHTRUSTEDFINGERPRINTS`: Optional, BTCPay will ensure that it is connecting to the expected SSH server by checking the host's public key against these fingerprints +* `BTCPAYGEN_DOCKER_IMAGE`: Optional, Specify which generator image to use if you have customized the C# generator. Set to `btcpayserver/docker-compose-generator:local` to build the generator locally at runtime. # Tooling @@ -270,20 +271,9 @@ BTCPAY_SSHKEYFILE=/datadir/id_rsa 1. Add support for your crypto to [NBitcoin](https://github.com/MetacoSA/NBitcoin/tree/master/NBitcoin.Altcoins), [NBxplorer](https://github.com/dgarage/NBXplorer), and [BTCPayServer](https://github.com/btcpayserver/btcpayserver). (Use examples from other coins) 2. Create your own docker image ([Example for BTC](https://hub.docker.com/r/nicolasdorier/docker-bitcoin/)) 3. Create a docker-compose fragment ([Example for BTC](docker-compose-generator/docker-fragments/bitcoin.yml)) -4. Add your CryptoDefinition ([Example for BTC](docker-compose-generator/src/CryptoDefinition.cs)) - -When testing your coin, **DO NOT USE `build.sh`**, since it uses a pre-built docker image. - -Instead, install [.NET Core 2.1 SDK](https://www.microsoft.com/net/download/windows) and run: - -```bash -BTCPAYGEN_CRYPTO1="EXAMPLE-COIN" -BTCPAYGEN_SUBNAME="test" -cd docker-compose-generator/src -dotnet run -``` - -This will generate your docker-compose in the `Generated` folder, which you can then run and test. +4. Add your coin to CryptoDefinition ([Example for BTC](docker-compose-generator/src/CryptoDefinition.cs)) +5. Tell the setup script to build the docker compose generator image locally by specifying the environment variable `BTCPAYGEN_DOCKER_IMAGE` to `btcpayserver/docker-compose-generator:local` +6. Configure the BtcPay environment variables as usual and run [build.sh](build.sh) (or [build.ps1](build.ps1)) to generate the docker compose script under `Generated` Note that BTCPayServer developers will not spend excessive time testing your image, so make sure it works. From 8d2fe8e8b9bbad6a818cd0e7b4d0c7cef6bf3c90 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 30 Sep 2018 10:14:58 +0200 Subject: [PATCH 32/85] remove Pregen ymls and renamed production-traefik fodler --- .../docker-compose.btc-clightning.yml | 117 ------------ .../docker-compose.btc-ltc-clightning.yml | 167 ------------------ Production-Traefik/docker-compose.btc-ltc.yml | 109 ------------ Production-Traefik/docker-compose.btc.yml | 88 --------- .../docker-compose.ltc-clightning.yml | 117 ------------ Production-Traefik/docker-compose.ltc.yml | 88 --------- Production/traefik.toml | 35 ---- .../Production.png | Bin {Production-Traefik => Traefik}/README.md | 0 {Production-Traefik => Traefik}/traefik.toml | 0 build.ps1 | 2 +- build.sh | 2 +- 12 files changed, 2 insertions(+), 723 deletions(-) delete mode 100644 Production-Traefik/docker-compose.btc-clightning.yml delete mode 100644 Production-Traefik/docker-compose.btc-ltc-clightning.yml delete mode 100644 Production-Traefik/docker-compose.btc-ltc.yml delete mode 100644 Production-Traefik/docker-compose.btc.yml delete mode 100644 Production-Traefik/docker-compose.ltc-clightning.yml delete mode 100644 Production-Traefik/docker-compose.ltc.yml delete mode 100644 Production/traefik.toml rename {Production-Traefik => Traefik}/Production.png (100%) rename {Production-Traefik => Traefik}/README.md (100%) rename {Production-Traefik => Traefik}/traefik.toml (100%) diff --git a/Production-Traefik/docker-compose.btc-clightning.yml b/Production-Traefik/docker-compose.btc-clightning.yml deleted file mode 100644 index b06b74b..0000000 --- a/Production-Traefik/docker-compose.btc-clightning.yml +++ /dev/null @@ -1,117 +0,0 @@ -version: "3" -services: - traefik: - restart: unless-stopped - image: traefik - container_name: traefik - ports: - - "80:80" - - "443:443" - volumes: - - "/var/run/docker.sock:/var/run/docker.sock" - - "./traefik.toml:/traefik.toml" - - "./acme.json:/acme.json:ro" - - "./servers.toml:/servers.toml" - - "./traefik_logs:/traefik_logs" - links: - - btcpayserver - btcpayserver: - restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.103 - expose: - - "49392" - environment: - BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} - BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} - BTCPAY_BIND: 0.0.0.0:49392 - BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ - BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} - BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} - BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - BTCPAY_CHAINS: "btc" - BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ - BTCPAY_BTCLIGHTNING: "type=clightning;server=unix://etc/clightning_bitcoin/lightning-rpc" - links: - - nbxplorer - - postgres - - clightning_bitcoin - volumes: - - "btcpay_datadir:/datadir" - - "nbxplorer_datadir:/root/.nbxplorer" - - "clightning_bitcoin_datadir:/etc/clightning_bitcoin" - labels: - - "traefik.backend=btcpayserver" - - "traefik.backend.loadbalancer.sticky=true" - - "traefik.enable=true" - - "traefik.frontend.rule=Host:${BTCPAY_HOST}" - - "traefik.port.rule=49392" - - "traefik.acme.domains=${BTCPAY_HOST},www.${BTCPAY_HOST}" - - "traefik.acme.email=${LETSENCRYPT_EMAIL}" - nbxplorer: - restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 - expose: - - "32838" - environment: - NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} - NBXPLORER_BIND: 0.0.0.0:32838 - NBXPLORER_CHAINS: "btc" - NBXPLORER_BTCRPCURL: http://bitcoind:43782/ - NBXPLORER_BTCNODEENDPOINT: bitcoind:39388 - volumes: - - "nbxplorer_datadir:/datadir" - - "bitcoin_datadir:/root/.bitcoin" - links: - - bitcoind - postgres: - restart: unless-stopped - image: postgres:9.6.5 - volumes: - - "postgres_datadir:/var/lib/postgresql/data" - bitcoind: - restart: unless-stopped - container_name: btcpayserver_bitcoind - image: nicolasdorier/docker-bitcoin:0.16.0 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - whitelist=0.0.0.0/0 - expose: - - "43782" - - "39388" - volumes: - - "bitcoin_datadir:/data" - clightning_bitcoin: - image: nicolasdorier/clightning:634f19a7b230edc686be56ab950b80784e56252c - container_name: btcpayserver_clightning_bitcoin - restart: unless-stopped - environment: - LIGHTNINGD_NETWORK: ${NBITCOIN_NETWORK:-regtest} - LIGHTNINGD_CHAIN: btc - LIGHTNINGD_EXPLORERURL: "http://nbxplorer:32838/" - LIGHTNINGD_OPT: | - bitcoin-datadir=/etc/bitcoin - bitcoin-rpcconnect=bitcoind - announce-addr=${BTCPAY_HOST}:9735 - bind-addr=0.0.0.0:9735 - network=${NBITCOIN_NETWORK:-regtest} - alias=${LIGHTNING_ALIAS} - chain=btc - volumes: - - "clightning_bitcoin_datadir:/root/.lightning" - - "bitcoin_datadir:/etc/bitcoin" - - "nbxplorer_datadir:/root/.nbxplorer" - ports: - - "9735:9735" - links: - - nbxplorer - - bitcoind -volumes: - traefik_logs: - btcpay_datadir: - nbxplorer_datadir: - postgres_datadir: - bitcoin_datadir: - clightning_bitcoin_datadir: diff --git a/Production-Traefik/docker-compose.btc-ltc-clightning.yml b/Production-Traefik/docker-compose.btc-ltc-clightning.yml deleted file mode 100644 index e4fd4a9..0000000 --- a/Production-Traefik/docker-compose.btc-ltc-clightning.yml +++ /dev/null @@ -1,167 +0,0 @@ -version: "3" -services: - traefik: - restart: unless-stopped - image: traefik - container_name: traefik - ports: - - "80:80" - - "443:443" - volumes: - - "/var/run/docker.sock:/var/run/docker.sock" - - "./traefik.toml:/traefik.toml" - - "./acme.json:/acme.json:ro" - - "./servers.toml:/servers.toml" - - "./traefik_logs:/traefik_logs" - links: - - btcpayserver - btcpayserver: - restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.103 - expose: - - "49392" - environment: - BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} - BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} - BTCPAY_BIND: 0.0.0.0:49392 - BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ - BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} - BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} - BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ - BTCPAY_CHAINS: "ltc,btc" - BTCPAY_LTCLIGHTNING: "type=clightning;server=unix://etc/clightning_litecoin/lightning-rpc" - BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ - BTCPAY_BTCLIGHTNING: "type=clightning;server=unix://etc/clightning_bitcoin/lightning-rpc" - links: - - nbxplorer - - postgres - - clightning_litecoin - - clightning_bitcoin - volumes: - - "btcpay_datadir:/datadir" - - "nbxplorer_datadir:/root/.nbxplorer" - - "clightning_litecoin_datadir:/etc/clightning_litecoin" - - "clightning_bitcoin_datadir:/etc/clightning_bitcoin" - labels: - - "traefik.backend=btcpayserver" - - "traefik.backend.loadbalancer.sticky=true" - - "traefik.enable=true" - - "traefik.frontend.rule=Host:${BTCPAY_HOST}" - - "traefik.port.rule=49392" - - "traefik.acme.domains=${BTCPAY_HOST},www.${BTCPAY_HOST}" - - "traefik.acme.email=${LETSENCRYPT_EMAIL}" - nbxplorer: - restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 - expose: - - "32838" - environment: - NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} - NBXPLORER_BIND: 0.0.0.0:32838 - NBXPLORER_CHAINS: "ltc,btc" - NBXPLORER_LTCRPCURL: http://litecoind:43782/ - NBXPLORER_LTCNODEENDPOINT: litecoind:39388 - NBXPLORER_BTCRPCURL: http://bitcoind:43782/ - NBXPLORER_BTCNODEENDPOINT: bitcoind:39388 - volumes: - - "nbxplorer_datadir:/datadir" - - "litecoin_datadir:/root/.litecoin" - - "bitcoin_datadir:/root/.bitcoin" - links: - - litecoind - - bitcoind - postgres: - restart: unless-stopped - image: postgres:9.6.5 - volumes: - - "postgres_datadir:/var/lib/postgresql/data" - litecoind: - restart: unless-stopped - container_name: btcpayserver_litecoind - image: nicolasdorier/docker-litecoin:0.15.1 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - whitelist=0.0.0.0/0 - expose: - - "43782" - - "39388" - volumes: - - "litecoin_datadir:/data" - clightning_litecoin: - image: nicolasdorier/clightning:634f19a7b230edc686be56ab950b80784e56252c - container_name: btcpayserver_clightning_litecoin - restart: unless-stopped - environment: - LIGHTNINGD_NETWORK: ${NBITCOIN_NETWORK:-regtest} - LIGHTNINGD_CHAIN: ltc - LIGHTNINGD_EXPLORERURL: "http://nbxplorer:32838/" - LIGHTNINGD_OPT: | - bitcoin-datadir=/etc/litecoin - bitcoin-rpcconnect=litecoind - bind-addr=0.0.0.0:9735 - announce-addr=${BTCPAY_HOST}:9736 - network=${NBITCOIN_NETWORK:-regtest} - alias=${LIGHTNING_ALIAS} - chain=ltc - volumes: - - "clightning_litecoin_datadir:/root/.lightning" - - "litecoin_datadir:/etc/litecoin" - - "nbxplorer_datadir:/root/.nbxplorer" - ports: - - "9736:9735" - links: - - nbxplorer - - litecoind - bitcoind: - restart: unless-stopped - container_name: btcpayserver_bitcoind - image: nicolasdorier/docker-bitcoin:0.16.0 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - whitelist=0.0.0.0/0 - expose: - - "43782" - - "39388" - volumes: - - "bitcoin_datadir:/data" - clightning_bitcoin: - image: nicolasdorier/clightning:634f19a7b230edc686be56ab950b80784e56252c - container_name: btcpayserver_clightning_bitcoin - restart: unless-stopped - environment: - LIGHTNINGD_NETWORK: ${NBITCOIN_NETWORK:-regtest} - LIGHTNINGD_CHAIN: btc - LIGHTNINGD_EXPLORERURL: "http://nbxplorer:32838/" - LIGHTNINGD_OPT: | - bitcoin-datadir=/etc/bitcoin - bitcoin-rpcconnect=bitcoind - announce-addr=${BTCPAY_HOST}:9735 - bind-addr=0.0.0.0:9735 - network=${NBITCOIN_NETWORK:-regtest} - alias=${LIGHTNING_ALIAS} - chain=btc - volumes: - - "clightning_bitcoin_datadir:/root/.lightning" - - "bitcoin_datadir:/etc/bitcoin" - - "nbxplorer_datadir:/root/.nbxplorer" - ports: - - "9735:9735" - links: - - nbxplorer - - bitcoind -volumes: - traefik_logs: - btcpay_datadir: - nbxplorer_datadir: - postgres_datadir: - litecoin_datadir: - clightning_litecoin_datadir: - bitcoin_datadir: - clightning_bitcoin_datadir: diff --git a/Production-Traefik/docker-compose.btc-ltc.yml b/Production-Traefik/docker-compose.btc-ltc.yml deleted file mode 100644 index fb86e58..0000000 --- a/Production-Traefik/docker-compose.btc-ltc.yml +++ /dev/null @@ -1,109 +0,0 @@ -version: "3" -services: - traefik: - restart: unless-stopped - image: traefik - container_name: traefik - ports: - - "80:80" - - "443:443" - volumes: - - "/var/run/docker.sock:/var/run/docker.sock" - - "./traefik.toml:/traefik.toml" - - "./acme.json:/acme.json:ro" - - "./servers.toml:/servers.toml" - - "./traefik_logs:/traefik_logs" - links: - - btcpayserver - btcpayserver: - restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.103 - expose: - - "49392" - environment: - BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} - BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} - BTCPAY_BIND: 0.0.0.0:49392 - BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ - BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} - BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} - BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ - BTCPAY_CHAINS: "ltc,btc" - BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ - links: - - nbxplorer - - postgres - volumes: - - "btcpay_datadir:/datadir" - - "nbxplorer_datadir:/root/.nbxplorer" - labels: - - "traefik.backend=btcpayserver" - - "traefik.backend.loadbalancer.sticky=true" - - "traefik.enable=true" - - "traefik.frontend.rule=Host:${BTCPAY_HOST}" - - "traefik.port.rule=49392" - - "traefik.acme.domains=${BTCPAY_HOST},www.${BTCPAY_HOST}" - - "traefik.acme.email=${LETSENCRYPT_EMAIL}" - nbxplorer: - restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 - expose: - - "32838" - environment: - NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} - NBXPLORER_BIND: 0.0.0.0:32838 - NBXPLORER_CHAINS: "ltc,btc" - NBXPLORER_LTCRPCURL: http://litecoind:43782/ - NBXPLORER_LTCNODEENDPOINT: litecoind:39388 - NBXPLORER_BTCRPCURL: http://bitcoind:43782/ - NBXPLORER_BTCNODEENDPOINT: bitcoind:39388 - volumes: - - "nbxplorer_datadir:/datadir" - - "litecoin_datadir:/root/.litecoin" - - "bitcoin_datadir:/root/.bitcoin" - links: - - litecoind - - bitcoind - postgres: - restart: unless-stopped - image: postgres:9.6.5 - volumes: - - "postgres_datadir:/var/lib/postgresql/data" - litecoind: - restart: unless-stopped - container_name: btcpayserver_litecoind - image: nicolasdorier/docker-litecoin:0.15.1 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - whitelist=0.0.0.0/0 - expose: - - "43782" - - "39388" - volumes: - - "litecoin_datadir:/data" - bitcoind: - restart: unless-stopped - container_name: btcpayserver_bitcoind - image: nicolasdorier/docker-bitcoin:0.16.0 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - whitelist=0.0.0.0/0 - expose: - - "43782" - - "39388" - volumes: - - "bitcoin_datadir:/data" -volumes: - traefik_logs: - btcpay_datadir: - nbxplorer_datadir: - postgres_datadir: - litecoin_datadir: - bitcoin_datadir: diff --git a/Production-Traefik/docker-compose.btc.yml b/Production-Traefik/docker-compose.btc.yml deleted file mode 100644 index 06289c5..0000000 --- a/Production-Traefik/docker-compose.btc.yml +++ /dev/null @@ -1,88 +0,0 @@ -version: "3" -services: - traefik: - restart: unless-stopped - image: traefik - container_name: traefik - ports: - - "80:80" - - "443:443" - volumes: - - "/var/run/docker.sock:/var/run/docker.sock" - - "./traefik.toml:/traefik.toml" - - "./acme.json:/acme.json:ro" - - "./servers.toml:/servers.toml" - - "./traefik_logs:/traefik_logs" - links: - - btcpayserver - btcpayserver: - restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.103 - expose: - - "49392" - environment: - BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} - BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} - BTCPAY_BIND: 0.0.0.0:49392 - BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ - BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} - BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} - BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - BTCPAY_CHAINS: "btc" - BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ - links: - - nbxplorer - - postgres - volumes: - - "btcpay_datadir:/datadir" - - "nbxplorer_datadir:/root/.nbxplorer" - labels: - - "traefik.backend=btcpayserver" - - "traefik.backend.loadbalancer.sticky=true" - - "traefik.enable=true" - - "traefik.frontend.rule=Host:${BTCPAY_HOST}" - - "traefik.port.rule=49392" - - "traefik.acme.domains=${BTCPAY_HOST},www.${BTCPAY_HOST}" - - "traefik.acme.email=${LETSENCRYPT_EMAIL}" - nbxplorer: - restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 - expose: - - "32838" - environment: - NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} - NBXPLORER_BIND: 0.0.0.0:32838 - NBXPLORER_CHAINS: "btc" - NBXPLORER_BTCRPCURL: http://bitcoind:43782/ - NBXPLORER_BTCNODEENDPOINT: bitcoind:39388 - volumes: - - "nbxplorer_datadir:/datadir" - - "bitcoin_datadir:/root/.bitcoin" - links: - - bitcoind - postgres: - restart: unless-stopped - image: postgres:9.6.5 - volumes: - - "postgres_datadir:/var/lib/postgresql/data" - bitcoind: - restart: unless-stopped - container_name: btcpayserver_bitcoind - image: nicolasdorier/docker-bitcoin:0.16.0 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - whitelist=0.0.0.0/0 - expose: - - "43782" - - "39388" - volumes: - - "bitcoin_datadir:/data" -volumes: - traefik_logs: - btcpay_datadir: - nbxplorer_datadir: - postgres_datadir: - bitcoin_datadir: diff --git a/Production-Traefik/docker-compose.ltc-clightning.yml b/Production-Traefik/docker-compose.ltc-clightning.yml deleted file mode 100644 index e1b6aa7..0000000 --- a/Production-Traefik/docker-compose.ltc-clightning.yml +++ /dev/null @@ -1,117 +0,0 @@ -version: "3" -services: - traefik: - restart: unless-stopped - image: traefik - container_name: traefik - ports: - - "80:80" - - "443:443" - volumes: - - "/var/run/docker.sock:/var/run/docker.sock" - - "./traefik.toml:/traefik.toml" - - "./acme.json:/acme.json:ro" - - "./servers.toml:/servers.toml" - - "./traefik_logs:/traefik_logs" - links: - - btcpayserver - btcpayserver: - restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.103 - expose: - - "49392" - environment: - BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} - BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} - BTCPAY_BIND: 0.0.0.0:49392 - BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ - BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} - BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} - BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ - BTCPAY_CHAINS: "ltc" - BTCPAY_LTCLIGHTNING: "type=clightning;server=unix://etc/clightning_litecoin/lightning-rpc" - links: - - nbxplorer - - postgres - - clightning_litecoin - volumes: - - "btcpay_datadir:/datadir" - - "nbxplorer_datadir:/root/.nbxplorer" - - "clightning_litecoin_datadir:/etc/clightning_litecoin" - labels: - - "traefik.backend=btcpayserver" - - "traefik.backend.loadbalancer.sticky=true" - - "traefik.enable=true" - - "traefik.frontend.rule=Host:${BTCPAY_HOST}" - - "traefik.port.rule=49392" - - "traefik.acme.domains=${BTCPAY_HOST},www.${BTCPAY_HOST}" - - "traefik.acme.email=${LETSENCRYPT_EMAIL}" - nbxplorer: - restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 - expose: - - "32838" - environment: - NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} - NBXPLORER_BIND: 0.0.0.0:32838 - NBXPLORER_CHAINS: "ltc" - NBXPLORER_LTCRPCURL: http://litecoind:43782/ - NBXPLORER_LTCNODEENDPOINT: litecoind:39388 - volumes: - - "nbxplorer_datadir:/datadir" - - "litecoin_datadir:/root/.litecoin" - links: - - litecoind - postgres: - restart: unless-stopped - image: postgres:9.6.5 - volumes: - - "postgres_datadir:/var/lib/postgresql/data" - litecoind: - restart: unless-stopped - container_name: btcpayserver_litecoind - image: nicolasdorier/docker-litecoin:0.15.1 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - whitelist=0.0.0.0/0 - expose: - - "43782" - - "39388" - volumes: - - "litecoin_datadir:/data" - clightning_litecoin: - image: nicolasdorier/clightning:634f19a7b230edc686be56ab950b80784e56252c - container_name: btcpayserver_clightning_litecoin - restart: unless-stopped - environment: - LIGHTNINGD_NETWORK: ${NBITCOIN_NETWORK:-regtest} - LIGHTNINGD_CHAIN: ltc - LIGHTNINGD_EXPLORERURL: "http://nbxplorer:32838/" - LIGHTNINGD_OPT: | - bitcoin-datadir=/etc/litecoin - bitcoin-rpcconnect=litecoind - bind-addr=0.0.0.0:9735 - announce-addr=${BTCPAY_HOST}:9736 - network=${NBITCOIN_NETWORK:-regtest} - alias=${LIGHTNING_ALIAS} - chain=ltc - volumes: - - "clightning_litecoin_datadir:/root/.lightning" - - "litecoin_datadir:/etc/litecoin" - - "nbxplorer_datadir:/root/.nbxplorer" - ports: - - "9736:9735" - links: - - nbxplorer - - litecoind -volumes: - traefik_logs: - btcpay_datadir: - nbxplorer_datadir: - postgres_datadir: - litecoin_datadir: - clightning_litecoin_datadir: diff --git a/Production-Traefik/docker-compose.ltc.yml b/Production-Traefik/docker-compose.ltc.yml deleted file mode 100644 index 0cd5b87..0000000 --- a/Production-Traefik/docker-compose.ltc.yml +++ /dev/null @@ -1,88 +0,0 @@ -version: "3" -services: - traefik: - restart: unless-stopped - image: traefik - container_name: traefik - ports: - - "80:80" - - "443:443" - volumes: - - "/var/run/docker.sock:/var/run/docker.sock" - - "./traefik.toml:/traefik.toml" - - "./acme.json:/acme.json:ro" - - "./servers.toml:/servers.toml" - - "./traefik_logs:/traefik_logs" - links: - - btcpayserver - btcpayserver: - restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.103 - expose: - - "49392" - environment: - BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} - BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} - BTCPAY_BIND: 0.0.0.0:49392 - BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ - BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} - BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} - BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ - BTCPAY_CHAINS: "ltc" - links: - - nbxplorer - - postgres - volumes: - - "btcpay_datadir:/datadir" - - "nbxplorer_datadir:/root/.nbxplorer" - labels: - - "traefik.backend=btcpayserver" - - "traefik.backend.loadbalancer.sticky=true" - - "traefik.enable=true" - - "traefik.frontend.rule=Host:${BTCPAY_HOST}" - - "traefik.port.rule=49392" - - "traefik.acme.domains=${BTCPAY_HOST},www.${BTCPAY_HOST}" - - "traefik.acme.email=${LETSENCRYPT_EMAIL}" - nbxplorer: - restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 - expose: - - "32838" - environment: - NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} - NBXPLORER_BIND: 0.0.0.0:32838 - NBXPLORER_CHAINS: "ltc" - NBXPLORER_LTCRPCURL: http://litecoind:43782/ - NBXPLORER_LTCNODEENDPOINT: litecoind:39388 - volumes: - - "nbxplorer_datadir:/datadir" - - "litecoin_datadir:/root/.litecoin" - links: - - litecoind - postgres: - restart: unless-stopped - image: postgres:9.6.5 - volumes: - - "postgres_datadir:/var/lib/postgresql/data" - litecoind: - restart: unless-stopped - container_name: btcpayserver_litecoind - image: nicolasdorier/docker-litecoin:0.15.1 - environment: - BITCOIN_EXTRA_ARGS: | - rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 - port=39388 - whitelist=0.0.0.0/0 - expose: - - "43782" - - "39388" - volumes: - - "litecoin_datadir:/data" -volumes: - traefik_logs: - btcpay_datadir: - nbxplorer_datadir: - postgres_datadir: - litecoin_datadir: diff --git a/Production/traefik.toml b/Production/traefik.toml deleted file mode 100644 index e54e954..0000000 --- a/Production/traefik.toml +++ /dev/null @@ -1,35 +0,0 @@ -defaultEntryPoints = ["https","http"] - -logLevel = "ERROR" - -[entryPoints] - useXForwardedFor = true - [entryPoints.http] - address = ":80" - [entryPoints.http.redirect] - entryPoint = "https" - [entryPoints.https] - address = ":443" - [entryPoints.https.tls] - -[retry] - -[docker] -endpoint = "unix:///var/run/docker.sock" -watch = true -exposedByDefault = false - -[acme] -storage = "acme.json" -entryPoint = "https" -onHostRule = true -[acme.httpChallenge] -entryPoint = "http" - -[traefikLog] - filePath = "/traefik_logs/traefik.log" - format = "json" - -[accessLog] - filePath = "/traefik_logs/access.log" - format = "json" diff --git a/Production-Traefik/Production.png b/Traefik/Production.png similarity index 100% rename from Production-Traefik/Production.png rename to Traefik/Production.png diff --git a/Production-Traefik/README.md b/Traefik/README.md similarity index 100% rename from Production-Traefik/README.md rename to Traefik/README.md diff --git a/Production-Traefik/traefik.toml b/Traefik/traefik.toml similarity index 100% rename from Production-Traefik/traefik.toml rename to Traefik/traefik.toml diff --git a/build.ps1 b/build.ps1 index 9425aee..2040100 100755 --- a/build.ps1 +++ b/build.ps1 @@ -30,7 +30,7 @@ If ($BTCPAYGEN_REVERSEPROXY -eq "nginx") { } If ($BTCPAYGEN_REVERSEPROXY -eq "traefik") { - Copy-Item ".\Production-Traefik\traefik.toml" -Destination ".\Generated" + Copy-Item ".\Traefik\traefik.toml" -Destination ".\Generated" New-Item ".\Generated\acme.json" -type file } diff --git a/build.sh b/build.sh index 232110b..7adaeed 100755 --- a/build.sh +++ b/build.sh @@ -30,7 +30,7 @@ if [ "$BTCPAYGEN_REVERSEPROXY" == "nginx" ]; then fi if [ "$BTCPAYGEN_REVERSEPROXY" == "traefik" ]; then - cp Production-Traefik/traefik.toml Generated/traefik.toml + cp Traefik/traefik.toml Generated/traefik.toml :> Generated/acme.json chmod 600 Generated/acme.json fi From e29351f0d2fc133be111d989bf71dfc373d174cf Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 30 Sep 2018 10:48:09 +0200 Subject: [PATCH 33/85] combine crypto opts ymls into one file --- .../opt-bgold-lnd-autopilot.yml | 9 ------- .../opt-bgold-save-storage-s.yml | 8 ------ .../opt-bgold-save-storage-xs.yml | 8 ------ .../opt-bgold-save-storage-xxs.yml | 8 ------ .../opt-bgold-save-storage.yml | 8 ------ .../opt-btc-lnd-autopilot.yml | 9 ------- .../opt-btc-save-storage-s.yml | 8 ------ .../opt-btc-save-storage-xs.yml | 8 ------ .../opt-btc-save-storage-xxs.yml | 8 ------ .../docker-fragments/opt-btc-save-storage.yml | 8 ------ .../opt-feathercoin-save-storage-s.yml | 8 ------ .../opt-feathercoin-save-storage-xs.yml | 8 ------ .../opt-feathercoin-save-storage-xxs.yml | 8 ------ .../opt-feathercoin-save-storage.yml | 8 ------ .../opt-groestlcoin-save-storage-s.yml | 8 ------ .../opt-groestlcoin-save-storage-xs.yml | 8 ------ .../opt-groestlcoin-save-storage-xxs.yml | 8 ------ .../opt-groestlcoin-save-storage.yml | 8 ------ .../docker-fragments/opt-lnd-autopilot.yml | 12 +++++++++ .../opt-ltc-lnd-autopilot.yml | 9 ------- .../opt-ltc-save-storage-s.yml | 8 ------ .../opt-ltc-save-storage-xs.yml | 8 ------ .../opt-ltc-save-storage-xxs.yml | 8 ------ .../docker-fragments/opt-ltc-save-storage.yml | 8 ------ .../docker-fragments/opt-save-storage-s.yml | 25 +++++++++++++++++++ .../docker-fragments/opt-save-storage-xs.yml | 25 +++++++++++++++++++ .../docker-fragments/opt-save-storage-xxs.yml | 25 +++++++++++++++++++ .../docker-fragments/opt-save-storage.yml | 25 +++++++++++++++++++ 28 files changed, 112 insertions(+), 187 deletions(-) delete mode 100644 docker-compose-generator/docker-fragments/opt-bgold-lnd-autopilot.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-bgold-save-storage-s.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-bgold-save-storage-xs.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-bgold-save-storage-xxs.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-bgold-save-storage.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-btc-lnd-autopilot.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-btc-save-storage-s.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-btc-save-storage-xs.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-btc-save-storage-xxs.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-btc-save-storage.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-s.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-xs.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-xxs.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-feathercoin-save-storage.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-s.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-xs.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-xxs.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-ltc-lnd-autopilot.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-ltc-save-storage-s.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-ltc-save-storage-xs.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-ltc-save-storage-xxs.yml delete mode 100644 docker-compose-generator/docker-fragments/opt-ltc-save-storage.yml diff --git a/docker-compose-generator/docker-fragments/opt-bgold-lnd-autopilot.yml b/docker-compose-generator/docker-fragments/opt-bgold-lnd-autopilot.yml deleted file mode 100644 index c92ce27..0000000 --- a/docker-compose-generator/docker-fragments/opt-bgold-lnd-autopilot.yml +++ /dev/null @@ -1,9 +0,0 @@ -version: "3" - -services: - lnd_bitcoingold: - environment: - LND_EXTRA_ARGS: | - autopilot.active=1 - autopilot.maxchannels=5 - autopilot.allocation=0.6 diff --git a/docker-compose-generator/docker-fragments/opt-bgold-save-storage-s.yml b/docker-compose-generator/docker-fragments/opt-bgold-save-storage-s.yml deleted file mode 100644 index cea27b6..0000000 --- a/docker-compose-generator/docker-fragments/opt-bgold-save-storage-s.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - bgoldd: - environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. - BITCOIN_EXTRA_ARGS: prune=50000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-bgold-save-storage-xs.yml b/docker-compose-generator/docker-fragments/opt-bgold-save-storage-xs.yml deleted file mode 100644 index f5b4dc7..0000000 --- a/docker-compose-generator/docker-fragments/opt-bgold-save-storage-xs.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - bgoldd: - environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. - BITCOIN_EXTRA_ARGS: prune=25000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-bgold-save-storage-xxs.yml b/docker-compose-generator/docker-fragments/opt-bgold-save-storage-xxs.yml deleted file mode 100644 index 831e419..0000000 --- a/docker-compose-generator/docker-fragments/opt-bgold-save-storage-xxs.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - bgoldd: - environment: - # If you don't use Lightning Network, you want this - # This save about 2 weeks worth of block - BITCOIN_EXTRA_ARGS: prune=5000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-bgold-save-storage.yml b/docker-compose-generator/docker-fragments/opt-bgold-save-storage.yml deleted file mode 100644 index b737700..0000000 --- a/docker-compose-generator/docker-fragments/opt-bgold-save-storage.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - bgoldd: - environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. - BITCOIN_EXTRA_ARGS: prune=100000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-btc-lnd-autopilot.yml b/docker-compose-generator/docker-fragments/opt-btc-lnd-autopilot.yml deleted file mode 100644 index aff861e..0000000 --- a/docker-compose-generator/docker-fragments/opt-btc-lnd-autopilot.yml +++ /dev/null @@ -1,9 +0,0 @@ -version: "3" - -services: - lnd_bitcoin: - environment: - LND_EXTRA_ARGS: | - autopilot.active=1 - autopilot.maxchannels=5 - autopilot.allocation=0.6 diff --git a/docker-compose-generator/docker-fragments/opt-btc-save-storage-s.yml b/docker-compose-generator/docker-fragments/opt-btc-save-storage-s.yml deleted file mode 100644 index 11177d2..0000000 --- a/docker-compose-generator/docker-fragments/opt-btc-save-storage-s.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - bitcoind: - environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. - BITCOIN_EXTRA_ARGS: prune=50000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-btc-save-storage-xs.yml b/docker-compose-generator/docker-fragments/opt-btc-save-storage-xs.yml deleted file mode 100644 index a089417..0000000 --- a/docker-compose-generator/docker-fragments/opt-btc-save-storage-xs.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - bitcoind: - environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. - BITCOIN_EXTRA_ARGS: prune=25000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-btc-save-storage-xxs.yml b/docker-compose-generator/docker-fragments/opt-btc-save-storage-xxs.yml deleted file mode 100644 index 22fd776..0000000 --- a/docker-compose-generator/docker-fragments/opt-btc-save-storage-xxs.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - bitcoind: - environment: - # If you don't use Lightning Network, you want this - # This save about 2 weeks worth of block - BITCOIN_EXTRA_ARGS: prune=5000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-btc-save-storage.yml b/docker-compose-generator/docker-fragments/opt-btc-save-storage.yml deleted file mode 100644 index 103a3e6..0000000 --- a/docker-compose-generator/docker-fragments/opt-btc-save-storage.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - bitcoind: - environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. - BITCOIN_EXTRA_ARGS: prune=100000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-s.yml b/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-s.yml deleted file mode 100644 index 8717b81..0000000 --- a/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-s.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - feathercoind: - environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. - BITCOIN_EXTRA_ARGS: prune=50000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-xs.yml b/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-xs.yml deleted file mode 100644 index 9a0d789..0000000 --- a/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-xs.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - feathercoind: - environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. - BITCOIN_EXTRA_ARGS: prune=25000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-xxs.yml b/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-xxs.yml deleted file mode 100644 index d2ea1cd..0000000 --- a/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage-xxs.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - feathercoind: - environment: - # If you don't use Lightning Network, you want this - # This save about 2 weeks worth of block - BITCOIN_EXTRA_ARGS: prune=5000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage.yml b/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage.yml deleted file mode 100644 index 37d258f..0000000 --- a/docker-compose-generator/docker-fragments/opt-feathercoin-save-storage.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - feathercoind: - environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. - BITCOIN_EXTRA_ARGS: prune=100000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-s.yml b/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-s.yml deleted file mode 100644 index e858e75..0000000 --- a/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-s.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - groestlcoind: - environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. - BITCOIN_EXTRA_ARGS: prune=50000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-xs.yml b/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-xs.yml deleted file mode 100644 index d750170..0000000 --- a/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-xs.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - groestlcoind: - environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. - BITCOIN_EXTRA_ARGS: prune=25000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-xxs.yml b/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-xxs.yml deleted file mode 100644 index 27391ec..0000000 --- a/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage-xxs.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - groestlcoind: - environment: - # If you don't use Lightning Network, you want this - # This save about 2 weeks worth of block - BITCOIN_EXTRA_ARGS: prune=5000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage.yml b/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage.yml deleted file mode 100644 index 2386e9b..0000000 --- a/docker-compose-generator/docker-fragments/opt-groestlcoin-save-storage.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - groestlcoind: - environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. - BITCOIN_EXTRA_ARGS: prune=100000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-lnd-autopilot.yml b/docker-compose-generator/docker-fragments/opt-lnd-autopilot.yml index aff861e..98f9e6b 100644 --- a/docker-compose-generator/docker-fragments/opt-lnd-autopilot.yml +++ b/docker-compose-generator/docker-fragments/opt-lnd-autopilot.yml @@ -7,3 +7,15 @@ services: autopilot.active=1 autopilot.maxchannels=5 autopilot.allocation=0.6 + lnd_litecoin: + environment: + LND_EXTRA_ARGS: | + autopilot.active=1 + autopilot.maxchannels=5 + autopilot.allocation=0.6 + lnd_bitcoingold: + environment: + LND_EXTRA_ARGS: | + autopilot.active=1 + autopilot.maxchannels=5 + autopilot.allocation=0.6 diff --git a/docker-compose-generator/docker-fragments/opt-ltc-lnd-autopilot.yml b/docker-compose-generator/docker-fragments/opt-ltc-lnd-autopilot.yml deleted file mode 100644 index a6a30b7..0000000 --- a/docker-compose-generator/docker-fragments/opt-ltc-lnd-autopilot.yml +++ /dev/null @@ -1,9 +0,0 @@ -version: "3" - -services: - lnd_litecoin: - environment: - LND_EXTRA_ARGS: | - autopilot.active=1 - autopilot.maxchannels=5 - autopilot.allocation=0.6 diff --git a/docker-compose-generator/docker-fragments/opt-ltc-save-storage-s.yml b/docker-compose-generator/docker-fragments/opt-ltc-save-storage-s.yml deleted file mode 100644 index fb5f00e..0000000 --- a/docker-compose-generator/docker-fragments/opt-ltc-save-storage-s.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - litecoind: - environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. - BITCOIN_EXTRA_ARGS: prune=50000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-ltc-save-storage-xs.yml b/docker-compose-generator/docker-fragments/opt-ltc-save-storage-xs.yml deleted file mode 100644 index f1607dc..0000000 --- a/docker-compose-generator/docker-fragments/opt-ltc-save-storage-xs.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - litecoind: - environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. - BITCOIN_EXTRA_ARGS: prune=25000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-ltc-save-storage-xxs.yml b/docker-compose-generator/docker-fragments/opt-ltc-save-storage-xxs.yml deleted file mode 100644 index c0216ee..0000000 --- a/docker-compose-generator/docker-fragments/opt-ltc-save-storage-xxs.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - litecoind: - environment: - # If you don't use Lightning Network, you want this - # This save about 2 weeks worth of block - BITCOIN_EXTRA_ARGS: prune=5000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-ltc-save-storage.yml b/docker-compose-generator/docker-fragments/opt-ltc-save-storage.yml deleted file mode 100644 index 82ef2e1..0000000 --- a/docker-compose-generator/docker-fragments/opt-ltc-save-storage.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: "3" - -services: - litecoind: - environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. - BITCOIN_EXTRA_ARGS: prune=100000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-save-storage-s.yml b/docker-compose-generator/docker-fragments/opt-save-storage-s.yml index 11177d2..394f7d3 100644 --- a/docker-compose-generator/docker-fragments/opt-save-storage-s.yml +++ b/docker-compose-generator/docker-fragments/opt-save-storage-s.yml @@ -2,6 +2,31 @@ version: "3" services: bitcoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=50000 + bgoldd: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=50000 + feathercoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=50000 + groestlcoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=50000 + litecoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=50000 + viacoind: environment: # If you don't use Lightning Network, use opt-save-store-xxs instead # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. diff --git a/docker-compose-generator/docker-fragments/opt-save-storage-xs.yml b/docker-compose-generator/docker-fragments/opt-save-storage-xs.yml index a089417..75a6def 100644 --- a/docker-compose-generator/docker-fragments/opt-save-storage-xs.yml +++ b/docker-compose-generator/docker-fragments/opt-save-storage-xs.yml @@ -2,6 +2,31 @@ version: "3" services: bitcoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=25000 + bgoldd: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=25000 + feathercoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=25000 + groestlcoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=25000 + litecoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. + BITCOIN_EXTRA_ARGS: prune=25000 + viacoind: environment: # If you don't use Lightning Network, use opt-save-store-xxs instead # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. diff --git a/docker-compose-generator/docker-fragments/opt-save-storage-xxs.yml b/docker-compose-generator/docker-fragments/opt-save-storage-xxs.yml index 22fd776..c0c660d 100644 --- a/docker-compose-generator/docker-fragments/opt-save-storage-xxs.yml +++ b/docker-compose-generator/docker-fragments/opt-save-storage-xxs.yml @@ -2,6 +2,31 @@ version: "3" services: bitcoind: + environment: + # If you don't use Lightning Network, you want this + # This save about 2 weeks worth of block + BITCOIN_EXTRA_ARGS: prune=5000 + bgoldd: + environment: + # If you don't use Lightning Network, you want this + # This save about 2 weeks worth of block + BITCOIN_EXTRA_ARGS: prune=5000 + feathercoind: + environment: + # If you don't use Lightning Network, you want this + # This save about 2 weeks worth of block + BITCOIN_EXTRA_ARGS: prune=5000 + groestlcoind: + environment: + # If you don't use Lightning Network, you want this + # This save about 2 weeks worth of block + BITCOIN_EXTRA_ARGS: prune=5000 + litecoind: + environment: + # If you don't use Lightning Network, you want this + # This save about 2 weeks worth of block + BITCOIN_EXTRA_ARGS: prune=5000 + viacoind: environment: # If you don't use Lightning Network, you want this # This save about 2 weeks worth of block diff --git a/docker-compose-generator/docker-fragments/opt-save-storage.yml b/docker-compose-generator/docker-fragments/opt-save-storage.yml index 103a3e6..df3e82e 100644 --- a/docker-compose-generator/docker-fragments/opt-save-storage.yml +++ b/docker-compose-generator/docker-fragments/opt-save-storage.yml @@ -2,6 +2,31 @@ version: "3" services: bitcoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. + BITCOIN_EXTRA_ARGS: prune=100000 + bgoldd: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. + BITCOIN_EXTRA_ARGS: prune=100000 + feathercoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. + BITCOIN_EXTRA_ARGS: prune=100000 + groestlcoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. + BITCOIN_EXTRA_ARGS: prune=100000 + litecoind: + environment: + # If you don't use Lightning Network, use opt-save-store-xxs instead + # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. + BITCOIN_EXTRA_ARGS: prune=100000 + viacoind: environment: # If you don't use Lightning Network, use opt-save-store-xxs instead # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. From c20d1bff77514842de1d078069a4755275dd14f3 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Sun, 30 Sep 2018 19:53:06 +0900 Subject: [PATCH 34/85] Remove redundant comment --- .../docker-fragments/opt-save-storage-s.yml | 14 ++------------ .../docker-fragments/opt-save-storage-xs.yml | 14 ++------------ .../docker-fragments/opt-save-storage-xxs.yml | 14 ++------------ .../docker-fragments/opt-save-storage.yml | 14 ++------------ 4 files changed, 8 insertions(+), 48 deletions(-) diff --git a/docker-compose-generator/docker-fragments/opt-save-storage-s.yml b/docker-compose-generator/docker-fragments/opt-save-storage-s.yml index 394f7d3..e134222 100644 --- a/docker-compose-generator/docker-fragments/opt-save-storage-s.yml +++ b/docker-compose-generator/docker-fragments/opt-save-storage-s.yml @@ -1,33 +1,23 @@ version: "3" +# If you don't use Lightning Network, use opt-save-store-xxs instead +# This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. services: bitcoind: environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. BITCOIN_EXTRA_ARGS: prune=50000 bgoldd: environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. BITCOIN_EXTRA_ARGS: prune=50000 feathercoind: environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. BITCOIN_EXTRA_ARGS: prune=50000 groestlcoind: environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. BITCOIN_EXTRA_ARGS: prune=50000 litecoind: environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. BITCOIN_EXTRA_ARGS: prune=50000 viacoind: environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 6 months of block, your lightning node won't be able to see channel created 6 months since the time you start it. BITCOIN_EXTRA_ARGS: prune=50000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-save-storage-xs.yml b/docker-compose-generator/docker-fragments/opt-save-storage-xs.yml index 75a6def..6f5e90a 100644 --- a/docker-compose-generator/docker-fragments/opt-save-storage-xs.yml +++ b/docker-compose-generator/docker-fragments/opt-save-storage-xs.yml @@ -1,33 +1,23 @@ version: "3" +# If you don't use Lightning Network, use opt-save-store-xxs instead +# This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. services: bitcoind: environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. BITCOIN_EXTRA_ARGS: prune=25000 bgoldd: environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. BITCOIN_EXTRA_ARGS: prune=25000 feathercoind: environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. BITCOIN_EXTRA_ARGS: prune=25000 groestlcoind: environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. BITCOIN_EXTRA_ARGS: prune=25000 litecoind: environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. BITCOIN_EXTRA_ARGS: prune=25000 viacoind: environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 3 months of block, your lightning node won't be able to see channel created 3 months since the time you start it. BITCOIN_EXTRA_ARGS: prune=25000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-save-storage-xxs.yml b/docker-compose-generator/docker-fragments/opt-save-storage-xxs.yml index c0c660d..6ad1d81 100644 --- a/docker-compose-generator/docker-fragments/opt-save-storage-xxs.yml +++ b/docker-compose-generator/docker-fragments/opt-save-storage-xxs.yml @@ -1,33 +1,23 @@ version: "3" +# If you don't use Lightning Network, you want this +# This save about 2 weeks worth of block services: bitcoind: environment: - # If you don't use Lightning Network, you want this - # This save about 2 weeks worth of block BITCOIN_EXTRA_ARGS: prune=5000 bgoldd: environment: - # If you don't use Lightning Network, you want this - # This save about 2 weeks worth of block BITCOIN_EXTRA_ARGS: prune=5000 feathercoind: environment: - # If you don't use Lightning Network, you want this - # This save about 2 weeks worth of block BITCOIN_EXTRA_ARGS: prune=5000 groestlcoind: environment: - # If you don't use Lightning Network, you want this - # This save about 2 weeks worth of block BITCOIN_EXTRA_ARGS: prune=5000 litecoind: environment: - # If you don't use Lightning Network, you want this - # This save about 2 weeks worth of block BITCOIN_EXTRA_ARGS: prune=5000 viacoind: environment: - # If you don't use Lightning Network, you want this - # This save about 2 weeks worth of block BITCOIN_EXTRA_ARGS: prune=5000 \ No newline at end of file diff --git a/docker-compose-generator/docker-fragments/opt-save-storage.yml b/docker-compose-generator/docker-fragments/opt-save-storage.yml index df3e82e..9e440cd 100644 --- a/docker-compose-generator/docker-fragments/opt-save-storage.yml +++ b/docker-compose-generator/docker-fragments/opt-save-storage.yml @@ -1,33 +1,23 @@ version: "3" +# If you don't use Lightning Network, use opt-save-store-xxs instead +# This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. services: bitcoind: environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. BITCOIN_EXTRA_ARGS: prune=100000 bgoldd: environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. BITCOIN_EXTRA_ARGS: prune=100000 feathercoind: environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. BITCOIN_EXTRA_ARGS: prune=100000 groestlcoind: environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. BITCOIN_EXTRA_ARGS: prune=100000 litecoind: environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. BITCOIN_EXTRA_ARGS: prune=100000 viacoind: environment: - # If you don't use Lightning Network, use opt-save-store-xxs instead - # This save about 1 years of block, your lightning node won't be able to see channel created 1 year since the time you start it. BITCOIN_EXTRA_ARGS: prune=100000 \ No newline at end of file From fcddb4b33f84cbea36e0ea104d67335b28a1b09f Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Sun, 30 Sep 2018 20:14:17 +0900 Subject: [PATCH 35/85] Add documentation about BTCPAYGEN_DOCKER_IMAGE --- README.md | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 9dcc178..f7c8223 100644 --- a/README.md +++ b/README.md @@ -270,19 +270,23 @@ BTCPAY_SSHKEYFILE=/datadir/id_rsa 1. Add support for your crypto to [NBitcoin](https://github.com/MetacoSA/NBitcoin/tree/master/NBitcoin.Altcoins), [NBxplorer](https://github.com/dgarage/NBXplorer), and [BTCPayServer](https://github.com/btcpayserver/btcpayserver). (Use examples from other coins) 2. Create your own docker image ([Example for BTC](https://hub.docker.com/r/nicolasdorier/docker-bitcoin/)) 3. Create a docker-compose fragment ([Example for BTC](docker-compose-generator/docker-fragments/bitcoin.yml)) -4. Add your CryptoDefinition ([Example for BTC](docker-compose-generator/src/CryptoDefinition.cs)) +4. Add your `CryptoDefinition` ([Example for BTC](docker-compose-generator/src/CryptoDefinition.cs)) -When testing your coin, **DO NOT USE `build.sh`**, since it uses a pre-built docker image. - -Instead, install [.NET Core 2.1 SDK](https://www.microsoft.com/net/download/windows) and run: +`build.sh` is using a pre-built image of the `docker-compose generator` on [docker hub](https://hub.docker.com/r/btcpayserver/docker-compose-generator/). +If you modify the code source of `docker-compose generator` (for example, the `CryptoDefinition` [Example for BTC](docker-compose-generator/src/CryptoDefinition.cs)), you need to configure `build.sh` to use your own image by setting the environment variable `BTCPAYGEN_DOCKER_IMAGE` to `btcpayserver/docker-compose-generator:local`. ```bash -BTCPAYGEN_CRYPTO1="EXAMPLE-COIN" -BTCPAYGEN_SUBNAME="test" -cd docker-compose-generator/src -dotnet run +cd docker-compose-generator +BTCPAYGEN_DOCKER_IMAGE="btcpayserver/docker-compose-generator:local" +``` + +Or on powershell: +```powershell +cd docker-compose-generator +$BTCPAYGEN_DOCKER_IMAGE="btcpayserver/docker-compose-generator:local" ``` +Then run `./build.sh` or `. .\build.ps1`. This will generate your docker-compose in the `Generated` folder, which you can then run and test. Note that BTCPayServer developers will not spend excessive time testing your image, so make sure it works. From fc38f746ee462bc4a20e6d8b2af4084ba7410f67 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Sun, 30 Sep 2018 20:28:23 +0900 Subject: [PATCH 36/85] rewrite build.sh to set default value to BTCPAYGEN_DOCKER_IMAGE --- build.ps1 | 3 ++- build.sh | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/build.ps1 b/build.ps1 index 0303c5f..ec7f8fb 100755 --- a/build.ps1 +++ b/build.ps1 @@ -1,7 +1,8 @@ # This script will run docker-compose-generator in a container to generate the yml files If (-not ($BTCPAYGEN_DOCKER_IMAGE)) { $BTCPAYGEN_DOCKER_IMAGE = "btcpayserver/docker-compose-generator" } -If($BTCPAYGEN_DOCKER_IMAGE -eq "btcpayserver/docker-compose-generator:local"){ + +If ($BTCPAYGEN_DOCKER_IMAGE -eq "btcpayserver/docker-compose-generator:local"){ docker build docker-compose-generator --tag $BTCPAYGEN_DOCKER_IMAGE } Else { docker pull $BTCPAYGEN_DOCKER_IMAGE diff --git a/build.sh b/build.sh index b0d1b24..b3fab27 100755 --- a/build.sh +++ b/build.sh @@ -1,10 +1,11 @@ #!/bin/bash +: "${BTCPAYGEN_DOCKER_IMAGE:=btcpayserver/docker-compose-generator}" if [ "$BTCPAYGEN_DOCKER_IMAGE" == "btcpayserver/docker-compose-generator:local" ] then docker build docker-compose-generator --tag $BTCPAYGEN_DOCKER_IMAGE else - docker pull ${BTCPAYGEN_DOCKER_IMAGE:-"btcpayserver/docker-compose-generator"} + docker pull $BTCPAYGEN_DOCKER_IMAGE fi # This script will run docker-compose-generator in a container to generate the yml files @@ -23,7 +24,7 @@ docker run -v "$(pwd)/Generated:/app/Generated" \ -e "BTCPAYGEN_ADDITIONAL_FRAGMENTS=$BTCPAYGEN_ADDITIONAL_FRAGMENTS" \ -e "BTCPAYGEN_LIGHTNING=$BTCPAYGEN_LIGHTNING" \ -e "BTCPAYGEN_SUBNAME=$BTCPAYGEN_SUBNAME" \ - --rm ${BTCPAYGEN_DOCKER_IMAGE:-"btcpayserver/docker-compose-generator"} + --rm $BTCPAYGEN_DOCKER_IMAGE if [ "$BTCPAYGEN_REVERSEPROXY" == "nginx" ]; then cp Production/nginx.tmpl Generated/nginx.tmpl From ee30ad05ebf5999fc748c1bb26f38669120349c6 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 30 Sep 2018 13:58:11 +0200 Subject: [PATCH 37/85] pr changes --- btcpay-setup.sh | 3 +-- build.ps1 | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/btcpay-setup.sh b/btcpay-setup.sh index e404bcc..f5756d4 100755 --- a/btcpay-setup.sh +++ b/btcpay-setup.sh @@ -51,7 +51,7 @@ Environment variables: BTCPAY_HOST: The hostname of your website (eg. btcpay.example.com) LETSENCRYPT_EMAIL: A mail will be sent to this address if certificate expires and fail to renew automatically (eg. me@example.com) NBITCOIN_NETWORK: The type of network to use (eg. mainnet, testnet or regtest. Default: mainnet) - LIGHTNING_ALIAS: An alias for your lightning network node if used + LIGHTNING_ALIAS: An alias for your lightning network node if used BTCPAYGEN_CRYPTO1: First supported crypto currency (eg. btc, ltc, btg, grs, ftc, via, none. Default: btc) BTCPAYGEN_CRYPTO2: Second supported crypto currency (Default: empty) BTCPAYGEN_CRYPTON: N th supported crypto currency where N is maximum at maximum 9. (Default: none) @@ -71,7 +71,6 @@ fi ######### Migration: old pregen environment to new environment ############ if [ ! -z $BTCPAY_DOCKER_COMPOSE ] && [ ! -z $DOWNLOAD_ROOT ] && [ -z $BTCPAYGEN_OLD_PREGEN ]; then - if [[ $(dirname $BTCPAY_DOCKER_COMPOSE) == *Production-NoReverseProxy ]]; then echo "Your deployment is too old, you need to migrate by following instructions on this link https://github.com/btcpayserver/btcpayserver-docker/tree/master#i-deployed-before-btcpay-setupsh-existed-before-may-17-can-i-migrate-to-this-new-system" return fi diff --git a/build.ps1 b/build.ps1 index 4653cf1..2bafc9e 100755 --- a/build.ps1 +++ b/build.ps1 @@ -1,5 +1,4 @@ # This script will run docker-compose-generator in a container to generate the yml files -if (-not ($BTCPAYGEN_DOCKER_IMAGE)) { $BTCPAYGEN_DOCKER_IMAGE = "btcpayserver/docker-compose-generator" } If (-not ($BTCPAYGEN_DOCKER_IMAGE)) { $BTCPAYGEN_DOCKER_IMAGE = "btcpayserver/docker-compose-generator" } From 56346cc4d8c4efa431ea4d2cc1c8a20077fbdcdb Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 30 Sep 2018 15:13:05 +0200 Subject: [PATCH 38/85] pr chanegs --- Production/README.md | 2 -- Traefik/README.md | 2 -- 2 files changed, 4 deletions(-) diff --git a/Production/README.md b/Production/README.md index 02a94bb..1972e17 100644 --- a/Production/README.md +++ b/Production/README.md @@ -27,8 +27,6 @@ The relevant environment variables are: If `BTCPAY_HOST` is `btcpay.example.com` and `BTCPAY_ROOTPATH` is `/btcpay`, then you can access the site via `https://btcpay.example.com/btcpay` -Use `docker-compose.btc-ltc.yml` for bitcoin and litecoin support, or `docker-compose.btc.yml` for only bitcoin. - Any unset or empty environment variable will be set for a `regtest` deployment. The ports mapped on the host are: diff --git a/Traefik/README.md b/Traefik/README.md index 0a6cf0b..55e195b 100644 --- a/Traefik/README.md +++ b/Traefik/README.md @@ -37,8 +37,6 @@ The relevant environment variables are: If `BTCPAY_HOST` is `btcpay.example.com` and `BTCPAY_ROOTPATH` is `/btcpay`, then you can access the site via `https://btcpay.example.com/btcpay` -Use `docker-compose.btc-ltc.yml` for bitcoin and litecoin support, or `docker-compose.btc.yml` for only bitcoin. - Any unset or empty environment variable will be set for a `regtest` deployment. The ports mapped on the host are: From 0f8dc4b7c94a7cf1594fde852ab37c1963fa49c2 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 30 Sep 2018 17:49:15 +0200 Subject: [PATCH 39/85] update readmes --- Production/README.md | 2 +- README.md | 2 +- Traefik/README.md | 76 +++++++------------------------------------- 3 files changed, 13 insertions(+), 67 deletions(-) diff --git a/Production/README.md b/Production/README.md index 1972e17..034c339 100644 --- a/Production/README.md +++ b/Production/README.md @@ -1,6 +1,6 @@ # How to use docker-compose with NGinx -NGinx acts as a reverse proxy, and take care of renewing HTTPS certificates for you. +NGinx acts as a reverse proxy, and takes care of renewing HTTPS certificates for you. BTCPay Server deployment using NGinx are typically composed of: 1. One full node per supported cryptocurrency (bitcoind/litecoind) diff --git a/README.md b/README.md index b900aa5..da85b3c 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ You can read [the article](https://medium.com/@BtcpayServer/hosting-btcpay-serve * `BTCPAYGEN_CRYPTO1`: First supported crypto currency (eg. `btc`, `ltc`. Default: `btc`) * `BTCPAYGEN_CRYPTO2`: Second supported crypto currency (eg. `btc`, `ltc`. Default: `(empty)`) * `BTCPAYGEN_CRYPTON`: N'th supported crypto currency where N is 9 at maximum. (eg. `btc`, `ltc`. Default: `(empty)`) -* `BTCPAYGEN_REVERSEPROXY`: Specify reverse proxy to use; NGinx has HTTPS support. (eg. `nginx`, `(empty)`. Default: `nginx`) +* `BTCPAYGEN_REVERSEPROXY`: Specify reverse proxy to use; NGinx has HTTPS support. (eg. `nginx`, `traefik`, `(empty)`. Default: `nginx`) * `BTCPAYGEN_LIGHTNING`: Lightning network implementation to use (eg. `clightning`, `(empty)`) * `BTCPAYGEN_SUBNAME`: The subname of the generated docker-compose file, where the full name is `Generated/docker-compose.SUBNAME.yml` (Default: `generated`) * `BTCPAYGEN_ADDITIONAL_FRAGMENTS`: Semicolon-separated list of additional fragments you want to use (eg. `opt-save-storage`) diff --git a/Traefik/README.md b/Traefik/README.md index 55e195b..1c69e73 100644 --- a/Traefik/README.md +++ b/Traefik/README.md @@ -1,71 +1,17 @@ -# About those docker-compose +# How to use docker-compose with Traefik -All `docker-compose` files in [Production](Production), [Production-NoReverseProxy](Production-NoReverseProxy) and [Production-Traefik](Production-Traefik) are generated by running the [build-pregen.sh](build-pregen.sh) (or [build-pregen.ps1](build-pregen.ps1)) script from the fragments located in [docker-compose-generator/docker-fragments](docker-compose-generator/docker-fragments). +Traefik is a modern reverse proxy aimed towards applications running through container orchestrators. -The pre-generated `docker-compose` files only cover `btc`, `ltc`, `clightning` with `traefik`. +Some of the benefits of using Traefik over NGinx are: +* Real-time configuration changes - no need to reload the proxy +* Auto discovery and configuration of services through a vast amount of container orchestrators. +* Built-in official support for Let's Encrypt SSL with certificate auto-renewal ---- +## Traefik Specific Environment Variables -We strongly advise you to not use the pre-generated docker-compose of this folder, they are deprecated and kept only for backward compatibility. -Instead use the [build.sh](../build.sh) as documented in (README)(../Readme.md) to generate a docker-compose which fit your needs. +* `BTCPAYGEN_REVERSEPROXY` to `traefik`. +* `LETSENCRYPT_EMAIL`: Optional, The email Let's Encrypt will use to notify you about certificate expiration. +* `BTCPAYGEN_ADDITIONAL_FRAGMENTS`: In the case that you have an already deployed traefik container, you can use the fragment `traefik-labels` which will tag the btcpayserver service with the needed labels to be discovered. ---- -The `docker-compose` can be used for production purpose. - -It is composed of: - -1. One full node per supported cryptocurrency (bitcoind/litecoind) -2. A lightweight block explorer ([NBxplorer](https://github.com/dgarage/NBXplorer)) -3. A [BTCPay Server](https://github.com/btcpayserver/btcpayserver) -4. A database (Postgres) -5. A reverse proxy (Traefik) container that also handles SSL certificate renewal - -![Architecture](Production.png) - -[The Deploy on Azure Button](https://github.com/btcpayserver/btcpayserver-azure) is using this `docker-compose` under the hood on an Ubuntu machine. You can use it on any docker supporting host. - -The relevant environment variables are: - -* `NBITCOIN_NETWORK`: The blockchain identifier used by NBitcoin (eg., `regtest`, `testnet`, `mainnet`) -* `BTCPAY_HOST`: The external url used to access the NGINX server from internet. This domain name must point to this machine for Let's Encrypt to create your certificate. (typically with a CNAME or A record) -* `BTCPAY_ROOTPATH`: The root path directory where BTCPay is accessed, more information below. (default: /) -* `LETSENCRYPT_EMAIL`: The email Let's Encrypt will use to notify you about certificate expiration. -* `LIGHTNING_ALIAS`: Optional, if using the integrated lightning feature, customize the alias of your nodes -* `BTCPAY_SSHKEYFILE`: Optional, SSH private key that BTCPay can use to connect to this VM's SSH server (You need to copy the key file on BTCPay's datadir volume) -* `BTCPAY_SSHTRUSTEDFINGERPRINTS`: Optional, BTCPay will ensure that it is connecting to the expected SSH server by checking the host public's key against those fingerprints - -If `BTCPAY_HOST` is `btcpay.example.com` and `BTCPAY_ROOTPATH` is `/btcpay`, then you can access the site via `https://btcpay.example.com/btcpay` - -Any unset or empty environment variable will be set for a `regtest` deployment. - -The ports mapped on the host are: - -1. `80` for Let's encrypt -2. `443` for the website -3. `9735` for the bitcoin lightning network node (if used) -4. `9736` for the litecoin lightning network node (if used) - -Example for running on `mainnet`: - -For linux: - -``` -docker-compose up \ - -e "NBITCOIN_NETWORK=mainnet" \ - -e "BTCPAY_HOST=btcpay.example.com" \ - -e "LETSENCRYPT_EMAIL=me@example.com" -``` - -For powershell: - -``` -docker-compose up ` - -e "NBITCOIN_NETWORK=mainnet" ` - -e "BTCPAY_HOST=btcpay.example.com" ` - -e "LETSENCRYPT_EMAIL=me@example.com" -``` - -See also [The guide for docker noobs](../README.md#fornoobs). - -Make sure the domain `btcpay.example.com` point to your server and that port `80` and `443` are open. +![Architecture](Production.png) \ No newline at end of file From c13cbc455932c2ca21a205418810b69dcfcad525 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Mon, 1 Oct 2018 01:03:06 +0900 Subject: [PATCH 40/85] Ignore none existing fragment for back compat --- .../src/DockerComposeDefinition.cs | 275 +++++++++--------- 1 file changed, 144 insertions(+), 131 deletions(-) diff --git a/docker-compose-generator/src/DockerComposeDefinition.cs b/docker-compose-generator/src/DockerComposeDefinition.cs index def8cf9..bf197f4 100644 --- a/docker-compose-generator/src/DockerComposeDefinition.cs +++ b/docker-compose-generator/src/DockerComposeDefinition.cs @@ -8,146 +8,159 @@ using System.IO; namespace DockerGenerator { - public class DockerComposeDefinition - { - public List Fragments - { - get; set; - } - private string _Name; + public class DockerComposeDefinition + { + public List Fragments + { + get; set; + } + private string _Name; - public DockerComposeDefinition(string name, List fragments) - { - Fragments = fragments; - _Name = name; - } + public DockerComposeDefinition(string name, List fragments) + { + Fragments = fragments; + _Name = name; + } - public string FragmentLocation - { - get; set; - } - public string BuildOutputDirectory - { - get; set; - } + public string FragmentLocation + { + get; set; + } + public string BuildOutputDirectory + { + get; set; + } - public string GetFilePath() - { - return Path.Combine(BuildOutputDirectory, $"docker-compose.{_Name}.yml"); - } - public void Build() - { - Console.WriteLine($"Generating {GetFilePath()}"); - var deserializer = new DeserializerBuilder().Build(); - var serializer = new SerializerBuilder().Build(); + public string GetFilePath() + { + return Path.Combine(BuildOutputDirectory, $"docker-compose.{_Name}.yml"); + } + public void Build() + { + Console.WriteLine($"Generating {GetFilePath()}"); + var deserializer = new DeserializerBuilder().Build(); + var serializer = new SerializerBuilder().Build(); - Console.WriteLine($"With fragments:"); - foreach(var fragment in Fragments) - { - Console.WriteLine($"\t{fragment}"); - } - var services = new List>(); - var volumes = new List>(); + Console.WriteLine($"With fragments:"); + foreach (var fragment in Fragments) + { + var fragmentPath = GetFragmentLocation(fragment); + if (!File.Exists(fragmentPath)) + { + Console.WriteLine($"\t{fragment} not found in {fragmentPath}, ignoring..."); + } + else + { + Console.WriteLine($"\t{fragment}"); + } + } + var services = new List>(); + var volumes = new List>(); - foreach(var doc in Fragments.Select(f => ParseDocument(f))) - { - if(doc.Children.ContainsKey("services") && doc.Children["services"] is YamlMappingNode fragmentServicesRoot) - { - services.AddRange(fragmentServicesRoot.Children); - } + foreach (var doc in Fragments.Select(f => ParseDocument(f))) + { + if (doc.Children.ContainsKey("services") && doc.Children["services"] is YamlMappingNode fragmentServicesRoot) + { + services.AddRange(fragmentServicesRoot.Children); + } - if(doc.Children.ContainsKey("volumes") && doc.Children["volumes"] is YamlMappingNode fragmentVolumesRoot) - { - volumes.AddRange(fragmentVolumesRoot.Children); - } - } + if (doc.Children.ContainsKey("volumes") && doc.Children["volumes"] is YamlMappingNode fragmentVolumesRoot) + { + volumes.AddRange(fragmentVolumesRoot.Children); + } + } - YamlMappingNode output = new YamlMappingNode(); - output.Add("version", new YamlScalarNode("3") { Style = YamlDotNet.Core.ScalarStyle.DoubleQuoted }); - output.Add("services", new YamlMappingNode(Merge(services))); - output.Add("volumes", new YamlMappingNode(volumes)); - var result = serializer.Serialize(output); - var outputFile = GetFilePath(); - File.WriteAllText(outputFile, result.Replace("''", "")); - Console.WriteLine($"Generated {outputFile}"); - Console.WriteLine(); - } + YamlMappingNode output = new YamlMappingNode(); + output.Add("version", new YamlScalarNode("3") { Style = YamlDotNet.Core.ScalarStyle.DoubleQuoted }); + output.Add("services", new YamlMappingNode(Merge(services))); + output.Add("volumes", new YamlMappingNode(volumes)); + var result = serializer.Serialize(output); + var outputFile = GetFilePath(); + File.WriteAllText(outputFile, result.Replace("''", "")); + Console.WriteLine($"Generated {outputFile}"); + Console.WriteLine(); + } - private KeyValuePair[] Merge(List> services) - { - return services - .GroupBy(s => s.Key.ToString(), s => s.Value) - .Select(group => - (GroupName: group.Key, - MainNode: group.OfType().SingleOrDefault(n => n.Children.ContainsKey("image")), - MergedNodes: group.OfType().Where(n => !n.Children.ContainsKey("image")))) - .Where(_ => _.MainNode != null) - .Select(_ => - { - foreach(var node in _.MergedNodes) - { - foreach(var child in node) - { - var childValue = child.Value; - if(!_.MainNode.Children.TryGetValue(child.Key, out var mainChildValue)) - { - mainChildValue = child.Value; - _.MainNode.Add(child.Key, child.Value); - } - else if(childValue is YamlMappingNode childMapping && mainChildValue is YamlMappingNode mainChildMapping) - { - foreach(var leaf in childMapping) - { - if(mainChildMapping.Children.TryGetValue(leaf.Key, out var mainLeaf)) - { - if(leaf.Value is YamlScalarNode leafScalar && mainLeaf is YamlScalarNode leafMainScalar) - { - var eof = EOF(leafMainScalar.Value) ?? EOF(leaf.Value.ToString()); - if(eof != null) - { - leafMainScalar.Value = leafMainScalar.Value + eof + leaf.Value; - } - else - { - leafMainScalar.Value = leafMainScalar.Value + "," + leaf.Value; - } - } - } - else - { - mainChildMapping.Add(leaf.Key, leaf.Value); - } - } - } - else if(childValue is YamlSequenceNode childSequence && mainChildValue is YamlSequenceNode mainSequence) - { - foreach(var c in childSequence.Children) - { - mainSequence.Add(c); - } - } - } - } - return new KeyValuePair(_.GroupName, _.MainNode); - }).ToArray(); - } + private KeyValuePair[] Merge(List> services) + { + return services + .GroupBy(s => s.Key.ToString(), s => s.Value) + .Select(group => + (GroupName: group.Key, + MainNode: group.OfType().SingleOrDefault(n => n.Children.ContainsKey("image")), + MergedNodes: group.OfType().Where(n => !n.Children.ContainsKey("image")))) + .Where(_ => _.MainNode != null) + .Select(_ => + { + foreach (var node in _.MergedNodes) + { + foreach (var child in node) + { + var childValue = child.Value; + if (!_.MainNode.Children.TryGetValue(child.Key, out var mainChildValue)) + { + mainChildValue = child.Value; + _.MainNode.Add(child.Key, child.Value); + } + else if (childValue is YamlMappingNode childMapping && mainChildValue is YamlMappingNode mainChildMapping) + { + foreach (var leaf in childMapping) + { + if (mainChildMapping.Children.TryGetValue(leaf.Key, out var mainLeaf)) + { + if (leaf.Value is YamlScalarNode leafScalar && mainLeaf is YamlScalarNode leafMainScalar) + { + var eof = EOF(leafMainScalar.Value) ?? EOF(leaf.Value.ToString()); + if (eof != null) + { + leafMainScalar.Value = leafMainScalar.Value + eof + leaf.Value; + } + else + { + leafMainScalar.Value = leafMainScalar.Value + "," + leaf.Value; + } + } + } + else + { + mainChildMapping.Add(leaf.Key, leaf.Value); + } + } + } + else if (childValue is YamlSequenceNode childSequence && mainChildValue is YamlSequenceNode mainSequence) + { + foreach (var c in childSequence.Children) + { + mainSequence.Add(c); + } + } + } + } + return new KeyValuePair(_.GroupName, _.MainNode); + }).ToArray(); + } - private string EOF(string value) - { - if(value.Contains("\r\n", StringComparison.OrdinalIgnoreCase)) - return "\r\n"; - if(value.Contains("\n", StringComparison.OrdinalIgnoreCase)) - return "\n"; - return null; - } + private string EOF(string value) + { + if (value.Contains("\r\n", StringComparison.OrdinalIgnoreCase)) + return "\r\n"; + if (value.Contains("\n", StringComparison.OrdinalIgnoreCase)) + return "\n"; + return null; + } - private YamlMappingNode ParseDocument(string fragment) - { - var input = new StringReader(File.ReadAllText(Path.Combine(FragmentLocation, $"{fragment}.yml"))); - YamlStream stream = new YamlStream(); - stream.Load(input); - return (YamlMappingNode)stream.Documents[0].RootNode; - } - } + private YamlMappingNode ParseDocument(string fragment) + { + var input = new StringReader(File.ReadAllText(GetFragmentLocation(fragment))); + YamlStream stream = new YamlStream(); + stream.Load(input); + return (YamlMappingNode)stream.Documents[0].RootNode; + } + + private string GetFragmentLocation(string fragment) + { + return Path.Combine(FragmentLocation, $"{fragment}.yml"); + } + } } From 11a75589f3a979afe719e1ab3b39686e3a51b0d1 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Mon, 1 Oct 2018 01:13:38 +0900 Subject: [PATCH 41/85] Remove not found fragment --- docker-compose-generator/src/DockerComposeDefinition.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker-compose-generator/src/DockerComposeDefinition.cs b/docker-compose-generator/src/DockerComposeDefinition.cs index bf197f4..3e8ad95 100644 --- a/docker-compose-generator/src/DockerComposeDefinition.cs +++ b/docker-compose-generator/src/DockerComposeDefinition.cs @@ -42,12 +42,13 @@ namespace DockerGenerator var serializer = new SerializerBuilder().Build(); Console.WriteLine($"With fragments:"); - foreach (var fragment in Fragments) + foreach (var fragment in Fragments.ToList()) { var fragmentPath = GetFragmentLocation(fragment); if (!File.Exists(fragmentPath)) { Console.WriteLine($"\t{fragment} not found in {fragmentPath}, ignoring..."); + Fragments.Remove(fragment); } else { From 7f7c1275121cbc73cb3e509921a15d9e35ff54d1 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Tue, 2 Oct 2018 11:30:12 +0900 Subject: [PATCH 42/85] restore old pregen for backward compat reason --- .../docker-compose.btc-ltc-clightning.yml | 206 ++++++++++++++++++ Production/docker-compose.btc-ltc.yml | 148 +++++++++++++ Production/docker-compose.btc.yml | 122 +++++++++++ btcpay-update.sh | 5 + 4 files changed, 481 insertions(+) create mode 100644 Production/docker-compose.btc-ltc-clightning.yml create mode 100644 Production/docker-compose.btc-ltc.yml create mode 100644 Production/docker-compose.btc.yml diff --git a/Production/docker-compose.btc-ltc-clightning.yml b/Production/docker-compose.btc-ltc-clightning.yml new file mode 100644 index 0000000..7ca69b4 --- /dev/null +++ b/Production/docker-compose.btc-ltc-clightning.yml @@ -0,0 +1,206 @@ +version: "3" +# DO NOT USE THOSE ARE DEPRECATED +services: + nginx: + restart: unless-stopped + image: nginx:stable + container_name: nginx + ports: + - "80:80" + - "443:443" + volumes: + - "nginx_conf:/etc/nginx/conf.d" + - "nginx_vhost:/etc/nginx/vhost.d" + - "nginx_html:/usr/share/nginx/html" + - "nginx_certs:/etc/nginx/certs:ro" + links: + - btcpayserver + nginx-gen: + restart: unless-stopped + image: jwilder/docker-gen + container_name: nginx-gen + volumes: + - "/var/run/docker.sock:/tmp/docker.sock:ro" + - "./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro" + - "nginx_conf:/etc/nginx/conf.d" + - "nginx_vhost:/etc/nginx/vhost.d" + - "nginx_html:/usr/share/nginx/html" + - "nginx_certs:/etc/nginx/certs:ro" + entrypoint: /usr/local/bin/docker-gen -notify-sighup nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf + links: + - nginx + letsencrypt-nginx-proxy-companion: + restart: unless-stopped + image: jrcs/letsencrypt-nginx-proxy-companion + container_name: letsencrypt-nginx-proxy-companion + volumes: + - "/var/run/docker.sock:/var/run/docker.sock:ro" + - "nginx_conf:/etc/nginx/conf.d" + - "nginx_vhost:/etc/nginx/vhost.d" + - "nginx_html:/usr/share/nginx/html" + - "nginx_certs:/etc/nginx/certs:rw" + environment: + NGINX_DOCKER_GEN_CONTAINER: "nginx-gen" + NGINX_PROXY_CONTAINER: "nginx" + ACME_CA_URI: ${ACME_CA_URI:-https://acme-staging.api.letsencrypt.org/directory} + links: + - nginx-gen + btcpayserver: + restart: unless-stopped + image: nicolasdorier/btcpayserver:1.0.2.106 + expose: + - "49392" + environment: + BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} + BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} + BTCPAY_BIND: 0.0.0.0:49392 + BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ + BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} + BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} + BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} + VIRTUAL_NETWORK: nginx-proxy + VIRTUAL_PORT: 49392 + VIRTUAL_HOST: ${BTCPAY_HOST} + SSL_POLICY: Mozilla-Modern + LETSENCRYPT_HOST: ${BTCPAY_HOST} + LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} + BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ + BTCPAY_CHAINS: "ltc,btc" + BTCPAY_LTCLIGHTNING: "type=clightning;server=unix://etc/clightning_litecoin/lightning-rpc" + BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ + BTCPAY_BTCLIGHTNING: "type=clightning;server=unix://etc/clightning_bitcoin/lightning-rpc" + links: + - nbxplorer + - postgres + - clightning_litecoin + - clightning_bitcoin + volumes: + - "btcpay_datadir:/datadir" + - "nbxplorer_datadir:/root/.nbxplorer" + - "clightning_litecoin_datadir:/etc/clightning_litecoin" + - "clightning_bitcoin_datadir:/etc/clightning_bitcoin" + nbxplorer: + restart: unless-stopped + image: nicolasdorier/nbxplorer:1.0.2.31 + expose: + - "32838" + environment: + NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} + NBXPLORER_BIND: 0.0.0.0:32838 + NBXPLORER_CHAINS: "ltc,btc" + NBXPLORER_LTCRPCURL: http://litecoind:43782/ + NBXPLORER_LTCNODEENDPOINT: litecoind:39388 + NBXPLORER_BTCRPCURL: http://bitcoind:43782/ + NBXPLORER_BTCNODEENDPOINT: bitcoind:39388 + volumes: + - "nbxplorer_datadir:/datadir" + - "litecoin_datadir:/root/.litecoin" + - "bitcoin_datadir:/root/.bitcoin" + links: + - litecoind + - bitcoind + postgres: + restart: unless-stopped + image: postgres:9.6.5 + volumes: + - "postgres_datadir:/var/lib/postgresql/data" + litecoind: + restart: unless-stopped + container_name: btcpayserver_litecoind + image: nicolasdorier/docker-litecoin:0.16.3 + environment: + BITCOIN_EXTRA_ARGS: | + rpcport=43782 + ${NBITCOIN_NETWORK:-regtest}=1 + port=39388 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 + whitelist=0.0.0.0/0 + expose: + - "43782" + - "39388" + - "28332" + - "28333" + volumes: + - "litecoin_datadir:/data" + clightning_litecoin: + image: nicolasdorier/clightning:v0.6.1 + container_name: btcpayserver_clightning_litecoin + restart: unless-stopped + environment: + LIGHTNINGD_NETWORK: ${NBITCOIN_NETWORK:-regtest} + LIGHTNINGD_CHAIN: ltc + LIGHTNINGD_EXPLORERURL: "http://nbxplorer:32838/" + LIGHTNINGD_OPT: | + bitcoin-datadir=/etc/litecoin + bitcoin-rpcconnect=litecoind + bind-addr=0.0.0.0:9735 + announce-addr=${BTCPAY_HOST}:9736 + network=${NBITCOIN_NETWORK:-regtest} + alias=${LIGHTNING_ALIAS} + chain=ltc + volumes: + - "clightning_litecoin_datadir:/root/.lightning" + - "litecoin_datadir:/etc/litecoin" + - "nbxplorer_datadir:/root/.nbxplorer" + ports: + - "9736:9735" + links: + - nbxplorer + - litecoind + bitcoind: + restart: unless-stopped + container_name: btcpayserver_bitcoind + image: nicolasdorier/docker-bitcoin:0.16.3 + environment: + BITCOIN_EXTRA_ARGS: | + rpcport=43782 + ${NBITCOIN_NETWORK:-regtest}=1 + port=39388 + whitelist=0.0.0.0/0 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 + expose: + - "43782" + - "39388" + - "28332" + - "28333" + volumes: + - "bitcoin_datadir:/data" + clightning_bitcoin: + image: nicolasdorier/clightning:v0.6.1 + container_name: btcpayserver_clightning_bitcoin + restart: unless-stopped + environment: + LIGHTNINGD_NETWORK: ${NBITCOIN_NETWORK:-regtest} + LIGHTNINGD_CHAIN: btc + LIGHTNINGD_EXPLORERURL: "http://nbxplorer:32838/" + LIGHTNINGD_OPT: | + bitcoin-datadir=/etc/bitcoin + bitcoin-rpcconnect=bitcoind + announce-addr=${BTCPAY_HOST}:9735 + bind-addr=0.0.0.0:9735 + network=${NBITCOIN_NETWORK:-regtest} + alias=${LIGHTNING_ALIAS} + chain=btc + volumes: + - "clightning_bitcoin_datadir:/root/.lightning" + - "bitcoin_datadir:/etc/bitcoin" + - "nbxplorer_datadir:/root/.nbxplorer" + ports: + - "9735:9735" + links: + - nbxplorer + - bitcoind +volumes: + nginx_conf: + nginx_vhost: + nginx_html: + nginx_certs: + postgres_datadir: + btcpay_datadir: + nbxplorer_datadir: + litecoin_datadir: + clightning_litecoin_datadir: + bitcoin_datadir: + clightning_bitcoin_datadir: diff --git a/Production/docker-compose.btc-ltc.yml b/Production/docker-compose.btc-ltc.yml new file mode 100644 index 0000000..6adaa2d --- /dev/null +++ b/Production/docker-compose.btc-ltc.yml @@ -0,0 +1,148 @@ +version: "3" +# DO NOT USE THOSE ARE DEPRECATED +services: + nginx: + restart: unless-stopped + image: nginx:stable + container_name: nginx + ports: + - "80:80" + - "443:443" + volumes: + - "nginx_conf:/etc/nginx/conf.d" + - "nginx_vhost:/etc/nginx/vhost.d" + - "nginx_html:/usr/share/nginx/html" + - "nginx_certs:/etc/nginx/certs:ro" + links: + - btcpayserver + nginx-gen: + restart: unless-stopped + image: jwilder/docker-gen + container_name: nginx-gen + volumes: + - "/var/run/docker.sock:/tmp/docker.sock:ro" + - "./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro" + - "nginx_conf:/etc/nginx/conf.d" + - "nginx_vhost:/etc/nginx/vhost.d" + - "nginx_html:/usr/share/nginx/html" + - "nginx_certs:/etc/nginx/certs:ro" + entrypoint: /usr/local/bin/docker-gen -notify-sighup nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf + links: + - nginx + letsencrypt-nginx-proxy-companion: + restart: unless-stopped + image: jrcs/letsencrypt-nginx-proxy-companion + container_name: letsencrypt-nginx-proxy-companion + volumes: + - "/var/run/docker.sock:/var/run/docker.sock:ro" + - "nginx_conf:/etc/nginx/conf.d" + - "nginx_vhost:/etc/nginx/vhost.d" + - "nginx_html:/usr/share/nginx/html" + - "nginx_certs:/etc/nginx/certs:rw" + environment: + NGINX_DOCKER_GEN_CONTAINER: "nginx-gen" + NGINX_PROXY_CONTAINER: "nginx" + ACME_CA_URI: ${ACME_CA_URI:-https://acme-staging.api.letsencrypt.org/directory} + links: + - nginx-gen + btcpayserver: + restart: unless-stopped + image: nicolasdorier/btcpayserver:1.0.2.106 + expose: + - "49392" + environment: + BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} + BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} + BTCPAY_BIND: 0.0.0.0:49392 + BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ + BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} + BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} + BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} + VIRTUAL_NETWORK: nginx-proxy + VIRTUAL_PORT: 49392 + VIRTUAL_HOST: ${BTCPAY_HOST} + SSL_POLICY: Mozilla-Modern + LETSENCRYPT_HOST: ${BTCPAY_HOST} + LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} + BTCPAY_LTCEXPLORERURL: http://nbxplorer:32838/ + BTCPAY_CHAINS: "ltc,btc" + BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ + links: + - nbxplorer + - postgres + volumes: + - "btcpay_datadir:/datadir" + - "nbxplorer_datadir:/root/.nbxplorer" + nbxplorer: + restart: unless-stopped + image: nicolasdorier/nbxplorer:1.0.2.31 + expose: + - "32838" + environment: + NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} + NBXPLORER_BIND: 0.0.0.0:32838 + NBXPLORER_CHAINS: "ltc,btc" + NBXPLORER_LTCRPCURL: http://litecoind:43782/ + NBXPLORER_LTCNODEENDPOINT: litecoind:39388 + NBXPLORER_BTCRPCURL: http://bitcoind:43782/ + NBXPLORER_BTCNODEENDPOINT: bitcoind:39388 + volumes: + - "nbxplorer_datadir:/datadir" + - "litecoin_datadir:/root/.litecoin" + - "bitcoin_datadir:/root/.bitcoin" + links: + - litecoind + - bitcoind + postgres: + restart: unless-stopped + image: postgres:9.6.5 + volumes: + - "postgres_datadir:/var/lib/postgresql/data" + litecoind: + restart: unless-stopped + container_name: btcpayserver_litecoind + image: nicolasdorier/docker-litecoin:0.16.3 + environment: + BITCOIN_EXTRA_ARGS: | + rpcport=43782 + ${NBITCOIN_NETWORK:-regtest}=1 + port=39388 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 + whitelist=0.0.0.0/0 + expose: + - "43782" + - "39388" + - "28332" + - "28333" + volumes: + - "litecoin_datadir:/data" + bitcoind: + restart: unless-stopped + container_name: btcpayserver_bitcoind + image: nicolasdorier/docker-bitcoin:0.16.3 + environment: + BITCOIN_EXTRA_ARGS: | + rpcport=43782 + ${NBITCOIN_NETWORK:-regtest}=1 + port=39388 + whitelist=0.0.0.0/0 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 + expose: + - "43782" + - "39388" + - "28332" + - "28333" + volumes: + - "bitcoin_datadir:/data" +volumes: + nginx_conf: + nginx_vhost: + nginx_html: + nginx_certs: + postgres_datadir: + btcpay_datadir: + nbxplorer_datadir: + litecoin_datadir: + bitcoin_datadir: diff --git a/Production/docker-compose.btc.yml b/Production/docker-compose.btc.yml new file mode 100644 index 0000000..3d569ac --- /dev/null +++ b/Production/docker-compose.btc.yml @@ -0,0 +1,122 @@ +version: "3" +services: + nginx: + restart: unless-stopped + image: nginx:stable + container_name: nginx + ports: + - "80:80" + - "443:443" + volumes: + - "nginx_conf:/etc/nginx/conf.d" + - "nginx_vhost:/etc/nginx/vhost.d" + - "nginx_html:/usr/share/nginx/html" + - "nginx_certs:/etc/nginx/certs:ro" + links: + - btcpayserver + nginx-gen: + restart: unless-stopped + image: jwilder/docker-gen + container_name: nginx-gen + volumes: + - "/var/run/docker.sock:/tmp/docker.sock:ro" + - "./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro" + - "nginx_conf:/etc/nginx/conf.d" + - "nginx_vhost:/etc/nginx/vhost.d" + - "nginx_html:/usr/share/nginx/html" + - "nginx_certs:/etc/nginx/certs:ro" + entrypoint: /usr/local/bin/docker-gen -notify-sighup nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf + links: + - nginx + letsencrypt-nginx-proxy-companion: + restart: unless-stopped + image: jrcs/letsencrypt-nginx-proxy-companion + container_name: letsencrypt-nginx-proxy-companion + volumes: + - "/var/run/docker.sock:/var/run/docker.sock:ro" + - "nginx_conf:/etc/nginx/conf.d" + - "nginx_vhost:/etc/nginx/vhost.d" + - "nginx_html:/usr/share/nginx/html" + - "nginx_certs:/etc/nginx/certs:rw" + environment: + NGINX_DOCKER_GEN_CONTAINER: "nginx-gen" + NGINX_PROXY_CONTAINER: "nginx" + ACME_CA_URI: ${ACME_CA_URI:-https://acme-staging.api.letsencrypt.org/directory} + links: + - nginx-gen + btcpayserver: + restart: unless-stopped + image: nicolasdorier/btcpayserver:1.0.2.106 + expose: + - "49392" + environment: + BTCPAY_POSTGRES: User ID=postgres;Host=postgres;Port=5432;Database=btcpayserver${NBITCOIN_NETWORK:-regtest} + BTCPAY_NETWORK: ${NBITCOIN_NETWORK:-regtest} + BTCPAY_BIND: 0.0.0.0:49392 + BTCPAY_EXTERNALURL: ${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/ + BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} + BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} + BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} + VIRTUAL_NETWORK: nginx-proxy + VIRTUAL_PORT: 49392 + VIRTUAL_HOST: ${BTCPAY_HOST} + SSL_POLICY: Mozilla-Modern + LETSENCRYPT_HOST: ${BTCPAY_HOST} + LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} + BTCPAY_CHAINS: "btc" + BTCPAY_BTCEXPLORERURL: http://nbxplorer:32838/ + links: + - nbxplorer + - postgres + volumes: + - "btcpay_datadir:/datadir" + - "nbxplorer_datadir:/root/.nbxplorer" + nbxplorer: + restart: unless-stopped + image: nicolasdorier/nbxplorer:1.0.2.31 + expose: + - "32838" + environment: + NBXPLORER_NETWORK: ${NBITCOIN_NETWORK:-regtest} + NBXPLORER_BIND: 0.0.0.0:32838 + NBXPLORER_CHAINS: "btc" + NBXPLORER_BTCRPCURL: http://bitcoind:43782/ + NBXPLORER_BTCNODEENDPOINT: bitcoind:39388 + volumes: + - "nbxplorer_datadir:/datadir" + - "bitcoin_datadir:/root/.bitcoin" + links: + - bitcoind + postgres: + restart: unless-stopped + image: postgres:9.6.5 + volumes: + - "postgres_datadir:/var/lib/postgresql/data" + bitcoind: + restart: unless-stopped + container_name: btcpayserver_bitcoind + image: nicolasdorier/docker-bitcoin:0.16.3 + environment: + BITCOIN_EXTRA_ARGS: | + rpcport=43782 + ${NBITCOIN_NETWORK:-regtest}=1 + port=39388 + whitelist=0.0.0.0/0 + zmqpubrawblock=tcp://0.0.0.0:28332 + zmqpubrawtx=tcp://0.0.0.0:28333 + expose: + - "43782" + - "39388" + - "28332" + - "28333" + volumes: + - "bitcoin_datadir:/data" +volumes: + nginx_conf: + nginx_vhost: + nginx_html: + nginx_certs: + postgres_datadir: + btcpay_datadir: + nbxplorer_datadir: + bitcoin_datadir: diff --git a/btcpay-update.sh b/btcpay-update.sh index 327ab25..b9f6a5f 100755 --- a/btcpay-update.sh +++ b/btcpay-update.sh @@ -9,6 +9,11 @@ if [ ! -z $BTCPAY_DOCKER_COMPOSE ] && [ ! -z $DOWNLOAD_ROOT ] && [ -z $BTCPAYGEN exit fi +if [[ $BTCPAY_DOCKER_COMPOSE != *docker-compose.generated.yml ]]; then + echo "Your deployment is too old, you need to migrate by following instructions on this link https://github.com/btcpayserver/btcpayserver-docker/tree/master#i-deployed-before-btcpay-setupsh-existed-before-may-17-can-i-migrate-to-this-new-system" + exit +fi + cd "$BTCPAY_BASE_DIRECTORY/btcpayserver-docker" git pull --force From df0a784ab4516b6a592c8ae95335e50dc400b8f0 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Tue, 2 Oct 2018 11:32:00 +0900 Subject: [PATCH 43/85] Simplify script --- btcpay-update.sh | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/btcpay-update.sh b/btcpay-update.sh index b9f6a5f..895766b 100755 --- a/btcpay-update.sh +++ b/btcpay-update.sh @@ -17,14 +17,12 @@ fi cd "$BTCPAY_BASE_DIRECTORY/btcpayserver-docker" git pull --force -if [[ $BTCPAY_DOCKER_COMPOSE == *docker-compose.generated.yml ]]; then - # Generate the docker compose in BTCPAY_DOCKER_COMPOSE - . ./build.sh - if [ "$BTCPAYGEN_OLD_PREGEN" == "true" ]; then - cp Generated/docker-compose.generated.yml $BTCPAY_DOCKER_COMPOSE - fi +. ./build.sh +if [ "$BTCPAYGEN_OLD_PREGEN" == "true" ]; then + cp Generated/docker-compose.generated.yml $BTCPAY_DOCKER_COMPOSE fi + for scriptname in *.sh; do if [ "$scriptname" == "build.sh" ] || \ [ "$scriptname" == "build-pregen.sh" ] || \ From 1b8ecfeb976427124f17d43cb539f0a215f0e41b Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Tue, 2 Oct 2018 19:37:11 +0900 Subject: [PATCH 44/85] update dotnet version of docker-compose generator --- docker-compose-generator/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose-generator/Dockerfile b/docker-compose-generator/Dockerfile index 48fb91c..162d94e 100644 --- a/docker-compose-generator/Dockerfile +++ b/docker-compose-generator/Dockerfile @@ -1,4 +1,4 @@ -FROM microsoft/dotnet:2.1.300-sdk-alpine3.7 AS builder +FROM microsoft/dotnet:2.1.402-sdk-alpine3.7 AS builder WORKDIR /source COPY src/docker-compose-generator.csproj docker-compose-generator.csproj # Cache some dependencies @@ -6,7 +6,7 @@ RUN dotnet restore COPY src/. . RUN dotnet publish --output /app/ --configuration Release -FROM microsoft/dotnet:2.1.0-runtime-alpine3.7 +FROM microsoft/dotnet:2.1.4-runtime-alpine3.7 WORKDIR /app RUN mkdir /datadir From 048a3c2f4147081684cc229168ab0d61b2b91d09 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Tue, 2 Oct 2018 21:31:48 +0900 Subject: [PATCH 45/85] Fix space in yml --- .../docker-fragments/opt-save-storage-xs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/opt-save-storage-xs.yml b/docker-compose-generator/docker-fragments/opt-save-storage-xs.yml index 6f5e90a..8e32c8f 100644 --- a/docker-compose-generator/docker-fragments/opt-save-storage-xs.yml +++ b/docker-compose-generator/docker-fragments/opt-save-storage-xs.yml @@ -12,7 +12,7 @@ services: feathercoind: environment: BITCOIN_EXTRA_ARGS: prune=25000 - groestlcoind: + groestlcoind: environment: BITCOIN_EXTRA_ARGS: prune=25000 litecoind: From a8bed12a04bfaed80aee1871c6bd2c9b1d3a8b18 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Sat, 6 Oct 2018 23:24:36 +0900 Subject: [PATCH 46/85] bump --- docker-compose-generator/docker-fragments/btcpayserver.yml | 2 +- docker-compose-generator/docker-fragments/nbxplorer.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose-generator/docker-fragments/btcpayserver.yml b/docker-compose-generator/docker-fragments/btcpayserver.yml index 085ebc7..685287c 100644 --- a/docker-compose-generator/docker-fragments/btcpayserver.yml +++ b/docker-compose-generator/docker-fragments/btcpayserver.yml @@ -4,7 +4,7 @@ services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.106 + image: nicolasdorier/btcpayserver:1.0.2.108 expose: - "49392" environment: diff --git a/docker-compose-generator/docker-fragments/nbxplorer.yml b/docker-compose-generator/docker-fragments/nbxplorer.yml index 4edc651..389c3fe 100644 --- a/docker-compose-generator/docker-fragments/nbxplorer.yml +++ b/docker-compose-generator/docker-fragments/nbxplorer.yml @@ -4,7 +4,7 @@ services: nbxplorer: restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 + image: nicolasdorier/nbxplorer:1.0.3.1 expose: - "32838" environment: From 1dd783592dbb33a9e3ad9a49785adb2538e58c15 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Sun, 7 Oct 2018 17:15:43 +0900 Subject: [PATCH 47/85] downgrade nbxplorer --- docker-compose-generator/docker-fragments/nbxplorer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/nbxplorer.yml b/docker-compose-generator/docker-fragments/nbxplorer.yml index 389c3fe..4edc651 100644 --- a/docker-compose-generator/docker-fragments/nbxplorer.yml +++ b/docker-compose-generator/docker-fragments/nbxplorer.yml @@ -4,7 +4,7 @@ services: nbxplorer: restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.3.1 + image: nicolasdorier/nbxplorer:1.0.2.31 expose: - "32838" environment: From 3c7929e48649300794deb307b960fe34832f0b32 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Sun, 7 Oct 2018 23:13:05 +0900 Subject: [PATCH 48/85] bump --- docker-compose-generator/docker-fragments/nbxplorer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/nbxplorer.yml b/docker-compose-generator/docker-fragments/nbxplorer.yml index 4edc651..389c3fe 100644 --- a/docker-compose-generator/docker-fragments/nbxplorer.yml +++ b/docker-compose-generator/docker-fragments/nbxplorer.yml @@ -4,7 +4,7 @@ services: nbxplorer: restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.2.31 + image: nicolasdorier/nbxplorer:1.0.3.1 expose: - "32838" environment: From cf29c9ac3d426c8df436a2c0cf7bf924835ace8b Mon Sep 17 00:00:00 2001 From: Romano Date: Tue, 9 Oct 2018 16:53:17 +0200 Subject: [PATCH 49/85] docker-fragments Viacoin core 0.15.1 to 0.15.2 --- docker-compose-generator/docker-fragments/viacoin.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/viacoin.yml b/docker-compose-generator/docker-fragments/viacoin.yml index ef3daa9..ac03f79 100644 --- a/docker-compose-generator/docker-fragments/viacoin.yml +++ b/docker-compose-generator/docker-fragments/viacoin.yml @@ -4,7 +4,7 @@ services: viacoind: restart: unless-stopped container_name: btcpayserver_viacoind - image: romanornr/docker-viacoin:0.15.1 + image: romanornr/docker-viacoin:0.15.2 environment: BITCOIN_EXTRA_ARGS: | rpcport=43782 From 9da11d3704988993ef4dba9728b13984a189ebbb Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Thu, 11 Oct 2018 00:47:12 +0900 Subject: [PATCH 50/85] bump nbxplorer --- docker-compose-generator/docker-fragments/nbxplorer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/nbxplorer.yml b/docker-compose-generator/docker-fragments/nbxplorer.yml index 389c3fe..03fd63c 100644 --- a/docker-compose-generator/docker-fragments/nbxplorer.yml +++ b/docker-compose-generator/docker-fragments/nbxplorer.yml @@ -4,7 +4,7 @@ services: nbxplorer: restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.3.1 + image: nicolasdorier/nbxplorer:1.0.3.3 expose: - "32838" environment: From a7fa4fa08d899e05e21f207762f00f897d522c91 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Thu, 11 Oct 2018 00:55:53 +0900 Subject: [PATCH 51/85] bump --- docker-compose-generator/docker-fragments/btcpayserver.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/btcpayserver.yml b/docker-compose-generator/docker-fragments/btcpayserver.yml index 685287c..8534068 100644 --- a/docker-compose-generator/docker-fragments/btcpayserver.yml +++ b/docker-compose-generator/docker-fragments/btcpayserver.yml @@ -4,7 +4,7 @@ services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.108 + image: nicolasdorier/btcpayserver:1.0.2.109 expose: - "49392" environment: From 64a5c7a1aa612d9340144f24d57deeda7558b98f Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Fri, 12 Oct 2018 13:26:44 +0900 Subject: [PATCH 52/85] bump nbxplorer --- docker-compose-generator/docker-fragments/nbxplorer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/nbxplorer.yml b/docker-compose-generator/docker-fragments/nbxplorer.yml index 03fd63c..98df2c2 100644 --- a/docker-compose-generator/docker-fragments/nbxplorer.yml +++ b/docker-compose-generator/docker-fragments/nbxplorer.yml @@ -4,7 +4,7 @@ services: nbxplorer: restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.3.3 + image: nicolasdorier/nbxplorer:1.0.3.4 expose: - "32838" environment: From 1dd14a21b1c8cb80593c1b24b119445c2b180d0c Mon Sep 17 00:00:00 2001 From: Nicolas Dorier Date: Fri, 12 Oct 2018 13:43:31 +0900 Subject: [PATCH 53/85] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index da85b3c..33dd319 100644 --- a/README.md +++ b/README.md @@ -312,6 +312,8 @@ Yes, run the following commands to update: sudo su - cd $DOWNLOAD_ROOT/btcpayserver-docker +git checkout master +git pull git checkout 9acb5d8067cb5c46f59858137feb699b41ac9f19 btcpay-update.sh . ./btcpay-setup.sh -i From 6d0f6b811e3e3ab2c32a1e972df1fb83620162f7 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Fri, 12 Oct 2018 13:35:51 +0900 Subject: [PATCH 54/85] bump --- docker-compose-generator/docker-fragments/btcpayserver.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/btcpayserver.yml b/docker-compose-generator/docker-fragments/btcpayserver.yml index 8534068..83fd42e 100644 --- a/docker-compose-generator/docker-fragments/btcpayserver.yml +++ b/docker-compose-generator/docker-fragments/btcpayserver.yml @@ -4,7 +4,7 @@ services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.109 + image: nicolasdorier/btcpayserver:1.0.2.110 expose: - "49392" environment: From 3b12ed6ab288eac9b453231132756ffabd375196 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Fri, 12 Oct 2018 14:04:50 +0900 Subject: [PATCH 55/85] bump --- docker-compose-generator/docker-fragments/btcpayserver.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/btcpayserver.yml b/docker-compose-generator/docker-fragments/btcpayserver.yml index 83fd42e..542ff52 100644 --- a/docker-compose-generator/docker-fragments/btcpayserver.yml +++ b/docker-compose-generator/docker-fragments/btcpayserver.yml @@ -4,7 +4,7 @@ services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.110 + image: nicolasdorier/btcpayserver:1.0.2.111 expose: - "49392" environment: From 662baf4b2b9ed2297e4cb37acad0a56b1f6d5341 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Mon, 15 Oct 2018 18:24:46 +0900 Subject: [PATCH 56/85] bump --- docker-compose-generator/docker-fragments/btcpayserver.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/btcpayserver.yml b/docker-compose-generator/docker-fragments/btcpayserver.yml index 542ff52..d5f67df 100644 --- a/docker-compose-generator/docker-fragments/btcpayserver.yml +++ b/docker-compose-generator/docker-fragments/btcpayserver.yml @@ -4,7 +4,7 @@ services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.111 + image: nicolasdorier/btcpayserver:1.0.2.112 expose: - "49392" environment: From 7322af4508f65de54b6fb5a0265582c62e55f1e2 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Tue, 16 Oct 2018 13:37:00 +0900 Subject: [PATCH 57/85] update doc --- Production-NoReverseProxy/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Production-NoReverseProxy/README.md b/Production-NoReverseProxy/README.md index 6a7bc47..0593d45 100644 --- a/Production-NoReverseProxy/README.md +++ b/Production-NoReverseProxy/README.md @@ -33,7 +33,8 @@ With Powershell: $env:BTCPAY_ROOTPATH="/test"; $env:BTCPAY_PROTOCOL="http"; $env:BTCPAY_HOST="btcpay.example.com"; -docker-compose -f docker-compose.btc.yml up +.\build.ps1 +docker-compose -f "Generated/docker-compose.generated.yml" up --remove-orphans -d ``` With Linux: @@ -42,7 +43,8 @@ With Linux: export BTCPAY_ROOTPATH="/test" export BTCPAY_PROTOCOL="http" export BTCPAY_HOST="btcpay.example.com" -docker-compose -f docker-compose.btc.yml up +./build.sh +docker-compose -f "Generated/docker-compose.generated.yml" up --remove-orphans -d ``` Then edit your [host file](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) with From 2c9890a0c030cf7fcb1ca22d0ac0a087a2263dbc Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Wed, 17 Oct 2018 12:22:22 +0900 Subject: [PATCH 58/85] bump --- docker-compose-generator/docker-fragments/btcpayserver.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/btcpayserver.yml b/docker-compose-generator/docker-fragments/btcpayserver.yml index d5f67df..c3c46d3 100644 --- a/docker-compose-generator/docker-fragments/btcpayserver.yml +++ b/docker-compose-generator/docker-fragments/btcpayserver.yml @@ -4,7 +4,7 @@ services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.112 + image: nicolasdorier/btcpayserver:1.0.2.113 expose: - "49392" environment: From c6caa6a8ce297ea5c92f45ba1bfe9a29b909e73f Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Fri, 19 Oct 2018 01:53:01 +0900 Subject: [PATCH 59/85] bump --- .../docker-fragments/bitcoin-clightning.yml | 2 +- docker-compose-generator/docker-fragments/bitcoin.yml | 5 +++-- .../docker-fragments/litecoin-clightning.yml | 2 +- docker-compose-generator/docker-fragments/nbxplorer.yml | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docker-compose-generator/docker-fragments/bitcoin-clightning.yml b/docker-compose-generator/docker-fragments/bitcoin-clightning.yml index ceda8ec..86ebf91 100644 --- a/docker-compose-generator/docker-fragments/bitcoin-clightning.yml +++ b/docker-compose-generator/docker-fragments/bitcoin-clightning.yml @@ -2,7 +2,7 @@ version: "3" services: clightning_bitcoin: - image: nicolasdorier/clightning:v0.6.1 + image: nicolasdorier/clightning:v0.6.1-1 container_name: btcpayserver_clightning_bitcoin restart: unless-stopped environment: diff --git a/docker-compose-generator/docker-fragments/bitcoin.yml b/docker-compose-generator/docker-fragments/bitcoin.yml index f23221a..b41f881 100644 --- a/docker-compose-generator/docker-fragments/bitcoin.yml +++ b/docker-compose-generator/docker-fragments/bitcoin.yml @@ -4,11 +4,12 @@ services: bitcoind: restart: unless-stopped container_name: btcpayserver_bitcoind - image: nicolasdorier/docker-bitcoin:0.16.3 + image: nicolasdorier/docker-bitcoin:0.17.0 environment: + BITCOIN_NETWORK: ${NBITCOIN_NETWORK:-regtest} BITCOIN_EXTRA_ARGS: | + deprecatedrpc=signrawtransaction rpcport=43782 - ${NBITCOIN_NETWORK:-regtest}=1 port=39388 whitelist=0.0.0.0/0 expose: diff --git a/docker-compose-generator/docker-fragments/litecoin-clightning.yml b/docker-compose-generator/docker-fragments/litecoin-clightning.yml index 8156e08..1cdc815 100644 --- a/docker-compose-generator/docker-fragments/litecoin-clightning.yml +++ b/docker-compose-generator/docker-fragments/litecoin-clightning.yml @@ -2,7 +2,7 @@ version: "3" services: clightning_litecoin: - image: nicolasdorier/clightning:v0.6.1 + image: nicolasdorier/clightning:v0.6.1-1 container_name: btcpayserver_clightning_litecoin restart: unless-stopped environment: diff --git a/docker-compose-generator/docker-fragments/nbxplorer.yml b/docker-compose-generator/docker-fragments/nbxplorer.yml index 98df2c2..d77648d 100644 --- a/docker-compose-generator/docker-fragments/nbxplorer.yml +++ b/docker-compose-generator/docker-fragments/nbxplorer.yml @@ -4,7 +4,7 @@ services: nbxplorer: restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.3.4 + image: nicolasdorier/nbxplorer:1.0.3.5 expose: - "32838" environment: From 8a51da92ad2b84e0ec90ac6b0c5cfd786efd6543 Mon Sep 17 00:00:00 2001 From: rockstardev Date: Thu, 25 Oct 2018 21:14:28 -0500 Subject: [PATCH 60/85] Exposing LND Rest --- Production/nginx.tmpl | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Production/nginx.tmpl b/Production/nginx.tmpl index f47dc1e..84ffaf5 100644 --- a/Production/nginx.tmpl +++ b/Production/nginx.tmpl @@ -296,13 +296,17 @@ server { {{ else if (exists "/etc/nginx/vhost.d/default_location") }} include /etc/nginx/vhost.d/default_location; {{ end }} - } + } {{ range $container := $ }} {{ $serviceName := (index $container.Labels "com.docker.compose.service") }} {{ if (eq $serviceName "lnd_bitcoin") }} location /lnrpc.Lightning { - grpc_pass grpcs://lnd_bitcoin:10009; + grpc_pass grpcs://lnd_bitcoin:10009; + } + location /lnd-rest/btc/ { + rewrite ^/lnd-rest/btc/(.*) /$1 break; + proxy_pass http://lnd_bitcoin:8080/; } {{ end }} {{ end }} From 20d81831ccfd64c2d0e9cffb0311f59018a5585e Mon Sep 17 00:00:00 2001 From: rockstardev Date: Thu, 25 Oct 2018 21:31:41 -0500 Subject: [PATCH 61/85] Updating bitcoin-lnd fragment to provide external LND Rest info --- docker-compose-generator/docker-fragments/bitcoin-lnd.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose-generator/docker-fragments/bitcoin-lnd.yml b/docker-compose-generator/docker-fragments/bitcoin-lnd.yml index 74931cc..8048f15 100644 --- a/docker-compose-generator/docker-fragments/bitcoin-lnd.yml +++ b/docker-compose-generator/docker-fragments/bitcoin-lnd.yml @@ -39,6 +39,7 @@ services: environment: BTCPAY_BTCLIGHTNING: "type=lnd-rest;server=http://lnd_bitcoin:8080/;macaroonfilepath=/etc/lnd_bitcoin/admin.macaroon;allowinsecure=true" BTCPAY_BTCEXTERNALLNDGRPC: "type=lnd-grpc;server=${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/;macaroonfilepath=/etc/lnd_bitcoin/admin.macaroon" + BTCPAY_BTCEXTERNALLNDREST: "type=lnd-rest;server=${BTCPAY_PROTOCOL:-https}://${BTCPAY_HOST}/lnd-rest/btc/;macaroonfilepath=/etc/lnd_bitcoin/admin.macaroon" volumes: - "lnd_bitcoin_datadir:/etc/lnd_bitcoin" links: From 2186c9e8dcf7cd35925d3418c676904cb464d0ce Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Sat, 27 Oct 2018 23:42:34 +0900 Subject: [PATCH 62/85] bump --- docker-compose-generator/docker-fragments/btcpayserver.yml | 2 +- docker-compose-generator/docker-fragments/nbxplorer.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose-generator/docker-fragments/btcpayserver.yml b/docker-compose-generator/docker-fragments/btcpayserver.yml index c3c46d3..b52e468 100644 --- a/docker-compose-generator/docker-fragments/btcpayserver.yml +++ b/docker-compose-generator/docker-fragments/btcpayserver.yml @@ -4,7 +4,7 @@ services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.2.113 + image: nicolasdorier/btcpayserver:1.0.3.0 expose: - "49392" environment: diff --git a/docker-compose-generator/docker-fragments/nbxplorer.yml b/docker-compose-generator/docker-fragments/nbxplorer.yml index d77648d..d05c052 100644 --- a/docker-compose-generator/docker-fragments/nbxplorer.yml +++ b/docker-compose-generator/docker-fragments/nbxplorer.yml @@ -4,7 +4,7 @@ services: nbxplorer: restart: unless-stopped - image: nicolasdorier/nbxplorer:1.0.3.5 + image: nicolasdorier/nbxplorer:1.1.0.4 expose: - "32838" environment: From a5282a612480832df7186ac3f0f015593345cd24 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Sun, 28 Oct 2018 01:13:31 +0900 Subject: [PATCH 63/85] bump --- docker-compose-generator/docker-fragments/btcpayserver.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/btcpayserver.yml b/docker-compose-generator/docker-fragments/btcpayserver.yml index b52e468..da7b06f 100644 --- a/docker-compose-generator/docker-fragments/btcpayserver.yml +++ b/docker-compose-generator/docker-fragments/btcpayserver.yml @@ -4,7 +4,7 @@ services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.3.0 + image: nicolasdorier/btcpayserver:1.0.3.1 expose: - "49392" environment: From 3c123971f1474e207a95a6083f17ddf09230e295 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Sun, 28 Oct 2018 23:29:10 +0900 Subject: [PATCH 64/85] bump --- docker-compose-generator/docker-fragments/btcpayserver.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/btcpayserver.yml b/docker-compose-generator/docker-fragments/btcpayserver.yml index da7b06f..c084db4 100644 --- a/docker-compose-generator/docker-fragments/btcpayserver.yml +++ b/docker-compose-generator/docker-fragments/btcpayserver.yml @@ -4,7 +4,7 @@ services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.3.1 + image: nicolasdorier/btcpayserver:1.0.3.2 expose: - "49392" environment: From a26eae60db2025249fa66d0cbd00de83ed3669aa Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Tue, 30 Oct 2018 15:36:55 +0900 Subject: [PATCH 65/85] bump --- docker-compose-generator/docker-fragments/nbxplorer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/nbxplorer.yml b/docker-compose-generator/docker-fragments/nbxplorer.yml index d05c052..d264b7e 100644 --- a/docker-compose-generator/docker-fragments/nbxplorer.yml +++ b/docker-compose-generator/docker-fragments/nbxplorer.yml @@ -4,7 +4,7 @@ services: nbxplorer: restart: unless-stopped - image: nicolasdorier/nbxplorer:1.1.0.4 + image: nicolasdorier/nbxplorer:1.1.0.5 expose: - "32838" environment: From fb83b59a524521c8b297da3efceecf7481eef76b Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Wed, 31 Oct 2018 01:30:43 +0900 Subject: [PATCH 66/85] bump --- docker-compose-generator/docker-fragments/nbxplorer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/nbxplorer.yml b/docker-compose-generator/docker-fragments/nbxplorer.yml index d264b7e..9dce87d 100644 --- a/docker-compose-generator/docker-fragments/nbxplorer.yml +++ b/docker-compose-generator/docker-fragments/nbxplorer.yml @@ -4,7 +4,7 @@ services: nbxplorer: restart: unless-stopped - image: nicolasdorier/nbxplorer:1.1.0.5 + image: nicolasdorier/nbxplorer:1.1.0.6 expose: - "32838" environment: From 7b7fd05854429c46476978fe3029bd39c4ea0df4 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Wed, 31 Oct 2018 01:40:12 +0900 Subject: [PATCH 67/85] bump --- .../docker-fragments/bitcoin-clightning.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/bitcoin-clightning.yml b/docker-compose-generator/docker-fragments/bitcoin-clightning.yml index 86ebf91..2b1fc24 100644 --- a/docker-compose-generator/docker-fragments/bitcoin-clightning.yml +++ b/docker-compose-generator/docker-fragments/bitcoin-clightning.yml @@ -2,7 +2,7 @@ version: "3" services: clightning_bitcoin: - image: nicolasdorier/clightning:v0.6.1-1 + image: nicolasdorier/clightning:v0.6.2 container_name: btcpayserver_clightning_bitcoin restart: unless-stopped environment: From d1e2f91b9456f2170187c1a4b67626b71506a2f8 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Wed, 31 Oct 2018 01:40:20 +0900 Subject: [PATCH 68/85] bump --- .../docker-fragments/litecoin-clightning.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/litecoin-clightning.yml b/docker-compose-generator/docker-fragments/litecoin-clightning.yml index 1cdc815..6f031ce 100644 --- a/docker-compose-generator/docker-fragments/litecoin-clightning.yml +++ b/docker-compose-generator/docker-fragments/litecoin-clightning.yml @@ -2,7 +2,7 @@ version: "3" services: clightning_litecoin: - image: nicolasdorier/clightning:v0.6.1-1 + image: nicolasdorier/clightning:v0.6.2 container_name: btcpayserver_clightning_litecoin restart: unless-stopped environment: From 4704165b1ba28568902f683cd133fa96bef56d7b Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Wed, 31 Oct 2018 13:12:12 +0900 Subject: [PATCH 69/85] bump --- docker-compose-generator/docker-fragments/btcpayserver.yml | 2 +- docker-compose-generator/docker-fragments/nbxplorer.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose-generator/docker-fragments/btcpayserver.yml b/docker-compose-generator/docker-fragments/btcpayserver.yml index c084db4..f083c53 100644 --- a/docker-compose-generator/docker-fragments/btcpayserver.yml +++ b/docker-compose-generator/docker-fragments/btcpayserver.yml @@ -4,7 +4,7 @@ services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.3.2 + image: nicolasdorier/btcpayserver:1.0.3.3 expose: - "49392" environment: diff --git a/docker-compose-generator/docker-fragments/nbxplorer.yml b/docker-compose-generator/docker-fragments/nbxplorer.yml index 9dce87d..3632bdb 100644 --- a/docker-compose-generator/docker-fragments/nbxplorer.yml +++ b/docker-compose-generator/docker-fragments/nbxplorer.yml @@ -4,7 +4,7 @@ services: nbxplorer: restart: unless-stopped - image: nicolasdorier/nbxplorer:1.1.0.6 + image: nicolasdorier/nbxplorer:1.1.0.8 expose: - "32838" environment: From 8fa40913af348569f80274c1b81f35bbf90922ff Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Wed, 31 Oct 2018 13:19:23 +0900 Subject: [PATCH 70/85] bump .net --- docker-compose-generator/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose-generator/Dockerfile b/docker-compose-generator/Dockerfile index 162d94e..49e8be0 100644 --- a/docker-compose-generator/Dockerfile +++ b/docker-compose-generator/Dockerfile @@ -1,4 +1,4 @@ -FROM microsoft/dotnet:2.1.402-sdk-alpine3.7 AS builder +FROM microsoft/dotnet:2.1.403-sdk-alpine3.7 AS builder WORKDIR /source COPY src/docker-compose-generator.csproj docker-compose-generator.csproj # Cache some dependencies @@ -6,7 +6,7 @@ RUN dotnet restore COPY src/. . RUN dotnet publish --output /app/ --configuration Release -FROM microsoft/dotnet:2.1.4-runtime-alpine3.7 +FROM microsoft/dotnet:2.1.5-runtime-alpine3.7 WORKDIR /app RUN mkdir /datadir From 67d3795d7bf922cbfd46c89f3d07146d10024db2 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Wed, 31 Oct 2018 13:35:35 +0900 Subject: [PATCH 71/85] bump --- docker-compose-generator/docker-fragments/btcpayserver.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/btcpayserver.yml b/docker-compose-generator/docker-fragments/btcpayserver.yml index f083c53..dea7e56 100644 --- a/docker-compose-generator/docker-fragments/btcpayserver.yml +++ b/docker-compose-generator/docker-fragments/btcpayserver.yml @@ -4,7 +4,7 @@ services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.3.3 + image: nicolasdorier/btcpayserver:1.0.3.4 expose: - "49392" environment: From 0bb8f99272a79c61a9b018615826b64dcba11b44 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Wed, 31 Oct 2018 17:00:47 +0900 Subject: [PATCH 72/85] bump yml --- docker-compose-generator/src/docker-compose-generator.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/src/docker-compose-generator.csproj b/docker-compose-generator/src/docker-compose-generator.csproj index 2e96faf..2ecf0a4 100644 --- a/docker-compose-generator/src/docker-compose-generator.csproj +++ b/docker-compose-generator/src/docker-compose-generator.csproj @@ -7,6 +7,6 @@ - + From 288dde33beb7a565b7e192a68d22f255efe22ba6 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Fri, 2 Nov 2018 17:50:27 +0900 Subject: [PATCH 73/85] bump --- docker-compose-generator/docker-fragments/bitcoin-lnd.yml | 2 +- docker-compose-generator/docker-fragments/litecoin-lnd.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose-generator/docker-fragments/bitcoin-lnd.yml b/docker-compose-generator/docker-fragments/bitcoin-lnd.yml index 8048f15..dc38442 100644 --- a/docker-compose-generator/docker-fragments/bitcoin-lnd.yml +++ b/docker-compose-generator/docker-fragments/bitcoin-lnd.yml @@ -2,7 +2,7 @@ version: "3" services: lnd_bitcoin: - image: btcpayserver/lnd:0.5-beta + image: btcpayserver/lnd:0.5-beta-2 container_name: btcpayserver_lnd_bitcoin restart: unless-stopped environment: diff --git a/docker-compose-generator/docker-fragments/litecoin-lnd.yml b/docker-compose-generator/docker-fragments/litecoin-lnd.yml index ed96f06..ced78bd 100644 --- a/docker-compose-generator/docker-fragments/litecoin-lnd.yml +++ b/docker-compose-generator/docker-fragments/litecoin-lnd.yml @@ -2,7 +2,7 @@ version: "3" services: lnd_litecoin: - image: btcpayserver/lnd:0.5-beta + image: btcpayserver/lnd:0.5-beta-2 container_name: btcpayserver_lnd_litecoin restart: unless-stopped environment: From f43d7c9681078892aa3222d768058db712c75a93 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Fri, 2 Nov 2018 19:22:51 +0900 Subject: [PATCH 74/85] bump --- .../docker-fragments/bitcoin-clightning.yml | 2 +- .../docker-fragments/litecoin-clightning.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose-generator/docker-fragments/bitcoin-clightning.yml b/docker-compose-generator/docker-fragments/bitcoin-clightning.yml index 2b1fc24..6bbc348 100644 --- a/docker-compose-generator/docker-fragments/bitcoin-clightning.yml +++ b/docker-compose-generator/docker-fragments/bitcoin-clightning.yml @@ -2,7 +2,7 @@ version: "3" services: clightning_bitcoin: - image: nicolasdorier/clightning:v0.6.2 + image: nicolasdorier/clightning:v0.6.2-3-dev container_name: btcpayserver_clightning_bitcoin restart: unless-stopped environment: diff --git a/docker-compose-generator/docker-fragments/litecoin-clightning.yml b/docker-compose-generator/docker-fragments/litecoin-clightning.yml index 6f031ce..cfeed26 100644 --- a/docker-compose-generator/docker-fragments/litecoin-clightning.yml +++ b/docker-compose-generator/docker-fragments/litecoin-clightning.yml @@ -2,7 +2,7 @@ version: "3" services: clightning_litecoin: - image: nicolasdorier/clightning:v0.6.2 + image: nicolasdorier/clightning:v0.6.2-3-dev container_name: btcpayserver_clightning_litecoin restart: unless-stopped environment: From 6e55cc42dd4d00ba95adc535a1148dd9c454f955 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Fri, 2 Nov 2018 19:34:48 +0900 Subject: [PATCH 75/85] do not use dev time images in prod --- .../docker-fragments/bitcoin-clightning.yml | 2 +- .../docker-fragments/litecoin-clightning.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose-generator/docker-fragments/bitcoin-clightning.yml b/docker-compose-generator/docker-fragments/bitcoin-clightning.yml index 6bbc348..5138b20 100644 --- a/docker-compose-generator/docker-fragments/bitcoin-clightning.yml +++ b/docker-compose-generator/docker-fragments/bitcoin-clightning.yml @@ -2,7 +2,7 @@ version: "3" services: clightning_bitcoin: - image: nicolasdorier/clightning:v0.6.2-3-dev + image: nicolasdorier/clightning:v0.6.2-3 container_name: btcpayserver_clightning_bitcoin restart: unless-stopped environment: diff --git a/docker-compose-generator/docker-fragments/litecoin-clightning.yml b/docker-compose-generator/docker-fragments/litecoin-clightning.yml index cfeed26..194f727 100644 --- a/docker-compose-generator/docker-fragments/litecoin-clightning.yml +++ b/docker-compose-generator/docker-fragments/litecoin-clightning.yml @@ -2,7 +2,7 @@ version: "3" services: clightning_litecoin: - image: nicolasdorier/clightning:v0.6.2-3-dev + image: nicolasdorier/clightning:v0.6.2-3 container_name: btcpayserver_clightning_litecoin restart: unless-stopped environment: From c614e6a6fd4f5ea02159cc5b66b2d4f341854961 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Mon, 5 Nov 2018 12:28:08 +0900 Subject: [PATCH 76/85] bump btcpay --- docker-compose-generator/docker-fragments/btcpayserver.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/btcpayserver.yml b/docker-compose-generator/docker-fragments/btcpayserver.yml index dea7e56..037eb7c 100644 --- a/docker-compose-generator/docker-fragments/btcpayserver.yml +++ b/docker-compose-generator/docker-fragments/btcpayserver.yml @@ -4,7 +4,7 @@ services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.3.4 + image: nicolasdorier/btcpayserver:1.0.3.6 expose: - "49392" environment: From 141fe6809a9bee2529d4eb9b5aaf17bcd3d1f05b Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Mon, 5 Nov 2018 14:09:06 +0900 Subject: [PATCH 77/85] bump --- docker-compose-generator/docker-fragments/nbxplorer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/nbxplorer.yml b/docker-compose-generator/docker-fragments/nbxplorer.yml index 3632bdb..ee17d2d 100644 --- a/docker-compose-generator/docker-fragments/nbxplorer.yml +++ b/docker-compose-generator/docker-fragments/nbxplorer.yml @@ -4,7 +4,7 @@ services: nbxplorer: restart: unless-stopped - image: nicolasdorier/nbxplorer:1.1.0.8 + image: nicolasdorier/nbxplorer:1.1.0.11 expose: - "32838" environment: From 1eed2e6febcc4fd382a911ec6ec740cb746de404 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Mon, 5 Nov 2018 17:27:09 +0900 Subject: [PATCH 78/85] bump --- docker-compose-generator/docker-fragments/btcpayserver.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/btcpayserver.yml b/docker-compose-generator/docker-fragments/btcpayserver.yml index 037eb7c..8f9505e 100644 --- a/docker-compose-generator/docker-fragments/btcpayserver.yml +++ b/docker-compose-generator/docker-fragments/btcpayserver.yml @@ -4,7 +4,7 @@ services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.3.6 + image: nicolasdorier/btcpayserver:1.0.3.7 expose: - "49392" environment: From 487565658a25c9114e68160f6adc13b8ec586194 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Mon, 5 Nov 2018 18:24:53 +0900 Subject: [PATCH 79/85] Give timeout to stop docker-compose, SIGKILL clightning --- btcpay-down.sh | 2 +- btcpay-restart.sh | 4 ++-- btcpay-setup.sh | 8 ++++---- btcpay-up.sh | 2 +- btcpay-update.sh | 2 +- changedomain.sh | 2 +- .../docker-fragments/bitcoin-clightning.yml | 1 + .../docker-fragments/litecoin-clightning.yml | 1 + 8 files changed, 12 insertions(+), 10 deletions(-) diff --git a/btcpay-down.sh b/btcpay-down.sh index 75dde3e..392631d 100755 --- a/btcpay-down.sh +++ b/btcpay-down.sh @@ -3,4 +3,4 @@ . /etc/profile.d/btcpay-env.sh cd "`dirname $BTCPAY_ENV_FILE`" -docker-compose -f $BTCPAY_DOCKER_COMPOSE down +docker-compose -f $BTCPAY_DOCKER_COMPOSE down -t 180 diff --git a/btcpay-restart.sh b/btcpay-restart.sh index 76e227c..3d83ac1 100755 --- a/btcpay-restart.sh +++ b/btcpay-restart.sh @@ -3,5 +3,5 @@ . /etc/profile.d/btcpay-env.sh cd "`dirname $BTCPAY_ENV_FILE`" -docker-compose -f $BTCPAY_DOCKER_COMPOSE down -docker-compose -f $BTCPAY_DOCKER_COMPOSE up -d +docker-compose -f $BTCPAY_DOCKER_COMPOSE down -t 180 +docker-compose -f $BTCPAY_DOCKER_COMPOSE up -d -t 180 diff --git a/btcpay-setup.sh b/btcpay-setup.sh index f5756d4..ca3beb9 100755 --- a/btcpay-setup.sh +++ b/btcpay-setup.sh @@ -270,9 +270,9 @@ Requires=docker.service network-online.target Type=oneshot RemainAfterExit=yes -ExecStart=/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"\$(dirname \$BTCPAY_ENV_FILE)\" && docker-compose -f \"\$BTCPAY_DOCKER_COMPOSE\" up -d' +ExecStart=/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"\$(dirname \$BTCPAY_ENV_FILE)\" && docker-compose -f \"\$BTCPAY_DOCKER_COMPOSE\" up -d -t 180' ExecStop=/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"\$(dirname \$BTCPAY_ENV_FILE)\" && docker-compose -f \"\$BTCPAY_DOCKER_COMPOSE\" stop' -ExecReload=/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"\$(dirname \$BTCPAY_ENV_FILE)\" && docker-compose -f \"\$BTCPAY_DOCKER_COMPOSE\" restart' +ExecReload=/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"\$(dirname \$BTCPAY_ENV_FILE)\" && docker-compose -f \"\$BTCPAY_DOCKER_COMPOSE\" restart -t 180' [Install] WantedBy=multi-user.target" > /etc/systemd/system/btcpayserver.service @@ -299,7 +299,7 @@ stop on runlevel [!2345] script . /etc/profile.d/btcpay-env.sh cd \"\$(dirname \$BTCPAY_ENV_FILE)\" - docker-compose -f \"\$BTCPAY_DOCKER_COMPOSE\" up -d + docker-compose -f \"\$BTCPAY_DOCKER_COMPOSE\" up -d -t 180 end script" > /etc/init/start_containers.conf echo -e "BTCPay Server upstart configured in /etc/init/start_containers.conf\n" initctl reload-configuration @@ -313,7 +313,7 @@ if [ ! -z "$OLD_BTCPAY_DOCKER_COMPOSE" ] && [ "$OLD_BTCPAY_DOCKER_COMPOSE" != "$ docker-compose -f "$OLD_BTCPAY_DOCKER_COMPOSE" down fi -docker-compose -f "$BTCPAY_DOCKER_COMPOSE" up -d --remove-orphans +docker-compose -f "$BTCPAY_DOCKER_COMPOSE" up -d --remove-orphans -t 180 # Give SSH key to BTCPay if [[ -f "$BTCPAY_HOST_SSHKEYFILE" ]]; then diff --git a/btcpay-up.sh b/btcpay-up.sh index 4a799ca..d3e6c28 100755 --- a/btcpay-up.sh +++ b/btcpay-up.sh @@ -3,4 +3,4 @@ . /etc/profile.d/btcpay-env.sh cd "`dirname $BTCPAY_ENV_FILE`" -docker-compose -f $BTCPAY_DOCKER_COMPOSE up --remove-orphans -d +docker-compose -f $BTCPAY_DOCKER_COMPOSE up --remove-orphans -d -t 180 diff --git a/btcpay-update.sh b/btcpay-update.sh index 895766b..361f2fe 100755 --- a/btcpay-update.sh +++ b/btcpay-update.sh @@ -36,4 +36,4 @@ for scriptname in *.sh; do done cd "`dirname $BTCPAY_ENV_FILE`" -docker-compose -f $BTCPAY_DOCKER_COMPOSE up -d --remove-orphans +docker-compose -f $BTCPAY_DOCKER_COMPOSE up -d --remove-orphans -t 180 diff --git a/changedomain.sh b/changedomain.sh index adde316..e871450 100755 --- a/changedomain.sh +++ b/changedomain.sh @@ -20,5 +20,5 @@ echo "BTCPAY_HOST=$BTCPAY_HOST" >> "$BTCPAY_ENV_FILE" echo "ACME_CA_URI=$ACME_CA_URI" >> "$BTCPAY_ENV_FILE" cd "`dirname $BTCPAY_ENV_FILE`" -docker-compose -f "$BTCPAY_DOCKER_COMPOSE" up -d +docker-compose -f "$BTCPAY_DOCKER_COMPOSE" up -d -t 180 fi diff --git a/docker-compose-generator/docker-fragments/bitcoin-clightning.yml b/docker-compose-generator/docker-fragments/bitcoin-clightning.yml index 5138b20..05a3db6 100644 --- a/docker-compose-generator/docker-fragments/bitcoin-clightning.yml +++ b/docker-compose-generator/docker-fragments/bitcoin-clightning.yml @@ -3,6 +3,7 @@ version: "3" services: clightning_bitcoin: image: nicolasdorier/clightning:v0.6.2-3 + stop_signal: SIGKILL container_name: btcpayserver_clightning_bitcoin restart: unless-stopped environment: diff --git a/docker-compose-generator/docker-fragments/litecoin-clightning.yml b/docker-compose-generator/docker-fragments/litecoin-clightning.yml index 194f727..d5e70d8 100644 --- a/docker-compose-generator/docker-fragments/litecoin-clightning.yml +++ b/docker-compose-generator/docker-fragments/litecoin-clightning.yml @@ -3,6 +3,7 @@ version: "3" services: clightning_litecoin: image: nicolasdorier/clightning:v0.6.2-3 + stop_signal: SIGKILL container_name: btcpayserver_clightning_litecoin restart: unless-stopped environment: From ac4263d71aa57fe7d7504e264cb13dbae517eb36 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Mon, 5 Nov 2018 18:28:01 +0900 Subject: [PATCH 80/85] Revert "Give timeout to stop docker-compose, SIGKILL clightning" This reverts commit 487565658a25c9114e68160f6adc13b8ec586194. --- btcpay-down.sh | 2 +- btcpay-restart.sh | 4 ++-- btcpay-setup.sh | 8 ++++---- btcpay-up.sh | 2 +- btcpay-update.sh | 2 +- changedomain.sh | 2 +- .../docker-fragments/bitcoin-clightning.yml | 1 - .../docker-fragments/litecoin-clightning.yml | 1 - 8 files changed, 10 insertions(+), 12 deletions(-) diff --git a/btcpay-down.sh b/btcpay-down.sh index 392631d..75dde3e 100755 --- a/btcpay-down.sh +++ b/btcpay-down.sh @@ -3,4 +3,4 @@ . /etc/profile.d/btcpay-env.sh cd "`dirname $BTCPAY_ENV_FILE`" -docker-compose -f $BTCPAY_DOCKER_COMPOSE down -t 180 +docker-compose -f $BTCPAY_DOCKER_COMPOSE down diff --git a/btcpay-restart.sh b/btcpay-restart.sh index 3d83ac1..76e227c 100755 --- a/btcpay-restart.sh +++ b/btcpay-restart.sh @@ -3,5 +3,5 @@ . /etc/profile.d/btcpay-env.sh cd "`dirname $BTCPAY_ENV_FILE`" -docker-compose -f $BTCPAY_DOCKER_COMPOSE down -t 180 -docker-compose -f $BTCPAY_DOCKER_COMPOSE up -d -t 180 +docker-compose -f $BTCPAY_DOCKER_COMPOSE down +docker-compose -f $BTCPAY_DOCKER_COMPOSE up -d diff --git a/btcpay-setup.sh b/btcpay-setup.sh index ca3beb9..f5756d4 100755 --- a/btcpay-setup.sh +++ b/btcpay-setup.sh @@ -270,9 +270,9 @@ Requires=docker.service network-online.target Type=oneshot RemainAfterExit=yes -ExecStart=/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"\$(dirname \$BTCPAY_ENV_FILE)\" && docker-compose -f \"\$BTCPAY_DOCKER_COMPOSE\" up -d -t 180' +ExecStart=/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"\$(dirname \$BTCPAY_ENV_FILE)\" && docker-compose -f \"\$BTCPAY_DOCKER_COMPOSE\" up -d' ExecStop=/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"\$(dirname \$BTCPAY_ENV_FILE)\" && docker-compose -f \"\$BTCPAY_DOCKER_COMPOSE\" stop' -ExecReload=/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"\$(dirname \$BTCPAY_ENV_FILE)\" && docker-compose -f \"\$BTCPAY_DOCKER_COMPOSE\" restart -t 180' +ExecReload=/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"\$(dirname \$BTCPAY_ENV_FILE)\" && docker-compose -f \"\$BTCPAY_DOCKER_COMPOSE\" restart' [Install] WantedBy=multi-user.target" > /etc/systemd/system/btcpayserver.service @@ -299,7 +299,7 @@ stop on runlevel [!2345] script . /etc/profile.d/btcpay-env.sh cd \"\$(dirname \$BTCPAY_ENV_FILE)\" - docker-compose -f \"\$BTCPAY_DOCKER_COMPOSE\" up -d -t 180 + docker-compose -f \"\$BTCPAY_DOCKER_COMPOSE\" up -d end script" > /etc/init/start_containers.conf echo -e "BTCPay Server upstart configured in /etc/init/start_containers.conf\n" initctl reload-configuration @@ -313,7 +313,7 @@ if [ ! -z "$OLD_BTCPAY_DOCKER_COMPOSE" ] && [ "$OLD_BTCPAY_DOCKER_COMPOSE" != "$ docker-compose -f "$OLD_BTCPAY_DOCKER_COMPOSE" down fi -docker-compose -f "$BTCPAY_DOCKER_COMPOSE" up -d --remove-orphans -t 180 +docker-compose -f "$BTCPAY_DOCKER_COMPOSE" up -d --remove-orphans # Give SSH key to BTCPay if [[ -f "$BTCPAY_HOST_SSHKEYFILE" ]]; then diff --git a/btcpay-up.sh b/btcpay-up.sh index d3e6c28..4a799ca 100755 --- a/btcpay-up.sh +++ b/btcpay-up.sh @@ -3,4 +3,4 @@ . /etc/profile.d/btcpay-env.sh cd "`dirname $BTCPAY_ENV_FILE`" -docker-compose -f $BTCPAY_DOCKER_COMPOSE up --remove-orphans -d -t 180 +docker-compose -f $BTCPAY_DOCKER_COMPOSE up --remove-orphans -d diff --git a/btcpay-update.sh b/btcpay-update.sh index 361f2fe..895766b 100755 --- a/btcpay-update.sh +++ b/btcpay-update.sh @@ -36,4 +36,4 @@ for scriptname in *.sh; do done cd "`dirname $BTCPAY_ENV_FILE`" -docker-compose -f $BTCPAY_DOCKER_COMPOSE up -d --remove-orphans -t 180 +docker-compose -f $BTCPAY_DOCKER_COMPOSE up -d --remove-orphans diff --git a/changedomain.sh b/changedomain.sh index e871450..adde316 100755 --- a/changedomain.sh +++ b/changedomain.sh @@ -20,5 +20,5 @@ echo "BTCPAY_HOST=$BTCPAY_HOST" >> "$BTCPAY_ENV_FILE" echo "ACME_CA_URI=$ACME_CA_URI" >> "$BTCPAY_ENV_FILE" cd "`dirname $BTCPAY_ENV_FILE`" -docker-compose -f "$BTCPAY_DOCKER_COMPOSE" up -d -t 180 +docker-compose -f "$BTCPAY_DOCKER_COMPOSE" up -d fi diff --git a/docker-compose-generator/docker-fragments/bitcoin-clightning.yml b/docker-compose-generator/docker-fragments/bitcoin-clightning.yml index 05a3db6..5138b20 100644 --- a/docker-compose-generator/docker-fragments/bitcoin-clightning.yml +++ b/docker-compose-generator/docker-fragments/bitcoin-clightning.yml @@ -3,7 +3,6 @@ version: "3" services: clightning_bitcoin: image: nicolasdorier/clightning:v0.6.2-3 - stop_signal: SIGKILL container_name: btcpayserver_clightning_bitcoin restart: unless-stopped environment: diff --git a/docker-compose-generator/docker-fragments/litecoin-clightning.yml b/docker-compose-generator/docker-fragments/litecoin-clightning.yml index d5e70d8..194f727 100644 --- a/docker-compose-generator/docker-fragments/litecoin-clightning.yml +++ b/docker-compose-generator/docker-fragments/litecoin-clightning.yml @@ -3,7 +3,6 @@ version: "3" services: clightning_litecoin: image: nicolasdorier/clightning:v0.6.2-3 - stop_signal: SIGKILL container_name: btcpayserver_clightning_litecoin restart: unless-stopped environment: From c76ec5930a42e333f1ba9a2a6087ccbb1a5cf8f6 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Mon, 5 Nov 2018 18:29:50 +0900 Subject: [PATCH 81/85] SIGKILL clightning --- docker-compose-generator/docker-fragments/bitcoin-clightning.yml | 1 + .../docker-fragments/litecoin-clightning.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/docker-compose-generator/docker-fragments/bitcoin-clightning.yml b/docker-compose-generator/docker-fragments/bitcoin-clightning.yml index 5138b20..05a3db6 100644 --- a/docker-compose-generator/docker-fragments/bitcoin-clightning.yml +++ b/docker-compose-generator/docker-fragments/bitcoin-clightning.yml @@ -3,6 +3,7 @@ version: "3" services: clightning_bitcoin: image: nicolasdorier/clightning:v0.6.2-3 + stop_signal: SIGKILL container_name: btcpayserver_clightning_bitcoin restart: unless-stopped environment: diff --git a/docker-compose-generator/docker-fragments/litecoin-clightning.yml b/docker-compose-generator/docker-fragments/litecoin-clightning.yml index 194f727..d5e70d8 100644 --- a/docker-compose-generator/docker-fragments/litecoin-clightning.yml +++ b/docker-compose-generator/docker-fragments/litecoin-clightning.yml @@ -3,6 +3,7 @@ version: "3" services: clightning_litecoin: image: nicolasdorier/clightning:v0.6.2-3 + stop_signal: SIGKILL container_name: btcpayserver_clightning_litecoin restart: unless-stopped environment: From 00abab4a3628f04857d0b5d47e7deda274db6b81 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Mon, 5 Nov 2018 18:33:11 +0900 Subject: [PATCH 82/85] Add compose timeout --- btcpay-setup.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/btcpay-setup.sh b/btcpay-setup.sh index f5756d4..6973104 100755 --- a/btcpay-setup.sh +++ b/btcpay-setup.sh @@ -163,6 +163,7 @@ fi # Put the variables in /etc/profile.d when a user log interactively touch "/etc/profile.d/btcpay-env.sh" echo " +export COMPOSE_HTTP_TIMEOUT=\"180\" export BTCPAYGEN_OLD_PREGEN=\"$BTCPAYGEN_OLD_PREGEN\" export BTCPAYGEN_CRYPTO1=\"$BTCPAYGEN_CRYPTO1\" export BTCPAYGEN_CRYPTO2=\"$BTCPAYGEN_CRYPTO2\" From 65094aa30b7b14fdfae0244f4e1dceb97af88c44 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Mon, 5 Nov 2018 18:41:05 +0900 Subject: [PATCH 83/85] Add COMPOSE_HTTP_TIMEOUT at the next update --- btcpay-update.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/btcpay-update.sh b/btcpay-update.sh index 895766b..9aeb146 100755 --- a/btcpay-update.sh +++ b/btcpay-update.sh @@ -22,6 +22,11 @@ if [ "$BTCPAYGEN_OLD_PREGEN" == "true" ]; then cp Generated/docker-compose.generated.yml $BTCPAY_DOCKER_COMPOSE fi +if ! grep -Fxq "export COMPOSE_HTTP_TIMEOUT=\"180\"" "/etc/profile.d/btcpay-env.sh"; then + echo "export COMPOSE_HTTP_TIMEOUT=\"180\"" >> /etc/profile.d/btcpay-env.sh + export COMPOSE_HTTP_TIMEOUT=180 + echo "Adding COMPOSE_HTTP_TIMEOUT=180 in btcpay-env.sh" +fi for scriptname in *.sh; do if [ "$scriptname" == "build.sh" ] || \ From 9d7b96a2402ef47be947530bb5687ed7b366e3c0 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Fri, 9 Nov 2018 15:49:16 +0900 Subject: [PATCH 84/85] bump nbx --- docker-compose-generator/docker-fragments/nbxplorer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-generator/docker-fragments/nbxplorer.yml b/docker-compose-generator/docker-fragments/nbxplorer.yml index ee17d2d..3ab7dd8 100644 --- a/docker-compose-generator/docker-fragments/nbxplorer.yml +++ b/docker-compose-generator/docker-fragments/nbxplorer.yml @@ -4,7 +4,7 @@ services: nbxplorer: restart: unless-stopped - image: nicolasdorier/nbxplorer:1.1.0.11 + image: nicolasdorier/nbxplorer:1.1.0.12 expose: - "32838" environment: From 4675e02b72c9a66713b21564f5cc4f4d58119642 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Fri, 9 Nov 2018 21:39:44 +0900 Subject: [PATCH 85/85] bump --- docker-compose-generator/docker-fragments/btcpayserver.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose-generator/docker-fragments/btcpayserver.yml b/docker-compose-generator/docker-fragments/btcpayserver.yml index 8f9505e..b1eecb5 100644 --- a/docker-compose-generator/docker-fragments/btcpayserver.yml +++ b/docker-compose-generator/docker-fragments/btcpayserver.yml @@ -4,7 +4,7 @@ services: btcpayserver: restart: unless-stopped - image: nicolasdorier/btcpayserver:1.0.3.7 + image: nicolasdorier/btcpayserver:1.0.3.8 expose: - "49392" environment: @@ -16,7 +16,7 @@ services: BTCPAY_ROOTPATH: ${BTCPAY_ROOTPATH:-/} BTCPAY_SSHTRUSTEDFINGERPRINTS: ${BTCPAY_SSHTRUSTEDFINGERPRINTS} BTCPAY_SSHKEYFILE: ${BTCPAY_SSHKEYFILE} - + BTCPAY_DEBUGLOG: btcpay.log links: - nbxplorer - postgres