first commit
This commit is contained in:
commit
6c7d14a7c9
2 changed files with 128 additions and 0 deletions
30
README.md
Normal file
30
README.md
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
Inspired by [linkding on fly.io](https://github.com/fspoettel/linkding-on-fly)
|
||||
|
||||
## Storing the state in s3
|
||||
|
||||
You'll an s3 compatible bucket, like backblaze, aws, cloudflare or any compatible provider. Litestream will restore the bucket in an `emptyDir`. Then during operation a `litestream` sidecar will live replicate the changes to s3.
|
||||
|
||||
## Contents of `manifest.yaml`
|
||||
|
||||
- a `Namespace` for the project
|
||||
- a `ConfigMap` containing `litestream.yml` config
|
||||
- replace `$S3_ENDPOINT` with your bucket config
|
||||
- a `StatefulSet` containing
|
||||
- an `initContainer` to restore the sqlite db
|
||||
- a `Pod` with `linkding` + `litestream` official images
|
||||
- a `Service` to expose the pods
|
||||
- I'm using tailscale annotations, replace these with traefik or your favorite ingress controller stuff.
|
||||
|
||||
## Setup
|
||||
|
||||
```
|
||||
$ export S3_ENDPOINT=<REPLACE ME>
|
||||
$ export S3_BUCKET=<REPLACE ME>
|
||||
$ export S3_PATH=<REPLACE ME>
|
||||
$ export S3_ACCESS_KEY_ID=<REPLACE ME>
|
||||
$ export S3_SECRET_ACCESS_KEY=<REPLACE ME>
|
||||
$ envsubst <manifest.yaml | kubectl apply -f -
|
||||
$ kubectl create secret -n linkding generic litestream-s3 \
|
||||
--from-literal=LITESTREAM_ACCESS_KEY_ID=$S3_ACCESS_KEY_ID \
|
||||
--from-literal=LITESTREAM_SECRET_ACCESS_KEY=$S3_SECRET_ACCESS_KEY
|
||||
```
|
||||
98
manifest.yaml
Normal file
98
manifest.yaml
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: linkding
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: litestream
|
||||
namespace: linkding
|
||||
data:
|
||||
litestream.yml: |
|
||||
dbs:
|
||||
- path: '/etc/linkding/data/db.sqlite3'
|
||||
replicas:
|
||||
- type: s3
|
||||
bucket: '$S3_BUCKET'
|
||||
path: '$S3_PATH'
|
||||
endpoint: '$S3_ENDPOINT'
|
||||
force-path-style: true
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: StatefulSet
|
||||
metadata:
|
||||
name: linkding
|
||||
namespace: linkding
|
||||
labels:
|
||||
app: linkding
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: linkding
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: linkding
|
||||
spec:
|
||||
volumes:
|
||||
- name: data
|
||||
emptyDir: {}
|
||||
- name: litestream-config
|
||||
configMap:
|
||||
name: litestream
|
||||
items:
|
||||
- key: litestream.yml
|
||||
path: litestream.yml
|
||||
initContainers:
|
||||
- name: init-litestream
|
||||
image: litestream/litestream:latest
|
||||
args: ['restore', '/etc/linkding/data/db.sqlite3']
|
||||
envFrom:
|
||||
- secretRef:
|
||||
name: litestream-s3
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /etc/linkding/data
|
||||
- name: litestream-config
|
||||
mountPath: /etc/litestream.yml
|
||||
subPath: litestream.yml
|
||||
containers:
|
||||
- name: litestream
|
||||
image: litestream/litestream:latest
|
||||
args: ['replicate']
|
||||
envFrom:
|
||||
- secretRef:
|
||||
name: litestream-s3
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /etc/linkding/data
|
||||
- name: litestream-config
|
||||
mountPath: /etc/litestream.yml
|
||||
subPath: litestream.yml
|
||||
- name: linkding
|
||||
image: sissbruecker/linkding:latest
|
||||
ports:
|
||||
- containerPort: 9090
|
||||
name: http
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /etc/linkding/data
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: linkding
|
||||
namespace: linkding
|
||||
annotations:
|
||||
tailscale.com/expose: "true"
|
||||
tailscale.com/hostname: "linkding"
|
||||
spec:
|
||||
selector:
|
||||
app: linkding
|
||||
ports:
|
||||
- name: http
|
||||
port: 80
|
||||
targetPort: http
|
||||
Loading…
Reference in a new issue