From 53ac1ff09e2040cd2b96338ee2f2516387917a8d Mon Sep 17 00:00:00 2001 From: RD2W Date: Wed, 3 Dec 2025 16:58:28 +0300 Subject: [PATCH 1/3] feat(systemd): add systemd service files for gRPC and web servers --- etc/systemd/system/go-notes-grpc.service | 34 ++++++++++++++++++++++++ etc/systemd/system/go-notes-web.service | 34 ++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 etc/systemd/system/go-notes-grpc.service create mode 100644 etc/systemd/system/go-notes-web.service diff --git a/etc/systemd/system/go-notes-grpc.service b/etc/systemd/system/go-notes-grpc.service new file mode 100644 index 0000000..d1fc88b --- /dev/null +++ b/etc/systemd/system/go-notes-grpc.service @@ -0,0 +1,34 @@ +[Unit] +Description=Go Notes gRPC Server +After=network.target +Wants=network-online.target + +[Service] +Type=simple +User=go-notes +Group=go-notes +WorkingDirectory=/opt/go-notes +ExecStart=/opt/go-notes/grpc-server +ExecReload=/bin/kill -HUP $MAINPID +Restart=always +RestartSec=10 +StandardOutput=journal +StandardError=journal +SyslogIdentifier=go-notes-grpc + +# Environment variables for configuration +Environment=ENV=production +Environment=LOG_LEVEL=info +Environment=SERVER_GRPC_PORT=:50051 +Environment=POSTGRES_HOST=localhost +Environment=POSTGRES_PORT=5432 +Environment=POSTGRES_NAME=go_notes +Environment=POSTGRES_USER=postgres +Environment=POSTGRES_PASSWORD= +Environment=REDIS_HOST=localhost +Environment=REDIS_PORT=6379 +Environment=JWT_SECRET_KEY= +Environment=REFRESH_SECRET_KEY= + +[Install] +WantedBy=multi-user.target diff --git a/etc/systemd/system/go-notes-web.service b/etc/systemd/system/go-notes-web.service new file mode 100644 index 0000000..1ac23bb --- /dev/null +++ b/etc/systemd/system/go-notes-web.service @@ -0,0 +1,34 @@ +[Unit] +Description=Go Notes Web Server +After=network.target +Wants=network-online.target + +[Service] +Type=simple +User=go-notes +Group=go-notes +WorkingDirectory=/opt/go-notes +ExecStart=/opt/go-notes/web-server +ExecReload=/bin/kill -HUP $MAINPID +Restart=always +RestartSec=10 +StandardOutput=journal +StandardError=journal +SyslogIdentifier=go-notes-web + +# Environment variables for configuration +Environment=ENV=production +Environment=LOG_LEVEL=info +Environment=SERVER_PORT=:8080 +Environment=POSTGRES_HOST=localhost +Environment=POSTGRES_PORT=5432 +Environment=POSTGRES_NAME=go_notes +Environment=POSTGRES_USER=postgres +Environment=POSTGRES_PASSWORD= +Environment=REDIS_HOST=localhost +Environment=REDIS_PORT=6379 +Environment=JWT_SECRET_KEY= +Environment=REFRESH_SECRET_KEY= + +[Install] +WantedBy=multi-user.target From c0a532ac01bf0a4698afd4da671f453d75c58398 Mon Sep 17 00:00:00 2001 From: RD2W Date: Wed, 3 Dec 2025 17:20:45 +0300 Subject: [PATCH 2/3] feat: add versioning info to Web and gRPC server main files --- cmd/grpc-server/main.go | 10 ++++++++++ cmd/web-server/main.go | 10 ++++++++++ go.mod | 6 +++--- go.sum | 43 +++++++++++++++++++++++++++++++++++------ 4 files changed, 60 insertions(+), 9 deletions(-) diff --git a/cmd/grpc-server/main.go b/cmd/grpc-server/main.go index 9cf2267..6fd5804 100644 --- a/cmd/grpc-server/main.go +++ b/cmd/grpc-server/main.go @@ -7,7 +7,17 @@ import ( "github.com/rd2w/go-notes/internal/config" ) +// Переменные для версионирования, заполняются при сборке +var ( + version string = "dev" + commit string = "unknown" + date string = "unknown" +) + func main() { + // Выводим информацию о версии + log.Printf("Запуск gRPC-сервера. Версия: %s, Коммит: %s, Дата сборки: %s", version, commit, date) + // Загружаем конфигурацию cfg, err := config.LoadConfig("config/config_dev.toml") if err != nil { diff --git a/cmd/web-server/main.go b/cmd/web-server/main.go index 217edd2..0b0f611 100644 --- a/cmd/web-server/main.go +++ b/cmd/web-server/main.go @@ -9,6 +9,13 @@ import ( _ "github.com/rd2w/go-notes/docs" ) +// Переменные для версионирования, заполняются при сборке +var ( + version string = "dev" + commit string = "unknown" + date string = "unknown" +) + // @title Go Notes API // @version 1.0 // @description API для управления заметками и пользователями @@ -19,6 +26,9 @@ import ( // @name Authorization // @description JWT Authorization header using the Bearer scheme func main() { + // Выводим информацию о версии + log.Printf("Запуск веб-сервера. Версия: %s, Коммит: %s, Дата сборки: %s", version, commit, date) + // Загружаем конфигурацию из файла cfg, err := config.LoadConfig("./config/config_dev.toml") if err != nil { diff --git a/go.mod b/go.mod index 0025da8..88a48ee 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/google/uuid v1.6.0 github.com/jackc/pgx/v5 v5.7.6 github.com/pelletier/go-toml/v2 v2.2.4 - github.com/redis/go-redis/v9 v9.17.0 + github.com/redis/go-redis/v9 v9.17.2 github.com/stretchr/testify v1.11.1 github.com/swaggo/files v1.0.1 github.com/swaggo/gin-swagger v1.6.1 @@ -43,7 +43,7 @@ require ( github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.28.0 // indirect github.com/goccy/go-json v0.10.5 // indirect - github.com/goccy/go-yaml v1.18.0 // indirect + github.com/goccy/go-yaml v1.19.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect @@ -69,6 +69,6 @@ require ( golang.org/x/sys v0.38.0 // indirect golang.org/x/text v0.31.0 // indirect golang.org/x/tools v0.39.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 99b6e12..2b2ab45 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,10 @@ +cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= @@ -12,14 +17,21 @@ github.com/bytedance/sonic/loader v0.4.0 h1:olZ7lEqcxtZygCK9EKYKADnpQoYkRQxaeY2N github.com/bytedance/sonic/loader v0.4.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= +github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f/go.mod h1:HlzOvOjVBOfTGSRXRyY0OiCS/3J1akRGQQpRO/7zyF4= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329/go.mod h1:Alz8LEClvR7xKsrq3qzoc4N0guvVNSS8KmSChGYr9hs= +github.com/envoyproxy/go-control-plane/envoy v1.35.0/go.mod h1:09qwbGVuSWWAyN5t/b3iyVfz5+z8QWGrzkoqm/8SbEs= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= +github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/gabriel-vasile/mimetype v1.4.11 h1:AQvxbp830wPhHTqc1u7nzoLT+ZFxGY7emj5DR5DYFik= github.com/gabriel-vasile/mimetype v1.4.11/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= @@ -28,6 +40,7 @@ github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk= github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls= +github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= @@ -39,6 +52,7 @@ github.com/go-openapi/jsonreference v0.21.3/go.mod h1:RqkUP0MrLf37HqxZxrIAtTWW4Z github.com/go-openapi/spec v0.22.1 h1:beZMa5AVQzRspNjvhe5aG1/XyBSMeX1eEOs7dMoXh/k= github.com/go-openapi/spec v0.22.1/go.mod h1:c7aeIQT175dVowfp7FeCvXXnjN/MrpaONStibD2WtDA= github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= +github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag/conv v0.25.4 h1:/Dd7p0LZXczgUcC/Ikm1+YqVzkEeCc9LnOWjfkpkfe4= github.com/go-openapi/swag/conv v0.25.4/go.mod h1:3LXfie/lwoAv0NHoEuY1hjoFAYkvlqI/Bn5EQDD3PPU= github.com/go-openapi/swag/jsonname v0.25.4 h1:bZH0+MsS03MbnwBXYhuTttMOqk+5KcQ9869Vye1bNHI= @@ -69,10 +83,11 @@ github.com/go-playground/validator/v10 v10.28.0 h1:Q7ibns33JjyW48gHkuFT91qX48KG0 github.com/go-playground/validator/v10 v10.28.0/go.mod h1:GoI6I1SjPBh9p7ykNE/yj3fFYbyDOpwMn5KXd+m2hUU= github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= -github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/goccy/go-yaml v1.19.0 h1:EmkZ9RIsX+Uq4DYFowegAuJo8+xdX3T/2dwNPXbxEYE= +github.com/goccy/go-yaml v1.19.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= +github.com/golang/glog v1.2.5/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= @@ -88,6 +103,8 @@ github.com/jackc/pgx/v5 v5.7.6 h1:rWQc5FwZSPX58r1OQmkuaNicxdmExaEz5A2DO2hUuTk= github.com/jackc/pgx/v5 v5.7.6/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jordanlewis/gcassert v0.0.0-20250430164644-389ef753e22e/go.mod h1:ZybsQk6DWyN5t7An1MuPm1gtSZ1xDaTXS9ZjIOxvQrk= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= @@ -98,6 +115,7 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -107,16 +125,20 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8= github.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII= github.com/quic-go/quic-go v0.57.1 h1:25KAAR9QR8KZrCZRThWMKVAwGoiHIrNbT72ULHTuI10= github.com/quic-go/quic-go v0.57.1/go.mod h1:ly4QBAjHA2VhdnxhojRsCUOeJwKYg+taDlos92xb1+s= -github.com/redis/go-redis/v9 v9.17.0 h1:K6E+ZlYN95KSMmZeEQPbU/c++wfmEvfFB17yEAq/VhM= -github.com/redis/go-redis/v9 v9.17.0/go.mod h1:u410H11HMLoB+TP67dz8rL9s6QW2j76l0//kSOd3370= +github.com/redis/go-redis/v9 v9.17.2 h1:P2EGsA4qVIM3Pp+aPocCJ7DguDHhqrXNhVcEp4ViluI= +github.com/redis/go-redis/v9 v9.17.2/go.mod h1:u410H11HMLoB+TP67dz8rL9s6QW2j76l0//kSOd3370= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -141,9 +163,11 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.3.1 h1:waO7eEiFDwidsBN6agj1vJQ4AG7lh2yqXyOXqhgQuyY= github.com/ugorji/go/codec v1.3.1/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/detectors/gcp v1.38.0/go.mod h1:SU+iU7nu5ud4oCb3LQOhIZ3nRLj6FNVrKgtflbaf2ts= go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= @@ -173,6 +197,7 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/oauth2 v0.32.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= @@ -186,9 +211,11 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54/go.mod h1:hKdjCMrbv9skySur+Nek8Hd0uJ0GuxJIoIX2payrIdQ= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -205,8 +232,9 @@ golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846 h1:Wgl1rcDNThT+Zn47YyCXOXyX/COgMTIdhJ717F0l4xk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= +google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8/go.mod h1:fDMmzKV90WSg1NbozdqrE64fkuTv6mlq2zxo9ad+3yo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= google.golang.org/grpc v1.77.0 h1:wVVY6/8cGA6vvffn+wWK5ToddbgdU3d8MNENr4evgXM= google.golang.org/grpc v1.77.0/go.mod h1:z0BY1iVj0q8E1uSQCjL9cppRj+gnZjzDnzV0dHhrNig= google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= @@ -214,6 +242,9 @@ google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= From b1212923a5bcee43d11effb2d8bef295a7c3d8ec Mon Sep 17 00:00:00 2001 From: RD2W Date: Sat, 6 Dec 2025 20:41:42 +0300 Subject: [PATCH 3/3] build: add Docker support and CI/CD config for gRPC and Web servers --- .dockerignore | 19 ++ .github/workflows/release.yml | 56 ++++++ .goreleaser.yml | 213 +++++++++++++++++++++++ Dockerfile.grpc | 35 ++++ Dockerfile.web | 35 ++++ README.md | 7 +- cmd/grpc-client/main.go | 4 +- cmd/grpc-server/main.go | 2 +- cmd/web-server/main.go | 4 +- config/config.toml | 50 ++++++ config/config_dev.toml | 5 +- docker-compose.yml | 34 +++- etc/systemd/system/go-notes-grpc.service | 2 +- internal/config/config.go | 2 +- internal/config/config_test.go | 2 +- 15 files changed, 455 insertions(+), 15 deletions(-) create mode 100644 .dockerignore create mode 100644 .github/workflows/release.yml create mode 100644 .goreleaser.yml create mode 100644 Dockerfile.grpc create mode 100644 Dockerfile.web create mode 100644 config/config.toml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..e45c34f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,19 @@ +# Исключаем файлы и директории, не нужные для сборки +.git +.gitignore +README.md +LICENSE +*.md +test/ +data/ +dist/ +Dockerfile* +.dockerignore +.releaserc +.github/ +.idea/ +.vscode/ +*.local +*.tmp +*.log +.DS_Store diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..db6e4e2 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,56 @@ +name: Release + +on: + push: + tags: + - 'v*' + +permissions: + contents: write + packages: write + +env: + DOCKER_REGISTRY: rd2w + +jobs: + release: + name: Build Release + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags/v') + steps: + - name: Checkout + uses: actions/checkout@v5 + with: + fetch-depth: 0 + + - name: Set up Go + uses: actions/setup-go@v6 + with: + go-version: '1.25' + + - name: Install syft + run: | + curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin + syft --version + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v6 + with: + distribution: goreleaser + version: latest + args: release --clean + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + DOCKER_REGISTRY: ${{ env.DOCKER_REGISTRY }} diff --git a/.goreleaser.yml b/.goreleaser.yml new file mode 100644 index 0000000..6205f83 --- /dev/null +++ b/.goreleaser.yml @@ -0,0 +1,213 @@ +version: 2 + +# Определяем проект и его метаданные +project_name: go-notes + +# Определяем, что мы хотим выпускать +builds: + # Сборка grpc-server + - id: grpc-server + main: ./cmd/grpc-server + binary: grpc-server + goos: + - linux + - darwin + - windows + goarch: + - amd64 + - arm64 + env: + - CGO_ENABLED=0 + gcflags: + - all=-trimpath + ldflags: + - -s -w + - -extldflags '-static' + - -X main.version={{.Version}} + - -X main.commit={{.Commit}} + - -X main.date={{.Date}} + flags: + - -a + tags: + - osusergo + - netgo + - static + + # Сборка web-server + - id: web-server + main: ./cmd/web-server + binary: web-server + goos: + - linux + - darwin + - windows + goarch: + - amd64 + - arm64 + env: + - CGO_ENABLED=0 + gcflags: + - all=-trimpath + ldflags: + - -s -w + - -extldflags '-static' + - -X main.version={{.Version}} + - -X main.commit={{.Commit}} + - -X main.date={{.Date}} + flags: + - -a + tags: + - osusergo + - netgo + - static + +# Упаковка артефактов +# Один архив для каждой комбинации OS/Arch, содержащий оба бинарника (grpc-server и web-server) +archives: + - name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}" + ids: + - grpc-server + - web-server + files: + - LICENSE + - README.md + - src: config/config.toml + dst: config/config.toml + format_overrides: + - goos: windows + formats: ["zip"] + formats: ["tar.gz"] + +#archives: +# - id: grpc-server +# name_template: "{{ .ProjectName }}-grpc-server_{{ .Version }}_{{ .Os }}_{{ .Arch }}" +# ids: +# - grpc-server +# files: +# - LICENSE +# - README.md +# - src: config/config.toml +# dst: config/config.toml +# format_overrides: +# - goos: windows +# formats: ["zip"] +# formats: ["tar.gz"] +# +# - id: web-server +# name_template: "{{ .ProjectName }}-web-server_{{ .Version }}_{{ .Os }}_{{ .Arch }}" +# ids: +# - web-server +# files: +# - LICENSE +# - README.md +# - src: config/config.toml +# dst: config/config.toml +# format_overrides: +# - goos: windows +# formats: ["zip"] +# formats: ["tar.gz"] + +# Docker образы +dockers_v2: + # grpc-server мультиплатформенный образ + - id: grpc-server + dockerfile: Dockerfile.grpc + # Указываем платформы для сборки + platforms: + - linux/amd64 + - linux/arm64 + # Флаги для docker build + flags: + - --pull + - --push + - --provenance=false + - --sbom=false + # Файлы, которые нужно добавить в контекст сборки + extra_files: + - config/config.toml + # Теги для образа + images: + - "{{ .Env.DOCKER_REGISTRY }}/{{ .ProjectName }}" + tags: + - "grpc-server-{{ .Version }}" + - "grpc-server-latest" + # Метки для Docker образа (опционально) + labels: + org.opencontainers.image.title: "{{.ProjectName}}-grpc-server" + org.opencontainers.image.version: "{{.Version}}" + org.opencontainers.image.created: "{{.Date}}" + org.opencontainers.image.revision: "{{.Commit}}" + org.opencontainers.image.source: "https://github.com/rd2w/go-notes" + org.opencontainers.image.licenses: "MIT" + + # web-server мультиплатформенный образ + - id: web-server + dockerfile: Dockerfile.web + platforms: + - linux/amd64 + - linux/arm64 + flags: + - --pull + - --push + - --provenance=false + - --sbom=false + # Файлы, которые нужно добавить в контекст сборки + extra_files: + - config/config.toml + images: + - "{{ .Env.DOCKER_REGISTRY }}/{{ .ProjectName }}" + tags: + - "web-server-{{ .Version }}" + - "web-server-latest" + labels: + org.opencontainers.image.title: "{{.ProjectName}}-web-server" + org.opencontainers.image.version: "{{.Version}}" + org.opencontainers.image.created: "{{.Date}}" + org.opencontainers.image.revision: "{{.Commit}}" + org.opencontainers.image.source: "https://github.com/rd2w/go-notes" + org.opencontainers.image.licenses: "MIT" + +checksum: + name_template: "checksums.txt" + +sboms: + - artifacts: archive + +# Проверка обновлений +changelog: + sort: asc + filters: + exclude: + - "^Merge pull request" # ← Убирает Merge PR + - "^Merge branch" # ← Убирает Merge branch + - "^$" # ← Убирает пустые коммиты + groups: + - title: New Features + regexp: "^.*(?i)(feat|feature)[(:].*$" + order: 0 + - title: Bug Fixes + regexp: "^.*(?i)(fix|bug)[(:].*$" + order: 1 + - title: Build System + regexp: "^.*(?i)build[(:].*$" + order: 2 + - title: Documentation + regexp: "^.*(?i)(doc|docs)[(:].*$" + order: 3 + - title: CI/CD + regexp: "^.*(?i)ci[(:].*$" + order: 4 + - title: Tests + regexp: "^.*(?i)test[(:].*$" + order: 5 + - title: Other Changes + order: 999 + +# Публикация в GitHub Releases +release: + github: + owner: RD2W + name: go-notes + name_template: "v{{.Version}}" + draft: false + prerelease: auto # Автоматически помечает как pre-release для тегов с v* (например v1.0.0-rc1) diff --git a/Dockerfile.grpc b/Dockerfile.grpc new file mode 100644 index 0000000..517fcaf --- /dev/null +++ b/Dockerfile.grpc @@ -0,0 +1,35 @@ +FROM alpine:latest + +# Устанавливаем только ca-certificates для TLS соединений и tzdata для корректной работы с временными зонами +RUN apk --no-cache add ca-certificates tzdata && \ + update-ca-certificates && \ + ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime && \ + echo "Europe/Moscow" > /etc/timezone + +# Создаем пользователя для безопасности +RUN addgroup -g 1000 appuser && \ + adduser -u 1000 -G appuser -D appuser + +WORKDIR /app + +# Создаем структуру директорий +RUN mkdir -p /app/config + +# Копируем скомпилированное приложение из стадии сборки +ARG TARGETPLATFORM +COPY --chown=appuser:appuser $TARGETPLATFORM/grpc-server /app/grpc-server + +# Копируем конфигурационный файл +COPY --chown=appuser:appuser config/config.toml /app/config/config.toml + +# Устанавливаем исполняемый бит +RUN chmod +x /app/grpc-server + +# Меняем пользователя на непривилегированного +USER appuser + +# Устанавливаем порт gRPC +EXPOSE 5051 + +# Устанавливаем точку входа +ENTRYPOINT ["/app/grpc-server"] diff --git a/Dockerfile.web b/Dockerfile.web new file mode 100644 index 0000000..2c04173 --- /dev/null +++ b/Dockerfile.web @@ -0,0 +1,35 @@ +FROM alpine:latest + +# Устанавливаем только ca-certificates для HTTPS и tzdata для корректной работы с временными зонами +RUN apk --no-cache add ca-certificates tzdata && \ + update-ca-certificates && \ + ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime && \ + echo "Europe/Moscow" > /etc/timezone + +# Создаем пользователя для безопасности +RUN addgroup -g 1000 appuser && \ + adduser -u 1000 -G appuser -D appuser + +WORKDIR /app + +# Создаем структуру директорий +RUN mkdir -p /app/config + +# Копируем скомпилированное приложение из стадии сборки +ARG TARGETPLATFORM +COPY --chown=appuser:appuser $TARGETPLATFORM/web-server /app/web-server + +# Копируем конфигурационный файл +COPY --chown=appuser:appuser config/config.toml /app/config/config.toml + +# Устанавливаем исполняемый бит +RUN chmod +x /app/web-server + +# Меняем пользователя на непривилегированного +USER appuser + +# Устанавливаем порт web-server +EXPOSE 8080 + +# Устанавливаем точку входа +ENTRYPOINT ["/app/web-server"] diff --git a/README.md b/README.md index 1953189..2c9a984 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,8 @@ Репозиторий для изучения языка Go, демонстрирующий создание веб-сервера и gRPC-сервера с возможностью управления заметками и пользователями. -[![Go Version](https://img.shields.io/badge/Go-1.25+-blue.svg)](https://golang.org) +[![Release](https://img.shields.io/github/v/release/RD2W/go-notes.svg?label=Release)](https://github.com/RD2W/go-notes/releases/latest) +[![Go Version](https://img.shields.io/badge/Go-1.25.4-blue.svg)](https://golang.org) [![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) [![Go Test Coverage](https://img.shields.io/badge/Coverage-Test%20Coverage-1abc9c.svg)](https://golang.org) ![Tests](https://github.com/RD2W/go-notes/actions/workflows/branch_merges.yml/badge.svg) @@ -108,7 +109,7 @@ go run cmd/web-server/main.go go run cmd/grpc-server/main.go ``` -Сервер будет доступен по адресу `localhost:50051`. +Сервер будет доступен по адресу `localhost:5051`. ### Запуск gRPC-клиента @@ -269,7 +270,7 @@ curl -X DELETE http://localhost:8080/api/notes/{note_id} \ ### Сервер - `SERVER_PORT` - порт для HTTP сервера (по умолчанию: :8080) -- `GRPC_PORT` - порт для gRPC сервера (по умолчанию: :50051) +- `GRPC_PORT` - порт для gRPC сервера (по умолчанию: :5051) - `SERVER_READ_TIMEOUT` - таймаут чтения запроса в секундах (по умолчанию: 15) - `SERVER_WRITE_TIMEOUT` - таймаут записи ответа в секундах (по умолчанию: 15) diff --git a/cmd/grpc-client/main.go b/cmd/grpc-client/main.go index f919522..6eca5b6 100644 --- a/cmd/grpc-client/main.go +++ b/cmd/grpc-client/main.go @@ -9,9 +9,9 @@ import ( func main() { // Загружаем конфигурацию - cfg, err := config.LoadConfig("config/config_dev.toml") + cfg, err := config.LoadConfig("config/config.toml") if err != nil { - log.Printf("Предупреждение: не удалось загрузить конфигурацию из config_dev.toml: %v", err) + log.Printf("Предупреждение: не удалось загрузить конфигурацию из config.toml: %v", err) log.Println("Используем конфигурацию по умолчанию") cfg = config.NewDefaultConfigWithValues() } diff --git a/cmd/grpc-server/main.go b/cmd/grpc-server/main.go index 6fd5804..f24e219 100644 --- a/cmd/grpc-server/main.go +++ b/cmd/grpc-server/main.go @@ -19,7 +19,7 @@ func main() { log.Printf("Запуск gRPC-сервера. Версия: %s, Коммит: %s, Дата сборки: %s", version, commit, date) // Загружаем конфигурацию - cfg, err := config.LoadConfig("config/config_dev.toml") + cfg, err := config.LoadConfig("config/config.toml") if err != nil { log.Fatalf("Ошибка загрузки конфигурации: %v", err) } diff --git a/cmd/web-server/main.go b/cmd/web-server/main.go index 0b0f611..cfb6bd2 100644 --- a/cmd/web-server/main.go +++ b/cmd/web-server/main.go @@ -30,9 +30,9 @@ func main() { log.Printf("Запуск веб-сервера. Версия: %s, Коммит: %s, Дата сборки: %s", version, commit, date) // Загружаем конфигурацию из файла - cfg, err := config.LoadConfig("./config/config_dev.toml") + cfg, err := config.LoadConfig("./config/config.toml") if err != nil { - log.Printf("Предупреждение: не удалось загрузить конфигурацию из config_dev.toml: %v", err) + log.Printf("Предупреждение: не удалось загрузить конфигурацию из config.toml: %v", err) log.Println("Используем конфигурацию по умолчанию") cfg = config.NewDefaultConfigWithValues() } diff --git a/config/config.toml b/config/config.toml new file mode 100644 index 0000000..6c09da4 --- /dev/null +++ b/config/config.toml @@ -0,0 +1,50 @@ +# Пример конфигурационного файла для Go Notes приложения +env = "production" # Окружение (development, production, staging) +log_level = "info" # Уровень логирования + +[server] +port = ":8080" # Порт для HTTP сервера +grpc_port = ":5051" # Порт для gRPC сервера +read_timeout = 5 # Таймаут чтения запроса в секундах +write_timeout = 5 # Таймаут записи ответа в секундах + +[auth] +enable_https = false # Включить HTTPS (в настоящее время не используется в приложении) + +[postgres] # Настройки PostgreSQL для хранения пользователей и заметок +host = "localhost" # Хост PostgreSQL +port = 5432 # Порт PostgreSQL +name = "go_notes" # Имя базы данных +user = "postgres" # Имя пользователя базы данных +password = "notes_password" # Пароль базы данных +ssl_mode = "disable" # Режим SSL для PostgreSQL +pool_size = 10 # Размер пула подключений +parameters = "" # Дополнительные параметры подключения + +[redis] # Настройки Redis для JWT токенов и кеша +host = "localhost" # Хост Redis +port = 6379 # Порт Redis +password = "" # Пароль Redis (если установлен) +db = 0 # Номер базы данных Redis +pool_size = 10 # Размер пула подключений +url = "redis://localhost:6379" # Альтернативный способ указания подключения + +[jwt] +secret_key = "my_secret_key" # Секретный ключ для подписи JWT токенов +algorithm = "HS256" # Алгоритм подписи токена +bcrypt_cost = 10 # Стоимость хеширования паролей +access_token_ttl = "15m" # Время жизни access токена +refresh_token_ttl = "168h" # Время жизни refresh токена + +[refresh] +secret_key = "refresh_secret_key" # Секретный ключ для подписи Refresh токенов +revocation_enabled = true # Включить отслеживание отозванных токенов + +[security] # Настройки безопасности +password_min_length = 8 # Минимальная длина пароля +max_login_attempts = 5 # Максимальное количество попыток входа +login_block_time = "30m" # Время блокировки после неудачных попыток + +[shutdown] # Настройки завершения работы +timeout = "25s" # Таймаут завершения работы +wait = "3s" # Время ожидания перед завершением diff --git a/config/config_dev.toml b/config/config_dev.toml index 77a0e70..63287e6 100644 --- a/config/config_dev.toml +++ b/config/config_dev.toml @@ -1,11 +1,10 @@ # Пример конфигурационного файла для Go Notes приложения - env = "development" # Окружение (development, production, staging) -log_level = "info" # Уровень логирования +log_level = "debug" # Уровень логирования [server] port = ":8080" # Порт для HTTP сервера -grpc_port = ":50051" # Порт для gRPC сервера +grpc_port = ":5051" # Порт для gRPC сервера read_timeout = 15 # Таймаут чтения запроса в секундах write_timeout = 15 # Таймаут записи ответа в секундах diff --git a/docker-compose.yml b/docker-compose.yml index e413f6c..52ca8e3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,7 +6,7 @@ services: POSTGRES_DB: go_notes POSTGRES_USER: postgres POSTGRES_PASSWORD: notes_password - POSTGRES_ROOT_PASSWORD: notes_password + POSTGRES_ROOT_PASSWORD: notes_password ports: - "5432:5432" volumes: @@ -24,6 +24,38 @@ services: networks: - go-notes-network + web-server: + image: rd2w/go-notes:web-server-latest + container_name: go-notes-web-server + ports: + - "8080:8080" + environment: + - SERVER_PORT=:8080 + - POSTGRES_HOST=go-notes-postgres + - REDIS_HOST=go-notes-redis + depends_on: + - postgres + - redis + networks: + - go-notes-network + restart: on-failure + + grpc-server: + image: rd2w/go-notes:grpc-server-latest + container_name: go-notes-grpc-server + ports: + - "5051:5051" + environment: + - GRPC_PORT=:5051 + - POSTGRES_HOST=go-notes-postgres + - REDIS_HOST=go-notes-redis + depends_on: + - postgres + - redis + networks: + - go-notes-network + restart: on-failure + networks: go-notes-network: driver: bridge diff --git a/etc/systemd/system/go-notes-grpc.service b/etc/systemd/system/go-notes-grpc.service index d1fc88b..7eafc98 100644 --- a/etc/systemd/system/go-notes-grpc.service +++ b/etc/systemd/system/go-notes-grpc.service @@ -19,7 +19,7 @@ SyslogIdentifier=go-notes-grpc # Environment variables for configuration Environment=ENV=production Environment=LOG_LEVEL=info -Environment=SERVER_GRPC_PORT=:50051 +Environment=GRPC_PORT=:5051 Environment=POSTGRES_HOST=localhost Environment=POSTGRES_PORT=5432 Environment=POSTGRES_NAME=go_notes diff --git a/internal/config/config.go b/internal/config/config.go index fe0fc72..471d12f 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -276,7 +276,7 @@ func newDefaultConfig() *Config { LogLevel: "info", Server: ServerConfig{ Port: ":8080", - GRPCPort: ":50051", + GRPCPort: ":5051", ReadTimeout: 15, WriteTimeout: 15, }, diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 4460de5..9e05c92 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -574,7 +574,7 @@ func TestNewDefaultConfig(t *testing.T) { LogLevel: "info", Server: ServerConfig{ Port: ":8080", - GRPCPort: ":50051", + GRPCPort: ":5051", ReadTimeout: 15, WriteTimeout: 15, },