kilyabin b1f892ca7d perf: оптимизация памяти - кэширование только текущей недели и условный парсинг Критические оптимизации для снижения потребления памяти с 1.2 ГБ: - Кэширование только текущей недели: * Кэш хранит только текущие недели (без параметра wk) * Запросы с конкретной неделей (wk указан) не кэшируются * Ключ кэша изменен с ${group}_${wk} на group * Уменьшен maxCacheSize с 100 до 50 записей - Условный парсинг навигации по неделям: * Парсинг навигации выполняется только если weekNavigationEnabled === true * Если навигация выключена, parseWeekNavigation не вызывается * Экономит память и CPU при выключенной навигации * Параметр shouldParseWeekNavigation передается через getSchedule -> parsePage - Результат: * Значительное снижение потребления памяти * Кэш содержит только актуальные данные (текущие недели) * Парсинг навигации выполняется только при необходимости Измененные файлы: - src/pages/[group].tsx - логика кэширования только текущей недели - src/app/agregator/schedule.ts - параметр для условного парсинга - src/app/parser/schedule.ts - условный вызов parseWeekNavigation
Критические оптимизации для снижения потребления памяти

- Кэширование только текущей недели:
  * Кэш хранит только текущие недели (без параметра wk)
  * Запросы с конкретной неделей (wk указан) не кэшируются
  * Ключ кэша изменен с `${group}_${wk}` на `group`
  * Уменьшен maxCacheSize с 100 до 50 записей

- Условный парсинг навигации по неделям:
  * Парсинг навигации выполняется только если weekNavigationEnabled === true
  * Если навигация выключена, parseWeekNavigation не вызывается
  * Экономит память и CPU при выключенной навигации
  * Параметр shouldParseWeekNavigation передается через getSchedule -> parsePage

- Результат:
  * Значительное снижение потребления памяти
  * Кэш содержит только актуальные данные (текущие недели)
  * Парсинг навигации выполняется только при необходимости

Измененные файлы:
- src/pages/[group].tsx - логика кэширования только текущей недели
- src/app/agregator/schedule.ts - параметр для условного парсинга
- src/app/parser/schedule.ts - условный вызов parseWeekNavigation
2025-11-23 02:38:09 +04:00
2025-11-18 04:13:20 +04:00
perf: оптимизация памяти - кэширование только текущей недели и условный парсинг Критические оптимизации для снижения потребления памяти с 1.2 ГБ: - Кэширование только текущей недели: * Кэш хранит только текущие недели (без параметра wk) * Запросы с конкретной неделей (wk указан) не кэшируются * Ключ кэша изменен с ${group}_${wk} на group * Уменьшен maxCacheSize с 100 до 50 записей - Условный парсинг навигации по неделям: * Парсинг навигации выполняется только если weekNavigationEnabled === true * Если навигация выключена, parseWeekNavigation не вызывается * Экономит память и CPU при выключенной навигации * Параметр shouldParseWeekNavigation передается через getSchedule -> parsePage - Результат: * Значительное снижение потребления памяти * Кэш содержит только актуальные данные (текущие недели) * Парсинг навигации выполняется только при необходимости Измененные файлы: - src/pages/[group].tsx - логика кэширования только текущей недели - src/app/agregator/schedule.ts - параметр для условного парсинга - src/app/parser/schedule.ts - условный вызов parseWeekNavigation
2025-11-23 02:38:09 +04:00
2025-11-18 04:23:31 +04:00
2023-10-01 20:18:37 +04:00
2025-11-18 04:13:20 +04:00
2023-10-01 18:53:04 +04:00
2025-11-18 03:36:47 +04:00
2025-11-18 03:57:22 +04:00
2025-11-18 03:57:22 +04:00
2023-10-15 01:01:34 +04:00
2023-10-01 18:53:04 +04:00
perf: оптимизация памяти - кэширование только текущей недели и условный парсинг Критические оптимизации для снижения потребления памяти с 1.2 ГБ: - Кэширование только текущей недели: * Кэш хранит только текущие недели (без параметра wk) * Запросы с конкретной неделей (wk указан) не кэшируются * Ключ кэша изменен с ${group}_${wk} на group * Уменьшен maxCacheSize с 100 до 50 записей - Условный парсинг навигации по неделям: * Парсинг навигации выполняется только если weekNavigationEnabled === true * Если навигация выключена, parseWeekNavigation не вызывается * Экономит память и CPU при выключенной навигации * Параметр shouldParseWeekNavigation передается через getSchedule -> parsePage - Результат: * Значительное снижение потребления памяти * Кэш содержит только актуальные данные (текущие недели) * Парсинг навигации выполняется только при необходимости Измененные файлы: - src/pages/[group].tsx - логика кэширования только текущей недели - src/app/agregator/schedule.ts - параметр для условного парсинга - src/app/parser/schedule.ts - условный вызов parseWeekNavigation
2025-11-23 02:38:09 +04:00

Schedule for колледж связи пгути

