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