diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml
index 3f858e30..e030e465 100644
--- a/.github/workflows/build-linux.yml
+++ b/.github/workflows/build-linux.yml
@@ -9,6 +9,12 @@ on:
push:
branches:
- master
+ tags:
+ - 'v*'
+ - 'V*'
+
+permissions:
+ contents: write
env:
OutputArch: "linux-64"
@@ -21,7 +27,6 @@ jobs:
strategy:
matrix:
configuration: [Release]
-
runs-on: ubuntu-24.04
steps:
@@ -31,18 +36,18 @@ jobs:
submodules: 'recursive'
fetch-depth: '0'
- - name: Setup
+ - name: Setup .NET
uses: actions/setup-dotnet@v5.0.0
with:
dotnet-version: '8.0.x'
- name: Build
run: |
- cd v2rayN
- dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r linux-x64 --self-contained=true -o $OutputPath64
- dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r linux-arm64 --self-contained=true -o $OutputPathArm64
- dotnet publish ./AmazTool/AmazTool.csproj -c Release -r linux-x64 --self-contained=true -p:PublishTrimmed=true -o $OutputPath64
- dotnet publish ./AmazTool/AmazTool.csproj -c Release -r linux-arm64 --self-contained=true -p:PublishTrimmed=true -o $OutputPathArm64
+ cd v2rayN
+ dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r linux-x64 --self-contained=true -o "$OutputPath64"
+ dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r linux-arm64 --self-contained=true -o "$OutputPathArm64"
+ dotnet publish ./AmazTool/AmazTool.csproj -c Release -r linux-x64 --self-contained=true -p:PublishTrimmed=true -o "$OutputPath64"
+ dotnet publish ./AmazTool/AmazTool.csproj -c Release -r linux-arm64 --self-contained=true -p:PublishTrimmed=true -o "$OutputPathArm64"
- name: Upload build artifacts
uses: actions/upload-artifact@v5.0.0
@@ -56,8 +61,8 @@ jobs:
if: github.event.inputs.release_tag != ''
run: |
chmod 755 package-debian.sh
- ./package-debian.sh $OutputArch $OutputPath64 ${{ github.event.inputs.release_tag }}
- ./package-debian.sh $OutputArchArm $OutputPathArm64 ${{ github.event.inputs.release_tag }}
+ ./package-debian.sh "$OutputArch" "$OutputPath64" "${{ github.event.inputs.release_tag }}"
+ ./package-debian.sh "$OutputArchArm" "$OutputPathArm64" "${{ github.event.inputs.release_tag }}"
- name: Upload deb to release
uses: svenstaro/upload-release-action@v2
@@ -73,8 +78,8 @@ jobs:
if: github.event.inputs.release_tag != ''
run: |
chmod 755 package-release-zip.sh
- ./package-release-zip.sh $OutputArch $OutputPath64
- ./package-release-zip.sh $OutputArchArm $OutputPathArm64
+ ./package-release-zip.sh "$OutputArch" "$OutputPath64"
+ ./package-release-zip.sh "$OutputArchArm" "$OutputPathArm64"
- name: Upload zip archive to release
uses: svenstaro/upload-release-action@v2
@@ -85,36 +90,62 @@ jobs:
file_glob: true
prerelease: true
- # release RHEL package
- - name: Package RPM (RHEL-family)
- if: github.event.inputs.release_tag != ''
+ rpm:
+ needs: build
+ if: |
+ (github.event_name == 'workflow_dispatch' && github.event.inputs.release_tag != '') ||
+ (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/'))
+ runs-on: ubuntu-24.04
+ container:
+ image: quay.io/almalinuxorg/10-base:latest
+ options: --platform=linux/amd64/v2
+ env:
+ RELEASE_TAG: ${{ github.event.inputs.release_tag != '' && github.event.inputs.release_tag || github.ref_name }}
+
+ steps:
+ - name: Prepare tools (Red Hat)
run: |
- chmod 755 package-rhel.sh
- # Build for both x86_64 and aarch64 in one go (explicit version passed; no --buildfrom)
- ./package-rhel.sh "${{ github.event.inputs.release_tag }}" --arch all
+ dnf -y makecache
+ dnf -y install epel-release
+ dnf -y install sudo git rpm-build rpmdevtools dnf-plugins-core rsync findutils tar gzip unzip which
+
+ - name: Checkout repo (for scripts)
+ uses: actions/checkout@v5.0.0
+ with:
+ submodules: 'recursive'
+ fetch-depth: '0'
+
+ - name: Restore build artifacts
+ uses: actions/download-artifact@v4
+ with:
+ name: v2rayN-linux
+ path: ${{ github.workspace }}/v2rayN/Release
+
+ - name: Ensure script permissions
+ run: chmod 755 package-rhel.sh
+
+ - name: Package RPM (RHEL-family)
+ run: ./package-rhel.sh "${RELEASE_TAG}" --arch all
- name: Collect RPMs into workspace
- if: github.event.inputs.release_tag != ''
run: |
- mkdir -p "${{ github.workspace }}/dist/rpm"
- rsync -av "$HOME/rpmbuild/RPMS/" "${{ github.workspace }}/dist/rpm/"
- # Rename to requested filenames
- find "${{ github.workspace }}/dist/rpm" -name "v2rayN-*-1.x86_64.rpm" -exec mv {} "${{ github.workspace }}/dist/rpm/v2rayN-linux-rhel-x64.rpm" \; || true
- find "${{ github.workspace }}/dist/rpm" -name "v2rayN-*-1.aarch64.rpm" -exec mv {} "${{ github.workspace }}/dist/rpm/v2rayN-linux-rhel-arm64.rpm" \; || true
+ mkdir -p "$GITHUB_WORKSPACE/dist/rpm"
+ rsync -av "$HOME/rpmbuild/RPMS/" "$GITHUB_WORKSPACE/dist/rpm/" || true
+ find "$GITHUB_WORKSPACE/dist/rpm" -name "v2rayN-*-1*.x86_64.rpm" -exec mv {} "$GITHUB_WORKSPACE/dist/rpm/v2rayN-linux-rhel-64.rpm" \; || true
+ find "$GITHUB_WORKSPACE/dist/rpm" -name "v2rayN-*-1*.aarch64.rpm" -exec mv {} "$GITHUB_WORKSPACE/dist/rpm/v2rayN-linux-rhel-arm64.rpm" \; || true
+ echo "==== Dist tree ===="
+ ls -R "$GITHUB_WORKSPACE/dist/rpm" || true
- name: Upload RPM artifacts
- if: github.event.inputs.release_tag != ''
uses: actions/upload-artifact@v5.0.0
with:
name: v2rayN-rpm
- path: |
- ${{ github.workspace }}/dist/rpm/**/*.rpm
+ path: dist/rpm/**/*.rpm
- name: Upload RPMs to release
uses: svenstaro/upload-release-action@v2
- if: github.event.inputs.release_tag != ''
with:
- file: ${{ github.workspace }}/dist/rpm/**/*.rpm
- tag: ${{ github.event.inputs.release_tag }}
+ file: dist/rpm/**/*.rpm
+ tag: ${{ env.RELEASE_TAG }}
file_glob: true
prerelease: true
diff --git a/package-rhel.sh b/package-rhel.sh
index 8384e765..b93ea82c 100644
--- a/package-rhel.sh
+++ b/package-rhel.sh
@@ -19,6 +19,23 @@ else
exit 1
fi
+# ======================== Kernel version check (require >= 6.11) =======================
+MIN_KERNEL_MAJOR=6
+MIN_KERNEL_MINOR=11
+KERNEL_FULL=$(uname -r)
+KERNEL_MAJOR=$(echo "$KERNEL_FULL" | cut -d. -f1)
+KERNEL_MINOR=$(echo "$KERNEL_FULL" | cut -d. -f2)
+
+echo "[INFO] Detected kernel version: $KERNEL_FULL"
+
+if (( KERNEL_MAJOR < MIN_KERNEL_MAJOR )) || { (( KERNEL_MAJOR == MIN_KERNEL_MAJOR )) && (( KERNEL_MINOR < MIN_KERNEL_MINOR )); }; then
+ echo "[ERROR] Kernel $KERNEL_FULL is too old. Requires Linux >= ${MIN_KERNEL_MAJOR}.${MIN_KERNEL_MINOR}."
+ echo "Please upgrade your system or use a newer container (e.g. Fedora 42+, RHEL 10+, Debian 13+)."
+ exit 1
+fi
+
+echo "[OK] Kernel version >= ${MIN_KERNEL_MAJOR}.${MIN_KERNEL_MINOR}."
+
# ===== Config & Parse arguments =========================================================
VERSION_ARG="${1:-}" # Pass version number like 7.13.8, or leave empty
WITH_CORE="both" # Default: bundle both xray+sing-box
diff --git a/v2rayN/ServiceLib/Resx/ResUI.fr.resx b/v2rayN/ServiceLib/Resx/ResUI.fr.resx
index 2222d8c4..a56802e3 100644
--- a/v2rayN/ServiceLib/Resx/ResUI.fr.resx
+++ b/v2rayN/ServiceLib/Resx/ResUI.fr.resx
@@ -472,7 +472,7 @@
Langue (redémarrage requis)
- Importer des liens depuis le presse-papiers (Ctrl+V)
+ Importer liens depuis le presse-papiers (Ctrl+V)
Scanner le QR code à l’écran (Ctrl+S)
@@ -619,7 +619,7 @@
Sécurité couche transport (TLS)
- *tcp par défaut ; un mauvais choix empêchera la connexion
+ *tcp par défaut ; un mauvais choix bloque la connexion
Type de Core
@@ -652,7 +652,7 @@
Port Socks
- *Valeur du port Socks pour la configuration personnalisée (facultatif). Si défini, Xray/sing-box (Tun) démarrera un service Socks en amont supplémentaire pour fournir le routage sélectif et l’affichage de la vitesse.
+ *Valeur du port Socks (config perso, optionnelle). Si défini, Xray/sing-box (Tun) démarre un service Socks en amont supplémentaire pour fournir le routage sélectif et l’affichage de la vitesse.
Parcourir
@@ -670,7 +670,7 @@
Masquer la fenêtre au démarrage
- Intervalle de mise à jour automatique des fichiers Geo (heures)
+ Intervalle de mise à jour auto des fichiers Geo (heures)
Core : paramètres de base
@@ -691,7 +691,7 @@
domainStrategy de Freedom (sortant)
- Auto-ajuster la largeur des colonnes après maj. des abonnements
+ Auto-ajuster la largeur des colonnes après maj. abonnements
Vérifier les mises à jour pré-version (à activer avec prudence)
@@ -724,7 +724,7 @@
Mot de passe d’authentification
- DNS personnalisés (plusieurs possibles, séparés par des virgules)
+ DNS perso (plusieurs configurables, séparés par virgules)
Lever la restriction de proxy en boucle locale pour les applications Win10 UWP
@@ -865,7 +865,7 @@
Documentation détaillée des règles
- Saisie de DnsObject prise en charge (format JSON), cliquer pour voir la documentation
+ Saisie DnsObject prise en charge (format JSON), cliquer pour doc
Laissez vide pour les groupes ordinaires
@@ -898,7 +898,7 @@
Filtrage par alias (regex)
- Afficher les journaux
+ Afficher les logs
Activer Tun
@@ -979,7 +979,7 @@
En attente du test (appuyer sur Échap pour arrêter)...
- Désactivez ceci en cas de coupures anormales
+ Désactiver cette option si coupure anormale
Mise à jour désactivée, abonnement ignoré
@@ -1009,10 +1009,10 @@
DNS personnalisé sing-box
- Veuillez renseigner la structure JSON DNS ; cliquer pour voir la documentation
+ Saisissez la structure JSON DNS ; cliquez pour voir la doc.
- Cliquez pour importer la configuration DNS par défaut
+ Cliquez pour importer la config DNS par défaut
Stratégie résolution domaine (sing-box)
@@ -1045,10 +1045,10 @@
Algo contrôle congestion
- Alias de configuration du proxy amont
+ Alias de config du proxy amont
- Alias de configuration du proxy aval
+ Alias de config du proxy aval
Assurez-vous que l’alias config existe et est unique
@@ -1114,7 +1114,7 @@
Activer le fragmentation (Fragment)
- Activer le fichier de cache de sing-box (fichiers de reˋgles)
+ Activer le fichier de cache de sing-box (fichiers règles)
Set de règles sing-box perso
@@ -1207,7 +1207,7 @@
Stratégie de résolution par défaut des sortants
- Orientation de la mise en page principale (redémarrage requis)
+ Orientation mise en page principale (redémarrage requis)
Adresse de résolution de domaine pour sortants
@@ -1330,7 +1330,7 @@
JSON brut XHTTP Extra, format : { XHTTPObject }
- Masquer dans la barre d’état lors de la fermeture de la fenêtre
+ Masquer dans la barre d’état à la fermeture de la fenêtre
Niveau de concurrence lors des tests multithread
@@ -1351,7 +1351,7 @@
Thème
- Copier la commande proxy terminal vers le presse-papiers
+ Copier la cmd proxy terminal dans le presse-papiers
Recommencer le test des éléments échoués, {0} restants. Appuyez sur Échap pour arrêter...
@@ -1369,7 +1369,7 @@
Plage de ports sautés
- Écrase le port ; pour plusieurs groupes, séparez par des virgules (,)
+ Écrase le port ; pour plusieurs groupes, séparer par virgules (,)
Générer un groupe de stratégie depuis plusieurs profils
@@ -1447,7 +1447,7 @@
Valider les IP des domaines de la région concernée
- Après configuration, les IP renvoyées pour les domaines régionaux (p. ex. geosite:cn) seront validées ; seules les IP attendues seront retournées
+ Après config, les IP renvoyées des domaines régionaux (ex. geosite:cn) seront vérifiées ; seules les IP attendues seront retournées.
Activer le DNS personnalisé
@@ -1471,7 +1471,7 @@
Modèle de configuration complet v2ray
- Ajoute seulement la configuration sortante, routing.balancers et routing.rules.outboundTag. Voir la documentation.
+ Ajoute seulement la config sortante, routing.balancers et routing.rules.outboundTag. Voir la doc.
N’ajoutez pas de sorties pour protocoles non-proxy.
@@ -1492,10 +1492,10 @@
Début de l’analyse et du traitement du contenu d’abonnement
- Sélectionner une configuration
+ Choisir une config.
- Actif globalement par défaut, avec filtrage FakeIP intégré ; ne fonctionne que dans sing-box
+ Actif globalement par défaut, avec filtre FakeIP intégré ; ne fonctionne que dans sing-box
Veuillez ajouter au moins une configuration