diff --git a/README.md b/README.md index 985a00d..ea2b8c8 100644 --- a/README.md +++ b/README.md @@ -22,5 +22,6 @@ export LISTEN=:8080 ./upl ``` +For example Kubernetes manifests or Docker Compose files, see the [deployments](./deployments) folder. diff --git a/deployments/README.md b/deployments/README.md new file mode 100644 index 0000000..2c80877 --- /dev/null +++ b/deployments/README.md @@ -0,0 +1,20 @@ + +# Deployment + +## Kubernetes + +Example Kubernetes manifests are located in the [k8s](./k8s/) subdirectory. These are only useful for small deployments. For larger deployments, use a proper Redis cluster like one deployed with [this Redis operator](https://ot-container-kit.github.io/redis-operator/). + +``` +kubectl apply -r -f ./k8s/ +``` + +## Docker Compose + +The example [docker-compose.yml](./docker-compose.yml) file can be brought up with `docker-compose`. + +``` +docker-compose up +``` + + diff --git a/deployments/docker-compose.yml b/deployments/docker-compose.yml new file mode 100644 index 0000000..49d15c0 --- /dev/null +++ b/deployments/docker-compose.yml @@ -0,0 +1,31 @@ +version: "3.2" +services: + + redis: + image: redis:6-alpine3.13 + command: redis-server --appendonly yes + volumes: + - upl-redis-data:/data + networks: + upl: + + upl: + image: ghcr.io/serverwentdown/upl:latest + restart: on-failure + environment: + LISTEN: ":8080" + REDIS_CONNECTION: simple:redis:6379 + ports: + - 8080:8080 + depends_on: + - redis + networks: + upl: + +volumes: + upl-redis-data: + +networks: + upl: + +# vim: set et ts=2 sw=2: diff --git a/deployments/k8s/example-deployment.yaml b/deployments/k8s/example-deployment.yaml new file mode 100644 index 0000000..bace393 --- /dev/null +++ b/deployments/k8s/example-deployment.yaml @@ -0,0 +1,38 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: upl +spec: + replicas: 1 + selector: + matchLabels: + app: upl + template: + metadata: + labels: + app: upl + spec: + containers: + - image: ghcr.io/serverwentdown/upl:latest + imagePullPolicy: Always + name: upl + env: + - name: LISTEN + value: ":8080" + - name: REDIS_CONNECTION + value: simple:upl-redis:6379 + resources: + requests: + cpu: "1" + memory: "512Mi" + ephemeral-storage: "1Gi" + limits: + cpu: "1" + memory: "512Mi" + ephemeral-storage: "1Gi" + ports: + - containerPort: 8080 + readinessProbe: + httpGet: + path: /readyz + port: 8080 diff --git a/deployments/k8s/example-ingress.yaml b/deployments/k8s/example-ingress.yaml new file mode 100644 index 0000000..44226d3 --- /dev/null +++ b/deployments/k8s/example-ingress.yaml @@ -0,0 +1,18 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: upl +spec: + rules: + - host: drop.example.com + http: + paths: + - backend: + service: + name: upl + port: + number: 80 + path: / + pathType: Prefix + +# vim: set et ts=2 sw=2: diff --git a/deployments/k8s/example-redis-pvc.yaml b/deployments/k8s/example-redis-pvc.yaml new file mode 100644 index 0000000..a804d3a --- /dev/null +++ b/deployments/k8s/example-redis-pvc.yaml @@ -0,0 +1,10 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: upl-redis-claim +spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 5Gi diff --git a/deployments/k8s/example-redis-service.yaml b/deployments/k8s/example-redis-service.yaml new file mode 100644 index 0000000..41640b4 --- /dev/null +++ b/deployments/k8s/example-redis-service.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: upl-redis +spec: + ports: + - port: 6379 + selector: + app: upl-redis + type: ClusterIP + +# vim: set et ts=2 sw=2: diff --git a/deployments/k8s/example-redis-statefulset.yaml b/deployments/k8s/example-redis-statefulset.yaml new file mode 100644 index 0000000..76171c2 --- /dev/null +++ b/deployments/k8s/example-redis-statefulset.yaml @@ -0,0 +1,40 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: upl-redis +spec: + # This is a single-master Redis setup, there must only be one replica + replicas: 1 + serviceName: upl-redis + selector: + matchLabels: + app: upl-redis + template: + metadata: + labels: + app: upl-redis + spec: + containers: + - image: redis:6-alpine3.13 + name: upl-redis + command: ["redis-server"] + args: ["--appendonly", "yes"] + resources: + requests: + cpu: "1" + memory: "1Gi" + ephemeral-storage: "1Gi" + limits: + cpu: "1" + memory: "1Gi" + ephemeral-storage: "1Gi" + volumeMounts: + - name: data + mountPath: /data + readinessProbe: + exec: + command: ["redis-cli", "ping"] + volumes: + - name: data + persistentVolumeClaim: + claimName: upl-redis-claim diff --git a/deployments/k8s/example-service.yaml b/deployments/k8s/example-service.yaml new file mode 100644 index 0000000..e58d4dc --- /dev/null +++ b/deployments/k8s/example-service.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: upl +spec: + ports: + - port: 80 + targetPort: 8080 + selector: + app: upl + type: ClusterIP