diff --git a/.air.toml b/.air.toml index 14f15b8..60055d6 100644 --- a/.air.toml +++ b/.air.toml @@ -1,9 +1,9 @@ root = "." tmp_dir = "tmp" [build] - cmd = "go build -o ./tmp/stalkarr ./cmd/server" - bin = "./tmp/stalkarr" - full_bin = "DATA_DIR=./config ./tmp/stalkarr" + cmd = "go build -o ./tmp/sleeparr ./cmd/server" + bin = "./tmp/sleeparr" + full_bin = "DATA_DIR=./config ./tmp/sleeparr" delay = 1000 exclude_dir = ["frontend", "tmp", "data", "internal/static/dist"] include_ext = ["go"] diff --git a/.env.example b/.env.example index 95c03f2..b065889 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,5 @@ # ----------------------------------------------- -# stalkarr — environment configuration +# sleeparr — environment configuration # ----------------------------------------------- # REQUIRED — generate with: openssl rand -hex 32 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7dc648d..be0282c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,7 +2,7 @@ name: Release on: push: - branches: [main] + branches: [main, "feat/**", "chore/**", "fix/**"] tags: - "v*" @@ -34,6 +34,7 @@ jobs: with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | + type=ref,event=branch,enable=${{ !startsWith(github.ref, 'refs/heads/main') }} type=raw,value=dev,enable={{is_default_branch}} type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} diff --git a/.gitignore b/.gitignore index 3a6b3bd..6522342 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ # Build output -/stalkarr +/sleeparr frontend/dist internal/static/dist/* !internal/static/dist/.gitkeep diff --git a/Dockerfile b/Dockerfile index f6d1612..ff3397a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,8 +21,8 @@ COPY --from=frontend-builder /app/frontend/dist ./internal/static/dist ARG VERSION=dev RUN CGO_ENABLED=0 GOOS=linux go build \ - -ldflags="-s -w -X stalkarr/internal/version.Version=${VERSION}" \ - -o stalkarr ./cmd/server + -ldflags="-s -w -X sleeparr/internal/version.Version=${VERSION}" \ + -o sleeparr ./cmd/server # ---- Stage 3: Final image ---- FROM alpine:3.19 @@ -30,7 +30,7 @@ FROM alpine:3.19 RUN apk add --no-cache su-exec tzdata WORKDIR /app -COPY --from=go-builder /app/stalkarr . +COPY --from=go-builder /app/sleeparr . COPY docker/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh diff --git a/README.md b/README.md index 7da9b7a..c5e1013 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# STALKARR +# SLEEPARR > **Personal project in BETA!** I built this for my own homelab using the tools I use daily: [Zed](https://zed.dev), [Claude](https://claude.ai), and [OpenCode](https://opencode.ai). AI is part of my regular workflow the same way Stack Overflow and docs always have been. If you spot any issues, chuck in a ticket and I'll get to it. @@ -7,8 +7,8 @@ A self-hosted dashboard for searching missing media across your arr stack. > Currently supports **Sonarr**. Radarr support coming soon.

- stalkarr desktop - stalkarr mobile + sleeparr desktop + sleeparr mobile

