195 lines
4.7 KiB
Markdown
195 lines
4.7 KiB
Markdown
# Mosis Portal
|
|
|
|
Developer portal and app store backend for Mosis.
|
|
|
|
## Overview
|
|
|
|
mosis-portal is a self-hosted Go server that provides:
|
|
|
|
- **Developer Portal** - Account management, app submission, signing key registration
|
|
- **App Store API** - App discovery, download, and updates for devices
|
|
- **Review System** - Automated and manual app review pipeline
|
|
- **Telemetry** - Usage analytics and crash reporting
|
|
|
|
## Architecture
|
|
|
|
```
|
|
Single Go binary + SQLite + Litestream
|
|
├── Go 1.22+ with Chi router
|
|
├── SQLite (WAL mode) via modernc.org/sqlite (pure Go)
|
|
├── Litestream for continuous backup
|
|
└── Ed25519 for package signing
|
|
```
|
|
|
|
## Quick Start
|
|
|
|
### Local Development
|
|
|
|
```bash
|
|
# Run with Go
|
|
go run ./cmd/server
|
|
|
|
# Or build and run
|
|
go build -o mosis-portal ./cmd/server
|
|
./mosis-portal
|
|
```
|
|
|
|
### Docker
|
|
|
|
```bash
|
|
# Build and run
|
|
docker-compose up --build
|
|
|
|
# Or build image directly
|
|
docker build -t mosis-portal .
|
|
docker run -p 8080:8080 -v ./data:/data mosis-portal
|
|
```
|
|
|
|
### Synology NAS Deployment
|
|
|
|
1. Copy files to NAS:
|
|
```bash
|
|
scp -r . nas:/volume1/docker/mosis-portal/
|
|
```
|
|
|
|
2. Create data directories:
|
|
```bash
|
|
ssh nas "mkdir -p /volume1/mosis/{data,packages,backups}"
|
|
```
|
|
|
|
3. Update docker-compose.yml volumes:
|
|
```yaml
|
|
volumes:
|
|
- /volume1/mosis/data:/data
|
|
- /volume1/mosis/packages:/packages
|
|
- /volume1/mosis/backups:/backups
|
|
```
|
|
|
|
4. Deploy:
|
|
```bash
|
|
docker-compose up -d
|
|
```
|
|
|
|
## Configuration
|
|
|
|
Environment variables:
|
|
|
|
| Variable | Default | Description |
|
|
|----------|---------|-------------|
|
|
| `LISTEN_ADDR` | `:8080` | Server listen address |
|
|
| `BASE_URL` | `http://localhost:8080` | Public URL for OAuth callbacks |
|
|
| `DATABASE_PATH` | `./data/portal.db` | SQLite database path |
|
|
| `PACKAGES_DIR` | `./packages` | App package storage |
|
|
| `BACKUPS_DIR` | `./backups` | Litestream backup location |
|
|
| `JWT_SECRET` | (required) | Secret for JWT signing |
|
|
| `GITHUB_CLIENT_ID` | (optional) | GitHub OAuth client ID |
|
|
| `GITHUB_CLIENT_SECRET` | (optional) | GitHub OAuth client secret |
|
|
| `GOOGLE_CLIENT_ID` | (optional) | Google OAuth client ID |
|
|
| `GOOGLE_CLIENT_SECRET` | (optional) | Google OAuth client secret |
|
|
|
|
## API Endpoints
|
|
|
|
### Authentication
|
|
|
|
```
|
|
POST /v1/auth/oauth/github Start GitHub OAuth
|
|
GET /v1/auth/oauth/github/callback GitHub callback
|
|
POST /v1/auth/oauth/google Start Google OAuth
|
|
GET /v1/auth/oauth/google/callback Google callback
|
|
POST /v1/auth/refresh Refresh tokens
|
|
POST /v1/auth/logout Logout
|
|
GET /v1/auth/me Get current user
|
|
```
|
|
|
|
### Apps
|
|
|
|
```
|
|
GET /v1/apps List developer's apps
|
|
POST /v1/apps Create new app
|
|
GET /v1/apps/:id Get app details
|
|
PATCH /v1/apps/:id Update app
|
|
DELETE /v1/apps/:id Delete app
|
|
|
|
GET /v1/apps/:id/versions List versions
|
|
POST /v1/apps/:id/versions Upload new version
|
|
POST /v1/apps/:id/versions/:vid/submit Submit for review
|
|
POST /v1/apps/:id/versions/:vid/publish Publish
|
|
```
|
|
|
|
### Store (Public)
|
|
|
|
```
|
|
GET /v1/store/apps Browse/search apps
|
|
GET /v1/store/apps/:id App details
|
|
GET /v1/store/apps/:id/download Download latest version
|
|
GET /v1/store/apps/updates Check for updates
|
|
```
|
|
|
|
### Telemetry
|
|
|
|
```
|
|
POST /v1/telemetry/events Batch event upload
|
|
POST /v1/telemetry/crash Crash report
|
|
```
|
|
|
|
## Package Format
|
|
|
|
Mosis apps use the `.mosis` format (signed ZIP archive):
|
|
|
|
```
|
|
com.developer.app-1.0.0.mosis
|
|
├── manifest.json # App metadata
|
|
├── META-INF/
|
|
│ ├── MANIFEST.MF # SHA-256 hashes
|
|
│ └── CERT.SIG # Ed25519 signature
|
|
├── icons/
|
|
│ ├── icon-32.png
|
|
│ ├── icon-64.png
|
|
│ └── icon-128.png
|
|
└── assets/
|
|
├── main.rml
|
|
└── scripts/app.lua
|
|
```
|
|
|
|
## Development
|
|
|
|
### Project Structure
|
|
|
|
```
|
|
portal/
|
|
├── cmd/server/ # Main entry point
|
|
├── internal/
|
|
│ ├── api/ # HTTP handlers
|
|
│ │ └── handlers/
|
|
│ ├── config/ # Configuration
|
|
│ └── database/ # SQLite operations
|
|
├── pkg/mospkg/ # Package format library
|
|
│ ├── manifest.go # Manifest parsing
|
|
│ ├── validator.go # Package validation
|
|
│ └── signer.go # Ed25519 signing
|
|
├── Dockerfile
|
|
├── docker-compose.yml
|
|
├── litestream.yml
|
|
└── go.mod
|
|
```
|
|
|
|
### Testing
|
|
|
|
```bash
|
|
go test ./...
|
|
```
|
|
|
|
### Building
|
|
|
|
```bash
|
|
# Local
|
|
go build -o mosis-portal ./cmd/server
|
|
|
|
# Cross-compile for Linux/ARM64 (Synology)
|
|
GOOS=linux GOARCH=arm64 go build -o mosis-portal-arm64 ./cmd/server
|
|
```
|
|
|
|
## License
|
|
|
|
Proprietary - OmixLab LTD
|