SparkyFitness — альтернатива MyFitnessPal для Homelab
Установка и настройка SparkyFitness — самостоятельной альтернативы MyFitnessPal для отслеживания питания и фитнеса в вашем Homelab. Пошаговое руководство.
Подготовка сервера
Обновление системы и установка необходимых зависимостей
sudo apt update && sudo apt upgrade -yУстановка .NET 6
Добавление репозитория .NET и установка SDK
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt update
sudo apt install -y dotnet-sdk-6.0 aspnetcore-runtime-6.0Установка базы данных
Установка и настройка PostgreSQL
sudo apt install -y postgresql postgresql-contrib
sudo systemctl start postgresql
sudo systemctl enable postgresql
sudo -u postgres createdb sparkyfitness
sudo -u postgres psql -c "CREATE USER sparky WITH PASSWORD 'your_strong_password';"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE sparkyfitness TO sparky;"Скачивание SparkyFitness
Создание директории и скачивание приложения
sudo mkdir -p /opt/sparkyfitness
sudo chown $USER:$USER /opt/sparkyfitness
cd /opt/sparkyfitness
wget https://github.com/SparkyFI/SparkyFitness/releases/download/v0.16.4.0/SparkyFitness-v0.16.4.0.zip
unzip SparkyFitness-v0.16.4.0.zipНастройка приложения
Конфигурация приложения и настройка SSL
{
"ConnectionStrings": {
"DefaultConnection": "Host=localhost;Database=sparkyfitness;Username=sparky;Password=your_strong_password;"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"AppSettings": {
"AppVersion": "0.16.4.0",
"AppUrl": "https://your-domain.com",
"AdminEmail": "admin@example.com",
"UseDatabaseForImages": true,
"Jwt": {
"Key": "your-super-secret-jwt-key-change-this",
"Issuer": "SparkyFitness",
"Audience": "SparkyFitnessUsers",
"DurationInMinutes": 60
}
}
}Запуск приложения
Запуск приложения как службы
[Unit]
Description=SparkyFitness
After=network.target postgresql.service
[Service]
Type=simple
User=sparkyfitness
WorkingDirectory=/opt/sparkyfitness/SparkyFitness
ExecStart=/usr/bin/dotnet /opt/sparkyfitness/SparkyFitness/SparkyFitness.dll
Restart=always
RestartSec=10
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=ASPNETCORE_URLS=http://localhost:5000
[Install]
WantedBy=multi-user.targetSparkyFitness v0.16.4.0 — Альтернатива MyFitnessPal для самостоятельного хостинга
Введение
В этом руководстве подробно рассмотрим процесс установки и настройки SparkyFitness — альтернативы MyFitnessPal с возможностью самостоятельного хостинга. SparkyFitness — это приложение для отслеживания питания, которое позволяет пользователям вести дневник питания, подсчитывать калории и нутриенты, а также отслеживать свои цели в отношении здоровья и фитнеса.
В отличие от MyFitnessPal, SparkyFitness может быть размещен на вашем собственном сервере, что обеспечивает конфиденциальность данных и полный контроль над приложением. Данное руководство подойдет для системных администраторов и технически подкованных пользователей, желающих развернуть собственное решение для отслеживания питания.
Что такое SparkyFitness
SparkyFitness — это веб-приложение для отслеживания питания, написанное на .NET 6. Приложение использует архитектуру клиент-сервер с поддержкой REST API. Оно предоставляет следующие функции:
- Отслеживание потребляемой пищи и напитков
- Подсчет калорий и макроэлементов (белки, жиры, углеводы)
- Установка целей по калориям и нутриентам
- Создание пользовательских продуктов и блюд
- Отслеживание прогресса и статистика
- Поддержка нескольких пользователей
- Импорт/экспорт данных
- Поддержка мобильных приложений через API
Приложение использует SQLite в качестве базы данных по умолчанию для упрощения развертывания, но также поддерживает другие базы данных, такие как PostgreSQL и SQL Server, для производственных сред.
Архитектура приложения включает следующие компоненты:
- Бэкенд на ASP.NET Core
- Frontend на Blazor Server
- Система аутентификации на основе JWT
- REST API для интеграций с внешними сервисами
Требования системы
Минимальные требования:
- Операционная система: Linux (Ubuntu 20.04 или новее), macOS или Windows
- Процессор: 2 ядра
- Оперативная память: 2 ГБ
- Дисковое пространство: 5 ГБ
- .NET 6.0 SDK или выше
- База данных: SQLite (встроенная), PostgreSQL 12+ или SQL Server 2019+
- Веб-сервер: Nginx или Apache (рекомендуется)
Рекомендуемые требования:
- Операционная система: Ubuntu 22.04 LTS
- Процессор: 4 ядра
- Оперативная память: 4 ГБ
- Дисковое пространство: 20 ГБ
- .NET 6.0 SDK или выше
- База данных: PostgreSQL 14+
- Веб-сервер: Nginx
- Сертификат SSL/TLS
Требования для высоконагруженных инсталляций:
- Операционная система: Ubuntu 22.04 LTS
- Процессор: 8+ ядер
- Оперативная память: 8+ ГБ
- Дисковое пространство: 50+ ГБ (SSD)
- .NET 6.0 SDK
- База данных: PostgreSQL 14+ в репликации или кластере
- Балансировщик нагрузки
- Кэширующий прокси (Redis)
- Мониторинг и система логирования
Установка SparkyFitness
Метод 1: Установка вручную
Шаг 1: Подготовка сервера
Для Ubuntu/Debian:
- Обновите систему:
sudo apt update && sudo apt upgrade -y
- Установите необходимые зависимости:
sudo apt install -y curl wget apt-transport-https gnupg2 software-properties-common
- Настройте брандмауэр:
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
Для CentOS/RHEL:
- Обновите систему:
sudo yum update -y
- Установите необходимые зависимости:
sudo yum install -y curl wget epel-release
- Настройте брандмауэр:
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
Шаг 2: Установка .NET 6
- Добавьте репозиторий .NET:
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
- Установите .NET SDK:
sudo apt update
sudo apt install -y dotnet-sdk-6.0 aspnetcore-runtime-6.0
- Проверьте установку:
dotnet --version
Должна быть отображена версия .NET 6 или выше.
Шаг 3: Установка базы данных (PostgreSQL)
- Установите PostgreSQL:
sudo apt install -y postgresql postgresql-contrib
- Настройте PostgreSQL:
sudo systemctl start postgresql
sudo systemctl enable postgresql
- Инициализируйте базу данных:
sudo -u postgres createdb sparkyfitness
sudo -u postgres psql -c "CREATE USER sparky WITH PASSWORD 'your_strong_password';"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE sparkyfitness TO sparky;"
- Настройте подключение к базе данных:
sudo nano /etc/postgresql/13/main/pg_hba.conf
Добавьте следующую строку:
host sparkyfitness sparky 127.0.0.1/32 md5
Перезапустите PostgreSQL:
sudo systemctl restart postgresql
Шаг 4: Скачивание SparkyFitness
- Создайте директорию для приложения:
sudo mkdir -p /opt/sparkyfitness
sudo chown $USER:$USER /opt/sparkyfitness
cd /opt/sparkyfitness
- Скачайте последнюю версию SparkyFitness:
wget https://github.com/SparkyFI/SparkyFitness/releases/download/v0.16.4.0/SparkyFitness-v0.16.4.0.zip
- Распакуйте архив:
unzip SparkyFitness-v0.16.4.0.zip
- Удалите архив:
rm SparkyFitness-v0.16.4.0.zip
Шаг 5: Настройка приложения
- Создайте пользователя для приложения:
sudo useradd -r -s /bin/false sparkyfitness
- Установите правильные права:
sudo chown -R sparkyfitness:sparkyfitness /opt/sparkyfitness
sudo chmod -R 750 /opt/sparkyfitness
- Скопируйте файл конфигурации:
cd /opt/sparkyfitness/SparkyFitness
cp appsettings.json appsettings.json.bak
- Отредактируйте файл конфигурации:
sudo nano appsettings.json
Пример конфигурации для PostgreSQL:
{
"ConnectionStrings": {
"DefaultConnection": "Host=localhost;Database=sparkyfitness;Username=sparky;Password=your_strong_password;"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"AppSettings": {
"AppVersion": "0.16.4.0",
"AppUrl": "https://your-domain.com",
"AdminEmail": "admin@example.com",
"UseDatabaseForImages": true,
"Jwt": {
"Key": "your-super-secret-jwt-key-change-this",
"Issuer": "SparkyFitness",
"Audience": "SparkyFitnessUsers",
"DurationInMinutes": 60
},
"SecuritySettings": {
"RequireSsl": true,
"MaxLoginAttempts": 5,
"LockoutDurationMinutes": 15
}
}
}
- Настройте SSL-сертификат (рекомендуется):
sudo apt install -y certbot
sudo certbot certonly --standalone -d your-domain.com
- Настройте Nginx в качестве обратного прокси:
Установите Nginx:
sudo apt install -y nginx
Создайте конфигурационный файл:
sudo nano /etc/nginx/sites-available/sparkyfitness
Добавьте следующую конфигурацию:
server {
listen 80;
server_name your-domain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
add_header Strict-Transport-Security "max-age=63072000" always;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $server_name;
# timeouts
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# Security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
}
Активируйте конфигурацию:
sudo ln -s /etc/nginx/sites-available/sparkyfitness /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Шаг 6: Запуск приложения
- Запустите приложение в режиме разработки для тестирования:
cd /opt/sparkyfitness/SparkyFitness
dotnet run
-
Проверьте доступность приложения по адресу https://your-domain.com
-
Для запуска в качестве службы создайте файл службы:
sudo nano /etc/systemd/system/sparkyfitness.service
Добавьте следующее содержимое:
[Unit]
Description=SparkyFitness
After=network.target postgresql.service
[Service]
Type=simple
User=sparkyfitness
WorkingDirectory=/opt/sparkyfitness/SparkyFitness
ExecStart=/usr/bin/dotnet /opt/sparkyfitness/SparkyFitness/SparkyFitness.dll
Restart=always
RestartSec=10
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=ASPNETCORE_URLS=http://localhost:5000
Environment=ASPNETCORE_Kestrel__Certificates__Default__Path=/etc/letsencrypt/live/your-domain.com/fullchain.pem
Environment=ASPNETCORE_Kestrel__Certificates__Default__Password=your-cert-password
[Install]
WantedBy=multi-user.target
- Запустите и включите службу:
sudo systemctl daemon-reload
sudo systemctl enable sparkyfitness
sudo systemctl start sparkyfitness
- Проверьте статус службы:
sudo systemctl status sparkyfitness
Метод 2: Установка через Docker
Шаг 1: Установка Docker
- Установите Docker:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
- Установите Docker Compose:
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
- Перезапустите сеанс для применения прав Docker:
exit
Шаг 2: Подготовка конфигурации
- Создайте директорию для SparkyFitness:
mkdir -p ~/sparkyfitness
cd ~/sparkyfitness
- Создайте файл конфигурации Docker Compose:
nano docker-compose.yml
Добавьте следующее содержимое:
version: '3.8'
services:
sparkyfitness:
image: sparkyfitness/sparkyfitness:0.16.4.0
container_name: sparkyfitness
restart: unless-stopped
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ASPNETCORE_URLS=http://+:5000
- ConnectionStrings__DefaultConnection=Host=postgres;Database=sparkyfitness;Username=sparky;Password=your_strong_password;
- AppSettings__AppUrl=https://your-domain.com
- AppSettings__Jwt__Key=your-super-secret-jwt-key-change-this
volumes:
- ./uploads:/app/uploads
- ./data:/app/data
depends_on:
- postgres
networks:
- sparkyfitness-network
postgres:
image: postgres:14
container_name: sparkyfitness-db
restart: unless-stopped
environment:
- POSTGRES_DB=sparkyfitness
- POSTGRES_USER=sparky
- POSTGRES_PASSWORD=your_strong_password
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- sparkyfitness-network
nginx:
image: nginx:alpine
container_name: sparkyfitness-nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
- ./logs/nginx:/var/log/nginx
depends_on:
- sparkyfitness
networks:
- sparkyfitness-network
networks:
sparkyfitness-network:
driver: bridge
volumes:
postgres_data:
- Создайте конфигурацию Nginx:
mkdir nginx
mkdir ssl
mkdir logs/nginx
nano nginx/nginx.conf
Добавьте следующее содержимое:
user nginx;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 1024;
multi_accept on;
use epoll;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Logging
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# Basic Settings
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
# Security
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# Gzip
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
upstream sparkyfitness {
server sparkyfitness:5000;
}
server {
listen 80;
server_name your-domain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
add_header Strict-Transport-Security "max-age=63072000" always;
location / {
proxy_pass http://sparkyfitness;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $server_name;
# Timeouts
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
}
- Получите SSL-сертификат:
sudo apt install -y certbot
sudo docker run --rm -v ~/sparkyfitness/ssl:/etc/letsencrypt -v ~/sparkyfitness/logs/letsencrypt:/var/log/letsencrypt certbot/certbot certonly --standalone -d your-domain.com
Шаг 3: Запуск приложения
- Запустите контейнеры:
docker-compose up -d
- Проверьте статус контейнеров:
docker-compose ps
- Проверьте логи:
docker-compose logs -f sparkyfitness
Настройка и использование
Первоначальная настройка
-
Откройте браузер и перейдите к доменному имени вашего сервера, где установлено SparkyFitness.
-
Создайте учетную запись администратора при первом запуске.
-
Войдите в систему с помощью созданной учетной записи.
-
Настройте базовые параметры приложения:
- Перейдите в "Administration" > "Settings"
- Укажите название приложения
- Настройте параметры по умолчанию для новых пользователей
- Укажите часовой пояс
- Сохраните изменения
Настройка профиля
-
Перейдите в раздел "Profile" (Профиль).
-
Заполните информацию о себе:
- Имя
- Электронная почта
- Пол
- Дата рождения
- Рост
- Текущий вес
- Целевой вес
- Уровень активности
- Цели по фитнесу (похудение, поддержание веса, набор массы)
-
Установите свои цели по калориям и нутриентах:
- Целевое количество калорий в день
- Целевое количество белков (в граммах)
- Целевое количество жиров (в граммах)
- Целевое количество углеводов (в граммах)
- Распределение калорий по приемам пищи
-
Настройте уведомления:
- Напоминания о приеме пищи
- Ежедневные отчеты
- Уведомления о достижении целей
-
Сохраните изменения.
Использование приложения
-
Добавление еды:
- Перейдите в раздел "Food" (Еда).
- Нажмите "Add Food" (Добавить еду).
- Выберите прием пищи (завтрак, обед, ужин, перекус и т.д.).
- Введите название продукта и выберите его из списка или создайте новый.
- Укажите количество порций.
- Сохраните запись.
-
Просмотр статистики:
- Перейдите в раздел "Statistics" (Статистика).
- Выберите период времени (день, неделя, месяц, год).
- Просмотрите графики потребления калорий и нутриентов.
- Анализируйте тренды изменения веса.
- Сравнивайте фактическое потребление с установленными целями.
-
Создание пользовательских продуктов:
- Перейдите в раздел "Food" (Еда).
- Нажмите "Add Custom Food" (Добавить пользовательскую еду).
- Введите название продукта, его nutritional information (калории, белки, жиры, углеводы).
- Прикрепите изображение продукта.
- Сохраните продукт.
-
Отслеживание веса:
- Перейдите в раздел "Weight" (Вес).
- Введите текущий вес и дату.
- Сохраните запись.
-
Планирование питания:
- Используйте функцию "Meal Planner" для планирования питания на неделю.
- Создавайте шаблоны приемов пищи для повторного использования.
- Экспортируйте планы питания.
-
Отчеты:
- Генерируйте отчеты о потреблении нутриентов.
- Экспортируйте данные в различных форматах (CSV, PDF).
- Создавайте пользовательские отчеты.
Интеграция с другими сервисами
Интеграция с Fitbit
-
Зарегистрируйте приложение в Fitbit Developer Portal:
- Перейдите на https://dev.fitbit.com/apps/new
- Заполните форму регистрации приложения
- Укажите redirect URI:
https://your-domain.com/Fitbit/Callback - Сохраните Client ID и Client Secret
-
Настройте интеграцию в SparkyFitness:
- Перейдите в раздел "Integrations" (Интеграции)
- Выберите "Fitbit"
- Введите Client ID и Client Secret
- Сохраните изменения
-
Авторизуйте подключение:
- Перейдите в раздел "Connected Devices"
- Нажмите "Connect to Fitbit"
- Следуйте инструкциям для авторизации
Интеграция с Apple Health
SparkyFitness поддерживает экспорт данных в Apple Health через экспорт в формате CSV:
-
Экспортируйте данные из SparkyFitness:
- Перейдите в раздел "Data Export" (Экспорт данных)
- Выберите период экспорта
- Нажмите "Export" (Экспорт)
-
Импортируйте данные в Apple Health:
- Откройте приложение Apple Health на вашем iPhone
- Перейдите в "Источник" > "Импорт"
- Выберите экспортированный файл CSV
Интеграция с Google Fit
-
Экспортируйте данные из SparkyFitness:
- Перейдите в раздел "Data Export" (Экспорт данных)
- Выберите период экспорта
- Нажмите "Export" (Экспорт)
-
Импортируйте данные в Google Fit:
- Откройте приложение Google Fit на вашем Android-устройстве
- Перейдите в "Профиль" > "Настройки"
- Выберите "Импорт данных"
- Выберите экспортированный файл CSV
Интеграция с Garmin Connect
-
Зарегистрируйте приложение в Garmin Developer Portal:
- Перейдите на https://developer.garmin.com/
- Создайте учетную запись и приложение
- Сохраните Client ID и Client Secret
-
Настройте интеграцию в SparkyFitness:
- Перейдите в раздел "Integrations" (Интеграции)
- Выберите "Garmin"
- Введите Client ID и Client Secret
- Сохраните изменения
-
Авторизуйте подключение:
- Перейдите в раздел "Connected Devices"
- Нажмите "Connect to Garmin"
- Следуйте инструкциям для авторизации
Интеграция с API для кастомных решений
SparkyFitness предоставляет REST API для интеграции с другими системами:
-
Включите API в настройках:
- Перейдите в "Administration" > "API"
- Включите "Enable API"
- Настройте токены доступа
-
Пример использования API для получения статистики:
curl -X GET "https://your-domain.com/api/statistics/daily?date=2023-05-15" \
-H "Authorization: Bearer your_api_token"
- Документация API доступна по адресу:
https://your-domain.com/api/docs
Обновление и обслуживание
Обновление SparkyFitness
Для ручной установки:
- Сделайте резервную копию базы данных:
sudo -u postgres pg_dump sparkyfitness > /opt/sparkyfitness/backup/sparkyfitness-$(date +%Y%m%d).sql
- Остановите службу SparkyFitness:
sudo systemctl stop sparkyfitness
- Скачайте новую версию:
cd /opt/sparkyfitness
wget https://github.com/SparkyFI/SparkyFitness/releases/download/v0.16.4.0/SparkyFitness-v0.16.4.0.zip
- Распакуйте архив:
unzip SparkyFitness-v0.16.4.0.zip
rm -rf SparkyFitness
mv SparkyFitness-v0.16.4.0 SparkyFitness
- Обновите базу данных:
cd /opt/sparkyfitness/SparkyFitness
dotnet ef database update
- Запустите службу:
sudo systemctl start sparkyfitness
- Проверьте статус приложения:
sudo systemctl status sparkyfitness
Для Docker установки:
- Сделайте резервную копию базы данных:
cd ~/sparkyfitness
docker exec sparkyfitness-db pg_dump -U sparky sparkyfitness > backup/sparkyfitness-$(date +%Y%m%d).sql
- Остановите контейнеры:
docker-compose down
- Обновите образ SparkyFitness:
docker-compose pull sparkyfitness
- Запустите контейнеры:
docker-compose up -d
- Проверьте статус:
docker-compose ps
Обновление базы данных
- Сделайте резервную копию базы данных:
sudo -u postgres pg_dump sparkyfitness > /opt/sparkyfitness/backup/sparkyfitness-$(date +%Y%m%d).sql
- Обновите схему базы данных:
cd /opt/sparkyfitness/SparkyFitness
dotnet ef database update
Регулярное обслуживание
- Настройте автоматическое резервное копирование базы данных:
sudo nano /etc/cron.daily/sparkyfitness-backup
Добавьте следующий скрипт:
#!/bin/bash
BACKUP_DIR="/opt/sparkyfitness/backup"
DATE=$(date +%Y%m%d)
sudo -u postgres pg_dump sparkyfitness > $BACKUP_DIR/sparkyfitness-$DATE.sql
find $BACKUP_DIR -name "sparkyfitness-*.sql" -mtime +30 -delete
- Сделайте скрипт исполняемым:
sudo chmod +x /etc/cron.daily/sparkyfitness-backup
-
Настройте мониторинг приложения с помощью Prometheus и Grafana:
- Установите Prometheus:
sudo apt install -y prometheus -
Настройте сбор метрик SparkyFitness:
sudo nano /etc/prometheus/prometheus.yml
Добавьте следующую конфигурацию:
scrape_configs:
- job_name: 'sparkyfitness'
static_configs:
- targets: ['localhost:5000']
scrape_interval: 15s
metrics_path: '/metrics'
scheme: 'http'
-
Установите Grafana:
sudo apt install -y grafana sudo systemctl start grafana-server sudo systemctl enable grafana-server -
Импортируйте дашборд для SparkyFitness:
- Откройте Grafana в браузере по адресу http://your-server-ip:3000
- Войдите с учетными данными по умолчанию (admin/admin)
- Перейдите в "Dashboards" > "Import"
- Импортируйте дашборд с ID 12345
Оптимизация производительности
-
Настройте кэширование:
- Установите Redis:
sudo apt install -y redis-server- Настройте Redis для SparkyFitness:
sudo nano /opt/sparkyfitness/SparkyFitness/appsettings.json
Добавьте следующую конфигурацию:
"CacheSettings": {
"Provider": "Redis",
"RedisConnectionString": "localhost:6379",
"InstanceName": "SparkyFitness",
"DefaultExpiration": "00:30:00"
}
-
Оптимизируйте изображения:
- Установите ImageSharp:
cd /opt/sparkyfitness/SparkyFitness dotnet add package SixLabors.ImageSharp dotnet add package SixLabors.ImageSharp.Web -
Настройте сжатие:
- Отредактируйте конфигурацию Nginx:
sudo nano /etc/nginx/sites-available/sparkyfitness
Добавьте параметры сжатия:
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;
Устранение неполадок
Проблема: Приложение не запускается
- Проверьте статус службы:
sudo systemctl status sparkyfitness
- Посмотрите логи службы:
sudo journalctl -u sparkyfitness -f
- Проверьте конфигурацию приложения:
nano /opt/sparkyfitness/SparkyFitness/appsettings.json
- Проверьте подключение к базе данных:
sudo -u postgres psql -d sparkyfitness
- Проверьте зависимости:
dotnet --list-sdks
dotnet --list-runtimes
Проблема: Ошибки подключения к базе данных
- Проверьте конфигурацию подключения в
appsettings.json:
{
"ConnectionStrings": {
"DefaultConnection": "Host=localhost;Database=sparkyfitness;Username=sparky;Password=your_strong_password;"
}
}
- Проверьте, работает ли PostgreSQL:
sudo systemctl status postgresql
- Проверьте права доступа пользователя к базе данных:
sudo -u postgres psql -c "\du"
- Проверьте логи PostgreSQL:
sudo tail -f /var/log/postgresql/postgresql-13-main.log
- Проверьте свободное место в базе данных:
sudo -u postgres psql -c "SELECT pg_size_pretty(pg_database_size('sparkyfitness'));"
Проблема: Ошибки SSL-сертификата
- Проверьте срок действия сертификата:
sudo certbot certificates
- Обновите сертификат:
sudo certbot renew --dry-run
- Перезапустите Nginx:
sudo systemctl reload nginx
- Проверьте конфигурацию SSL:
sudo nginx -t
Проблема: Ошибки загрузки файлов
- Проверьте права доступа к директории загрузки:
ls -la /opt/sparkyfitness/SparkyFitness/uploads
- Установите правильные права:
sudo chown sparkyfitness:sparkyfitness /opt/sparkyfitness/SparkyFitness/uploads
sudo chmod 755 /opt/sparkyfitness/SparkyFitness/uploads
- Проверьте настройку Nginx для загрузки файлов:
sudo nano /etc/nginx/sites-available/sparkyfitness
Убедитесь, что есть конфигурация:
client_max_body_size 10M;
Проблема: Высокое использование памяти
- Проверьте использование памяти:
free -h
- Проверьте использование памяти приложением:
sudo systemctl status sparkyfitness
- Проверьте логи на предмет ошибок памяти:
sudo journalctl -u sparkyfitness -f | grep -i memory
- Оптимизируйте использование памяти:
- Уменьшите размер пула соединений с базой данных
- Настройте кэширование
- Оптимизируйте запросы к базе данных
Проблема: Медленная производительность
- Проверьте нагрузку на систему:
top
htop
- Проверьте использование CPU:
mpstat 1 5
- Проверьте запросы к базе данных:
sudo -u postgres psql -d sparkyfitness -c "SELECT query, calls, total_time, mean_time FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10;"
- Оптимизируйте производительность:
- Включите кэширование запросов
- Оптимизируйте индексы базы данных
- Настройьте пул соединений
Проблема: Ошибки аутентификации
- Проверьте конфигурацию JWT:
nano /opt/sparkyfitness/SparkyFitness/appsettings.json
- Проверьте системные логи:
sudo journalctl -u sparkyfitness -f | grep -i auth
- Проверьте настройки безопасности:
nano /opt/sparkyfitness/SparkyFitness/appsettings.json
Убедитесь, что секция безопасности правильно настроена:
"SecuritySettings": {
"RequireSsl": true,
"MaxLoginAttempts": 5,
"LockoutDurationMinutes": 15
}
Заключение
SparkyFitness — это мощная альтернатива MyFitnessPal с возможностью самостоятельного хостинга. В этом руководстве мы подробно рассмотрели процесс установки, настройки и использования приложения, а также интеграцию с другими сервисами и обновление системы.
С помощью SparkyFitness вы можете полностью контролировать свои данные по питанию и фитнесу, не полагаясь на сторонние сервисы. Регулярное обновление и обслуживание приложения обеспечит его стабильную работу в долгосрочной перспективе.
При возникновении проблем обратитесь к разделу "Устранение неполадок" или воспользуйтесь официальной документацией проекта на GitHub.
Дополнительную информацию и исходный код можно найти на GitHub-репозитории проекта.