HobbyFarm
Hobbyfarm is an interactive coding platform that runs in the browser
🌐 hobbyfarm.github.io, docs, organization, issues
Software design
Technologies
- Front-end: Angular
- Back-end: Go
- Documentation: Markdown
- Website: Hugo
Code repositories
| Name | Content |
|---|---|
| admin-ui | HobbyFarm administration UI (web application) |
| ec2-operator | Amazon EC2 operator for HobbyFarm |
| gargantua | HobbyFarm back-end (monolith application) |
| hfcli | HobbyFarm Command Line Interface (CLI) |
| hobbyfarm | HobbyFarm Helm chart |
| hobbyfarm.github.io | HobbyFarm documentation/website |
| ui | HobbyFarm UI |
Local setup
- Start Gargantua
- Start Admin UI
- TODO
Operations
Installation
References
Contributing
Code logic
The application processing starts with main.go file at the root of the source files. All the other go code is located in pkg folder.
How it works:
- Clients are TODO
- Controllers are TODO
- Servers define the REST API entry points (route,method -> action)
AuthServerCourseServerEnvironmentServerProgressServerRbacServerScenarioServerScheduleEventServerSessionServerUserServerVmServerVmSetServerVmTemplateServer
Local Development
- Go 1.19 must be installed
go version
- Build the application
go build
- Start local Kubernetes cluster
k3d cluster create hobbyfarm --api-port 6550 -p "8081:80@loadbalancer" -p "8082:443@loadbalancer" --agents 1
- Create manifest files:
---
# rolebindings.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: hobbyfarm-admin-rolebinding
subjects:
- kind: User
name: admin
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: hobbyfarm-admin
apiGroup: rbac.authorization.k8s.io
---
# roles.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: hobbyfarm-admin
rules:
- apiGroups: ["hobbyfarm.io"]
resources: ["*"]
verbs: ["*"]
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["roles", "rolebindings"]
verbs: ["*"]
---
# users.yaml
apiVersion: hobbyfarm.io/v1
kind: User
metadata:
name: admin
spec:
id: admin
email: admin
password: $2a$10$33fQs0G.lHQdDAsdoECgA.8iYvNtyJ2XC2AmvR5x6ZkzxSuKXyfFm
access_codes:
- training
settings:
ctr_enabled: "true"
ctxAccessCode: example-access-code
terminal_fontSize: "16"
terminal_theme: Solarized_Dark_Higher_Contrast
- Define Kubernetes objects needed by HobbyFarm
kubectl create ns hobbyfarm
kubectl apply -f samples/kubernetes/roles.yaml -n hobbyfarm
kubectl apply -f samples/kubernetes/users.yaml -n hobbyfarm
kubectl apply -f samples/kubernetes/rolebindings.yaml -n hobbyfarm
- Create CA and TLS files (see How To Create CA and Generate SSL/TLS Certificates & Keys)
cd .ssl/
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes \
-key ca.key -subj "/CN=hobbyfarm/C=US/L=CALIFORNIA" \
-days 1825 -out ca.crt
openssl genrsa -out server.key 2048
cat > csr.conf <<EOF
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
C = US
ST = California
L = San Fransisco
O = HobbyFarm
OU = HobbyFarm Dev
CN = hobbyfarm.github.io
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = hobbyfarm
DNS.2 = hobbyfarm.dev.local
EOF
openssl req -new -key server.key -out server.csr -config csr.conf
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out server.crt -days 10000 \
-extfile csr.conf
cd ..
- Run the application
go run . --kubeconfig=%userprofile%\.kube\config --webhook-tls-cert=.ssl/server.crt --webhook-tls-key=.ssl/server.key -webhook-tls-ca=.ssl/ca.crt -logtostderr -v=9 -nowebwookcall=true
Local Development via docker-compose
First, start the docker-compose stack in hobbyfarm/hobbyfarm to provide a local kind cluster for CRDs.
Next, run:
# create or start stack
./compose.sh up
# -- or --
# start the stack, building changes to local dev container
# only needed if a file in ./cicd/docker-local has changed
./compose.sh up --build
# stop stack
./compose.sh stop
# destroy stack
./compose.sh destroy
The script ./compose-up.sh does the following:
- connects to the external docker network
hobbyfarm-dev - mounts the external volume for kube service account credentials called
hobbyfarm-kube-sa - calls
docker-compose up- creates or starts the
hf-gargcontainer, which runs a watch loop on golang files, re-builds on change, and listens on localhost:16210
- creates or starts the
To modify docker-compose variables for your local environment, copy .env.example to .env and update variables as needed.