Skip to content

Commit

Permalink
configure
Browse files Browse the repository at this point in the history
  • Loading branch information
mstgnz committed Dec 29, 2024
1 parent 98f8090 commit bd0bee6
Show file tree
Hide file tree
Showing 10 changed files with 71 additions and 120 deletions.
31 changes: 21 additions & 10 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,24 +1,35 @@
# App Configuration
APP_NAME=cdn
APP_PORT=9090
APP_URL=http://localhost:$(APP_PORT)
APP_URL=http://localhost:9090

MINIO_ENDPOINT=cdn-minio:9000
MINIO_ROOT_USER=minio
MINIO_ROOT_PASSWORD=password
TOKEN=your-token-here

REDIS_URL=redis://cdn_redis:6379
# MinIO Configuration
MINIO_ENDPOINT=cdn-minio:9000
MINIO_ROOT_USER=your-minio-user
MINIO_ROOT_PASSWORD=your-minio-password

TOKEN=e773f0a5562eec14ae024af3315c1
# Redis Configuration
REDIS_URL=redis://redis:6379

AWS_ACCESS_KEY_ID=AKIA462E74
AWS_SECRET_ACCESS_KEY=aQCWJxsyHV+
# AWS Configuration
AWS_ACCESS_KEY_ID=your-aws-key
AWS_SECRET_ACCESS_KEY=your-aws-secret
AWS_SESSION_TOKEN=
AWS_REGION=eu-central-1
AWS_BUCKET=

# Feature Flags
DISABLE_DELETE=false
DISABLE_UPLOAD=false
DISABLE_GET=false

# Redis Configuration
REDIS_URL=redis://redis:6379
# Worker Configuration
WORKER_POOL_SIZE=5
WORKER_QUEUE_SIZE=10
WORKER_MAX_RETRIES=3
WORKER_RETRY_DELAY_MS=1000
WORKER_BATCH_SIZE=10
WORKER_FLUSH_TIMEOUT_MS=5000
WORKER_MAX_CONCURRENT=5
9 changes: 5 additions & 4 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/joho/godotenv"
"github.com/minio/minio-go/v7"
"github.com/mstgnz/cdn/handler"
"github.com/mstgnz/cdn/pkg/config"
"github.com/mstgnz/cdn/pkg/middleware"
"github.com/mstgnz/cdn/pkg/observability"
"github.com/mstgnz/cdn/service"
Expand Down Expand Up @@ -76,9 +77,9 @@ func main() {
File: "./public/favicon.png",
}))

disableDelete := service.GetBool("DISABLE_DELETE")
disableUpload := service.GetBool("DISABLE_UPLOAD")
disableGet := service.GetBool("DISABLE_GET")
disableDelete := config.GetEnvAsBoolOrDefault("DISABLE_DELETE", false)
disableUpload := config.GetEnvAsBoolOrDefault("DISABLE_UPLOAD", false)
disableGet := config.GetEnvAsBoolOrDefault("DISABLE_GET", false)

