summaryrefslogtreecommitdiffci
path: root/config
diff refs
from: back
to: back
| flip
diff options
context:
space:
mode:
Diffstat (limited to 'config')
-rw-r--r--config/config.go305
-rw-r--r--config/config.local.yaml81
-rw-r--r--config/config.prod.yaml88
-rw-r--r--config/config.stage.yaml81
4 files changed, 0 insertions, 555 deletions
diff --git a/config/config.go b/config/config.go
deleted file mode 100644
index 9185e6a..0000000
--- a/config/config.go
+++ /dev/null
@@ -1,305 +0,0 @@
-package config
-
-import (
- "encoding/json"
- "fmt"
- "log/slog"
- "os"
-
- "github.com/go-playground/validator/v10"
- "gopkg.in/yaml.v3"
-)
-
-type Config struct {
- LogLevel slog.Level `json:"LogLevel" yaml:"logLevel" validate:"required"`
- Endpoint EndpointConfig `json:"Endpoint" yaml:"endpoint" validate:"required"`
- BlogPages BlogPagesConfig `json:"BlogPages" yaml:"blogPages" validate:"required"`
- FactGiver FactGiverConfig `json:"FactGiver" yaml:"factGiver" validate:"required"`
- LocalePath string `json:"LocalePath" yaml:"localePath" validate:"required,filepath"`
- AvailableLanguages []AvailableLanguageConfig `json:"AvailableLanguages" yaml:"availableLanguages" validate:"required"`
- Auth AuthConfig `json:"Auth" yaml:"auth" validate:"required"`
- Mail MailConfig `json:"Mail" yaml:"mail" validate:"required"`
- CanonicalEndpoint string `json:"CanonicalEndpoint" yaml:"canonicalEndpoint" validate:"required"`
- Meta []MetaConfig `json:"Meta" yaml:"meta"`
- PhotoStorage PhotoStorageConfig `json:"PhotoStorage" yaml:"photoStorage"`
- StaticStorage StaticStorageConfig `json:"StaticStorage" yaml:"staticStorage" validate:"required"`
- AllowOrigins []string `json:"AllowOrigins" yaml:"allowOrigins"`
-}
-
-type EndpointConfig struct {
- Type string `json:"Type" yaml:"type" validate:"required,oneof=http unix"`
- Config any `json:"Config" yaml:"config" validate:"required"`
-}
-
-func (ec *EndpointConfig) UnmarshalJSON(data []byte) error {
- var tmp struct {
- Type string `json:"Type"`
- Config json.RawMessage `json:"Config"`
- }
-
- if err := json.Unmarshal(data, &tmp); err != nil {
- return err
- }
-
- ec.Type = tmp.Type
-
- switch tmp.Type {
- case "http":
- var httpConfig HttpConfig
- if err := json.Unmarshal(tmp.Config, &httpConfig); err != nil {
- return fmt.Errorf("unmarshal HttpConfig: %w", err)
- }
- ec.Config = &httpConfig
- case "unix":
- var unixConfig UnixConfig
- if err := json.Unmarshal(tmp.Config, &unixConfig); err != nil {
- return fmt.Errorf("unmarshal UnixConfig: %w", err)
- }
- ec.Config = &unixConfig
- default:
- return fmt.Errorf("unsupported storage type: %s", tmp.Type)
- }
-
- return nil
-}
-
-func (ec *EndpointConfig) UnmarshalYAML(value *yaml.Node) error {
- var tmp struct {
- Type string `yaml:"type"`
- Config yaml.Node `yaml:"config"`
- }
-
- if err := value.Decode(&tmp); err != nil {
- return err
- }
-
- ec.Type = tmp.Type
-
- switch tmp.Type {
- case "http":
- var httpConfig HttpConfig
- if err := tmp.Config.Decode(&httpConfig); err != nil {
- return fmt.Errorf("unmarshal HttpConfig: %w", err)
- }
- ec.Config = &httpConfig
- case "unix":
- var unixConfig UnixConfig
- if err := tmp.Config.Decode(&unixConfig); err != nil {
- return fmt.Errorf("unmarshal UnixConfig: %w", err)
- }
- ec.Config = &unixConfig
- default:
- return fmt.Errorf("unsupported storage type: %s", tmp.Type)
- }
-
- return nil
-}
-
-type HttpConfig struct {
- ListenOn string `json:"ListenOn" yaml:"listenOn" validate:"required"`
-}
-
-type UnixConfig struct {
- Path string `json:"Path" yaml:"path" validate:"required"`
- Chmod string `json:"Chmod" yaml:"chmod" validate:"oneof=0600 0660 0666"`
-}
-
-type BlogPagesConfig struct {
- Storage StorageConfig `json:"Storage" yaml:"storage" validate:"required"`
-}
-
-type StorageConfig struct {
- Type string `json:"Type" yaml:"type" validate:"required,oneof=b2 s3"`
- Config any `json:"Config" yaml:"config" validate:"required"`
-}
-
-func (sc *StorageConfig) UnmarshalJSON(data []byte) error {
- var tmp struct {
- Type string `json:"Type"`
- Config json.RawMessage `json:"Config"`
- }
-
- if err := json.Unmarshal(data, &tmp); err != nil {
- return err
- }
-
- sc.Type = tmp.Type
-
- switch tmp.Type {
- case "b2":
- var b2Config B2Config
- if err := json.Unmarshal(tmp.Config, &b2Config); err != nil {
- return fmt.Errorf("unmarshal B2Config: %w", err)
- }
- sc.Config = &b2Config
- case "s3":
- var s3Config S3Config
- if err := json.Unmarshal(tmp.Config, &s3Config); err != nil {
- return fmt.Errorf("unmarshal S3Config: %w", err)
- }
- sc.Config = &s3Config
- default:
- return fmt.Errorf("unsupported storage type: %s", tmp.Type)
- }
-
- return nil
-}
-
-func (sc *StorageConfig) UnmarshalYAML(value *yaml.Node) error {
- var tmp struct {
- Type string `yaml:"type"`
- Config yaml.Node `yaml:"config"`
- }
-
- if err := value.Decode(&tmp); err != nil {
- return err
- }
-
- sc.Type = tmp.Type
-
- switch tmp.Type {
- case "b2":
- var b2Config B2Config
- if err := tmp.Config.Decode(&b2Config); err != nil {
- return fmt.Errorf("unmarshal B2Config: %w", err)
- }
- sc.Config = &b2Config
- case "s3":
- var s3Config S3Config
- if err := tmp.Config.Decode(&s3Config); err != nil {
- return fmt.Errorf("unmarshal S3Config: %w", err)
- }
- sc.Config = &s3Config
- default:
- return fmt.Errorf("unsupported storage type: %s", tmp.Type)
- }
-
- return nil
-}
-
-type B2Config struct {
- BucketName string `json:"BucketName" yaml:"bucketName" validate:"required,min=1"`
- Region string `json:"Region" yaml:"region" validate:"required,min=1"`
- Prefix string `json:"Prefix" yaml:"prefix"`
- KeyID string `json:"KeyID" yaml:"keyID"`
- ApplicationKey string `json:"ApplicationKey" yaml:"applicationKey"`
-}
-
-type S3Config struct {
- BucketName string `json:"BucketName" yaml:"bucketName" validate:"required,min=1"`
- Region string `json:"Region" yaml:"region" validate:"required,min=1"`
- Prefix string `json:"Prefix" yaml:"prefix"`
- Endpoint string `json:"Endpoint" yaml:"endpoint" validate:"url"`
- UsePathStyle bool `json:"UsePathStyle"`
- AccessKeyID string `json:"AccessKeyID" yaml:"accessKeyID"`
- SecretAccessKey string `json:"SecretAccessKey" yaml:"secretAccessKey"`
-}
-
-type FactGiverConfig struct {
- Storage StorageConfig `json:"Storage" yaml:"storage" validate:"required"`
- FactsFileName string `json:"FactsFileName" yaml:"factsFileName" validate:"required"`
-}
-
-type AvailableLanguageConfig struct {
- Name string `json:"Name" yaml:"name" validate:"required"`
- Alt string `json:"Alt" yaml:"alt"`
- Flag string `json:"Flag" yaml:"flag" validate:"url"`
- LocFile string `json:"LocFile" yaml:"locFile" validate:"required,filepath"`
-}
-
-type AuthConfig struct {
- Salt string `json:"Salt" yaml:"salt" validate:"required"`
- Db DbConfig `json:"Db" yaml:"db" validate:"required"`
-}
-
-type DbConfig struct {
- Type string `json:"Type" yaml:"type" validate:"required,oneof=sqlite3"`
- Cfg Sqlite3Config `json:"Config" yaml:"config"`
-}
-
-type Sqlite3Config struct {
- DSN string `json:"DSN" yaml:"dsn" validate:"required"`
-}
-
-type MailConfig struct {
- ClientHost string `json:"ClientHost" yaml:"clientHost" validate:"required"`
- MailHost string `json:"MailHost" yaml:"mailHost" validate:"required"`
- PublicName string `json:"PublicName" yaml:"publicName" validate:"required"`
- MailAddress string `json:"MailAddress" yaml:"mailAddress" validate:"required"`
- Username string `json:"Username" yaml:"username" validate:"required"`
- Password string `json:"Password" yaml:"password" validate:"required"`
- Salt string `json:"Salt" yaml:"salt" validate:"required"`
- Trigger TriggerConfig `json:"Trigger" yaml:"trigger" validate:"required"`
-}
-
-type TriggerConfig struct {
- OnNewPost string `json:"OnNewPost" yaml:"onNewPost" validate:"cron,required"`
-}
-
-type MetaConfig struct {
- Name string `json:"Name" yaml:"name"`
- Value string `json:"Value" yaml:"value"`
-}
-
-type PhotoStorageConfig struct {
- Full PhotoTypeConfig `json:"Full" yaml:"full" validate:"required"`
- Webp PhotoTypeConfig `json:"Webp" yaml:"webp"`
- Thumbnail1600p PhotoTypeConfig `json:"Thumbnail1600p" yaml:"thumbnail1600p"`
- Thumbnail1200p PhotoTypeConfig `json:"Thumbnail1200p" yaml:"thumbnail1200p"`
- Thumbnail800p PhotoTypeConfig `json:"Thumbnail800p" yaml:"thumbnail800p"`
- Thumbnail560p PhotoTypeConfig `json:"Thumbnail560p" yaml:"thumbnail560p"`
- Thumbnail320p PhotoTypeConfig `json:"Thumbnail320p" yaml:"thumbnail320p"`
- HomePageGifs HomePageGifsConfig `json:"HomePageGifs" yaml:"homePageGifs"`
-}
-
-type PhotoTypeConfig struct {
- BaseUrl string `json:"BaseUrl" yaml:"baseUrl" validate:"url,required"`
-}
-
-type HomePageGifsConfig struct {
- BaseUrl string `json:"BaseUrl" yaml:"baseUrl" validate:"url,required"`
- Indexes []string `json:"Indexes" yaml:"indexes"`
-}
-
-type StaticStorageConfig struct {
- BaseUrl string `json:"BaseUrl" yaml:"baseUrl" validate:"url,required"`
- Map MapStorageConfig `json:"Map" yaml:"map" validate:"required"`
-}
-
-type MapStorageConfig struct {
- BaseUrl string `json:"BaseUrl" yaml:"baseUrl" validate:"url,required"`
- PMTiles string `json:"PMTiles" yaml:"pmTiles" validate:"required"`
-}
-
-func LoadConfig(path string, config *Config) error {
- fileBytes, err := os.ReadFile(path)
- if err != nil {
- return err
- }
-
- expandedFileBytes := []byte(os.ExpandEnv(string(fileBytes)))
-
- if err = yaml.Unmarshal(expandedFileBytes, config); err != nil {
- return err
- }
-
- return nil
-}
-
-func InitConfig(path string) (*Config, error) {
- config := &Config{}
- if err := LoadConfig(path, config); err != nil {
- return nil, err
- }
-
- if config.Endpoint.Type == "unix" && config.Endpoint.Config.(*UnixConfig).Chmod == "" {
- config.Endpoint.Config.(*UnixConfig).Chmod = "0660"
- }
-
- validate := validator.New(validator.WithRequiredStructEnabled())
- if err := validate.Struct(config); err != nil {
- return nil, err
- }
-
- return config, nil
-}
diff --git a/config/config.local.yaml b/config/config.local.yaml
deleted file mode 100644
index fefe2e7..0000000
--- a/config/config.local.yaml
+++ /dev/null
@@ -1,81 +0,0 @@
-logLevel: debug
-endpoint:
- type: http
- config:
- listenOn: ":3000"
-blogPages:
- storage:
- type: s3
- config:
- bucketName: sayauz-pages
- region: kz1
- prefix: "stage-"
- endpoint: "https://storage.yandexcloud.kz"
- usePathStyle: true
- accessKeyID: "${S3_ACCESS_KEY_ID}"
- secretAccessKey: "${S3_SECRET_ACCESS_KEY}"
-factGiver:
- storage:
- type: s3
- config:
- bucketName: sayauz-pages
- region: kz1
- prefix: ""
- endpoint: "https://storage.yandexcloud.kz"
- usePathStyle: true
- accessKeyID: "${S3_ACCESS_KEY_ID}"
- secretAccessKey: "${S3_SECRET_ACCESS_KEY}"
- factsFileName: "facts-*.txt"
-localePath: ./locale/
-availableLanguages:
- - name: ru
- alt: Русский
- flag: https://cdn.saya.uz/stats/flags/ru.svg
- locFile: localization.ru.yaml
- - name: en
- alt: English
- flag: https://cdn.saya.uz/stats/flags/gb.svg
- locFile: localization.en.yaml
-auth:
- db:
- type: sqlite3
- config:
- # dsn: 'file:/tmp/auth.db?cache=shared&mode=rwc&_journal_mode=WAL'
- dsn: "file:/tmp/auth.db?cache=private&mode=rwc&_locking_mode=EXCLUSIVE&_mutex=no&_auto_vacuum=2&_journal_mode=WAL"
- salt: "123"
-mail:
- clientHost: "127.0.0.1:3000"
- mailHost: "${MAIL_HOST}"
- publicName: "LOCAL.SAYA.UZ"
- mailAddress: "${MAIL_ADDRESS}"
- username: "${MAIL_USERNAME}"
- password: "${MAIL_PASSWORD}"
- salt: "${MAIL_SALT}"
- trigger:
- onNewPost: "* * * * *"
-canonicalEndpoint: "http://127.0.0.1:3000"
-photoStorage:
- full:
- baseUrl: https://cdn.saya.uz/photos/jpeg-full/%s
- webp:
- baseUrl: https://cdn.saya.uz/photos/webp-full/%s.webp
- thumbnail1600p:
- baseUrl: https://cdn.saya.uz/photos/webp-1600p/%s.webp
- thumbnail1200p:
- baseUrl: https://cdn.saya.uz/photos/webp-1200p/%s.webp
- thumbnail800p:
- baseUrl: https://cdn.saya.uz/photos/webp-800p/%s.webp
- thumbnail560p:
- baseUrl: https://cdn.saya.uz/photos/webp-560p/%s.webp
- thumbnail320p:
- baseUrl: https://cdn.saya.uz/photos/webp-320p/%s.webp
- homePageGifs:
- baseUrl: https://cdn.saya.uz/stats/home-page-gifs/otter-%s.gif
- indexes: ["1", "2", "3"]
-staticStorage:
- baseUrl: https://cdn.saya.uz/stats
- map:
- baseUrl: https://cdn.saya.uz/map
- pmTiles: global.pmtiles
-allowOrigins:
- - https://cdn.saya.uz
diff --git a/config/config.prod.yaml b/config/config.prod.yaml
deleted file mode 100644
index 6ec00d8..0000000
--- a/config/config.prod.yaml
+++ /dev/null
@@ -1,88 +0,0 @@
-logLevel: info
-endpoint:
- type: unix
- config:
- path: "/etc/sayauz/prod.socket"
- chmod: '0666'
-blogPages:
- storage:
- type: s3
- config:
- bucketName: sayauz-pages
- region: kz1
- prefix: "prod-"
- endpoint: "https://storage.yandexcloud.kz"
- usePathStyle: true
- accessKeyID: "${S3_ACCESS_KEY_ID}"
- secretAccessKey: "${S3_SECRET_ACCESS_KEY}"
-factGiver:
- storage:
- type: s3
- config:
- bucketName: sayauz-pages
- region: kz1
- prefix: ""
- endpoint: "https://storage.yandexcloud.kz"
- usePathStyle: true
- accessKeyID: "${S3_ACCESS_KEY_ID}"
- secretAccessKey: "${S3_SECRET_ACCESS_KEY}"
- factsFileName: "facts-*.txt"
-localePath: ./locale/
-availableLanguages:
- - name: ru
- alt: Русский
- flag: https://cdn.saya.uz/stats/flags/ru.svg
- locFile: localization.ru.yaml
- - name: en
- alt: English
- flag: https://cdn.saya.uz/stats/flags/gb.svg
- locFile: localization.en.yaml
-auth:
- db:
- type: sqlite3
- config:
- dsn: "file:/data/auth.db?cache=private&mode=rwc&_locking_mode=EXCLUSIVE&_mutex=no&_auto_vacuum=2&_journal_mode=WAL"
- salt: "${AUTH_SALT}"
-mail:
- clientHost: "${FQDN}"
- mailHost: "${MAIL_HOST}"
- publicName: "SAYA.UZ"
- mailAddress: "${MAIL_ADDRESS}"
- username: "${MAIL_USERNAME}"
- password: "${MAIL_PASSWORD}"
- salt: "${MAIL_SALT}"
- trigger:
- onNewPost: "0/5 * * * *"
-canonicalEndpoint: "https://${FQDN}"
-meta:
- - name: google-site-verification
- value: "${GOOGLE_SITE_VERIFICATION}"
- - name: yandex-verification
- value: "${YANDEX_VERIFICATION}"
- - name: msvalidate.01
- value: "${BING_VERIFICATION}"
-photoStorage:
- full:
- baseUrl: https://cdn.saya.uz/photos/jpeg-full/%s
- webp:
- baseUrl: https://cdn.saya.uz/photos/webp-full/%s.webp
- thumbnail1600p:
- baseUrl: https://cdn.saya.uz/photos/webp-1600p/%s.webp
- thumbnail1200p:
- baseUrl: https://cdn.saya.uz/photos/webp-1200p/%s.webp
- thumbnail800p:
- baseUrl: https://cdn.saya.uz/photos/webp-800p/%s.webp
- thumbnail560p:
- baseUrl: https://cdn.saya.uz/photos/webp-560p/%s.webp
- thumbnail320p:
- baseUrl: https://cdn.saya.uz/photos/webp-320p/%s.webp
- homePageGifs:
- baseUrl: https://cdn.saya.uz/stats/home-page-gifs/otter-%s.gif
- indexes: ["1", "2", "3"]
-staticStorage:
- baseUrl: https://cdn.saya.uz/stats
- map:
- baseUrl: https://cdn.saya.uz/map
- pmTiles: global.pmtiles
-allowOrigins:
- - https://cdn.saya.uz
diff --git a/config/config.stage.yaml b/config/config.stage.yaml
deleted file mode 100644
index d8819ca..0000000
--- a/config/config.stage.yaml
+++ /dev/null
@@ -1,81 +0,0 @@
-logLevel: debug
-endpoint:
- type: unix
- config:
- path: "/etc/sayauz/stage.socket"
- chmod: '0666'
-blogPages:
- storage:
- type: s3
- config:
- bucketName: sayauz-pages
- region: kz1
- prefix: "stage-"
- endpoint: "https://storage.yandexcloud.kz"
- usePathStyle: true
- accessKeyID: "${S3_ACCESS_KEY_ID}"
- secretAccessKey: "${S3_SECRET_ACCESS_KEY}"
-factGiver:
- storage:
- type: s3
- config:
- bucketName: sayauz-pages
- region: kz1
- prefix: ""
- endpoint: "https://storage.yandexcloud.kz"
- usePathStyle: true
- accessKeyID: "${S3_ACCESS_KEY_ID}"
- secretAccessKey: "${S3_SECRET_ACCESS_KEY}"
- factsFileName: "facts-*.txt"
-localePath: ./locale/
-availableLanguages:
- - name: ru
- alt: Русский
- flag: https://cdn.saya.uz/stats/flags/ru.svg
- locFile: localization.ru.yaml
- - name: en
- alt: English
- flag: https://cdn.saya.uz/stats/flags/gb.svg
- locFile: localization.en.yaml
-auth:
- db:
- type: sqlite3
- config:
- dsn: "file:/data/auth.db?cache=private&mode=rwc&_locking_mode=EXCLUSIVE&_mutex=no&_auto_vacuum=2&_journal_mode=WAL"
- salt: "${AUTH_SALT}"
-mail:
- clientHost: "${FQDN}"
- mailHost: "${MAIL_HOST}"
- publicName: "STAGE.SAYA.UZ"
- mailAddress: "${MAIL_ADDRESS}"
- username: "${MAIL_USERNAME}"
- password: "${MAIL_PASSWORD}"
- salt: "${MAIL_SALT}"
- trigger:
- onNewPost: "0/3 * * * *"
-canonicalEndpoint: "https://${FQDN}"
-photoStorage:
- full:
- baseUrl: https://cdn.saya.uz/photos/jpeg-full/%s
- webp:
- baseUrl: https://cdn.saya.uz/photos/webp-full/%s.webp
- thumbnail1600p:
- baseUrl: https://cdn.saya.uz/photos/webp-1600p/%s.webp
- thumbnail1200p:
- baseUrl: https://cdn.saya.uz/photos/webp-1200p/%s.webp
- thumbnail800p:
- baseUrl: https://cdn.saya.uz/photos/webp-800p/%s.webp
- thumbnail560p:
- baseUrl: https://cdn.saya.uz/photos/webp-560p/%s.webp
- thumbnail320p:
- baseUrl: https://cdn.saya.uz/photos/webp-320p/%s.webp
- homePageGifs:
- baseUrl: https://cdn.saya.uz/stats/home-page-gifs/otter-%s.gif
- indexes: ["1", "2", "3"]
-staticStorage:
- baseUrl: https://cdn.saya.uz/stats
- map:
- baseUrl: https://cdn.saya.uz/map
- pmTiles: global.pmtiles
-allowOrigins:
- - https://cdn.saya.uz