punimtag/viewer-frontend/scripts/install-dependencies.sh
Tanya ff47c87e41
Some checks failed
CI / skip-ci-check (pull_request) Successful in 1m4s
CI / lint-and-type-check (pull_request) Has been cancelled
CI / python-lint (pull_request) Has been cancelled
CI / test-backend (pull_request) Has been cancelled
CI / build (pull_request) Has been cancelled
CI / secret-scanning (pull_request) Has been cancelled
CI / dependency-scan (pull_request) Has been cancelled
CI / sast-scan (pull_request) Has been cancelled
CI / workflow-summary (pull_request) Has been cancelled
feat: web video transcoding, admin playback, and viewer fixes
Add on-demand H.264/AAC web playback (RQ, ffmpeg) with API routes and
Next.js proxies; extend admin UI with WebPlaybackVideo and shared hooks.
Store transcode cache beside pending-photos (WEB_VIDEO_CACHE_DIR / UPLOAD_DIR)
and ignore data/web_videos. Centralize FastAPI URL helpers, optional Vite
and Next base paths for subfolder deploy, and fix modal reopen by using
router.replace when closing the home photo viewer. Include migration,
install scripts, deployment doc updates, and CI admin build env tweak.

Made-with: Cursor
2026-03-25 15:33:05 -04:00

228 lines
7.3 KiB
Bash
Executable File

