Spaces:
Sleeping
Sleeping
Commit
·
6c18509
1
Parent(s):
62d7668
add: huggingface docker
Browse files- Dockerfile.hf +44 -0
- README-HF.md +178 -0
- deploy-hf.sh +37 -0
- docker-compose.hf.yml +44 -0
- nginx.hf.conf +64 -0
Dockerfile.hf
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Stage 1: Build stage
|
| 2 |
+
FROM node:18-alpine AS builder
|
| 3 |
+
|
| 4 |
+
# Set working directory
|
| 5 |
+
WORKDIR /app
|
| 6 |
+
|
| 7 |
+
# Copy package files
|
| 8 |
+
COPY package*.json ./
|
| 9 |
+
|
| 10 |
+
# Install dependencies
|
| 11 |
+
RUN npm ci --only=production=false
|
| 12 |
+
|
| 13 |
+
# Copy source code
|
| 14 |
+
COPY . .
|
| 15 |
+
|
| 16 |
+
# Build the application
|
| 17 |
+
RUN npm run build
|
| 18 |
+
|
| 19 |
+
# Stage 2: Production stage for Hugging Face Spaces
|
| 20 |
+
FROM nginx:alpine AS production
|
| 21 |
+
|
| 22 |
+
# Install wget for healthcheck
|
| 23 |
+
RUN apk add --no-cache wget
|
| 24 |
+
|
| 25 |
+
# Copy built application from builder stage
|
| 26 |
+
COPY --from=builder /app/dist /usr/share/nginx/html
|
| 27 |
+
|
| 28 |
+
# Copy custom nginx configuration for HF Spaces
|
| 29 |
+
COPY nginx.hf.conf /etc/nginx/nginx.conf
|
| 30 |
+
|
| 31 |
+
# Create nginx directories with proper permissions
|
| 32 |
+
RUN mkdir -p /var/cache/nginx/client_temp \
|
| 33 |
+
/var/cache/nginx/proxy_temp \
|
| 34 |
+
/var/cache/nginx/fastcgi_temp \
|
| 35 |
+
/var/cache/nginx/uwsgi_temp \
|
| 36 |
+
/var/cache/nginx/scgi_temp && \
|
| 37 |
+
chown -R nginx:nginx /var/cache/nginx && \
|
| 38 |
+
chmod -R 755 /var/cache/nginx
|
| 39 |
+
|
| 40 |
+
# Expose port 7860 (required by Hugging Face Spaces)
|
| 41 |
+
EXPOSE 7860
|
| 42 |
+
|
| 43 |
+
# Start nginx on port 7860
|
| 44 |
+
CMD ["nginx", "-g", "daemon off;"]
|
README-HF.md
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Hugging Face Spaces Deployment Guide
|
| 2 |
+
|
| 3 |
+
This guide explains how to deploy your Invoice Generator application to Hugging Face Spaces.
|
| 4 |
+
|
| 5 |
+
## Prerequisites
|
| 6 |
+
|
| 7 |
+
- Hugging Face account
|
| 8 |
+
- Git installed locally
|
| 9 |
+
- Application built and tested locally
|
| 10 |
+
|
| 11 |
+
## Quick Start
|
| 12 |
+
|
| 13 |
+
### 1. Test Locally with HF Configuration
|
| 14 |
+
|
| 15 |
+
First, test your application with the Hugging Face Spaces configuration:
|
| 16 |
+
|
| 17 |
+
```bash
|
| 18 |
+
# Make the deployment script executable
|
| 19 |
+
chmod +x deploy-hf.sh
|
| 20 |
+
|
| 21 |
+
# Deploy locally using HF configuration
|
| 22 |
+
./deploy-hf.sh
|
| 23 |
+
```
|
| 24 |
+
|
| 25 |
+
Your app will be available at `http://localhost:7860`
|
| 26 |
+
|
| 27 |
+
### 2. Create a New Space on Hugging Face
|
| 28 |
+
|
| 29 |
+
1. Go to https://huggingface.co/new-space
|
| 30 |
+
2. Choose a name for your space
|
| 31 |
+
3. Set the **SDK** to `Docker`
|
| 32 |
+
4. Set visibility (Public/Private)
|
| 33 |
+
5. Click "Create Space"
|
| 34 |
+
|
| 35 |
+
### 3. Prepare Files for Upload
|
| 36 |
+
|
| 37 |
+
You need to upload these files to your Hugging Face Space:
|
| 38 |
+
|
| 39 |
+
**Required Files:**
|
| 40 |
+
- `Dockerfile` (rename `Dockerfile.hf` to `Dockerfile`)
|
| 41 |
+
- `nginx.hf.conf`
|
| 42 |
+
- `package.json`
|
| 43 |
+
- `package-lock.json`
|
| 44 |
+
- `index.html`
|
| 45 |
+
- `script.js`
|
| 46 |
+
- `style.css`
|
| 47 |
+
- `.dockerignore`
|
| 48 |
+
|
| 49 |
+
**Optional Files:**
|
| 50 |
+
- `README.md` (Space description)
|
| 51 |
+
- Any other assets your app needs
|
| 52 |
+
|
| 53 |
+
### 4. Upload to Hugging Face Spaces
|
| 54 |
+
|
| 55 |
+
#### Option A: Web Interface
|
| 56 |
+
1. Go to your newly created Space
|
| 57 |
+
2. Click "Files" tab
|
| 58 |
+
3. Upload all required files
|
| 59 |
+
4. Rename `Dockerfile.hf` to `Dockerfile`
|
| 60 |
+
|
| 61 |
+
#### Option B: Git (Recommended)
|
| 62 |
+
```bash
|
| 63 |
+
# Clone your space repository
|
| 64 |
+
git clone https://huggingface.co/spaces/YOUR_USERNAME/YOUR_SPACE_NAME
|
| 65 |
+
cd YOUR_SPACE_NAME
|
| 66 |
+
|
| 67 |
+
# Copy required files
|
| 68 |
+
cp ../path/to/your/project/Dockerfile.hf ./Dockerfile
|
| 69 |
+
cp ../path/to/your/project/nginx.hf.conf ./
|
| 70 |
+
cp ../path/to/your/project/package*.json ./
|
| 71 |
+
cp ../path/to/your/project/index.html ./
|
| 72 |
+
cp ../path/to/your/project/script.js ./
|
| 73 |
+
cp ../path/to/your/project/style.css ./
|
| 74 |
+
cp ../path/to/your/project/.dockerignore ./
|
| 75 |
+
|
| 76 |
+
# Commit and push
|
| 77 |
+
git add .
|
| 78 |
+
git commit -m "Initial deployment of Invoice Generator"
|
| 79 |
+
git push
|
| 80 |
+
```
|
| 81 |
+
|
| 82 |
+
### 5. Configure Space Settings
|
| 83 |
+
|
| 84 |
+
In your Space settings, ensure:
|
| 85 |
+
- **SDK**: Docker
|
| 86 |
+
- **Port**: 7860 (automatically detected)
|
| 87 |
+
- **Hardware**: CPU Basic (or upgrade if needed)
|
| 88 |
+
|
| 89 |
+
## File Structure for Hugging Face Spaces
|
| 90 |
+
|
| 91 |
+
```
|
| 92 |
+
your-space/
|
| 93 |
+
├── Dockerfile # Renamed from Dockerfile.hf
|
| 94 |
+
├── nginx.hf.conf # Nginx config for port 7860
|
| 95 |
+
├── package.json # Node.js dependencies
|
| 96 |
+
├── package-lock.json # Locked versions
|
| 97 |
+
├── index.html # Main HTML file
|
| 98 |
+
├── script.js # JavaScript code
|
| 99 |
+
├── style.css # Styles
|
| 100 |
+
├── .dockerignore # Docker ignore rules
|
| 101 |
+
└── README.md # Space description (optional)
|
| 102 |
+
```
|
| 103 |
+
|
| 104 |
+
## Key Differences from Standard Deployment
|
| 105 |
+
|
| 106 |
+
### Port Configuration
|
| 107 |
+
- **Standard**: Port 80/8080
|
| 108 |
+
- **Hugging Face Spaces**: Port 7860 (required)
|
| 109 |
+
|
| 110 |
+
### Dockerfile Changes
|
| 111 |
+
- Uses `Dockerfile.hf` which configures nginx for port 7860
|
| 112 |
+
- Includes `wget` for health checks
|
| 113 |
+
- Exposes port 7860
|
| 114 |
+
|
| 115 |
+
### Nginx Configuration
|
| 116 |
+
- `nginx.hf.conf` listens on port 7860
|
| 117 |
+
- Includes health check endpoint at `/health`
|
| 118 |
+
- Optimized for Hugging Face Spaces environment
|
| 119 |
+
|
| 120 |
+
## Troubleshooting
|
| 121 |
+
|
| 122 |
+
### Build Failures
|
| 123 |
+
1. Check that all required files are uploaded
|
| 124 |
+
2. Verify `package.json` has all dependencies
|
| 125 |
+
3. Check Dockerfile syntax
|
| 126 |
+
|
| 127 |
+
### Runtime Issues
|
| 128 |
+
1. Check Space logs in the Hugging Face interface
|
| 129 |
+
2. Ensure port 7860 is properly configured
|
| 130 |
+
3. Verify nginx configuration
|
| 131 |
+
|
| 132 |
+
### Common Issues
|
| 133 |
+
|
| 134 |
+
**Issue**: Space shows "Building" for too long
|
| 135 |
+
**Solution**: Check for missing dependencies in package.json
|
| 136 |
+
|
| 137 |
+
**Issue**: Application not accessible
|
| 138 |
+
**Solution**: Verify nginx is listening on port 7860, not 80
|
| 139 |
+
|
| 140 |
+
**Issue**: Static files not loading
|
| 141 |
+
**Solution**: Check file paths and nginx static file configuration
|
| 142 |
+
|
| 143 |
+
## Health Check
|
| 144 |
+
|
| 145 |
+
Your deployed Space will have a health check endpoint at:
|
| 146 |
+
```
|
| 147 |
+
https://YOUR_USERNAME-YOUR_SPACE_NAME.hf.space/health
|
| 148 |
+
```
|
| 149 |
+
|
| 150 |
+
## Production Considerations
|
| 151 |
+
|
| 152 |
+
### Performance
|
| 153 |
+
- Consider upgrading to CPU/GPU hardware if needed
|
| 154 |
+
- Monitor Space usage and logs
|
| 155 |
+
- Optimize bundle size for faster builds
|
| 156 |
+
|
| 157 |
+
### Security
|
| 158 |
+
- Review Content Security Policy headers
|
| 159 |
+
- Ensure no sensitive data in client-side code
|
| 160 |
+
- Use HTTPS (automatically provided by HF Spaces)
|
| 161 |
+
|
| 162 |
+
### Monitoring
|
| 163 |
+
- Check Space analytics in Hugging Face dashboard
|
| 164 |
+
- Monitor build times and resource usage
|
| 165 |
+
- Set up alerts for Space downtime
|
| 166 |
+
|
| 167 |
+
## Support
|
| 168 |
+
|
| 169 |
+
- Hugging Face Spaces Documentation: https://huggingface.co/docs/hub/spaces
|
| 170 |
+
- Community Forum: https://discuss.huggingface.co/
|
| 171 |
+
- Discord: https://discord.gg/hugging-face
|
| 172 |
+
|
| 173 |
+
## Next Steps
|
| 174 |
+
|
| 175 |
+
1. Test your Space thoroughly after deployment
|
| 176 |
+
2. Update README.md with Space-specific information
|
| 177 |
+
3. Share your Space with the community
|
| 178 |
+
4. Consider adding a demo or usage instructions
|
deploy-hf.sh
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
|
| 3 |
+
# Build and deploy script for invoice generator on Hugging Face Spaces
|
| 4 |
+
|
| 5 |
+
set -e
|
| 6 |
+
|
| 7 |
+
echo "🤗 Starting Hugging Face Spaces deployment process..."
|
| 8 |
+
|
| 9 |
+
# Stop existing services
|
| 10 |
+
echo "🛑 Stopping existing services..."
|
| 11 |
+
docker-compose -f docker-compose.hf.yml down 2>/dev/null || true
|
| 12 |
+
|
| 13 |
+
# Build and start the Hugging Face Spaces service
|
| 14 |
+
echo "📦 Building and starting services for HF Spaces..."
|
| 15 |
+
docker-compose -f docker-compose.hf.yml up --build -d
|
| 16 |
+
|
| 17 |
+
# Show status
|
| 18 |
+
echo "📊 Service status:"
|
| 19 |
+
docker-compose -f docker-compose.hf.yml ps
|
| 20 |
+
|
| 21 |
+
echo "✅ Hugging Face Spaces deployment completed successfully!"
|
| 22 |
+
echo "🌐 Application is available at: http://localhost:7860"
|
| 23 |
+
echo "🤗 Ready to deploy to Hugging Face Spaces!"
|
| 24 |
+
|
| 25 |
+
# Optional: Show logs
|
| 26 |
+
echo "📋 Recent logs:"
|
| 27 |
+
docker-compose -f docker-compose.hf.yml logs --tail=20 invoice-generator
|
| 28 |
+
|
| 29 |
+
echo ""
|
| 30 |
+
echo "📝 Next steps for Hugging Face Spaces:"
|
| 31 |
+
echo "1. Create a new Space on Hugging Face"
|
| 32 |
+
echo "2. Upload these files to your Space:"
|
| 33 |
+
echo " - Dockerfile.hf (rename to Dockerfile)"
|
| 34 |
+
echo " - nginx.hf.conf"
|
| 35 |
+
echo " - All your source files (package.json, src/, etc.)"
|
| 36 |
+
echo "3. Set Space SDK to 'docker'"
|
| 37 |
+
echo "4. Your app will be available on port 7860"
|
docker-compose.hf.yml
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
services:
|
| 2 |
+
invoice-generator:
|
| 3 |
+
build:
|
| 4 |
+
context: .
|
| 5 |
+
dockerfile: Dockerfile.hf
|
| 6 |
+
target: production
|
| 7 |
+
ports:
|
| 8 |
+
- "7860:7860"
|
| 9 |
+
restart: unless-stopped
|
| 10 |
+
container_name: invoice-generator-hf
|
| 11 |
+
environment:
|
| 12 |
+
- NODE_ENV=production
|
| 13 |
+
- PORT=7860
|
| 14 |
+
labels:
|
| 15 |
+
- "com.docker.compose.service=invoice-generator"
|
| 16 |
+
- "com.docker.compose.environment=huggingface"
|
| 17 |
+
logging:
|
| 18 |
+
driver: "json-file"
|
| 19 |
+
options:
|
| 20 |
+
max-size: "10m"
|
| 21 |
+
max-file: "3"
|
| 22 |
+
healthcheck:
|
| 23 |
+
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:7860/"]
|
| 24 |
+
interval: 30s
|
| 25 |
+
timeout: 10s
|
| 26 |
+
retries: 3
|
| 27 |
+
start_period: 40s
|
| 28 |
+
deploy:
|
| 29 |
+
resources:
|
| 30 |
+
limits:
|
| 31 |
+
memory: 512M
|
| 32 |
+
cpus: "0.5"
|
| 33 |
+
reservations:
|
| 34 |
+
memory: 256M
|
| 35 |
+
cpus: "0.25"
|
| 36 |
+
security_opt:
|
| 37 |
+
- no-new-privileges:true
|
| 38 |
+
read_only: true
|
| 39 |
+
tmpfs:
|
| 40 |
+
- /tmp
|
| 41 |
+
- /var/cache/nginx
|
| 42 |
+
- /var/run
|
| 43 |
+
- /run
|
| 44 |
+
- /var/log/nginx
|
nginx.hf.conf
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
events {
|
| 2 |
+
worker_connections 1024;
|
| 3 |
+
}
|
| 4 |
+
|
| 5 |
+
http {
|
| 6 |
+
include /etc/nginx/mime.types;
|
| 7 |
+
default_type application/octet-stream;
|
| 8 |
+
|
| 9 |
+
# Logging
|
| 10 |
+
access_log /var/log/nginx/access.log;
|
| 11 |
+
error_log /var/log/nginx/error.log;
|
| 12 |
+
|
| 13 |
+
# Gzip compression
|
| 14 |
+
gzip on;
|
| 15 |
+
gzip_vary on;
|
| 16 |
+
gzip_min_length 1024;
|
| 17 |
+
gzip_proxied any;
|
| 18 |
+
gzip_comp_level 6;
|
| 19 |
+
gzip_types
|
| 20 |
+
text/plain
|
| 21 |
+
text/css
|
| 22 |
+
text/xml
|
| 23 |
+
text/javascript
|
| 24 |
+
application/javascript
|
| 25 |
+
application/xml+rss
|
| 26 |
+
application/json;
|
| 27 |
+
|
| 28 |
+
# Security headers
|
| 29 |
+
add_header X-Frame-Options "SAMEORIGIN" always;
|
| 30 |
+
add_header X-XSS-Protection "1; mode=block" always;
|
| 31 |
+
add_header X-Content-Type-Options "nosniff" always;
|
| 32 |
+
add_header Referrer-Policy "no-referrer-when-downgrade" always;
|
| 33 |
+
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
|
| 34 |
+
|
| 35 |
+
server {
|
| 36 |
+
listen 7860;
|
| 37 |
+
server_name _;
|
| 38 |
+
root /usr/share/nginx/html;
|
| 39 |
+
index index.html;
|
| 40 |
+
|
| 41 |
+
# Cache static assets
|
| 42 |
+
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
|
| 43 |
+
expires 1y;
|
| 44 |
+
add_header Cache-Control "public, immutable";
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
# Handle SPA routing
|
| 48 |
+
location / {
|
| 49 |
+
try_files $uri $uri/ /index.html;
|
| 50 |
+
}
|
| 51 |
+
|
| 52 |
+
# Health check endpoint for HF Spaces
|
| 53 |
+
location /health {
|
| 54 |
+
access_log off;
|
| 55 |
+
return 200 "healthy\n";
|
| 56 |
+
add_header Content-Type text/plain;
|
| 57 |
+
}
|
| 58 |
+
|
| 59 |
+
# Security
|
| 60 |
+
location ~ /\. {
|
| 61 |
+
deny all;
|
| 62 |
+
}
|
| 63 |
+
}
|
| 64 |
+
}
|