Got error loading .env
andresuchdataTRIAL
5 months 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))
}
ⓘ Deployment information is only viewable by project members and Railway employees.
0 Replies
Status changed to Solved brody • 5 months ago