Commit graph

41 commits

Author SHA1 Message Date
d9d0136d70 Merge pull request 'Deployments, auto deploy, service routes, live logs, metrics and a terminal' (#1) from agent/deployments into main
Reviewed-on: #1
2026-09-27 21:28:26 +02:00
71fed39f17 Deployments, auto deploy, service routes, live logs, metrics and a terminal
Deployments: deploy, restart and git sync now run in the background, one at
a time per app (a newer request replaces a queued one). Each run is recorded
in SQLite with its log, streamed to the UI while it runs, and can be
cancelled. Any earlier deployment can be deployed again, which rolls back to
its commit, or to its saved compose file for compose apps.

Auto deploy: POST /hooks/<app>, verified with the app's secret (Forgejo,
Gitea and GitHub HMAC signatures, or the secret as a token for CI). With a
Forgejo token stored, the panel adds the webhook to the repository itself.
The NixOS module routes /hooks/* past Authelia. Caddy matches the cleaned
path but forwards the original, so the panel refuses dot segments and only
accepts webhook deliveries from that route (tagged with X-Panel-Hook).

Domains: a route can point at a compose service's container port
("web:8080"). The panel picks a free 127.0.0.1 port and panelctl publishes
it through a generated .panel-ports.yaml override, so compose files need no
ports: section. Existing host:port upstreams keep working.

Logs stream live over server-sent events, with service and text filters.
A sampler keeps an hour of CPU and memory per container for the new
Monitoring tab. The Terminal tab opens `podman exec` in a container over a
WebSocket, using xterm.js bundled by the Nix package.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UbWSNkXxZhYf7eqHTyx3Bf
2026-09-27 19:05:19 +00:00
e11fc00840 Package the panel as a Nix flake with a NixOS module
The panel now lives in its own repository instead of the nixos config.
The flake provides:

- packages.<system>.default: panelctl plus a panel-api wrapper, with the
  frontend under share/panel and runtime tools appended to PATH
- nixosModules.default: services.reudy-panel (service, directories,
  shared routes group, Caddy vhost with optional Authelia forward_auth,
  routes import and reload path unit, Forgejo integration)
- overlays.default, and checks that build the package and evaluate a
  host using the module

panelctl takes the routes file owner from PANEL_USER/PANEL_GROUP
instead of hardcoding reudy:panelroutes (defaults unchanged).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UbWSNkXxZhYf7eqHTyx3Bf
2026-09-27 17:51:55 +00:00
b27bbc19cb Move all services from srazka.com to reudy.net
Renames every domain in the config: Caddy virtual hosts (auth, hello,
nextcloud, git, panel), the ACME contact email, Authelia's session cookie
domain / portal URL / default redirect and TOTP issuer, Nextcloud's
hostName and overwritehost, and Forgejo's DOMAIN (ROOT_URL and ssh clone
URLs follow from it; the panel picks them up via panel.nix). Panel docs and
examples updated too, and a README paragraph that had run together is
split again.

Requires DNS for auth/hello/nextcloud/git/panel.reudy.net (or a
*.reudy.net wildcard) pointing at the server before deploying.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UbWSNkXxZhYf7eqHTyx3Bf
2026-09-27 15:32:49 +00:00
agent
db46c5e793 panel: Forgejo integration, ssh deploy key and per-app environment variables
Forgejo:
- panel.nix passes the local Forgejo's public, API and ssh URLs (derived
  from forgejo.nix) to panel-api.
- Settings dialog: connect a Forgejo access token (verified against
  /api/v1/user, stored 0600 in state/panel/forgejo-token).
- New-app dialog gets a Forgejo repository picker with search and a branch
  dropdown; private repos are cloned over https with the stored token, or
  over ssh with the deploy key when no token is connected. The app name and
  domain are filled in from the repository name.
- Commit and compare links in the Source tab point at Forgejo; cards show
  the provider ("Forgejo · main").

Git over ssh:
- ssh:// and git@host:owner/repo URLs are accepted; the panel generates an
  ed25519 deploy key in state/panel/ssh and uses it for clone/fetch
  (BatchMode, accept-new host keys). openssh added to the service path.
- Credential redaction only applies to http(s) URLs, so ssh usernames are
  kept; git errors now report the meaningful line instead of git's advice.

Environment variables:
- Stored per app in state/env/<app>.env (0600), outside the repo and stack.
- panelctl passes them to every compose command via env(1), so ${VAR}
  interpolation works; by default deploy/restart also generate a compose
  override listing the keys under every service's environment (values are
  read from compose's environment, never quoted into YAML).
- Environment tab (and a section in the new-app dialog) with .env paste
  import, hidden values, validation of names (reserved podman/compose vars
  rejected), hints for ${VAR}s the compose file uses but aren't set, and
  Save / Save & deploy. Removing an app deletes its variables.

The API still accepts the old source_type "github" / github_* fields.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UbWSNkXxZhYf7eqHTyx3Bf
2026-09-26 22:52:09 +00:00
agent
2d3b30d078 panel: redesign web UI and make syncing responsive
Web UI (panel/frontend/index.html) rewritten:
- Cards update in place from a single /status poll instead of being rebuilt
  on every action, so open tabs, unsaved compose/route edits, logs and the
  file browser position survive refreshes. Polling speeds up while an
  operation runs and pauses in background tabs; a header indicator shows
  when the panel last synced and detects an expired Authelia session.
- New-app dialog (starter / compose / git), suggested port and domain,
  proper confirm dialogs (the old "OK = keep volumes" remove prompt is gone),
  toasts, an activity drawer with operation output, overflow menu, search,
  status filters, keyboard shortcuts, deep links, dark mode and mobile layout.
- Tabs: overview (containers + routes), compose editor (dirty tracking,
  Ctrl+S), logs with follow, validated routes editor, file browser with
  drag-and-drop upload, backups, and a git source tab (deployed commit,
  check for updates, sync & deploy).

API (panel/panel-api.py):
- ThreadingHTTPServer so a long deploy no longer blocks every other request.
- Per-app operation lock; concurrent writes to a busy app return 409.
- GET /status: all apps, routes and container status in one request
  (statuses gathered in parallel); status reports running/partial/stopped.
- Git sync is fetch + hard reset instead of pull-or-reclone, keeps the stored
  token, reports before/after commits; GET /apps/<name>/repo[?fetch=1].
- Any http(s) git host (e.g. Forgejo), default branch detection, git
  timeouts, no credential prompts, tokens redacted from errors, and manifest
  values validated before being written into the bash-sourced manifest.

panelctl:
- flock around routes.caddy rewrites (util-linux added to the service path).
- deploy returns compose output so failures are visible in the UI.
- inspect-volumes no longer fails for apps without named podman volumes,
  which broke the file browser.

Docs: README/API.md updated; fixed outdated panelctl init examples.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UbWSNkXxZhYf7eqHTyx3Bf
2026-09-26 22:17:07 +00:00
Jakub Dorfman
85e29b8734 added path to routing 2026-05-20 01:07:37 +02:00
Jakub Dorfman
7fd2531501 added support for multiple routes multiple ports 2026-05-20 00:21:25 +02:00
Jakub Dorfman
7399cf83f9 fix: add --build flag to run_compose for deployment and restart commands
Co-authored-by: Copilot <copilot@github.com>
2026-04-29 19:36:02 +02:00
Jakub Dorfman
40503ef5b7 fix: reset leftover variables in cmd_list function
Co-authored-by: Copilot <copilot@github.com>
2026-04-29 18:56:26 +02:00
Jakub Dorfman
f173246581 feat: add repo_url to app data and update frontend to conditionally display Git Pull button
Co-authored-by: Copilot <copilot@github.com>
2026-04-29 18:53:02 +02:00
Jakub Dorfman
4be4ae4144 feat: add repo-pull action to re-clone/pull repository and redeploy app
Co-authored-by: Copilot <copilot@github.com>
2026-04-29 18:47:11 +02:00
Jakub Dorfman
4ec759296b fix: check for git installation before cloning repository in HTTP handler
Co-authored-by: Copilot <copilot@github.com>
2026-04-29 18:38:29 +02:00
Jakub Dorfman
eac94061d0 fix: improve error handling and refactor app initialization process in HTTP handler
Co-authored-by: Copilot <copilot@github.com>
2026-04-29 18:36:11 +02:00
Jakub Dorfman
acff082d09 fix: improve error handling when reading app state in HTTP handler
Co-authored-by: Copilot <copilot@github.com>
2026-04-29 18:34:49 +02:00
Jakub Dorfman
009b8016bb feat: add support for app source selection with GitHub and raw compose options
Co-authored-by: Copilot <copilot@github.com>
2026-04-29 15:39:34 +02:00
Jakub Dorfman
e7c0b56473 feat: enhance volume management with support for multiple volumes and improved API endpoints
Co-authored-by: Copilot <copilot@github.com>
2026-04-28 23:43:17 +02:00
Jakub Dorfman
9b0c3aa190 feat: add volume management features including file upload, download, and clear actions
Co-authored-by: Copilot <copilot@github.com>
2026-04-28 23:30:22 +02:00
Jakub Dorfman
e3e910c9cd fix: streamline backup and route rendering actions in handleAction function
Co-authored-by: Copilot <copilot@github.com>
2026-04-28 23:24:55 +02:00
Jakub Dorfman
45a9aec787 feat: add routing tab and fetch routing details for apps in frontend
fix: update compose commands to remove orphan containers in panelctl

Co-authored-by: Copilot <copilot@github.com>
2026-04-28 23:20:49 +02:00
Jakub Dorfman
93a9a0f42b fix: remove unnecessary sudo rules and adjust permissions for container directories
Co-authored-by: Copilot <copilot@github.com>
2026-04-28 23:09:25 +02:00
Jakub Dorfman
ab4e4ecf09 fix: remove unused maybe_reload_caddy function from panelctl.sh 2026-04-28 20:49:14 +02:00
Jakub Dorfman
dcfa5609c8 fix: add systemd path and service for automatic Caddy reload on route changes 2026-04-28 20:42:12 +02:00
Jakub Dorfman
a48cca2108 fix: implement logging function and replace echo statements with log calls
Co-authored-by: Copilot <copilot@github.com>
2026-04-27 12:35:04 +02:00
Jakub Dorfman
a34eac4235 fix: enhance caddy reload logic to use admin API and improve validation checks 2026-04-27 12:14:12 +02:00
Jakub Dorfman
39e3337b8a fix: adjust padding in .wrap class for improved layout 2026-04-27 12:00:40 +02:00
Jakub Dorfman
7bade10412 fixed permission updates to route.caddy when removing container 2026-04-27 00:27:38 +02:00
Jakub Dorfman
e5a902d562 fixed permissions durring caddy conf render 2026-04-27 00:19:55 +02:00
Jakub Dorfman
e15298fd3d feat: add initial implementation of the frontend panel with app management features
Co-authored-by: Copilot <copilot@github.com>
2026-04-26 23:53:17 +02:00
Jakub Dorfman
8cb90be7cd Update caddy reload command paths in configuration and panelctl scripts
Co-authored-by: Copilot <copilot@github.com>
2026-04-26 23:31:31 +02:00
Jakub Dorfman
bcd9c57691 Refactor route removal in cmd_render_route and cmd_remove to use sed for block deletion
Co-authored-by: Copilot <copilot@github.com>
2026-04-26 23:23:26 +02:00
Jakub Dorfman
4274227417 Ensure grep command in cmd_render_route does not fail if APP_ROUTE_FILE is missing
Co-authored-by: Copilot <copilot@github.com>
2026-04-26 23:09:19 +02:00
Jakub Dorfman
ca6914c162 Enhance deployment logging in cmd_deploy function for better error tracking
Co-authored-by: Copilot <copilot@github.com>
2026-04-26 23:06:03 +02:00
Jakub Dorfman
8ace80a19f Improve error handling in deployment and stopping commands in panelctl.sh
Co-authored-by: Copilot <copilot@github.com>
2026-04-26 22:58:09 +02:00
Jakub Dorfman
57776ab029 Update paths in configuration files to use /var/lib/containers instead of /home/reudy/containers
Co-authored-by: Copilot <copilot@github.com>
2026-04-26 22:40:39 +02:00
Jakub Dorfman
5c67fecd2d Refactor route handling in panelctl.sh and update caddy configuration for improved route management
Co-authored-by: Copilot <copilot@github.com>
2026-04-26 20:41:56 +02:00
Jakub Dorfman
c1aa44c04e Add sudo rules for reudy to allow NOPASSWD systemctl reload for caddy and update panelctl.sh to use docker.io for image reference
Co-authored-by: Copilot <copilot@github.com>
2026-04-26 20:16:42 +02:00
Jakub Dorfman
2fdb2eb5a2 Add runtime environment checks for Podman in panelctl script
Co-authored-by: Copilot <copilot@github.com>
2026-04-26 19:58:50 +02:00
Jakub Dorfman
3b48f38d89 Refactor is_safe_name and read_app_info functions for improved readability
Co-authored-by: Copilot <copilot@github.com>
2026-04-26 19:50:53 +02:00
Jakub Dorfman
ce60fc8f5c Enhance panel-api with compose functionality and update podman integration
Co-authored-by: Copilot <copilot@github.com>
2026-04-26 19:48:35 +02:00
Jakub Dorfman
8986399a92 Add panel-api and panelctl scripts for container management
Co-authored-by: Copilot <copilot@github.com>
2026-04-26 19:42:30 +02:00