Got error loading .env
andresuchdata
HOBBYOP

2 years ago

I got error: "2024/11/21 14:41:12 Error loading .env file"

Currently using Go and Dockerfile.

Dockerfile content:

Build stage

FROM golang:1.23.3-alpine AS builder

WORKDIR /app

RUN apk add --no-cache gcc musl-dev

COPY go.mod go.sum ./

RUN go mod download

COPY . .

RUN go build -o main .

Final stage

FROM alpine:latest

WORKDIR /app

Copy binary from builder

COPY --from=builder /app/main .

Set default PORT environment variable (optional)

ENV PORT=8080

Expose the port specified by the PORT environment variable

EXPOSE $PORT

Run the binary directly instead of start.sh

CMD ["./main"]


main.go

func getEnv(key string, defaultValue string) string {
	value := os.Getenv(key)
	if value == "" {
		return defaultValue
	}
	return value
}

func main() {
	env := getEnv("ENV", "dev")

	// Do not load .env file in Railway production
	if _, exists := os.LookupEnv("RAILWAY_ENVIRONMENT"); !exists {
		if err := godotenv.Load(); err != nil {
			log.Fatal("error loading .env file:", err)
		}
	}

	// Initialize logger
	var logger *slog.Logger

	if env == "prod" {
		logger = slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
			Level: slog.LevelInfo,
		}))
	} else {
		logger = slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
			Level: slog.LevelDebug,
		}))
	}
	utils.SetLogger(logger)

	e := echo.New()
	e.Validator = utils.NewCustomValidator()

	// Initialize DB connection
	var connStr string

	// Check for Railway's DATABASE_URL
	if dbURL := getEnv("DATABASE_URL", ""); dbURL != "" {
		connStr = dbURL
	} else {
		// Fallback to individual connection parameters
		connStr = fmt.Sprintf(
			"postgres://%s:%s@%s:%s/%s?sslmode=%s",
			getEnv("DB_USER", ""),
			getEnv("DB_PASSWORD", ""),
			getEnv("DB_HOST", ""),
			getEnv("DB_PORT", ""),
			getEnv("DB_NAME", ""),
			getEnv("DB_SSLMODE", ""),
		)
	}

	db, err := sql.Open("postgres", connStr)
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// Run migrations
	if err := migrate.RunMigrations(db, "db/migrations"); err != nil {
		log.Fatal(err)
	}

	// Initialize repository with DB connection
	userRepo := repository.NewUserRepository(db)
	passwordResetTokenRepo := repository.NewPasswordResetTokenRepository(db)

	userService := service.NewUserService(userRepo, passwordResetTokenRepo)
	userHandler := handler.NewUserHandler(userService)

	// Register routes
	handler.RegisterRoutes(e, &handler.RouteConfig{
		UserHandler:    userHandler,
		AuthMiddleware: handler.AuthMiddleware,
		BaseMiddleware: []echo.MiddlewareFunc{
			handler.RequestLoggerMiddleware,
			handler.ErrorCodeHandlingMiddleware,
		},
	})

	// Start the server using environment variable for port
	port := getEnv("PORT", "8080")

	fmt.Println("Env port", port)
	e.Logger.Fatal(e.Start(":" + port))

}

View Deploy details

ⓘ Deployment information is only viewable by project members and Railway employees.

Solved

0 Replies

Status changed to Solved brody over 1 year ago


Welcome!

Sign in to your Railway account to join the conversation.

Loading...