Commit graph

160 commits

Author SHA1 Message Date
616079fc90 fix(gosearch): address plan review feedback
- Add note about vendorHash placeholder in gosearch flake
- Make search functionality test more explicit with jq verification
2026-03-22 01:45:51 +00:00
e39c2a3c7a docs: add gosearch implementation plan
Add comprehensive step-by-step implementation plan for integrating
gosearch (kafka) metasearch engine into the NixOS VPS configuration.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 01:45:51 +00:00
ea372d056e docs: add gosearch integration design spec
Add comprehensive design document for integrating gosearch (kafka)
metasearch engine into the NixOS VPS configuration.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 01:45:51 +00:00
bd3295e918 fix(forgejo): add Docker socket symlink for Podman compatibility
Buildx and other Docker tools expect /var/run/docker.sock.
Created symlink from /run/docker.sock to /run/podman/podman.sock
via systemd tmpfiles to enable Podman compatibility.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 01:45:51 +00:00
8f6f196aeb fix(adguard): bind to 0.0.0.0 for direct Tailscale access
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 01:45:51 +00:00
aa18a6f494 feat(security): restrict AdGuard Home to Tailscale network
- Add internalOnly to AdGuard nginx config
- Add ts-input firewall rule for direct Tailscale access
- Update Netdata to use ts-input chain for consistency

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 01:45:51 +00:00
6b64254eab . 2026-03-22 01:45:51 +00:00
ad55793d41 fix(netdata): add firewall rule for direct Tailscale access
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 01:45:51 +00:00
a47e29ff70 feat(config): enable Netdata monitoring
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 01:45:51 +00:00
0e79934ac6 feat(modules): register netdata module in default imports
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 01:45:51 +00:00
6cd9c91c38 fix: add nginx dependency and documentation to Netdata module
- Add missing nginx dependency declaration
- Add trailing newline at end of file
- Document why contentSecurityPolicy is set to null
2026-03-22 01:45:51 +00:00
da7a45c1c0 feat(modules): add Netdata monitoring module
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 01:45:51 +00:00
bb7f24ac4b docs: add Netdata module implementation plan
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 01:45:51 +00:00
d6a4dbeb45 docs: add Netdata module design spec
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 01:45:51 +00:00
Franz Kafka
abd0aaa6f2 Revert "feat: add LM Studio headless LMS server module"
This reverts commit 9f82a7b00e.
2026-03-21 20:26:41 +00:00
Franz Kafka
9f82a7b00e feat: add LM Studio headless LMS server module
- Custom NixOS module wrapping the lms CLI (daemon + server)
- Supports auto-loading models on startup
- Optional nginx reverse proxy via domain option
- Security hardening (NoNewPrivileges, ProtectSystem, PrivateTmp)
- Follows existing myModules.* convention
- Enabled on this host on port 1234 (no models loaded yet)
2026-03-21 20:25:13 +00:00
Franz Kafka
10d8924106 reapply Harrow branding + customDir via copyPathToStore 2026-03-20 22:18:45 +00:00
3598d5f2bf fix(nginx): add ACME webroot + fix multi-line CSP headers
- Set security.acme.certs.*.webroot for Let's Encrypt challenges
- Consolidate multi-line Content-Security-Policy to single line
- Fixes build error: exactly one of dnsProvider/webroot/listenHTTP/s3Bucket is required

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 22:16:51 +00:00
e36a67b7a0 chore: update secrets 2026-03-20 21:55:39 +00:00
Franz Kafka
3ecdafadf7 fix forgejo customDir: correct path + coerce to string 2026-03-20 21:53:37 +00:00
Franz Kafka
053a783772 brand forgejo as The Harrow
- Set APP_NAME to The Harrow
- Set Kafkaesque description
- Add custom logo and favicon (needle + etched scratches, rusted red)
- Point customDir to custom/ for asset loading
2026-03-20 21:52:54 +00:00
c671e97a85 Merge pull request 'feat: add openwebui' (#8) from feat/openwebui into main
Reviewed-on: #8
2026-03-20 21:48:16 +00:00
68da82c26b feat(open-webui): add OpenWeb UI module for LLM interface
Add native NixOS module wrapping services.open-webui with:
- Configurable Ollama endpoint (defaults to 100.64.0.1:11434 via Headscale)
- SOPS secret management for WEBUI_SECRET_KEY
- Nginx reverse proxy integration with relaxed CSP for WebSockets
- Exposed at ai.ashisgreat.xyz

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 22:47:05 +01:00
be7c2404c3 docs: add OpenWeb UI module design spec
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 22:42:57 +01:00
631a874c75 fix(openclaw): add token binding to gateway auth config
Subagents require the gateway token to be explicitly defined in the config to inherit it correctly. Interpolate the OPENCLAW_GATEWAY_TOKEN env variable in the auth config.
2026-03-20 22:35:27 +01:00
262887e5ea fix(openclaw): bypass device pairing requirement
- Change gateway auth mode from "none" to "token", as "none" is no longer supported and enforces device pairing.
- Provide a static OPENCLAW_GATEWAY_TOKEN in the environment to allow local subagents to bypass pairing automatically.
2026-03-20 21:49:17 +01:00
562ec5526c feat(openclaw): add openclaw-superpowers extension
- Add openclaw-superpowers as a flake input.
- Implement superpowers option in openclaw-podman module.
- Automate skill symlinking, state directory creation, and cron registration.
- Ensure PyYAML is installed within the container via a post-startup service.
- Enable superpowers in the main configuration.
2026-03-20 15:20:51 +01:00
aa670604b5 fix(openclaw): recursively fix permissions on data directory
- Use 'chown -R 1000:1000' and 'chmod -R u+rwX' in the preStart script.

- This ensures all files in /var/lib/openclaw are accessible by the container's node user.
2026-03-19 23:13:41 +01:00
49ffe471a3 fix(openclaw): remove invalid self-improvement hook
- The 'hooks' section with 'self-improvement' was causing a validation error and a crash loop on startup.
2026-03-19 23:10:31 +01:00
b505d2a327 fix(openclaw): fix ebusy on config file write
- Replace read-only bind mount for openclaw.json with a full directory bind mount.

- Use systemd preStart to copy the Nix declarative config file before startup.

- This prevents the EBUSY crash loop when OpenClaw attempts to modify its own config file on launch.
2026-03-19 23:04:50 +01:00
43bc670bf4 feat(openclaw): enable self-improvement hook
- Declaratively enable the `self-improvement` hook in the OpenClaw configuration file since it is mounted read-only into the Podman container.
2026-03-19 23:02:28 +01:00
adb8ddb611 feat(security): expose internal services and DoH to public
- Remove `internalOnly = true` flag from Vaultwarden, Forgejo, and AdGuard Home to make them publicly accessible again.

- This also re-exposes the DNS-over-HTTPS (DoH) endpoint on the AdGuard Home domain.
2026-03-19 22:48:14 +01:00
5d177a0d5c feat(network): rewrite internal dns and expose adguard ui
- Add DNS rewrites in AdGuard Home for `*.ashisgreat.xyz` to route to the Tailscale IP (`100.64.0.3`).

- Securely expose the AdGuard Home Web UI to the Tailscale network instead of blocking it completely.
2026-03-19 22:43:45 +01:00
f31ec2ce65 feat(security): restrict internal services to tailscale
- Add `internalOnly` option to nginx module to block public access.

- Apply `internalOnly` flag to Forgejo and Vaultwarden to ensure they are only accessible over the VPN or localhost.
2026-03-19 22:35:33 +01:00
b0b0989d36 fix(openclaw): revert invalid github tools/mcp config 2026-03-19 22:26:07 +01:00
6155b36279 . 2026-03-19 22:17:54 +01:00
1c76661538 feat(network): route tailscale dns through adguard
- Configure Headscale to use the VPS Tailscale IP (100.64.0.3) as the global DNS server instead of external providers.

- Add firewall rules to allow DNS requests over the `tailscale0` interface.

- Add iptables PREROUTING rules to redirect standard DNS (port 53) from Tailscale clients to AdGuard Home (port 5353) to resolve port conflicts with `aardvark-dns`.
2026-03-19 22:14:18 +01:00
4925420fdc feat(openclaw): enable github tool in config 2026-03-19 22:11:47 +01:00
93d43e480b . 2026-03-19 21:01:10 +00:00
9e206f08bd Cleanup 2026-03-19 21:59:38 +01:00
577dd607b7 feat(openclaw): add github_token to sops secrets and template 2026-03-19 21:41:01 +01:00
17553dc5ee Merge pull request 'fix(openclaw): remove --network=host, use bridge network' (#4) from franz-kafka/nixos-vps:fix/openclaw-network-isolation into main
Reviewed-on: ashie/nixos-vps#4
2026-03-19 20:19:49 +00:00
b7ccb0a07e Merge branch 'main' into fix/openclaw-network-isolation 2026-03-19 20:19:05 +00:00
d104b0e83c Merge pull request 'feat(headscale): add self-hosted Tailscale control server' (#5) from franz-kafka/nixos-vps:feat/headscale into main
Reviewed-on: ashie/nixos-vps#5
2026-03-19 20:18:58 +00:00
9803eebb1d Merge branch 'main' into feat/headscale 2026-03-19 20:18:10 +00:00
96a86db323 Merge branch 'main' into fix/openclaw-network-isolation 2026-03-19 20:17:50 +00:00
ec5ba0f6e9 Merge pull request 'feat(nginx): add rate limiting with per-domain overrides' (#3) from franz-kafka/nixos-vps:feat/nginx-rate-limiting into main
Reviewed-on: ashie/nixos-vps#3
2026-03-19 20:17:21 +00:00
1c28db5f8e feat(headscale): add self-hosted Tailscale control server
New module: modules/headscale.nix
- Headscale service listening on localhost with Nginx reverse proxy
- SQLite database (appropriate for personal use)
- Tailscale public DERP relays for NAT traversal fallback
- MagicDNS enabled with Mullvad/Quad9 upstream resolvers
- Optional OIDC authentication (Google, GitHub, etc.)
- Default auth: pre-shared API keys (headscale apikeys create)
- Added to backup paths (SQLite DB)
- headscale CLI tool added to system packages

Configuration:
- Domain: vpn.ashisgreat.xyz
- OIDC disabled by default (documented how to enable in configuration.nix)

To register a device after deploying:
  sudo headscale apikeys create
  tailscale up --login-server=https://vpn.ashisgreat.xyz --authkey=<key>

DNS record needed: vpn.ashisgreat.xyz → VPS IP
2026-03-19 15:39:56 +00:00
9092d6ec58 fix(openclaw): remove --network=host, use bridge network
- Drops --network=host from OpenClaw container
- Container now runs on Podman's default bridge network
- Gateway port already mapped via ports config (127.0.0.1:18789:8080)
- Container retains outbound internet access for Discord API, model providers, etc.
- Cannot reach other host services (Forgejo, Vaultwarden, etc.) — principle of least privilege

Note: If OpenClaw needs to reach local services in the future, add explicit
extraOptions like --network=bridge or create a shared Podman network.
2026-03-19 15:09:05 +00:00
790501d290 feat(nginx): add rate limiting with per-domain overrides
- Global rate limit: 10 req/s with burst of 20
- Connection limit: 30 concurrent per IP
- Per-domain override support (requests, burst, enable/disable)
- SearXNG gets higher limits (20/40) to tolerate bot traffic
- Returns 429 when rate limited
2026-03-19 15:08:34 +00:00