{"id":13410591,"url":"https://github.com/nanovms/ops","last_synced_at":"2026-02-10T16:26:42.664Z","repository":{"id":37926373,"uuid":"148196645","full_name":"nanovms/ops","owner":"nanovms","description":"ops - build and run nanos unikernels","archived":false,"fork":false,"pushed_at":"2026-01-21T06:44:48.000Z","size":20902,"stargazers_count":1454,"open_issues_count":142,"forks_count":138,"subscribers_count":29,"default_branch":"master","last_synced_at":"2026-01-21T12:41:41.203Z","etag":null,"topics":["devops","edge-computing","imagebuilder","microservice","minimalist","operating-systems","orchestrator","sandbox","serverless","unikernel","unikernels","virtualization"],"latest_commit_sha":null,"homepage":"https://ops.city","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nanovms.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-09-10T17:57:47.000Z","updated_at":"2026-01-21T04:09:00.000Z","dependencies_parsed_at":"2023-09-24T23:57:36.214Z","dependency_job_id":"afa1b714-47cb-47ac-bad0-1f803c530456","html_url":"https://github.com/nanovms/ops","commit_stats":{"total_commits":851,"total_committers":59,"mean_commits":"14.423728813559322","dds":0.8190364277320799,"last_synced_commit":"024f643724a85e9d8132845255e134cec27d4051"},"previous_names":[],"tags_count":41,"template":false,"template_full_name":null,"purl":"pkg:github/nanovms/ops","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nanovms%2Fops","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nanovms%2Fops/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nanovms%2Fops/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nanovms%2Fops/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nanovms","download_url":"https://codeload.github.com/nanovms/ops/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nanovms%2Fops/sbom","scorecard":{"id":674129,"data":{"date":"2025-08-11","repo":{"name":"github.com/nanovms/ops","commit":"b0c07fe2830026c2196174cb7fea11a40e2ec4f8"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.2,"checks":[{"name":"Maintained","score":7,"reason":"9 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 7","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":2,"reason":"Found 7/24 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Security-Policy","score":3,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Warn: no linked content found","Warn: One or no descriptive hints of disclosure, vulnerability, and/or timelines in security policy","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 29 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-21T21:00:45.986Z","repository_id":37926373,"created_at":"2025-08-21T21:00:45.986Z","updated_at":"2025-08-21T21:00:45.986Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29307901,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-10T16:09:25.305Z","status":"ssl_error","status_checked_at":"2026-02-10T16:08:52.170Z","response_time":65,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["devops","edge-computing","imagebuilder","microservice","minimalist","operating-systems","orchestrator","sandbox","serverless","unikernel","unikernels","virtualization"],"created_at":"2024-07-30T20:01:07.844Z","updated_at":"2026-02-10T16:26:42.652Z","avatar_url":"https://github.com/nanovms.png","language":"Go","readme":"# OPS\n\n[![CircleCI](https://circleci.com/gh/nanovms/ops.svg?style=svg)](https://circleci.com/gh/nanovms/ops)\n[![Go Report](https://goreportcard.com/badge/github.com/nanovms/ops)](https://goreportcard.com/report/github.com/nanovms/ops)\n[![Go Docs](https://godoc.org/github.com/nanovms/ops?status.svg)](http://godoc.org/github.com/nanovms/ops)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://i.imgur.com/OtfAABU.png\" style=\"width:200px;\"/\u003e\n\u003c/p\u003e\n\nOps is a tool for creating and running a [Nanos](https://github.com/nanovms/nanos) unikernel. It is used to\npackage, create, and run your application as a [nanos](https://github.com/nanovms/nanos) unikernel instance.\n\n1. [Installation](#installation)\n2. [Hello World](#hello-world)\n3. [Cloud](#cloud)\n4. [Support](#support)\n\nCheck out the [DOCS](https://nanovms.gitbook.io/ops/).\n\n# Installation\n\nMost users should just download the binary from the website:\n\n## Binary install\n\n```sh\ncurl https://ops.city/get.sh -sSfL | sh\n```\n\nIf you don't like this option you can also download pre-made packages\nfor various systems [here](https://ops.city/downloads) and you can also\nbuild from source.\n\n## Desktop applications\n\nOperating System | Download\n---|---\nmacOS | \u003ca href='https://storage.googleapis.com/cli/darwin/ops.pkg'\u003e\u003cimg alt='Get it on macOS' width=\"134px\" src='https://raw.githubusercontent.com/nanovms/ops/master/assets/BadgeMacOS.png'/\u003e\u003c/a\u003e\nWindows | \u003ca href='https://storage.googleapis.com/cli/windows/ops-desktop-setup-win-x64.exe'\u003e\u003cimg alt='Get it on Windows' width=\"134px\" src='https://raw.githubusercontent.com/nanovms/ops/master/assets/badgewindows.png'/\u003e\u003c/a\u003e\n\n## MacOS via Homebrew\nAdd the repo \u0026 install:\n```sh\nbrew tap nanovms/homebrew-ops\n```\n\n```sh\nbrew install nanovms/ops/ops\n```\nSee the [formula file](https://github.com/nanovms/homebrew-ops/blob/master/Formula/ops.rb) for details.\n \n## Debian / Redhat:\n\nAdd a deb src:\n\n```\nsudo vi /etc/apt/sources.list.d/fury.list\n```\n\n```\ndeb [trusted=yes] https://apt.fury.io/nanovms/ /\n```\n\nUpdate your sources \u0026\u0026 install:\n\n```\nsudo apt-get update \u0026\u0026 sudo apt-get install ops\n```\n\n## Build and Install from source\n\nBuilding from source is easy if you have used Go before.\n\nThis program requires GO Version 1.25.x or greater.\n\nInstalling from source follows these general steps:\n\nInstall dependencies:\n\n```sh\nmake deps\n```\n\nBuild:\n\n```sh\nmake build\n```\n\nmacOS notes:\n\n```sh\nGO111MODULE=on go build -ldflags \"-w\"\n```\n\nFor protobufs/grpc we use https://buf.build/ .\n\nTo generate protobufs (but do not check in to vcs):\n\n```\nmake generate\n```\n\nFor [detailed instructions](https://nanovms.gitbook.io/ops/developer/prerequisites), please consult the documentation.\n\n# Hello World\n\nBefore learning more about `ops` it is a good idea to see some basic usage\nexamples. Below are links to simple examples using various programming platforms:\n\nLet's run your first unikernel right now.\n\n[![asciicast](https://asciinema.org/a/256914.svg)](https://asciinema.org/a/256914)\n\nThrow this into hi.js:\n\n```javascript\nconst http = require('http');\nhttp.createServer((req, res) =\u003e {\n    res.writeHead(200, { 'Content-Type': 'text/plain' });\n    res.end('Hello World\\n');\n}).listen(8083, \"0.0.0.0\");\nconsole.log('Server running at http://127.0.0.1:8083/');\n```\n\nThen you can run it like so:\n\n```sh\nops pkg load eyberg/node:v16.5.0 -p 8083 -n -a hi.js\n```\n\nNote: Since the node package is inside the unikernel you do not need to\ninstall node locally to use it.\n\n# Cloud\n\nWant to push your app out to the cloud? No complex orchestration like\nK8S is necessary. OPS pushes all the orchestration onto the cloud\nprovider of choice so you don't need to manage anything. Be sure to try\nthis out as the next step after running a hello world locally as it will\nanswer many questions you might have.\n\n- [Azure](https://docs.ops.city/ops/azure)\n- [AWS](https://docs.ops.city/ops/aws)\n- [Google Cloud](https://docs.ops.city/ops/google_cloud)\n\n- [Digital Ocean](https://docs.ops.city/ops/digital_ocean)\n- [IBM](https://docs.ops.city/ops/ibm)\n- [Linode](https://docs.ops.city/ops/linode)\n- [Oracle Cloud](https://docs.ops.city/ops/oci)\n- [Vultr](https://docs.ops.city/ops/vultr)\n- [UpCloud](https://docs.ops.city/ops/upcloud)\n\nYou can find many more pre-made packages at the public repo:\n\n[https://repo.ops.city/](https://repo.ops.city/)\n\nOr via the shell:\n\n```sh\nops pkg list\n```\n\nYou can also upload your own with a free account.\n\nLanguages:\n\nVarious langauge examples can be found at\n[https://github.com/nanovms/ops-examples](https://github.com/nanovms/ops-examples).\nIn general [https://nanos.org](Nanos) supports any languages and is not\nlanguage specific.\n\nYou can find more examples and tutorial on youtube as well:\n\n[https://www.youtube.com/channel/UC3mqDqCVu3moVKzmP2YNmlg](https://www.youtube.com/channel/UC3mqDqCVu3moVKzmP2YNmlg)\n\n## Daemon\n\nOPS started out as a daemon-less cli tool to build and run unikernels\nlocally and to also interact with the various clouds. We will keep that\nfunctionality as-is, however, ops can also run as a daemon locally for\nsoftware that is a composition of multiple services. The daemon expects\nto have elevated privileges (currently via suid bit) in order to place\nthe various programs on their class c network (vs relying on user-mode).\nThis is not necessary for 'ops run', 'ops pkg load' or 'ops instance\ncreate' but only for multipl services ran locally that expect to\ncommunicate to each other vs just the host.\n\nFor now the daemon and 'ops instance create' share metadata but that is\nexpected to change in the future.\n\n## Apple M1/M2 Users\n\nThe Apple M1 and M2 are ARM based. OPS is built for users primarily\ndeploying to x86 based servers. We now have full support for running\nnative ARM applications (ELFs) on M1 and M2s natively. That means\nwithout relying on Rosetta and with full hardware acceleration.\n\nBe aware that if you wish to deploy your applications to x86 servers\nyou'll need to re-build your images as x86 versus the default of arm64.\n\n# Build a bootable image\n`ops build \u003capp\u003e`\n\n# Package and run\n```sh\nops run \u003capp\u003e\n# or\nops run -p \u003cport\u003e \u003capp\u003e\n```\n\n# Using a config file\n```sh\nops run -p \u003cport\u003e -c \u003cfile\u003e \u003capp\u003e\n```\n\n# Use golang string interoplation in config files\nTo enable set `ops_render_config` to `true`. Both `${ENV_VAR}` and `$ENV_VAR` are supported.\n\n## Example Command\n```sh\nops_render_config=true ops run -p \u003cport\u003e -c \u003cfile\u003e \u003capp\u003e\n# or\nexport ops_render_config=true\nops run -p \u003cport\u003e -c \u003cfile\u003e \u003capp\u003e\n```\n\n## Example config\n```JSON\n{\n  \"Args\":[\n    \"--user\",\n    \"${USER}\",\n    \"--password\",\n    \"$PASSWORD\"\n  ],\n  \"Dirs\":[\"myapp/static\"]\n}\n```\n\n# Example config file\n\nOPS config files are plain JSON, below is an example.\n\n```JSON\n{\n  \"Args\":[\"one\",\"two\"],\n  \"Dirs\":[\"myapp/static\"]\n}\n```\n\n## Setup networking\n\nNew users wishing to play around in a dev environment are encouraged to\nuse the default user-mode networking. Other production users are\nencouraged to utilize native cloud builds such as [Google\nCloud](https://nanovms.gitbook.io/ops/google_cloud) which\nhandle networking for you.\n\nOnly advanced/power users should use the bridge networking option.\n\n## Useful Ops Environment Variables\n\nThe following environment variables are available to you\n\n* `ops_render_config` - Set to `true` to use Golang ENV var interpolation to render your JSON configs.\n\n\n## Reporting Bugs\n\nFeel free to open up a pull request. It's helpful to have your OPS\nversion and the release channel you are using.\n\nAlso, if it doesn't work on the main release, then you can try the nightly.\nThe main release can tail the nightly by many weeks sometimes.\n\n```sh\nops version\n```\n\nIf you are using a package, get the package hash:\n\n```sh\njq '.\"gnatsd_1.4.1\"' ~/.ops/packages/manifest.json\n```\n\n## Pull Requests\n\nIf you have an idea for a new feature and it might take longer than a\nfew hours or days to complete, then it's worth opening a feature request ticket to\nideate it first before jumping into code. There might be someone already\nworking on the feature or plans to do something entirely different.\n\n## Security\n\n[Security](https://github.com/nanovms/ops/blob/master/SECURITY.md)\n\nFeel free to email security[at]nanovms[dot]com.\n\n# Support\n\nIf you are having trouble running a particular application please feel\nfree to open an issue and we can take a look. In general we'll only want\nto support the latest release from a given application/project, however,\nif you really want/need support for something older there are paid\nsupport plans available - contact the folks at https://nanovms.com.\n\nIf you need email support you will need to sign up for a support plan.\n","funding_links":[],"categories":["Command Line","命令行工具","命令行","Development","Go","serverless","\u003ca name=\"devops\"\u003e\u003c/a\u003eDevOps","Build Automation","命令行工具### 标准 CLI`用于创建一个标准命令行应用程序的库`"],"sub_categories":["Standard CLI","标准 CLI","标准CLI","Devops"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnanovms%2Fops","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnanovms%2Fops","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnanovms%2Fops/lists"}