mirror of
https://github.com/Cheviiot/Sphera.git
synced 2026-08-03 15:57:21 +00:00
Polish store and v2rayA app for release
- Redesign store README as a minimal storefront - Refine app README and remove technical clutter - Update Sphera icon with refined vector styling - Use original v2rayA app icon - Use raw GitHub URL for v2rayA icon per Umbrel Community Store spec - Add custom v2rayA image build for UmbrelOS nf_tables iptables
This commit is contained in:
@@ -0,0 +1,56 @@
|
|||||||
|
name: Build and publish v2rayA image
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [master]
|
||||||
|
paths:
|
||||||
|
- 'sphera-v2raya/Dockerfile'
|
||||||
|
- '.github/workflows/docker.yml'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
env:
|
||||||
|
REGISTRY: ghcr.io
|
||||||
|
IMAGE_NAME: ${{ github.repository_owner }}/sphera-v2raya
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v3
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Login to GitHub Container Registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ${{ env.REGISTRY }}
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Extract metadata
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v5
|
||||||
|
with:
|
||||||
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||||
|
tags: |
|
||||||
|
type=raw,value=v2.4.9-2
|
||||||
|
|
||||||
|
- name: Build and push
|
||||||
|
uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: ./sphera-v2raya
|
||||||
|
file: ./sphera-v2raya/Dockerfile
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
push: true
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
# OS
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# IDE
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
*.iml
|
||||||
|
|
||||||
|
# Umbrel runtime data (should not be committed)
|
||||||
|
**/data/*
|
||||||
|
!**/.gitkeep
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
<p align="center">
|
||||||
|
<img src="sphera-icon.svg" width="128" height="128" alt="Sphera">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h1 align="center">Sphera</h1>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<strong>Community App Store for UmbrelOS</strong>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://umbrel.com"><img src="https://img.shields.io/badge/Umbrel-Community%20Store-5F8DD3?style=for-the-badge&logo=umbrel&logoColor=white" alt="Umbrel Community Store"></a>
|
||||||
|
<img src="https://img.shields.io/badge/apps-1-blue?style=for-the-badge" alt="1 app">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
Curated tools that extend what your personal server can do.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
In UmbrelOS go to **App Store → Community App Stores → Add** and paste:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://github.com/cheviiot/Sphera
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Apps
|
||||||
|
|
||||||
|
| | Name | ID | Description |
|
||||||
|
|:---:|---|---|---|
|
||||||
|
| <img src="sphera-v2raya/icon.png" width="40" height="40" alt="v2rayA"> | **v2rayA** | `sphera-v2raya` | Web GUI client for V2Ray / Xray. Transparent proxy via host networking. |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<sub>Made for the Umbrel community.</sub>
|
||||||
|
</p>
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="bg" x1="0" y1="0" x2="512" y2="512">
|
||||||
|
<stop offset="0%" stop-color="#1e1b4b"/>
|
||||||
|
<stop offset="100%" stop-color="#0f172a"/>
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient id="sphere" cx="35%" cy="35%" r="65%">
|
||||||
|
<stop offset="0%" stop-color="#a5b4fc"/>
|
||||||
|
<stop offset="50%" stop-color="#6366f1"/>
|
||||||
|
<stop offset="100%" stop-color="#4338ca"/>
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient id="line" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||||
|
<stop offset="0%" stop-color="#c084fc"/>
|
||||||
|
<stop offset="100%" stop-color="#818cf8"/>
|
||||||
|
</linearGradient>
|
||||||
|
<filter id="glow" x="-50%" y="-50%" width="200%" height="200%">
|
||||||
|
<feGaussianBlur stdDeviation="14" result="blur"/>
|
||||||
|
<feComposite in="SourceGraphic" in2="blur" operator="over"/>
|
||||||
|
</filter>
|
||||||
|
<filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
|
||||||
|
<feDropShadow dx="0" dy="16" stdDeviation="28" flood-color="#000000" flood-opacity="0.45"/>
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
|
||||||
|
<!-- Squircle -->
|
||||||
|
<rect x="16" y="16" width="480" height="480" rx="128" fill="url(#bg)" filter="url(#shadow)"/>
|
||||||
|
|
||||||
|
<!-- Outer ring -->
|
||||||
|
<circle cx="256" cy="256" r="158" fill="none" stroke="url(#line)" stroke-width="2" opacity="0.25" filter="url(#glow)"/>
|
||||||
|
<circle cx="256" cy="256" r="140" fill="none" stroke="#6366f1" stroke-width="1" opacity="0.15"/>
|
||||||
|
|
||||||
|
<!-- Main sphere -->
|
||||||
|
<circle cx="256" cy="256" r="96" fill="url(#sphere)" filter="url(#glow)"/>
|
||||||
|
|
||||||
|
<!-- Specular highlight -->
|
||||||
|
<ellipse cx="232" cy="212" rx="44" ry="30" fill="#ffffff" opacity="0.14" transform="rotate(-40 232 212)"/>
|
||||||
|
|
||||||
|
<!-- Orbit nodes -->
|
||||||
|
<circle cx="256" cy="98" r="8" fill="#ffffff" filter="url(#glow)"/>
|
||||||
|
<circle cx="414" cy="256" r="8" fill="#ffffff" filter="url(#glow)"/>
|
||||||
|
<circle cx="256" cy="414" r="8" fill="#ffffff" filter="url(#glow)"/>
|
||||||
|
<circle cx="98" cy="256" r="8" fill="#ffffff" filter="url(#glow)"/>
|
||||||
|
|
||||||
|
<circle cx="368" cy="144" r="5" fill="#e0e7ff" opacity="0.9"/>
|
||||||
|
<circle cx="144" cy="368" r="5" fill="#e0e7ff" opacity="0.9"/>
|
||||||
|
<circle cx="368" cy="368" r="5" fill="#e0e7ff" opacity="0.9"/>
|
||||||
|
<circle cx="144" cy="144" r="5" fill="#e0e7ff" opacity="0.9"/>
|
||||||
|
|
||||||
|
<!-- Connections -->
|
||||||
|
<g stroke="url(#line)" stroke-width="2.5" opacity="0.35" filter="url(#glow)">
|
||||||
|
<line x1="256" y1="98" x2="414" y2="256"/>
|
||||||
|
<line x1="414" y1="256" x2="256" y2="414"/>
|
||||||
|
<line x1="256" y1="414" x2="98" y2="256"/>
|
||||||
|
<line x1="98" y1="256" x2="256" y2="98"/>
|
||||||
|
<line x1="368" y1="144" x2="144" y2="368" opacity="0.6"/>
|
||||||
|
<line x1="144" y1="144" x2="368" y2="368" opacity="0.6"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Core dot -->
|
||||||
|
<circle cx="256" cy="256" r="5" fill="#ffffff" filter="url(#glow)"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.7 KiB |
@@ -0,0 +1,67 @@
|
|||||||
|
FROM mzz2017/v2raya:v2.4.9@sha256:47f9acf99b23f19d804ab15303e8a7df7f66913d14c5ce0b39936d036dbb8500
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
|
# v2rayA inside Docker hard-codes "iptables-legacy" and "ip6tables-legacy".
|
||||||
|
# UmbrelOS ships iptables 1.8.x with nf_tables backend, and v2rayA's redirect
|
||||||
|
# mode emits REDIRECT rules without a protocol (-p), which both backends reject.
|
||||||
|
# Replace the legacy binaries with small wrappers that forward to the modern
|
||||||
|
# iptables and patch the problematic REDIRECT rule on the fly.
|
||||||
|
RUN set -eux; \
|
||||||
|
rm -f /sbin/iptables-legacy /usr/sbin/iptables-legacy \
|
||||||
|
/sbin/ip6tables-legacy /usr/sbin/ip6tables-legacy; \
|
||||||
|
printf '%s\n' \
|
||||||
|
'#!/bin/sh' \
|
||||||
|
'has_redirect=0' \
|
||||||
|
'has_proto=0' \
|
||||||
|
'for arg in "$@"; do' \
|
||||||
|
' case "$arg" in' \
|
||||||
|
' -j) next_is_target=1 ;;' \
|
||||||
|
' REDIRECT) if [ "$next_is_target" = 1 ]; then has_redirect=1; fi; next_is_target=0 ;;' \
|
||||||
|
' -p) has_proto=1 ;;' \
|
||||||
|
' esac' \
|
||||||
|
'done' \
|
||||||
|
'if [ "$has_redirect" = 1 ] && [ "$has_proto" = 0 ]; then' \
|
||||||
|
' new_args=""' \
|
||||||
|
' inserted=0' \
|
||||||
|
' for arg in "$@"; do' \
|
||||||
|
' if [ "$inserted" = 0 ] && [ "$arg" = "-j" ]; then' \
|
||||||
|
' new_args="$new_args -p tcp"' \
|
||||||
|
' inserted=1' \
|
||||||
|
' fi' \
|
||||||
|
' new_args="$new_args $arg"' \
|
||||||
|
' done' \
|
||||||
|
' set -- $new_args' \
|
||||||
|
'fi' \
|
||||||
|
'exec iptables "$@"' \
|
||||||
|
> /sbin/iptables-legacy; \
|
||||||
|
printf '%s\n' \
|
||||||
|
'#!/bin/sh' \
|
||||||
|
'has_redirect=0' \
|
||||||
|
'has_proto=0' \
|
||||||
|
'for arg in "$@"; do' \
|
||||||
|
' case "$arg" in' \
|
||||||
|
' -j) next_is_target=1 ;;' \
|
||||||
|
' REDIRECT) if [ "$next_is_target" = 1 ]; then has_redirect=1; fi; next_is_target=0 ;;' \
|
||||||
|
' -p) has_proto=1 ;;' \
|
||||||
|
' esac' \
|
||||||
|
'done' \
|
||||||
|
'if [ "$has_redirect" = 1 ] && [ "$has_proto" = 0 ]; then' \
|
||||||
|
' new_args=""' \
|
||||||
|
' inserted=0' \
|
||||||
|
' for arg in "$@"; do' \
|
||||||
|
' if [ "$inserted" = 0 ] && [ "$arg" = "-j" ]; then' \
|
||||||
|
' new_args="$new_args -p tcp"' \
|
||||||
|
' inserted=1' \
|
||||||
|
' fi' \
|
||||||
|
' new_args="$new_args $arg"' \
|
||||||
|
' done' \
|
||||||
|
' set -- $new_args' \
|
||||||
|
'fi' \
|
||||||
|
'exec ip6tables "$@"' \
|
||||||
|
> /sbin/ip6tables-legacy; \
|
||||||
|
chmod +x /sbin/iptables-legacy /sbin/ip6tables-legacy; \
|
||||||
|
ln -s /sbin/iptables-legacy /usr/sbin/iptables-legacy 2>/dev/null || true; \
|
||||||
|
ln -s /sbin/ip6tables-legacy /usr/sbin/ip6tables-legacy 2>/dev/null || true
|
||||||
|
|
||||||
|
ENTRYPOINT ["v2raya"]
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
<p align="center">
|
||||||
|
<img src="icon.png" width="96" height="96" alt="v2rayA">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h1 align="center">v2rayA</h1>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
Web GUI for Project V — <em>V2Ray · Xray · Shadowsocks · Trojan</em>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://github.com/v2rayA/v2rayA/releases"><img src="https://img.shields.io/badge/version-v2.4.9-blue?style=for-the-badge" alt="Version"></a>
|
||||||
|
<a href="https://hub.docker.com/r/mzz2017/v2raya"><img src="https://img.shields.io/badge/docker-mzz2017/v2raya-2496ED?style=for-the-badge&logo=docker" alt="Docker"></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **Transparent proxy** out of the box (host network mode)
|
||||||
|
- **Web GUI** for servers, subscriptions and routing rules
|
||||||
|
- **Multi-protocol**: VMess, VLESS, Shadowsocks, SSR, Trojan, Tuic, Juicity
|
||||||
|
- **SOCKS5** (`10808`) and **HTTP** (`10809`) proxies exposed on the host
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## First run
|
||||||
|
|
||||||
|
1. Open v2rayA from Umbrel Home.
|
||||||
|
2. Create an admin account on first login.
|
||||||
|
3. Add servers via **Subscriptions** or **Servers → Import**.
|
||||||
|
4. Select a server and click **Connect**.
|
||||||
|
5. Enable **Transparent Proxy / System Proxy** if needed.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ports
|
||||||
|
|
||||||
|
| Service | Port |
|
||||||
|
|---|---|
|
||||||
|
| Web GUI | `2017` |
|
||||||
|
| SOCKS5 | `10808` |
|
||||||
|
| HTTP | `10809` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
Part of <a href="../"><b>Sphera Community App Store</b></a>
|
||||||
|
</p>
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
version: "3.7"
|
||||||
|
|
||||||
|
services:
|
||||||
|
app_proxy:
|
||||||
|
environment:
|
||||||
|
# v2rayA работает в host-network; app_proxy достукивается через хост
|
||||||
|
APP_HOST: host.docker.internal
|
||||||
|
APP_PORT: 20177
|
||||||
|
# v2rayA имеет собственную авторизацию; двойная auth ломает UX
|
||||||
|
PROXY_AUTH_ADD: "false"
|
||||||
|
extra_hosts:
|
||||||
|
- "host.docker.internal:host-gateway"
|
||||||
|
|
||||||
|
server:
|
||||||
|
image: ghcr.io/cheviiot/sphera-v2raya:v2.4.9-2@sha256:518c168f67e7c588d7eb7e860a18fb7ddeb47c8f0564309ba8daca35dc056024
|
||||||
|
network_mode: host
|
||||||
|
restart: on-failure
|
||||||
|
volumes:
|
||||||
|
# Персистентные данные v2rayA (конфигурация, подписки)
|
||||||
|
- ${APP_DATA_DIR}/data:/etc/v2raya
|
||||||
|
environment:
|
||||||
|
# Слушаем на хосте, но на порту 20177, чтобы не конфликтовать с app_proxy
|
||||||
|
V2RAYA_ADDRESS: "0.0.0.0:20177"
|
||||||
|
# Подробное логирование для отладки
|
||||||
|
V2RAYA_VERBOSE: "true"
|
||||||
|
cap_add:
|
||||||
|
# Необходимо для управления iptables и создания VPN-интерфейсов
|
||||||
|
- NET_ADMIN
|
||||||
|
- SYS_MODULE
|
||||||
|
devices:
|
||||||
|
- /dev/net/tun
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 79 KiB |
@@ -0,0 +1,35 @@
|
|||||||
|
manifestVersion: 1
|
||||||
|
id: sphera-v2raya
|
||||||
|
category: networking
|
||||||
|
name: v2rayA
|
||||||
|
version: "v2.4.9-2"
|
||||||
|
tagline: Web GUI клиент для V2Ray, Xray, Shadowsocks, SSR и Trojan
|
||||||
|
description: >-
|
||||||
|
v2rayA — это веб-интерфейс для управления прокси-клиентами Project V.
|
||||||
|
Поддерживает протоколы V2Ray, Xray, Shadowsocks, SSR, Trojan и PingTunnel.
|
||||||
|
|
||||||
|
После установки откройте приложение через Umbrel и настройте подключение
|
||||||
|
через веб-GUI. Transparent proxy и TUN работают автоматически на уровне
|
||||||
|
хоста благодаря host-network режиму.
|
||||||
|
|
||||||
|
По умолчанию SOCKS5-прокси доступен на порту 10808, HTTP-прокси на 10809.
|
||||||
|
|
||||||
|
releaseNotes: >-
|
||||||
|
Исправлен запуск transparent proxy на UmbrelOS: кастомный образ
|
||||||
|
патчит iptables-legacy команды v2rayA для совместимости с nf_tables.
|
||||||
|
|
||||||
|
developer: v2rayA
|
||||||
|
website: https://v2raya.org
|
||||||
|
submitter: Sphera
|
||||||
|
submission: https://github.com/cheviiot/Sphera
|
||||||
|
repo: https://github.com/v2rayA/v2rayA
|
||||||
|
support: https://github.com/v2rayA/v2rayA/issues
|
||||||
|
|
||||||
|
port: 2017
|
||||||
|
gallery: []
|
||||||
|
path: ""
|
||||||
|
icon: https://raw.githubusercontent.com/cheviiot/Sphera/master/sphera-v2raya/icon.png
|
||||||
|
|
||||||
|
defaultUsername: ""
|
||||||
|
defaultPassword: ""
|
||||||
|
dependencies: []
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
id: sphera
|
||||||
|
name: Sphera
|
||||||
Reference in New Issue
Block a user