Skip to content

Commit 953762f

Browse files
committed
wip: more things
1 parent 9de178a commit 953762f

File tree

215 files changed

+1005
-14810
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

215 files changed

+1005
-14810
lines changed

.env

+10-4
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,21 @@ SHELLHUB_DOMAIN=localhost
4343
# VALUES: A valid network name
4444
SHELLHUB_NETWORK=shellhub_network
4545

46-
# The name of the default PostgreSQL database.
47-
SHELLHUB_POSTGRES_DB=main
46+
# The host for PostgreSQL connection.
47+
SHELLHUB_POSTGRES_HOST=postgres
48+
49+
# The port for PostgreSQL connection.
50+
SHELLHUB_POSTGRES_PORT=5432
4851

49-
# The username for PostgreSQL database authentication.
52+
# The username for PostgreSQL authentication.
5053
SHELLHUB_POSTGRES_USER=admin
5154

52-
# The password for PostgreSQL database authentication.
55+
# The password for PostgreSQL authentication.
5356
SHELLHUB_POSTGRES_PASSWORD=admin
5457

58+
# The name of the default PostgreSQL.
59+
SHELLHUB_POSTGRES_DB=main
60+
5561
# Enable tunnels feature.
5662
SHELLHUB_TUNNELS=false
5763

api/Dockerfile

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# base stage
2-
FROM golang:1.22.6-alpine3.19 AS base
2+
FROM golang:1.24-alpine3.21 AS base
33

44
ARG GOPROXY
55

@@ -41,7 +41,7 @@ ENV GOPROXY ${GOPROXY}
4141

4242
RUN apk add --update openssl build-base docker-cli
4343
RUN go install github.com/air-verse/[email protected] && \
44-
go install github.com/go-delve/delve/cmd/dlv@v1.23.0 && \
44+
go install github.com/go-delve/delve/cmd/dlv@v1.24.1 && \
4545
go install github.com/golangci/golangci-lint/cmd/[email protected] && \
4646
go install github.com/vektra/mockery/v2/[email protected]
4747

api/go.mod

+14-7
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
module github.com/shellhub-io/shellhub/api
22

3-
go 1.22.4
3+
go 1.23.0
44

5-
toolchain go1.22.5
5+
toolchain go1.24.1
66

