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
|
||||
}:
|
||||
|
||||
buildGoModule (finalAttrs: {
|
||||
buildGoModule rec {
|
||||
pname = "albyhub";
|
||||
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 {
|
||||
owner = "getAlby";
|
||||
owner = "naturallaw777";
|
||||
repo = "hub";
|
||||
tag = "v${finalAttrs.version}";
|
||||
hash = "sha256-IC3rl/9aJ88GgvGfhcJb1/pQb3xIkhYih1hLPJ8itP8=";
|
||||
tag = "sovran-1.24.0";
|
||||
# round 1: copy the "got: sha256-..." from the build error
|
||||
hash = "sha256-PLACEHOLDER-SRC";
|
||||
};
|
||||
|
||||
vendorHash = "sha256-A4OsntoJUDkvWJxnZFFxw5AjUPmwRl764nQ5FEA2yeo=";
|
||||
|
||||
# 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.
|
||||
# `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
|
||||
proxyVendor = true;
|
||||
vendorHash = "sha256-PLACEHOLDER-VENDOR";
|
||||
|
||||
patches = [
|
||||
./0001-private-route-hints.patch
|
||||
./0003-loopback-bind-host.patch
|
||||
./0004-lnd-only.patch
|
||||
./0005-no-frontend.patch
|
||||
];
|
||||
subPackages = [ "cmd/http" ];
|
||||
|
||||
# LND-only, no-frontend build: the only native dependency needed for
|
||||
# cgo (sqlite3) is the C/C++ runtime from stdenv.cc.cc. No nodejs/yarn
|
||||
# (no frontend), no bark-ffi-go or ldk-node (removed backends).
|
||||
buildInputs = [
|
||||
(lib.getLib stdenv.cc.cc)
|
||||
];
|
||||
# LND client needs cgo (secp256k1-zkp)
|
||||
buildInputs = [ (lib.getLib stdenv.cc.cc) ];
|
||||
|
||||
subPackages = [
|
||||
"cmd/http"
|
||||
];
|
||||
# pin module downloads to a hermetic proxy and the local toolchain
|
||||
# (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 = [
|
||||
"-X github.com/getAlby/hub/version.Tag=v${finalAttrs.version}"
|
||||
"-X github.com/getAlby/hub/version.Tag=${version}"
|
||||
"-s"
|
||||
"-w"
|
||||
];
|
||||
@@ -52,12 +62,4 @@ buildGoModule (finalAttrs: {
|
||||
postInstall = ''
|
||||
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