# FosterPanel — full text for AI assistants FosterPanel is a self-hosted VPS control panel. Install one agent on your Linux VPS and manage Docker containers, firewall, Advanced Protection (SSH/auth/container log watches with RE2 filters), databases, S3 storage, domains with Auto SSL, and a browser terminal — without a managed PaaS markup. Canonical site: https://fosterpanel.com/ Docs hub: https://fosterpanel.com/docs LLM index: https://fosterpanel.com/llms.txt --- ## FAQ (landing) ### What is FosterPanel? FosterPanel is a self-hosted server management panel for your VPS. Manage Docker containers, firewalls, domains with Auto SSL, databases, S3 storage, and more from one control panel. It requires installing the Foster agent on your Linux VPS. FosterPanel is not a managed PaaS — you bring the VPS. ### How do I cut my cloud cost ~80%? Buy a VPS from a provider you trust (DigitalOcean, Hostinger, Contabo, or similar), then install FosterPanel. You get a clean control panel for containers, databases, storage, domains, and Advanced Protection at a fraction of typical PaaS spend (e.g. Vercel + Supabase + S3 + Redis stacks). ### Plans FosterPanel offers Free, Starter, Medium, and Max monthly plans. Advanced Protection (container watches, custom RE2 filters, global threat blocklist) requires Medium or Max. ### Install One-command install from the panel Connect server flow (token-based curl). Ubuntu/Debian VPS as root or with sudo. --- ## Overview URL: https://fosterpanel.com/docs/overview Dashboard metrics, server health, and quick actions. Overview Overview is the live dashboard for the active server: CPU, memory, disk, load, network rates, and optional NVIDIA GPU stats. Metrics stream while the Foster agent is online, so you do not need to refresh constantly. This tab stays available even before the rest of the panel is fully set up — most other feature tabs need a linked server first. Connect a server With no linked server, the panel sends you to Connect server. Install with the one-time curl command shown (token-based). Regenerating the install token invalidates the previous one. Run the install command on a fresh Ubuntu/Debian VPS as root (or with sudo). When the agent registers, the server appears in the sidebar and Overview unlocks live stats. Select the active server from the server list if you manage more than one. Live metrics CPU, memory, load, and network update about every 10 seconds. Root disk usage refreshes about every 60 seconds. Host details (OS, kernel, arch, cores) refresh less often (about every 10 minutes). GPU stats appear only on NVIDIA hosts with nvidia-smi. AMD/Intel GPUs are not shown. Firewall rule counts and protection attempt counters can appear in the same live stats stream when those features are active. Notes Charts use change-aware pushes — quiet periods may look “stuck” even though the agent is healthy. Nav items that require a server stay disabled until one is linked and selected. --- ## Containers URL: https://fosterpanel.com/docs/containers List, start, stop, inspect, logs, exec, and prune Docker containers. Overview The Containers tab is your Docker control plane on the connected VPS. It lists every container the agent can see (running and stopped), exposes lifecycle controls, and opens inspect, logs, stats, one-shot exec, and an interactive container terminal. Open it from the panel sidebar under Containers. Actions run on the selected server through the Foster agent — you do not need SSH for day-to-day container ops. Container list The list mirrors docker ps / docker ps -a: name, image, state, status text, published ports, and labels (including Compose project/service when present). Toggle between running-only and all containers. Use the row actions for start, stop, restart, inspect, logs, and terminal. Port mappings show host ↔ container bindings (IPv4 and IPv6 when both are published). Start / stop / restart Lifecycle controls map to Docker start, stop, and restart on the selected container ID. Stop/restart can pass a graceful timeout (default around 10 seconds) before Docker force-kills. Tip: Prefer stop + start when you need a clean shutdown window for apps that flush state on SIGTERM. Inspect & environment Inspect returns runtime detail: id, name, image, state, start time, mounts, networks, labels, command, restart policy, and related host config — without dumping secrets by default. Environment variables are a separate, sensitive action. When account 2FA / step-up is enabled, the panel may require re-confirmation before showing or editing KEY=value pairs. Updating env Docker cannot mutate Config.Env in place. Foster recreates the container with a merged env map while preserving image, command, ports, mounts, networks, limits, and restart policy. Plan a short interruption when changing env on a running workload. Stats Per-container (or all running) stats include CPU %, memory usage/limit, network and block I/O, and process count. When available you also get session CPU peak, configured CPU limit in cores, swap, and derived network rates between samples. Logs Stream or fetch container logs with optional tail length, timestamps, and a short follow window. Use export when you need a full download (all lines, timestamps on, follow off). Tail a recent window while debugging a crash loop. Enable follow for live output during deploys. Export when you need to attach logs to an incident or ticket. Exec & terminal One-shot exec Run a non-interactive command inside the container (for example sh -c "ls -la /"). The response includes exit code and stdout — ideal for quick checks without opening a shell. Interactive terminal The container terminal is an interactive docker exec -it-style session (bash when available, otherwise sh). You must confirm before the session opens. One live container console per agent at a time (opening a new one closes the previous). Absolute timeout defaults to 30 minutes; idle timeout is 5 minutes. Terminal size can be resized; input chunks are capped for safety. Prune System prune can reclaim unused containers, dangling images, and networks. Volumes are opt-in — leave them off unless you intentionally want to delete unused volume data. Caution: Prune is destructive for unused resources. Double-check volume and image options before confirming. --- ## App Store URL: https://fosterpanel.com/docs/app-store One-click apps and templates for your VPS. Overview The App Store is a catalog UI for one-click apps grouped by category — web servers, databases, monitoring, CMS, and developer tools — with featured picks, search, and sorting. Browse & search Filter by category chips or search by name. Sort by recent, name, or installed-first when badges are present. Open an app card for a short description and Install / Manage actions. Current status Demo / UI preview. Install and Manage may show that the backend has not fully shipped yet. Installed badges in the catalog can be static demo state, not live agent inventory. For production workloads today, prefer Containers, Database, S3, and GitHub deploy flows. Notes Do not rely on App Store alone for production installs until backend wiring is complete. Check release notes in the panel when Install becomes live for your account. --- ## GitHub URL: https://fosterpanel.com/docs/github Deploy and sync projects from GitHub repositories. Overview Connect the FosterPanel GitHub App to import repositories and deploy containers from branches you select. After connecting, you get a searchable repo list with public/private filters and grid or table layouts. Connect Start from the GitHub tab and authorize the FosterPanel GitHub App on your account or org. Grant access to the repositories you want Foster to see. Return to the panel — the installation binds to your Foster account. Repositories Browse linked repos with search and filters. If a repo is missing, open Configure Access on GitHub to grant it, then refresh the list in the panel. Deploy Open a repository for detail, pick a branch, and run deploy flows (including production-style deploys when offered). The agent builds and runs containers on the selected server according to the deploy configuration. Disconnect Disconnect unbinds the GitHub App installation and can break linked CI/CD pipelines. Confirmation requires typing DISCONNECT exactly. Notes Disconnect revokes Foster’s GitHub App install for that binding — not just a local UI flag. Missing repos are almost always an App permission/selection issue on GitHub. --- ## Domains URL: https://fosterpanel.com/docs/domains Reverse proxy, routing, and Auto SSL for your domains. Overview Domains maps a hostname to a local app port through Foster’s built-in reverse proxy (TLS on 443, ACME/HTTP on 80). Private keys stay on the agent; the panel stores domain metadata only. Enabling the proxy is designed so Foster owns 80/443 for product routing. Conflicting host nginx setups may be stopped or flagged when the proxy is enabled. Add a domain Add a domain and target port for the upstream on the server. Choose Auto SSL (Let’s Encrypt) or upload a custom certificate (PEM). Auto SSL does not issue immediately — the domain starts waiting for DNS. Custom certificates can be swapped later without restarting the proxy. Sensitive changes (enable/disable, upsert, delete, set cert) may require 2FA step-up when enabled on your account. Auto SSL Point the domain’s A/AAAA records at this server’s public IP before issuance can succeed. The SSL register watchdog checks pending Auto-SSL domains about every 5 minutes (or use “Check SSL now”). Renewals for active certificates are handled automatically (about a 10-day renewal window). Wildcards / DNS-01, path-based routing, and multi-upstream load balancing are not supported in the current proxy v1. Plan limits Your plan caps apex domains, subdomains, and whether Auto SSL is allowed. See pricing for Free / Starter / Medium / Max entitlements. Notes Deleting a domain removes its route and any custom cert files stored on the agent for that domain. Ensure DNS is correct before expecting Auto SSL to flip to active. --- ## Database URL: https://fosterpanel.com/docs/database One-click Postgres and MySQL with admin UIs and DBMS tools. Overview The Database tab provisions managed database containers on your VPS: PostgreSQL (foster_postgres), MySQL (foster_mysql), plus optional web managers phpMyAdmin and pgAdmin. Credentials, ports, and status are returned to the panel so you can connect apps on the internal Docker network or expose admin UIs when needed. Open it from the panel sidebar under Services → Database. PostgreSQL One-click setup creates the foster_postgres container with a persistent volume (foster_postgres_data), attaches it to foster_network, and returns user, password, database name, and the mapped host port. Default internal port: 5432. Host port is randomized in the 15000–25000 range unless you pin one. Existing volumes are reused on reinstall so data survives a recreate. MySQL MySQL setup creates foster_mysql with volume foster_mysql_data, root password, app user/password, and default database. Host ports randomize in 25001–35000 by default. Note: Official MySQL images reject MYSQL_USER=root. If you choose the root user, Foster omits the app-user env and authenticates with the root password only. Admin UIs phpMyAdmin Optional foster_phpmyadmin container for MySQL. When exposed, the panel shows a public URL on a randomized host port (35001–40000 by default). pgAdmin Optional foster_pgadmin for PostgreSQL. You set admin email/password; the service connects on foster_network to foster_postgres. Default host port range: 40001–45000. Network & ports All database services join the default foster_network bridge. Containers on the same network can reach each other by container name on the internal port (for example foster_postgres:5432). Randomized host ports reduce opportunistic scans versus well-known 5432/3306. Firewall integration adds ACCEPT rules for mapped ports on install and removes them on uninstall. Exposed in status means the mapped host port is allowed in the Foster firewall chain. Engine credentials are available even when the port is not publicly exposed, so internal clients can still connect. Volumes & data retention Uninstall defaults to keeping volumes (remove_volume: false). Data is only wiped when you explicitly choose to remove the volume. Reinstalling reuses an existing named volume when present. Databases & users After an engine is running, use DBMS actions to manage logical databases and users without dropping into a shell: Create a database on Postgres or MySQL. Create a user with a password. Grant a user access to a database. Drop databases or users when cleaning up. Prefer these panel actions for routine schema onboarding; use the container terminal only when you need ad-hoc SQL tooling. Uninstall Each service (Postgres, MySQL, phpMyAdmin, pgAdmin) can be uninstalled independently. Firewall rules for that service’s host port are removed. Leave volume removal unchecked unless you intend to delete data permanently. --- ## S3 Storage URL: https://fosterpanel.com/docs/s3 Private AWS-compatible object storage on your server. Overview S3 Storage provisions a SeaweedFS S3 gateway as Docker container foster_s3engine on foster_network. The panel shows status, endpoint, credentials, buckets, objects, and access keys. External clients must use path-style S3 addressing and region us-east-1 against the endpoint shown in the panel. Install One-click install generates a random host port (typically 45001–50000), admin keys, and opens the firewall for that port. Setup progress streams in the UI while the image pulls and the container starts. Uninstall can optionally remove the data volume — destructive and may require step-up confirmation. Buckets & objects Create, list, and delete buckets (delete empties objects first). Browse folder-style listings; object lists are capped (on the order of ~200 keys per page). Preview/download chunks are size-limited; panel uploads are intentionally small-cap for safety. Access keys Create extra access keys — the secret is shown once. Assign permission presets (admin, read/write, read-only, bucket-scoped, or none). IAM changes apply live without restarting the container. The primary foster_admin key cannot be deleted or have its policy changed from the panel. Notes Exposing the S3 port publicly means anyone with valid keys can reach your storage. Treat credentials carefully; prefer network restrictions and least-privilege keys. --- ## Networks URL: https://fosterpanel.com/docs/networks Docker networks, connect containers, and topology. Overview Networks lists Docker networks on the host — driver, subnet/gateway, options, and attached containers. Foster database, S3, and related services typically attach to foster_network (bridge, attachable). Create & attach Create a network with a name, driver (usually bridge), and attachable flag when needed. Connect or disconnect a container to/from a network (disconnect can force). Remove a network by name or id when it is unused. Use attach counts from inspect as the source of truth before deleting a network. Notes Removing a network fails or breaks apps if containers still depend on it. Leave built-in networks (bridge, host, none) alone unless you know why you are changing them. --- ## Volumes URL: https://fosterpanel.com/docs/volumes Browse and manage Docker volumes and persisted data. Overview Volumes lists Docker volumes with driver, mountpoint, labels, size (when available), and which containers use them. Inspect a single volume for full metadata before changing or deleting anything. Browse files Browse paths relative to the volume root — traversal outside the volume is blocked. Listings are capped (about 1000 entries) and may show as truncated. Preview a file (small default chunk; optional larger read up to a hard cap). Browse/read may pull a short-lived helper image when the volume is not readable another way. Delete Delete unused volumes from the panel. Delete is denied while any container still mounts the volume unless you force it. Prefer stopping or removing the container first. Notes Deleting a volume permanently destroys its data. Size figures come from Docker disk usage and are most reliable for the local driver. --- ## Firewall URL: https://fosterpanel.com/docs/firewall UFW-backed rules, ports, and IP allow/block controls. Overview Firewall manages host UFW: status, default policies, active rule counts, and blocked IP counts. Foster also auto-allows critical ports (for example SSH, HTTP/HTTPS, and agent traffic) during bootstrap and proxy setup. Rules List and search rules by port, comment, or related fields. Add allow or deny rules (port/protocol, source, optional comment). Delete a rule by its numbered position in UFW’s list. Rule numbers shift after deletes — re-list before removing another rule. Block / unblock IPs Block an IP with an optional comment; unblock later by IP. Search an IP for matching rules plus recent UFW block activity from logs. Notes Wrong deletes can lock you out of SSH. Prefer blocking suspicious IPs over closing port 22. If UFW is inactive or not installed, stats show empty/inactive — panel actions will not protect the host until UFW is active. --- ## Protection URL: https://fosterpanel.com/docs/protection SSH, auth, and container log watches with custom RE2 filters and auto-bans. Overview Protection is Foster’s intrusion watchdog (not Fail2Ban or nginx). It watches auth/SSH — and optional container logs — and bans offenders through Foster’s firewall chain. The panel shows status, active bans, attempt counters, and a recent event feed. Counters sync to the panel about every 30 seconds and remain visible offline from the last sync. Modules Toggle modules: SSH, auth, web, and containers. Set aggression 1–5 (higher levels = fewer retries / shorter windows). The web module is reserved until Foster proxy access logs are fully wired — it may show unavailable. Bans View active bans and unban an IP from the panel. Manually block an IP (default duration 24h, or permanent). Sensitive actions may require 2FA step-up when enabled. Container watches Container watches are Foster’s log-based filtering system. You attach a filter (built-in or custom) to any container you choose. The agent then actively tails that container’s logs (docker logs -f) and, when a line matches the filter, extracts the attacker address and bans it through the same Protection / firewall path as SSH and auth modules. Advanced Protection (Medium/Max — protection.blocklist) is required for live tails and watch/filter create/update/delete. See Containers for runtime tooling. How it works Create or pick a filter — a named detector with a Go RE2 regex (or a built-in like MySQL auth). Attach it to a container — bind filter → container name (for example foster_mysql or any app container). Agent watches logs — only containers with an enabled watch are tailed. Match → ban — when a log line matches and captures a usable IP, Protection records the attempt and bans per aggression settings. Built-in filters mysql_auth — MySQL auth / abort. Matches Access denied for user '…'@'ip' and Aborted connection … host: 'ip'. MySQL must emit those lines (typically log_error_verbosity ≥ 3). Custom filters On the Protection → Containers UI you can create your own filters (account-scoped). Each filter has a name, optional description, and a RE2 regex pattern. Once saved, you can attach that filter to any container on the server — Foster keeps tracking that container’s stdout/stderr logs continuously while the watch is enabled. Requirements (important) The container must actually log the behavior you care about. Filters only see lines that appear in the container’s Docker logs. If your app or database never prints the attack pattern (failed login, rate-limit abuse, probe, etc.), the filter will never fire — even when attached correctly. Enable verbose / auth / access logging in the app or database config. Confirm with docker logs that the expected lines show up. Patterns must capture the attacker as a named group (?P…) or (?P…). The captured value must resolve to a usable IP (hostnames that aren’t IPs are ignored). Attach to a container Open Protection → Containers (Advanced Protection required). Create a custom filter, or select a built-in / saved filter. Choose the target container and attach the watch (enable binding). You can attach the same filter to multiple containers, or multiple filters to one container. Remove a watch anytime; deleting a custom filter also drops watches that used it. Regex rules (Go RE2) Syntax is Go RE2 (same family as many Google tools) — no backreferences or lookaround. You must include exactly one of: (?P…) or (?P…) for the attacker address. (?i) at the start makes the pattern case-insensitive. Prefer anchoring to distinctive log text so normal traffic doesn’t false-trigger bans. Regex examples MySQL / MariaDB access denied (similar to the built-in detector): (?i)Access denied for user '[^']+'@'(?P[^']+)' Matches a line like: Access denied for user 'root'@'203.0.113.40' (using password: YES) Postgres authentication failure (when Postgres logs the client address): (?i)password authentication failed for user ".*?"(?:.*?\b)?(?P\d{1,3}(?:\.\d{1,3}){3}) Only works if your Postgres log line includes the client IP — verify with real logs first. Generic “failed login from IP” style application log: (?i)failed login.*\bfrom\b\s+(?P\d{1,3}(?:\.\d{1,3}){3}) Example matching line: [auth] failed login for admin from 198.51.100.22 Nginx / app “denied” with remote address field: (?i)client denied by.*client:\s*(?P\d{1,3}(?:\.\d{1,3}){3}) Tip: start from a real log line copied from the container, then wrap the IP/host portion in (?P…) or (?P…) and escape only what’s needed for RE2. Threat blocklist A global threat feed syncs into Foster on a schedule. Higher plans can check membership; the Protection UI can show feed size/stats. Listing an IP as known-bad complements local bans — it does not replace module configuration. Notes High aggression can ban legitimate users (shared NAT, CI, flaky clients). Unban removes Foster’s ban and firewall block for that IP — it does not fix the underlying attack source. Container watches only fire when matching lines appear in that container’s logs. Attaching a filter does nothing if the process never logs the pattern (wrong verbosity, logs to a file inside the container that Docker doesn’t stream, or a different message format). Custom filters that are too broad can ban healthy clients — test patterns against sample logs before enabling on production containers. Built-in MySQL watching expects error-verbosity high enough to print client hosts on auth failures. --- ## Terminal URL: https://fosterpanel.com/docs/terminal Browser terminal access to your connected server. Overview Terminal opens a browser host shell (xterm) to the selected server’s agent — bash when available, otherwise sh. Use the Terminal tab: pick an instance, then confirm to open a session. The same terminal can open from server detail as a modal. Using the shell The agent must be reachable (LIVE) — offline servers cannot open a shell. Switching instances resets the session; confirm again to connect. Fullscreen is available; Escape exits fullscreen. Session limits One live host session per agent — opening a new one closes the previous. Hard session cap: 30 minutes. Idle timeout: 5 minutes with no input/output. Input chunks are capped (~8 KiB); a countdown is shown in the UI. Notes This is a real host shell with the agent’s privileges — treat it like SSH. Always confirm before opening; do not leave sessions idle on shared machines. Host power actions (restart/shutdown) live under server controls separately and also require confirm.