#!/bin/bash
# Install Dependencies Script
# This script installs all required dependencies for the PunimTag Photo Viewer
# including npm packages, system dependencies, and Prisma clients
set -e # Exit on error
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
cd "$PROJECT_DIR"
echo "🚀 Installing PunimTag Photo Viewer Dependencies"
echo "================================================"
echo ""
# Check Node.js version
echo "📋 Checking Node.js version..."
NODE_VERSION=$(node --version | cut -d'v' -f2 | cut -d'.' -f1)
if [ "$NODE_VERSION" -lt 20 ]; then
echo "⚠️ Warning: Node.js 20+ is recommended (found v$NODE_VERSION)"
echo " Consider upgrading: nvm install 20 && nvm use 20"
read -p "Continue anyway? (y/N) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
else
echo "✅ Node.js version: $(node --version)"
fi
echo ""
# Check for system dependencies
echo "📦 Checking system dependencies..."
MISSING_DEPS=()
# Check for libvips (optional but recommended)
if ! command -v vips &> /dev/null && ! dpkg -l | grep -q libvips-dev; then
echo "⚠️ libvips-dev not found (optional, for image watermarking)"
MISSING_DEPS+=("libvips-dev")
fi
# Check for FFmpeg (optional)
if ! command -v ffmpeg &> /dev/null; then
echo "⚠️ FFmpeg not found (optional, for video thumbnails)"
MISSING_DEPS+=("ffmpeg")
fi
if [ ${#MISSING_DEPS[@]} -gt 0 ]; then
echo ""
echo "Optional system dependencies not installed:"
for dep in "${MISSING_DEPS[@]}"; do
echo " - $dep"
done
echo ""
read -p "Install optional dependencies? (y/N) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo "Installing system dependencies..."
if command -v apt-get &> /dev/null; then
sudo apt-get update
for dep in "${MISSING_DEPS[@]}"; do
if [ "$dep" = "libvips-dev" ]; then
sudo apt-get install -y libvips-dev
elif [ "$dep" = "ffmpeg" ]; then
sudo apt-get install -y ffmpeg
fi
done
elif command -v dnf &> /dev/null; then
for dep in "${MISSING_DEPS[@]}"; do
if [ "$dep" = "ffmpeg" ]; then
echo "Installing ffmpeg with dnf..."
echo "Note: On EL8 (Alma/Rocky/CentOS), ffmpeg may require RPM Fusion repos."
echo ""
if sudo dnf -y install ffmpeg; then
echo "✅ ffmpeg installed"
else
echo ""
echo "⚠️ dnf couldn't find ffmpeg."
echo " If this is EL8, run the helper installer from the repo root:"
echo " sudo bash ../../scripts/install_ffmpeg_el8_rpmfusion.sh"
echo ""
fi
fi
done
elif command -v brew &> /dev/null; then
for dep in "${MISSING_DEPS[@]}"; do
if [ "$dep" = "libvips-dev" ]; then
brew install vips
elif [ "$dep" = "ffmpeg" ]; then
brew install ffmpeg
fi
done
else
echo "⚠️ Please install dependencies manually for your system"
fi
fi
else
echo "✅ All system dependencies found"
fi
echo ""
# Install npm dependencies
echo "📦 Installing npm dependencies..."
npm install
echo "✅ npm dependencies installed"
echo ""
# Install build tools for Sharp (if needed)
if [ -d "node_modules/sharp" ]; then
echo "🔧 Setting up Sharp image processing library..."
# Check if Sharp can load
if node -e "try { require('sharp'); console.log('OK'); } catch(e) { console.log('FAIL'); process.exit(1); }" 2>/dev/null; then
echo "✅ Sharp is working correctly"
else
echo "⚠️ Sharp needs additional setup..."
# Install build dependencies if not present
if ! npm list node-gyp &> /dev/null; then
echo " Installing node-gyp..."
npm install --save-dev node-gyp
fi
if ! npm list node-addon-api &> /dev/null; then
echo " Installing node-addon-api..."
npm install --save-dev node-addon-api
fi
# Try to rebuild Sharp
echo " Attempting to rebuild Sharp..."
npm rebuild sharp || echo " ⚠️ Sharp rebuild failed, but wrapper script will handle library path"
fi
echo ""
fi
# Verify Sharp wrapper script exists
if [ ! -f "scripts/with-sharp-libpath.sh" ]; then
echo "📝 Creating Sharp library path wrapper script..."
cat > scripts/with-sharp-libpath.sh << 'EOF'
#!/bin/bash
# Helper script to set LD_LIBRARY_PATH for Sharp before running commands
# This ensures Sharp can find its bundled libvips library
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
SHARP_LIB_PATH="$PROJECT_DIR/node_modules/sharp/node_modules/@img/sharp-libvips-linux-x64/lib"
if [ -d "$SHARP_LIB_PATH" ]; then
export LD_LIBRARY_PATH="$SHARP_LIB_PATH:${LD_LIBRARY_PATH:-}"
exec "$@"
else
echo "Warning: Sharp libvips library not found at $SHARP_LIB_PATH"
echo "Sharp image processing may not work correctly."
exec "$@"
fi
EOF
chmod +x scripts/with-sharp-libpath.sh
echo "✅ Sharp wrapper script created"
echo ""
fi
# Generate Prisma clients
echo "🔧 Generating Prisma clients..."
if [ -f "prisma/schema.prisma" ]; then
npm run prisma:generate
echo "✅ Main Prisma client generated"
else
echo "⚠️ prisma/schema.prisma not found, skipping Prisma generation"
fi
if [ -f "prisma/schema-auth.prisma" ]; then
npm run prisma:generate:auth
echo "✅ Auth Prisma client generated"
fi
echo ""
# Check for .env file
if [ ! -f ".env" ]; then
echo "⚠️ .env file not found"
echo " Please create a .env file with the following variables:"
echo " - DATABASE_URL"
echo " - DATABASE_URL_AUTH (optional)"
echo " - NEXTAUTH_SECRET"
echo " - NEXTAUTH_URL"
echo ""
else
echo "✅ .env file found"
fi
echo ""
# Test Sharp if available
echo "🧪 Testing Sharp library..."
if node -e "
const path = require('path');
const libPath = path.join(__dirname, 'node_modules/sharp/node_modules/@img/sharp-libvips-linux-x64/lib');
process.env.LD_LIBRARY_PATH = libPath + ':' + (process.env.LD_LIBRARY_PATH || '');
try {
const sharp = require('sharp');
console.log('✅ Sharp loaded successfully');
console.log(' Version:', require('sharp/package.json').version);
console.log(' libvips:', sharp.versions.vips);
} catch(e) {
console.log('⚠️ Sharp not available:', e.message.split('\n')[0]);
console.log(' Image watermarking will be disabled');
console.log(' The wrapper script will handle this at runtime');
}
" 2>/dev/null; then
echo ""
else
echo "⚠️ Sharp test failed, but wrapper script will handle it at runtime"
echo ""
fi
echo "================================================"
echo "✅ Dependency installation complete!"
echo ""
echo "Next steps:"
echo "1. Configure your .env file with database connection strings"
echo "2. Run 'npm run dev' to start the development server"
echo "3. Run 'npm run check:permissions' to verify database access"
echo ""