diff --git a/frontend/src/pages/FamilyView.tsx b/frontend/src/pages/FamilyView.tsx
index 5eac7ae..5da5830 100644
--- a/frontend/src/pages/FamilyView.tsx
+++ b/frontend/src/pages/FamilyView.tsx
@@ -199,6 +199,14 @@ export default function FamilyView() {
return Math.max(0, Math.min(100, (remaining / limit) * 100));
};
+ const getTotalLimit = () => {
+ return categories.reduce((sum, cat) => sum + parseFloat(cat.limit_amount.toString()), 0);
+ };
+
+ const getTotalRemaining = () => {
+ return Array.from(remainingLimits.values()).reduce((sum, val) => sum + val, 0);
+ };
+
const formatDate = (dateString: string) => {
let dateStr = dateString;
if (!dateStr.endsWith('Z') && !dateStr.includes('+')) {
@@ -229,12 +237,25 @@ export default function FamilyView() {
-
+
{selectedFamily?.name || 'Семья'}
-
- Управление категориями и расходами
-
+
+
+
+
Общий лимит
+
+ {getTotalLimit().toFixed(2)} ₽
+
+
+
+
Общий остаток
+
+ {getTotalRemaining().toFixed(2)} ₽
+
+
+
+
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts
index 2869179..b9d9589 100644
--- a/frontend/vite.config.ts
+++ b/frontend/vite.config.ts
@@ -6,15 +6,7 @@ export default defineConfig({
server: {
port: 5173,
proxy: {
- '/families': {
- target: 'http://localhost:8080',
- changeOrigin: true,
- },
- '/login': {
- target: 'http://localhost:8080',
- changeOrigin: true,
- },
- '/logout': {
+ '/api': {
target: 'http://localhost:8080',
changeOrigin: true,
}
diff --git a/setup-ssl.ps1 b/setup-ssl.ps1
new file mode 100644
index 0000000..6d2586d
--- /dev/null
+++ b/setup-ssl.ps1
@@ -0,0 +1,49 @@
+# Setup SSL Certificate for Family Budget
+# Run this script in PowerShell as Administrator
+
+$ErrorActionPreference = "Stop"
+
+$DOMAIN = "family-budget.duckdns.org"
+$EMAIL = "your@email.com" # CHANGE THIS!
+
+Write-Host "=== Setting up SSL for $DOMAIN ===" -ForegroundColor Green
+
+# Change to project directory
+Set-Location C:\deploy\family_budget
+
+Write-Host "`n1. Stopping certbot..." -ForegroundColor Yellow
+docker compose -f docker-compose.prod.yml stop certbot
+
+Write-Host "`n2. Creating self-signed certificate..." -ForegroundColor Yellow
+docker compose -f docker-compose.prod.yml run --rm --entrypoint sh certbot -c @"
+mkdir -p /etc/letsencrypt/live/$DOMAIN && \
+openssl req -x509 -nodes -newkey rsa:2048 -days 365 \
+ -keyout /etc/letsencrypt/live/$DOMAIN/privkey.pem \
+ -out /etc/letsencrypt/live/$DOMAIN/fullchain.pem \
+ -subj '/CN=$DOMAIN'
+"@
+
+Write-Host "`n3. Updating nginx configuration..." -ForegroundColor Yellow
+$sslConfig = Get-Content nginx\conf.d\app-ssl.conf.template -Raw
+$sslConfig = $sslConfig -replace '\$\{DOMAIN\}', $DOMAIN
+$sslConfig | Out-File -FilePath nginx\conf.d\app-ssl.conf -Encoding UTF8
+
+# Remove HTTP config
+Remove-Item nginx\conf.d\app.conf -ErrorAction SilentlyContinue
+
+Write-Host "`n4. Restarting nginx..." -ForegroundColor Yellow
+docker compose -f docker-compose.prod.yml restart nginx
+
+Write-Host "`n5. Checking nginx status..." -ForegroundColor Yellow
+docker compose -f docker-compose.prod.yml ps nginx
+
+Write-Host "`n=== HTTPS Setup Complete! ===" -ForegroundColor Green
+Write-Host "`nYour site is now available at: https://$DOMAIN" -ForegroundColor Cyan
+Write-Host "`nNote: This is a self-signed certificate. Browser will show a warning." -ForegroundColor Yellow
+Write-Host "You can click 'Advanced' -> 'Proceed to site' to access." -ForegroundColor Yellow
+
+Write-Host "`n=== To get a real Let's Encrypt certificate later: ===" -ForegroundColor Magenta
+Write-Host "Run in Git Bash:" -ForegroundColor White
+Write-Host " export DOMAIN=$DOMAIN" -ForegroundColor Gray
+Write-Host " export EMAIL=$EMAIL" -ForegroundColor Gray
+Write-Host " bash init-letsencrypt.sh" -ForegroundColor Gray