77
require (
88
github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08
@@ -18,10 +18,11 @@ require (
1818
github.com/square/mongo-lock v0.0.0-20230808145049-cfcf499f6bf0
1919
github.com/stretchr/testify v1.10.0
2020
github.com/testcontainers/testcontainers-go/modules/mongodb v0.35.0
21-
github.com/undefinedlabs/go-mpatch v1.0.7
2221
github.com/xakep666/mongo-migrate v0.3.2
2322
go.mongodb.org/mongo-driver v1.17.2
24-
golang.org/x/crypto v0.33.0
23+
golang.org/x/crypto v0.36.0
24+
gorm.io/driver/postgres v1.5.11
25+
gorm.io/gorm v1.25.12
2526
)
2627

2728
require (
@@ -66,6 +67,12 @@ require (
6667
github.com/hashicorp/go-multierror v1.1.1 // indirect
6768
github.com/hibiken/asynq v0.24.1 // indirect
6869
github.com/inconshreveable/mousetrap v1.1.0 // indirect
70+
github.com/jackc/pgpassfile v1.0.0 // indirect
71+
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
72+
github.com/jackc/pgx/v5 v5.5.5 // indirect
73+
github.com/jackc/puddle/v2 v2.2.1 // indirect
74+
github.com/jinzhu/inflection v1.0.0 // indirect
75+
github.com/jinzhu/now v1.1.5 // indirect
6976
github.com/klauspost/compress v1.17.8 // indirect
7077
github.com/klauspost/pgzip v1.2.5 // indirect
7178
github.com/leodido/go-urn v1.2.2 // indirect
@@ -120,9 +127,9 @@ require (
120127
go.opentelemetry.io/otel/trace v1.26.0 // indirect
121128
go4.org v0.0.0-20200411211856-f5505b9728dd // indirect
122129
golang.org/x/net v0.33.0 // indirect
123-
golang.org/x/sync v0.11.0 // indirect
124-
golang.org/x/sys v0.30.0 // indirect
125-
golang.org/x/text v0.22.0 // indirect
130+
golang.org/x/sync v0.12.0 // indirect
131+
golang.org/x/sys v0.31.0 // indirect
132+
golang.org/x/text v0.23.0 // indirect
126133
golang.org/x/time v0.8.0 // indirect
127134
google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be // indirect
128135
google.golang.org/protobuf v1.33.0 // indirect

api/go.sum

+27-12
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,18 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO
195195
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
196196
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
197197
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
198+
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
199+
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
200+
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
201+
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
202+
github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw=
203+
github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A=
204+
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
205+
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
206+
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
207+
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
208+
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
209+
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
198210
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
199211
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
200212
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
@@ -321,6 +333,7 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE
321333
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
322334
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
323335
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
336+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
324337
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
325338
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
326339
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
@@ -354,8 +367,6 @@ github.com/tkuchiki/parsetime v0.3.0/go.mod h1:OJkQmIrf5Ao7R+WYIdITPOfDVj8LmnHGC
354367
github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
355368
github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8=
356369
github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
357-
github.com/undefinedlabs/go-mpatch v1.0.7 h1:943FMskd9oqfbZV0qRVKOUsXQhTLXL0bQTVbQSpzmBs=
358-
github.com/undefinedlabs/go-mpatch v1.0.7/go.mod h1:TyJZDQ/5AgyN7FSLiBJ8RO9u2c6wbtRvK827b6AVqY4=
359370
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
360371
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
361372
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
@@ -421,8 +432,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
421432
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
422433
golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
423434
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
424-
golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=
425-
golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
435+
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
436+
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
426437
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
427438
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
428439
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -492,8 +503,8 @@ golang.org/x/sync v0.0.0-20201008141435-b3e1573b7520/go.mod h1:RxMgew5VJxzue5/jJ
492503
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
493504
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
494505
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
495-
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
496-
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
506+
golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
507+
golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
497508
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
498509
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
499510
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -533,13 +544,13 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
533544
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
534545
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
535546
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
536-
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
537-
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
547+
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
548+
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
538549
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
539550
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
540551
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
541-
golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU=
542-
golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
552+
golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
553+
golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
543554
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
544555
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
545556
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -549,8 +560,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
549560
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
550561
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
551562
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
552-
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
553-
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
563+
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
564+
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
554565
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
555566
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
556567
golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg=
@@ -657,6 +668,10 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
657668
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
658669
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
659670
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
671+
gorm.io/driver/postgres v1.5.11 h1:ubBVAfbKEUld/twyKZ0IYn9rSQh448EdelLYk9Mv314=
672+
gorm.io/driver/postgres v1.5.11/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI=
673+
gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
674+
gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
660675
gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
661676
gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
662677
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

api/main.go

+95-10
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,114 @@ package main
22

33
import (
44
"context"
5+
"os"
6+
"os/signal"
7+
"syscall"
58

69
"github.com/shellhub-io/shellhub/pkg/envs"
710
"github.com/shellhub-io/shellhub/pkg/loglevel"
8-
"github.com/sirupsen/logrus"
11+
log "github.com/sirupsen/logrus"
912
"github.com/spf13/cobra"
1013
)
1114

15+
type env struct {
16+
// MongoURI specifies the connection string for MongoDB.
17+
MongoURI string `env:"MONGO_URI,default=mongodb://mongo:27017/main"`
18+
19+
// PostgresHost specifies the host for PostgreSQL.
20+
PostgresHost string `env:"POSTGRES_HOST,default=postgres"`
21+
// PostgresPort specifies the port for PostgreSQL.
22+
PostgresPort string `env:"POSTGRES_PORT,default=5432"`
23+
// PostgresUser specifies the username for authenticate PostgreSQL.
24+
PostgresUser string `env:"POSTGRES_USER,default=admin"`
25+
// PostgresUser specifies the password for authenticate PostgreSQL.
26+
PostgresPassword string `env:"POSTGRES_PASSWORD,default=admin"`
27+
// PostgresDB especifica o nome do banco de dados PostgreSQL a ser utilizado.
28+
PostgresDB string `env:"POSTGRES_DB,default=main"`
29+
30+
// RedisURI specifies the connection string for Redis.
31+
RedisURI string `env:"REDIS_URI,default=redis://redis:6379"`
32+
// RedisCachePoolSize defines the maximum number of concurrent connections to Redis cache.
33+
// Set to 0 for unlimited connections.
34+
RedisCachePoolSize int `env:"REDIS_CACHE_POOL_SIZE,default=0"`
35+
36+
// AsynqGroupMaxDelay specifies the maximum time (in seconds) to wait before
37+
// processing a group of tasks, regardless of other conditions.
38+
AsynqGroupMaxDelay int `env:"ASYNQ_GROUP_MAX_DELAY,default=1"`
39+
// AsynqGroupGracePeriod defines the grace period (in seconds) before task aggregation.
40+
// Tasks arriving within this period will be aggregated with existing tasks in the group.
41+
AsynqGroupGracePeriod int64 `env:"ASYNQ_GROUP_GRACE_PERIOD,default=2"`
42+
// AsynqGroupMaxSize specifies the maximum number of tasks that can be aggregated in a group.
43+
// When this limit is reached, the group will be processed immediately.
44+
AsynqGroupMaxSize int `env:"ASYNQ_GROUP_MAX_SIZE,default=1000"`
45+
// AsynqUniquenessTimeout defines how long (in hours) a unique job remains locked in the queue.
46+
// If a job doesn't complete within this period, its lock is released, allowing a new instance
47+
// to be enqueued and executed.
48+
AsynqUniquenessTimeout int `env:"ASYNQ_UNIQUENESS_TIMEOUT,default=24"`
49+
50+
// SentryDSN specifies the Data Source Name for Sentry error tracking.
51+
// Leave empty to disable Sentry integration.
52+
SentryDSN string `env:"SENTRY_DSN,default="`
53+
54+
// GeoipMirror specifies an alternative URL for downloading GeoIP databases.
55+
// When configured, this takes precedence over GeoipMaxmindLicense.
56+
GeoipMirror string `env:"MAXMIND_MIRROR,default="`
57+
// GeoipMaxmindLicense is the MaxMind license key for downloading GeoIP databases directly.
58+
// This is used as a fallback when GeoipMirror is not configured.
59+
GeoipMaxmindLicense string `env:"MAXMIND_LICENSE,default="`
60+
}
61+
1262
func main() {
1363
loglevel.UseEnvs()
1464

1565
rootCmd := &cobra.Command{Use: "api"}
66+
rootCmd.AddCommand(&cobra.Command{
67+
Use: "server",
68+
RunE: func(cmd *cobra.Command, _ []string) error {
69+
env, err := envs.ParseWithPrefix[env]("API_")
70+
if err != nil {
71+
log.WithError(err).
72+
Error("Failed to load environment variables")
1673

17-
rootCmd.AddCommand(serverCmd)
74+
return err
75+
}
1876

19-
// Populates configuration based on environment variables prefixed with 'API_'.
20-
cfg, err := envs.ParseWithPrefix[config]("API_")
21-
if err != nil {
22-
logrus.WithError(err).Fatal("Failed to load environment variables")
23-
}
77+
server := &Server{env: env}
78+
79+
if err := server.Setup(cmd.Context()); err != nil {
80+
log.WithError(err).
81+
Error("failed to setup the server")
82+
83+
return err
84+
}
85+
86+
sigs := make(chan os.Signal, 1)
87+
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
88+
89+
go func() {
90+
sig := <-sigs
91+
log.WithField("signal", sig).
92+
Info("shutting down the server")
93+
94+
server.Shutdown()
95+
os.Exit(0)
96+
}()
97+
98+
if err := server.Start(); err != nil {
99+
log.WithError(err).
100+
Error("failed too start the server")
101+
102+
return err
103+
}
104+
105+
return nil
106+
},
107+
})
24108

25-
ctx := context.WithValue(context.TODO(), "cfg", cfg) //nolint:revive
109+
if err := rootCmd.ExecuteContext(context.Background()); err != nil {
110+
log.WithError(err).
111+
Error("failed to execute command")
26112

27-
if err := rootCmd.ExecuteContext(ctx); err != nil {
28-
logrus.Fatal(err)
113+
os.Exit(1)
29114
}
30115
}

0 commit comments

Comments
 (0)