{"id":51438879,"url":"https://github.com/alexeyshalaev/vpn-hub","last_synced_at":"2026-07-05T10:00:30.632Z","repository":{"id":369161454,"uuid":"1288267649","full_name":"AlexeyShalaev/vpn-hub","owner":"AlexeyShalaev","description":"Self-hosted панель управления VPN (Amnezia/OpenVPN/Outline) — один Docker-образ + PostgreSQL","archived":false,"fork":false,"pushed_at":"2026-07-03T21:52:23.000Z","size":565,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-07-03T23:11:46.756Z","etag":null,"topics":["amneziawg","docker","fastapi","openvpn","outline","self-hosted","shadowsocks","vpn","wireguard","xray"],"latest_commit_sha":null,"homepage":"https://alexeyshalaev.github.io/vpn-hub/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AlexeyShalaev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-07-03T12:36:11.000Z","updated_at":"2026-07-03T21:52:17.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/AlexeyShalaev/vpn-hub","commit_stats":null,"previous_names":["alexeyshalaev/vpn-hub"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/AlexeyShalaev/vpn-hub","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexeyShalaev%2Fvpn-hub","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexeyShalaev%2Fvpn-hub/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexeyShalaev%2Fvpn-hub/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexeyShalaev%2Fvpn-hub/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AlexeyShalaev","download_url":"https://codeload.github.com/AlexeyShalaev/vpn-hub/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexeyShalaev%2Fvpn-hub/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35150063,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-05T02:00:06.290Z","response_time":100,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["amneziawg","docker","fastapi","openvpn","outline","self-hosted","shadowsocks","vpn","wireguard","xray"],"created_at":"2026-07-05T10:00:21.322Z","updated_at":"2026-07-05T10:00:30.603Z","avatar_url":"https://github.com/AlexeyShalaev.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# VPN Hub\n\nSelf-hosted панель управления VPN-инфраструктурой: серверы (Amnezia / OpenVPN / Outline), группы,\nвыдача доступов близким, получение конфигов. Один Docker-образ, единственная внешняя зависимость —\nPostgreSQL.\n\n[![License](https://img.shields.io/github/license/AlexeyShalaev/vpn-hub)](LICENSE)\n[![CI](https://github.com/AlexeyShalaev/vpn-hub/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/AlexeyShalaev/vpn-hub/actions/workflows/ci.yml)\n[![Image](https://img.shields.io/badge/ghcr.io-vpn--hub-blue?logo=docker)](https://github.com/AlexeyShalaev/vpn-hub/pkgs/container/vpn-hub)\n[![Docs](https://img.shields.io/badge/docs-online-blue)](https://AlexeyShalaev.github.io/vpn-hub/)\n\n## Требования\n\n- **Docker** 20.10+ и **Docker Compose** v2 — либо кластер **Kubernetes** 1.27+.\n- **PostgreSQL** — встроенный (Compose/overlay) или внешний.\n- ~512 МБ RAM и 1 vCPU на инстанс; приложение держат в **одной реплике** (фоновый планировщик\n  без лидер-элекшена — см. [deploy/](deploy/)).\n\n## Установка\n\nГотовый образ — `ghcr.io/alexeyshalaev/vpn-hub` (linux/amd64 + arm64). Быстрее всего — скрипт:\nон проверит Docker, сам сгенерирует секреты и поднимет панель со встроенным PostgreSQL:\n\n```sh\ncurl -fsSL https://raw.githubusercontent.com/AlexeyShalaev/vpn-hub/master/deploy/scripts/install.sh | bash\n# открыть http://localhost:8000\n\n# VPS с доменом — сразу HTTPS (Caddy + Let's Encrypt; подставьте свой домен):\ncurl -fsSL https://raw.githubusercontent.com/AlexeyShalaev/vpn-hub/master/deploy/scripts/install.sh \\\n  | bash -s -- --domain vpn.example.com\n```\n\nТо же вручную через Docker Compose:\n\n```sh\ncd deploy/compose\ncp .env.example .env\n# задайте VPNHUB_MASTER_KEY и POSTGRES_PASSWORD:  openssl rand -hex 32\ndocker compose up -d\n```\n\nВсе способы (Compose, Kubernetes, `docker run`, флаги скрипта, HTTPS, внешняя БД) — в\n[папке `deploy/`](deploy/) и в\n[документации по установке](https://AlexeyShalaev.github.io/vpn-hub/deploy/).\n\nПервый вход: на пустой БД без env-админа открывается setup-экран (создание администратора и\nмастер-ключа восстановления). Либо задайте `VPNHUB_ADMIN_PHONE` / `VPNHUB_ADMIN_PASSWORD` —\nадмин создастся при старте.\n\n\u003e **Мастер-ключ.** `VPNHUB_MASTER_KEY` шифрует SSH-доступы и бэкапы; потеря = потеря секретов.\n\u003e На `https` панель не стартует с дефолтным ключом. Подробности — в\n\u003e [документации](https://AlexeyShalaev.github.io/vpn-hub/deploy/).\n\n## Запуск (dev)\n\n```sh\nmake db-up          # Postgres в docker на :5433\nmake install        # uv sync (backend) + npm install (frontend)\nmake front-build    # собрать React → статика backend\nmake run            # backend на :8000 (миграции на старте)\n# либо отдельно фронт:  make front-dev   (Vite :3000, proxy /api → :8000)\n```\n\n## Разработка\n\n```sh\nmake check          # ruff lint + format check + mypy (backend)\nmake test           # pytest (in-memory SQLite, без внешней инфры)\nmake front-lint     # tsc --noEmit (frontend)\n```\n\n## Стек\n\nPython 3.14 · FastAPI (Onion: `api`/`core`/`services`/`infra`) · Dishka · SQLAlchemy 2.0 async +\nAlembic · `sqlalchemy-foundation-kit` · React 19 + Vite + TS (отдаётся тем же FastAPI). Реальный\nprovisioning по SSH (Amnezia/AmneziaWG, OpenVPN, Outline, Xray).\n\n## Структура\n\n| Путь | Что |\n|---|---|\n| [backend/](backend/) | FastAPI-приложение (`src/vpnhub/`), Alembic-миграции, тесты |\n| [frontend/](frontend/) | React + Vite UI (собирается в статику backend) |\n| [deploy/](deploy/) | Docker Compose, скрипты установки, Kubernetes-манифесты |\n| [docs/](docs/) | сайт документации + research-заметки по provisioning |\n\n## Лицензия\n\nApache 2.0 — см. [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexeyshalaev%2Fvpn-hub","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falexeyshalaev%2Fvpn-hub","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexeyshalaev%2Fvpn-hub/lists"}