mirror of
https://github.com/studiokaiji/nostr-webhost.git
synced 2025-12-16 22:34:26 +01:00
Add web server and relay configuration support
- Introduced a new Dockerfile for building the web server. - Updated docker-compose.yml to include the web server service with environment variable support for relay URLs. - Enhanced relay management in relays.go to read from environment variables. - Updated main.go to provide descriptions for relay configuration in CLI commands.
This commit is contained in:
@@ -9,3 +9,30 @@ services:
|
|||||||
- ./nostr-rs-relay/config.toml:/usr/src/app/config.toml
|
- ./nostr-rs-relay/config.toml:/usr/src/app/config.toml
|
||||||
user: root
|
user: root
|
||||||
container_name: nostr-webhost-relay
|
container_name: nostr-webhost-relay
|
||||||
|
networks:
|
||||||
|
- nostr-network
|
||||||
|
web_server:
|
||||||
|
build:
|
||||||
|
context: ./hostr
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
ports:
|
||||||
|
- "3000:3000"
|
||||||
|
container_name: nostr-webhost-server
|
||||||
|
environment:
|
||||||
|
- RELAY_URLS=ws://relay:8080
|
||||||
|
depends_on:
|
||||||
|
- relay
|
||||||
|
volumes:
|
||||||
|
- ./hostr/data:/app/data
|
||||||
|
- hostr_config:/app/.config
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- nostr-network
|
||||||
|
command: ["./hostr", "start", "--port", "3000", "--mode", "normal"]
|
||||||
|
|
||||||
|
networks:
|
||||||
|
nostr-network:
|
||||||
|
driver: bridge
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
hostr_config:
|
||||||
|
|||||||
57
hostr/Dockerfile
Normal file
57
hostr/Dockerfile
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
# Build stage
|
||||||
|
# Go 1.23 is the latest stable version available in Docker Hub
|
||||||
|
# The project requires Go 1.25 but we'll use 1.23 for now
|
||||||
|
FROM golang:1.23-alpine AS builder
|
||||||
|
|
||||||
|
# Accept GOTOOLCHAIN as build argument
|
||||||
|
ARG GOTOOLCHAIN=auto
|
||||||
|
ENV GOTOOLCHAIN=${GOTOOLCHAIN}
|
||||||
|
|
||||||
|
# Install necessary build dependencies
|
||||||
|
RUN apk add --no-cache git
|
||||||
|
|
||||||
|
# Set working directory
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy go mod files
|
||||||
|
COPY go.mod go.sum ./
|
||||||
|
|
||||||
|
# Download dependencies
|
||||||
|
RUN go mod download
|
||||||
|
|
||||||
|
# Copy source code
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# Build the application
|
||||||
|
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o hostr .
|
||||||
|
|
||||||
|
# Final stage
|
||||||
|
FROM alpine:latest
|
||||||
|
|
||||||
|
# Install ca-certificates for HTTPS support and netcat for connectivity checks
|
||||||
|
RUN apk --no-cache add ca-certificates netcat-openbsd
|
||||||
|
|
||||||
|
# Create a non-root user
|
||||||
|
RUN addgroup -g 1000 hostr && \
|
||||||
|
adduser -D -u 1000 -G hostr hostr
|
||||||
|
|
||||||
|
# Set working directory
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy the binary from builder
|
||||||
|
COPY --from=builder /app/hostr .
|
||||||
|
|
||||||
|
# Copy entrypoint script
|
||||||
|
COPY docker-entrypoint.sh /app/docker-entrypoint.sh
|
||||||
|
|
||||||
|
# Create directories for data and config
|
||||||
|
RUN mkdir -p /app/data /home/hostr/.nostr-webhost && \
|
||||||
|
chmod +x /app/docker-entrypoint.sh && \
|
||||||
|
chown -R hostr:hostr /app /home/hostr
|
||||||
|
|
||||||
|
# Switch to non-root user
|
||||||
|
USER hostr
|
||||||
|
|
||||||
|
# Expose the default port
|
||||||
|
EXPOSE 3000
|
||||||
|
|
||||||
@@ -56,6 +56,24 @@ func RemoveRelay(targetURL string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetAllRelays() ([]string, error) {
|
func GetAllRelays() ([]string, error) {
|
||||||
|
// Check if relays are provided via environment variable
|
||||||
|
envRelays := os.Getenv("RELAY_URLS")
|
||||||
|
if envRelays != "" {
|
||||||
|
// Parse comma-separated relay URLs from environment variable
|
||||||
|
relayList := strings.Split(envRelays, ",")
|
||||||
|
cleanedRelays := []string{}
|
||||||
|
for _, relay := range relayList {
|
||||||
|
trimmed := strings.TrimSpace(relay)
|
||||||
|
if len(trimmed) > 0 {
|
||||||
|
cleanedRelays = append(cleanedRelays, trimmed)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(cleanedRelays) > 0 {
|
||||||
|
return cleanedRelays, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fall back to reading from file if environment variable is not set
|
||||||
dir, err := paths.GetSettingsDirectory()
|
dir, err := paths.GetSettingsDirectory()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -75,5 +93,6 @@ func GetAllRelays() ([]string, error) {
|
|||||||
lines = append(lines, line)
|
lines = append(lines, line)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return lines, nil
|
return lines, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package server
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@@ -25,6 +26,8 @@ func Start(port string, mode string) {
|
|||||||
|
|
||||||
r := gin.Default()
|
r := gin.Default()
|
||||||
|
|
||||||
|
fmt.Println("[Hostr] Using relays:", strings.Join(allRelays, ", "))
|
||||||
|
|
||||||
r.GET("/e/:hex_or_nevent", func(ctx *gin.Context) {
|
r.GET("/e/:hex_or_nevent", func(ctx *gin.Context) {
|
||||||
hexOrNevent := ctx.Param("hex_or_nevent")
|
hexOrNevent := ctx.Param("hex_or_nevent")
|
||||||
|
|
||||||
@@ -93,8 +96,6 @@ func Start(port string, mode string) {
|
|||||||
} else {
|
} else {
|
||||||
ctx.String(http.StatusNotFound, http.StatusText(http.StatusNotFound))
|
ctx.String(http.StatusNotFound, http.StatusText(http.StatusNotFound))
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
|
||||||
})
|
})
|
||||||
|
|
||||||
if mode != "secure" {
|
if mode != "secure" {
|
||||||
@@ -197,8 +198,6 @@ func Start(port string, mode string) {
|
|||||||
} else {
|
} else {
|
||||||
ctx.String(http.StatusNotFound, http.StatusText(http.StatusNotFound))
|
ctx.String(http.StatusNotFound, http.StatusText(http.StatusNotFound))
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,12 @@ func main() {
|
|||||||
{
|
{
|
||||||
Name: "deploy",
|
Name: "deploy",
|
||||||
Usage: "🌐 Deploy nostr website",
|
Usage: "🌐 Deploy nostr website",
|
||||||
|
Description: `Deploy your website to Nostr relays.
|
||||||
|
|
||||||
|
Relay configuration:
|
||||||
|
- Set RELAY_URLS environment variable with comma-separated relay URLs to bypass .nostr_relays file
|
||||||
|
- Example: RELAY_URLS="wss://relay1.com,wss://relay2.com" hostr deploy
|
||||||
|
- If RELAY_URLS is not set, will read from .nostr_relays file`,
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "path",
|
Name: "path",
|
||||||
@@ -160,6 +166,12 @@ func main() {
|
|||||||
{
|
{
|
||||||
Name: "start",
|
Name: "start",
|
||||||
Usage: "🕺 Wake up web server",
|
Usage: "🕺 Wake up web server",
|
||||||
|
Description: `Start the web server to serve content from Nostr relays.
|
||||||
|
|
||||||
|
Relay configuration:
|
||||||
|
- Set RELAY_URLS environment variable with comma-separated relay URLs to bypass .nostr_relays file
|
||||||
|
- Example: RELAY_URLS="wss://relay1.com,wss://relay2.com" hostr start
|
||||||
|
- If RELAY_URLS is not set, will read from .nostr_relays file`,
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "port",
|
Name: "port",
|
||||||
|
|||||||
Reference in New Issue
Block a user