Compare commits

...

3 Commits

Author SHA1 Message Date
373fbc9c89 refactor deploy envs
Some checks failed
Lint / Lint (push) Failing after 3m17s
2024-12-10 16:57:59 +03:00
Pasha
dcb6d697c0 added main logic for validate
Some checks failed
Lint / Lint (push) Failing after 2m18s
2024-12-09 16:54:52 +03:00
Pasha
5d9c6ffc7e upd config with codeconv 2024-12-09 15:18:56 +03:00
7 changed files with 195 additions and 44 deletions

123
cmd/validator/main.go Normal file

@ -0,0 +1,123 @@
package main
import (
"bytes"
"context"
"fmt"
"gitea.pena/PenaSide/common/validate"
"gitea.pena/PenaSide/verification/internal/config"
"gitea.pena/PenaSide/verification/internal/repository"
"github.com/caarlos0/env/v8"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
"github.com/pioz/faker"
"log"
)
func main() {
cfg, err := loadConfig()
if err != nil {
log.Fatalf("error loading config: %v", err)
}
err = validateNotEmpty(cfg)
if err != nil {
log.Fatalf("error validating config: %v", err)
}
err = validateS3(cfg)
if err != nil {
log.Fatalf("error validating s3: %v", err)
}
if err = validate.ValidateTgToken(cfg.TelegramToken); err != nil {
log.Fatalf("error validating telegram token: %v", err)
}
if err = validate.ValidateMongo(cfg.ExternalCfg.Database); err != nil {
log.Fatalf("error validating mongodb: %v", err)
}
}
func loadConfig() (config.Config, error) {
var cfg config.Config
if err := env.Parse(&cfg); err != nil {
return cfg, err
}
return cfg, nil
}
func validateNotEmpty(cfg config.Config) error {
if cfg.TelegramChannelID == 0 {
return fmt.Errorf("TelegramChannelID is empty")
}
if cfg.ClientHttpURL == "" {
return fmt.Errorf("ClientHttpURL is empty")
}
if cfg.AdminHttpURL == "" {
return fmt.Errorf("AdminHttpURL is empty")
}
if cfg.CustomerMicroserviceRPCURL == "" {
return fmt.Errorf("CustomerMicroserviceRPCURL is empty")
}
if cfg.TrashLogHost == "" {
return fmt.Errorf("TrashLogHost is empty")
}
if cfg.VerificationMicroserviceURL == "" {
return fmt.Errorf("VerificationMicroserviceURL is empty")
}
return nil
}
func validateS3(cfg config.Config) error {
if cfg.S3Endpoint == "" {
return fmt.Errorf("s3 endpoint is empty")
}
if cfg.S3AccessKey == "" {
return fmt.Errorf("s3 access key is empty")
}
if cfg.S3SecretKey == "" {
return fmt.Errorf("s3 secret key is empty")
}
ctx := context.TODO()
client, err := minio.New(cfg.S3Endpoint, &minio.Options{
Creds: credentials.NewStaticV4(cfg.S3AccessKey, cfg.S3SecretKey, ""),
Secure: true,
})
if err != nil {
return fmt.Errorf("error creating minio client: %v", err)
}
objectName := faker.String()
content := []byte(faker.String())
contentType := "text/plain"
exist, err := client.BucketExists(ctx, repository.VerificationBucket)
if err != nil {
return fmt.Errorf("error find s3 bucket in validate: %w", err)
}
// не создаем бакет так как бакет могут не дать создать
if !exist {
log.Println("bucket does not exist")
return nil
}
_, err = client.PutObject(ctx, repository.VerificationBucket, objectName,
bytes.NewReader(content), int64(len(content)),
minio.PutObjectOptions{ContentType: contentType})
if err != nil {
return fmt.Errorf("error create test object: %w", err)
}
err = client.RemoveObject(ctx, repository.VerificationBucket, objectName, minio.RemoveObjectOptions{})
if err != nil {
return fmt.Errorf("error remove test object: %w", err)
}
return nil
}

@ -0,0 +1,12 @@
package main
import (
"gitea.pena/PenaSide/verification/internal/config"
"github.com/stretchr/testify/assert"
"testing"
)
func TestValidateS3(t *testing.T) {
err := validateS3(config.Config{S3Endpoint: "localhost:9000", S3AccessKey: "minioadmin", S3SecretKey: "minioadmin"})
assert.NoError(t, err)
}

