14 Commits
1.0.1 ... 1.0.6

Author SHA1 Message Date
aa23f2f9b3 version 1.0.6 2020-08-29 12:44:03 -06:00
517e7b3e6a Upgrade to wiki 0.21.2 2020-08-29 12:42:28 -06:00
d5b43b160a add NPM_CONFIG_PREFIX environment variable
Should remove one step from the instructions for developing plugins.
It's a step I consistently miss in my haste to get on with the hacking
and don't notice myself skip.
2020-08-29 12:37:30 -06:00
f94133b505 bump to wiki-client@0.20.1 and wiki-server@0.17.5 2020-04-19 17:35:00 -06:00
60c869a141 Anticipating next wiki release with updates to wiki-client & -server 2020-02-17 09:55:38 -07:00
347dff8ea8 Clarify our use versions and improve guidance for tagging
git push --tags sends all the tags to the server.
git push origin <tag> sends only the new tag to the server.
2020-02-06 09:08:06 -07:00
82dacc05d9 Upgrade to wiki 0.21.0 2020-02-06 08:56:49 -07:00
f67be8dbb8 Install and unseal vault for experiments with secrets management 2020-01-20 00:19:05 -07:00
c4bd44f3f4 Provide example farm configuration for friends security plugin 2020-01-19 15:22:03 -07:00
9d83a6768d Ensure localhost is included in k8s cluster TLS cert
See explanation here:
https://github.com/rancher/k3d/issues/143\#issuecomment-552634281

--server-arg passes the --tls-san=... argument through to k3s server.
Docs for that arg are here:
https://rancher.com/docs/k3s/latest/en/installation/install-options/
2020-01-19 15:13:24 -07:00
45dbb893d1 Simplest wiki command that could possibly work
Now that we've figured out how to mount local directories into the k8s
cluster, we have moved all the configuration into ~/.wiki-k8s/config.json
2020-01-19 15:11:12 -07:00
eaa86fd867 Simplify persistence configuration & expose macos folders
We now map ~/.wiki-k8s in MacOS into the .wiki folder inside the
container and similarly with MacOS ~/workspace/fedwiki

First, when we create the k3d cluster, we include directives that are
passed through to docker to mount the MacOS directories into the
kubernetes host.

Second, we use hostPath volumes in the kubernetes deployment config.

These will work great for the primary use case of a local wiki.
Deployments to remote kubernetes clusters will want to do this with
the PersistentVolumeClaim that was removed with this change.

One luxury of using hostPath and the legacy_security is that we no
longer require an init container.
2020-01-12 19:29:41 -07:00
37d6785ee2 Change the insecure wiki to a farm for *.simple.localtest.me 2020-01-12 16:55:14 -07:00
27a80c7b25 Start an insecure wiki under simple.localtest.me
Bootstrapping a simpler development environment
2020-01-12 15:30:42 -07:00
8 changed files with 322 additions and 114 deletions

View File

@ -5,12 +5,15 @@ RUN apk add --update --no-cache \
git \
jq
WORKDIR "/home/node"
ARG WIKI_PACKAGE=wiki@0.20.0
ARG WIKI_PACKAGE=wiki@0.21.2
RUN su node -c "npm install -g --prefix . $WIKI_PACKAGE"
RUN su node -c "mkdir -p .wiki"
VOLUME "/home/node/.wiki"
EXPOSE 3000
USER node
ENV PATH="${PATH}:/home/node/bin"
# Adding this line to make local plugin development easier
# see https://local-farm.wiki.dbbs.co/make-a-new-plugin.html
ENV NPM_CONFIG_PREFIX="${HOME}"
ENTRYPOINT ["dumb-init"]
CMD ["wiki", "--farm", "--security_type=friends"]

View File

@ -35,24 +35,26 @@ The last non-breaking revision is 0.52.0 https://github.com/dobbs/farm/tree/0.52
# Development
This image's tag does not match the version of the included wiki software.
This image's tag does not match the version of the included wiki
software. Our version indicates the scale of changes in this tiny
devops pipeline. For example, when we changed the `USER` directive and
removed the wiki config generation scripts, we bumped the major
version from 0.50.x to 1.0.x.
Notes to self:
``` bash
docker build --tag dobbs/farm:0.51.0 .
git tag -am "" '0.51.0'
git push --tags
docker build --tag dobbs/farm:1.0.2 .
git tag -am "" '1.0.2'
git push origin '1.0.2'
```
The repos in Dockerhub and GitHub are configured to automatically build new tags.
# Publish experimental plugins
Invoke Dockerhub and GitHub integration.
``` bash
docker build \
--tag dobbs/farm:0.14.0-frame \
--build-arg WIKI_PACKAGE='dobbs/wiki#frame' \
.
docker push dobbs/farm:0.14.0-frame
git tag -am "" '1.0.2-pre-0217'
git push --atomic origin master '1.0.2-pre-0217'
```

