Nebula: separate controller from api
diff --git a/core/nebula/controller/.gitignore b/core/nebula/controller/.gitignore
index 17f70e0..a740a57 100644
--- a/core/nebula/controller/.gitignore
+++ b/core/nebula/controller/.gitignore
@@ -1,5 +1,3 @@
 controller_arm64
 controller_amd64
 vendor
-web_arm64
-web_amd64
\ No newline at end of file
diff --git a/core/nebula/controller/Dockerfile.controller b/core/nebula/controller/Dockerfile
similarity index 100%
rename from core/nebula/controller/Dockerfile.controller
rename to core/nebula/controller/Dockerfile
diff --git a/core/nebula/controller/Dockerfile.web b/core/nebula/controller/Dockerfile.web
deleted file mode 100644
index 6c5a573..0000000
--- a/core/nebula/controller/Dockerfile.web
+++ /dev/null
@@ -1,6 +0,0 @@
-FROM alpine:latest
-
-ARG TARGETARCH
-
-COPY web_${TARGETARCH} /usr/bin/nebula-web
-RUN chmod +x /usr/bin/nebula-web
diff --git a/core/nebula/controller/Makefile b/core/nebula/controller/Makefile
index a838f0b..0943f2b 100644
--- a/core/nebula/controller/Makefile
+++ b/core/nebula/controller/Makefile
@@ -1,5 +1,5 @@
 clean:
-	rm -f controller_* web_*
+	rm -f controller_*
 
 generate:
 	rm -rf generated
@@ -23,28 +23,8 @@
 	go mod vendor
 	go build -o controller_amd64 main.go
 
-controller: controller_arm64 controller_amd64
+controller: clean controller_arm64 controller_amd64
 
-web_arm64: export CGO_ENABLED=0
-web_arm64: export GO111MODULE=on
-web_arm64: export GOOS=linux
-web_arm64: export GOARCH=arm64
-web_arm64:
-	go build -o web_arm64 web.go
 
-web_amd64: export CGO_ENABLED=0
-web_amd64: export GO111MODULE=on
-web_amd64: export GOOS=linux
-web_amd64: export GOARCH=amd64
-web_amd64:
-	go build -o web_amd64 web.go
-
-web: web_arm64 web_amd64
-
-push_controller: controller
-	docker buildx build -f Dockerfile.controller --tag=giolekva/nebula-controller:latest . --platform=linux/arm64,linux/amd64 --push
-
-push_web: web
-	docker buildx build -f Dockerfile.web --tag=giolekva/nebula-web:latest . --platform=linux/arm64,linux/amd64 --push
-
-push: push_controller push_web
+push: controller
+	docker buildx build --tag=giolekva/nebula-controller:latest . --platform=linux/arm64,linux/amd64 --push
diff --git a/core/nebula/controller/controllers/ca.go b/core/nebula/controller/controllers/ca.go
index 05b5e32..37b3856 100644
--- a/core/nebula/controller/controllers/ca.go
+++ b/core/nebula/controller/controllers/ca.go
@@ -21,10 +21,10 @@
 	"k8s.io/client-go/util/workqueue"
 	"k8s.io/klog/v2"
 
-	nebulav1 "github.com/giolekva/pcloud/core/nebula/apis/nebula/v1"
-	clientset "github.com/giolekva/pcloud/core/nebula/generated/clientset/versioned"
-	informers "github.com/giolekva/pcloud/core/nebula/generated/informers/externalversions/nebula/v1"
-	listers "github.com/giolekva/pcloud/core/nebula/generated/listers/nebula/v1"
+	nebulav1 "github.com/giolekva/pcloud/core/nebula/controller/apis/nebula/v1"
+	clientset "github.com/giolekva/pcloud/core/nebula/controller/generated/clientset/versioned"
+	informers "github.com/giolekva/pcloud/core/nebula/controller/generated/informers/externalversions/nebula/v1"
+	listers "github.com/giolekva/pcloud/core/nebula/controller/generated/listers/nebula/v1"
 )
 
 var secretImmutable = true
