# OPS [](https://circleci.com/gh/nanovms/ops) [](https://goreportcard.com/report/github.com/nanovms/ops) [](http://godoc.org/github.com/nanovms/ops)
Windows |
## MacOS via Homebrew
Add the repo & install:
```sh
brew tap nanovms/homebrew-ops
```
```sh
brew install nanovms/ops/ops
```
See the [formula file](https://github.com/nanovms/homebrew-ops/blob/master/Formula/ops.rb) for details.
## Debian / Redhat:
Add a deb src:
```
sudo vi /etc/apt/sources.list.d/fury.list
```
```
deb [trusted=yes] https://apt.fury.io/nanovms/ /
```
Update your sources && install:
```
sudo apt-get update && sudo apt-get install ops
```
## Build and Install from source
Building from source is easy if you have used Go before.
This program requires GO Version 1.25.x or greater.
Installing from source follows these general steps:
Install dependencies:
```sh
make deps
```
Build:
```sh
make build
```
macOS notes:
```sh
GO111MODULE=on go build -ldflags "-w"
```
For protobufs/grpc we use https://buf.build/ .
To generate protobufs (but do not check in to vcs):
```
make generate
```
For [detailed instructions](https://nanovms.gitbook.io/ops/developer/prerequisites), please consult the documentation.
# Hello World
Before learning more about `ops` it is a good idea to see some basic usage
examples. Below are links to simple examples using various programming platforms:
Let's run your first unikernel right now.
[](https://asciinema.org/a/256914)
Throw this into hi.js:
```javascript
const http = require('http');
http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
}).listen(8083, "0.0.0.0");
console.log('Server running at http://127.0.0.1:8083/');
```
Then you can run it like so:
```sh
ops pkg load eyberg/node:v16.5.0 -p 8083 -n -a hi.js
```
Note: Since the node package is inside the unikernel you do not need to
install node locally to use it.
# Cloud
Want to push your app out to the cloud? No complex orchestration like
K8S is necessary. OPS pushes all the orchestration onto the cloud
provider of choice so you don't need to manage anything. Be sure to try
this out as the next step after running a hello world locally as it will
answer many questions you might have.
- [Azure](https://docs.ops.city/ops/azure)
- [AWS](https://docs.ops.city/ops/aws)
- [Google Cloud](https://docs.ops.city/ops/google_cloud)
- [Digital Ocean](https://docs.ops.city/ops/digital_ocean)
- [IBM](https://docs.ops.city/ops/ibm)
- [Linode](https://docs.ops.city/ops/linode)
- [Oracle Cloud](https://docs.ops.city/ops/oci)
- [Vultr](https://docs.ops.city/ops/vultr)
- [UpCloud](https://docs.ops.city/ops/upcloud)
You can find many more pre-made packages at the public repo:
[https://repo.ops.city/](https://repo.ops.city/)
Or via the shell:
```sh
ops pkg list
```
You can also upload your own with a free account.
Languages:
Various langauge examples can be found at
[https://github.com/nanovms/ops-examples](https://github.com/nanovms/ops-examples).
In general [https://nanos.org](Nanos) supports any languages and is not
language specific.
You can find more examples and tutorial on youtube as well:
[https://www.youtube.com/channel/UC3mqDqCVu3moVKzmP2YNmlg](https://www.youtube.com/channel/UC3mqDqCVu3moVKzmP2YNmlg)
## Daemon
OPS started out as a daemon-less cli tool to build and run unikernels
locally and to also interact with the various clouds. We will keep that
functionality as-is, however, ops can also run as a daemon locally for
software that is a composition of multiple services. The daemon expects
to have elevated privileges (currently via suid bit) in order to place
the various programs on their class c network (vs relying on user-mode).
This is not necessary for 'ops run', 'ops pkg load' or 'ops instance
create' but only for multipl services ran locally that expect to
communicate to each other vs just the host.
For now the daemon and 'ops instance create' share metadata but that is
expected to change in the future.
## Apple M1/M2 Users
The Apple M1 and M2 are ARM based. OPS is built for users primarily
deploying to x86 based servers. We now have full support for running
native ARM applications (ELFs) on M1 and M2s natively. That means
without relying on Rosetta and with full hardware acceleration.
Be aware that if you wish to deploy your applications to x86 servers
you'll need to re-build your images as x86 versus the default of arm64.
# Build a bootable image
`ops build