View File

@ -3,11 +3,46 @@
There are easier ways to get started with federated wiki. Here we are
using wiki to drive some learning about kubernetes.
# We're using MacOS, Docker Desktop, and kind
# We're using MacOS, Docker Desktop, and k3d
brew cask install docker
brew install kind
kind create cluster --name wiki
brew install k3d
mkdir -p ~/.wiki-k8s ~/workspace/fedwiki
k3d create \
--server-arg --tls-san="127.0.0.1" \
--publish 80:80 \
-v "$HOME/.wiki-k8s:/macos/.wiki-k8s" \
-v "$HOME/workspace/fedwiki:/macos/fedwiki" \
--name wiki
# example ~/.wiki-k8s/config.json
{
"admin": "any memorable password",
"autoseed": true,
"farm": true,
"cookieSecret": "any random string",
"secure_cookie": false,
"security_type": "friends",
"wikiDomains": {
"simple.localtest.me": {
"id": "/home/node/.wiki/config.owner.json"
}
}
}
# example ~/.wiki-k8s/config.owner.json
`.friend.secret` must match the `.admin` field from `config.json`
{
"name": "The Owner",
"friend": {
"secret": "any memorable password"
}
}
# Deploy Wiki
@ -15,13 +50,4 @@ using wiki to drive some learning about kubernetes.
# Play with the wiki
# pbcopy & open are MacOS commands
kubectl port-forward svc/wiki-service 3000:80 \
> port-forward.log \
2> port-forward.err &
# get admin password on the clipboard
kubectl exec svc/wiki-service -- \
jq -r .admin .wiki/config.json \
| pbcopy
open http://localhost:3000
# login with the password on the clipboard
open http://simple.localtest.me

View File

@ -0,0 +1,29 @@
# HashiCorp Vault in kubernetes
HashiCorp recomend installing vault via helm. Your author prefers
plain old kubernetes configs.
So we generated the yaml via helm's template command.
helm template incubator/vault \
--name-template=vault \
--replicaCount=1 \
--set vault.dev=false \
--set vault.config.storage.file.path=/macos/.wiki-k8s/vault \
| egrep -v 'heritage: "?Helm"?' \
> vault.html
kubectl apply -k .
kubectl port-forward svc/vault 8200:8200 &> /dev/null &
export VAULT_ADDR=http://127.0.0.1:8200
vault status
vault operator init
vault operator unseal
# paste key-fragment 1
vault operator unseal
# paste key-fragment 2
vault operator unseal
# paste key-fragment 3
vault login
# paste root token

View File

@ -0,0 +1,16 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: vault
spec:
template:
spec:
containers:
- name: vault
volumeMounts:
- name: vault-data
mountPath: /macos/.wiki-k8s/vault
volumes:
- name: vault-data
hostPath:
path: /macos/.wiki-k8s/vault

View File

@ -0,0 +1,10 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
images:
- name: vault
newName: vault
newTag: 1.3.1
resources:
- vault.yaml
patchesStrategicMerge:
- deployment-volumes.yaml

View File