@ -1,36 +1,37 @@
version: "3"
services:
verificationv1.0.0:
container_name: verification_servicev1.0.0
restart: unless-stopped
image: $CI_REGISTRY_IMAGE/staging:$CI_COMMIT_REF_SLUG.$CI_PIPELINE_ID
image: gitea.pena:3000/penaside/verification/staging:$GITHUB_RUN_NUMBER
hostname: verification_servicev1.0.0
ports:
- 10.8.0.6:7036:7035
- 10.8.0.6:7037:7036
- 10.7.0.6:7036:7035
- 10.7.0.6:7037:7036
- 10.7.0.6:7137:2345
command: dlv --listen=:2345 --headless=true --log=true --log-output=debugger,debuglineerr,gdbwire,lldbout,rpc --accept-multiclient --api-version=2 exec ./app
environment:
MONGO_URI: mongodb://$MONGO_USER:$MONGO_PASSWORD@10.8.0.6:27017/?authSource=verification
PENADISK_URL: $PENADISK_URL
TELEGRAM_TOKEN: $TELEGRAM_TOKEN
TELEGRAM_CHANNEL_ID: $TELEGRAM_CHANNEL_ID
CLIENT_HTTP_URL: ":7035"
ADMIN_HTTP_URL: ":7036"
S3_ENDPOINT: s3.timeweb.cloud
S3_ACCESS_KEY_ID: 5CV77KVDUU9H0II9R24M
S3_SECRET_KEY: 0W0m8DyvdAKRJnsAy6mB5zndQ7RouJBLhqhtThcu
JWT_SECRET: $JWT_SECRET
HTTP_ADDRESS_USER: ":7035"
HTTP_ADDRESS_ADMIN: ":7036"
MONGO_HOST: "10.8.0.6"
MONGO_PORT: "27017"
MONGO_USER: $MONGO_USER
MONGO_PASSWORD: $MONGO_PASSWORD
MONGO_AUTH: "verification"
MONGO_DATABASE_NAME: "verification"
CUSTOMER_SVC_ADDRESS: "http://10.8.0.6:9065"
STAGING_URL: "https://sadmin.pena"
S3_FOLDER: verification
S3_FILE_URL: https://3c580be9-cf31f296-d055-49cf-b39e-30c7959dc17b.s3.timeweb.cloud
CUSTOMER_SVC_MICROSERVICE_RPC_URL: "http://10.8.0.6:9065"
VERIFICATION_MICROSERVICE_URL: "https://sadmin.pena"
CUSTOMER_RPC_HOST: 10.8.0.6:9060
TRASH_LOG_HOST: 10.8.0.15:7113
TRASH_LOG_HOST: trashlog.pena:7113
MODULE_LOGGER: staging-verification
MONGO_URL: mongodb://verification:54143ffdd9304865586e5cf1@10.7.0.6:27017/?authSource=verification
MONGO_DB_NAME: verification
JWT_SECRET: >
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCLW1tlHyKC9AG0hGpmkksET2DE
r7ojSPemxFWAgFgcPJWQ7x3uNbsdJ3bIZFoA/FClaWKMCZmjnH9tv0bKZtY/CDhM
ZEyHpMruRSn6IKrxjtQZWy4uv/w6MzUeyBYG0OvNCiYpdvz5SkAGAUHD5ZNFqn2w
KKFD0I2Dr59BFVSGJwIDAQAB
-----END PUBLIC KEY-----
tty: true

7
go.mod

