Refactor Dockerfile and CI Configuration

- Updated the CI configuration in .drone.yml to use the new Dockerfile located at ./cmd/web/Dockerfile.
- Removed the old Dockerfile and Dockerfile-drone as they are no longer needed.
- Refactored the cmd/web/Dockerfile to streamline the build process and improve organization.
- Introduced a new bootstrap package to handle application initialization, including configuration, logging, MongoDB, Redis, and authorization service setup.
- Added a health check endpoint for monitoring the server status, enhancing the API's operational capabilities.
This commit is contained in:
n.nakhostin
2025-08-31 14:16:37 +03:30
parent 4b3172d058
commit 511155e0a7
8 changed files with 42 additions and 121 deletions
+13 -16
View File
@@ -1,25 +1,22 @@
ARG GO_VERSION=1.23
ARG BASH_VERSION=5.0
FROM golang:$GO_VERSION AS goBuilder
RUN mkdir -p /usr/local/go/src/company/tm_back
COPY . /go/src/company/tm_back/
RUN echo $GOROOT
FROM golang:${GO_VERSION} AS go-builder
RUN cd /go/src/company/tm_back \
&& CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -v -o web ./cmd/web/main.go
WORKDIR /go/src/company/tm_back
COPY . .
FROM amd64/bash:$BASH_VERSION
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -v -o web-build ./cmd/web/main.go
RUN apk --no-cache add --update busybox-suid \
&& apk --no-cache add curl rsync tzdata tcpdump tree ca-certificates s-nail \
FROM bash:${BASH_VERSION}
RUN apk --no-cache add busybox-suid curl rsync tzdata tcpdump tree ca-certificates s-nail \
&& ln -s /usr/bin/mail /usr/bin/s-nail \
&& mkdir -p /go/bin/media \
&& mkdir -p /go/bin/log \
&& mkdir -p /go/bin/config
WORKDIR /go/bin/
COPY --from=goBuilder /go/src/company/tm_back/web .
&& mkdir -p /go/bin/media /go/bin/log /go/bin/config
WORKDIR /go/bin
COPY --from=go-builder /go/src/company/tm_back/web-build .
EXPOSE 8090
# Set the binary.
ENTRYPOINT ["/go/bin/web"]
ENTRYPOINT /go/bin/web-build
@@ -1,4 +1,4 @@
package main
package bootstrap
import (
"fmt"
@@ -16,7 +16,7 @@ import (
)
// Init Application Configuration
func initConfig() Config {
func InitConfig() Config {
conf, err := config.LoadConfig(".", &Config{})
if err != nil {
panic(fmt.Sprintf("Failed to load config: %v", err))
@@ -26,7 +26,7 @@ func initConfig() Config {
}
// Init Logger Service
func initLogger(conf config.LoggingConfig) logger.Logger {
func InitLogger(conf config.LoggingConfig) logger.Logger {
return logger.NewLogger(&logger.Config{
Level: conf.Level,
Format: conf.Format,
@@ -42,7 +42,7 @@ func initLogger(conf config.LoggingConfig) logger.Logger {
}
// Init MongoDB Connection Manager
func initMongoDB(conf config.MongoConfig, log logger.Logger) *mongo.ConnectionManager {
func InitMongoDB(conf config.MongoConfig, log logger.Logger) *mongo.ConnectionManager {
// Convert infra.MongoConfig to mongo.ConnectionConfig
connectionConfig := mongo.ConnectionConfig{
URI: conf.URI,
@@ -75,7 +75,7 @@ func initMongoDB(conf config.MongoConfig, log logger.Logger) *mongo.ConnectionMa
}
// initHTTPServer initializes the Echo HTTP server with middleware
func initHTTPServer(conf Config, log logger.Logger) *echo.Echo {
func InitHTTPServer(conf Config, log logger.Logger) *echo.Echo {
e := echo.New()
// Configure Echo
@@ -129,7 +129,7 @@ func initHTTPServer(conf Config, log logger.Logger) *echo.Echo {
}
// Init Redis Connection Manager
func initRedis(conf config.RedisConfig, log logger.Logger) redis.Client {
func InitRedis(conf config.RedisConfig, log logger.Logger) redis.Client {
connectionConfig := &redis.Config{
Host: conf.Host,
Port: conf.Port,
@@ -158,7 +158,7 @@ func initRedis(conf config.RedisConfig, log logger.Logger) redis.Client {
}
// Init Authorization Service
func initAuthorizationService(conf JWTConfig, redisClient redis.Client, log logger.Logger) authorization.AuthorizationService {
func InitAuthorizationService(conf JWTConfig, redisClient redis.Client, log logger.Logger) authorization.AuthorizationService {
authConfig := &authorization.AuthorizationConfig{
AccessTokenSecret: conf.AccessSecret,
RefreshTokenSecret: conf.RefreshSecret,
@@ -1,4 +1,4 @@
package main
package bootstrap
import (
"tm/pkg/config"
@@ -1,4 +1,4 @@
package main
package bootstrap
import (
"net/http"
+8 -7
View File
@@ -71,18 +71,19 @@ import (
"tm/internal/tender_approval"
"tm/internal/user"
"tm/cmd/web/bootstrap"
_ "tm/cmd/web/docs" // This is generated by swag
"tm/cmd/web/router"
)
func main() {
conf := initConfig()
conf := bootstrap.InitConfig()
logger := initLogger(conf.Logging)
logger := bootstrap.InitLogger(conf.Logging)
defer logger.Sync()
// Initialize MongoDB connection manager
mongoManager := initMongoDB(conf.Database.MongoDB, logger)
mongoManager := bootstrap.InitMongoDB(conf.Database.MongoDB, logger)
defer func() {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
@@ -94,7 +95,7 @@ func main() {
}()
// Initialize Redis connection manager
redisClient := initRedis(conf.Cache.Redis, logger)
redisClient := bootstrap.InitRedis(conf.Cache.Redis, logger)
defer func() {
if err := redisClient.Close(); err != nil {
logger.Error("Failed to close Redis connection", map[string]interface{}{
@@ -104,8 +105,8 @@ func main() {
}()
// Initialize authorization service
userAuthService := initAuthorizationService(conf.UserAuth.JWT, redisClient, logger)
customerAuthService := initAuthorizationService(conf.CustomerAuth.JWT, redisClient, logger)
userAuthService := bootstrap.InitAuthorizationService(conf.UserAuth.JWT, redisClient, logger)
customerAuthService := bootstrap.InitAuthorizationService(conf.CustomerAuth.JWT, redisClient, logger)
// Initialize repositories with MongoDB connection manager
userRepository := user.NewUserRepository(mongoManager, logger)
@@ -145,7 +146,7 @@ func main() {
})
// Initialize HTTP server
e := initHTTPServer(conf, logger)
e := bootstrap.InitHTTPServer(conf, logger)
// Register routes
router.RegisterAdminRoutes(e, userHandler, companyHandler, customerHandler, tenderHandler, feedbackHandler, tenderApprovalHandler)