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:
Sphera Bot
2026-08-03 22:13:53 +10:00
commit a7d1a0741f
11 changed files with 355 additions and 0 deletions
+56
View File
@@ -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
View File
@@ -0,0 +1,12 @@
# OS
.DS_Store
Thumbs.db
# IDE
.idea/
.vscode/
*.iml
# Umbrel runtime data (should not be committed)
**/data/*
!**/.gitkeep
+42
View File
@@ -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>
+61
View File
@@ -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

+67
View File
@@ -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"]
+49
View File
@@ -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>
View File
+31
View File
@@ -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

+35
View File
@@ -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: []
+2
View File
@@ -0,0 +1,2 @@
id: sphera
name: Sphera