feat(ops): k8s
This commit is contained in:
parent
753fa8829e
commit
ab139995bd
4 changed files with 177 additions and 1 deletions
27
README.md
vendored
27
README.md
vendored
|
@ -27,7 +27,7 @@ Front Page|Post
|
||||||
|
|
||||||
- Open source, [AGPL License](/LICENSE).
|
- Open source, [AGPL License](/LICENSE).
|
||||||
- Self hostable, easy to deploy.
|
- Self hostable, easy to deploy.
|
||||||
- Comes with [Docker](#docker), [Ansible](#ansible).
|
- Comes with [Docker](#docker), [Ansible](#ansible), [Kubernetes](#kubernetes).
|
||||||
- Live-updating Comment threads.
|
- Live-updating Comment threads.
|
||||||
- Full vote scores `(+/-)` like old reddit.
|
- Full vote scores `(+/-)` like old reddit.
|
||||||
- Moderation abilities.
|
- Moderation abilities.
|
||||||
|
@ -112,6 +112,31 @@ nano inventory # enter your server, domain, contact email
|
||||||
ansible-playbook lemmy.yml --become
|
ansible-playbook lemmy.yml --become
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Kubernetes
|
||||||
|
|
||||||
|
You'll need to have an existing Kubernetes cluster and [storage class](https://kubernetes.io/docs/concepts/storage/storage-classes/).
|
||||||
|
Setting this up will vary depending on your provider.
|
||||||
|
To try it locally, you can use [MicroK8s](https://microk8s.io/) or [Minikube](https://kubernetes.io/docs/tasks/tools/install-minikube/).
|
||||||
|
|
||||||
|
Once you have a working cluster, edit the environment variables and volume sizes in `docker/k8s/*.yml`.
|
||||||
|
You may also want to change the service types to use `LoadBalancer`s depending on where you're running your cluster (add `type: LoadBalancer` to `ports)`, or `NodePort`s.
|
||||||
|
By default they will use `ClusterIP`s, which will allow access only within the cluster. See the [docs](https://kubernetes.io/docs/concepts/services-networking/service/) for more on networking in Kubernetes.
|
||||||
|
|
||||||
|
**Important** Running a database in Kubernetes will work, but is generally not recommended.
|
||||||
|
If you're deploying on any of the common cloud providers, you should consider using their managed database service instead (RDS, Cloud SQL, Azure Databse, etc.).
|
||||||
|
|
||||||
|
Now you can deploy:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Add `-n foo` if you want to deploy into a specific namespace `foo`;
|
||||||
|
# otherwise your resources will be created in the `default` namespace.
|
||||||
|
kubectl apply -f docker/k8s/db.yml
|
||||||
|
kubectl apply -f docker/k8s/pictshare.yml
|
||||||
|
kubectl apply -f docker/k8s/lemmy.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
If you used a `LoadBalancer`, you should see it in your cloud provider's console.
|
||||||
|
|
||||||
## Develop
|
## Develop
|
||||||
|
|
||||||
### Docker Development
|
### Docker Development
|
||||||
|
|
48
docker/k8s/db.yml
vendored
Normal file
48
docker/k8s/db.yml
vendored
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
---
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
lemmy.service: db
|
||||||
|
name: db
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
strategy:
|
||||||
|
type: Recreate
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
lemmy.service: db
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- env:
|
||||||
|
- name: POSTGRES_DB
|
||||||
|
value: lemmy
|
||||||
|
- name: POSTGRES_PASSWORD
|
||||||
|
# example: very-good-password
|
||||||
|
value: CHANGE_ME
|
||||||
|
- name: POSTGRES_USER
|
||||||
|
value: lemmy
|
||||||
|
image: postgres:12-alpine
|
||||||
|
name: db
|
||||||
|
volumeMounts:
|
||||||
|
- mountPath: /var/lib/postgresql/data
|
||||||
|
name: db
|
||||||
|
restartPolicy: Always
|
||||||
|
volumes:
|
||||||
|
- name: db
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: db
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
lemmy.service: db
|
||||||
|
name: db
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 20Gi
|
46
docker/k8s/lemmy.yml
vendored
Normal file
46
docker/k8s/lemmy.yml
vendored
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
---
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
lemmy.service: lemmy
|
||||||
|
name: lemmy
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
lemmy.service: lemmy
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- env:
|
||||||
|
- name: DATABASE_URL
|
||||||
|
# example: 'postgres://lemmy:password@db:5432/lemmy'
|
||||||
|
value: CHANGE_ME
|
||||||
|
- name: HOSTNAME
|
||||||
|
# example: 'lemmy.example.com'
|
||||||
|
value: CHANGE_ME
|
||||||
|
- name: JWT_SECRET
|
||||||
|
# example: 'very-super-good-secret'
|
||||||
|
value: CHANGE_ME
|
||||||
|
- name: LEMMY_FRONT_END_DIR
|
||||||
|
value: /app/dist
|
||||||
|
image: dessalines/lemmy:v0.2.0.1
|
||||||
|
name: lemmy
|
||||||
|
ports:
|
||||||
|
- containerPort: 8536
|
||||||
|
restartPolicy: Always
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
lemmy.service: lemmy
|
||||||
|
name: lemmy
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- name: "8536"
|
||||||
|
port: 8536
|
||||||
|
targetPort: 8536
|
||||||
|
selector:
|
||||||
|
lemmy.service: lemmy
|
57
docker/k8s/pictshare.yml
vendored
Normal file
57
docker/k8s/pictshare.yml
vendored
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
---
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
lemmy.service: pictshare
|
||||||
|
name: pictshare
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
strategy:
|
||||||
|
type: Recreate
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
lemmy.service: pictshare
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: hascheksolutions/pictshare:latest
|
||||||
|
name: pictshare
|
||||||
|
ports:
|
||||||
|
- containerPort: 80
|
||||||
|
volumeMounts:
|
||||||
|
- mountPath: /usr/share/nginx/html/data
|
||||||
|
name: pictshare
|
||||||
|
restartPolicy: Always
|
||||||
|
volumes:
|
||||||
|
- name: pictshare
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: pictshare
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
lemmy.service: pictshare
|
||||||
|
name: pictshare
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- name: "8537"
|
||||||
|
port: 8537
|
||||||
|
targetPort: 80
|
||||||
|
selector:
|
||||||
|
lemmy.service: pictshare
|
||||||
|
status:
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
lemmy.service: pictshare
|
||||||
|
name: pictshare
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 20Gi
|
Loading…
Reference in a new issue