{"id":13998455,"url":"https://github.com/stefanwerfling/flyingfish","last_synced_at":"2026-04-04T20:29:38.856Z","repository":{"id":37490712,"uuid":"467502149","full_name":"stefanwerfling/flyingfish","owner":"stefanwerfling","description":"FlyingFish is a reverse proxy manager with own WebUI, DNS server, SSH server, DynDNS, UPNP support, Lets Encrypt and much more.","archived":false,"fork":false,"pushed_at":"2025-09-12T08:43:48.000Z","size":15271,"stargazers_count":61,"open_issues_count":33,"forks_count":9,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-09-12T10:29:26.204Z","etag":null,"topics":["dns","dns-server","docker","domain","dyndns","express","https","letsencrypt","nginx","nginx-configuration","nginx-proxy","nodejs","reserv","reverse-proxy","router","ssh-server","stream","upnp-portmapper"],"latest_commit_sha":null,"homepage":"https://flying-fish.gitbook.io/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stefanwerfling.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":["stefanwerfling"],"custom":["https://www.buymeacoffee.com/stefanwerfling","https://liberapay.com/StefanWerf/"]}},"created_at":"2022-03-08T12:26:34.000Z","updated_at":"2025-09-12T08:43:52.000Z","dependencies_parsed_at":"2023-10-18T00:33:47.202Z","dependency_job_id":"98755636-4767-4588-b2b0-fb9beefbbc3e","html_url":"https://github.com/stefanwerfling/flyingfish","commit_stats":null,"previous_names":[],"tags_count":41,"template":false,"template_full_name":null,"purl":"pkg:github/stefanwerfling/flyingfish","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stefanwerfling%2Fflyingfish","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stefanwerfling%2Fflyingfish/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stefanwerfling%2Fflyingfish/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stefanwerfling%2Fflyingfish/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stefanwerfling","download_url":"https://codeload.github.com/stefanwerfling/flyingfish/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stefanwerfling%2Fflyingfish/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31413234,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T20:09:54.854Z","status":"ssl_error","status_checked_at":"2026-04-04T20:09:44.350Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dns","dns-server","docker","domain","dyndns","express","https","letsencrypt","nginx","nginx-configuration","nginx-proxy","nodejs","reserv","reverse-proxy","router","ssh-server","stream","upnp-portmapper"],"created_at":"2024-08-09T19:01:41.266Z","updated_at":"2026-04-04T20:29:38.817Z","avatar_url":"https://github.com/stefanwerfling.png","language":"TypeScript","funding_links":["https://github.com/sponsors/stefanwerfling","https://www.buymeacoffee.com/stefanwerfling","https://liberapay.com/StefanWerf/","https://liberapay.com/StefanWerf/donate"],"categories":["TypeScript"],"sub_categories":[],"readme":"# Flyingfish\n\n\u003cp align=\"center\"\u003e\n  \u003cimg height=\"200\" src=\"doc/images/logo.png\"\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n[![FlyingFish](https://img.shields.io/badge/FlyingFish-v1.1.12-blue?style=for-the-badge)](https://github.com/stefanwerfling/flyingfish)\n[![Discord](https://img.shields.io/discord/1347133593578766369?style=for-the-badge\u0026label=Discord\u0026color=5865F2\u0026link=https%3A%2F%2Fdiscord.gg%2F52PQ2mbWQD)](https://discord.gg/52PQ2mbWQD)\n![Docker Pulls](https://img.shields.io/docker/pulls/stefanwerfling/flyingfish?style=for-the-badge)\n[![License: GPL v3.0](https://img.shields.io/badge/License-GPL%20v3-blue?style=for-the-badge)](https://www.gnu.org/licenses/gpl-3.0)\n![Issues](https://img.shields.io/github/issues/stefanwerfling/flyingfish?style=for-the-badge)\n![Forks](https://img.shields.io/github/forks/stefanwerfling/flyingfish?style=for-the-badge)\n![Stars](https://img.shields.io/github/stars/stefanwerfling/flyingfish?style=for-the-badge)\n[![Liberapay](https://img.shields.io/liberapay/patrons/StefanWerf.svg?logo=liberapay\u0026style=for-the-badge)](https://liberapay.com/StefanWerf/donate)\n[![License: GPL v3.0](https://img.shields.io/badge/License-GPL%20v3-blue?style=for-the-badge)](https://www.gnu.org/licenses/gpl-3.0)\n\n\u003cbr\u003e\n\n[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6347/badge)](https://bestpractices.coreinfrastructure.org/projects/6347)\n[![FOSSA Status](https://app.fossa.com/api/projects/custom%2B50964%2Fgithub.com%2Fstefanwerfling%2Fflyingfish.svg?type=shield\u0026issueType=security)](https://app.fossa.com/projects/custom%2B50964%2Fgithub.com%2Fstefanwerfling%2Fflyingfish?ref=badge_shield\u0026issueType=security)\n[![FOSSA Status](https://app.fossa.com/api/projects/custom%2B50964%2Fgithub.com%2Fstefanwerfling%2Fflyingfish.svg?type=shield\u0026issueType=license)](https://app.fossa.com/projects/custom%2B50964%2Fgithub.com%2Fstefanwerfling%2Fflyingfish?ref=badge_shield\u0026issueType=license)\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/stefanwerfling/flyingfish)\n\u003cbr\u003e\n\n\n\nFlyingFish is a reverse proxy manager with own WebUI, DNS server, SSH server, DynDNS, UPNP support, Lets Encrypt and much more.\n\n## Make your services available easily, quickly and securely.\n\nIn the classic sense, FlyingFish is a nginx manager. But the way the nginx server is combined with other services is different! The FlyingFish is structured in part service, which automates many processes through an internal database or API communication.\n\n[Read the Documentation](https://flying-fish.gitbook.io/)\n\n## Quick setup\n[Read the Documentation quick setup](https://flying-fish.gitbook.io/flyingfish/index/installation#quick-setup)\n\n## Release\n\n- [Version 1.1.0](https://github.com/stefanwerfling/flyingfish/milestone/1)\n\n## Current work\nWith the milestone version [1.1.0](https://github.com/stefanwerfling/flyingfish/milestone/1) and now [1.2.0](https://github.com/stefanwerfling/flyingfish/milestone/2) the abstraction and division will now be revised. The implementation of plugins and new functions now requires a review of the existing code. This involves a lot of changes to code management and the package.\n\n### Why does it take so long for a version to come out?\nThere are currently several reasons for this:\n- Replacing existing packages with new ones requires code conversion and a lot of testing.\n- When replacing the binaries (e.g. new nginx version) I have to test that it is compiled with the extensions and functionality tests. (For example, there was an error in nginx_njs that I had to report as an ISSUE and then reproduce in collaboration with the developer).\n- Changes to Docker and Containers, which again requires testing. (extensions and tests)\n- Code refactoring, replacing code, switching to a new structure. Ironing out weird spots.\n- I have started to write sub packages or other supports (because they are incomplete, no longer supported, errors have crept in)\n  - [Bambooo](https://github.com/stefanwerfling/bambooo) - My frontend framework (for AdminLTE), which always gets updates.\n  - [VTS](https://github.com/stefanwerfling/vts/) - Data type validation library\n  - [ETS](https://github.com/stefanwerfling/ets) - Error formatter fully written in Typescript.\n  - [node-dns](https://github.com/stefanwerfling/node-dns/tree/ts) - Rewriting in Typescript, got no answer to my ISSUE\n  - [node-forge-types](https://github.com/stefanwerfling/node-forge-types) - Correction of the *.d classes for certificate analysis and generation\n  - [node-tuntap2](https://github.com/stefanwerfling/node-tuntap2) - TunTap API for VPN Service \n  - [node-rohc](https://github.com/stefanwerfling/node-rohc) - Scheduled for VPN Service\n    - [rohc](https://github.com/stefanwerfling/rohc) - Update (fix read write proc entry in kernel versions)\n- many more ....\n\n## In progress\n\n- [Version 1.2.0](https://github.com/stefanwerfling/flyingfish/milestone/2)\n- [Version 1.3.0](https://github.com/stefanwerfling/flyingfish/milestone/3)\n- [Version 1.4.0](https://github.com/stefanwerfling/flyingfish/milestone/4)\n\n## Docker Hub\n\n\nI utilize the docker manifest for multi-platform awareness.\nSimply getting \"stefanwerfling/flyingfish:latest\" should get the correct image for your arch.\nHowever, you can also get specific Arch images via tags.\n\nThe architectures supported by this image are:\n\n| Architecture | Available | Tag |\n| :----: | :----: | ---- |\n| x86-64 | ✅ | amd64-\\\u003cversion tag\\\u003e |\n| arm64 | ✅ | arm64v8-\\\u003cversion tag\\\u003e |\n\nOther platforms cannot be created as an image, because the restriction comes from the node docker image, but also because \"certbot with pip\" only supports amd64 and arm64 installation.\n\nBut it's better you run the installation with the instructions in Docker-Compose. Because FlyingFish consists of multiple images \u0026 containers.\n\n[FlyingFish on hub.docker.com](https://hub.docker.com/r/stefanwerfling/flyingfish)\n\n### Docker images (latest)\n* stefanwerfling/flyingfish:latest\n* stefanwerfling/flyingfish:v1.1.12\n* stefanwerfling/flyingfish_ssh:latest\n* stefanwerfling/flyingfish_ssh:v1.1.12\n* stefanwerfling/flyingfish_himip:latest\n* stefanwerfling/flyingfish_himip:v1.1.12\n* stefanwerfling/flyingfish_ddns:latest\n* stefanwerfling/flyingfish_ddns:v1.1.12\n\n#### Screenshots\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e \n            \u003cimg src=\"doc/screenshots/login.png\" alt=\"Login page\" width=\"360px\" /\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\t\t\t\u003cimg src=\"doc/screenshots/updates/dashboard_v1.0.21.png\" alt=\"Dashboard\" width=\"360px\" /\u003e\u0026nbsp;\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n\t\t\t\u003cimg src=\"doc/screenshots/listens.png\" alt=\"Listen list\" width=\"360px\" /\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n            \u003cimg src=\"doc/screenshots/listens_edit.png\" alt=\"Listen edit\" width=\"360px\" /\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e\n\t\t\t\u003cimg src=\"doc/screenshots/ip_access.png\" alt=\"IP access blacklist\" width=\"360px\" /\u003e\n\t\t\u003c/td\u003e\n\t\t\u003ctd\u003e\n\t\t\t\u003cimg src=\"doc/screenshots/gateway.png\" alt=\"Gatewaylist\" width=\"360px\" /\u003e\n\t\t\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e\n\t\t\t\u003cimg src=\"doc/screenshots/upnp-nat.png\" alt=\"Upnpnat list\" width=\"360px\" /\u003e\n\t\t\u003c/td\u003e\n\t\t\u003ctd\u003e\n\t\t\t\u003cimg src=\"doc/screenshots/upnp-nat_edit.png\" alt=\"Upnpnat edit\" width=\"360px\" /\u003e\n\t\t\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e\n\t\t\t\u003cimg src=\"doc/screenshots/domains.png\" alt=\"Domain list\" width=\"360px\" /\u003e\n\t\t\u003c/td\u003e\n\t\t\u003ctd\u003e\n\t\t\t\u003cimg src=\"doc/screenshots/domains_record.png\" alt=\"Domain record edit\" width=\"360px\" /\u003e\n\t\t\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e\n\t\t\t\u003cimg src=\"doc/screenshots/dyndns_client.png\" alt=\"DynDns client list\" width=\"360px\" /\u003e\n\t\t\u003c/td\u003e\n\t\t\u003ctd\u003e\n\t\t\t\u003cimg src=\"doc/screenshots/proxy_protocol_route_list.png\" alt=\"Route list\" width=\"360px\" /\u003e\n\t\t\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e\n\t\t\t\u003cimg src=\"doc/screenshots/routes_stream_edit.png\" alt=\"Route edit\" width=\"360px\" /\u003e\n\t\t\u003c/td\u003e\n\t\t\u003ctd\u003e\n\t\t\t\u003cimg src=\"doc/screenshots/routes_http_edit_ssl.png\" alt=\"Certificate - letsencrypt\" width=\"360px\" /\u003e\n\t\t\u003c/td\u003e\n\t\u003c/tr\u003e\n\u003c/table\u003e\n\n# Supported by\nSpecial thanks to the following companys:\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd align=\"center\"\u003e\n            \u003ca href=\"https://jb.gg/OpenSourceSupport\"\u003e\n\t\t\t\t\u003cimg src=\"https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.png\" width=\"80\" alt=\"\"/\u003e\n\t\t\t\t\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJetBrains\u003c/b\u003e\u003c/sub\u003e\n\t\t\t\u003c/a\u003e\n        \u003c/td\u003e\n\t\u003c/tr\u003e\n\u003c/table\u003e\n\n# Contributors\n\nSpecial thanks to the following contributors:\n\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd align=\"center\"\u003e\n\t\t\t\u003ca href=\"https://github.com/Choppel\"\u003e\n\t\t\t\t\u003cimg src=\"https://avatars.githubusercontent.com/u/14126324?v=4\" width=\"80\" alt=\"\"/\u003e\n\t\t\t\t\u003cbr /\u003e\u003csub\u003e\u003cb\u003eChoppel\u003c/b\u003e\u003c/sub\u003e\n\t\t\t\u003c/a\u003e\n\t\t\u003c/td\u003e\n\t\u003c/tr\u003e\n\u003c/table\u003e\n\u003c!-- markdownlint-enable --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n# License\n[![License: GPL v3.0](https://img.shields.io/badge/License-GPL%20v3-blue?style=for-the-badge)](https://www.gnu.org/licenses/gpl-3.0)\n\nThis project is licensed under the GNU General Public License v3.0. See the [LICENSE](LICENSE) file for details.\n\n[![FOSSA Status](https://app.fossa.com/api/projects/custom%2B50964%2Fgithub.com%2Fstefanwerfling%2Fflyingfish.svg?type=large\u0026issueType=license)](https://app.fossa.com/projects/custom%2B50964%2Fgithub.com%2Fstefanwerfling%2Fflyingfish?ref=badge_large\u0026issueType=license)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstefanwerfling%2Fflyingfish","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstefanwerfling%2Fflyingfish","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstefanwerfling%2Fflyingfish/lists"}