Reskin of https://lk.ks.psuti.ru/ since it lacks mobile support.

Screenshot

Screenshot

Visit website

Tech stack & features

  • React 19.2.0 with Next.js 16.0.3 (pages router)
  • Tailwind CSS
  • @shadcn/ui components (built with Radix UI)
  • JSDOM for parsing scraped pages, rehydration strategy for cache
  • TypeScript 5.6.0 with types for each package
  • Telegram Bot API (via [node-telegram-bot-api]) for parsing failure notifications
  • Custom js parser for teachers' photos
  • Accessability & tab navigation support
  • Dark theme with automatic switching based on system settings

Tools used: pnpm, eslint, react-icons. Deployed with Netlify and supported by Cloudflare.

Known issues

  • Previous week cannot be accessed if you enter from main "/" Workaround: Locate to next week, then enter previous twice.

Development

Prerequisites

  • Node.js 20+ (see .nvmrc)
  • npm 10+ or pnpm

Local development

# Install dependencies
npm install
# or
pnpm install

# Run development server
npm run dev
# or
pnpm dev

Docker deployment

Build and run with Docker

# Build the image
docker build -t kspguti-schedule .

# Run the container
docker run -p 3000:3000 kspguti-schedule

Using Docker Compose

# Build and start
docker-compose up -d

# View logs
docker-compose logs -f

# Stop
docker-compose down

Environment variables: Edit docker-compose.yml to add your environment variables:

  • PROXY_URL - URL for schedule parsing
  • PARSING_FAILURE_NOTIFICATIONS_TELEGRAM_BOTAPI_TOKEN - Telegram bot token
  • PARSING_FAILURE_NOTIFICATIONS_TELEGRAM_CHAT_ID - Telegram chat ID

Production deployment

Netlify

The project includes netlify.toml for automatic deployment configuration.

Docker

The Dockerfile uses Next.js standalone output for optimized production builds. The image includes:

  • Multi-stage build for smaller image size
  • Non-root user for security
  • Health checks
  • Production optimizations

System installation (Linux systemd)

Install the application directly on a Linux system as a systemd service:

Prerequisites:

  • Linux system with systemd
  • Node.js 20+ installed
  • Root/sudo access
  • ICU library (for Node.js):
    • Arch Linux: sudo pacman -S icu
    • Ubuntu/Debian: sudo apt-get install libicu-dev
    • Fedora/RHEL/CentOS: sudo dnf install libicu or sudo yum install libicu

Installation:

# Clone the repository
git clone <repository-url>
cd kspguti-schedule
# Copy example and edit .env
cp .env.production.example .env
nano .env
# Run the installation script
sudo ./scripts/install.sh

The installation script will:

  • Check Node.js and npm versions
  • Copy files to /opt/kspguti-schedule
  • Install dependencies
  • Build the production version
  • Install and enable systemd service

Configuration:

  1. Edit environment variables:
sudo nano /opt/kspguti-schedule/.env

The installation script will:

  • Copy .env file from source directory if it exists
  • Preserve existing .env in installation directory if it already exists
  • Create .env from .env.production.example if no .env file is found
  1. Update systemd service if needed:
sudo nano /etc/systemd/system/kspguti-schedule.service

Managing the service:

Use the management script for easy service control:

# Start the service
sudo ./scripts/manage.sh start

# Stop the service
sudo ./scripts/manage.sh stop

# Restart the service
sudo ./scripts/manage.sh restart

# Check status
./scripts/manage.sh status

# View logs
./scripts/manage.sh logs
./scripts/manage.sh logs -f  # Follow logs

# Update application
sudo ./scripts/manage.sh update

# Enable/disable autostart
sudo ./scripts/manage.sh enable
sudo ./scripts/manage.sh disable

Or use systemctl directly:

sudo systemctl start kspguti-schedule
sudo systemctl stop kspguti-schedule
sudo systemctl restart kspguti-schedule
sudo systemctl status kspguti-schedule
sudo journalctl -u kspguti-schedule -f

Service configuration:

  • Installation directory: /opt/kspguti-schedule
  • Service user: www-data
  • Port: 3000 (configurable via environment variables)
  • Logs: journalctl -u kspguti-schedule

Environment variables:

See .env.production.example or .example.env for available options. The application uses .env file in production:

  • PROXY_URL - URL for schedule parsing (optional)
  • PARSING_FAILURE_NOTIFICATIONS_TELEGRAM_BOTAPI_TOKEN - Telegram bot token (optional)
  • PARSING_FAILURE_NOTIFICATIONS_TELEGRAM_CHAT_ID - Telegram chat ID (optional)

Other platforms

The project can be deployed to any platform supporting Node.js 20+:

  • Vercel
  • Railway
  • DigitalOcean App Platform
  • AWS App Runner
  • Any Docker-compatible platform
Description
No description provided
Readme AGPL-3.0 1.7 MiB
Languages
TypeScript 81.4%
JavaScript 11.7%
Shell 5.1%
CSS 1.2%
Dockerfile 0.5%
Other 0.1%