Compare commits

..

2 Commits

Author SHA1 Message Date
ff79cfd786 log whole update when received 2026-02-01 17:49:42 +03:00
0bb11c3bd7 dockerize application 2026-02-01 17:33:04 +03:00
4 changed files with 50 additions and 5 deletions

10
Dockerfile Normal file
View File

@@ -0,0 +1,10 @@
FROM golang:latest AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY *.go ./
RUN CGO_ENABLED=0 GOOS=linux go build -o /grok-bot
FROM alpine:latest
COPY --from=builder /grok-bot /grok-bot
CMD ["/grok-bot"]

28
docker-compose.yml Normal file
View File

@@ -0,0 +1,28 @@
services:
bot:
build: .
environment:
BOT_TOKEN: ""
CHAT_ID: ""
OPENAI_BASE_URL: "http://localhost:8080/v1"
SYSTEM_PROMPT_PATH: /etc/sysprompt.txt
volumes:
- ./sysprompt.txt:/etc/sysprompt.txt:ro
restart: unless-stopped
llama-server:
image: ghcr.io/ggml-org/llama.cpp:server
container_name: llama-server
ports:
- "8080:8080"
volumes:
- ~/models:/models
deploy:
resources:
limits:
memory: 2g
memswap_limit: 6g
command: >
-m /models/qwen25_15B.gguf
--port 8080
--host 0.0.0.0
-n 512

16
main.go
View File

@@ -73,11 +73,11 @@ func (a *App) handleMessage(ctx context.Context, msg *tgbotapi.Message) error {
} }
chatID := msg.Chat.ID chatID := msg.Chat.ID
if chatID != a.config.ChatID || !strings.HasPrefix(msg.Text, "@grok") { if chatID != a.config.ChatID || !strings.HasPrefix(msg.Text, "@grok ") {
return nil return nil
} }
question := msg.Text[len("@grok"):] question := msg.Text[len("@grok "):]
select { select {
case a.sema <- struct{}{}: case a.sema <- struct{}{}:
@@ -122,7 +122,7 @@ func (a *App) HandleUpdates(ctx context.Context) error {
} }
if upd.Message != nil { if upd.Message != nil {
a.log.Info("new message", "chat", upd.Message.Chat) a.log.Info("new message", "update", upd)
go func() { go func() {
if err := a.handleMessage(ctx, upd.Message); err != nil { if err := a.handleMessage(ctx, upd.Message); err != nil {
a.log.Error("handling message", "msg", upd.Message, "err", err) a.log.Error("handling message", "msg", upd.Message, "err", err)
@@ -170,7 +170,7 @@ type Config struct {
func LoadConfig(cfg *Config) error { func LoadConfig(cfg *Config) error {
if err := godotenv.Load(".env"); err != nil { if err := godotenv.Load(".env"); err != nil {
return err slog.Warn("no env file loaded", "err", err)
} }
cfg.OpenAIBaseURL = os.Getenv("OPENAI_BASE_URL") cfg.OpenAIBaseURL = os.Getenv("OPENAI_BASE_URL")
@@ -197,7 +197,13 @@ func LoadConfig(cfg *Config) error {
cfg.ChatID = chatID cfg.ChatID = chatID
cfg.SystemPrompt = os.Getenv("SYSTEM_PROMPT") sysPromptPath := os.Getenv("SYSTEM_PROMPT_PATH")
promptBytes, err := os.ReadFile(sysPromptPath)
if err != nil {
slog.Warn("could not load system prompt", "path", sysPromptPath)
} else {
cfg.SystemPrompt = string(promptBytes)
}
return nil return nil
} }

1
sysprompt.txt Normal file
View File

@@ -0,0 +1 @@
Put system prompt here