@ -5,7 +5,7 @@ go 1.22.0
toolchain go1.22.2
require (
gitea.pena/PenaSide/common v0.0.0-20241128160655-fe730a08b5f1
gitea.pena/PenaSide/common v0.0.0-20241206095133-a4a6f7df8b45
gitea.pena/PenaSide/customer v0.0.0-20241118214409-34a88a3a7001 //dev
gitea.pena/PenaSide/trashlog v0.0.0-20241119225515-2fd267647ca4 //dev
github.com/caarlos0/env/v8 v8.0.0
@ -19,7 +19,10 @@ require (
go.uber.org/zap v1.27.0
)
require gitea.pena/PenaSide/linters-golang v0.0.0-20241207122018-933207374735
require (
gitea.pena/PenaSide/linters-golang v0.0.0-20241207122018-933207374735
github.com/pioz/faker v1.7.3
)
require (
github.com/ClickHouse/clickhouse-go v1.5.4 // indirect

5
go.sum

@ -1,5 +1,5 @@
gitea.pena/PenaSide/common v0.0.0-20241128160655-fe730a08b5f1 h1:w1AAxrlZGmxUI9NAa/0TYsc6sqWWF9yAzQaLL/KxwrM=
gitea.pena/PenaSide/common v0.0.0-20241128160655-fe730a08b5f1/go.mod h1:l71j3W1yROhOSfjWZ6wcMuzjBR37gu2ZTcXsorEJoiw=
gitea.pena/PenaSide/common v0.0.0-20241206095133-a4a6f7df8b45 h1:0YzvHSgRitVeqvniSCPr6BERHusGP5yrGozAITYbWmg=
gitea.pena/PenaSide/common v0.0.0-20241206095133-a4a6f7df8b45/go.mod h1:BDk6/EA9ekKun+UP7UBLcczhlmFRLxglYi00G9FBkUw=
gitea.pena/PenaSide/customer v0.0.0-20241118214409-34a88a3a7001 h1:bnwlhVx7LzwAYgx25G8/qezqkXvatL1de9nQZvpO0IE=
gitea.pena/PenaSide/customer v0.0.0-20241118214409-34a88a3a7001/go.mod h1:6lKbvPc2E2TcNSxG8WlC/XBuhqW6smKQtpYPLedheqU=
gitea.pena/PenaSide/linters-golang v0.0.0-20241207122018-933207374735 h1:jDVeUhGBTXBibmW5dmtJg2m2+z5z2Rf6J4G0LpjVoJ0=
@ -128,6 +128,7 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=

@ -2,6 +2,7 @@ package app
import (
"context"
"fmt"
mongo "gitea.pena/PenaSide/common/mongo"
"gitea.pena/PenaSide/customer/pkg/customer_clients"
"gitea.pena/PenaSide/trashlog/app"
@ -49,12 +50,12 @@ func Run(cfg *config.Config, build Build) {
return zapcore.NewTee(core, clickHouseLogger)
}), zap.AddCallerSkip(2))
loggerHlog := hlog.New(loggerForHlog).Module(cfg.ModuleLogger)
loggerHlog := hlog.New(loggerForHlog).Module(config.ModuleLogger)
loggerHlog.With(models.AllFields{})
loggerHlog.Emit(app.InfoSvcStarted{})
mongoDB, err := mongo.Connect(ctx, &mongo.ConnectDeps{
Configuration: &cfg.Database,
Configuration: &cfg.ExternalCfg.Database,
Timeout: 5 * time.Second,
})
@ -63,7 +64,7 @@ func Run(cfg *config.Config, build Build) {
}
minioClient, err := minio.New(cfg.S3Endpoint, &minio.Options{
Creds: credentials.NewStaticV4(cfg.S3AccessKeyID, cfg.S3SecretKey, ""),
Creds: credentials.NewStaticV4(cfg.S3AccessKey, cfg.S3SecretKey, ""),
Secure: true,
})
if err != nil {
@ -80,15 +81,20 @@ func Run(cfg *config.Config, build Build) {
logger.Fatal("TelegramBotApi", zap.Error(err))
}
_, err = tgBot.Send(tgbotapi.NewMessage(cfg.TelegramChannelID, fmt.Sprintf("PING MSG from %s", config.ModuleLogger)))
if err != nil {
logger.Fatal("Send TG ping", zap.Error(err))
}
telegram := client.NewTelegram(client.Deps{
Logger: logger,
Bot: tgBot,
ChatID: cfg.TelegramChannelID,
StagingURL: cfg.StagingURL,
StagingURL: cfg.VerificationMicroserviceURL,
})
cons := initialize.NewControllers(reps, telegram, customer_clients.NewCustomersClient(customer_clients.CustomersClientDeps{
Logger: logger,
CustomerServiceHost: cfg.CustomerRPCHost,
CustomerServiceHost: cfg.CustomerMicroserviceRPCURL,
}))
userSrv := server.NewHTTP(server.ServerConfig{
@ -104,13 +110,13 @@ func Run(cfg *config.Config, build Build) {
})
go func() {
if err := userSrv.Start(cfg.HttpAddressUser); err != nil {
if err := userSrv.Start(cfg.ClientHttpURL); err != nil {
logger.Fatal("Server startup error", zap.Error(err))
}
}()
go func() {
if err := adminSrv.Start(cfg.HttpAddressAdmin); err != nil {
if err := adminSrv.Start(cfg.AdminHttpURL); err != nil {
logger.Fatal("Server startup error", zap.Error(err))
}
}()

@ -9,18 +9,21 @@ import (
type Config struct {
TelegramToken string `env:"TELEGRAM_TOKEN,required"`
TelegramChannelID int64 `env:"TELEGRAM_CHANNEL_ID,required"`
HttpAddressUser string `env:"HTTP_ADDRESS_USER,required"`
HttpAddressAdmin string `env:"HTTP_ADDRESS_ADMIN,required"`
ClientHttpURL string `env:"CLIENT_HTTP_URL,required"`
AdminHttpURL string `env:"ADMIN_HTTP_URL,required"`
S3Endpoint string `env:"S3_ENDPOINT,required"`
S3AccessKeyID string `env:"S3_ACCESS_KEY_ID,required"`
S3AccessKey string `env:"S3_ACCESS_KEY,required"`
S3SecretKey string `env:"S3_SECRET_KEY,required"`
CustomerSvcAddress string `env:"CUSTOMER_SVC_ADDRESS,required"`
StagingURL string `env:"STAGING_URL,required"`
S3Folder string `env:"S3_FOLDER,required"`
S3FileUrl string `env:"S3_FILE_URL,required"`
CustomerRPCHost string `env:"CUSTOMER_RPC_HOST,required"`
CustomerMicroserviceRPCURL string `env:"CUSTOMER_MICROSERVICE_RPC_URL,required"`
TrashLogHost string `env:"TRASH_LOG_HOST,required"`
ModuleLogger string `env:"MODULE_LOGGER,required"`
// TODO: совсем непонятное название. эта штука собой представляет домен, админки стейджинга или прода в зависимости от того, со стейджинга или с прода пришла заявка и нужен только для формирования удобного для админа сообщения в телегу
VerificationMicroserviceURL string `env:"VERIFICATION_MICROSERVICE_URL,required"`
ExternalCfg External
}
type External struct {
Database mongo.Configuration
}
@ -36,3 +39,5 @@ func NewConfig(file ...string) (*Config, error) {
return &cfg, nil
}
const ModuleLogger = "verification"