diff --git a/core/nebula/controller/generated/clientset/versioned/clientset.go b/core/nebula/controller/generated/clientset/versioned/clientset.go
index 32ba8fe..13b6f3c 100644
--- a/core/nebula/controller/generated/clientset/versioned/clientset.go
+++ b/core/nebula/controller/generated/clientset/versioned/clientset.go
@@ -7,7 +7,7 @@
 import (
 	"fmt"
 
-	lekvav1 "github.com/giolekva/pcloud/core/nebula/generated/clientset/versioned/typed/nebula/v1"
+	lekvav1 "github.com/giolekva/pcloud/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1"
 	discovery "k8s.io/client-go/discovery"
 	rest "k8s.io/client-go/rest"
 	flowcontrol "k8s.io/client-go/util/flowcontrol"
diff --git a/core/nebula/controller/generated/clientset/versioned/fake/clientset_generated.go b/core/nebula/controller/generated/clientset/versioned/fake/clientset_generated.go
index b0512f0..2dd3fec 100644
--- a/core/nebula/controller/generated/clientset/versioned/fake/clientset_generated.go
+++ b/core/nebula/controller/generated/clientset/versioned/fake/clientset_generated.go
@@ -5,9 +5,9 @@
 package fake
 
 import (
-	clientset "github.com/giolekva/pcloud/core/nebula/generated/clientset/versioned"
-	lekvav1 "github.com/giolekva/pcloud/core/nebula/generated/clientset/versioned/typed/nebula/v1"
-	fakelekvav1 "github.com/giolekva/pcloud/core/nebula/generated/clientset/versioned/typed/nebula/v1/fake"
+	clientset "github.com/giolekva/pcloud/core/nebula/controller/generated/clientset/versioned"
+	lekvav1 "github.com/giolekva/pcloud/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1"
+	fakelekvav1 "github.com/giolekva/pcloud/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/fake"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/watch"
 	"k8s.io/client-go/discovery"
diff --git a/core/nebula/controller/generated/clientset/versioned/fake/register.go b/core/nebula/controller/generated/clientset/versioned/fake/register.go
index aa322cb..47f8b3a 100644
--- a/core/nebula/controller/generated/clientset/versioned/fake/register.go
+++ b/core/nebula/controller/generated/clientset/versioned/fake/register.go
@@ -5,7 +5,7 @@
 package fake
 
 import (
-	lekvav1 "github.com/giolekva/pcloud/core/nebula/apis/nebula/v1"
+	lekvav1 "github.com/giolekva/pcloud/core/nebula/controller/apis/nebula/v1"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
 	schema "k8s.io/apimachinery/pkg/runtime/schema"
diff --git a/core/nebula/controller/generated/clientset/versioned/scheme/register.go b/core/nebula/controller/generated/clientset/versioned/scheme/register.go
index e27332c..31b531f 100644
--- a/core/nebula/controller/generated/clientset/versioned/scheme/register.go
+++ b/core/nebula/controller/generated/clientset/versioned/scheme/register.go
@@ -5,7 +5,7 @@
 package scheme
 
 import (
-	lekvav1 "github.com/giolekva/pcloud/core/nebula/apis/nebula/v1"
+	lekvav1 "github.com/giolekva/pcloud/core/nebula/controller/apis/nebula/v1"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
 	schema "k8s.io/apimachinery/pkg/runtime/schema"
diff --git a/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/fake/fake_nebula_client.go b/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/fake/fake_nebula_client.go
index e5f530e..041fc54 100644
--- a/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/fake/fake_nebula_client.go
+++ b/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/fake/fake_nebula_client.go
@@ -5,7 +5,7 @@
 package fake
 
 import (
-	v1 "github.com/giolekva/pcloud/core/nebula/generated/clientset/versioned/typed/nebula/v1"
+	v1 "github.com/giolekva/pcloud/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1"
 	rest "k8s.io/client-go/rest"
 	testing "k8s.io/client-go/testing"
 )
diff --git a/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/fake/fake_nebulaca.go b/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/fake/fake_nebulaca.go
index 22182e2..8b95a2e 100644
--- a/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/fake/fake_nebulaca.go
+++ b/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/fake/fake_nebulaca.go
@@ -7,7 +7,7 @@
 import (
 	"context"
 
-	nebulav1 "github.com/giolekva/pcloud/core/nebula/apis/nebula/v1"
+	nebulav1 "github.com/giolekva/pcloud/core/nebula/controller/apis/nebula/v1"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	labels "k8s.io/apimachinery/pkg/labels"
 	schema "k8s.io/apimachinery/pkg/runtime/schema"
diff --git a/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/fake/fake_nebulanode.go b/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/fake/fake_nebulanode.go
index cbd3957..4c7cc52 100644
--- a/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/fake/fake_nebulanode.go
+++ b/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/fake/fake_nebulanode.go
@@ -7,7 +7,7 @@
 import (
 	"context"
 
-	nebulav1 "github.com/giolekva/pcloud/core/nebula/apis/nebula/v1"
+	nebulav1 "github.com/giolekva/pcloud/core/nebula/controller/apis/nebula/v1"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	labels "k8s.io/apimachinery/pkg/labels"
 	schema "k8s.io/apimachinery/pkg/runtime/schema"
diff --git a/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/nebula_client.go b/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/nebula_client.go
index 261bb36..eca015b 100644
--- a/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/nebula_client.go
+++ b/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/nebula_client.go
@@ -5,8 +5,8 @@
 package v1
 
 import (
-	v1 "github.com/giolekva/pcloud/core/nebula/apis/nebula/v1"
-	"github.com/giolekva/pcloud/core/nebula/generated/clientset/versioned/scheme"
+	v1 "github.com/giolekva/pcloud/core/nebula/controller/apis/nebula/v1"
+	"github.com/giolekva/pcloud/core/nebula/controller/generated/clientset/versioned/scheme"
 	rest "k8s.io/client-go/rest"
 )
 
diff --git a/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/nebulaca.go b/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/nebulaca.go
index 11aa718..1d136cc 100644
--- a/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/nebulaca.go
+++ b/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/nebulaca.go
@@ -8,8 +8,8 @@
 	"context"
 	"time"
 
-	v1 "github.com/giolekva/pcloud/core/nebula/apis/nebula/v1"
-	scheme "github.com/giolekva/pcloud/core/nebula/generated/clientset/versioned/scheme"
+	v1 "github.com/giolekva/pcloud/core/nebula/controller/apis/nebula/v1"
+	scheme "github.com/giolekva/pcloud/core/nebula/controller/generated/clientset/versioned/scheme"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	types "k8s.io/apimachinery/pkg/types"
 	watch "k8s.io/apimachinery/pkg/watch"
diff --git a/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/nebulanode.go b/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/nebulanode.go
index 4c38986..28a367e 100644
--- a/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/nebulanode.go
+++ b/core/nebula/controller/generated/clientset/versioned/typed/nebula/v1/nebulanode.go
@@ -8,8 +8,8 @@
 	"context"
 	"time"
 
-	v1 "github.com/giolekva/pcloud/core/nebula/apis/nebula/v1"
-	scheme "github.com/giolekva/pcloud/core/nebula/generated/clientset/versioned/scheme"
+	v1 "github.com/giolekva/pcloud/core/nebula/controller/apis/nebula/v1"
+	scheme "github.com/giolekva/pcloud/core/nebula/controller/generated/clientset/versioned/scheme"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	types "k8s.io/apimachinery/pkg/types"
 	watch "k8s.io/apimachinery/pkg/watch"
diff --git a/core/nebula/controller/generated/informers/externalversions/factory.go b/core/nebula/controller/generated/informers/externalversions/factory.go
index eef24ab..c5b3ba3 100644
--- a/core/nebula/controller/generated/informers/externalversions/factory.go
+++ b/core/nebula/controller/generated/informers/externalversions/factory.go
@@ -9,9 +9,9 @@
 	sync "sync"
 	time "time"
 
-	versioned "github.com/giolekva/pcloud/core/nebula/generated/clientset/versioned"
-	internalinterfaces "github.com/giolekva/pcloud/core/nebula/generated/informers/externalversions/internalinterfaces"
-	nebula "github.com/giolekva/pcloud/core/nebula/generated/informers/externalversions/nebula"
+	versioned "github.com/giolekva/pcloud/core/nebula/controller/generated/clientset/versioned"
+	internalinterfaces "github.com/giolekva/pcloud/core/nebula/controller/generated/informers/externalversions/internalinterfaces"
+	nebula "github.com/giolekva/pcloud/core/nebula/controller/generated/informers/externalversions/nebula"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
 	schema "k8s.io/apimachinery/pkg/runtime/schema"
diff --git a/core/nebula/controller/generated/informers/externalversions/generic.go b/core/nebula/controller/generated/informers/externalversions/generic.go
index 9df56e4..9507c7a 100644
--- a/core/nebula/controller/generated/informers/externalversions/generic.go
+++ b/core/nebula/controller/generated/informers/externalversions/generic.go
@@ -7,7 +7,7 @@
 import (
 	"fmt"
 
-	v1 "github.com/giolekva/pcloud/core/nebula/apis/nebula/v1"
+	v1 "github.com/giolekva/pcloud/core/nebula/controller/apis/nebula/v1"
 	schema "k8s.io/apimachinery/pkg/runtime/schema"
 	cache "k8s.io/client-go/tools/cache"
 )
diff --git a/core/nebula/controller/generated/informers/externalversions/internalinterfaces/factory_interfaces.go b/core/nebula/controller/generated/informers/externalversions/internalinterfaces/factory_interfaces.go
index 602d1ad..5a1648a 100644
--- a/core/nebula/controller/generated/informers/externalversions/internalinterfaces/factory_interfaces.go
+++ b/core/nebula/controller/generated/informers/externalversions/internalinterfaces/factory_interfaces.go
@@ -7,7 +7,7 @@
 import (
 	time "time"
 
-	versioned "github.com/giolekva/pcloud/core/nebula/generated/clientset/versioned"
+	versioned "github.com/giolekva/pcloud/core/nebula/controller/generated/clientset/versioned"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
 	cache "k8s.io/client-go/tools/cache"
diff --git a/core/nebula/controller/generated/informers/externalversions/nebula/interface.go b/core/nebula/controller/generated/informers/externalversions/nebula/interface.go
index 6061070..a8cb99d 100644
--- a/core/nebula/controller/generated/informers/externalversions/nebula/interface.go
+++ b/core/nebula/controller/generated/informers/externalversions/nebula/interface.go
@@ -5,8 +5,8 @@
 package nebula
 
 import (
-	internalinterfaces "github.com/giolekva/pcloud/core/nebula/generated/informers/externalversions/internalinterfaces"
-	v1 "github.com/giolekva/pcloud/core/nebula/generated/informers/externalversions/nebula/v1"
+	internalinterfaces "github.com/giolekva/pcloud/core/nebula/controller/generated/informers/externalversions/internalinterfaces"
+	v1 "github.com/giolekva/pcloud/core/nebula/controller/generated/informers/externalversions/nebula/v1"
 )
 
 // Interface provides access to each of this group's versions.
diff --git a/core/nebula/controller/generated/informers/externalversions/nebula/v1/interface.go b/core/nebula/controller/generated/informers/externalversions/nebula/v1/interface.go
index eb7fc27..e2a49bd 100644
--- a/core/nebula/controller/generated/informers/externalversions/nebula/v1/interface.go
+++ b/core/nebula/controller/generated/informers/externalversions/nebula/v1/interface.go
@@ -5,7 +5,7 @@
 package v1
 
 import (
-	internalinterfaces "github.com/giolekva/pcloud/core/nebula/generated/informers/externalversions/internalinterfaces"
+	internalinterfaces "github.com/giolekva/pcloud/core/nebula/controller/generated/informers/externalversions/internalinterfaces"
 )
 
 // Interface provides access to all the informers in this group version.
diff --git a/core/nebula/controller/generated/informers/externalversions/nebula/v1/nebulaca.go b/core/nebula/controller/generated/informers/externalversions/nebula/v1/nebulaca.go
index eda6a7a..3848222 100644
--- a/core/nebula/controller/generated/informers/externalversions/nebula/v1/nebulaca.go
+++ b/core/nebula/controller/generated/informers/externalversions/nebula/v1/nebulaca.go
@@ -8,10 +8,10 @@
 	"context"
 	time "time"
 
-	nebulav1 "github.com/giolekva/pcloud/core/nebula/apis/nebula/v1"
-	versioned "github.com/giolekva/pcloud/core/nebula/generated/clientset/versioned"
-	internalinterfaces "github.com/giolekva/pcloud/core/nebula/generated/informers/externalversions/internalinterfaces"
-	v1 "github.com/giolekva/pcloud/core/nebula/generated/listers/nebula/v1"
+	nebulav1 "github.com/giolekva/pcloud/core/nebula/controller/apis/nebula/v1"
+	versioned "github.com/giolekva/pcloud/core/nebula/controller/generated/clientset/versioned"
+	internalinterfaces "github.com/giolekva/pcloud/core/nebula/controller/generated/informers/externalversions/internalinterfaces"
+	v1 "github.com/giolekva/pcloud/core/nebula/controller/generated/listers/nebula/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
 	watch "k8s.io/apimachinery/pkg/watch"
diff --git a/core/nebula/controller/generated/informers/externalversions/nebula/v1/nebulanode.go b/core/nebula/controller/generated/informers/externalversions/nebula/v1/nebulanode.go
index b3d3c65..142314d 100644
--- a/core/nebula/controller/generated/informers/externalversions/nebula/v1/nebulanode.go
+++ b/core/nebula/controller/generated/informers/externalversions/nebula/v1/nebulanode.go
@@ -8,10 +8,10 @@
 	"context"
 	time "time"
 
-	nebulav1 "github.com/giolekva/pcloud/core/nebula/apis/nebula/v1"
-	versioned "github.com/giolekva/pcloud/core/nebula/generated/clientset/versioned"
-	internalinterfaces "github.com/giolekva/pcloud/core/nebula/generated/informers/externalversions/internalinterfaces"
-	v1 "github.com/giolekva/pcloud/core/nebula/generated/listers/nebula/v1"
+	nebulav1 "github.com/giolekva/pcloud/core/nebula/controller/apis/nebula/v1"
+	versioned "github.com/giolekva/pcloud/core/nebula/controller/generated/clientset/versioned"
+	internalinterfaces "github.com/giolekva/pcloud/core/nebula/controller/generated/informers/externalversions/internalinterfaces"
+	v1 "github.com/giolekva/pcloud/core/nebula/controller/generated/listers/nebula/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
 	watch "k8s.io/apimachinery/pkg/watch"
diff --git a/core/nebula/controller/generated/listers/nebula/v1/nebulaca.go b/core/nebula/controller/generated/listers/nebula/v1/nebulaca.go
index a261c9d..ad4bedf 100644
--- a/core/nebula/controller/generated/listers/nebula/v1/nebulaca.go
+++ b/core/nebula/controller/generated/listers/nebula/v1/nebulaca.go
@@ -5,7 +5,7 @@
 package v1
 
 import (
-	v1 "github.com/giolekva/pcloud/core/nebula/apis/nebula/v1"
+	v1 "github.com/giolekva/pcloud/core/nebula/controller/apis/nebula/v1"
 	"k8s.io/apimachinery/pkg/api/errors"
 	"k8s.io/apimachinery/pkg/labels"
 	"k8s.io/client-go/tools/cache"
diff --git a/core/nebula/controller/generated/listers/nebula/v1/nebulanode.go b/core/nebula/controller/generated/listers/nebula/v1/nebulanode.go
index f861e18..d3490f5 100644
--- a/core/nebula/controller/generated/listers/nebula/v1/nebulanode.go
+++ b/core/nebula/controller/generated/listers/nebula/v1/nebulanode.go
@@ -5,7 +5,7 @@
 package v1
 
 import (
-	v1 "github.com/giolekva/pcloud/core/nebula/apis/nebula/v1"
+	v1 "github.com/giolekva/pcloud/core/nebula/controller/apis/nebula/v1"
 	"k8s.io/apimachinery/pkg/api/errors"
 	"k8s.io/apimachinery/pkg/labels"
 	"k8s.io/client-go/tools/cache"
diff --git a/core/nebula/controller/go.mod b/core/nebula/controller/go.mod
index ea547d2..34620b1 100644
--- a/core/nebula/controller/go.mod
+++ b/core/nebula/controller/go.mod
@@ -1,9 +1,8 @@
-module github.com/giolekva/pcloud/core/nebula
+module github.com/giolekva/pcloud/core/nebula/controller
 
 go 1.16
 
 require (
-	github.com/gorilla/mux v1.8.0
 	k8s.io/api v0.22.2
 	k8s.io/apimachinery v0.22.2
 	k8s.io/client-go v0.22.2
diff --git a/core/nebula/controller/go.sum b/core/nebula/controller/go.sum
index 0bfb743..8cf33e5 100644
--- a/core/nebula/controller/go.sum
+++ b/core/nebula/controller/go.sum
@@ -129,8 +129,6 @@
 github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
 github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw=
 github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA=
-github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
-github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
 github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
diff --git a/core/nebula/controller/hack/generate.sh b/core/nebula/controller/hack/generate.sh
index c022cc3..a58891d 100755
--- a/core/nebula/controller/hack/generate.sh
+++ b/core/nebula/controller/hack/generate.sh
@@ -2,7 +2,7 @@
 
 bash vendor/k8s.io/code-generator/generate-groups.sh \
      all \
-     github.com/giolekva/pcloud/core/nebula/generated \
-     github.com/giolekva/pcloud/core/nebula/apis \
+     github.com/giolekva/pcloud/core/nebula/controller/generated \
+     github.com/giolekva/pcloud/core/nebula/controller/apis \
      "nebula:v1" \
      --go-header-file hack/boilerplate.go.txt
diff --git a/core/nebula/controller/main.go b/core/nebula/controller/main.go
index 9abfc9e..e230129 100644
--- a/core/nebula/controller/main.go
+++ b/core/nebula/controller/main.go
@@ -9,10 +9,10 @@
 	"k8s.io/client-go/kubernetes"
 	"k8s.io/client-go/tools/clientcmd"
 
-	controllers "github.com/giolekva/pcloud/core/nebula/controllers"
-	clientset "github.com/giolekva/pcloud/core/nebula/generated/clientset/versioned"
-	"github.com/giolekva/pcloud/core/nebula/generated/clientset/versioned/scheme"
-	informers "github.com/giolekva/pcloud/core/nebula/generated/informers/externalversions"
+	controllers "github.com/giolekva/pcloud/core/nebula/controller/controllers"
+	clientset "github.com/giolekva/pcloud/core/nebula/controller/generated/clientset/versioned"
+	"github.com/giolekva/pcloud/core/nebula/controller/generated/clientset/versioned/scheme"
+	informers "github.com/giolekva/pcloud/core/nebula/controller/generated/informers/externalversions"
 
 	nebulascheme "k8s.io/sample-controller/pkg/generated/clientset/versioned/scheme"
 )
diff --git a/core/nebula/controller/templates/index.html b/core/nebula/controller/templates/index.html
deleted file mode 100644
index ac5ae32..0000000
--- a/core/nebula/controller/templates/index.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="utf-8" />
-    <title>Nebula Mesh VPN Manager</title>
-</head>
-<body>
-    <form action="/sign-node" method="POST">
-	<label for="ca-name">CA Name:</label><br />
-	<input type="text" name="ca-name" /><br />
-	<label for="ca-namespace">CA Namespace:</label><br />
-	<input type="text" name="ca-namespace" /><br />
-	<label for="node-name">Node Name:</label><br />
-	<input type="text" name="node-name" /><br />
-	<label for="node-namespace">Node Namespace:</label><br />
-	<input type="text" name="node-namespace" /><br />
-	<label for="ip-cidr">IP/CIDR:</label><br />
-	<input type="text" name="ip-cidr" /><br />
-	<label for="pub-key">Public Key:</label><br />
-	<textarea name="pub-key">Put node public key here</textarea><br />
-	<input type="submit" value="Sign node key" />
-    </form>
-    {{range .}}
-    <a href="/ca/{{.Namespace}}/{{.Name}}"><h1>{{.Name}}</h1></a>
-    <table>
-	<tr>
-	    <th>Node</th>
-	    <th>IP</th>
-	</tr>
-	{{range .Nodes}}
-	<tr>
-	    <td>
-		<a href="/node/{{.Namespace}}/{{.Name}}">{{.Name}}</a>
-	    </td>
-	    <td>
-		{{.IP}}
-	    </td>
-	</tr>
-	{{end}}
-    </table>
-    {{end}}
-</body>
-</html>
-
diff --git a/core/nebula/controller/web.go b/core/nebula/controller/web.go
deleted file mode 100644
index 8738cd4..0000000
--- a/core/nebula/controller/web.go
+++ /dev/null
@@ -1,225 +0,0 @@
-package main
-
-import (
-	"context"
-	"embed"
-	"flag"
-	"fmt"
-	"html/template"
-	"log"
-	"net/http"
-
-	"github.com/gorilla/mux"
-
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/client-go/kubernetes"
-	"k8s.io/client-go/tools/clientcmd"
-
-	nebulav1 "github.com/giolekva/pcloud/core/nebula/apis/nebula/v1"
-	clientset "github.com/giolekva/pcloud/core/nebula/generated/clientset/versioned"
-)
-
-var port = flag.Int("port", 8080, "Port to listen on.")
-var kubeConfig = flag.String("kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.")
-var masterURL = flag.String("master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.")
-
-//go:embed templates/*
-var tmpls embed.FS
-
-type Templates struct {
-	Index *template.Template
-}
-
-func ParseTemplates(fs embed.FS) (*Templates, error) {
-	index, err := template.ParseFS(fs, "templates/index.html")
-	if err != nil {
-		return nil, err
-	}
-	return &Templates{index}, nil
-}
-
-type nebulaCA struct {
-	Name      string
-	Namespace string
-	Nodes     []nebulaNode
-}
-
-type nebulaNode struct {
-	Name      string
-	Namespace string
-	IP        string
-}
-
-type Manager struct {
-	kubeClient   kubernetes.Interface
-	nebulaClient clientset.Interface
-}
-
-func (m *Manager) ListAll() ([]*nebulaCA, error) {
-	ret := make([]*nebulaCA, 0)
-	cas, err := m.nebulaClient.LekvaV1().NebulaCAs("").List(context.TODO(), metav1.ListOptions{})
-	if err != nil {
-		return nil, err
-	}
-	for _, ca := range cas.Items {
-		ret = append(ret, &nebulaCA{
-			Name:      ca.Name,
-			Namespace: ca.Namespace,
-			Nodes:     make([]nebulaNode, 0),
-		})
-	}
-	nodes, err := m.nebulaClient.LekvaV1().NebulaNodes("").List(context.TODO(), metav1.ListOptions{})
-	if err != nil {
-		return nil, err
-	}
-	for _, node := range nodes.Items {
-		for _, ca := range ret {
-			if ca.Name == node.Spec.CAName {
-				ca.Nodes = append(ca.Nodes, nebulaNode{
-					Name:      node.Name,
-					Namespace: node.Namespace,
-					IP:        node.Spec.IPCidr,
-				})
-			}
-		}
-	}
-	return ret, nil
-}
-
-func (m *Manager) createNode(namespace, name, caNamespace, caName, ipCidr, pubKey string) (string, string, error) {
-	node := &nebulav1.NebulaNode{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      name,
-			Namespace: namespace,
-		},
-		Spec: nebulav1.NebulaNodeSpec{
-			CAName:      caName,
-			CANamespace: caNamespace,
-			IPCidr:      ipCidr,
-			PubKey:      pubKey,
-			SecretName:  fmt.Sprintf("%s-cert", name),
-		},
-	}
-	node, err := m.nebulaClient.LekvaV1().NebulaNodes(namespace).Create(context.TODO(), node, metav1.CreateOptions{})
-	if err != nil {
-		return "", "", err
-	}
-	return node.Namespace, node.Name, nil
-}
-
-func (m *Manager) getNodeCertQR(namespace, name string) ([]byte, error) {
-	node, err := m.nebulaClient.LekvaV1().NebulaNodes(namespace).Get(context.TODO(), name, metav1.GetOptions{})
-	if err != nil {
-		return nil, err
-	}
-	secret, err := m.kubeClient.CoreV1().Secrets(namespace).Get(context.TODO(), node.Spec.SecretName, metav1.GetOptions{})
-	if err != nil {
-		return nil, err
-	}
-	return secret.Data["host.png"], nil
-}
-
-func (m *Manager) getCACertQR(namespace, name string) ([]byte, error) {
-	ca, err := m.nebulaClient.LekvaV1().NebulaCAs(namespace).Get(context.TODO(), name, metav1.GetOptions{})
-	if err != nil {
-		return nil, err
-	}
-	secret, err := m.kubeClient.CoreV1().Secrets(namespace).Get(context.TODO(), ca.Spec.SecretName, metav1.GetOptions{})
-	if err != nil {
-		return nil, err
-	}
-	return secret.Data["ca.png"], nil
-}
-
-type Handler struct {
-	mgr   Manager
-	tmpls *Templates
-}
-
-func (h *Handler) handleIndex(w http.ResponseWriter, r *http.Request) {
-	cas, err := h.mgr.ListAll()
-	if err != nil {
-		http.Error(w, err.Error(), http.StatusInternalServerError)
-		return
-	}
-	if err := h.tmpls.Index.Execute(w, cas); err != nil {
-		http.Error(w, err.Error(), http.StatusInternalServerError)
-	}
-}
-
-func (h *Handler) handleNode(w http.ResponseWriter, r *http.Request) {
-	vars := mux.Vars(r)
-	namespace := vars["namespace"]
-	name := vars["name"]
-	qr, err := h.mgr.getNodeCertQR(namespace, name)
-	if err != nil {
-		http.Error(w, err.Error(), http.StatusInternalServerError)
-	}
-	w.Header().Set("Content-Type", "img/png")
-	w.Write(qr)
-}
-
-func (h *Handler) handleCA(w http.ResponseWriter, r *http.Request) {
-	vars := mux.Vars(r)
-	namespace := vars["namespace"]
-	name := vars["name"]
-	qr, err := h.mgr.getCACertQR(namespace, name)
-	if err != nil {
-		http.Error(w, err.Error(), http.StatusInternalServerError)
-	}
-	w.Header().Set("Content-Type", "img/png")
-	w.Write(qr)
-}
-
-func (h *Handler) handleSignNode(w http.ResponseWriter, r *http.Request) {
-	if err := r.ParseForm(); err != nil {
-		http.Error(w, err.Error(), http.StatusBadRequest)
-		return
-	}
-	_, _, err := h.mgr.createNode(
-		r.FormValue("node-namespace"),
-		r.FormValue("node-name"),
-		r.FormValue("ca-namespace"),
-		r.FormValue("ca-name"),
-		r.FormValue("ip-cidr"),
-		r.FormValue("pub-key"),
-	)
-	if err != nil {
-		http.Error(w, err.Error(), http.StatusInternalServerError)
-		return
-	}
-	http.Redirect(w, r, "/", http.StatusSeeOther)
-}
-
-func main() {
-	flag.Parse()
-	cfg, err := clientcmd.BuildConfigFromFlags(*masterURL, *kubeConfig)
-	if err != nil {
-		panic(err)
-	}
-	kubeClient, err := kubernetes.NewForConfig(cfg)
-	if err != nil {
-		panic(err)
-	}
-	nebulaClient := clientset.NewForConfigOrDie(cfg)
-	t, err := ParseTemplates(tmpls)
-	if err != nil {
-		log.Fatal(err)
-	}
-	mgr := Manager{
-		kubeClient:   kubeClient,
-		nebulaClient: nebulaClient,
-	}
-	handler := Handler{
-		mgr:   mgr,
-		tmpls: t,
-	}
-	r := mux.NewRouter()
-	r.HandleFunc("/node/{namespace:[a-zA-z0-9-]+}/{name:[a-zA-z0-9-]+}", handler.handleNode)
-	r.HandleFunc("/ca/{namespace:[a-zA-z0-9-]+}/{name:[a-zA-z0-9-]+}", handler.handleCA)
-	r.HandleFunc("/sign-node", handler.handleSignNode)
-	r.HandleFunc("/", handler.handleIndex)
-	http.Handle("/", r)
-	fmt.Printf("Starting HTTP server on port: %d\n", *port)
-	log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", *port), nil))
-}