13 Commits
Author SHA1 Message Date
austnv a3c7b5bdd1 v0.7.5
Build and Deploy Backend / build-and-deploy (push) Successful in 33s
2026-06-26 12:55:38 +03:00
austnv 6c7adb1028 feat: add country_code field to hosts response 2026-06-26 12:51:45 +03:00
austnv 3661882c05 fix: volume data/tariffs.json -> data/
Build and Deploy Backend / build-and-deploy (push) Successful in 46s
2026-06-26 12:40:55 +03:00
austnv abcdb040ef fix: release author 2026-06-21 22:43:36 +03:00
austnv 718b9deebe fix: delete docker image from workflow file 2026-06-21 22:41:01 +03:00
austnv 3e961e8462 v0.7.3
Build and Deploy Backend / build-and-deploy (push) Successful in 29s
2026-06-21 22:34:33 +03:00
austnv bdee2fe336 microfix: env.REGISTRY -> git.uvpn.shop 2026-06-21 22:31:08 +03:00
austnv 6e07ccca3e fix token (ACCESS_TOKEN)
Build and Deploy Backend / build-and-deploy (push) Successful in 26s
2026-06-21 22:26:34 +03:00
austnv 53a2ba5885 fix token 2026-06-21 22:24:04 +03:00
austnv 0c9464d624 fix release workflow 2026-06-21 22:22:19 +03:00
austnv b2c6a30104 fix release workflow 2026-06-21 22:18:25 +03:00
austnv 5d95c2dea3 fix release workflow 2026-06-21 22:15:39 +03:00
austnv 0c7cc7cdb8 fix: problem with gitea actions 2026-06-21 22:12:39 +03:00
4 changed files with 47 additions and 44 deletions
+37 -36
View File
@@ -27,47 +27,48 @@ jobs:
username: ${{ gitea.repository_owner }} username: ${{ gitea.repository_owner }}
password: ${{ secrets.ACCESS_TOKEN }} password: ${{ secrets.ACCESS_TOKEN }}
# 4. Собираем и пушим образ - name: Create Gitea Release via API
- name: Build and push Docker image run: |
uses: docker/build-push-action@v5 # Получаем описание из тега (если есть)
with: TAG_MESSAGE=$(git tag -l --format='%(contents)' "${{ gitea.ref_name }}" 2>/dev/null || echo "Автоматический релиз через CI/CD")
context: .
push: true
tags: |
git.uvpn.shop/uvpn/backend:latest
git.uvpn.shop/uvpn/backend:${{ gitea.sha }}
- name: Create Gitea Release # Экранируем кавычки и переносы для JSON
uses: actions/gitea-release-action@v1 TAG_MESSAGE_ESCAPED=$(echo "$TAG_MESSAGE" | sed 's/"/\\"/g' | awk '{printf "%s\\n", $0}')
with:
release_name: ${{ gitea.ref_name }}
release_notes: |
## Релиз ${{ gitea.ref_name }}
${{ (github.event.head_commit.message != '' && format('📝 {0}', github.event.head_commit.message)) || '' }} # Формируем JSON
JSON_PAYLOAD=$(cat <<EOF
{
"tag_name": "${{ gitea.ref_name }}",
"name": "Release ${{ gitea.ref_name }}",
"body": "## Релиз ${{ gitea.ref_name }}\n\n📝 ${TAG_MESSAGE_ESCAPED}\n\n---\n\n**🏷️ Тег:** \`${{ gitea.ref_name }}\`\n**👤 Автор:** @${{ gitea.actor }}\n\n✅ Автоматически собрано и развёрнуто",
"draft": false,
"prerelease": false
}
EOF
)
### 📦 Что изменилось # Отправляем запрос
${{ github.event.head_commit.message || 'Автоматический релиз через CI/CD' }} RESPONSE=$(curl -s -w "\n%{http_code}" \
-X POST \
-H "Authorization: token ${{ secrets.ACCESS_TOKEN }}" \
-H "Content-Type: application/json" \
-d "$JSON_PAYLOAD" \
"https://git.uvpn.shop/api/v1/repos/${{ gitea.repository }}/releases")
--- # Проверяем ответ
HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
BODY=$(echo "$RESPONSE" | sed '$d')
### 🔧 Технические детали if [ "$HTTP_CODE" -eq 201 ]; then
- **Docker образ:** `${{ env.REGISTRY }}/${{ gitea.repository }}:${{ gitea.sha }}` echo "✅ Релиз успешно создан!"
- **Тег:** `${{ gitea.ref_name }}` echo "$BODY" | jq '.'
- **Ветка:** `${{ gitea.ref }}` elif [ "$HTTP_CODE" -eq 409 ]; then
- **Автор:** ${{ gitea.actor }} echo "⚠️ Релиз с таким тегом уже существует, пропускаем"
else
### 🚀 Деплой echo "❌ Ошибка создания релиза (HTTP $HTTP_CODE)"
- ✅ Образ собран и отправлен в Container Registry echo "$BODY"
- ✅ Сервер обновлён автоматически exit 1
fi
---
> Релиз создан автоматически через Gitea Actions
draft: false
prerelease: false
env:
GITEA_API_KEY: ${{ secrets.ACCESS_TOKEN }}
# 5. Устанавливаем SSH-ключ для деплоя # 5. Устанавливаем SSH-ключ для деплоя
- name: Install SSH key - name: Install SSH key
+1 -1
View File
@@ -3,7 +3,7 @@ services:
image: git.uvpn.shop/uvpn/backend:latest image: git.uvpn.shop/uvpn/backend:latest
container_name: uvpn-backend container_name: uvpn-backend
volumes: volumes:
- /opt/remnawave-minishop/data/tariffs.json:/app/data/tariffs.json - /opt/remnawave-minishop/data/:/app/data/
env_file: env_file:
- .env - .env
networks: networks:
+1 -1
View File
@@ -1,6 +1,6 @@
[project] [project]
name = "uvpn-backend" name = "uvpn-backend"
version = "0.7.2" version = "0.7.5"
description = "FastAPI backend with Docker for uvpn.shop" description = "FastAPI backend with Docker for uvpn.shop"
readme = "README.md" readme = "README.md"
requires-python = ">=3.12" requires-python = ">=3.12"
+3 -1
View File
@@ -3,6 +3,7 @@ import logging
from os import getenv from os import getenv
from remnawave import RemnawaveSDK from remnawave import RemnawaveSDK
from remnawave.models.hosts import GetAllHostsResponseDto from remnawave.models.hosts import GetAllHostsResponseDto
from remnawave.models.nodes import GetOneNodeResponseDto
import re import re
@@ -40,7 +41,8 @@ async def get_nodes():
{ {
'name': clean_host_name(host.remark), 'name': clean_host_name(host.remark),
'address': host.address, 'address': host.address,
'port': host.port 'port': host.port,
'country_code': (await remnawave.nodes.get_one_node(uuid=host.nodes[0])).country_code
} }
for host in hosts.root if not host.is_disabled and not host.is_hidden for host in hosts.root if not host.is_disabled and not host.is_hidden