## Quick start @@ -27,9 +27,9 @@ docker compose up -d ## docker-compose.yml ```yaml services: - stalkarr: - image: ghcr.io/codevski/stalkarr:latest - container_name: stalkarr + sleeparr: + image: ghcr.io/codevski/sleeparr:latest + container_name: sleeparr restart: unless-stopped ports: - "${PORT:-8080}:8080" @@ -82,7 +82,7 @@ air cd frontend && bun run dev ``` -See `bruno/stalkarr/` for the API collection. +See `bruno/sleeparr/` for the API collection. ## License diff --git a/bruno/stalkarr/.gitignore b/bruno/sleeparr/.gitignore similarity index 100% rename from bruno/stalkarr/.gitignore rename to bruno/sleeparr/.gitignore diff --git a/bruno/stalkarr/README.md b/bruno/sleeparr/README.md similarity index 82% rename from bruno/stalkarr/README.md rename to bruno/sleeparr/README.md index bd05870..b0c3a95 100644 --- a/bruno/stalkarr/README.md +++ b/bruno/sleeparr/README.md @@ -1,11 +1,11 @@ -# Stalkarr — Bruno Collection +# Sleeparr — Bruno Collection -API tests for the Stalkarr backend. Uses [Bruno](https://www.usebruno.com/) a git-friendly API client. +API tests for the Sleeparr backend. Uses [Bruno](https://www.usebruno.com/) a git-friendly API client. ## Setup 1. Install Bruno: https://www.usebruno.com/downloads -2. Open Bruno → **Open Collection** → select this `bruno/stalkarr` folder +2. Open Bruno → **Open Collection** → select this `bruno/sleeparr` folder 3. Select the **Local** environment (top right dropdown) ## First run order diff --git a/bruno/stalkarr/auth/login.bru b/bruno/sleeparr/auth/login.bru similarity index 100% rename from bruno/stalkarr/auth/login.bru rename to bruno/sleeparr/auth/login.bru diff --git a/bruno/stalkarr/auth/setup.bru b/bruno/sleeparr/auth/setup.bru similarity index 100% rename from bruno/stalkarr/auth/setup.bru rename to bruno/sleeparr/auth/setup.bru diff --git a/bruno/stalkarr/bruno.json b/bruno/sleeparr/bruno.json similarity index 69% rename from bruno/stalkarr/bruno.json rename to bruno/sleeparr/bruno.json index c0d5434..999e925 100644 --- a/bruno/stalkarr/bruno.json +++ b/bruno/sleeparr/bruno.json @@ -1,15 +1,12 @@ { "version": "1", - "name": "Stalkarr", + "name": "Sleeparr", "type": "collection", - "ignore": [ - "node_modules", - ".git" - ], + "ignore": ["node_modules", ".git"], "size": 0.0018472671508789062, "filesCount": 7, "presets": { "requestType": "http", "requestUrl": "" } -} \ No newline at end of file +} diff --git a/bruno/stalkarr/collection.bru b/bruno/sleeparr/collection.bru similarity index 100% rename from bruno/stalkarr/collection.bru rename to bruno/sleeparr/collection.bru diff --git a/bruno/stalkarr/environments/Local.bru b/bruno/sleeparr/environments/Local.bru similarity index 100% rename from bruno/stalkarr/environments/Local.bru rename to bruno/sleeparr/environments/Local.bru diff --git a/bruno/stalkarr/settings/add-sonarr-instance.bru b/bruno/sleeparr/settings/add-sonarr-instance.bru similarity index 100% rename from bruno/stalkarr/settings/add-sonarr-instance.bru rename to bruno/sleeparr/settings/add-sonarr-instance.bru diff --git a/bruno/stalkarr/settings/get-settings.bru b/bruno/sleeparr/settings/get-settings.bru similarity index 100% rename from bruno/stalkarr/settings/get-settings.bru rename to bruno/sleeparr/settings/get-settings.bru diff --git a/bruno/stalkarr/settings/get-version.bru b/bruno/sleeparr/settings/get-version.bru similarity index 100% rename from bruno/stalkarr/settings/get-version.bru rename to bruno/sleeparr/settings/get-version.bru diff --git a/bruno/stalkarr/settings/save-settings.bru b/bruno/sleeparr/settings/save-settings.bru similarity index 77% rename from bruno/stalkarr/settings/save-settings.bru rename to bruno/sleeparr/settings/save-settings.bru index d3dc9b5..60859f1 100644 --- a/bruno/stalkarr/settings/save-settings.bru +++ b/bruno/sleeparr/settings/save-settings.bru @@ -17,8 +17,8 @@ auth:bearer { body:json { { "sonarr": { - "url": "http://localhost:8989", - "api_key": "your-sonarr-api-key-here" + "url": "http://192.168.1.6:8989", + "api_key": "" } } } diff --git a/bruno/stalkarr/settings/test-sonarr-instance.bru b/bruno/sleeparr/settings/test-sonarr-instance.bru similarity index 100% rename from bruno/stalkarr/settings/test-sonarr-instance.bru rename to bruno/sleeparr/settings/test-sonarr-instance.bru diff --git a/bruno/stalkarr/sonarr/get-missing.bru b/bruno/sleeparr/sonarr/get-missing.bru similarity index 100% rename from bruno/stalkarr/sonarr/get-missing.bru rename to bruno/sleeparr/sonarr/get-missing.bru diff --git a/bruno/sleeparr/sonarr/trigger-run.bru b/bruno/sleeparr/sonarr/trigger-run.bru new file mode 100644 index 0000000..5b3b4af --- /dev/null +++ b/bruno/sleeparr/sonarr/trigger-run.bru @@ -0,0 +1,19 @@ +meta { + name: Trigger Agent + type: http + seq: 2 +} + +post { + url: {{base_url}}/api/sonarr/run + body: none + auth: bearer +} + +auth:bearer { + token: {{token}} +} + +docs { + Triggers a agent run. Currently a stub returns {"status": "running"}. +} diff --git a/bruno/stalkarr/sonarr/trigger-hunt.bru b/bruno/stalkarr/sonarr/trigger-hunt.bru deleted file mode 100644 index 4517475..0000000 --- a/bruno/stalkarr/sonarr/trigger-hunt.bru +++ /dev/null @@ -1,19 +0,0 @@ -meta { - name: Trigger Stalk - type: http - seq: 2 -} - -post { - url: {{base_url}}/api/sonarr/stalk - body: none - auth: bearer -} - -auth:bearer { - token: {{token}} -} - -docs { - Triggers a stalk job. Currently a stub returns {"status": "stalking"}. -} diff --git a/cmd/server/main.go b/cmd/server/main.go index b9d26db..187dbe0 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -6,9 +6,9 @@ import ( "net/http" "os" "os/signal" - "stalkarr/internal/api" - "stalkarr/internal/config" - "stalkarr/internal/jobs" + "sleeparr/internal/api" + "sleeparr/internal/config" + "sleeparr/internal/jobs" "syscall" "time" @@ -29,12 +29,12 @@ func main() { log.Fatalf("failed to load config: %v", err) } - stalkerCtx, stalkerCancel := context.WithCancel(context.Background()) - defer stalkerCancel() - stalker := jobs.NewStalkerJob(config.Get) - go stalker.Start(stalkerCtx) + agentCtx, agentCancel := context.WithCancel(context.Background()) + defer agentCancel() + agent := jobs.NewAgentJob(config.Get) + go agent.Start(agentCtx) - r := api.NewRouter(stalker) + r := api.NewRouter(agent) r.SetTrustedProxies(nil) port := os.Getenv("PORT") @@ -48,7 +48,7 @@ func main() { } go func() { - log.Printf("Stalkarr running on :%s (data: %s)", port, dataDir) + log.Printf("Sleeparr running on :%s (data: %s)", port, dataDir) if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("server error: %v", err) } @@ -62,9 +62,9 @@ func main() { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() - stalkerCancel() + agentCancel() if err := srv.Shutdown(ctx); err != nil { log.Fatalf("forced shutdown: %v", err) } - log.Println("Stalkarr stopped") + log.Println("Sleeparr stopped") } diff --git a/docker-compose.yml b/docker-compose.yml index 3ec9fe4..98686a5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ services: - stalkarr: - image: ghcr.io/codevski/stalkarr:latest - container_name: stalkarr + sleeparr: + image: ghcr.io/codevski/sleeparr:latest + container_name: sleeparr restart: unless-stopped ports: - "${PORT:-8080}:8080" diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 16218f0..208dce7 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -6,23 +6,23 @@ PGID=${PGID:-1000} echo " ───────────────────────────────────── - stalkarr +sleeparr ───────────────────────────────────── User UID: ${PUID} User GID: ${PGID} ───────────────────────────────────── " -if ! getent group stalkarr > /dev/null 2>&1; then - addgroup -g "$PGID" stalkarr +if ! getent group sleeparr > /dev/null 2>&1; then + addgroup -g "$PGID" sleeparr fi -if ! getent passwd stalkarr > /dev/null 2>&1; then - adduser -D -u "$PUID" -G stalkarr stalkarr +if ! getent passwd sleeparr > /dev/null 2>&1; then + adduser -D -u "$PUID" -G sleeparr sleeparr fi mkdir -p /config -chown -R stalkarr:stalkarr /config -chown -R stalkarr:stalkarr /app +chown -R sleeparr:sleeparr /config +chown -R sleeparr:sleeparr /app -exec su-exec stalkarr:stalkarr /app/stalkarr +exec su-exec sleeparr:sleeparr /app/sleeparr diff --git a/frontend/index.html b/frontend/index.html index d967bed..19b2eb9 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,7 +4,7 @@ - stalkarr + sleeparr
diff --git a/frontend/package.json b/frontend/package.json index 87da994..5e56be3 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { - "name": "stalkarr", + "name": "sleeparr", "private": true, - "version": "0.0.1", + "version": "0.0.2", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/src/components/Footer.tsx b/frontend/src/components/Footer.tsx index c1b4234..d497d53 100644 --- a/frontend/src/components/Footer.tsx +++ b/frontend/src/components/Footer.tsx @@ -3,7 +3,7 @@ import { ExternalLink } from "lucide-react"; import api from "@/lib/api"; import type { VersionInfo } from "@/types"; -const RELEASES_URL = "https://github.com/codevski/stalkarr/releases/latest"; +const RELEASES_URL = "https://github.com/codevski/sleeparr/releases/latest"; export default function Footer() { const [version, setVersion] = useState(null); @@ -18,7 +18,7 @@ export default function Footer() { return (