// Swagger
app.Get("/swagger", func(c *fiber.Ctx) error {
Expand Down Expand Up @@ -141,7 +142,7 @@ func main() {
// Metrics endpoint
app.Get("/metrics", observability.MetricsHandler)

port := fmt.Sprintf(":%s", service.GetEnv("APP_PORT"))
port := fmt.Sprintf(":%s", config.GetEnvOrDefault("APP_PORT", "9090"))
if err := app.Listen(port); err != nil {
logger.Fatal().Err(err).Msg("Failed to start server")
}
Expand Down
5 changes: 3 additions & 2 deletions handler/image.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"github.com/google/uuid"
"github.com/minio/minio-go/v7"
"github.com/mstgnz/cdn/pkg/batch"
"github.com/mstgnz/cdn/pkg/config"
"github.com/mstgnz/cdn/pkg/worker"
"github.com/mstgnz/cdn/service"
)
Expand Down Expand Up @@ -302,7 +303,7 @@ func (i image) UploadImageWithUrl(c *fiber.Ctx) error {
// Upload with PutObject
minioResult, err := i.minioClient.PutObject(ctx, bucket, objectName, res.Body, int64(fileSize), minio.PutObjectOptions{ContentType: contentType})

url = service.GetEnv("APP_URL")
url = config.GetEnvOrDefault("APP_URL", "http://localhost:9090")
url = strings.TrimSuffix(url, "/")
link := url + "/" + bucket + "/" + objectName

Expand Down Expand Up @@ -408,7 +409,7 @@ func (i image) commonUpload(c *fiber.Ctx, ctx context.Context, path, bucket stri
return service.Response(c, fiber.StatusBadRequest, false, err.Error(), nil)
}

url := service.GetEnv("APP_URL")
url := config.GetEnvOrDefault("APP_URL", "http://localhost:9090")
url = strings.TrimSuffix(url, "/")
link := url + "/" + bucket + "/" + objectName

Expand Down
62 changes: 27 additions & 35 deletions pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,50 +71,50 @@ func Load() (*Config, error) {

// App Config
config.App = AppConfig{
Name: getEnvOrDefault("APP_NAME", "cdn"),
Port: getEnvAsIntOrDefault("APP_PORT", 9090),
URL: getEnvOrDefault("APP_URL", "http://localhost:9090"),
Token: mustGetEnv("TOKEN"),
Name: GetEnvOrDefault("APP_NAME", "cdn"),
Port: GetEnvAsIntOrDefault("APP_PORT", 9090),
URL: GetEnvOrDefault("APP_URL", "http://localhost:9090"),
Token: GetEnvOrDefault("TOKEN", ""),
}

// MinIO Config
config.Minio = MinioConfig{
Endpoint: mustGetEnv("MINIO_ENDPOINT"),
User: mustGetEnv("MINIO_ROOT_USER"),
Password: mustGetEnv("MINIO_ROOT_PASSWORD"),
UseSSL: getEnvAsBoolOrDefault("MINIO_USE_SSL", false),
Endpoint: GetEnvOrDefault("MINIO_ENDPOINT", ""),
User: GetEnvOrDefault("MINIO_ROOT_USER", ""),
Password: GetEnvOrDefault("MINIO_ROOT_PASSWORD", ""),
UseSSL: GetEnvAsBoolOrDefault("MINIO_USE_SSL", false),
}

// AWS Config
config.AWS = AWSConfig{
AccessKeyID: mustGetEnv("AWS_ACCESS_KEY_ID"),
SecretAccessKey: mustGetEnv("AWS_SECRET_ACCESS_KEY"),
SessionToken: getEnvOrDefault("AWS_SESSION_TOKEN", ""),
Region: mustGetEnv("AWS_REGION"),
Bucket: getEnvOrDefault("AWS_BUCKET", ""),
AccessKeyID: GetEnvOrDefault("AWS_ACCESS_KEY_ID", ""),
SecretAccessKey: GetEnvOrDefault("AWS_SECRET_ACCESS_KEY", ""),
SessionToken: GetEnvOrDefault("AWS_SESSION_TOKEN", ""),
Region: GetEnvOrDefault("AWS_REGION", ""),
Bucket: GetEnvOrDefault("AWS_BUCKET", ""),
}

// Redis Config
config.Redis = RedisConfig{
URL: getEnvOrDefault("REDIS_URL", mustGetEnv("REDIS_URL")),
URL: GetEnvOrDefault("REDIS_URL", GetEnvOrDefault("REDIS_URL", "redis://localhost:6379")),
}

// Worker Config
config.Worker = WorkerConfig{
PoolSize: getEnvAsIntOrDefault("WORKER_POOL_SIZE", 5),
QueueSize: getEnvAsIntOrDefault("WORKER_QUEUE_SIZE", 10),
MaxRetries: getEnvAsIntOrDefault("WORKER_MAX_RETRIES", 3),
RetryDelay: time.Duration(getEnvAsIntOrDefault("WORKER_RETRY_DELAY_MS", 1000)) * time.Millisecond,
BatchSize: getEnvAsIntOrDefault("WORKER_BATCH_SIZE", 10),
FlushTimeout: time.Duration(getEnvAsIntOrDefault("WORKER_FLUSH_TIMEOUT_MS", 5000)) * time.Millisecond,
MaxConcurrent: getEnvAsIntOrDefault("WORKER_MAX_CONCURRENT", 5),
PoolSize: GetEnvAsIntOrDefault("WORKER_POOL_SIZE", 5),
QueueSize: GetEnvAsIntOrDefault("WORKER_QUEUE_SIZE", 10),
MaxRetries: GetEnvAsIntOrDefault("WORKER_MAX_RETRIES", 3),
RetryDelay: time.Duration(GetEnvAsIntOrDefault("WORKER_RETRY_DELAY_MS", 1000)) * time.Millisecond,
BatchSize: GetEnvAsIntOrDefault("WORKER_BATCH_SIZE", 10),
FlushTimeout: time.Duration(GetEnvAsIntOrDefault("WORKER_FLUSH_TIMEOUT_MS", 5000)) * time.Millisecond,
MaxConcurrent: GetEnvAsIntOrDefault("WORKER_MAX_CONCURRENT", 5),
}

// Feature Config
config.Features = FeatureConfig{
DisableDelete: getEnvAsBoolOrDefault("DISABLE_DELETE", false),
DisableUpload: getEnvAsBoolOrDefault("DISABLE_UPLOAD", false),
DisableGet: getEnvAsBoolOrDefault("DISABLE_GET", false),
DisableDelete: GetEnvAsBoolOrDefault("DISABLE_DELETE", false),
DisableUpload: GetEnvAsBoolOrDefault("DISABLE_UPLOAD", false),
DisableGet: GetEnvAsBoolOrDefault("DISABLE_GET", false),
}

return config, nil
Expand Down Expand Up @@ -161,23 +161,15 @@ func (c *Config) Validate() error {
return nil
}

func mustGetEnv(key string) string {
value := os.Getenv(key)
if value == "" {
panic(fmt.Sprintf("environment variable %s is required", key))
}
return value
}

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

func getEnvAsIntOrDefault(key string, defaultValue int) int {
func GetEnvAsIntOrDefault(key string, defaultValue int) int {
value := os.Getenv(key)
if value == "" {
return defaultValue
Expand All @@ -189,7 +181,7 @@ func getEnvAsIntOrDefault(key string, defaultValue int) int {
return intValue
}

func getEnvAsBoolOrDefault(key string, defaultValue bool) bool {
func GetEnvAsBoolOrDefault(key string, defaultValue bool) bool {
value := os.Getenv(key)
if value == "" {
return defaultValue
Expand Down
9 changes: 5 additions & 4 deletions pkg/worker/pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"sync"
"time"

"github.com/mstgnz/cdn/pkg/config"
"github.com/mstgnz/cdn/pkg/observability"
"github.com/rs/zerolog"
)
Expand Down Expand Up @@ -41,10 +42,10 @@ type Config struct {
// DefaultConfig returns default configuration
func DefaultConfig() Config {
return Config{
Workers: 5,
QueueSize: 10,
MaxRetries: 3,
RetryDelay: time.Second,
Workers: config.GetEnvAsIntOrDefault("WORKER_POOL_SIZE", 5),
QueueSize: config.GetEnvAsIntOrDefault("WORKER_QUEUE_SIZE", 10),
MaxRetries: config.GetEnvAsIntOrDefault("WORKER_MAX_RETRIES", 3),
RetryDelay: time.Duration(config.GetEnvAsIntOrDefault("WORKER_RETRY_DELAY_MS", 1000)) * time.Millisecond,
}
}

Expand Down
3 changes: 2 additions & 1 deletion service/aws.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"github.com/aws/aws-sdk-go-v2/service/glacier"
"github.com/aws/aws-sdk-go-v2/service/s3"
"github.com/aws/aws-sdk-go-v2/service/s3/types"
cnf "github.com/mstgnz/cdn/pkg/config"
)

// https://docs.aws.amazon.com/amazonglacier/latest/dev/introduction.html
Expand All @@ -34,7 +35,7 @@ type awsService struct {

func NewAwsService() AwsService {
cfg, _ := config.LoadDefaultConfig(context.TODO(), config.WithCredentialsProvider(
credentials.NewStaticCredentialsProvider(GetEnv("AWS_ACCESS_KEY_ID"), GetEnv("AWS_SECRET_ACCESS_KEY"), "")))
credentials.NewStaticCredentialsProvider(cnf.GetEnvOrDefault("AWS_ACCESS_KEY_ID", ""), cnf.GetEnvOrDefault("AWS_SECRET_ACCESS_KEY", ""), "")))
return &awsService{cfg: cfg}
}

Expand Down
3 changes: 2 additions & 1 deletion service/cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"time"

"github.com/go-redis/redis/v8"
"github.com/mstgnz/cdn/pkg/config"
"github.com/mstgnz/cdn/pkg/observability"
"github.com/rs/zerolog"
)
Expand All @@ -25,7 +26,7 @@ type redisCache struct {

func NewCacheService(redisURL string) (CacheService, error) {
if redisURL == "" {
redisURL = GetEnv("REDIS_URL")
redisURL = config.GetEnvOrDefault("REDIS_URL", "redis://localhost:6379")
}

opt, err := redis.ParseURL(redisURL)
Expand Down
7 changes: 4 additions & 3 deletions service/minio.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@ import (

"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
"github.com/mstgnz/cdn/pkg/config"
)

func MinioClient() *minio.Client {

endpoint := GetEnv("MINIO_ENDPOINT")
accessKey := GetEnv("MINIO_ROOT_USER")
secretKey := GetEnv("MINIO_ROOT_PASSWORD")
endpoint := config.GetEnvOrDefault("MINIO_ENDPOINT", "localhost:9000")
accessKey := config.GetEnvOrDefault("MINIO_ROOT_USER", "minioadmin")
secretKey := config.GetEnvOrDefault("MINIO_ROOT_PASSWORD", "minioadmin")

minioClient, err := minio.New(endpoint, &minio.Options{
Creds: credentials.NewStaticV4(accessKey, secretKey, ""),
Expand Down
22 changes: 2 additions & 20 deletions service/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (

"github.com/gofiber/fiber/v2"
"github.com/joho/godotenv"
"github.com/mstgnz/cdn/pkg/config"
)

const (
Expand All @@ -23,10 +24,6 @@ const (
HeadersType = "headers"
)

func GetEnv(key string) string {
return os.Getenv(key)
}

func ReadEnvAndSet() error {
envs, err := godotenv.Read(".env")
if err != nil {
Expand All @@ -41,21 +38,6 @@ func ReadEnvAndSet() error {
return nil
}

// GetBool fetches an env var meant to be a bool and follows this logic to
// determine the value of that bool:
// if "", return false
// strconv.ParseBool() otherwise:
// if that errors, exit;
// otherwise return the value
func GetBool(key string) bool {
val := os.Getenv(key)
v, err := strconv.ParseBool(val)
if err != nil {
log.Fatalf("invalid boolean environment variable '%s': %v", val, err)
}
return v
}

func RandomName(length int) string {
return strconv.FormatInt(time.Now().UnixMicro(), 10)
}
Expand Down Expand Up @@ -125,7 +107,7 @@ func DownloadFile(filepath string, url string) error {

func CheckToken(c *fiber.Ctx) error {
getToken := strings.Split(c.Get("Authorization"), " ")
if len(getToken) != 2 || !strings.EqualFold(getToken[1], GetEnv("TOKEN")) {
if len(getToken) != 2 || !strings.EqualFold(getToken[1], config.GetEnvOrDefault("TOKEN", "")) {
return errors.New("invalid token")
}
return nil
Expand Down
40 changes: 0 additions & 40 deletions service/util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,46 +28,6 @@ func TestDownloadFile(t *testing.T) {
}
}

func TestGetBool(t *testing.T) {
type args struct {
key string
}
tests := []struct {
args args
want bool
}{
// TODO: Add test cases.
{},
}
for i, tt := range tests {
t.Run(strconv.Itoa(i), func(t *testing.T) {
if got := GetBool(tt.args.key); got != tt.want {
t.Errorf("GetBool() = %v, want %v", got, tt.want)
}
})
}
}

func TestGetEnv(t *testing.T) {
type args struct {
key string
}
tests := []struct {
args args
want string
}{
// TODO: Add test cases.
{},
}
for i, tt := range tests {
t.Run(strconv.Itoa(i), func(t *testing.T) {
if got := GetEnv(tt.args.key); got != tt.want {
t.Errorf("GetEnv() = %v, want %v", got, tt.want)
}
})
}
}

func TestImageToByte(t *testing.T) {
type args struct {
img string
Expand Down

0 comments on commit bd0bee6

Please sign in to comment.