Add Obsidian (with git sync), Eclipse Mosquitto, Gitea, ESPHome and MS SQL Server 2025 - #207
Conversation
WalkthroughAdds multiple new Docker service compose files and docs (Mosquitto, Obsidian, ESPHome device builder, Gitea, MSSQL), a services schema, Obsidian Taskfile for vault backup/sync, updates example env and task names (create→update), and extends the CLI with docker "logs" action and log-related flags. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
participant Client
participant Traefik
participant Obsidian as Obsidian:3000
Client->>Traefik: GET obsidian.${MYDOMAIN}
Traefik->>Obsidian: Route to container port 3000 (middleware: localaccess@file)
Obsidian-->>Traefik: HTTP response
Traefik-->>Client: Proxied response
note right of Traefik: New service on external "proxy" network
sequenceDiagram
autonumber
participant MQTTClient as MQTT Client
participant Traefik
participant Mosquitto as Mosquitto:9001/1883
MQTTClient->>Mosquitto: MQTT connect (1883)
Mosquitto-->>MQTTClient: ConnAck / messages
alt WebSocket via Traefik
MQTTClient->>Traefik: WS to mosquitto.${MYDOMAIN}
Traefik->>Mosquitto: Proxy to 9001 (websockets)
Mosquitto-->>Traefik: WS frames
Traefik-->>MQTTClient: Proxied WS frames
end
note right of Mosquitto: TLS/auth commented out / optional
sequenceDiagram
autonumber
participant Operator
participant TaskRunner as Task
participant Vault as Obsidian Vault
participant Repo as Git Repo
Operator->>TaskRunner: task backup
TaskRunner->>TaskRunner: backup-config
TaskRunner->>Vault: rsync (exclude .obsidian/)
TaskRunner->>Repo: rsync -> repo (exclude .git/)
TaskRunner->>Repo: git add --all
TaskRunner->>Repo: git commit "Automatic sync" (if staged changes)
TaskRunner-->>Operator: Backup complete
note right of TaskRunner: Paths derived from STORAGE_OBSIDIAN and OBSIDIAN_VAULT_NAME
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Pre-merge checks and finishing touches✅ Passed checks (3 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
📜 Recent review detailsConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro 📒 Files selected for processing (7)
🚧 Files skipped from review as they are similar to previous changes (3)
🧰 Additional context used📓 Path-based instructions (2)**/*.{yml,yaml}📄 CodeRabbit inference engine (AGENTS.md)
Files:
**/*.py📄 CodeRabbit inference engine (AGENTS.md)
Files:
🧠 Learnings (1)📚 Learning: 2025-09-28T17:29:15.156ZApplied to files:
🪛 dotenv-linter (3.3.0)config-example/docker/myhost/.env[warning] 12-12: [UnorderedKey] The STORAGE_OBSIDIAN key should go before the STORAGE_WEBDAV key (UnorderedKey) [warning] 101-101: [QuoteCharacter] The value has quote characters (', ") (QuoteCharacter) [warning] 103-103: [QuoteCharacter] The value has quote characters (', ") (QuoteCharacter) [warning] 103-103: [UnorderedKey] The GITEA_INTERNAL_TOKEN key should go before the GITEA_SECRET_KEY key (UnorderedKey) [warning] 107-107: [QuoteCharacter] The value has quote characters (', ") (QuoteCharacter) 🪛 markdownlint-cli2 (0.18.1)docs/PRPs/containers/mssql-server.md4-4: Bare URL used (MD034, no-bare-urls) 6-6: Bare URL used (MD034, no-bare-urls) ⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
🔇 Additional comments (10)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (4)
config-example/docker/myhost/services.yaml (1)
49-51: Fix Mosquitto entry formatting.There’s a trailing blank line with spaces after the Mosquitto block. Trim it to keep YAML clean and satisfy linters.
docs/PRPs/containers/obsidian.md (1)
4-6: Wrap bare URLs to satisfy markdownlint.markdownlint (MD034) flags bare URLs—wrap them in angle brackets or convert to Markdown links to keep the doc lint-clean.
config-example/docker/myhost/.env (1)
12-12: Maintain storage key ordering.dotenv-linter flags key order; move
STORAGE_OBSIDIANup next to the otherSTORAGE_LOCAL_MEDIA/*entries (beforeSTORAGE_WEBDAV) to keep the file passing lint.docs/PRPs/containers/mosquitto.md (1)
4-6: Fix markdownlint MD034 violations.Wrap the bare URLs in angle brackets or convert them to Markdown links so the doc passes markdownlint.
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (8)
config-example/docker/myhost/.env(2 hunks)config-example/docker/myhost/services.yaml(2 hunks)docker/Taskfile.apps.yaml(2 hunks)docker/automation/mosquitto.yaml(1 hunks)docker/automation/mosquitto/mosquitto.conf(1 hunks)docker/tools/obsidian.yaml(1 hunks)docs/PRPs/containers/mosquitto.md(1 hunks)docs/PRPs/containers/obsidian.md(1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
All YAML files must be linted and validated via pre-commit
Files:
config-example/docker/myhost/services.yamldocker/automation/mosquitto.yamldocker/tools/obsidian.yamldocker/Taskfile.apps.yaml
docker/{security,media,storage,monitoring,ai,tools}/**/*.{yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
docker/{security,media,storage,monitoring,ai,tools}/**/*.{yml,yaml}: Place Docker service definitions as YAML files under the appropriate category directory in docker/ (security, media, storage, monitoring, ai, tools)
When adding or modifying a service, create or edit its YAML definition in the appropriate docker// directory
Files:
docker/tools/obsidian.yaml
🧬 Code graph analysis (1)
docker/tools/obsidian.yaml (1)
docs/web/update-docs.py (1)
process_docker_compose_file(296-338)
🪛 dotenv-linter (3.3.0)
config-example/docker/myhost/.env
[warning] 12-12: [UnorderedKey] The STORAGE_OBSIDIAN key should go before the STORAGE_WEBDAV key
(UnorderedKey)
🪛 markdownlint-cli2 (0.18.1)
docs/PRPs/containers/obsidian.md
4-4: Bare URL used
(MD034, no-bare-urls)
5-5: Bare URL used
(MD034, no-bare-urls)
6-6: Bare URL used
(MD034, no-bare-urls)
docs/PRPs/containers/mosquitto.md
4-4: Bare URL used
(MD034, no-bare-urls)
5-5: Bare URL used
(MD034, no-bare-urls)
6-6: Bare URL used
(MD034, no-bare-urls)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: build
- GitHub Check: check
5367e1a to
2a2ee4d
Compare
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (1)
docker/tools/obsidian.yaml (1)
15-15: Pin the Obsidian image to a fixed tag or digest.Pulling
lateston every deploy risks silently replacing a working build with an untested upstream change. Please lock the image to a specific release tag or digest that you’ve validated in your environment to keep deployments reproducible.
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (14)
AGENTS.md(1 hunks)README.md(1 hunks)Taskfile.yaml(1 hunks)config-example/docker/myhost/.env(2 hunks)config-example/docker/myhost/services.yaml(4 hunks)config-example/docker/services-schema.yaml(1 hunks)docker/Taskfile.apps.yaml(2 hunks)docker/Taskfile.docker.yaml(1 hunks)docker/automation/mosquitto.yaml(1 hunks)docker/automation/mosquitto/mosquitto.conf(1 hunks)docker/tools/obsidian.yaml(1 hunks)docs/PRPs/containers/mosquitto.md(1 hunks)docs/PRPs/containers/obsidian.md(1 hunks)scripts/update-example-env.py(1 hunks)
✅ Files skipped from review due to trivial changes (2)
- scripts/update-example-env.py
- README.md
🚧 Files skipped from review as they are similar to previous changes (3)
- docker/automation/mosquitto/mosquitto.conf
- config-example/docker/myhost/services.yaml
- docker/Taskfile.apps.yaml
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
All YAML files must be linted and validated via pre-commit
Files:
config-example/docker/services-schema.yamldocker/Taskfile.docker.yamldocker/automation/mosquitto.yamlTaskfile.yamldocker/tools/obsidian.yaml
docker/{security,media,storage,monitoring,ai,tools}/**/*.{yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
docker/{security,media,storage,monitoring,ai,tools}/**/*.{yml,yaml}: Place Docker service definitions as YAML files under the appropriate category directory in docker/ (security, media, storage, monitoring, ai, tools)
When adding or modifying a service, create or edit its YAML definition in the appropriate docker// directory
Files:
docker/tools/obsidian.yaml
🧠 Learnings (2)
📚 Learning: 2025-09-28T17:29:15.156Z
Learnt from: CR
PR: bubacoder/infra#0
File: AGENTS.md:0-0
Timestamp: 2025-09-28T17:29:15.156Z
Learning: Applies to docker/{security,media,storage,monitoring,ai,tools}/**/*.{yml,yaml} : Place Docker service definitions as YAML files under the appropriate category directory in docker/ (security, media, storage, monitoring, ai, tools)
Applied to files:
config-example/docker/services-schema.yaml
📚 Learning: 2025-09-28T17:29:15.156Z
Learnt from: CR
PR: bubacoder/infra#0
File: AGENTS.md:0-0
Timestamp: 2025-09-28T17:29:15.156Z
Learning: Applies to docker/{security,media,storage,monitoring,ai,tools}/**/*.{yml,yaml} : When adding or modifying a service, create or edit its YAML definition in the appropriate docker/<category>/ directory
Applied to files:
config-example/docker/services-schema.yaml
🪛 dotenv-linter (3.3.0)
config-example/docker/myhost/.env
[warning] 12-12: [UnorderedKey] The STORAGE_OBSIDIAN key should go before the STORAGE_WEBDAV key
(UnorderedKey)
🪛 markdownlint-cli2 (0.18.1)
docs/PRPs/containers/mosquitto.md
4-4: Bare URL used
(MD034, no-bare-urls)
5-5: Bare URL used
(MD034, no-bare-urls)
6-6: Bare URL used
(MD034, no-bare-urls)
9-9: Bare URL used
(MD034, no-bare-urls)
80-80: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
90-90: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
docs/PRPs/containers/obsidian.md
4-4: Bare URL used
(MD034, no-bare-urls)
5-5: Bare URL used
(MD034, no-bare-urls)
6-6: Bare URL used
(MD034, no-bare-urls)
9-9: Bare URL used
(MD034, no-bare-urls)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: build
- GitHub Check: check
2a2ee4d to
d1502d7
Compare
There was a problem hiding this comment.
Actionable comments posted: 0
♻️ Duplicate comments (2)
docs/PRPs/containers/mosquitto.md (2)
4-9: Wrap the bare URLs in Markdown links.MD034 from markdownlint still fires here—please convert each bare URL to
[label](url)so the lint job passes.-Homepage: https://mosquitto.org/ -GitHub page: https://github.com/eclipse/mosquitto -Install instructions URL: https://hub.docker.com/_/eclipse-mosquitto -Container image(s): eclipse-mosquitto:2.0.22-openssl -Category: automation -Dashboard Icon: https://mosquitto.org/favicon-16x16.png +Homepage: [mosquitto.org](https://mosquitto.org/) +GitHub page: [github.com/eclipse/mosquitto](https://github.com/eclipse/mosquitto) +Install instructions URL: [hub.docker.com/_/eclipse-mosquitto](https://hub.docker.com/_/eclipse-mosquitto) +Container image(s): `eclipse-mosquitto:2.0.22-openssl` +Category: automation +Dashboard Icon: [mosquitto.org favicon](https://mosquitto.org/favicon-16x16.png)Based on static analysis hints.
80-114: Add language identifiers to these code fences.MD040 is still complaining about the directory tree and config sample fences—tag them with a language (
text,conf, etc.) so linting succeeds.- ``` + ```text @@ - ``` + ```confBased on static analysis hints.
🧹 Nitpick comments (1)
config-example/docker/services-schema.yaml (1)
8-51: Requireservicesand tighten service object schema.Without a
requiredclause the schema accepts an empty root object, and service objects can carry arbitrary keys. Tightening those constraints helps the validation actually catch malformed configs.properties: services: type: array description: Categories of Docker services + minItems: 1 items: type: object additionalProperties: type: array description: List of services in a specific category items: type: object required: - name - state properties: name: type: string description: Name of the Docker service state: type: string description: Current state of the service enum: - up - down note: type: string description: Optional note about the service + additionalProperties: false +required: + - services additionalProperties: false
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (10)
AGENTS.md(1 hunks)README.md(1 hunks)Taskfile.yaml(1 hunks)config-example/docker/myhost/services.yaml(4 hunks)config-example/docker/services-schema.yaml(1 hunks)docker/Taskfile.docker.yaml(1 hunks)docker/automation/mosquitto.yaml(1 hunks)docker/automation/mosquitto/mosquitto.conf(1 hunks)docs/PRPs/containers/mosquitto.md(1 hunks)scripts/update-example-env.py(1 hunks)
✅ Files skipped from review due to trivial changes (2)
- README.md
- scripts/update-example-env.py
🚧 Files skipped from review as they are similar to previous changes (3)
- docker/automation/mosquitto/mosquitto.conf
- Taskfile.yaml
- AGENTS.md
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
All YAML files must be linted and validated via pre-commit
Files:
config-example/docker/myhost/services.yamldocker/Taskfile.docker.yamldocker/automation/mosquitto.yamlconfig-example/docker/services-schema.yaml
🧠 Learnings (3)
📚 Learning: 2025-09-28T17:29:15.156Z
Learnt from: CR
PR: bubacoder/infra#0
File: AGENTS.md:0-0
Timestamp: 2025-09-28T17:29:15.156Z
Learning: Applies to config/docker/*/services.yaml : Add each service to the host-specific configuration at config/docker/<hostname>/services.yaml
Applied to files:
config-example/docker/myhost/services.yaml
📚 Learning: 2025-09-28T17:29:15.156Z
Learnt from: CR
PR: bubacoder/infra#0
File: AGENTS.md:0-0
Timestamp: 2025-09-28T17:29:15.156Z
Learning: Applies to docker/{security,media,storage,monitoring,ai,tools}/**/*.{yml,yaml} : Place Docker service definitions as YAML files under the appropriate category directory in docker/ (security, media, storage, monitoring, ai, tools)
Applied to files:
config-example/docker/services-schema.yaml
📚 Learning: 2025-09-28T17:29:15.156Z
Learnt from: CR
PR: bubacoder/infra#0
File: AGENTS.md:0-0
Timestamp: 2025-09-28T17:29:15.156Z
Learning: Applies to docker/{security,media,storage,monitoring,ai,tools}/**/*.{yml,yaml} : When adding or modifying a service, create or edit its YAML definition in the appropriate docker/<category>/ directory
Applied to files:
config-example/docker/services-schema.yaml
🪛 markdownlint-cli2 (0.18.1)
docs/PRPs/containers/mosquitto.md
4-4: Bare URL used
(MD034, no-bare-urls)
5-5: Bare URL used
(MD034, no-bare-urls)
6-6: Bare URL used
(MD034, no-bare-urls)
9-9: Bare URL used
(MD034, no-bare-urls)
80-80: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
90-90: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: build
- GitHub Check: check
d1502d7 to
bb34046
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (1)
config-example/docker/myhost/.env (1)
10-12: Keep keys sorted fordotenv-linterPlease move
STORAGE_OBSIDIANbeforeSTORAGE_WEBDAVso the storage block stays alphabetically sorted and the pre-commitdotenv-lintercheck keeps passing.Apply this diff:
-STORAGE_WEBDAV=${STORAGE_LOCAL_MEDIA}/webdav -STORAGE_KIWIX=${STORAGE_LOCAL_MEDIA}/kiwix -STORAGE_OBSIDIAN=${STORAGE_LOCAL_MEDIA}/obsidian +STORAGE_OBSIDIAN=${STORAGE_LOCAL_MEDIA}/obsidian +STORAGE_WEBDAV=${STORAGE_LOCAL_MEDIA}/webdav +STORAGE_KIWIX=${STORAGE_LOCAL_MEDIA}/kiwix
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (14)
AGENTS.md(1 hunks)README.md(1 hunks)Taskfile.yaml(3 hunks)config-example/docker/myhost/.env(2 hunks)config-example/docker/myhost/services.yaml(4 hunks)config-example/docker/services-schema.yaml(1 hunks)docker/Taskfile.docker.yaml(1 hunks)docker/automation/mosquitto.yaml(1 hunks)docker/automation/mosquitto/mosquitto.conf(1 hunks)docker/tools/Taskfile.obsidian.yaml(1 hunks)docker/tools/obsidian.yaml(1 hunks)docs/PRPs/containers/mosquitto.md(1 hunks)docs/PRPs/containers/obsidian.md(1 hunks)scripts/update-example-env.py(1 hunks)
✅ Files skipped from review due to trivial changes (2)
- docker/automation/mosquitto/mosquitto.conf
- AGENTS.md
🚧 Files skipped from review as they are similar to previous changes (8)
- scripts/update-example-env.py
- docs/PRPs/containers/obsidian.md
- config-example/docker/myhost/services.yaml
- docs/PRPs/containers/mosquitto.md
- README.md
- config-example/docker/services-schema.yaml
- docker/automation/mosquitto.yaml
- docker/Taskfile.docker.yaml
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
All YAML files must be linted and validated via pre-commit
Files:
docker/tools/obsidian.yamldocker/tools/Taskfile.obsidian.yamlTaskfile.yaml
docker/{security,media,storage,monitoring,ai,tools}/**/*.{yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
docker/{security,media,storage,monitoring,ai,tools}/**/*.{yml,yaml}: Place Docker service definitions as YAML files under the appropriate category directory in docker/ (security, media, storage, monitoring, ai, tools)
When adding or modifying a service, create or edit its YAML definition in the appropriate docker// directory
Files:
docker/tools/obsidian.yamldocker/tools/Taskfile.obsidian.yaml
🧬 Code graph analysis (1)
docker/tools/obsidian.yaml (1)
docs/web/update-docs.py (1)
process_docker_compose_file(296-338)
🪛 dotenv-linter (3.3.0)
config-example/docker/myhost/.env
[warning] 12-12: [UnorderedKey] The STORAGE_OBSIDIAN key should go before the STORAGE_WEBDAV key
(UnorderedKey)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: check
- GitHub Check: build
bb34046 to
14e8bcb
Compare
There was a problem hiding this comment.
Actionable comments posted: 6
♻️ Duplicate comments (5)
config-example/docker/myhost/.env (1)
12-12: Reorder STORAGE_OBSIDIAN for dotenv-linter.This issue was already flagged in a previous review. Please move
STORAGE_OBSIDIANahead ofSTORAGE_WEBDAVto maintain alphabetical order and satisfy the linter.Based on static analysis hints
docs/PRPs/containers/obsidian.md (1)
4-7: Wrap base URLs in Markdown links.The bare links still violate MD034; please convert the metadata lines to
[label](url)form so markdownlint passes.
Apply this diff:-Homepage: https://obsidian.md -GitHub page: https://github.com/obsidianmd -Install instructions URL: https://docs.linuxserver.io/images/docker-obsidian/ -Container image(s): lscr.io/linuxserver/obsidian:latest +Homepage: [obsidian.md](https://obsidian.md) +GitHub page: [github.com/obsidianmd](https://github.com/obsidianmd) +Install instructions URL: [docs.linuxserver.io/images/docker-obsidian](https://docs.linuxserver.io/images/docker-obsidian/) +Container image(s): [lscr.io/linuxserver/obsidian:latest](https://lscr.io/linuxserver/obsidian:latest)Based on static analysis hints.
docs/PRPs/containers/mosquitto.md (2)
4-10: Convert metadata URLs to Markdown links.These plain URLs still trigger MD034; wrap them in
[text](url)syntax so linting succeeds.
Suggested patch:-Homepage: https://mosquitto.org/ -GitHub page: https://github.com/eclipse/mosquitto -Install instructions URL: https://hub.docker.com/_/eclipse-mosquitto -Container image(s): eclipse-mosquitto:2.0.22-openssl -Dashboard Icon: https://mosquitto.org/favicon-16x16.png +Homepage: [mosquitto.org](https://mosquitto.org/) +GitHub page: [github.com/eclipse/mosquitto](https://github.com/eclipse/mosquitto) +Install instructions URL: [hub.docker.com/_/eclipse-mosquitto](https://hub.docker.com/_/eclipse-mosquitto) +Container image(s): `eclipse-mosquitto:2.0.22-openssl` +Dashboard Icon: [mosquitto.org/favicon-16x16.png](https://mosquitto.org/favicon-16x16.png)Based on static analysis hints.
80-114: Tag fenced blocks with a language.The directory tree and
mosquitto.confexamples still lack language identifiers, tripping MD040. Addtext/confto the fences.
Proposed changes:- ``` + ```text @@ - ``` + ```confBased on static analysis hints.
docker/tools/Taskfile.obsidian.yaml (1)
13-41: Quote/slug vault variables to survive spaces.
OBSIDIAN_VAULT_NAMEstill flows through unquotedecho,realpath,cd, andrsync, so vaults like “Second Brain” break the workflow. Slug the repo name and quote every path expansion.
Apply:- REPO_NAME="$(echo -n ${OBSIDIAN_VAULT_NAME} | tr '[:upper:]' '[:lower:]')" - REPO_PATH="$(realpath -s ../${REPO_NAME})" + REPO_NAME="$(printf '%s' "${OBSIDIAN_VAULT_NAME}" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')" + REPO_PATH="$(realpath -s "../${REPO_NAME}")" @@ - cd ${REPO_PATH} || { echo "Failed to cd to ${REPO_PATH}"; exit 1; } + cd "${REPO_PATH}" || { echo "Failed to cd to ${REPO_PATH}"; exit 1; } @@ - rsync --verbose --archive --delete --exclude ".obsidian/" --exclude ".git/" ${VAULT_PATH} . + rsync --verbose --archive --delete --exclude ".obsidian/" --exclude ".git/" "${VAULT_PATH}" . @@ - REPO_NAME="$(echo -n ${OBSIDIAN_VAULT_NAME} | tr '[:upper:]' '[:lower:]')" - REPO_PATH="$(realpath -s ../${REPO_NAME})" - cd ${REPO_PATH} || { echo "Failed to cd to ${REPO_PATH}"; exit 1; } + REPO_NAME="$(printf '%s' "${OBSIDIAN_VAULT_NAME}" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')" + REPO_PATH="$(realpath -s "../${REPO_NAME}")" + cd "${REPO_PATH}" || { echo "Failed to cd to ${REPO_PATH}"; exit 1; }Based on static analysis hints.
🧹 Nitpick comments (1)
scripts/labctl.py (1)
29-33: Consider modern type hint syntax for thesinceparameter.The log options are well-structured. For Python 3.10+, consider using the union operator for the optional type hint.
Apply this diff:
# Log options follow: bool = False tail: str = "all" - since: str = None + since: str | None = None timestamps: bool = False
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (24)
.claude/commands/implement-container-deployment.md(1 hunks).pre-commit-config.yaml(1 hunks)AGENTS.md(1 hunks)README.md(1 hunks)Taskfile.yaml(3 hunks)config-example/docker/myhost/.env(2 hunks)config-example/docker/myhost/services.yaml(6 hunks)config-example/docker/services-schema.yaml(1 hunks)docker/Taskfile.docker.yaml(1 hunks)docker/automation/esphome-device-builder.yaml(1 hunks)docker/automation/mosquitto.yaml(1 hunks)docker/automation/mosquitto/mosquitto.conf(1 hunks)docker/dev/gitea.yaml(1 hunks)docker/guidelines.md(2 hunks)docker/storage/mssql-server.yaml(1 hunks)docker/tools/Taskfile.obsidian.yaml(1 hunks)docker/tools/obsidian.yaml(1 hunks)docs/PRPs/containers/esphome-device-builder.md(1 hunks)docs/PRPs/containers/gitea.md(1 hunks)docs/PRPs/containers/mosquitto.md(1 hunks)docs/PRPs/containers/mssql-server.md(1 hunks)docs/PRPs/containers/obsidian.md(1 hunks)scripts/labctl.py(5 hunks)scripts/update-example-env.py(1 hunks)
✅ Files skipped from review due to trivial changes (1)
- README.md
🚧 Files skipped from review as they are similar to previous changes (6)
- docker/automation/mosquitto/mosquitto.conf
- Taskfile.yaml
- config-example/docker/services-schema.yaml
- scripts/update-example-env.py
- docker/tools/obsidian.yaml
- AGENTS.md
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
All YAML files must be linted and validated via pre-commit
Files:
docker/storage/mssql-server.yamldocker/automation/esphome-device-builder.yamldocker/automation/mosquitto.yamldocker/dev/gitea.yamlconfig-example/docker/myhost/services.yamldocker/Taskfile.docker.yamldocker/tools/Taskfile.obsidian.yaml
docker/{security,media,storage,monitoring,ai,tools}/**/*.{yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
docker/{security,media,storage,monitoring,ai,tools}/**/*.{yml,yaml}: Place Docker service definitions as YAML files under the appropriate category directory in docker/ (security, media, storage, monitoring, ai, tools)
When adding or modifying a service, create or edit its YAML definition in the appropriate docker// directory
Files:
docker/storage/mssql-server.yamldocker/tools/Taskfile.obsidian.yaml
**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
Python code must pass Ruff linting via pre-commit
Files:
scripts/labctl.py
🧠 Learnings (1)
📚 Learning: 2025-09-28T17:29:15.156Z
Learnt from: CR
PR: bubacoder/infra#0
File: AGENTS.md:0-0
Timestamp: 2025-09-28T17:29:15.156Z
Learning: Applies to config/docker/*/services.yaml : Add each service to the host-specific configuration at config/docker/<hostname>/services.yaml
Applied to files:
config-example/docker/myhost/services.yaml
🪛 dotenv-linter (3.3.0)
config-example/docker/myhost/.env
[warning] 12-12: [UnorderedKey] The STORAGE_OBSIDIAN key should go before the STORAGE_WEBDAV key
(UnorderedKey)
🪛 markdownlint-cli2 (0.18.1)
docs/PRPs/containers/gitea.md
4-4: Bare URL used
(MD034, no-bare-urls)
5-5: Bare URL used
(MD034, no-bare-urls)
6-6: Bare URL used
(MD034, no-bare-urls)
9-9: Bare URL used
(MD034, no-bare-urls)
80-80: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
90-90: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
docs/PRPs/containers/mssql-server.md
4-4: Bare URL used
(MD034, no-bare-urls)
6-6: Bare URL used
(MD034, no-bare-urls)
docs/PRPs/containers/esphome-device-builder.md
4-4: Bare URL used
(MD034, no-bare-urls)
5-5: Bare URL used
(MD034, no-bare-urls)
6-6: Bare URL used
(MD034, no-bare-urls)
docs/PRPs/containers/mosquitto.md
4-4: Bare URL used
(MD034, no-bare-urls)
5-5: Bare URL used
(MD034, no-bare-urls)
6-6: Bare URL used
(MD034, no-bare-urls)
9-9: Bare URL used
(MD034, no-bare-urls)
80-80: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
90-90: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
docs/PRPs/containers/obsidian.md
4-4: Bare URL used
(MD034, no-bare-urls)
5-5: Bare URL used
(MD034, no-bare-urls)
6-6: Bare URL used
(MD034, no-bare-urls)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: build
- GitHub Check: check
🔇 Additional comments (9)
.pre-commit-config.yaml (1)
13-17: LGTM! The multi-line regex pattern is well-structured.The verbose regex pattern correctly excludes both directories, uses proper anchoring, and aligns with the new mosquitto automation content introduced in this PR.
docker/guidelines.md (2)
190-190: Good guidance for database deployments.This addition correctly advises using named volumes for data-heavy applications like databases, which is a Docker best practice for better performance and management.
231-231: Helpful TODO template addition.Adding a TODO placeholder in the template encourages developers to document additional configuration tasks and enhancements, improving service documentation quality.
docker/Taskfile.docker.yaml (1)
69-85: LGTM! Task rename and schema propagation are correct.The rename from
create-example-envtoupdate-example-envbetter reflects the task's purpose. The addition ofservices-schema.yamlto both sources and generates correctly tracks the schema file propagation.docker/dev/gitea.yaml (1)
11-52: Service configuration follows guidelines correctly.The Gitea service is well-structured and follows the docker guidelines template with proper:
- Version pinning (1.24.6)
- Environment variable configuration
- Volume management
- Traefik integration
- Homepage dashboard labels
- SSH port mapping (222 to avoid host conflicts)
scripts/labctl.py (3)
206-224: LGTM! The log command builder is well-implemented.The function correctly translates DockerOptions into docker compose logs flags, handling all the log-specific options appropriately.
283-288: LGTM! The logs action is properly integrated.The logs case correctly constructs and executes the docker compose logs command with the appropriate flags and service name.
426-430: LGTM! CLI arguments for logs are well-defined.The log-specific command-line arguments are properly configured with appropriate defaults and help text.
config-example/docker/myhost/.env (1)
94-97: Good addition of optional Obsidian authentication placeholders.The commented authentication variables provide clear guidance for users who want to enable authentication for the Obsidian container.
14e8bcb to
fe668bc
Compare
There was a problem hiding this comment.
Actionable comments posted: 4
♻️ Duplicate comments (4)
config-example/docker/myhost/.env (1)
10-12: Reorder storage keys to pass dotenv-linter.Move STORAGE_OBSIDIAN before STORAGE_WEBDAV (alphabetical).
-STORAGE_WEBDAV=${STORAGE_LOCAL_MEDIA}/webdav -STORAGE_KIWIX=${STORAGE_LOCAL_MEDIA}/kiwix -STORAGE_OBSIDIAN=${STORAGE_LOCAL_MEDIA}/obsidian +STORAGE_OBSIDIAN=${STORAGE_LOCAL_MEDIA}/obsidian +STORAGE_WEBDAV=${STORAGE_LOCAL_MEDIA}/webdav +STORAGE_KIWIX=${STORAGE_LOCAL_MEDIA}/kiwixdocs/PRPs/containers/mssql-server.md (1)
4-6: Wrap bare URLs to satisfy MD034.-Homepage: https://www.microsoft.com/en-us/sql-server -Install instructions URL: https://raw.githubusercontent.com/MicrosoftDocs/sql-docs/refs/heads/live/docs/linux/quickstart-install-connect-docker.md +Homepage: [microsoft.com/en-us/sql-server](https://www.microsoft.com/en-us/sql-server) +Install instructions URL: [quickstart-install-connect-docker.md](https://raw.githubusercontent.com/MicrosoftDocs/sql-docs/refs/heads/live/docs/linux/quickstart-install-connect-docker.md)docs/PRPs/containers/esphome-device-builder.md (1)
4-7: Format base URLs as Markdown links (MD034).-Homepage: https://esphome.io -GitHub page: https://github.com/esphome/esphome -Install instructions URL: https://esphome.io/guides/getting_started_command_line/#bonus-esphome-device-builder -Container image(s): esphome/esphome:2025.11.0-dev20251010 +Homepage: [esphome.io](https://esphome.io) +GitHub page: [github.com/esphome/esphome](https://github.com/esphome/esphome) +Install instructions URL: [esphome.io/guides/getting_started_command_line/#bonus-esphome-device-builder](https://esphome.io/guides/getting_started_command_line/#bonus-esphome-device-builder) +Container image(s): [esphome/esphome:2025.11.0-dev20251010](https://hub.docker.com/r/esphome/esphome/tags)docker/automation/esphome-device-builder.yaml (1)
18-18: Traefik labels won’t work with host networking. Choose one fix.Option A – Use bridge networking with Traefik (keeps labels; enables routing):
- network_mode: host + # Attach to Traefik's network instead of host mode + networks: + - proxy @@ - # Not needed due to 'network_mode: host' - # ports: - # - "6052:6052" + # No host ports needed when Traefik is on the same Docker networkAdd networks block at file end:
+networks: + proxy: + external: trueOption B – Keep host networking; remove Traefik Docker labels (route via file/static provider instead):
- network_mode: host @@ - labels: - traefik.enable: true - traefik.http.routers.esphome-device-builder.rule: Host(`esphome.${MYDOMAIN}`) - traefik.http.routers.esphome-device-builder.middlewares: localaccess@file - traefik.http.services.esphome-device-builder.loadbalancer.server.port: 6052 - homepage.group: Automation - homepage.name: ESPHome Builder - homepage.icon: esphome.png - homepage.href: https://esphome.${MYDOMAIN}/ - homepage.description: "Firmware builder for ESP devices" + # labels: + # homepage.group: Automation + # homepage.name: ESPHome Builder + # homepage.icon: esphome.png + # homepage.href: https://esphome.${MYDOMAIN}/ + # homepage.description: "Firmware builder for ESP devices"Also applies to: 36-39
🧹 Nitpick comments (2)
scripts/labctl.py (2)
393-400: Consider simplifying log option assignment.The
hasattrchecks are redundant since argparse always populates these attributes when the parser is defined (lines 427-430). Theif args.operation == 'logs'guard on line 392 is sufficient.You could simplify to:
# Add log options if they exist in args and operation is 'logs' if args.operation == 'logs': - if hasattr(args, 'follow'): - options.follow = args.follow - if hasattr(args, 'tail'): - options.tail = args.tail - if hasattr(args, 'since'): - options.since = args.since - if hasattr(args, 'timestamps'): - options.timestamps = args.timestamps + options.follow = args.follow + options.tail = args.tail + options.since = args.since + options.timestamps = args.timestamps
426-430: Consider validating--tailand--sincearguments.The
--tailargument accepts any string, but Docker Compose expects either "all" or a positive integer. Similarly,--sinceexpects specific formats (e.g., "10m", "1h", RFC3339 timestamps). Without validation, users will receive cryptic Docker Compose error messages for invalid inputs.You could add validation using argparse
typeparameter or a custom validation function. For example:def validate_tail(value): if value == "all": return value try: int_value = int(value) if int_value < 0: raise argparse.ArgumentTypeError(f"tail must be 'all' or a non-negative integer") return value except ValueError: raise argparse.ArgumentTypeError(f"tail must be 'all' or a non-negative integer") service_parser.add_argument('--tail', '-n', type=validate_tail, default="all", help='Number of lines to show from the end of logs (default: all)')This would improve user experience by catching errors earlier with clearer messages.
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (11)
.claude/commands/implement-container-deployment.md(1 hunks)config-example/docker/myhost/.env(2 hunks)config-example/docker/myhost/services.yaml(6 hunks)docker/automation/esphome-device-builder.yaml(1 hunks)docker/dev/gitea.yaml(1 hunks)docker/guidelines.md(2 hunks)docker/storage/mssql-server.yaml(1 hunks)docs/PRPs/containers/esphome-device-builder.md(1 hunks)docs/PRPs/containers/gitea.md(1 hunks)docs/PRPs/containers/mssql-server.md(1 hunks)scripts/labctl.py(5 hunks)
🚧 Files skipped from review as they are similar to previous changes (4)
- docker/storage/mssql-server.yaml
- docker/dev/gitea.yaml
- .claude/commands/implement-container-deployment.md
- docker/guidelines.md
🧰 Additional context used
📓 Path-based instructions (2)
**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
Python code must pass Ruff linting via pre-commit
Files:
scripts/labctl.py
**/*.{yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
All YAML files must be linted and validated via pre-commit
Files:
config-example/docker/myhost/services.yamldocker/automation/esphome-device-builder.yaml
🧠 Learnings (1)
📚 Learning: 2025-09-28T17:29:15.156Z
Learnt from: CR
PR: bubacoder/infra#0
File: AGENTS.md:0-0
Timestamp: 2025-09-28T17:29:15.156Z
Learning: Applies to config/docker/*/services.yaml : Add each service to the host-specific configuration at config/docker/<hostname>/services.yaml
Applied to files:
config-example/docker/myhost/services.yaml
🪛 dotenv-linter (3.3.0)
config-example/docker/myhost/.env
[warning] 12-12: [UnorderedKey] The STORAGE_OBSIDIAN key should go before the STORAGE_WEBDAV key
(UnorderedKey)
[warning] 101-101: [QuoteCharacter] The value has quote characters (', ")
(QuoteCharacter)
[warning] 103-103: [QuoteCharacter] The value has quote characters (', ")
(QuoteCharacter)
[warning] 103-103: [UnorderedKey] The GITEA_INTERNAL_TOKEN key should go before the GITEA_SECRET_KEY key
(UnorderedKey)
[warning] 107-107: [QuoteCharacter] The value has quote characters (', ")
(QuoteCharacter)
🪛 markdownlint-cli2 (0.18.1)
docs/PRPs/containers/mssql-server.md
4-4: Bare URL used
(MD034, no-bare-urls)
6-6: Bare URL used
(MD034, no-bare-urls)
docs/PRPs/containers/gitea.md
4-4: Bare URL used
(MD034, no-bare-urls)
5-5: Bare URL used
(MD034, no-bare-urls)
6-6: Bare URL used
(MD034, no-bare-urls)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: build
- GitHub Check: check
🔇 Additional comments (3)
scripts/labctl.py (2)
206-224: LGTM! Well-structured log flag builder.The function correctly constructs Docker Compose log command flags based on the provided options. The logic for handling "all" as a special value for
tail(line 218) aligns with Docker Compose's default behavior.
283-288: LGTM! Logs action properly integrated.The logs case correctly constructs the command using
build_log_command_flagsand appends the service name to target logs for the specific service being managed.config-example/docker/myhost/services.yaml (1)
50-53: New service entries look good and align with repo structure.Additions for mosquitto, esphome-device-builder, mssql-server, gitea, and obsidian are consistent with corresponding compose files and the schema header.
Based on learnings
Also applies to: 95-96, 109-110, 133-134, 163-165
There was a problem hiding this comment.
Actionable comments posted: 4
♻️ Duplicate comments (3)
docker/automation/esphome-device-builder.yaml (1)
18-39: Host networking breaks the Traefik labels.With
network_mode: host, Traefik’s Docker provider can’t see this container, so the router/service labels never attach andhttps://esphome.${MYDOMAIN}won’t resolve. Either drop host networking and join the Traefik network (publishing 6052) or keep host mode but remove these labels and configure Traefik via another provider.config-example/docker/myhost/.env (1)
10-12: Fix dotenv-linter ordering for storage paths.Line 12 puts
STORAGE_OBSIDIANafterSTORAGE_WEBDAV, which still breaks the alphabetical ordering lint (UnorderedKey). Please moveSTORAGE_OBSIDIANbeforeSTORAGE_WEBDAV.docs/PRPs/containers/mssql-server.md (1)
3-7: Convert the metadata URLs to Markdown links.MD034 (no-bare-urls) is still triggered for the Homepage and Install instructions entries. Please wrap them in
[text](url)format.Apply this diff:
-Homepage: https://www.microsoft.com/en-us/sql-server -Install instructions URL: https://raw.githubusercontent.com/MicrosoftDocs/sql-docs/refs/heads/live/docs/linux/quickstart-install-connect-docker.md +Homepage: [microsoft.com/en-us/sql-server](https://www.microsoft.com/en-us/sql-server) +Install instructions URL: [quickstart-install-connect-docker.md](https://raw.githubusercontent.com/MicrosoftDocs/sql-docs/refs/heads/live/docs/linux/quickstart-install-connect-docker.md)
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (11)
.claude/commands/implement-container-deployment.md(1 hunks)config-example/docker/myhost/.env(2 hunks)config-example/docker/myhost/services.yaml(6 hunks)docker/automation/esphome-device-builder.yaml(1 hunks)docker/dev/gitea.yaml(1 hunks)docker/guidelines.md(2 hunks)docker/storage/mssql-server.yaml(1 hunks)docs/PRPs/containers/esphome-device-builder.md(1 hunks)docs/PRPs/containers/gitea.md(1 hunks)docs/PRPs/containers/mssql-server.md(1 hunks)scripts/labctl.py(5 hunks)
🚧 Files skipped from review as they are similar to previous changes (4)
- docker/storage/mssql-server.yaml
- config-example/docker/myhost/services.yaml
- docker/dev/gitea.yaml
- docker/guidelines.md
🧰 Additional context used
📓 Path-based instructions (2)
**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
Python code must pass Ruff linting via pre-commit
Files:
scripts/labctl.py
**/*.{yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
All YAML files must be linted and validated via pre-commit
Files:
docker/automation/esphome-device-builder.yaml
🪛 dotenv-linter (3.3.0)
config-example/docker/myhost/.env
[warning] 12-12: [UnorderedKey] The STORAGE_OBSIDIAN key should go before the STORAGE_WEBDAV key
(UnorderedKey)
[warning] 101-101: [QuoteCharacter] The value has quote characters (', ")
(QuoteCharacter)
[warning] 103-103: [QuoteCharacter] The value has quote characters (', ")
(QuoteCharacter)
[warning] 103-103: [UnorderedKey] The GITEA_INTERNAL_TOKEN key should go before the GITEA_SECRET_KEY key
(UnorderedKey)
[warning] 107-107: [QuoteCharacter] The value has quote characters (', ")
(QuoteCharacter)
🪛 markdownlint-cli2 (0.18.1)
docs/PRPs/containers/esphome-device-builder.md
4-4: Bare URL used
(MD034, no-bare-urls)
6-6: Bare URL used
(MD034, no-bare-urls)
docs/PRPs/containers/mssql-server.md
4-4: Bare URL used
(MD034, no-bare-urls)
6-6: Bare URL used
(MD034, no-bare-urls)
docs/PRPs/containers/gitea.md
4-4: Bare URL used
(MD034, no-bare-urls)
5-5: Bare URL used
(MD034, no-bare-urls)
6-6: Bare URL used
(MD034, no-bare-urls)
🔇 Additional comments (6)
.claude/commands/implement-container-deployment.md (1)
16-16: Clear abort condition wording looks good.The updated instruction now clearly covers both missing and absent files, reducing ambiguity for the agent workflow.
scripts/labctl.py (5)
38-38: LGTM!The addition of 'logs' to ALLOWED_STATES is correct and enables the new logs functionality.
206-224: LGTM!The function correctly constructs Docker Compose logs flags based on the provided options. The logic properly handles default values and conditional flag inclusion.
283-288: LGTM!The logs case correctly implements the Docker Compose logs command structure with proper flag ordering: base command → options → service name.
385-401: LGTM!The logic correctly populates log options into DockerOptions only when the operation is 'logs'. The hasattr checks are defensive programming that doesn't hurt, and the approach of silently ignoring log options for non-log operations is reasonable.
426-430: LGTM!The CLI arguments for logs functionality are well-defined with appropriate flags, defaults, and help text that align with Docker Compose conventions.
fe668bc to
cbad2db
Compare
There was a problem hiding this comment.
Actionable comments posted: 3
♻️ Duplicate comments (8)
docs/PRPs/containers/esphome-device-builder.md (1)
4-7: Fix markdownlint MD034 by wrapping URLs in links.Replace each bare URL with
[label](url)formatting so markdownlint passes (e.g.,Homepage: [esphome.io](https://esphome.io)).docs/PRPs/containers/mosquitto.md (2)
4-9: Wrap bare URLs in Markdown links.Bare URLs trigger markdownlint MD034. Please convert each line to
[label](url)so the docs lint passes.Apply this diff (adjust labels as needed):
-Homepage: https://mosquitto.org/ -GitHub page: https://github.com/eclipse/mosquitto -Install instructions URL: https://hub.docker.com/_/eclipse-mosquitto -Dashboard Icon: https://mosquitto.org/favicon-16x16.png +Homepage: [mosquitto.org](https://mosquitto.org/) +GitHub page: [github.com/eclipse/mosquitto](https://github.com/eclipse/mosquitto) +Install instructions URL: [hub.docker.com/_/eclipse-mosquitto](https://hub.docker.com/_/eclipse-mosquitto) +Dashboard Icon: [mosquitto.org/favicon-16x16.png](https://mosquitto.org/favicon-16x16.png)
81-114: Add language identifiers to the remaining code fences.markdownlint MD040 still flags the directory listing and
mosquitto.confsample because the opening fences lack a language tag. Addtext/confso lint passes.Suggested diff:
- ``` + ```text ./mosquitto/ ├── config/ @@ - ``` + ```conf # Persistence settings persistence trueconfig-example/docker/myhost/.env (3)
10-12: Fix key ordering for dotenv-linter.Alphabetize STORAGE_* entries: KIWIX < OBSIDIAN < WEBDAV.
-STORAGE_WEBDAV=${STORAGE_LOCAL_MEDIA}/webdav -STORAGE_KIWIX=${STORAGE_LOCAL_MEDIA}/kiwix -STORAGE_OBSIDIAN=${STORAGE_LOCAL_MEDIA}/obsidian +STORAGE_KIWIX=${STORAGE_LOCAL_MEDIA}/kiwix +STORAGE_OBSIDIAN=${STORAGE_LOCAL_MEDIA}/obsidian +STORAGE_WEBDAV=${STORAGE_LOCAL_MEDIA}/webdav
99-104: Gitea: reorder keys and drop quotes (dotenv-linter).Place INTERNAL_TOKEN before SECRET_KEY; remove quotes.
-### Gitea configuration -# Generate these with: docker run --rm gitea/gitea:1.24.6 gitea generate secret SECRET_KEY -GITEA_SECRET_KEY="use-some-very-secure-value-here" -# Generate these with: docker run --rm gitea/gitea:1.24.6 gitea generate secret INTERNAL_TOKEN -GITEA_INTERNAL_TOKEN="use-some-very-secure-value-here" +### Gitea configuration +# Generate this with: docker run --rm gitea/gitea:1.24.6 gitea generate secret INTERNAL_TOKEN +GITEA_INTERNAL_TOKEN=use-some-very-secure-value-here +# Generate this with: docker run --rm gitea/gitea:1.24.6 gitea generate secret SECRET_KEY +GITEA_SECRET_KEY=use-some-very-secure-value-here
105-109: MSSQL: drop quotes from MSSQL_SA_PASSWORD (dotenv-linter).Remove surrounding quotes.
-MSSQL_SA_PASSWORD="use-some-very-secure-value-here" +MSSQL_SA_PASSWORD=use-some-very-secure-value-heredocs/PRPs/containers/mssql-server.md (1)
4-7: Wrap metadata URLs (MD034).Use text links.
-Homepage: https://www.microsoft.com/en-us/sql-server +Homepage: [microsoft.com/en-us/sql-server](https://www.microsoft.com/en-us/sql-server) GitHub page: N/A (proprietary software) -Install instructions URL: https://raw.githubusercontent.com/MicrosoftDocs/sql-docs/refs/heads/live/docs/linux/quickstart-install-connect-docker.md +Install instructions URL: [quickstart-install-connect-docker.md](https://raw.githubusercontent.com/MicrosoftDocs/sql-docs/refs/heads/live/docs/linux/quickstart-install-connect-docker.md)docs/PRPs/containers/gitea.md (1)
4-6: Wrap bare URLs to satisfy markdownlint (MD034).Convert to Markdown links.
-Homepage: https://about.gitea.com/ -GitHub page: https://github.com/go-gitea/gitea -Install instructions URL: https://docs.gitea.com/installation/install-with-docker +Homepage: [about.gitea.com](https://about.gitea.com/) +GitHub page: [github.com/go-gitea/gitea](https://github.com/go-gitea/gitea) +Install instructions URL: [docs.gitea.com/installation/install-with-docker](https://docs.gitea.com/installation/install-with-docker)
🧹 Nitpick comments (2)
scripts/labctl.py (2)
206-224: Function implementation is correct.The
build_log_command_flagsfunction correctly constructs Docker Compose log command flags based on the provided options. The logic properly handles all log-related parameters.Consider adding input validation for the
tailandsinceparameters to provide earlier feedback on invalid values. For example:
tailshould be either "all" or a positive integersinceshould match Docker's expected timestamp format (e.g., "2h", "10m", RFC3339 timestamp)However, since Docker Compose will validate these values anyway and provide appropriate error messages, this validation is optional and could be deferred.
385-402: Log options handling is implemented correctly.The conditional population of log-related options when
operation == 'logs'is correct and ensures that log parameters are only applied for the logs operation.The
hasattrchecks on lines 393-400 are defensive but potentially unnecessary since these arguments are always defined by argparse (lines 427-430). You could simplify this to directly access the attributes:- # Add log options if they exist in args and operation is 'logs' if args.operation == 'logs': - if hasattr(args, 'follow'): - options.follow = args.follow - if hasattr(args, 'tail'): - options.tail = args.tail - if hasattr(args, 'since'): - options.since = args.since - if hasattr(args, 'timestamps'): - options.timestamps = args.timestamps + options.follow = args.follow + options.tail = args.tail + options.since = args.since + options.timestamps = args.timestampsHowever, the defensive approach doesn't harm and may improve robustness if the function is called in other contexts.
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (24)
.claude/commands/implement-container-deployment.md(1 hunks).pre-commit-config.yaml(1 hunks)AGENTS.md(1 hunks)README.md(1 hunks)Taskfile.yaml(3 hunks)config-example/docker/myhost/.env(2 hunks)config-example/docker/myhost/services.yaml(6 hunks)config-example/docker/services-schema.yaml(1 hunks)docker/Taskfile.docker.yaml(1 hunks)docker/automation/esphome-device-builder.yaml(1 hunks)docker/automation/mosquitto.yaml(1 hunks)docker/automation/mosquitto/mosquitto.conf(1 hunks)docker/dev/gitea.yaml(1 hunks)docker/guidelines.md(2 hunks)docker/storage/mssql-server.yaml(1 hunks)docker/tools/Taskfile.obsidian.yaml(1 hunks)docker/tools/obsidian.yaml(1 hunks)docs/PRPs/containers/esphome-device-builder.md(1 hunks)docs/PRPs/containers/gitea.md(1 hunks)docs/PRPs/containers/mosquitto.md(1 hunks)docs/PRPs/containers/mssql-server.md(1 hunks)docs/PRPs/containers/obsidian.md(1 hunks)scripts/labctl.py(5 hunks)scripts/update-example-env.py(1 hunks)
✅ Files skipped from review due to trivial changes (1)
- docs/PRPs/containers/obsidian.md
🚧 Files skipped from review as they are similar to previous changes (15)
- config-example/docker/services-schema.yaml
- README.md
- docker/automation/mosquitto.yaml
- config-example/docker/myhost/services.yaml
- docker/automation/mosquitto/mosquitto.conf
- docker/tools/obsidian.yaml
- AGENTS.md
- docker/automation/esphome-device-builder.yaml
- .pre-commit-config.yaml
- scripts/update-example-env.py
- Taskfile.yaml
- docker/Taskfile.docker.yaml
- docker/storage/mssql-server.yaml
- docker/dev/gitea.yaml
- .claude/commands/implement-container-deployment.md
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
All YAML files must be linted and validated via pre-commit
Files:
docker/tools/Taskfile.obsidian.yaml
docker/{security,media,storage,monitoring,ai,tools}/**/*.{yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
docker/{security,media,storage,monitoring,ai,tools}/**/*.{yml,yaml}: Place Docker service definitions as YAML files under the appropriate category directory in docker/ (security, media, storage, monitoring, ai, tools)
When adding or modifying a service, create or edit its YAML definition in the appropriate docker// directory
Files:
docker/tools/Taskfile.obsidian.yaml
**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
Python code must pass Ruff linting via pre-commit
Files:
scripts/labctl.py
🧬 Code graph analysis (1)
docs/PRPs/containers/gitea.md (1)
docs/web/update-docs.py (1)
process_docker_compose_file(296-338)
🪛 dotenv-linter (3.3.0)
config-example/docker/myhost/.env
[warning] 12-12: [UnorderedKey] The STORAGE_OBSIDIAN key should go before the STORAGE_WEBDAV key
(UnorderedKey)
[warning] 101-101: [QuoteCharacter] The value has quote characters (', ")
(QuoteCharacter)
[warning] 103-103: [QuoteCharacter] The value has quote characters (', ")
(QuoteCharacter)
[warning] 103-103: [UnorderedKey] The GITEA_INTERNAL_TOKEN key should go before the GITEA_SECRET_KEY key
(UnorderedKey)
[warning] 107-107: [QuoteCharacter] The value has quote characters (', ")
(QuoteCharacter)
🪛 markdownlint-cli2 (0.18.1)
docs/PRPs/containers/mosquitto.md
4-4: Bare URL used
(MD034, no-bare-urls)
5-5: Bare URL used
(MD034, no-bare-urls)
6-6: Bare URL used
(MD034, no-bare-urls)
9-9: Bare URL used
(MD034, no-bare-urls)
80-80: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
90-90: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
docs/PRPs/containers/esphome-device-builder.md
4-4: Bare URL used
(MD034, no-bare-urls)
5-5: Bare URL used
(MD034, no-bare-urls)
6-6: Bare URL used
(MD034, no-bare-urls)
docs/PRPs/containers/mssql-server.md
4-4: Bare URL used
(MD034, no-bare-urls)
6-6: Bare URL used
(MD034, no-bare-urls)
docs/PRPs/containers/gitea.md
4-4: Bare URL used
(MD034, no-bare-urls)
5-5: Bare URL used
(MD034, no-bare-urls)
6-6: Bare URL used
(MD034, no-bare-urls)
9-9: Bare URL used
(MD034, no-bare-urls)
80-80: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
90-90: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: check
- GitHub Check: build
🔇 Additional comments (1)
scripts/labctl.py (1)
32-32: Type annotation fix has been applied.The type annotation for the
sinceparameter has been corrected tostr | None = None, addressing the issue raised in previous reviews.
cbad2db to
6579fce
Compare
Summary by CodeRabbit
New Features
Chores
Documentation