albyhub: build from sovran fork tag (LND-only, no frontend)
This commit is contained in:
@@ -1,13 +0,0 @@
|
|||||||
diff --git a/lnclient/lnd/lnd.go b/lnclient/lnd/lnd.go
|
|
||||||
index bad532f..ba35b7b 100644
|
|
||||||
--- a/lnclient/lnd/lnd.go
|
|
||||||
+++ b/lnclient/lnd/lnd.go
|
|
||||||
@@ -708,7 +708,7 @@ func (svc *LNDService) MakeInvoice(ctx context.Context, amountMsat int64, descri
|
|
||||||
DescriptionHash: descriptionHashBytes,
|
|
||||||
Expiry: expiry,
|
|
||||||
RouteHints: hints,
|
|
||||||
- Private: !hasPublicChannels, // use private channel hints in the invoice
|
|
||||||
+ Private: true, // always include private channel hints in the invoice
|
|
||||||
}
|
|
||||||
|
|
||||||
resp, err := svc.client.AddInvoice(ctx, addInvoiceRequest)
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
diff --git a/cmd/http/main.go b/cmd/http/main.go
|
|
||||||
index ed31f96..4d31212 100644
|
|
||||||
--- a/cmd/http/main.go
|
|
||||||
+++ b/cmd/http/main.go
|
|
||||||
@@ -2,8 +2,8 @@ package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
- "fmt"
|
|
||||||
nethttp "net/http"
|
|
||||||
+ "net"
|
|
||||||
"os"
|
|
||||||
"os/signal"
|
|
||||||
"syscall"
|
|
||||||
@@ -51,8 +51,9 @@ func main() {
|
|
||||||
httpSvc := http.NewHttpService(svc, svc.GetEventPublisher())
|
|
||||||
httpSvc.RegisterSharedRoutes(e)
|
|
||||||
//start Echo server
|
|
||||||
+ bindAddress := net.JoinHostPort(svc.GetConfig().GetEnv().Host, svc.GetConfig().GetEnv().Port)
|
|
||||||
go func() {
|
|
||||||
- if err := e.Start(fmt.Sprintf(":%v", svc.GetConfig().GetEnv().Port)); err != nil && err != nethttp.ErrServerClosed {
|
|
||||||
+ if err := e.Start(bindAddress); err != nil && err != nethttp.ErrServerClosed {
|
|
||||||
logger.Logger.WithError(err).Error("echo server failed to start")
|
|
||||||
cancel()
|
|
||||||
}
|
|
||||||
diff --git a/config/models.go b/config/models.go
|
|
||||||
index 0fb8870..dc11afd 100644
|
|
||||||
--- a/config/models.go
|
|
||||||
+++ b/config/models.go
|
|
||||||
@@ -24,6 +24,7 @@ type AppConfig struct {
|
|
||||||
LNDAddress string `envconfig:"LND_ADDRESS"`
|
|
||||||
LNDCertFile string `envconfig:"LND_CERT_FILE"`
|
|
||||||
LNDMacaroonFile string `envconfig:"LND_MACAROON_FILE"`
|
|
||||||
+ Host string `envconfig:"HOST" default:"127.0.0.1"`
|
|
||||||
Workdir string `envconfig:"WORK_DIR"`
|
|
||||||
Port string `envconfig:"PORT" default:"8080"`
|
|
||||||
DatabaseUri string `envconfig:"DATABASE_URI" default:"nwc.db"`
|
|
||||||
@@ -1,141 +0,0 @@
|
|||||||
diff --git a/service/start.go b/service/start.go
|
|
||||||
index 8c9786a..4b992c7 100644
|
|
||||||
--- a/service/start.go
|
|
||||||
+++ b/service/start.go
|
|
||||||
@@ -5,7 +5,6 @@ import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"net/http"
|
|
||||||
- "path"
|
|
||||||
"strconv"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
@@ -349,63 +348,12 @@ func (svc *service) launchLNBackend(ctx context.Context, encryptionKey string) e
|
|
||||||
logger.Logger.Infof("Launching LN Backend: %s", lnBackend)
|
|
||||||
var lnClient lnclient.LNClient
|
|
||||||
var err error
|
|
||||||
- vssEnabled := false
|
|
||||||
switch lnBackend {
|
|
||||||
case config.LNDBackendType:
|
|
||||||
LNDAddress, _ := svc.cfg.Get("LNDAddress", encryptionKey)
|
|
||||||
LNDCertHex, _ := svc.cfg.Get("LNDCertHex", encryptionKey)
|
|
||||||
LNDMacaroonHex, _ := svc.cfg.Get("LNDMacaroonHex", encryptionKey)
|
|
||||||
lnClient, err = lnd.NewLNDService(ctx, svc.eventPublisher, LNDAddress, LNDCertHex, LNDMacaroonHex)
|
|
||||||
- case config.LDKBackendType:
|
|
||||||
- mnemonic, _ := svc.cfg.Get("Mnemonic", encryptionKey)
|
|
||||||
- ldkWorkdir := path.Join(svc.cfg.GetEnv().Workdir, "ldk")
|
|
||||||
- var vssToken string
|
|
||||||
- vssToken, err = svc.requestVssToken(ctx)
|
|
||||||
- if err != nil {
|
|
||||||
- logger.Logger.WithError(err).Error("Failed to request VSS token")
|
|
||||||
- return err
|
|
||||||
- }
|
|
||||||
- vssEnabled = vssToken != ""
|
|
||||||
-
|
|
||||||
- svc.startupState = "Launching Node"
|
|
||||||
- setStartupState := func(startupState string) {
|
|
||||||
- svc.startupState = startupState
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- channelPeerSuggestions, suggestionsErr := svc.albySvc.GetChannelPeerSuggestions(ctx)
|
|
||||||
- if suggestionsErr != nil {
|
|
||||||
- logger.Logger.WithError(suggestionsErr).Warn("Failed to fetch channel peer suggestions for LSPS2 liquidity source")
|
|
||||||
- }
|
|
||||||
- lnClient, err = ldk.NewLDKService(ctx, svc.cfg, svc.eventPublisher, mnemonic, ldkWorkdir, vssToken, setStartupState, channelPeerSuggestions)
|
|
||||||
- case config.PhoenixBackendType:
|
|
||||||
- PhoenixdAddress, _ := svc.cfg.Get("PhoenixdAddress", encryptionKey)
|
|
||||||
- PhoenixdAuthorization, _ := svc.cfg.Get("PhoenixdAuthorization", encryptionKey)
|
|
||||||
-
|
|
||||||
- lnClient, err = phoenixd.NewPhoenixService(ctx, PhoenixdAddress, PhoenixdAuthorization)
|
|
||||||
- case config.CashuBackendType:
|
|
||||||
- mnemonic, _ := svc.cfg.Get("Mnemonic", encryptionKey)
|
|
||||||
- cashuMintUrl, _ := svc.cfg.Get("CashuMintUrl", encryptionKey)
|
|
||||||
- cashuWorkdir := path.Join(svc.cfg.GetEnv().Workdir, "cashu")
|
|
||||||
-
|
|
||||||
- lnClient, err = cashu.NewCashuService(svc.cfg, cashuWorkdir, mnemonic, cashuMintUrl)
|
|
||||||
- case config.BarkBackendType:
|
|
||||||
- mnemonic, _ := svc.cfg.Get("Mnemonic", encryptionKey)
|
|
||||||
- env := svc.cfg.GetEnv()
|
|
||||||
- barkWorkdir := path.Join(env.Workdir, "bark")
|
|
||||||
-
|
|
||||||
- lnClient, err = bark.NewBarkService(ctx, svc.eventPublisher, barkWorkdir, mnemonic, bark.Config{
|
|
||||||
- Network: svc.cfg.GetNetwork(),
|
|
||||||
- ServerAddress: env.BarkServer,
|
|
||||||
- EsploraAddress: env.BarkEsploraServer,
|
|
||||||
- ServerAccessToken: env.BarkServerAccessToken,
|
|
||||||
- LogLevel: env.BarkLogLevel,
|
|
||||||
- LogToFile: env.LogToFile,
|
|
||||||
- })
|
|
||||||
- case config.CLNBackendType:
|
|
||||||
- CLNAddress, _ := svc.cfg.Get("CLNAddress", encryptionKey)
|
|
||||||
- CLNLightningDir, _ := svc.cfg.Get("CLNLightningDir", encryptionKey)
|
|
||||||
- CLNAddressHold, _ := svc.cfg.Get("CLNAddressHold", encryptionKey)
|
|
||||||
- lnClient, err = cln.NewCLNService(ctx, svc.eventPublisher, CLNAddress, CLNLightningDir, CLNAddressHold)
|
|
||||||
default:
|
|
||||||
logger.Logger.WithField("backend_type", lnBackend).Error("Unsupported LNBackendType")
|
|
||||||
return fmt.Errorf("unsupported backend type: %s", lnBackend)
|
|
||||||
@@ -439,63 +387,9 @@ func (svc *service) launchLNBackend(ctx context.Context, encryptionKey string) e
|
|
||||||
svc.eventPublisher.Publish(&events.Event{
|
|
||||||
Event: "nwc_node_started",
|
|
||||||
Properties: map[string]interface{}{
|
|
||||||
- "node_type": lnBackend,
|
|
||||||
- "vss_enabled": vssEnabled,
|
|
||||||
+ "node_type": lnBackend,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
-
|
|
||||||
-func (svc *service) requestVssToken(ctx context.Context) (string, error) {
|
|
||||||
- nodeLastStartTime, _ := svc.cfg.Get("NodeLastStartTime", "")
|
|
||||||
-
|
|
||||||
- // for brand new nodes, consider enabling VSS
|
|
||||||
- if nodeLastStartTime == "" && svc.cfg.GetEnv().LDKVssUrl != "" {
|
|
||||||
- svc.startupState = "Checking Subscription"
|
|
||||||
- albyUserIdentifier, err := svc.albyOAuthSvc.GetUserIdentifier()
|
|
||||||
- if err != nil {
|
|
||||||
- logger.Logger.WithError(err).Error("Failed to fetch alby user identifier")
|
|
||||||
- return "", err
|
|
||||||
- }
|
|
||||||
- if albyUserIdentifier != "" {
|
|
||||||
- me, err := svc.albyOAuthSvc.GetMe(ctx)
|
|
||||||
- if err != nil {
|
|
||||||
- logger.Logger.WithError(err).Error("Failed to fetch alby user")
|
|
||||||
- return "", err
|
|
||||||
- }
|
|
||||||
- // only activate VSS for Alby paid subscribers
|
|
||||||
- if me.Subscription.PlanCode != "" {
|
|
||||||
- svc.cfg.SetUpdate("LdkVssEnabled", "true", "")
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- vssToken := ""
|
|
||||||
- vssEnabled, _ := svc.cfg.Get("LdkVssEnabled", "")
|
|
||||||
- if vssEnabled == "true" {
|
|
||||||
- svc.startupState = "Fetching VSS token"
|
|
||||||
- vssNodeIdentifier, err := ldk.GetVssNodeIdentifier(svc.keys)
|
|
||||||
- if err != nil {
|
|
||||||
- logger.Logger.WithError(err).Error("Failed to get VSS node identifier")
|
|
||||||
- return "", err
|
|
||||||
- }
|
|
||||||
- vssToken, err = svc.albyOAuthSvc.GetVssAuthToken(ctx, vssNodeIdentifier)
|
|
||||||
- if err != nil {
|
|
||||||
- logger.Logger.WithError(err).Error("Failed to fetch VSS JWT token")
|
|
||||||
-
|
|
||||||
- existingVssToken, _ := svc.cfg.Get("VssToken", "")
|
|
||||||
- if existingVssToken != "" {
|
|
||||||
- logger.Logger.Warn("Using stored VSS JWT token")
|
|
||||||
- return existingVssToken, nil
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- return "", err
|
|
||||||
- }
|
|
||||||
- err = svc.cfg.SetUpdate("VssToken", vssToken, "")
|
|
||||||
- if err != nil {
|
|
||||||
- logger.Logger.WithError(err).Error("Failed to save VSS JWT token to user config")
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
- return vssToken, nil
|
|
||||||
-}
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
diff --git a/frontend/frontend.go b/frontend/frontend.go
|
|
||||||
index 203dd9b..9c7f6da 100644
|
|
||||||
--- a/frontend/frontend.go
|
|
||||||
+++ b/frontend/frontend.go
|
|
||||||
@@ -1,26 +1,7 @@
|
|
||||||
package frontend
|
|
||||||
|
|
||||||
import (
|
|
||||||
- "embed"
|
|
||||||
- "net/http"
|
|
||||||
-
|
|
||||||
"github.com/labstack/echo/v4"
|
|
||||||
- "github.com/labstack/echo/v4/middleware"
|
|
||||||
)
|
|
||||||
|
|
||||||
-//go:embed dist
|
|
||||||
-var embeddedReactAssets embed.FS
|
|
||||||
-
|
|
||||||
-func RegisterHandlers(e *echo.Echo) {
|
|
||||||
- e.Use(middleware.StaticWithConfig(middleware.StaticConfig{
|
|
||||||
- Skipper: nil,
|
|
||||||
- // Root directory from where the static content is served.
|
|
||||||
- Root: "dist",
|
|
||||||
- // Enable HTML5 mode by forwarding all not-found requests to root so that
|
|
||||||
- // SPA (single-page application) can handle the routing.
|
|
||||||
- HTML5: true,
|
|
||||||
- Browse: false,
|
|
||||||
- IgnoreBase: false,
|
|
||||||
- Filesystem: http.FS(embeddedReactAssets),
|
|
||||||
- }))
|
|
||||||
-}
|
|
||||||
+func RegisterHandlers(e *echo.Echo) {}
|
|
||||||
diff --git a/http/http_service.go b/http/http_service.go
|
|
||||||
index 63d0ffc..0621bf5 100644
|
|
||||||
--- a/http/http_service.go
|
|
||||||
+++ b/http/http_service.go
|
|
||||||
@@ -114,8 +114,6 @@ func (httpSvc *HttpService) RegisterSharedRoutes(e *echo.Echo) {
|
|
||||||
e.POST("/api/backup", httpSvc.createBackupHandler, unlockRateLimiter)
|
|
||||||
e.GET("/logout", httpSvc.logoutHandler)
|
|
||||||
|
|
||||||
- frontend.RegisterHandlers(e)
|
|
||||||
-
|
|
||||||
// restricted routes
|
|
||||||
// Configure middleware with the custom claims type
|
|
||||||
jwtConfig := echojwt.Config{
|
|
||||||
@@ -4,47 +4,57 @@
|
|||||||
, stdenv
|
, stdenv
|
||||||
}:
|
}:
|
||||||
|
|
||||||
buildGoModule (finalAttrs: {
|
buildGoModule rec {
|
||||||
pname = "albyhub";
|
pname = "albyhub";
|
||||||
version = "1.24.0";
|
version = "1.24.0";
|
||||||
|
|
||||||
|
# sovran fork = upstream v1.24.0 + LND-only, no frontend, HOST bind,
|
||||||
|
# always-private route hints (the customization lives in the fork's commits)
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "getAlby";
|
owner = "naturallaw777";
|
||||||
repo = "hub";
|
repo = "hub";
|
||||||
tag = "v${finalAttrs.version}";
|
tag = "sovran-1.24.0";
|
||||||
hash = "sha256-IC3rl/9aJ88GgvGfhcJb1/pQb3xIkhYih1hLPJ8itP8=";
|
# round 1: copy the "got: sha256-..." from the build error
|
||||||
|
hash = "sha256-PLACEHOLDER-SRC";
|
||||||
};
|
};
|
||||||
|
|
||||||
vendorHash = "sha256-A4OsntoJUDkvWJxnZFFxw5AjUPmwRl764nQ5FEA2yeo=";
|
# `go mod vendor` strips the secp256k1-zkp cgo headers (include/), so use
|
||||||
|
# the full module cache. Round 2: copy the "got: sha256-..." from the error
|
||||||
# Use the Go module cache instead of `go mod vendor`. The
|
|
||||||
# vulpemventures/go-secp256k1-zkp dependency (pulled in transitively) ships
|
|
||||||
# cgo bindings whose C headers live in an `include/` subdirectory; those
|
|
||||||
# non-Go files are stripped by `go mod vendor`, which makes the build fail
|
|
||||||
# with `include/secp256k1_ecdh.h: No such file or directory`. The proxy
|
|
||||||
# tarballs retain the full file set, so the cgo compile succeeds.
|
|
||||||
proxyVendor = true;
|
proxyVendor = true;
|
||||||
|
vendorHash = "sha256-PLACEHOLDER-VENDOR";
|
||||||
|
|
||||||
patches = [
|
subPackages = [ "cmd/http" ];
|
||||||
./0001-private-route-hints.patch
|
|
||||||
./0003-loopback-bind-host.patch
|
|
||||||
./0004-lnd-only.patch
|
|
||||||
./0005-no-frontend.patch
|
|
||||||
];
|
|
||||||
|
|
||||||
# LND-only, no-frontend build: the only native dependency needed for
|
# LND client needs cgo (secp256k1-zkp)
|
||||||
# cgo (sqlite3) is the C/C++ runtime from stdenv.cc.cc. No nodejs/yarn
|
buildInputs = [ (lib.getLib stdenv.cc.cc) ];
|
||||||
# (no frontend), no bark-ffi-go or ldk-node (removed backends).
|
|
||||||
buildInputs = [
|
|
||||||
(lib.getLib stdenv.cc.cc)
|
|
||||||
];
|
|
||||||
|
|
||||||
subPackages = [
|
# pin module downloads to a hermetic proxy and the local toolchain
|
||||||
"cmd/http"
|
# (otherwise GOPROXY/GOTOOLCHAIN can leak into the builder env and the
|
||||||
];
|
# cache comes back incomplete — the original failure)
|
||||||
|
overrideModAttrs = (finalAttrs: previousAttrs: {
|
||||||
|
modBuildPhase = ''
|
||||||
|
runHook preBuild
|
||||||
|
|
||||||
|
export GIT_SSL_CAINFO=$NIX_SSL_CERT_FILE
|
||||||
|
export GOPROXY=https://proxy.golang.org,direct
|
||||||
|
export GOSUMDB=sum.golang.org
|
||||||
|
export GOTOOLCHAIN=local
|
||||||
|
|
||||||
|
mkdir -p "$GOPATH/pkg/mod/cache/download"
|
||||||
|
go mod download all
|
||||||
|
|
||||||
|
export GOPROXY="file://$GOPATH/pkg/mod/cache/download"
|
||||||
|
|
||||||
|
go list ./cmd/http
|
||||||
|
|
||||||
|
mkdir -p vendor
|
||||||
|
|
||||||
|
runHook postBuild
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
|
||||||
ldflags = [
|
ldflags = [
|
||||||
"-X github.com/getAlby/hub/version.Tag=v${finalAttrs.version}"
|
"-X github.com/getAlby/hub/version.Tag=${version}"
|
||||||
"-s"
|
"-s"
|
||||||
"-w"
|
"-w"
|
||||||
];
|
];
|
||||||
@@ -52,12 +62,4 @@ buildGoModule (finalAttrs: {
|
|||||||
postInstall = ''
|
postInstall = ''
|
||||||
mv $out/bin/http $out/bin/albyhub
|
mv $out/bin/http $out/bin/albyhub
|
||||||
'';
|
'';
|
||||||
|
}
|
||||||
meta = {
|
|
||||||
description = "Control lightning wallets over nostr";
|
|
||||||
homepage = "https://github.com/getAlBy/hub";
|
|
||||||
license = lib.licenses.asl20;
|
|
||||||
platforms = lib.platforms.linux;
|
|
||||||
mainProgram = "albyhub";
|
|
||||||
};
|
|
||||||
})
|
|
||||||
|
|||||||
Reference in New Issue
Block a user