Add README
This commit is contained in:
85
README.md
Normal file
85
README.md
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
# iOS App Store
|
||||||
|
|
||||||
|
Self-hosted iOS OTA app distribution server. Build with your dev/distribution certs, host the IPAs, install on registered devices over the air — no Xcode tether, no TestFlight.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Web UI for browsing and installing apps (mobile-friendly, dark theme)
|
||||||
|
- Drag-and-drop IPA upload with automatic metadata + icon extraction
|
||||||
|
- CLI/API uploads with token auth
|
||||||
|
- Automatic manifest plist generation for `itms-services://` installs
|
||||||
|
- Multiple builds per app, version history, release notes
|
||||||
|
- Password-protected web UI, token-protected API
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- iOS device UDID registered in the provisioning profile embedded in the IPA
|
||||||
|
- IPA exported with `method: ad-hoc` (development-signed IPAs cannot be installed OTA)
|
||||||
|
- Server reachable over HTTPS with a trusted certificate
|
||||||
|
|
||||||
|
## Stack
|
||||||
|
|
||||||
|
Node.js + Express + SQLite + Docker. Sharp for icon resizing. No client framework — vanilla HTML/CSS/JS.
|
||||||
|
|
||||||
|
## Endpoints
|
||||||
|
|
||||||
|
| Method | Path | Auth | Description |
|
||||||
|
|--------|------|------|-------------|
|
||||||
|
| `GET` | `/` | session | App listing |
|
||||||
|
| `GET` | `/upload` | session | Upload page |
|
||||||
|
| `POST` | `/api/upload` | token or session | Upload IPA |
|
||||||
|
| `GET` | `/api/apps` | token or session | List apps + latest build |
|
||||||
|
| `GET` | `/api/apps/:id` | token or session | App detail with all builds |
|
||||||
|
| `DELETE` | `/api/apps/:id` | token or session | Delete app + all builds |
|
||||||
|
| `DELETE` | `/api/builds/:id` | token or session | Delete a single build |
|
||||||
|
| `GET` | `/api/manifest/:buildId` | public | Plist manifest for OTA install |
|
||||||
|
| `GET` | `/api/download/:buildId` | public | Download IPA file |
|
||||||
|
| `GET` | `/api/health` | public | Health check |
|
||||||
|
|
||||||
|
The manifest and download endpoints are intentionally public — iOS fetches them unauthenticated during install.
|
||||||
|
|
||||||
|
## CLI Upload
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X POST https://appstore.example.com/api/upload \
|
||||||
|
-H "X-Api-Token: $API_TOKEN" \
|
||||||
|
-F "ipa=@path/to/YourApp.ipa" \
|
||||||
|
-F "notes=Build notes"
|
||||||
|
```
|
||||||
|
|
||||||
|
Response includes the install URL (`itms-services://...`) ready to open in Safari on the device.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
Copy `.env.example` to `.env` and set:
|
||||||
|
|
||||||
|
| Variable | Description |
|
||||||
|
|----------|-------------|
|
||||||
|
| `ADMIN_PASSWORD` | Web UI login password |
|
||||||
|
| `API_TOKEN` | Token for CLI/automation uploads |
|
||||||
|
| `SESSION_SECRET` | Express session secret |
|
||||||
|
| `BASE_URL` | Public HTTPS URL of the server |
|
||||||
|
| `PORT` | Listen port (default `3000`) |
|
||||||
|
|
||||||
|
## Deployment
|
||||||
|
|
||||||
|
Runs as a single Docker container. The `/data` volume holds the SQLite DB, uploaded IPAs, and extracted icons.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
Put a reverse proxy with HTTPS in front of it. iOS requires a trusted SSL certificate for OTA installs to work.
|
||||||
|
|
||||||
|
## Project Layout
|
||||||
|
|
||||||
|
```
|
||||||
|
src/
|
||||||
|
server.js Express app, routes, middleware
|
||||||
|
db.js SQLite schema
|
||||||
|
ipa-parser.js Extracts Info.plist + icon from IPA
|
||||||
|
manifest.js Generates OTA manifest plist
|
||||||
|
auth.js Session + token auth middleware
|
||||||
|
public/ Static assets (CSS, JS)
|
||||||
|
views/ HTML pages
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user