@ -0,0 +1,181 @@
---
# Source: vault/templates/clusterrolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: vault
labels:
app: vault
release: "vault"
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- kind: ServiceAccount
name: vault
namespace: default
---
# Source: vault/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: "vault-config"
labels:
app: "vault"
release: "vault"
data:
config.json: |
{"listener":{"tcp":{"address":"[::]:8200","cluster_address":"[::]:8201","tls_disable":true}},"storage":{"file":{"path":"/macos/.wiki-k8s/vault"}}}
---
# Source: vault/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: vault
labels:
app: vault
release: vault
annotations:
{}
spec:
selector:
matchLabels:
app: vault
release: vault
replicas: 1
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
template:
metadata:
labels:
app: vault
release: vault
annotations:
checksum/config: 6868eb00aa48ca9485c365c3523ae431e7031233a1c046817a32c61e24ea817d
spec:
containers:
- name: vault
image: "vault:1.2.3"
imagePullPolicy: IfNotPresent
command: ["vault", "server", "-config", "/vault/config/config.json"]
ports:
- containerPort: 8200
name: api
- containerPort: 8201
name: cluster-address
livenessProbe:
# Alive if Vault is successfully responding to requests
httpGet:
path: /v1/sys/health?standbyok=true&uninitcode=204&sealedcode=204&
port: 8200
scheme: HTTP
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
# Ready depends on preference
httpGet:
path: /v1/sys/health?standbycode=204&uninitcode=204&
port: 8200
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
securityContext:
readOnlyRootFilesystem: true
capabilities:
add:
- IPC_LOCK
env:
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: VAULT_API_ADDR
value: "http://$(POD_IP):8200"
- name: VAULT_CLUSTER_ADDR
value: "https://$(POD_IP):8201"
- name: VAULT_LOG_LEVEL
value: "info"
resources:
{}
volumeMounts:
- name: vault-config
mountPath: /vault/config/
- name: vault-root
mountPath: /root/
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchLabels:
app: 'vault'
release: 'vault'
topologyKey: kubernetes.io/hostname
weight: 100
serviceAccountName: vault
volumes:
- name: vault-config
configMap:
name: "vault-config"
- name: vault-root
emptyDir: {}
---
# Source: vault/templates/pdb.yaml
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: vault
spec:
maxUnavailable: 1
selector:
matchLabels:
app: vault
release: vault
---
# Source: vault/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: vault
labels:
app: vault
release: vault
spec:
type: ClusterIP
ports:
- port: 8200
protocol: TCP
targetPort: 8200
name: api
selector:
app: vault
release: vault
---
# Source: vault/templates/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: vault
labels:
app: vault
release: "vault"
---
# Source: vault/templates/tests/test-vault-status.yaml
apiVersion: v1
kind: Pod
metadata:
name: "vault-vault-status-test"
annotations:
"helm.sh/hook": test-success
spec:
containers:
- name: vault-vault-status-test
image: "vault:1.2.3"
env:
- name: VAULT_ADDR
value: http://vault.default:8200
command: ["sh", "-c", "vault status"]
restartPolicy: Never

View File

@ -1,74 +1,3 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dot-wiki
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 4Gi
---
apiVersion: v1
kind: ConfigMap
metadata:
name: wiki-config
data:
config.json: |
{
"admin": "ADMIN",
"farm": true,
"cookieSecret": "RANDOM",
"security_type": "friends",
"secure_cookie": false,
"wikiDomains": {
"local": {
"id": "/home/node/.wiki/local.owner.json"
},
"localhost": {
"id": "/home/node/.wiki/local.owner.json"
},
"localtest.me": {
"id": "/home/node/.wiki/local.owner.json"
},
"local.dbbs.co": {
"id": "/home/node/.wiki/local.owner.json"
}
}
}
local.owner.json: |
{
"name": "The Owner",
"friend": {
"secret": "ADMIN"
}
}
install-config: |
#!/bin/sh
randomstring() {
node -e 'console.log(require("crypto").randomBytes(64).toString("hex"))'
}
readonly ADMIN=$(randomstring)
readonly COOKIE=$(randomstring)
readonly CONFIG=/home/node/.wiki/config.json
readonly OWNER=/home/node/.wiki/local.owner.json
[ -f $CONFIG ] || {
jq --arg admin $ADMIN \
--arg cookie $COOKIE \
'.admin = $admin | .cookieSecret = $cookie' \
/etc/config/config.json \
> $CONFIG
}
[ -f $OWNER ] || {
jq --arg admin $ADMIN \
'.friend.secret = $admin' \
/etc/config/local.owner.json \
> $OWNER
}
chown -R 1000:1000 /home/node/.wiki
---
apiVersion: apps/v1
kind: Deployment
metadata:
@ -87,35 +16,24 @@ spec:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
initContainers:
- name: wiki-config
image: dobbs/farm:1.0.0
securityContext:
runAsUser: 0
runAsGroup: 0
allowPrivilegeEscalation: false
volumeMounts:
- name: dot-wiki
mountPath: /home/node/.wiki
- name: config-templates
mountPath: /etc/config
command: ["sh", "/etc/config/install-config"]
containers:
- name: farm
image: dobbs/farm:1.0.0
command: ["wiki", "--config", "/home/node/.wiki/config.json"]
image: dobbs/farm:1.0.6
command: ["wiki"]
ports:
- containerPort: 3000
volumeMounts:
- name: dot-wiki
mountPath: /home/node/.wiki
- name: fedwiki
mountPath: /home/node/fedwiki
volumes:
- name: dot-wiki
persistentVolumeClaim:
claimName: dot-wiki
- name: config-templates
configMap:
name: wiki-config
hostPath:
path: /macos/.wiki-k8s
- name: fedwiki
hostPath:
path: /macos/fedwiki
---
apiVersion: v1
kind: Service
@ -128,3 +46,26 @@ spec:
port: 80
selector:
app: wiki
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: simple-wiki
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: simple.localtest.me
http:
paths:
- path: /
backend:
serviceName: wiki-service
servicePort: http
- host: "*.simple.localtest.me"
http:
paths:
- path: /
backend:
serviceName: wiki-service
servicePort: http