ButterM40 commited on
Commit
1fdc612
·
1 Parent(s): 635ff7e

Add Hugging Face Spaces deployment files

Browse files
Files changed (4) hide show
  1. DEPLOY_TO_SPACES.md +175 -0
  2. Dockerfile +18 -0
  3. create_space.py +40 -0
  4. verify_install.py +15 -0
DEPLOY_TO_SPACES.md ADDED
@@ -0,0 +1,175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Deploying this project to Hugging Face Spaces
2
+
3
+ This document explains three ways to deploy the contents of this repository to a Hugging Face Space:
4
+
5
+ - Option A — Static Space (recommended for a plain website: fastest to set up)
6
+ - Option B — Gradio Space (if you want a Python-backed UI wired into models)
7
+ - Option C — Docker / "Other" Space (if you need to run `server.py` with FastAPI / Uvicorn)
8
+
9
+ All commands below assume PowerShell on Windows (your environment). If you use the workspace virtualenv, run the CLI commands from that environment or prepend the correct python -m calls.
10
+
11
+ ## Preparation
12
+
13
+ 1. Create a Hugging Face account if you do not already have one: https://huggingface.co/
14
+ 2. Install Hugging Face Hub CLI locally (recommended inside your venv):
15
+
16
+ ```powershell
17
+ &pip install --upgrade huggingface_hub
18
+ # then login interactively
19
+ & huggingface-cli login
20
+ ```
21
+
22
+ 3. Choose a Space name (e.g. `your-username/my-space`).
23
+
24
+ Note: Hugging Face Spaces supports several Space types. Pick the one that fits your app:
25
+
26
+ - `static` — best for a static website (HTML/CSS/JS). No Python runtime needed.
27
+ - `gradio` or `streamlit` — for Python UIs using those frameworks.
28
+ - `docker` or `other` — you provide a Dockerfile (useful for FastAPI or custom servers).
29
+
30
+ ---
31
+
32
+ ## Option A — Static Space (recommended for `index.html`/frontend-only sites)
33
+
34
+ Use this option when your site is pure client-side HTML/CSS/JS. It is the simplest and fastest option.
35
+
36
+ 1. Ensure the static site entrypoint is `index.html` at the repository root. Currently this repo contains `static/index.html`. You can either:
37
+
38
+ - Move content from `static/` to the repository root, or
39
+ - Create a tiny wrapper `index.html` at repo root that loads `./static/index.html` with an iframe or server-side redirect (but moving is simplest).
40
+
41
+ Example to copy files (PowerShell):
42
+
43
+ ```powershell
44
+ # from repo root
45
+ Copy-Item -Path .\static\* -Destination . -Recurse -Force
46
+ ```
47
+
48
+ 2. Create the Space (replace `<your-username>` and `<space-name>`):
49
+
50
+ ```powershell
51
+ huggingface-cli repo create <your-username>/<space-name> --type=static
52
+ ```
53
+
54
+ 3. Initialize a git repo and push the site to the new Space remote:
55
+
56
+ ```powershell
57
+ git init
58
+ git add .
59
+ git commit -m "Deploy static site to HF Space"
60
+ # add remote; replace with the exact URL from the CLI output if different
61
+ git remote add origin https://huggingface.co/spaces/<your-username>/<space-name>
62
+ git branch -M main
63
+ git push -u origin main
64
+ ```
65
+
66
+ 4. Your Space will build and serve the static site. Visit https://huggingface.co/spaces/<your-username>/<space-name>
67
+
68
+ Notes:
69
+
70
+ - If you have large assets (models, weights), store them in a separate repo or use Git LFS. Spaces have storage limits.
71
+ - Static Spaces do not provide a Python runtime.
72
+
73
+ ---
74
+
75
+ ## Option B — Gradio Space (if you want a Python UI)
76
+
77
+ If you want to serve a simple Python UI that can interact with your models, use Gradio. This is great when you need Python code to run on the server side.
78
+
79
+ 1. Create the Space as a Gradio type:
80
+
81
+ ```powershell
82
+ huggingface-cli repo create <your-username>/<space-name> --type=gradio
83
+ ```
84
+
85
+ 2. Add a minimal `app.py` (Gradio) in the repo root. Example that serves your existing `static/index.html` inside a Gradio interface:
86
+
87
+ ```python
88
+ import gradio as gr
89
+ from pathlib import Path
90
+
91
+ html = Path("static/index.html").read_text(encoding="utf-8")
92
+
93
+ def show():
94
+ return html
95
+
96
+ iface = gr.Interface(fn=show, inputs=[], outputs=gr.HTML(), allow_flagging=False)
97
+
98
+ if __name__ == "__main__":
99
+ iface.launch(server_name="0.0.0.0", server_port=7860)
100
+ ```
101
+
102
+ 3. Ensure `requirements.txt` includes `gradio` (add `gradio>=3.0` if missing). Commit and push like in Option A.
103
+
104
+ 4. Visit your Space URL after the build completes.
105
+
106
+ Notes:
107
+
108
+ - Gradio Spaces run in a Python environment and will install packages from `requirements.txt`.
109
+ - Models and large files may require Git LFS or external hosting.
110
+
111
+ ---
112
+
113
+ ## Option C — Docker / "Other" Space (for FastAPI / custom servers)
114
+
115
+ Use this when you need to run `server.py` (FastAPI + Uvicorn) as the backend. This option gives you complete control via a Dockerfile.
116
+
117
+ 1. Create the Space as a Docker/Other Space:
118
+
119
+ ```powershell
120
+ huggingface-cli repo create <your-username>/<space-name> --type=docker
121
+ ```
122
+
123
+ 2. Add a `Dockerfile` to the repo root. Example for running `server.py` with Uvicorn:
124
+
125
+ ```dockerfile
126
+ FROM python:3.11-slim
127
+ WORKDIR /app
128
+ COPY . /app
129
+ RUN pip install --upgrade pip && pip install -r requirements.txt
130
+ ENV PORT=7860
131
+ CMD ["bash", "-lc", "uvicorn server:app --host 0.0.0.0 --port $PORT"]
132
+ ```
133
+
134
+ Make sure `server.py` exposes a FastAPI `app` object (for example `app = FastAPI()`), so `uvicorn server:app` works.
135
+
136
+ 3. Commit and push the repo to the Space remote as in Option A. Spaces will build the Docker image and run it.
137
+
138
+ Notes:
139
+
140
+ - Docker images must fit within Spaces resource constraints. Avoid bundling large model weights in the image; prefer downloading at runtime or using external storage.
141
+ - Use `$PORT` env var as shown so the platform can route correctly.
142
+
143
+ ---
144
+
145
+ ## Common tips
146
+
147
+ - If your `index.html` and assets live under `static/`, one simple approach is to move them to the repository root before pushing a Static Space.
148
+ - For debugging, check the Space build logs on the Space page — they show package install errors and startup logs.
149
+ - To upload large model files, use Git LFS or host the weights on the Hugging Face Hub (or external storage) and download them at runtime.
150
+
151
+ ## Example minimal PowerShell session (Static Space)
152
+
153
+ ```powershell
154
+ # login
155
+ huggingface-cli login
156
+ # create space
157
+ huggingface-cli repo create my-username/my-static-site --type=static
158
+ # copy files to repo root (if required)
159
+ Copy-Item -Path .\static\* -Destination . -Recurse -Force
160
+ # push
161
+ git init
162
+ git add .
163
+ git commit -m "Deploy static site to HF Space"
164
+ git remote add origin https://huggingface.co/spaces/my-username/my-static-site
165
+ git branch -M main
166
+ git push -u origin main
167
+ ```
168
+
169
+ ## Follow-ups I can help with
170
+
171
+ - Create a `Dockerfile` in this repo to run `server.py` on Spaces (I can add it and test locally).
172
+ - Add a `Gradio` `app.py` wrapper so the current `static/index.html` is served inside a Gradio app.
173
+ - Move/copy `static/` contents to the project root and configure a Static Space, then push for you (if you want me to modify repo files).
174
+
175
+ If you'd like, tell me which option you prefer (Static, Gradio, or Docker), and I will add the required files and example configuration in this repository.
Dockerfile ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.11-slim
2
+
3
+ # Set working directory
4
+ WORKDIR /app
5
+
6
+ # Copy requirements first for better caching
7
+ COPY requirements.txt .
8
+ RUN pip install --no-cache-dir --upgrade pip && \
9
+ pip install --no-cache-dir -r requirements.txt
10
+
11
+ # Copy the rest of the application
12
+ COPY . .
13
+
14
+ # Hugging Face Spaces uses port 7860
15
+ ENV PORT=7860
16
+
17
+ # Run the FastAPI server
18
+ CMD ["bash", "-c", "uvicorn server:app --host 0.0.0.0 --port ${PORT}"]
create_space.py ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from huggingface_hub import HfApi, login
2
+ import sys
3
+
4
+ def create_space():
5
+ # Get token from user
6
+ token = input("Enter your Hugging Face access token (from https://huggingface.co/settings/tokens): ")
7
+
8
+ # Login with token
9
+ login(token=token)
10
+ api = HfApi()
11
+
12
+ # Get username
13
+ username = input("Enter your Hugging Face username: ")
14
+ space_name = "local-inference"
15
+
16
+ space_id = f"{username}/{space_name}"
17
+ print(f"Creating Space: {space_id}")
18
+
19
+ try:
20
+ api.create_repo(
21
+ repo_id=space_id,
22
+ repo_type="space",
23
+ space_sdk="docker",
24
+ )
25
+ print(f"\nSpace created successfully!")
26
+ print(f"Remote URL: https://huggingface.co/spaces/{space_id}")
27
+ print("\nNext steps:")
28
+ print("1. Initialize git in this directory (if not already done)")
29
+ print("2. Add the remote:")
30
+ print(f" git remote add origin https://huggingface.co/spaces/{space_id}")
31
+ print("3. Push your code:")
32
+ print(" git add .")
33
+ print(' git commit -m "Initial commit"')
34
+ print(" git push -u origin main")
35
+ except Exception as e:
36
+ print(f"Error creating space: {e}", file=sys.stderr)
37
+ sys.exit(1)
38
+
39
+ if __name__ == "__main__":
40
+ create_space()
verify_install.py ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import importlib
2
+
3
+ packages = [
4
+ 'fastapi',
5
+ 'torch',
6
+ 'transformers',
7
+ ]
8
+
9
+ for p in packages:
10
+ try:
11
+ m = importlib.import_module(p)
12
+ v = getattr(m, '__version__', None)
13
+ print(f"{p}: OK, version={v}")
14
+ except Exception as e:
15
+ print(f"{p}: IMPORT ERROR: {e}")