# 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