diff --git a/.dockerignore b/.dockerignore index e88c8ff..3c3629e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,17 +1 @@ -.git/**/* -.git - -node_modules/**/* node_modules - -src/static/**/* -src/static - -scripts/**/* -scripts - -chart/**/* -chart - -kube/**/* -kube diff --git a/.drone.yml b/.drone.yml index 237c634..9427939 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,125 +1,88 @@ -# ---------------------------------------------- -# -- Update the helm chart -# ---------------------------------------------- -kind: pipeline -type: docker -name: Publish the helm chart -trigger: - event: - - push -steps: - - name: Publish the Helm chart - image: alpine/helm - environment: - GITEA_TOKEN: - from_secret: GITEA_TOKEN - commands: - - helm plugin install https://github.com/chartmuseum/helm-push - - helm package chart -d chart-package - - helm repo add --username allanger --password $GITEA_TOKEN badhouseplants-net https://git.badhouseplants.net/api/packages/badhouseplants/helm - - helm cm-push "./chart-package/$(ls chart-package)" badhouseplants-net --- # ---------------------------------------------- # -- Build the site and push it to the registry # ---------------------------------------------- kind: pipeline -type: docker +type: kubernetes name: Build badhouseplants.net + trigger: + branch: + - main event: - - push -clone: - disable: true + - push + steps: - - name: clone - image: alpine/git - environment: - GIT_LFS_SKIP_SMUDGE: 0 - commands: - - git clone $DRONE_REMOTE_URL . - - git checkout $DRONE_BRANCH - - git submodule update --init --recursive - - name: Test a build - image: git.badhouseplants.net/badhouseplants/hugo-container - depends_on: - - clone - commands: - - hugo -s ./src - - name: Build and push the docker image - image: git.badhouseplants.net/badhouseplants/badhouseplants-builder:9665015b44590b7ce2139f7acbad23af6628fff3 - privileged: true - depends_on: - - Test a build - environment: - BUILDER_COMMIT: 2449b73b13a62ae916c6703778d096e5290157b3 - GITEA_TOKEN: - from_secret: GITEA_TOKEN - commands: - - rm -rf $DRONE_WORKSPACE/src/assets/ - - ./scripts/build-container.pl - - name: Sync pictures from lfs to Minio - image: git.badhouseplants.net/badhouseplants/badhouseplants-builder:9665015b44590b7ce2139f7acbad23af6628fff3 - depends_on: - - Test a build - environment: - RCLONE_CONFIG_CONTENT: - from_secret: RCLONE_CONFIG_CONTENT_PRIVATE - RCLONE_CONFIG: /tmp/rclone.conf - commands: - - echo "$RCLONE_CONFIG_CONTENT" > $RCLONE_CONFIG - - ./scripts/upload-media.pl - - name: Deploy the application - image: git.badhouseplants.net/badhouseplants/badhouseplants-builder:9665015b44590b7ce2139f7acbad23af6628fff3 - depends_on: - - Build and push the docker image - - Sync pictures from lfs to Minio - environment: - ARGOCD_SERVER: - from_secret: ARGOCD_SERVER - ARGOCD_AUTH_TOKEN: - from_secret: ARGOCD_AUTH_TOKEN - ARGO_GITHUB_OAUTH_KEY: - from_secret: GITHUB_OAUTH_KEY - ARGO_GOOGLE_OAUTH_KEY: - from_secret: GOOGLE_OAUTH_KEY - commands: - - ./scripts/deploy-app.pl - - name: Cleanup everything - image: git.badhouseplants.net/badhouseplants/badhouseplants-builder:9665015b44590b7ce2139f7acbad23af6628fff3 - depends_on: - - Deploy the application - environment: - RCLONE_CONFIG_CONTENT: - from_secret: RCLONE_CONFIG_CONTENT_PRIVATE - RCLONE_CONFIG: /tmp/rclone.conf - GITEA_TOKEN: - from_secret: GITEA_TOKEN - ARGOCD_SERVER: - from_secret: ARGOCD_SERVER - ARGOCD_AUTH_TOKEN: - from_secret: ARGOCD_AUTH_TOKEN - commands: - - echo "$RCLONE_CONFIG_CONTENT" > $RCLONE_CONFIG - - ./scripts/cleanup.pl +- name: Publish the Helm chart + image: alpine/helm + environment: + GITEA_TOKEN: + from_secret: GITEA_TOKEN + commands: + - helm plugin install https://github.com/chartmuseum/helm-push + - helm package chart -d chart-package + - helm repo add --username allanger --password $GITEA_TOKEN allanger-charts https://git.badhouseplants.net/api/packages/allanger/helm + - helm cm-push "./chart-package/$(ls chart-package)" allanger-charts + +- name: Init git submodules with themes + image: alpine/git + commands: + - git submodule update --init --recursive + +- name: Get static content + image: rclone/rclone:latest + environment: + RCLONE_CONFIG_CONTENT: + from_secret: RCLONE_CONFIG_CONTENT + RCLONE_CONFIG: /tmp/rclone.conf + commands: + - echo "$RCLONE_CONFIG_CONTENT" > $RCLONE_CONFIG + - rclone copy -P badhouseplants-public:/badhouseplants-static static + +- name: Build and push the docker image + image: plugins/docker + settings: + registry: git.badhouseplants.net + username: allanger + password: + from_secret: GITEA_TOKEN + repo: git.badhouseplants.net/allanger/badhouseplants-net + tags: latest + depends_on: + - Init git submodules with themes + - Get static content + --- +# ---------------------------------------------- +# -- Upload a newer version of my CV +# ---------------------------------------------- kind: pipeline -type: docker -name: Spell-Checker +type: kubernetes +name: CV Builder + trigger: + branch: + - main event: - - push -clone: - disable: true + - push + steps: - - name: clone - image: alpine/git + - name: Build the CV + image: ghcr.io/puppeteer/puppeteer + commands: + - cp -R ./content/cv/* $HOME + - cd $HOME + - npm install md-to-pdf + - npx md-to-pdf index.md + - mkdir $DRONE_WORKSPACE/cv + - mv index.pdf $DRONE_WORKSPACE/cv/n.rodionov.pdf + + - name: Upload the CV + image: rclone/rclone:latest environment: - GIT_LFS_SKIP_SMUDGE: 1 + RCLONE_CONFIG_CONTENT: + from_secret: RCLONE_CONFIG_CONTENT_PRIVATE + RCLONE_CONFIG: /tmp/rclone.conf commands: - - git clone $DRONE_REMOTE_URL --recurse-submodules . - - git checkout $DRONE_BRANCH - - name: Spell-Checker - image: node - commands: - - npm i markdown-spellcheck -g - - mdspell "src/content/**/*.md" -n -r + - echo "$RCLONE_CONFIG_CONTENT" > $RCLONE_CONFIG + - rclone copy -P $DRONE_WORKSPACE/cv badhouseplants-minio:/public-download diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index c2b8e77..0000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -src/static/** filter=lfs diff=lfs merge=lfs -text -src/static/**/* filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore index de40ffb..3110b1b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ -src/node_modules -src/public -src/resources -.hugo_build.lock +node_modules +static +content/cv/index.pdf +public +resources diff --git a/.gitmodules b/.gitmodules index 6c34b41..311fa4c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "src/themes/stack"] - path = src/themes/stack - url = https://github.com/CaiJimmy/hugo-theme-stack.git +[submodule "themes/papermod"] + path = themes/papermod + url = https://github.com/adityatelange/hugo-PaperMod.git diff --git a/src/content/music/_index.md b/.hugo_build.lock similarity index 100% rename from src/content/music/_index.md rename to .hugo_build.lock diff --git a/.spelling b/.spelling deleted file mode 100644 index 6cb1d43..0000000 --- a/.spelling +++ /dev/null @@ -1,161 +0,0 @@ -# markdown-spellcheck spelling configuration file -# Format - lines beginning # are comments -# global dictionary is at the start, file overrides afterwards -# one word per line, to define a file override use ' - filename' -# where filename is relative to this configuration file -WIP -envs -anymore -hostname -hostnames -Dockerfile -helmfile -k8s -env -dir -dev'n'stages -oi -minio -ArgoCD -setups -SRE -autoscaler -gitea -vendoring -cli -vpa -ok -cmp -config -GitOps -argo -argocding -cluster-1 -cluster-2 -cluster-3 -kubernetes -argocd -helmfiles -plugin -helmfile.yaml -cleanup -serie -backend -js -frontend -ShowToc -cover.png -allanger -DIY -DevOps -funkwhale -PSY -bandcamp -soundcloud -spotify -deezer -prog-rock -oveleane -IDM -gitlab -bitwarden -elasticsearch -grafana -lifecycle -auditable -the-first-production-grafaba -grafana -applicationsets -helm-releases-v2 -yaml -CR -minecraft -github -ddosed -VST -Xfer -plugins -yabridgectl -yabridge -DAW -polyverse -camelcrusher -standalone -url -glitchmachines -MacBook -configs -behaviour -FreqEcho -DSP -Supermassive -Ableton -Softube -center -iZotope -V2 -auth -README.md -TAL-Chorus-LX -badhouseplants -Deelay -Gatelab -Filterstep -Panflow -PaulXStretch -Audiomodern -Kushview -JUCE -Melda -MDrummer -GBs -laggy -MDrumReplacer -MPowerSynth -MGuitarArchitect -u-he -TyrellN6 -Tyrell -install.sh -MGuitarArchitect -Amazona.de. -Bitwig -ProjectSAM -Pendulate -Protoverb -Eurorack -S3 -XT -Ruina -VCV -LFO -beatmaker -wavetables -OSC -YOUTUBE -Twelve50TV -Robotik -McRoy -brah -aw -shite -lowrider -mdma -nah -clubby -MGK -params - - src/themes/papermod/README.md -PaperMod -hugo-paper -og -ExampleSite -exampleSite -pipelining -Fuse.js -webpack -nodejs -Pagespeed -Highlight.js -2023-02-25T14 -argocd-dynamic-environment-per-branch-part-1 diff --git a/.woodpecker.yml b/.woodpecker.yml deleted file mode 100644 index 3189887..0000000 --- a/.woodpecker.yml +++ /dev/null @@ -1,93 +0,0 @@ ---- -when: - event: - - push - -steps: - - image: alpine/helm - name: Publish the Helm chart - commands: - - helm plugin install https://github.com/chartmuseum/helm-push - - helm package chart -d chart-package - - helm repo add --username allanger --password $GITEA_TOKEN badhouseplants-net https://git.badhouseplants.net/api/packages/badhouseplants/helm - - helm cm-push "./chart-package/$(ls chart-package)" badhouseplants-net - secrets: - - gitea_token - - - name: Test a build - image: git.badhouseplants.net/badhouseplants/hugo-container - commands: - - hugo -s ./src - - - name: Build and push the docker image - image: git.badhouseplants.net/badhouseplants/badhouseplants-builder:latest - privileged: true - depends_on: - - Test a build - secrets: - - gitea_token - environment: - BUILDER_COMMIT: 2449b73b13a62ae916c6703778d096e5290157b3 - commands: - - rm -rf $DRONE_WORKSPACE/src/assets/ - - ./scripts/build-container.pl - backend_options: - kubernetes: - resources: - requests: - memory: 500Mi - cpu: 200m - limits: - memory: 1000Mi - cpu: 1000m - securityContext: - privileged: true - - - name: Sync pictures from lfs to Minio - image: git.badhouseplants.net/badhouseplants/badhouseplants-builder:latest - depends_on: - - Test a build - secrets: - - rclone_config_content - environment: - RCLONE_CONFIG: /tmp/rclone.conf - commands: - - echo "$RCLONE_CONFIG_CONTENT" > $RCLONE_CONFIG - - ./scripts/upload-media.pl - - - name: Deploy the application - image: git.badhouseplants.net/badhouseplants/badhouseplants-builder:latest - depends_on: - - Build and push the docker image - - Sync pictures from lfs to Minio - secrets: - - gitea_token - - argocd_auth_token - - argo_github_oauth_key - - argo_google_oauth_key - environment: - ARGOCD_SERVER: https://argo.badhouseplants.net:443 - commands: - - ./scripts/deploy-app.pl - - - name: Cleanup everything - image: git.badhouseplants.net/badhouseplants/badhouseplants-builder:latest - depends_on: - - Deploy the application - secrets: - - gitea_token - - argocd_auth_token - - rclone_config_content - environment: - ARGOCD_SERVER: argo.badhouseplants.net:443 - RCLONE_CONFIG: /tmp/rclone.conf - commands: - - echo "$RCLONE_CONFIG_CONTENT" > $RCLONE_CONFIG - - ./scripts/cleanup.pl - - - name: Spell-Checker - failure: ignore - image: node - commands: - - npm i markdown-spellcheck -g - - mdspell "src/content/**/*.md" -n -r diff --git a/Containerfile b/Containerfile deleted file mode 100644 index 9979a54..0000000 --- a/Containerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM git.badhouseplants.net/badhouseplants/hugo-container:43fd807fea2238853f48f95a435081d88857bb79 -WORKDIR /src -COPY ./src /src -ENTRYPOINT ["hugo"] diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b383c9c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,16 @@ +FROM alpine:latest AS builder +WORKDIR /src +COPY . /src +ARG GOHUGO_LINK=https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_0.110.0_linux-amd64.tar.gz +RUN apk update && apk add curl tar +RUN curl -LJO ${GOHUGO_LINK} && tar -xf hugo_0.110.0_linux-amd64.tar.gz +RUN mv /src/hugo /usr/local/bin/hugo +RUN chmod +x /usr/local/bin/hugo +RUN hugo + +FROM nginx:stable-alpine +COPY --from=builder /src/public /var/www +COPY configs/nginx.conf /etc/nginx/conf.d/default.conf +EXPOSE 80 +CMD [ "nginx", "-g", "daemon off;" ] + diff --git a/Makefile b/Makefile index 943dcdb..6a783d5 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,9 @@ -init: lfs submodules -lfs: - git lfs pull +upload_static: + rclone copy -P static badhouseplants-minio:/badhouseplants-static + +get_static: + rclone copy -P badhouseplants-public:/badhouseplants-static static + submodules: git submodule update --init --recursive diff --git a/README.md b/README.md index 7ca4a73..b10608b 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,4 @@ # Badhouseplants NET -## About -- To be done ## Static content Storing static content in the repo is painful, because there are massive. That's why for storing them I'm using a S3 bucket that is publicly available for downstream operations - - diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..d669718 --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,12 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +draft: true +ShowToc: true +cover: + image: "cover.png" + caption: "{{ replace .Name "-" " " | title }}" + relative: false + responsiveImages: false +--- + diff --git a/chart/Chart.lock b/chart/Chart.lock deleted file mode 100644 index 1647575..0000000 --- a/chart/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: remark42 - repository: https://groundhog2k.github.io/helm-charts/ - version: 0.5.5 -digest: sha256:975188682c1b89eca43ecfd655b70853c1c6dc6fbebd6a8da43cf3cac26f3d63 -generated: "2023-02-27T13:32:44.817705541+01:00" diff --git a/chart/Chart.yaml b/chart/Chart.yaml index 96d4f43..2df2605 100644 --- a/chart/Chart.yaml +++ b/chart/Chart.yaml @@ -2,10 +2,5 @@ apiVersion: v2 name: badhouseplants-net description: A Helm chart for Kubernetes type: application -version: 0.9.0 -appVersion: "4.20.0" -dependencies: - - name: remark42 - version: 0.7.0 - repository: https://groundhog2k.github.io/helm-charts/ - condition: remark42.enabled +version: 0.2.0 +appVersion: "1.16.0" diff --git a/chart/charts/remark42-0.5.5.tgz b/chart/charts/remark42-0.5.5.tgz deleted file mode 100644 index 79d8353..0000000 Binary files a/chart/charts/remark42-0.5.5.tgz and /dev/null differ diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml index 7b0ee77..14f79af 100644 --- a/chart/templates/deployment.yaml +++ b/chart/templates/deployment.yaml @@ -24,78 +24,35 @@ spec: labels: {{- include "badhouseplants-net.selectorLabels" . | nindent 8 }} spec: - initContainers: - - name: {{ .Values.rclone.container.name }} - image: "{{ .Values.rclone.image.repository}}:{{ .Values.rclone.image.tag}}" - imagePullPolicy: {{ .Values.rclone.image.pullPolicy }} - env: - - name: RCLONE_CONFIG - value: /tmp/rclone.conf - command: - - sh - args: - - "-c" - - {{ .Values.rclone.command }} - volumeMounts: - - name: rclone-config - mountPath: "/tmp" - readOnly: true - - name: {{ .Values.volumes.rclone.name }} - mountPath: /static - readOnly: false - resources: - {{- toYaml .Values.rclone.container.resources | nindent 12 }} - - name: {{ .Values.hugo.container.name }} - env: - {{- range $key, $value := .Values.hugo.env}} - - name: {{ $key }} - value: {{ $value }} - {{- end}} - args: - - --baseURL - - {{ .Values.hugo.baseURL }} - {{- if .Values.hugo.buildDrafts }} - - --buildDrafts - {{- end }} - volumeMounts: - - name: {{ .Values.volumes.rclone.name }} - mountPath: /src/static - readOnly: false - - name: {{ .Values.volumes.public.name }} - mountPath: /src/public - readOnly: false - image: "{{ .Values.hugo.image.repository}}:{{ .Values.hugo.image.tag}}" - imagePullPolicy: {{ .Values.hugo.image.pullPolicy }} - resources: - {{- toYaml .Values.hugo.container.resources | nindent 12 }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} containers: - - name: {{ .Values.nginx.container.name }} - image: "{{ .Values.nginx.image.repository}}:{{ .Values.nginx.image.tag}}" - imagePullPolicy: {{ .Values.nginx.image.pullPolicy }} + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} ports: - name: http containerPort: {{ .Values.service.port }} protocol: TCP resources: - {{- toYaml .Values.nginx.container.resources | nindent 12 }} - volumeMounts: - - name: {{ .Values.volumes.public.name }} - mountPath: /var/www - readOnly: true - - name: nginx-config - mountPath: /etc/nginx/conf.d - readOnly: true - volumes: - - name: rclone-config - secret: - secretName: rclone-config-{{ .Release.Name }} - - name: {{ .Values.volumes.rclone.name }} - emptyDir: - sizeLimit: {{ .Values.volumes.rclone.sizeLimit }} - - name: {{ .Values.volumes.public.name }} - emptyDir: - sizeLimit: {{ .Values.volumes.public.sizeLimit }} - - name: nginx-config - configMap: - name: nginx-config-{{ .Release.Name }} - + {{- toYaml .Values.resources | nindent 12 }} + command: +{{ toYaml .Values.command | indent 12 }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/chart/templates/nginx-config-cm.yaml b/chart/templates/nginx-config-cm.yaml deleted file mode 100644 index bcaab33..0000000 --- a/chart/templates/nginx-config-cm.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: nginx-config-{{ .Release.Name }} - labels: - {{- include "badhouseplants-net.labels" . | nindent 4 }} -data: - default.conf: | - server { - listen 80; - listen [::]:80; - server_name ~.; - root /var/www; - index index.html; - location / { - try_files $uri $uri/ =404; - } - } - diff --git a/chart/templates/rclone-config-sec.yaml b/chart/templates/rclone-config-sec.yaml deleted file mode 100644 index bd529a7..0000000 --- a/chart/templates/rclone-config-sec.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: rclone-config-{{ .Release.Name }} - labels: - {{- include "badhouseplants-net.labels" . | nindent 4 }} -type: generic -data: - # the data is abbreviated in this example - rclone.conf: {{ .Values.rclone.config | b64enc }} diff --git a/chart/values.yaml b/chart/values.yaml index c0463a3..7b69c68 100644 --- a/chart/values.yaml +++ b/chart/values.yaml @@ -1,86 +1,17 @@ replicaCount: 1 -nginx: - container: - name: nginx - resources: {} - image: - repository: nginx - pullPolicy: Always - tag: latest - -rclone: - command: "rclone copy -P badhouseplants-public:/badhouseplants-net-main /static" - container: - name: rclone - resources: {} - image: - repository: rclone/rclone - pullPolicy: Always - tag: latest - config: |- - [badhouseplants-public] - type = s3 - provider = Minio - region = us-west-1 - endpoint = s3.badhouseplants.net - location_constraint = us-west-1 - -hugo: - container: - name: badhouseplants-net - resources: {} - image: - repository: git.badhouseplants.net/badhouseplants/badhouseplants-net - pullPolicy: Always - tag: latest - baseURL: https://badhouseplants.net/ - buildDrafts: false - env: - HUGO_PARAMS_GITBRANCH: main - -volumes: - # ---------------------------------------------- - # -- An emptydir volume where hugo should - # -- put the static content - # ---------------------------------------------- - public: - name: public-content - sizeLimit: 1Gi - # ---------------------------------------------- - # -- An emptydir volume where rclone should - # -- download pictures - # ---------------------------------------------- - rclone: - name: s3-data - sizeLimit: 1Gi - -remark42: - enabled: true - settings: - url: https://remark42.badhouseplants.net - secretKey: secret - emoji: true - auth: - anonymous: false - sameSite: "none" - oauth: - google: - enabled: false - github: - enabled: false - istio: - annotations: {} - enabled: true - hosts: - - remark42.badhouseplants.net - prefix: / +image: + repository: git.badhouseplants.net/allanger/badhouseplants-net + pullPolicy: Always + tag: latest imagePullSecrets: [] nameOverride: "" fullnameOverride: "" -deployAnnotations: {} +deployAnnotations: + keel.sh/trigger: poll + keel.sh/policy: 'force' podSecurityContext: {} # fsGroup: 2000 @@ -99,6 +30,29 @@ service: ingress: enabled: false + annotations: + kubernetes.io/ingress.class: istio + hosts: + - host: badhouseplants.net + paths: + - path: / + pathType: Prefix + tls: + - secretName: badhouseplants-wildcard-tls + hosts: + - badhouseplants.net + +resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi autoscaling: enabled: false @@ -106,3 +60,9 @@ autoscaling: maxReplicas: 100 targetCPUUtilizationPercentage: 80 # targetMemoryUtilizationPercentage: 80 + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..39cc7e6 --- /dev/null +++ b/config.yaml @@ -0,0 +1,65 @@ +baseURL: 'https://badhouseplants.net/' +languageCode: 'en-us' +title: 'Bad Houseplants' +theme: 'papermod' +menu: + main: + - name: Posts + url: /posts + weight: 10 + - name: Music + url: /music + weight: 11 + - name: Beats + url: /beats + weight: 12 + - name: About + url: /about + weight: 13 + - name: Search + url: /search + weight: 14 +taxonomies: + tag: tags +params: + ShowBreadCrumbs: true + ShowReadingTime: true + ShowPostNavLinks: true + ShowCodeCopyButtons: true + profileMode: + enabled: true + title: "Bad Houseplants" + subtitle: "... by allanger" + imageUrl: "Finish.png" + imageWidth: 150 + imageHeight: 150 + buttons: + - name: Source + url: "https://git.badhouseplants.net/allanger/badhouseplants-net" + - name: My Music + url: "https://funkwhale.badhouseplants.net/library/artists" + socialIcons: + - name: "telegram" + url: "https://t.me/allanger" + - name: "twitter" + url: "https://twitter.com/_allanger" + - name: "mastodon" + url: "https://mastodon.social/@allanger" + - name: github + url: 'https://github.com/allanger' + - name: email + url: 'mailto:allanger@zohomail.com' + ShowShareButtons: true + ShareButtons: ["telegram", "twitter", "reddit", "linkedin"] + env: production + title: Bad Houseplants + description: "...by allanger" + keywords: [Blog, Portfolio] + author: allanger + DateFormat: "January 2, 2006" + defaultTheme: auto +outputs: + home: + - HTML + - RSS + - JSON diff --git a/content/about/_index.md b/content/about/_index.md new file mode 100644 index 0000000..bcf2e1a --- /dev/null +++ b/content/about/_index.md @@ -0,0 +1,47 @@ +--- +title: About +date: 2023-01-24T09:26:52+01:00 +draft: false +--- + +> It was supposed to be just yet another web page with musical releases reviews, but after trying to write something about them, I've found out that I'm not good at it. So it's just a blog where I'm talking about everything that comes to my mind. + +[![Build Status](https://drone.badhouseplants.net/api/badges/allanger/badhouseplants-net/status.svg?ref=refs/heads/main)](https://drone.badhouseplants.net/allanger/badhouseplants-net/latest) + + +### Who am I? + +> If you're hiring, you can find [my CV here]({{< ref "cv" >}} ) + +I'm a musician and a geek, who works full time as a DevOps engineer, whatever it means. Thanks to my job, I know how to run self-hosted services pretty well, and that's helping me achieve my goal of bringing the indie culture everywhere I can. I'm trying to separate myself from global companies as a user as much as it's possible in my daily life. + +Also, I'm a Linux lover, what doesn't really correlate with my will to make music. I hope that one day we will see that developers will see that Linux is a real OS that can be used as a daily driver. And building software for Linux is important just like building for MacOS and Windows. I hope that we will be able to use not only open source solutions working on Linux, but also closed-source proprietary ones. + +### Music, Beats and Arrangements + +## Music + +> I always thought I was a musician +[Check out what I've got](https://funkwhale.badhouseplants.net) + +You can find everything I consider ready enough to be shown on my [FunkWhale](https://funkwhale.badhouseplants.net/library) instance. Also, my music can be found on many streaming services, and yes, I know that it's not a very independent way of doing things, but it's one of many exceptions πŸ™ƒ. + +All of my beats are waiting for somebody to do something with them. I'm giving them all for donation, so if you happen to like any, just shoot me a message. I can re-arrange and remix them as much as possible. I can mix your tracks, and I really will to do that, it doesn't matter what kind of music it is, I'm ready to work with everything, if I like it *(at least a little bit)*. + +## IT + +> I'm a DevOps after all +[Visit my gitea](https://git.badhouseplants.net) +For I'm a DevOps I'm working a lot with Kubernetes, Containers, Linux, etc. And that's the root of my intention to move to Linux completely. + +I hope I will do my contribution to the world of Linux music production too. I'm hosting my own Gitea instance. There you will be able to find all my code (or almost all of my code). + +If you made it to here, you might think that it's the point of all of this existing. Self-hosted blog, a music streaming service, and git. **This guy is just a fucking geek! ** + +And yes, you're partially right. The main reason it exists is that I'm trying to follow and promote `indie/punk` culture, that is not only applies to arts. And that's going to be covered in my posts, I hope. + +--- + +### If you're still here, + +I'm looking for people with the same mindset as me, to make music or to code together, or anything. So I would be happy to get connections on [Mastodon](https://mastodon.social/@allanger) diff --git a/content/beats/_index.md b/content/beats/_index.md new file mode 100644 index 0000000..a7d50fa --- /dev/null +++ b/content/beats/_index.md @@ -0,0 +1,53 @@ +--- +title: Beats +date: 2023-01-24T09:26:52+01:00 +draft: false +--- +>I don't lease my beats. If you happen to like anything, just shout me a message and we will come to an agreement. And if you decide to use any of my beats you'll be the only one using it (legally). + +--- +### Easy Money +{{< rawhtml >}} + +{{< /rawhtml >}} + +### Phantom Limb +{{< rawhtml >}} + +{{< /rawhtml >}} + +### Ark +{{< rawhtml >}} + +{{< /rawhtml >}} + +### Tremor +{{< rawhtml >}} + +{{< /rawhtml >}} + +### Empty Cubicles +{{< rawhtml >}} + +{{< /rawhtml >}} + +### Body Drop +{{< rawhtml >}} + +{{< /rawhtml >}} + +### Broken Piano +{{< rawhtml >}} + +{{< /rawhtml >}} + +### Dead Wings +{{< rawhtml >}} + +{{< /rawhtml >}} + +### Trapped +{{< rawhtml >}} + +{{< /rawhtml >}} + diff --git a/content/cv/index.md b/content/cv/index.md new file mode 100644 index 0000000..75a230e --- /dev/null +++ b/content/cv/index.md @@ -0,0 +1,97 @@ +--- +title: "Curriculum Vitae (CV)" +date: 2023-02-11T18:29:00+01:00 +draft: false +ShowToc: true +--- +# Nikolai Rodionov + +``` +> Location: DΓΌsseldorf, Germany +> Email: allanger@zohomail.com (preffered) +> Phone: 015223284008 +> Github: https://github.com/allanger +``` + +--- + +## About me +

+drawing +

+ +I'm a DevOps engineer (or SRE if you wish) with 5++ years of hands-on experience with a decent amount of tools that are most probably used or going to be used in your company. One of the most important tools that I love working with and want to continue working with, is Kubernetes. At least, while I don't see any better alternative to it. I think that containers themselves are one of coolest inventions in development, and I'm trying to use them as long as it's possible. Also, I believe that every routine must be automated, because routing is a boring job that lets people lose focus and make mistakes. + +I think that there are several things that a good SRE or DevOps engineer must be able to do: +- To build reliable and stable infrastructure +- Keep this infrastructure up-to-date +- Keep all the source and instructions of this infrastructure clean and simple +- Avoid a human factor as long as possible +- And when it's not possible to avoid it, not to be afraid to take responsibility + +Also, I think it's important that before implementing anything, an engineer has understood all the requirements and checked tools that can fulfil them. I often see, how people try to use a tool for its name but not for its functionality, and hence they have to do a lot of additional work and deal with compromises. And if nothing really can fulfil those requirements, you need not be afraid of writing something new *and open-source it*. + +
+ +## Experience + +**KlΓΆckner-i**: DevOps Engineer +> 01.2022 - until now + +``` +| GCloud - Microsoft Azure +| Linux - Containers - Kubernetes +| Helm - Helmfile +| Percona Mysql - Postgresql +| Bash +| Prometheus - Grafana - Elasticsearch - Kibana +| ArgoCD - Gitlab CI - Github Actions +| Sops +| Ansible +``` +--- + +**Itigris**: DevOps Engineer +> 07.2019 - 12.2021 + +``` +| AWS - Yandex Cloud +| Linux - Containers - Kubernetes +| Helm - Helmfile - Kustomize +| Bash +| Gitlab CI - Drone - ArgoCD +| Postgresql - Redis +| Java - JS - Go +| Ansible - Terraform +| Prometheus - Grafana - Loki - Elasticsearch - Kibana +``` +--- + +**Etersoft**: DevOps Engineer +> 03.2017 - 06.2019 + +``` +| Bare metal - Proxmox - Virtual Box +| Linux - Containers - Networks +| Bash - Perl +| Mysql - Postgresql +| Minio - Ceph +| Gitlab CI +| Ansible +``` + +
+ +## A little bit more about me + +- I love to work with `Kubernetes`, but not with `yaml`. +- I'm a huge fan of [Helmfile](https://github.com/helmfile/helmfile). +- I have written several small cli tools in Rust, that you might find in my [GitHub profile pins](https://github.com/allanger) (they are not perfect, but I'm working on it). +- I'm contributing to [db-operator](https://github.com/kloeckner-i/db-operator). +- I'm trying to automate everything until I'm losing control over something that is automated. +- I love Perl, although I don't even remember how to write code with it, but I would be somehow thrilled to have any ability to work with it in production +- I also think that everything is better in Rust, or at least in Go *(if Bash is not enough)* + +I have a blog (written-as-code) that is deployed to K8s (https://badhouseplants.net/), with the source code stored in a self-hosted Gitea, that is also deployed to K8s alongside the CI/CD system where this blog is being built and published. This CV is also being built as a part of the CI process, and then uploaded to `minio` storage that is also ~~surprisingly~~ running in this cluster. So you can download the latest version of CV here: + +> But I can't guarantee 100% availability because it's a one-node k8s, and sometimes I need to do a maintenance work diff --git a/content/cv/myself.jpeg b/content/cv/myself.jpeg new file mode 100644 index 0000000..25fb28d Binary files /dev/null and b/content/cv/myself.jpeg differ diff --git a/content/music/index.md b/content/music/index.md new file mode 100644 index 0000000..1dbc05c --- /dev/null +++ b/content/music/index.md @@ -0,0 +1,95 @@ +--- +title: "Music" +date: 2023-01-31T13:52:43+01:00 +draft: false +ShowToc: true + +--- +Everything that's created by me, can be found on my [funkwhale instance](https://funkwhale.badhouseplants.net). But I'm only uploading `lossy` there. I was trying to upload losseless, but then it either doesn't really work with my Android App, or it's hard to manage. And it needs a way more disk that way. So if you want to listnen to lossless, go to my [Bandcamp](https://allanger.bandcamp.com/). *A lot of tracks are still not there, but they will be there soon*. I also have a [SoundCloud account](https://soundcloud.com/allanger) and I try to publish everything there. + + +--- + +### allanger + +[Spotify](https://open.spotify.com/artist/1VPAs75xrhaXhCIIHsgF02) - [Apple Music](https://music.apple.com/us/artist/allanger/1617855325) - [Deezer](https://www.deezer.com/us/artist/117780712) - [SoundCloud](https://soundcloud.com/allanger) - [Bandcamp](https://allanger.bandcamp.com/) - [Funkwhale](https://funkwhale.badhouseplants.net/library/artists/3/) + + +#### Out of Law +>![Cover](/music/allanger-Out_of_Law.png) +>Release Date: 2022-06-08 +> +>Genre: Alternative +> +>Sub Genre: Punk + +[Spotify](spotify:album:4RACKNtJqPXZOB6UsmwxKp) - [Apple Music](https://music.apple.com/us/album/1625562031) - [Deezer](https://www.deezer.com/us/album/321014447) - [SoundCloud](https://soundcloud.com/allanger/out-of-law) - [Bandcamp](https://allanger.bandcamp.com/album/out-of-law) - [Funkwhale](https://funkwhale.badhouseplants.net/library/albums/5/) + +{{< rawhtml >}} + +{{< /rawhtml >}} + +#### Wasted Time +>![Cover](/music/allanger-Waster_Time.png) +>Release Date: 2022-05-17 +> +>Genre: Punk/Rock +> +>Sub Genre: Prog-Rock/Art Rock + +[Spotify](spotify:album:2zOW72GHTTKIZAbwjmxili) - [Apple Music](https://music.apple.com/us/album/1617855666) - [Deezer](https://www.deezer.com/us/album/308544627) - [SoundCloud](https://soundcloud.com/allanger/wasted-time?si=59896836701c48b6a07f7af96043faaf&utm_source=clipboard&utm_medium=text&utm_campaign=social_sharing) - [Bandcamp](https://allanger.bandcamp.com/album/wasted-time) - [Funkwhale](https://funkwhale.badhouseplants.net/library/albums/4/) + +{{< rawhtml >}} + +{{< /rawhtml >}} + +#### Let Me Kill +> In this song, I'm using samples from a YouTube video and so I'm not sure that I can distribute on all platforms. That's why it exists only on SoundCloud, Funkwhale, and Bandcamp +>![Cover](/music/allanger-Let_Me_Kill.png) +>Release Date: 2021-10-15 +> +>Genre: Trap + +[SoundCloud](https://soundcloud.com/allanger/let-me-kill) - [Bandcamp](https://allanger.bandcamp.com/track/let-me-kill) - [Funkwhale](https://funkwhale.badhouseplants.net/library/albums/7/) + +{{< rawhtml >}} + +{{< /rawhtml >}} + +#### Anymore +> In this song, I'm using samples from a YouTube video and so I'm not sure that I can distribute on all platforms. That's why it exists only on SoundCloud and Funkwhale +>![Cover](/music/allanger-Anymore.jpg) +>Release Date: 2018-12-26 +> +>Genre: Indie +> +>Sub Genre: Lo-Fi Indie + + +[SoundCloud](https://soundcloud.com/allanger/anymore) - [Funkwhale](https://funkwhale.badhouseplants.net/library/albums/11/) +{{< rawhtml >}} + +{{< /rawhtml >}} + +### Oveleane + +> It's another project made by me, I just thought that that electronic stuff won't fit well in the allanger's profile, and so decided to separate them. But it's still allanger, you know... + +[Spotify](https://open.spotify.com/artist/2PKE1XvwP82LCacM5q6rCx?si=hJyJWcEgR4mZLkjbCso45A) - [Apple Music](https://music.apple.com/us/artist/oveleane/1654951021) - [Deezer](https://www.deezer.com/us/artist/190392997) + + +#### Four Steps Behind +>![Cover](/music/Oveleane%20-%20Four%20Steps%20Behind.jpg) +>Release Date: 2022-12-05 +> +>Genre: Electronic +> +>Sub Genre: IDM/Experimental + +[Spotify](https://open.spotify.com/album/1RjB1xLoD2JXmWuBjGegCN?si=fIsGrOfoQRaeKu9f-Oh0dw) - [Apple Music](https://music.apple.com/us/album/1654953305) - [Deezer](https://www.deezer.com/us/album/377293977) - [Funkwhale](https://funkwhale.badhouseplants.net/library/albums/1/) + +{{< rawhtml >}} + +{{< /rawhtml >}} + + diff --git a/content/posts/_index.md b/content/posts/_index.md new file mode 100644 index 0000000..e69de29 diff --git a/content/posts/argocd-vs-helmfile-application/cover.png b/content/posts/argocd-vs-helmfile-application/cover.png new file mode 100644 index 0000000..7536770 Binary files /dev/null and b/content/posts/argocd-vs-helmfile-application/cover.png differ diff --git a/src/content/post/allanger/argocd-vs-helmfile-application.md b/content/posts/argocd-vs-helmfile-application/index.md similarity index 95% rename from src/content/post/allanger/argocd-vs-helmfile-application.md rename to content/posts/argocd-vs-helmfile-application/index.md index eef42f2..11c8ca7 100644 --- a/src/content/post/allanger/argocd-vs-helmfile-application.md +++ b/content/posts/argocd-vs-helmfile-application/index.md @@ -1,13 +1,14 @@ -+++ -title = "ArgoCD vs Helmfile: Applications" -date = 2023-02-13T12:14:09+01:00 -image = "/posts/argocd-vs-helmfile/cover-applications.png" -draft = false -categories = [ - "Kubernetes", - "CI-CD" -] -+++ +--- +title: "ArgoCD vs Helmfile: Applications" +date: 2023-02-13T12:14:09+01:00 +draft: false +cover: + image: "cover.png" + caption: "ArgoCD" + relative: false + responsiveImages: false +ShowToc: true +--- > So as promised in [the previous ArgoCD post]({{< ref "dont-use-argocd-for-infrastructure" >}}), I'll try to show a simple example of Pull Requests for different kinds of setups. This is the first part. Putting everything in the same post seems kind of too much. @@ -64,7 +65,7 @@ But logic would be like this - Add a new application to the `manifests/$CLUSTER` dir - Push - CI/CD - - Since it needs to be `GitOps`, you need to check that charts in the `vendor` dir are up-to-date with `helm-freeze.yaml`. *Because if you updated helm-freeze and forgot to execute `helm-freeze sync`, you will have a contradiction between actual and desired states. That's one of the reasons, why I don't like this kind of vendoring. Either it's an addition step in CI, that is verifying that the manual step was done, or it's an additional work for reviewer. You also can add an action that is going to execute it within the pipeline and push to your branch, but I'm completely against it. (something for another post maybe)* + - Since it needs to be `GitOps`, you need to check that charts in the `vendor` dir are up-to-date with `helm-freeze.yaml`. *Because if you updated helm-freeze and forgot to execute `helm-freeze sync`, you will have a contradiction between actual and desired states. That's one of the reasons, why I don't like this kind of vendoring. Either it's an addition step in CI, that is verifying that the manual step was done, or it's an additional work for reviewer. You also can add an action that is going to execute it withing the pipeline and push to your branch, but I'm completely against it. (something for another post maybe)* - Then depending on a branch: - If not `main` @@ -163,10 +164,10 @@ spec: And I pushed to repo. So now let see what I've got in UI: -![Changes in UI](/posts/argocd-vs-helmfile/update-in-ui.png) +![Changes in UI](/argocd-vs-helmfile/update-in-ui.png) This is how `diffs` for VPA look in the UI: -![Diff in UI](/posts/argocd-vs-helmfile/diff-in-ui.png) +![Diff in UI](/argocd-vs-helmfile/diff-in-ui.png) {{< details "Here you can find all the diffs from the UI as text" >}} @@ -372,7 +373,7 @@ subjects: {{< /details >}} And for Goldilocks -![Goldilocks Application](/posts/argocd-vs-helmfile/goldilocks-ui.png) +![Goldilocks Application](/argocd-vs-helmfile/goldilocks-ui.png) All the diffs are also there, and they look good. @@ -423,7 +424,7 @@ spec: targetRevision: argo-apps-main ``` -![App of apps in the `main`](/posts/argocd-vs-helmfile/app-of-apps-main.png) +![App of apps in the `main`](/argocd-vs-helmfile/app-of-apps-main.png) So currently app of apps doesn't know about what's happening in my new branch. And so I can't just do `argocd app vpa diff`. So what should I do? ```BASH @@ -440,7 +441,7 @@ argocd app diff vpa FATA[0000] rpc error: code = NotFound desc = error getting application: applications.argoproj.io "vpa" not found ``` -There is a `--local` option, but it still requires a name ~~(why if there is a name in manifests πŸ™ƒπŸ™ƒπŸ™ƒ)~~ +There is a `--local` option, but it still requires a name ~~(why if there is a name in manfiests πŸ™ƒπŸ™ƒπŸ™ƒ)~~ ```BASH # Just testing out argocd app diff vpa --local ./manifests/cluster2/ @@ -542,7 +543,7 @@ Let's try installing apps directly. Remove an app-of-apps from k8s. And let's us ## Conclusion So you can check the PR here: -I like that `values` can be handled as normal values files. (But for handling secrets you might have to add a [CMP](https://argo-cd.readthedocs.io/en/stable/user-guide/config-management-plugins/), that means an additional work and maintenance) But even if adding CMP is fine, I couldn't get proper `diffs` for my changes, that means that I can't see what's happening without applying manifests. And applying manifests will mean that other team members will not be work on other tickets within the same scope, so it looks like a bottleneck to me. +I like that `values` can be handled as normal values files. (But for handling secrets you might have to add a [CMP](https://argo-cd.readthedocs.io/en/stable/user-guide/config-management-plugins/), that means an additional work and maintenance) But even if adding CMP is fine, I couldn't get proper `diffs` for my changes, that means that I can't see what's happening without applying manifests. And applying manifests will mean that other team members will not be work on other tickets withing the same scope, so it looks like a bottleneck to me. But I don't like that you need to add a lot of manifests to manage all the applications. We have only 2 manifests that are copied from folder to folder. So we have a lot of repeating code. And repeating code is never good. So I would write a tool that can let you choose applications from the list of all applications and choose clusters where they need to be deployed. So the config looks like this: ```YAML @@ -564,11 +565,10 @@ But I think that with the whole GitOps pulling concept it will be a hard thing t I can only say, that I see no profit in using argo like this. It only seems like either a very complicated setup (most probably you will be able to implement anything you need, the question is, how much time will you spend with that), or a ~~crippled~~ not complete setup. -And if you compare an amount of lines that area updated to install these apps as `Applications` to the helmfile stuff, it's going to be ~100 vs ~30. And that's what I also don't like. +And if you compare an amount of lines that area updadated to install these apps as `Applications` to the helmfile stuff, it's going to be ~100 vs ~30. And that's what I also don't like. In the next post I will try doing the same with `ApplicationSets`, and we'll see, if it looks better or not. Thanks, Oi! - diff --git a/content/posts/argocd-vs-helmfile-applicationset/cover.png b/content/posts/argocd-vs-helmfile-applicationset/cover.png new file mode 100644 index 0000000..d242e3a Binary files /dev/null and b/content/posts/argocd-vs-helmfile-applicationset/cover.png differ diff --git a/src/content/post/allanger/argocd-vs-helmfile-applicationset.md b/content/posts/argocd-vs-helmfile-applicationset/index.md similarity index 93% rename from src/content/post/allanger/argocd-vs-helmfile-applicationset.md rename to content/posts/argocd-vs-helmfile-applicationset/index.md index 1fef0be..fcd0ff9 100644 --- a/src/content/post/allanger/argocd-vs-helmfile-applicationset.md +++ b/content/posts/argocd-vs-helmfile-applicationset/index.md @@ -1,13 +1,14 @@ -+++ -title = 'ArgoCD vs Helmfile: ApplicationSet' -date = 2023-02-15T10:14:09+01:00 -image = "/posts/argocd-vs-helmfile/cover-applicationset.png" -draft = false -categories = [ - "Kubernetes", - "CI-CD" -] -+++ +--- +title: "ArgoCD vs Helmfile: ApplicationSet" +date: 2023-02-15T10:14:09+01:00 +draft: false +cover: + image: "cover.png" + caption: "ArgoCD" + relative: false + responsiveImages: false +ShowToc: true +--- This is a second post about *"argocding"* your infrastructure. [First can be found here]({{< ref "argocd-vs-helmfile-application" >}}). @@ -63,7 +64,7 @@ spec: ``` -Manifests with a setup like this have only one values that is really different, so we could create just one manifest that would look like that: +Manifests with a setup like thos have only one values that is really different, so we could create just one manifest that would look like that: ```YAML apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet @@ -201,14 +202,14 @@ spec: ``` After applying this change, this what I've got -![ApplicationSet](/posts/argocd-vs-helmfile/applicationset-test.png) +![ApplicationSet](/argocd-vs-helmfile/applicationset-test.png) Those applications should be deployed automatically within a pipeline. So steps in your pipeline would look like that: - Get current `ApplicationSet` manifest from Kubernetes - Add new generators - Sync applications with argocd cli -But I'm not sure what going to happen if you have two different pipelines at the same time. Probably, changes will be overwritten but the pipeline that is a little bit slower. But I think that it can be solved without a lot of additional problems. And also I don't think that it's a situation that you will have to face very often, so you can just rerun your pipeline after all. +But I'm not sure what going to happen if you have two different pipelines at the same time. Probably, changes will be overwriten but the pipeline that is a little bit slower. But I think that it can be solved without a lot of additional problems. And also I don't think that it's a situation that you will have to face very often, so you can just rerun your pipeline after all. ### Diffs Diffs are not supported for `ApplicationSets` at the moment, and I'm not sure when they will be: diff --git a/src/content/post/allanger/argocd-vs-helmfile-helmfile.md b/content/posts/argocd-vs-helmfile-helmfile/index.md similarity index 99% rename from src/content/post/allanger/argocd-vs-helmfile-helmfile.md rename to content/posts/argocd-vs-helmfile-helmfile/index.md index ab2999d..9272049 100644 --- a/src/content/post/allanger/argocd-vs-helmfile-helmfile.md +++ b/content/posts/argocd-vs-helmfile-helmfile/index.md @@ -1,13 +1,11 @@ -+++ -title = "Argocd vs Helmfile: Helmfile" -date = 2023-02-17T12:48:51+01:00 -draft = false -categories = [ - "Kubernetes", - "CI-CD" -] -+++ -In two previous posts I've described how it's possible to install a couple of applications with [`Applications`]({{< relref "/post/allanger/argocd-vs-helmfile-application" >}}) and [`ApplicationSets`]({{< relref "/post/allanger/argocd-vs-helmfile-applicationset" >}}), and this one is the last in a row. And here I'm going to install the same applications (`VPA` and `Goldilocks`) with helmfile, and I will tell why I think that it's better than `ArgoCD` +--- +title: "Argocd vs Helmfile: Helmfile" +date: 2023-02-17T12:48:51+01:00 +draft: false +ShowToc: false +--- + +In two previous posts I've described how it's possible to install a couple of applications with [`Applications`]({{< ref "argocd-vs-helmfile-application" >}}) and [`ApplicationSets`]({{< ref "argocd-vs-helmfile-applicationset" >}}), and this one is the last in a row. And here I'm going to install the same applications (`VPA` and `Goldilocks`) with helmfile, and I will tell why I think that it's better than `ArgoCD` So let's start. Here you can find the [initial config](https://git.badhouseplants.net/allanger/helmfile-vs-argo/src/branch/helmfile-main). Let's see what we got here: @@ -80,7 +78,7 @@ helmfiles: - path: {{.Environment.Name }}/helmfile.yaml ``` -It's going to import helmfiles that are not used across all clusters. So if you want to install something to `cluster-2` across, you will add it to the `/cluster2/helmfile.yaml` and sync the main helmfile. I will show an example later. +It's going to import helmfiles that are not used across all clusters. So if you want to install something to `cluster-2` accross, you will add it to the `/cluster2/helmfile.yaml` and sync the main helmfile. I will show an example later. So we're all set and ready to begin installing new stuff. @@ -1577,7 +1575,7 @@ Yeah, it's huge, but you can see everything that's going to happen. So I'd say i It's a short article, because I think the whole setup is super easy, CI is easy too. You still have a full `GitOps` (or almost full) but you also have control. I love this setup and would like to use it for my infrastructure. Why do I think it's better that `ArgoCD`? -With `ArgoCD` I either have a lot of `yaml` to install things, or I have complicated setups with `ApplicationSets` that are most probably very special and won't be reused in other companies. I need to care about how `ArgoCD` will handle a lot of applications that are added there only for diffing. I need additional applications installed in my clusters not only as a part of infrastructure itself, but also as a service that I'm providing other teams with. Because I want to manage applications that are being developed by other teams with `Argo`, so I'm mixing a lot of different kinds of applications here. +With `ArgoCD` I either have a lot of `yaml` to install things, or I have complicated setups with `ApplicationSets` that are most probably very special and won't be reused in other companies. I need to care about how `ArgoCD` will handle a lot of applications that are added there only for diffing. I need additional applications installed im my clusters not only as a part of infrastructure itself, but also as a service that I'm providing other teams with. Because I want to manage applications that are being developed by other teams with `Argo`, so I'm mixing a lot of different kinds of applications here. Helmfile lets me separate infra from applications. `ArgoCD` can be only provided as a service, and other teams can use, because it's making k8s easier for those who don't need to understand it so deeply. Also, helmfile lets me use helm-secrets to encrypt values. I can do it with Argo too, but then I need to either have a custom `ArgoCD` image, or support a CMP plugin, that will handle SOPS. @@ -1585,6 +1583,3 @@ You can find an example of PR here: When helmfile is not GitOps? > To uninstall a helm release, you need to add `isntalled: false` to it. If you just remove a release from helmfile.yaml, it isn't going to be removed. So in such cases it's not GitOps. You can write a hook, that is comparing a previous state of your helmfile to the current one and doing a cleanup, then it's again fully GitOps. But I prefer removing things manually, so to me, it's not a problem. Removing stuff is something that I think should be mostly done by a human being, if it's not a part of your daily work. -Thanks, - -Oi! diff --git a/content/posts/dont-use-argocd-for-infrastructure/cover.png b/content/posts/dont-use-argocd-for-infrastructure/cover.png new file mode 100644 index 0000000..1154626 Binary files /dev/null and b/content/posts/dont-use-argocd-for-infrastructure/cover.png differ diff --git a/src/content/post/allanger/dont-use-argocd-for-infrastructure.md b/content/posts/dont-use-argocd-for-infrastructure/index.md similarity index 98% rename from src/content/post/allanger/dont-use-argocd-for-infrastructure.md rename to content/posts/dont-use-argocd-for-infrastructure/index.md index fbae692..31400ef 100644 --- a/src/content/post/allanger/dont-use-argocd-for-infrastructure.md +++ b/content/posts/dont-use-argocd-for-infrastructure/index.md @@ -1,14 +1,14 @@ -+++ -title = "Don't use ArgoCD for your infrastructure" -date = 2023-02-09T12:47:32+01:00 -draft = false -image = '/posts/dont-use-argocd-for-infrastructure/cover.png' -categories = [ - "Kubernetes", - "CI-CD" -] -+++ - +--- +title: "Don't use ArgoCD for your infrastructure" +date: 2023-02-09T12:47:32+01:00 +draft: false +ShowToc: true +cover: + image: "cover.png" + caption: "ArgoCD" + relative: false + responsiveImages: false +--- > Of course, it's just a clickbait title. Use whatever works for you. I will just describe why I wouldn't use `ArgoCD` for the infrastructure ## Prelude @@ -21,11 +21,11 @@ Let's assume you are a team that is providing something as a service to other te > It's very common to use separated clusters for different teams, customers, applications, etc. Let's say you have 3 clusters -![3 clusters and you](/posts/dont-use-argocd-for-infrastructure/3-clusters.png) +![3 clusters and you](/dont-use-argocd-for-infrastructure/3-clusters.png) Setups may be different, you can use different clusters for different products, environments, teams, or you can have your own opinion on how to split workload between clusters. But these (in our case) 3 clusters are used directly by other teams. Also, you may want to have a cluster for providing services, let's assume, your company decided to use [Gitea](https://gitea.io/en-us/) as a `git` provider, and you deployed it to Kubernetes. *It may be a very controversial example, but I'm not talking about what should run in K8s and what shouldn't, so if you can think of any other thing, that is supposed to be used across the whole company (GitLab Runners, Bitwarden, ElasticSearch, etc...)*. So it's already 4 clusters. Let's call the fourth cluster a `DevOps Cluster` -![3 Clusters and gitea](/posts/dont-use-argocd-for-infrastructure/3-clusters-and-gitea.png) +![3 Clusters and gitea](/dont-use-argocd-for-infrastructure/3-clusters-and-gitea.png) I assume you need to have some common stuff deployed to each cluster, let's think of (Prometheus, Grafana and Loki). diff --git a/content/posts/vst-on-linux-1/cover.png b/content/posts/vst-on-linux-1/cover.png new file mode 100644 index 0000000..6487c55 Binary files /dev/null and b/content/posts/vst-on-linux-1/cover.png differ diff --git a/content/posts/vst-on-linux-1/index.md b/content/posts/vst-on-linux-1/index.md new file mode 100644 index 0000000..bf9521f --- /dev/null +++ b/content/posts/vst-on-linux-1/index.md @@ -0,0 +1,287 @@ +--- +title: "Vst on Linux 1" +date: 2023-01-24T15:47:50+01:00 +draft: false +ShowToc: true +cover: + image: "cover.png" + caption: "Vst on Linux" + relative: false + responsiveImages: false +--- + +>Best, but according to Output. Their article: *[https://output.com/blog/output-favorites-freebies](https://output.com/blog/output-favorites-freebies) + +This is kinda article where I'm looking for "BEST FREE VST" articles or videos, or whatever, trying to run them on Linux and checking how they perform. The first article I've found is one by **Output**, so be it. + +--- + +## 1. Arcade by Output πŸ‘Ž + +Freaking unexpected, huh? But what choice do I have? **Walk the walk and talk the talk. **So let's start by pressing the "TRY IT FREE" button. + +First I need to enter my email, then I need to enter a bunch of information about myself and then: What a bummer, they want me to add a payment method. And even thought they won't charge me the first month, I'm not doing talking the talk. Sorry, let's go to the next one. + +--- + +## 2. OTT by Xfer πŸ‘ + +This one you will find in any top, I believe. It can mean only one thing: it's really one of the best. So let's try. + +There is no Linux version of this plugin, so we will have to use the Windows one. How, you would ask me? I will have to install a couple of packages to my system before I'm ready. I'm starting by installing **wine**. Β  + +I am not going to describe the process of installing it, google `"$YOUR_LINUX_DISTRO_NAME install wine" ` after it's done you may want to create a new wine prefix in your system. + +What is wine prefix? Let's think of it as of a directory that contains Windows-related stuff. All plugins will be installed there alongside libraries that are required to make them work. + +Let's give this prefix a recognizable name, like `.wine_vst_plugins.` I'm opening the terminal, yes, I'll have to use it, but you shouldn't be scared of it, because terminal is our friend. Opening it and executing: + + $ WINEPREFIX="$PWD/.wine_vst_plugins/" winecfg + + +It will open a window when you can configure your wine prefix, but the main stuff is already done, so I just close it. + +To check if we're happy, I'm executing the following + + $ ls -la $HOME/.wine_vst_plugins + + total 3332 + drwxr-xr-x 1 allanger allanger 126 Oct 27 18:13 . + drwx------ 1 allanger root 1922 Oct 27 18:15 .. + drwxr-xr-x 1 allanger allanger 8 Oct 27 18:13 dosdevices + drwxr-xr-x 1 allanger allanger 110 Oct 27 18:13 drive_c + -rw-r--r-- 1 allanger allanger 3282847 Oct 27 18:13 system.reg + -rw-r--r-- 1 allanger allanger 12 Oct 27 18:13 .update-timestamp + -rw-r--r-- 1 allanger allanger 4130 Oct 27 18:13 userdef.reg + -rw-r--r-- 1 allanger allanger 113309 Oct 27 18:13 user.reg + + +If your output looks like mine, we're good to go. Let's install the second tool: [https://github.com/robbert-vdh/yabridge](https://github.com/robbert-vdh/yabridge). You will find all the instructions if you just scroll down a wee bit. After installing it you also must have a tool called **yabridgectl,** to check that it is right, just execute the following + + $ yabridgectl + + yabridgectl 4.0.2 + Robbert van der Helm + Optional utility to help set up yabridge + + USAGE: + yabridgectl + + OPTIONS: + -h, --help Print help information + -V, --version Print version information + + SUBCOMMANDS: + add Add a plugin install location + rm Remove a plugin install location + list List the plugin install locations + status Show the installation status for all plugins + sync Set up or update yabridge for all plugins + set Change the yabridge path (advanced) + blacklist Manage the indexing blacklist (advanced) + help Print this message or the help of the given subcommand(s) + + + +I hope you're seeing pretty much the same picture as I am. And it only means that we can go further. + +Now it's time to install the plugin itself. I'm downloading the **Windows** version and opening my terminal again + +Let's assume that you've downloaded it to the `~/Downloads` folder, and the file name is `Install_Xfer_OTT_135.exe` + + $ cd ~/Dowloads + $ WINEPREFIX="$PWD/.wine_vst_plugins/" wine ./Install_Xfer_OTT_135.exe + + +Why we're adding this `WINEPREFIX` thing every time when running `wine`? Because we're saying which wine prefix should be used by wine, since it's not a default path for the prefix. + +After installing this plugin, I will need to add it to **yabridge**. To do that, use **yabridgectl** + +Insted of what I'm putting after `/drive_c/`, provide a path that you've chosen during the installation + + $ yabridgectl add ~/.wine_vst_plugins/drive_c/Program\ Files/Common\ Files/VST + $ yabridgectl sync + + +And I'm opening a DAW, *I assume you already have one too, for here you are. But if you don't, and you don't know which to install, just install **Ardour.*** + +I'm opening it, adding a track and adding the **OTT** plugin to that track. + +![OTT Xfer](/vst-on-linux-1/ott-xfer.png) + +It is working and I would even say it's running +The UI part is a wee bit buggy, but I don't think that it's a problem. + +--- + +## 3. Wider by Polyverse πŸ‘ + +I'm entering my email again and receiving a download link. Downloading, unpacking, and installing + + $ WINEPREFIX="$PWD/.wine_vst_plugins/" wine ./InfectedMushroom-Wider-V1.1.3.exe + $ yabridgectl sync + + +![Wider](/vst-on-linux-1/wider.png)Again, it's working flawlessly +So far so good, even the UI part is perfect. + +--- + +## 4. CamelCrusher by Camel Audio πŸ‘ + +It can be downloaded even without email thingy. + + $ WINEPREFIX="$HOME/.wine_vst_plugins/" wine ./camelcrusher-win_mac\ \(www.mpcindia.co\)/CamelCrusherWin-1-0-1-x64.exe + $ yabridgectl sync + + + And when I'm trying to add it to Ardour, I'm getting an error + + [Info]: Scanning: /home/allanger/.vst/yabridge/CamelCrusher.so + 09:23:38 [error] + 09:23:38 [error] Error during initialization: + 09:23:38 [error] '/home/allanger/.vst/yabridge/CamelCrusher.dll' does not exist, make sure to rename 'libyabridge-vst2.so' to match a VST plugin .dll file. + 09:23:38 [error] + [ERROR]: ** ERROR** VSTFX : CamelCrusher could not be instantiated :( + + [WARNING]: Cannot get VST information from '/home/allanger/.vst/yabridge/CamelCrusher.so': instantiation failed. + Scan Failed. + + +And I can't actually understand what is the problem here. + +I don't give up so quickly. Let's try running it via [Carla](https://github.com/carla-simulator/carla). I won't describe how to install it, you can google it. + + +So after it's installed, I'm opening it as a standalone app first and trying to add my **CamelCrusher** there. And it's working. Then the next step is to add **Carla** as a **FX** plugin in **Ardour** and then add CamelCrusher there. +![CamelCrush](/vst-on-linux-1/camel-crush.png)Working again, but not without Carla + +--- + +## 5. Fracture by Glitchmachines πŸ‘ + +I love this plugin, and I'm using it a lot on my MacBook, so it would be nice to run it on **Linux** too. So let's go. But Glitchmachines can give us another great plugin for free, so I will try running both of them here. The other one is **Hysteresis**. So I'm downloading both of them. + +After receiving two links, I'm installing them + + $ WINEPREFIX="$HOME/.wine_vst_plugins/" wine Fracture_setup.exe + $ WINEPREFIX="$HOME/.wine_vst_plugins/" wine Hysteresis_setup.exe + $ yabridgectl sync + + +![Glitchmachines](/vst-on-linux-1/glitchmachines.png) + +They are working but there is one UI glitch + +![Glitchmachine's making glitch](/vst-on-linux-1/glitchmakesrs-glitch.gif) + +#### Maybe you won't notice it on your system + +Because we probably have different system configs, so maybe it's only possible to reproduce this bug with a set of configs and packages I'm using in my Linux. So if you don't face this issue, lucky you! + +It's not very annoying to me, but to avoid this kind of behavior, I can wrap these plugins with **Carla.** +![Glitchmachines with Carla](/vst-on-linux-1/glitchmaker-carla.gif) +It's working perfectly with Carla *(it's not that buggy in real life, only on the record)* + +--- + +## 6. FreqEcho by Valhalla DSP πŸ‘ + +Valhalla's plugins, I think, are one of the most popular in the music world. I don't know a man who doesn't have all of their free plugins installed. Β And I do have them installed already in my system, but I will go through the installation process again, just to describe it here. So let's download all of their free plugins + +- Valhalla Freq Echo +- Valhalla Space Modulator +- Valhalla Supermassive +```BASH +$ WINEPREFIX="$HOME/.wine_vst_plugins/" wine ValhallaFreqEchoWin_V1_2_0.exe +$ WINEPREFIX="$HOME/.wine_vst_plugins/" wine ValhallaSpaceModulatorWin_1_1_6v3.exe +$ WINEPREFIX="$HOME/.wine_vst_plugins/" wine ValhallaSupermassiveWin_V2_0_0.exe +$ yabridgectl sync +``` + +![Valhalla plugins](/vst-on-linux-1/valhalla.png) +All of them run flawlessly + +--- + +## 7. Audio Treasure by Max For Cats πŸ‘Ž + +As far as I could understand, it can be used only in **Ableton Live**, and since I'm not an Ableton user, and I don't want to run it with **Wine** *(cause there is no native Linux version)*, it's becoming the second plugin in the list, that is not working on + +## 8. Saturation Knob by Softube πŸ‘Ž + +To get it, I must have a Softube account, (*but I already have it, because I used to download all them free plugins like nuts and create accounts everywhere 🀦)* + +So I'm downloading their App Center, that I'm going to use to install a plugin. *I do hate this approach of managing software, but I will cover it in another post one day. * + +So the process is very similar to a direct plugin installation. Install **Softube Central** to the same **Wine** prefix + + WINEPREFIX="$HOME/.wine_vst_plugins/" wine Softube\ Central\ Setup\ 1.7.1.exe + + +But after that, I've found out that their **Software Center** is written is **Electron-based** application, and I wasn't yet able to run stuff like this in **Wine**. Maybe later I will put more effort into that, but for now, I'm saying that it's not working. πŸ˜₯ + +> #### Some kind of rhetorical question +> +> I don't understand why they and, for example, **Splice** can't release a Linux version of their application, it they already use Electron, that in my understanding is supposed for cross-platform development. + +--- + +## 9 and 10. Plugins by iZotope πŸ‘Ž + +**iZotope** is like **Valhalla**, everybody knows it. But I remember having troubles with their plugins on **Linux**. But now I'm trying again, and I'm full of hope. + +Plugins: + +- iZotope Vinyl +- iZotope Ozone Imager V2 *(it's not in the Output list, but why not?)* +- iZotope Vocal Doubler + +One more plugin vendor that requires an account creation. But I do have one from those good old times. + +Well, since I remember that there was a problem with them, I'll start by trying only one. Let it be **Ozone Imager V2**. + + $ WINEPREFIX="$HOME/.wine_vst_plugins/" wine iZotope_Ozone_Imager_v2_1_0.exe + + +But unfortunately, when I'm opening these plugins, it asks for an authorization, and it doesn't work. It's described in the **yabridge README.md**,but I'm too dummy to read it there. + +#### There is a workaround + +I've heard that you can download cracked versions of these plugins and they won't require an auth, so they might work. But I'm not trying that, and you shouldn't too. + +--- + +## 11. TAL-Chorus-LX πŸ‘πŸ‘πŸ‘ + +It's a piece of cake. This plugin has a native build for Linux, so I'm (since I'm using **Arch Linux**) just installing it using **yay**. And you may want to use another package manager, or download it from the official web page, it's presented there. +![NATIVE, YOU KNOW!](/vst-on-linux-1/tal-chorus.png) + + +--- + +## 12. Snap Heap by Kilo Hearts πŸ‘Ž + +I was trying to get it, but It didn't seem free. + +![Snap Heap](/vst-on-linux-1/snap-heap.png) + +--- + +## 13. Signal Free VST by Output πŸ‘Ž + +I'm sorry, but I'm not even trying. It still hurts since the first place in this top. + +--- + +## Some kind of conclusion + +First, you have seen only pictures here but haven't heard anything I've done with these plugins. And I know that it sucks, because we're talking about music. I'll record a track using these plugins later and show you how it's working. + +About those plugins that didn't work: I know that some of them are great, and it's sad that **iZotope** are not running on Linux, but there are alternatives that are Linux native. So for each failed one I will try to find an alternative, and later I will share my findings here. + +Thanks for reading + +Oi! + + diff --git a/content/posts/vst-on-linux-2/cover.png b/content/posts/vst-on-linux-2/cover.png new file mode 100644 index 0000000..71116c3 Binary files /dev/null and b/content/posts/vst-on-linux-2/cover.png differ diff --git a/content/posts/vst-on-linux-2/index.md b/content/posts/vst-on-linux-2/index.md new file mode 100644 index 0000000..14e43c8 --- /dev/null +++ b/content/posts/vst-on-linux-2/index.md @@ -0,0 +1,138 @@ +--- +title: "Vst on Linux 2" +date: 2023-01-31T19:32:34+01:00 +ShowToc: true +cover: + image: "cover.png" + caption: "VST on Linux" + relative: false + responsiveImages: false +--- + +Big ups, **Venus Theory!** +{{< youtube OCzf38fCqB4 >}} + +## Prerequisite +All of them are covered in [the first post]({{< ref "vst-on-linux-1" >}} ) + +- You have Wine and Yabridge installed +- You have a Wine prefix configured (in my case, `$HOME/.wine_vst_plugins/`, so every time you see it, use your own wine prefix) + +## Deelay πŸ‘ + +You can find it here: [https://sixthsample.com/deelay/](https://sixthsample.com/deelay/) + + +After receiving a link, I'm downloading a **Windows 64-bit** version and running +```BASH + +$ WINEPREFIX="$HOME/.wine_vst_plugins/" wine Deelay-1.0.3-Installer-64bit.exe +$ yabridgectl sync +``` + +![A running deelay](/vst-on-linux-2/deelay.png) + +It's running, but the context menus UI glitch is present +Audio qualities of this plugin on Linux are prefect, but when you open any drop-down menu, plugin's window is getting hidden. + +![UI glitch](vst-on-linux-2/deelay-glitch.gif) + +But it can be fixed with **Carla**. If I'm putting Carla to my FX chain and then adding **Deelay** to **Carla**, this problem is gone. + +## Surge XT πŸ‘πŸ‘πŸ‘ + +This plugin has a native **Linux** version, and it's open-source, so just install it with your package manager or download from the official site. You won't even have to touch **yabridge** and **wine** this time + +[**Source code**](https://github.com/surge-synthesizer/surge) + +![Surge XT Linux native](/vst-on-linux-2/surge.png) + +## Cardinal πŸ‘πŸ‘πŸ‘ + +**You won't believe me!** + +But it's open-source too and has supports **Linux** out of the box. + +[**Source code**](https://github.com/DISTRHO/Cardinal) + +![Again native and open-source](/vst-on-linux-2/cardinal.png) + +## Fire πŸ‘πŸ‘πŸ‘ + +*It ... is ... open ... source ... too ... and ... supports ... **Linux*** + +[**Source code**](https://github.com/jerryuhoo/Fire) + +So I'm just installing it with a package manager and trying. +![A real fire](/static/vst-on-linux-2/fire.png) + +## Ruina πŸ‘ + +*And a couple of others* + +It would be too good, if this one had a Linux version. To get this plugin, you will have to create an account, and download their installer πŸ‘Ώ + +[https://noiseengineering.us/products/the-freequel-bundle-sinc-vereor-virt-vereor-ruina](https://noiseengineering.us/products/the-freequel-bundle-sinc-vereor-virt-vereor-ruina) + +After downloading an Installer, I'm installing it with **wine **to the same prefix I install all their other plugins + + $ WINEPREFIX="$HOME/.wine_vst_plugins/" wine Noise\ Engineering\ Products\ 09358.exe + +![The installer](/static/vst-on-linux-2/noise-engineering.png) + +It will install plugins, we've only left to sync yabridge config. + + $ yabridgectl sync + +![Running Ruina ](/vst-on-linux-2/runia-plugin.png) + +![Sinc Vereor](/vst-on-linux-2/sirt-plugin.png) + +![Virt Vereor](/vst-on-linux-2/virt-vereor.png) + +All of them are working flawlessly. One wouldn't even notice that they're not native + +--- + +## Gatelab πŸ‘ / Filterstep πŸ‘Ž / Panflow πŸ‘ + +No **Linux** version again, so I'm gonna. And they want me to enter my email again. That's a shame, but let's do it anyway. If Venus Theory says they're good, I'm sure they really are. + + $ export WINEPREFIX="$HOME/.wine_vst_plugins/" + $ wine Audiomodern_Filterstep_1.1.2/WIN/Filterstep_64\ 1.1.2\ \(Win64\).exe + $ wine Audiomodern_Gatelab_1.1.3/WIN/Gatelab\ 1.1.3\ \(Win64\).exe + $ wine Audiomodern_Panflow_1.0.1/WIN/Panflow\ 1.0.1\ \(Win64\).exe + +I had to rerun Ardour multiple times in order to make these plugins work. **Panflow** is running fine + +![Panflow](/vst-on-linux-2/panflow.png) + +Gatelab is working fine too + +![Gatelab](/vst-on-linux-2/gatelab.png) + +But when I add **Filterstep**, Ardour stops responding. I'm sure it's possible to make it work too, so I will try doing that in one of the next articles. + +## PaulXStretch πŸ‘πŸ‘πŸ‘Ž + +I was tired after **Audiomodern** plugins, because they were freezing my Ardour and I had to log out and log in again to my system, for Ardour wouldn't run again after that. + +But **PaulXStrech** has a native Linux version too, and it has given me a strength to finish with this top. + +So I'm just installing it with a package manager. + +But my expectations were too high. I couldn't add PaulXStretch as a plugin in my **DAW**, even **Carla** couldn't handle it. Only [Kushview Element](https://kushview.net/) could handle it outside a **DAW**, but I couldn't connect Ardour with Element using JACK yet (probably because I'm too dummy). But when running **Element** as a plugin inside an **Ardour**, when I add PaulXStretch, Ardour crashes. + +But on the official site of this plugin, there is nothing said about a plugin version of PaulXStretch for Linux. So you can use it as a standalone application. Just record whatever you want, stretch and render an audio file to import it to your **DAW**. +![PaulXStretch as a standalone application](/vst-on-linux-2/paulxstretch.png) +--- + +Actually, I'm very happy to see that 4 of 9 plugins has a native Linux support. It means that developers see now that Linux can be used for music production. And it makes me feel that Linux is becoming more adopted by more and more guys who just want to make music without struggling with their systems. + +--- + +Thanks for reading + +Oi! + + diff --git a/content/posts/vst-on-linux-3/cover.png b/content/posts/vst-on-linux-3/cover.png new file mode 100644 index 0000000..d2524d9 Binary files /dev/null and b/content/posts/vst-on-linux-3/cover.png differ diff --git a/content/posts/vst-on-linux-3/index.md b/content/posts/vst-on-linux-3/index.md new file mode 100644 index 0000000..e49a1e0 --- /dev/null +++ b/content/posts/vst-on-linux-3/index.md @@ -0,0 +1,198 @@ +--- +title: "Vst on Linux 3" +date: 2023-02-03T18:26:44+01:00 +draft: false +ShowToc: true +cover: + image: "cover.png" + caption: "Vst on Linux" + relative: false + responsiveImages: false +tags: ['music'] +--- + +I've been told that I should add descriptions to plugins I'm writing about here, and it sounds very reasonable. So now I will not only describe how to install a plugin but also add a small description to it. + +## Prerequisite + +All of them are covered in [the first post]({{< ref "vst-on-linux-1" >}}) + +- You have Wine and Yabridge installed +- You have a Wine prefix configured (in my case, `$HOME/.wine_vst_plugins/`, so every time you see it, use your own wine prefix) + +## Before we begin + +In the previous post, I was trying to run paulxstretch on Linux, and using it as a plugin in a DAW didn't work out. I've tried to update the JUCE library in the source code, and now it's working. You can find the code here: [https://git.badhouseplants.net/badhouseplants/paulxstretch](https://git.badhouseplants.net/badhouseplants/paulxstretch) + +To build, refer to the official build doc or use the `/build_docker.sh` script + +## Melda Free Bundle πŸ‘ + +You can find it here: + +It's not a one plugin, but a whole bunch of them. I used to have it on my Mac a long ago, but I hate this way of managing plugins, so I don't install them if I'm not sure, I need them. And I never felt this way about **Melda Free Bundle.** + +But now I'll try running it on **Linux**. I don't think I'll ever use it, even if it runs smoothly as hell. So I will create an additional temporary wine prefix to install it there. + + $ export WINEPREFIX="$HOME/.wine_vst_plugins_tmp" + $ wine maudioplugins_16_01_setup.exe + +Install Melda Free bundle +### MDrummer + +[MDrummer](https://www.meldaproduction.com/MDrummer) + +Let's start with the MDrummer plugin. I've tried to run it as a plugin in **Ardour**,but it killed it. So I've added it with a **Carla** as a wrapper + +I'm downloading several GBs of samples and other data to make it work. + +![MDrummer](/vst-on-linux-3/mdrummer.png) +I'd say it's over-bloated. And UI is a wee bit laggy on Linux +Let's see what we can do with it + +{{< video "/vst-on-linux-3/mdrummer-example.mp4" "video-1" >}} + +### MDrumReplacer +[MDrumReplacer](https://www.meldaproduction.com/MDrumReplacer) + +As I understand, this plugin is catching drum signals and replacing them with another sound. So I'll add it next to the **MDrummer** in the **Carla Rack**. +![Replacer](/vst-on-linux-3/mdrummer-lfo-carla.png) + +I've also added LFO in the chain, to modify the pitch value of the **MDrumReplacer** with it, so it doesn't sound so boring (at least, to me). + +{{< video "/vst-on-linux-3/mdrummer-example-lfo.mp4" "video-2" >}} + +### MPowerSynth + +It's just a synth. I don't like the interface, and I'm not gonna use it in the future, so I'm simply using a preset. + +{{< video "/vst-on-linux-3/mpower-synth.mp4" "video-3" >}} + +It sounds a wee bet laggy, but it's just on a video + +--- + +*I'm sorry, I'm not trying all of them, because it's too much. Let's try another one and go further.* + +### MGuitarArchitect + +It's like a pedal board, as I see. I can add many effects here. Let's try adding it to the same **Carla Rack** that is used for the bass. + +{{< video "/vst-on-linux-3/mguitar-architect.mp4" "video-4" >}} + +--- + +## u-he TyrellN6 πŸ‘ +[u-he TyrellN6 ](https://u-he.com/products/tyrelln6/) + +I think that almost every **u-he** plugins has a native **Linux** support, and **Tyrell** is not an exception. But you most probably won't be able to install it with a package manager, because it's available only on Amazona.de. So just follow the link on the official web-page and download the Linux version. + +This is a pretty minimalistic synth, that can help you produce a lot of cool sounds without spending tons of hours learning it. I definitely can recommend it, as I can recommend anything developed by **u-he** + +Unpack the archive and run the **./install.sh** script + + $ ./TyrellN6-3898/install.sh + +{{< video "/vst-on-linux-3/tyrell.mp4" "video-5" >}} + +I can't tell anything bad about **u-he**, I love all their plugins, I love that they support Linux and I love that they together with **Bitwig** are working on the new plugin open-source format ([CLAP](https://github.com/free-audio/clap)). + +Tyrell is just a very cool free synth. What else can I say? + +--- + +## Valhalla Supermassive πŸ‘ + +I've already covered Valhalla plugins in the [first post]({{< ref "vst-on-linux-1" >}}), so it doesn't make sense to repeat myself, instead of that, I'll add every free **Valhalla** plugin to the project and show you how it's working. + +{{< video "/vst-on-linux-3/vallhalla.mp4" "video-6" >}} + + +## Spitfire Labs πŸ‘ +[Spitfire Labs](https://labs.spitfireaudio.com/?sortBy=prod_products_labs_latest) + +I think, everybody knows what's that. But if you don't and you don't mind creating a Spitfire account, just try. + +I need to create an account for downloading that. *But I already have one, because I'm an active LABS user.* + + $ wine SpitfireAudio-Win-3.4.0.exe + $ yabridgectl sync + +You will have to install presets +![Spitfire App](/vst-on-linux-3/spitfire-labs-app.png) + +{{< video "/vst-on-linux-3/labs-example.mp4" "video-7" >}} + +## Infinite Space Piano πŸ‘ + +[Space Piano](https://zaksound.com/infinite-space-piano/) + +This is a piano synth. I already have a lot of them, and as for me, this is yet another one. But is sounds pretty good, so you may like it. + +This time I really need to create an account, because it's the first time I hear about this one. + +There is no **Linux** version, I'm getting the **Windows** one. I've got a feeling that I'm not gonna use it in the future, so I'm installing it in the temporary prefix. + + $ export WINEPREFIX="$HOME/.wine_vst_plugins_tmp/" + $ wine Infinite\ Space\ Piano\ 2.exe + $ yabridgectl sync + +{{< video "/vst-on-linux-3/space-piano.mp4" "video-8" >}} + +## ProjectSAM Free Orchestra πŸ‘Ž +[Free Orchestra](https://projectsam.com/libraries/the-free-orchestra/) +![Free Orchestra](/vst-on-linux-3/native-access.png) +Ok, let's try +I'm downloading **Native Access**, and it's not working. And this is the moment, I'm giving up on this plugin. + +## Eventide PendulateπŸ‘ +[Eventide Pendulate](https://www.eventideaudio.com/plug-ins/pendulate/) + +Downloading a Windows version again. + + $ wine Pendulate-1.3.6-windows-installer.exe + $ yabridgectl sync + +{{< video "/vst-on-linux-3/eventide-pendulate.mp4" "video-9" >}} + +Runnin just fine +As you see, this is a pretty interesting Synth, I have enough of synths for everything, but this one may join the ranks too. + +## VCV Rack πŸ‘ +[VCV Rack](https://vcvrack.com/) + +VCV Rack is an open-source Eurorack modular synthesizer simulator + +I've already covered the Cardinal plugin [here]({{< ref "vst-on-linux-2" >}}). And this is basically the same thing. And so I will just show **Cardinal** instead of **VCV Rack**. But if you want VCV Rack, it's working on Linux just fine, but you can't use the free version as a plugin, that's why I'm showing Cardinal + +{{< video "/vst-on-linux-3/vcv-rack.mp4" "video-10" >}} + +I didn't have enough time to learn it yet, so that's what I could do with it + +## U-He Protoverb πŸ‘ +[U-He Protoverb](https://u-he.com/products/protoverb/) + +Protoverb is a reverb created by u-he. It has native Linux support + +Download the **Linux** version and install it by running a script. You can finfd everything [here](https://u-he.com/products/protoverb/) + +## Paulstretch πŸ‘ + +It's already covered in the previous article. But since then, one thing is changed. You could've seen it in the very beginning of the post, that I've updated JUCE library in the source code, and now it's running as a VST plugin. If you missed it, try reading the beginning one more time. + +I'm testing it currently, but you can help me with that. + +## Bonus: Vital πŸ‘ +[Vital](https://vital.audio/) + +I think this is the best Synth ever made. It's open source and has Linux support. I use it in every project and if you don't, I recommend you to start doing that. + +{{< video "/vst-on-linux-3/vital.mp4" "video-11" >}} + +The video is laggy again, but in reality it's fine. + +--- +If you like what I'm doing, you can follow my [twitter](https://twitter.com/_allanger) or [mastodon](https://mastodon.social/@allanger), since I'll be posing there all the updates + +Thanks +Oi! diff --git a/content/search.md b/content/search.md new file mode 100644 index 0000000..39ef5f9 --- /dev/null +++ b/content/search.md @@ -0,0 +1,8 @@ +--- +title: "Search" # in any language you want +layout: "search" # is necessary +# url: "/archive" +# description: "Description for Search" +summary: "search" +placeholder: "placeholder text in search input box" +--- \ No newline at end of file diff --git a/kube/application.yaml b/kube/application.yaml deleted file mode 100644 index cc41ea1..0000000 --- a/kube/application.yaml +++ /dev/null @@ -1,22 +0,0 @@ -apiVersion: argoproj.io/v1alpha1 -kind: Application -metadata: - labels: - application: badhouseplants - branch: $ARGO_APP_BRANCH - commit_sha: $ARGO_APP_IMAGE_TAG - name: badhouseplants-$ARGO_APP_BRANCH - namespace: platform -spec: - destination: - namespace: $ARGO_APP_NAMESPACE - server: https://kubernetes.default.svc - project: badhouseplants - source: - chart: badhouseplants-net - targetRevision: $ARGO_APP_CHART_VERSION - helm: - valueFiles: - - values.yaml - values: __DUMMY__ - repoURL: https://git.badhouseplants.net/api/packages/badhouseplants/helm diff --git a/kube/applicationset.yaml b/kube/applicationset.yaml deleted file mode 100644 index 95bac0a..0000000 --- a/kube/applicationset.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: argoproj.io/v1alpha1 -kind: ApplicationSet -metadata: - name: badhouseplants-net - namespace: argo-system -spec: - template: - metadata: - name: "{{ app }}-{{ name }}" - namespace: argo-system - labels: - branch: "{{ branch }}" - application: "{{ app }}" - commit_sha: "{{ commit_sha }}" - spec: - project: "default" - source: - helm: - valueFiles: - - values.yaml - values: "{{ value }}" - repoURL: "{{ repo_url }}" - targetRevision: "{{ chart_version }}" - chart: badhouseplants-net - destination: - server: "https://kubernetes.default.svc" - namespace: "{{ app }}-{{ name }}" - diff --git a/kube/main.yaml b/kube/main.yaml deleted file mode 100644 index a5f4554..0000000 --- a/kube/main.yaml +++ /dev/null @@ -1,30 +0,0 @@ -- name: application - app: badhouseplants - branch: $ARGO_APP_BRANCH - commit_sha: $ARGO_APP_IMAGE_TAG - chart_version: $ARGO_APP_CHART_VERSION - repo_url: https://git.badhouseplants.net/api/packages/badhouseplants/helm - value: | - hugo: - image: - tag: $ARGO_APP_IMAGE_TAG - istio: - annotations: - link.argocd.argoproj.io/env: https://badhouseplants.net/ - link.argocd.argoproj.io/build: $DRONE_BUILD_LINK - link.argocd.argoproj.io/remark42: https://remark42.badhouseplants.net/web - remark42: - settings: - secret: $ARGO_REMARK_SECRET - oauth: - github: - enabled: true - key: 1fb3d33a62b074bc0ea0 - secret: $ARGO_GITHUB_OAUTH_KEY - google: - enabled: true - key: 966815964055-m9t7leuj1arqimqu2pvbs1k10cg54gcg.apps.googleusercontent.com - secret: $ARGO_GOOGLE_OAUTH_KEY - storage: - requestedSize: 300Mi - diff --git a/kube/project.yaml b/kube/project.yaml deleted file mode 100644 index f302767..0000000 --- a/kube/project.yaml +++ /dev/null @@ -1,32 +0,0 @@ -apiVersion: argoproj.io/v1alpha1 -kind: AppProject -metadata: - name: badhouseplants - namespace: platform - finalizers: - - resources-finalizer.argocd.argoproj.io -spec: - description: BadHouseplants Blog - sourceRepos: - - '*' - - destinations: - - namespace: development - server: https://kubernetes.default.svc - name: in-cluster - - namespace: production - server: https://kubernetes.default.svc - name: in-cluster - - # Allow all namespaced-scoped resources to be created, except for ResourceQuota, LimitRange, NetworkPolicy - namespaceResourceBlacklist: - - group: '' - kind: ResourceQuota - - group: '' - kind: LimitRange - - group: '' - kind: NetworkPolicy - - # Enables namespace orphaned resource monitoring. - orphanedResources: - warn: false diff --git a/kube/template.yaml b/kube/template.yaml deleted file mode 100644 index d07d9d0..0000000 --- a/kube/template.yaml +++ /dev/null @@ -1,38 +0,0 @@ ---- -- name: $ARGO_APP_BRANCH - app: badhouseplants - branch: $ARGO_APP_BRANCH - commit_sha: $ARGO_APP_IMAGE_TAG - chart_version: $ARGO_APP_CHART_VERSION - repo_url: https://git.badhouseplants.net/api/packages/badhouseplants/helm - value: | - namespace: - name: badhouseplants-$ARGO_APP_BRANCH - labels: - istio-injection: disabled - istio: - hosts: - - $ARGO_APP_HOSTNAME - annotations: - link.argocd.argoproj.io/env: https://$ARGO_APP_HOSTNAME/ - link.argocd.argoproj.io/remark42: https://remark42-$ARGO_APP_HOSTNAME/web - link.argocd.argoproj.io/build: $DRONE_BUILD_LINK - hugo: - image: - tag: $ARGO_APP_IMAGE_TAG - baseURL: https://$ARGO_APP_HOSTNAME/ - buildDrafts: true - env: - HUGO_PARAMS_GITBRANCH: $ARGO_APP_BRANCH - HUGO_PARAMS_REMARK42URL: https://remark42-$ARGO_APP_HOSTNAME - remark42: - istio: - hosts: - - remark42-$ARGO_APP_HOSTNAME - settings: - url: https://remark42-$ARGO_APP_HOSTNAME/ - auth: - anonymous: true - secretKey: $ARGO_REMARK42_SECRET - rclone: - command: "rclone copy -P badhouseplants-public:/badhouseplants-net/$ARGO_APP_IMAGE_TAG /static" diff --git a/kube/values-main.yaml b/kube/values-main.yaml deleted file mode 100644 index 4d25e03..0000000 --- a/kube/values-main.yaml +++ /dev/null @@ -1,72 +0,0 @@ ---- -values: | - hugo: - image: - tag: $ARGO_APP_IMAGE_TAG - env: - HUGO_PARAMS_GITCOMMIT: $ARGO_APP_IMAGE_TAG - ingress: - enabled: true - className: ~ - annotations: - kubernetes.io/ingress.class: traefik - kubernetes.io/tls-acme: "true" - kubernetes.io/ingress.allow-http: "false" - kubernetes.io/ingress.global-static-ip-name: "" - cert-manager.io/cluster-issuer: badhouseplants-issuer-http01 - link.argocd.argoproj.io/env: https://badhouseplants.net/ - link.argocd.argoproj.io/build: $DRONE_BUILD_LINK - pathtype: ImplementationSpecific - hosts: - - host: badhouseplants.net - paths: - - path: / - pathType: ImplementationSpecific - - host: www.badhouseplants.net - paths: - - path: / - pathType: ImplementationSpecific - tls: - - secretName: badhp-tls - hosts: - - badhouseplants.net - - www.badhouseplants.net - - remark42: - settings: - secret: $ARGO_REMARK_SECRET - admin: - sharedEmail: allanger@badhouseplants.net - oauth: - github: - enabled: true - key: 1fb3d33a62b074bc0ea0 - secret: $ARGO_GITHUB_OAUTH_KEY - google: - enabled: true - key: 966815964055-m9t7leuj1arqimqu2pvbs1k10cg54gcg.apps.googleusercontent.com - secret: $ARGO_GOOGLE_OAUTH_KEY - storage: - requestedSize: 300Mi - ingress: - enabled: true - className: ~ - annotations: - kubernetes.io/ingress.class: traefik - kubernetes.io/tls-acme: "true" - kubernetes.io/ingress.allow-http: "false" - kubernetes.io/ingress.global-static-ip-name: "" - cert-manager.io/cluster-issuer: badhouseplants-issuer-http01 - link.argocd.argoproj.io/remark42: https://remark42.badhouseplants.net/web - ## Hosts - hosts: - - host: remark42.badhouseplants.net - paths: - - path: / - pathType: ImplementationSpecific - - tls: - secretName: chart-example-tls - hosts: - - remark42.badhouseplants.net - \ No newline at end of file diff --git a/kube/values-preview.yaml b/kube/values-preview.yaml deleted file mode 100644 index c618bd8..0000000 --- a/kube/values-preview.yaml +++ /dev/null @@ -1,62 +0,0 @@ ---- -values: | - ingress: - enabled: true - className: ~ - annotations: - kubernetes.io/ingress.class: traefik - kubernetes.io/tls-acme: "true" - kubernetes.io/ingress.allow-http: "false" - kubernetes.io/ingress.global-static-ip-name: "" - cert-manager.io/cluster-issuer: badhouseplants-issuer-http01 - link.argocd.argoproj.io/env: https://$ARGO_APP_HOSTNAME/ - link.argocd.argoproj.io/build: $DRONE_BUILD_LINK - pathtype: ImplementationSpecific - hosts: - - host: $ARGO_APP_HOSTNAME - paths: - - path: / - pathType: ImplementationSpecific - tls: - - secretName: badhp-$ARGO_APP_BRANCH-tls - hosts: - - $ARGO_APP_HOSTNAME - - hugo: - image: - tag: $ARGO_APP_IMAGE_TAG - baseURL: https://$ARGO_APP_HOSTNAME/ - buildDrafts: true - env: - HUGO_PARAMS_GITBRANCH: $ARGO_APP_BRANCH - HUGO_PARAMS_COMMENTS_REMARK42_HOST: https://remark42-$ARGO_APP_HOSTNAME - HUGO_PARAMS_GITCOMMIT: $ARGO_APP_IMAGE_TAG - remark42: - settings: - url: https://remark42-$ARGO_APP_HOSTNAME/ - auth: - anonymous: true - secretKey: $ARGO_REMARK_SECRET - ingress: - enabled: true - className: ~ - annotations: - kubernetes.io/ingress.class: traefik - kubernetes.io/tls-acme: "true" - kubernetes.io/ingress.allow-http: "false" - kubernetes.io/ingress.global-static-ip-name: "" - cert-manager.io/cluster-issuer: badhouseplants-issuer-http01 - link.argocd.argoproj.io/remark42: https://remark42-$ARGO_APP_HOSTNAME/ - ## Hosts - hosts: - - host: remark42.badhouseplants.net - paths: - - path: / - pathType: ImplementationSpecific - - tls: - secretName: remark-$ARGO_APP_BRANCH-tls - hosts: - - remark42-$ARGO_APP_HOSTNAME - rclone: - command: 'rclone copy -P badhouseplants-public:/badhouseplants-net/$ARGO_APP_IMAGE_TAG /static' diff --git a/src/layouts/shortcodes/details.html b/layouts/shortcodes/details.html similarity index 100% rename from src/layouts/shortcodes/details.html rename to layouts/shortcodes/details.html diff --git a/src/layouts/shortcodes/rawhtml.html b/layouts/shortcodes/rawhtml.html similarity index 100% rename from src/layouts/shortcodes/rawhtml.html rename to layouts/shortcodes/rawhtml.html diff --git a/src/layouts/shortcodes/video.html b/layouts/shortcodes/video.html similarity index 79% rename from src/layouts/shortcodes/video.html rename to layouts/shortcodes/video.html index 3876006..6a7a985 100644 --- a/src/layouts/shortcodes/video.html +++ b/layouts/shortcodes/video.html @@ -4,7 +4,7 @@ @@ -13,7 +13,7 @@ var player = new Clappr.Player({ source: {{ .Get 0 }}, - mute: false, + mute: true, height: 360, width: 640 }); diff --git a/src/layouts/taxonomy/tag.html b/layouts/taxonomy/tag.html similarity index 100% rename from src/layouts/taxonomy/tag.html rename to layouts/taxonomy/tag.html diff --git a/scripts/build-container.pl b/scripts/build-container.pl deleted file mode 100755 index 2f39479..0000000 --- a/scripts/build-container.pl +++ /dev/null @@ -1,32 +0,0 @@ -#! /usr/bin/perl -use strict; -use warnings; -# ------------------------------------------------- -# -- Setup Git variables -# ------------------------------------------------- -my $git_branch = `git rev-parse --abbrev-ref HEAD`; -my $git_commit_sha = `git rev-parse HEAD`; -my $main_branch = "main"; -chomp($git_branch); -chomp($git_commit_sha); -# ------------------------------------------------- -# -- Build the image with SHA tag -# ------------------------------------------------- -my $container_registry = $ENV{'CONTAINER_REGISTRY'} || 'git.badhouseplants.net'; -my $image_name = $ENV{'DRONE_REPO'} || "badhouseplants/badhouseplants-net"; -my $tag = "$container_registry/$image_name:$git_commit_sha"; -my $username = $ENV{'DRONE_USERNAME'} || "allanger"; -my $password = $ENV{'GITEA_TOKEN'} || "YOU NOT AUTHORIZED, PAL"; -print `buildah login --username $username --password $password $container_registry` or die $!; -print `buildah build -t $tag .` or die $!; -print `buildah push $tag` or die $!; -# ------------------------------------------------- -# -- Push the latest if the branch is main -# ------------------------------------------------- -if ( $git_branch eq $main_branch) { - my $latest_tag = "$container_registry/$image_name:latest"; - print `buildah tag $tag $latest_tag` or die $!; - print `buildah push $latest_tag` or die $!; -} - -print "Thanks!\n"; diff --git a/scripts/cleanup.pl b/scripts/cleanup.pl deleted file mode 100755 index 4cb416d..0000000 --- a/scripts/cleanup.pl +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; -# -------------------------------------- -# -- Gitea variables -# -------------------------------------- -my $gitea_url=$ENV{'GITEA_URL'} || 'https://git.badhouseplants.net/api/v1'; -my $gitea_org=$ENV{'GITEA_ORG'} || 'badhouseplants'; -my $gitea_package=$ENV{'GITEA_PACKAGE'} || 'badhouseplants-net'; -my $gitea_api="$gitea_url/packages/$gitea_org/container/$gitea_package"; -my $gitea_list_api="$gitea_url/packages/$gitea_org?page=1&type=container&q=badhouseplants-net"; -my $gitea_token=$ENV{'GITEA_TOKEN'}; -my $gitea_user=$ENV{'GITEA_USER'} || $ENV{'DRONE_COMMIT_AUTHOR'}; -# --------------------------------------- -# -- Get tags from Gitea -# --------------------------------------- -my $builds = "curl -X 'GET' \"$gitea_list_api\" -H 'accept: application/json' -H \"Authorization: token $gitea_token\" | jq -r '.[].version'"; -my @builds_out = `$builds`; -chomp @builds_out; -# --------------------------------------- -# -- Get a list of all commits + 'latest' -# --------------------------------------- -my $commits = "argocd app list -o yaml -l application=badhouseplants | yq '.[].metadata.labels.commit_sha'"; -my @commits_out = `$commits`; -chomp @commits_out; -push @commits_out, 'latest'; -# -------------------------------------- -# -- Rclone variables -# ------------------------------------- -my $dirs = "rclone lsf badhouseplants-minio:/badhouseplants-net"; -my @dirs_out = `$dirs`; -chomp @dirs_out; -# --------------------------------------- -# -- Compare builds to commits -# -- And remove obsolete imgages from -# -- registry -# --------------------------------------- -print "Cleaning up the container registry\n"; -foreach my $line (@builds_out) -{ - print "Checking if $line is in @commits_out\n\n"; - if ( ! grep( /^$line$/, @commits_out ) ) { - my $cmd = "curl -X 'DELETE' -s \"$gitea_api/$line\" -H 'accept: application/json' -H \"Authorization: token $gitea_token\" || true"; - print "Removing ${line}\n\n"; - my $output = `$cmd`; - print "$output \n"; - } -} - -print "Cleaning up Minio\n"; -foreach my $line (@dirs_out) -{ - print "Checking if $line is in @commits_out\n\n"; - chop($line); - if ( ! grep( /^$line$/, @commits_out ) ) { - my $cmd = "rclone purge badhouseplants-minio:/badhouseplants-net/$line"; - print "Removing ${line}\n\n"; - my $output = `$cmd`; - print "$output \n"; - } -} - - diff --git a/scripts/deploy-app.pl b/scripts/deploy-app.pl deleted file mode 100755 index 7e53405..0000000 --- a/scripts/deploy-app.pl +++ /dev/null @@ -1,74 +0,0 @@ -#! /usr/bin/perl -use strict; -use warnings; - -my $chart_version = `cat chart/Chart.yaml | yq '.version'` or die $1; -chomp($chart_version); - -my $git_branch = `git rev-parse --abbrev-ref HEAD`; -chomp($git_branch); -my $git_commit_sha = `git rev-parse HEAD`; -chomp($git_commit_sha); - -my $main_branch = "main"; -my $values = ""; -my $remark_secret = `openssl rand -hex 12`; -chomp($remark_secret); - -$ENV{'ARGO_APP_CHART_VERSION'} = $chart_version; -$ENV{'ARGO_APP_BRANCH'} = $git_branch; -if ($git_branch eq $main_branch) { - $ENV{'ARGO_APP_NAMESPACE'} = "production"; -} else { - $ENV{'ARGO_APP_NAMESPACE'} = "development" -} -$ENV{'ARGO_APP_HOSTNAME'} = "$git_branch-dev.badhouseplants.net"; -$ENV{'ARGO_APP_IMAGE_TAG'} = $git_commit_sha; -$ENV{'ARGO_REMARK_SECRET'} = $remark_secret; - -# ---------------------------------- -# -- Fill the Application manifest -# -- with correct values -# ---------------------------------- -if ($git_branch eq $main_branch) { - print "Using the main values file\n"; - print `envsubst < ./kube/values-main.yaml > /tmp/values.yaml` or die $!; -} else { - print "Using the preview values file\n"; - print `envsubst < ./kube/values-preview.yaml > /tmp/values.yaml` or die $!; -} -print `yq -i '.values' /tmp/values.yaml` or die $!; -print `envsubst < ./kube/application.yaml > /tmp/application.yaml` or die $!; -print `yq -i '.spec.source.helm.values = load_str("/tmp/values.yaml")' /tmp/application.yaml` or die $!; - -if(!defined $ENV{DEPLOY_SCRIPT_DEBUG}){ - print `argocd app create -f /tmp/application.yaml --upsert` or die $!; - print `argocd app sync --prune -l application=badhouseplants -l branch=$git_branch` or die $!; - print `argocd app wait -l application=badhouseplants -l branch=$git_branch` or die $!; -} -# ---------------------------------- -# -- Remove all `Applications` for -# -- branches that do not exists -# ---------------------------------- -my @all_applications = `argocd app list -l application=badhouseplants -o yaml | yq '.[].metadata.name'` or die $!; -chomp(@all_applications); -foreach my $app (@all_applications) { - $app =~ s/badhouseplants-//; -} - -my @all_branches = `git branch --format='%(refname:short)' -r` or die $!; -chomp(@all_branches); -foreach my $branch (@all_branches) { - $branch =~ s/origin\///; -} - -foreach my $app (@all_applications) { - if ( !grep( /^$app$/, @all_branches ) ) { - if ($app ne "application") { - print "$app should be removed\n"; - if(!defined $ENV{DEPLOY_SCRIPT_DEBUG}){ - print `argocd app delete --yes badhouseplants-$app` or die $!; - } - } - } -} diff --git a/scripts/upload-media.pl b/scripts/upload-media.pl deleted file mode 100755 index 13eb20d..0000000 --- a/scripts/upload-media.pl +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/perl -my $git_branch = `git rev-parse --abbrev-ref HEAD`; -my $git_commit_sha = `git rev-parse HEAD`; -my $main_branch = "main"; -my $common_bucket = "badhouseplants-minio:/badhouseplants-net"; -my $main_bucket = "badhouseplants-minio:/badhouseplants-net-main"; - -# -------------------------------------------------- -# -- I'm doing all of it because I can't undestand -# -- how not to send 300Mb to the buildah context -# -------------------------------------------------- -chomp($git_branch); -chomp($git_commit_sha); - -print `cp -r . /tmp/$git_commit_sha` or die; - -print "Getting the lfs data\n"; -print `git -C /tmp/$git_commit_sha lfs pull` or die; - -print "Creating a new hashed dir in the common bucket\n"; - -print `rclone copy /tmp/$git_commit_sha/src/static "$common_bucket/$git_commit_sha"` or die; - -if ($git_branch eq $main_branch) { - print "Syncing to the production bucket\n"; - print `rclone sync "$common_bucket/$git_commit_sha" "$main_bucket/"` or die; -} diff --git a/src/archetypes/categories.md b/src/archetypes/categories.md deleted file mode 100644 index bde898d..0000000 --- a/src/archetypes/categories.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "{{ replace .Name "-" " " | title }}" -image: -style: - background: "#2a9d8f" - color: "#fff" ---- diff --git a/src/archetypes/default.md b/src/archetypes/default.md deleted file mode 100644 index 0556d3a..0000000 --- a/src/archetypes/default.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: "{{ replace .Name "-" " " | title }}" -description: -date: {{ .Date }} -image: -math: -license: -hidden: false -comments: true -draft: true ---- \ No newline at end of file diff --git a/src/archetypes/tags.md b/src/archetypes/tags.md deleted file mode 100644 index bc2eb0c..0000000 --- a/src/archetypes/tags.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "{{ replace .Name "-" " " | title }}" -description: -image: ---- diff --git a/src/content/_index.md b/src/content/_index.md deleted file mode 100644 index 530dfe8..0000000 --- a/src/content/_index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -menu: - main: - name: Home - weight: -100 - params: - icon: home ---- \ No newline at end of file diff --git a/src/content/categories/Kubernetes/_index.md b/src/content/categories/Kubernetes/_index.md deleted file mode 100644 index 8ea9993..0000000 --- a/src/content/categories/Kubernetes/_index.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: "Kubernetes" -description: "Content related to Kubernetes" -slug: "k8s" -image: "kubernetes.png" -style: - background: "#2a9d8f" - color: "#fff" ---- diff --git a/src/content/categories/Kubernetes/kubernetes.png b/src/content/categories/Kubernetes/kubernetes.png deleted file mode 100644 index 6b76951..0000000 Binary files a/src/content/categories/Kubernetes/kubernetes.png and /dev/null differ diff --git a/src/content/music/allanger/_index.md b/src/content/music/allanger/_index.md deleted file mode 100644 index 232db6f..0000000 --- a/src/content/music/allanger/_index.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: "allanger" -date: 2018-12-26T00:00:00+02:00 -draft: false -ShowToc: false -cover: - image: "/music/allanger.png" - caption: "allanger" - relative: false - responsiveImages: false -hideSummary: true -tags: - - music - - release - - indie - - alternative ---- - -I'm allanger, the owner of Bad Houseplants. diff --git a/src/content/music/allanger/allanger-anymore.md b/src/content/music/allanger/allanger-anymore.md deleted file mode 100644 index 6740326..0000000 --- a/src/content/music/allanger/allanger-anymore.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: "allanger - Anymore" -date: 2018-12-26T00:00:00+02:00 -draft: false -ShowToc: false -cover: - image: "/music/allanger-Anymore.jpg" - caption: "Anymore" - relative: false - responsiveImages: false -hideSummary: true -tags: - - music - - release - - indie - - alternative ---- - -[OPEN ON BANDCAMP](https://allanger.bandcamp.com/album/anymore) -- [OPEN ON FUNKWHALE](https://funkwhale.badhouseplants.net/library/albums/20/) - ---- -{{< rawhtml >}} - -{{< /rawhtml >}} - -*If you want to download lossless audio for free [follow this link](https://s3.badhouseplants.net/allanger-music/allanger%20-%20Anymore.zip)* diff --git a/src/content/music/allanger/allanger-await.md b/src/content/music/allanger/allanger-await.md deleted file mode 100644 index 11ad224..0000000 --- a/src/content/music/allanger/allanger-await.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: "allanger - Await" -date: 2022-07-01T00:00:00+02:00 -draft: false -ShowToc: false -cover: - image: "/music/allanger-Await.jpg" - caption: "Await" - relative: false - responsiveImages: false -hideSummary: true -tags: - - music - - release - - indie - - alternative - - hiphop - - rap ---- - -[OPEN ON BANDCAMP](https://allanger.bandcamp.com/album/await) -- [OPEN ON FUNKWHALE](https://funkwhale.badhouseplants.net/library/albums/26/) - ---- -{{< rawhtml >}} - -{{< /rawhtml >}} - -*If you want to download lossless audio for free [follow this link](https://s3.badhouseplants.net/allanger-music/allanger%20-%20Await.zip)* diff --git a/src/content/music/allanger/allanger-desensitized.md b/src/content/music/allanger/allanger-desensitized.md deleted file mode 100644 index e3f5abb..0000000 --- a/src/content/music/allanger/allanger-desensitized.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "allanger - Desensitized" -date: 2022-02-06T00:00:00+02:00 -draft: false -ShowToc: false -cover: - image: "music/allanger-Desensitized.png" - caption: "Desensitized" - relative: false - responsiveImages: false -hideSummary: true -tags: - - music - - release - - indie - - edm - - electronic ---- - -[OPEN ON BANDCAMP](https://allanger.bandcamp.com/album/desensitized) -- [OPEN ON FUNKWHALE](https://funkwhale.badhouseplants.net/library/albums/22/) - ---- -{{< rawhtml >}} - -{{< /rawhtml >}} - -*If you want to download lossless audio for free [follow this link](https://s3.badhouseplants.net/allanger-music/allanger%20-%20Desensitized.zip)* diff --git a/src/content/music/allanger/allanger-four-steps-behind copy.md b/src/content/music/allanger/allanger-four-steps-behind copy.md deleted file mode 100644 index 285138b..0000000 --- a/src/content/music/allanger/allanger-four-steps-behind copy.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: "allanger - Under My Pillow" -date: 2023-05-15T00:00:00+02:00 -draft: false -ShowToc: false -cover: - image: "/music/allanger-Under_My_Pillow.png" - caption: "Under My Pillow" - relative: false - responsiveImages: false -hideSummary: true -tags: - - music - - release - - indie - - rap - - hiphop ---- -[OPEN ON BANDCAMP](https://allanger.bandcamp.com/album/under-my-pillow) -- [OPEN ON FUNKWHALE](https://funkwhale.badhouseplants.net/library/albums/27/) - ---- -{{< rawhtml >}} -{{< /rawhtml >}} - -*If you want to download lossless audio for free [follow this link](https://s3.badhouseplants.net/allanger-music/allanger%20-%20Under%20My%20Pillow.zip)* diff --git a/src/content/music/allanger/allanger-four-steps-behind.md b/src/content/music/allanger/allanger-four-steps-behind.md deleted file mode 100644 index b0ca05f..0000000 --- a/src/content/music/allanger/allanger-four-steps-behind.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: "allanger - Four Steps Behind" -date: 2023-05-15T00:00:00+02:00 -draft: false -ShowToc: false -cover: - image: "/music/allanger-Four_Steps_Behind.jpg" - caption: "Four Steps Behind" - relative: false - responsiveImages: false -hideSummary: true -tags: - - music - - release - - house - - edm ---- -[OPEN ON BANDCAMP](https://allanger.bandcamp.com/album/four-steps-behind) -- [OPEN ON FUNKWHALE](https://funkwhale.badhouseplants.net/library/albums/16/) - ---- -{{< rawhtml >}} - -{{< /rawhtml >}} - -*If you want to download lossless audio for free [follow this link](https://s3.badhouseplants.net/allanger-music/allanger%20-%20Four%20Steps%20Behind.zip)* diff --git a/src/content/music/allanger/allanger-let-me-kill.md b/src/content/music/allanger/allanger-let-me-kill.md deleted file mode 100644 index 01a21d3..0000000 --- a/src/content/music/allanger/allanger-let-me-kill.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "allanger - Let Me Kill" -date: 2021-10-15T00:00:00+02:00 -draft: false -ShowToc: false -cover: - image: "music/allanger-Let_Me_Kill.png" - caption: "Let Me Kill" - relative: false - responsiveImages: false -hideSummary: true -tags: - - music - - release - - indie - - trap - - spoken-word ---- - -[OPEN ON BANDCAMP](https://allanger.bandcamp.com/album/let-me-kill) -- [OPEN ON FUNKWHALE](https://funkwhale.badhouseplants.net/library/albums/21/) - ---- -{{< rawhtml >}} - -{{< /rawhtml >}} - -*If you want to download lossless audio for free [follow this link](https://s3.badhouseplants.net/allanger-music/allanger%20-%20Let%20Me%20Kill.zip)* diff --git a/src/content/music/allanger/allanger-not-alone.md b/src/content/music/allanger/allanger-not-alone.md deleted file mode 100644 index 43101bf..0000000 --- a/src/content/music/allanger/allanger-not-alone.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "allanger - Not Alone" -date: 2022-02-10T00:00:00+02:00 -draft: false -ShowToc: false -cover: - image: "music/allanger-Not_Alone.png" - caption: "Not Alone" - relative: false - responsiveImages: false -hideSummary: true -tags: - - music - - release - - indie - - edm - - electronic ---- - -[OPEN ON BANDCAMP](https://allanger.bandcamp.com/album/not-alone) -- [OPEN ON FUNKWHALE](https://funkwhale.badhouseplants.net/library/albums/23/) - ---- -{{< rawhtml >}} - -{{< /rawhtml >}} - -*If you want to download lossless audio for free [follow this link](https://s3.badhouseplants.net/allanger-music/allanger%20-%20Not%20Alone.zip)* diff --git a/src/content/music/allanger/allanger-out-of-law.md b/src/content/music/allanger/allanger-out-of-law.md deleted file mode 100644 index 9f38145..0000000 --- a/src/content/music/allanger/allanger-out-of-law.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: "allanger - Out Of Law" -date: 2022-01-23T00:00:00+02:00 -draft: false -ShowToc: false -cover: - image: "music/allanger-Out_of_Law.png" - caption: "Out Of Law" - relative: false - responsiveImages: false -hideSummary: true -tags: - - music - - release - - indie - - punk ---- - -[OPEN ON BANDCAMP](https://allanger.bandcamp.com/album/out-of-law) -- [OPEN ON FUNKWHALE](https://funkwhale.badhouseplants.net/library/albums/18/) - ---- -{{< rawhtml >}} - -{{< /rawhtml >}} - -*If you want to download lossless audio for free [follow this link](https://s3.badhouseplants.net/allanger-music/allanger%20-%20Out%20Of%20Law.zip)* diff --git a/src/content/music/allanger/allanger-trace.md b/src/content/music/allanger/allanger-trace.md deleted file mode 100644 index 157832e..0000000 --- a/src/content/music/allanger/allanger-trace.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: "allanger - Trace" -date: 2023-05-30T00:00:00+02:00 -draft: false -ShowToc: false -cover: - image: "music/allanger-Trace.png" - caption: "Trace" - relative: false - responsiveImages: false -hideSummary: true -tags: - - music - - release - - indie - - edm - - electronic ---- - -[OPEN ON BANDCAMP](https://allanger.bandcamp.com/album/trace) -- [OPEN ON FUNKWHALE](https://funkwhale.badhouseplants.net/library/albums/17/) - ---- -{{< rawhtml >}} -{{< /rawhtml >}} - -*If you want to download lossless audio for free [follow this link](https://s3.badhouseplants.net/allanger-music/allanger%20-%20Trace.zip)* diff --git a/src/content/music/allanger/allanger-wasted-time.md b/src/content/music/allanger/allanger-wasted-time.md deleted file mode 100644 index a15306c..0000000 --- a/src/content/music/allanger/allanger-wasted-time.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: "allanger - Wasted Time" -date: 2021-09-23T00:00:00+02:00 -draft: false -ShowToc: false -cover: - image: "music/allanger-Waster_Time.png" - caption: "Wasted Time" - relative: false - responsiveImages: false -hideSummary: true -tags: - - music - - release - - indie - - punk ---- - -[OPEN ON BANDCAMP](https://allanger.bandcamp.com/album/wasted-time) -- [OPEN ON FUNKWHALE](https://funkwhale.badhouseplants.net/library/albums/19/) - ---- -{{< rawhtml >}} - -{{< /rawhtml >}} - -*If you want to download lossless audio for free [follow this link](https://s3.badhouseplants.net/allanger-music/allanger%20-%20Wasted%20Time.zip)* diff --git a/src/content/page/about/index.md b/src/content/page/about/index.md deleted file mode 100644 index 77de357..0000000 --- a/src/content/page/about/index.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: About -description: What is Bad Houseplants? -date: '2019-02-28' -aliases: - - about-us - - about-hugo - - contact -license: CC BY-NC-ND -lastmod: '2020-10-09' -menu: - main: - weight: -90 - params: - icon: user ---- - -Hello there, - -I'm **allanger** and I'm a DevOps engineer. What does it mean? I prefer calling myself a modern system administrator. Here I will post about DevOps/Kubernetes/CI-CD/etc topics. - -> This page is not ready yet, I will update it one day diff --git a/src/content/page/archives/index.md b/src/content/page/archives/index.md deleted file mode 100644 index 2862deb..0000000 --- a/src/content/page/archives/index.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: "Archives" -date: 2019-05-28 -layout: "archives" -slug: "archives" -menu: - main: - weight: -70 - params: - icon: archives ---- diff --git a/src/content/page/links/drone.png b/src/content/page/links/drone.png deleted file mode 100644 index ab43a7c..0000000 Binary files a/src/content/page/links/drone.png and /dev/null differ diff --git a/src/content/page/links/gitea.png b/src/content/page/links/gitea.png deleted file mode 100644 index bff7279..0000000 Binary files a/src/content/page/links/gitea.png and /dev/null differ diff --git a/src/content/page/links/index.md b/src/content/page/links/index.md deleted file mode 100644 index 15d7a47..0000000 --- a/src/content/page/links/index.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: Links -readingTime: false -links: - - title: Source Code - description: A souce code of this blog - website: https://git.badhouseplants.net/badhouseplants/badhouseplants-net - image: gitea.png - - title: Drone-CI - description: A project for building this blog in Drone-CI - website: https://drone.badhouseplants.net/badhouseplants/badhouseplants-net - image: drone.png -menu: - main: - weight: -50 - params: - icon: link - -comments: false ---- diff --git a/src/content/page/links/ts-logo-128.jpg b/src/content/page/links/ts-logo-128.jpg deleted file mode 100644 index 85e3323..0000000 Binary files a/src/content/page/links/ts-logo-128.jpg and /dev/null differ diff --git a/src/content/page/search/index.md b/src/content/page/search/index.md deleted file mode 100644 index b2a5943..0000000 --- a/src/content/page/search/index.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Search" -slug: "search" -layout: "search" -outputs: - - html - - json -menu: - main: - weight: -60 - params: - icon: search ---- \ No newline at end of file diff --git a/src/content/post/allanger/argocd-dynamic-environment-per-branch-part-1.md b/src/content/post/allanger/argocd-dynamic-environment-per-branch-part-1.md deleted file mode 100644 index 93040ea..0000000 --- a/src/content/post/allanger/argocd-dynamic-environment-per-branch-part-1.md +++ /dev/null @@ -1,514 +0,0 @@ -+++ -title = "Dynamic Environment Per Branch with ArgoCD" -date = 2023-02-25T14:00:00+01:00 -image = "/posts/argocd-dynamic-environment-per-branch-part-1/cover.png" -draft = false -categories = [ - "Kubernetes", - "CI-CD" -] -+++ - -[Do you remember?]({{< ref "dont-use-argocd-for-infrastructure" >}}) -> And using `helmfile`, I will install `ArgoCD` to my clusters, of course, because it's an awesome tool, without any doubts. But don't manage your infrastructure with it, because it's a part of your infrastructure, and it's a service that you provide to other teams. And I'll talk about in one of the next posts. - -Yes, I have written 4 posts where I was almost absolutely negative about `ArgoCD`. But I was talking about infrastructure then. I've got some ideas about how to describe it in a better way, but I think I will write another post about it. - -Here, I want to talk about dynamic *(preview)* environments, and I'm going to describe how to create them using my blog as an example. My blog is a pretty easy application. From `Kubernetes` perspective, it's just a container with some static content. And here, you already can notice that static is an opposite of dynamic, so it's the first problem that I'll have to tackle. Turning static content into dynamic. So my blog consists of `markdown` files that are used by `hugo` for a web page generation. - ->Initially I was using `hugo` server to serve the static, but it needs way more resources than `nginx`, so I've decided in favour of `nginx`. - -I think that I'll write 2 of 3 posts about it, because it's too much to cover in only one. So here, I'd share how I was preparing my blog to be ready for dynamic environments. - -So this is how my workflow looked like before I decided to use dynamic environments. -- I'm editing `hugo` content while using `hugo server` locally -- Pushing changes to a `non-main` branch -- When everything is ready, I'm uploading pictures to the `minio` storage -- And merging a non-main branch to the main -- Drone-CI is downloading images from `minio` and builds a docker image with the `latest` tag - - First step is to generate a static content by `hugo` - - Second step is to put that static content in `nginx` container -- Drone-CI is pushing a new image to my registry -- `Keel` spots that images was updated and pulls it. -- Pod with a static is being recreated, and I have my blog with a new content - -What I don't like about it? I can't test something unless it's in `production`. And when I stated to work on adding comments (that is still WIP) I've understood that I'd like to have a real environment where I can test everything before firing the main pipeline. Even though having a static development environment would be fine for me, because I'm the only one who do the development here, I don't like the concept of static envs, and I want to be able to work on different posts in the same time. Also, adding a new static environment for development purposes it kind of the same amount of work as implementing a solution for deploying them dynamically. - -Before I can start deploying them, I have to prepare the application for that. At the first glance changes looks like that: - -1. Container must not contain any static content -2. I can't use only latest tags anymore -3. Helm chart has a lot of stuff that's hard-coded -4. CI pipelines must be adjusted -5. Deployment process should be rethought - -### Static Container -Static content doesn't play well with dynamic environments. I'd even say, doesn't play at all. So at least I must stop defining hostname for my blog on the build stage. One container should be able to run anywhere with the same result. So I've decided that instead of putting the generated static content in the container with `nginx` on the build stage, I need to ship a container with source code to `Kubernetes`, generate static there and put it to a container with `nginx`. So before my deployment looked like that: - -```YAML -spec: - containers: - - image: git.badhouseplants.net/allanger/badhouseplants-net:latest - imagePullPolicy: Always - name: badhouseplants-net -``` - -And it was enough. Now it looks like that: -```YAML -containers: - - image: nginx:latest - imagePullPolicy: Always - name: nginx - ports: - - containerPort: 80 - name: http - protocol: TCP - resources: {} - volumeMounts: - - mountPath: /var/www - name: public-content - readOnly: true - - mountPath: /etc/nginx/conf.d - name: nginx-config - readOnly: true - initContainers: - - args: - - --baseURL - - https://dynamic-charts-dev.badhouseplants.net/ - image: git.badhouseplants.net/allanger/badhouseplants-net:d727a51c0443eb4194bdaebf8ab0e94c0f228b06 - imagePullPolicy: Always - name: badhouseplants-net - resources: {} - terminationMessagePath: /dev/termination-log - terminationMessagePolicy: File - volumeMounts: - - mountPath: /src/static - name: s3-data - readOnly: true - - mountPath: /src/public - name: public-content - restartPolicy: Always - - emptyDir: - sizeLimit: 1Gi - name: public-content - - configMap: - defaultMode: 420 - name: nginx-config - name: nginx-config -``` - -So in the `init` container I'm generating a static content (`--baseUrL` flag is templated with `Helm`). Putting the result to the directory that is mounted as en `emptyDir` volume. And then later I'm mounting this folder to a container with `nginx`. Now I can use my docker image wherever I'd like with the same result It doesn't depend on the hostname that was fixed during the build. - -### No more `latest` -Since I want to have my envs updated on each commit, I can't push only `latest` anymore. So I've decided to use `commit sha` as tags for my images. But it means that I'll have a lot of them now and having `300Mb` of images and other media is becoming very painful. That means that I need to stop putting images directly to container during the build. So instead of using `rclone` to get data from `minio` in a `drone` pipeline, I'm adding another `init` container to my deployment. -```YAML - initContainers: - - args: - - -c - - rclone copy -P badhouseplants-public:/badhouseplants-static /static - command: - - sh - env: - - name: RCLONE_CONFIG - value: /tmp/rclone.conf - image: rclone/rclone:latest - imagePullPolicy: Always - name: rclone - resources: {} - terminationMessagePath: /dev/termination-log - terminationMessagePolicy: File - volumeMounts: - - mountPath: /tmp - name: rclone-config - readOnly: true - - mountPath: /static - name: s3-data - volumes: - - name: rclone-config - secret: - defaultMode: 420 - secretName: rclone-config - - emptyDir: - sizeLimit: 1Gi - name: s3-data -``` - -And also, I'm mounting the `s3-data` volume to the `hugo` container, so it can generate my blog with all images. - -### Helm chart should be more flexible - -I had to find all the values, that should be different between different environments. And turned out, it's not a lot. -1. `Istio` `VirtualServices` hostnames (Or Ingress hostname, if you don't use `Istio`) -2. Image tag for the container with the source code -3. And a hostname that should be passed to `hugo` as a base URL -4. Preview environments should display pages that are still `drafts` - -So all of that I've put to `values.yaml` -```YAML -istio: - hosts: - - badhouseplants.net - hugo: - image: - tag: $COMMIT_SHA - baseURL: https://badhouseplants.net/ - buildDrafts: false -``` - -### CI pipelines -Now I need to push a new image on each commit instead of pushing only once the code made it to the main branch, But I also don't want to have something that doesn't work completely in my registry, because I'm self-hosting and ergo I care about storage. So before building and pushing an image, I need to test it, - -```YAML -# --------------------------------------------------------------- -# -- My Dockerfile is very small and easy, so it's not a problem -# -- to duplicate its logic in a job. But I think that -# -- a better way to implement this, would be to build an image -# -- with Dockerfile, run it, and push, if everything is fine -# --------------------------------------------------------------- -- name: Test a build - image: klakegg/hugo - commands: - - hugo - -- name: Build and push the docker image - image: plugins/docker - settings: - registry: git.badhouseplants.net - username: allanger - password: - from_secret: GITEA_TOKEN - repo: git.badhouseplants.net/allanger/badhouseplants-net - tags: ${DRONE_COMMIT_SHA} -``` - -Now if my code is not really broken, I'll have an image for each commit. And when I merge my branch to `main` I can use a tag from the latest preview build on for the production instance. So I'm almost sure that what I've tested before is what a visitor will see. - -> But with this kind of setup I've reached docker pull limit pretty fast, so I've decided that I need to have a builder image in my registry too. Of course, it must be an automated action, but right off the bat, I've just pushed the `hugo` image to my registry with the `latest` tag and created an issue to fix it later - -```BASH -docker pull klakegg/hugo -docker tag klakegg/hugo git.badhouseplants.net/badhouseplants/hugo-builder -docker push -``` - -And update my Dockerfile to look like this: -```DOCKERFILE -FROM git.badhouseplants.net/badhouseplants/hugo-builder -WORKDIR /src -COPY . /src -ENTRYPOINT ["hugo"] -``` - -### How to deploy - -Previously I was using the same helmfile that I use for everything else in my k8s cluster. It was fine for static envs, but when I need to deploy them dynamically, it's not an option anymore. And here `ArgoCD` enters the room. I'm creating an `ApplicationSet` that looks like that: -```YAML -apiVersion: argoproj.io/v1alpha1 -kind: ApplicationSet -metadata: - name: badhouseplants-net - namespace: argo-system -spec: - generators: - - list: - elements: - - name: application # just not to lose a backward compability with the prevouos setup - app: badhouseplants - branch: main - chart_version: 0.3.6 - # Image that is latest now, we'll get there later - value: | - hugo: - image: - tag: latest - # And this is an example of environemnt that I want to be created. - - name: dynamic-charts - app: badhouseplants - branch: dynamic-charts - chart_version: 0.3.6 - value: | - istio: - hosts: - - dynamic-charts-dev.badhouseplants.net - hugo: - image: - tag: 5d742a71731320883db698432303c92aee4d68a1 - baseURL: https://dynamic-charts-dev.badhouseplants.net/ - buildDrafts: true - template: - metadata: - name: "{{ app }}-{{ name }}" - namespace: argo-system - spec: - project: "default" - source: - helm: - valueFiles: - - values.yaml - values: "{{ value }}" - repoURL: https://git.badhouseplants.net/api/packages/allanger/helm - targetRevision: "{{ chart_version }}" - chart: badhouseplants-net - destination: - server: "https://kubernetes.default.svc" - namespace: "{{ app }}-{{ name }}" - syncPolicy: - syncOptions: - - CreateNamespace=true - -``` - -But storing I don't like an idea of storing something like that in the repository. So in the git I'm putting something like that. -```YAML -apiVersion: argoproj.io/v1alpha1 -kind: ApplicationSet -metadata: - name: badhouseplants-net - namespace: argo-system -spec: - generators: - - list: - elements: - - name: application - app: badhouseplants - branch: main - chart_version: 0.3.6 - value: | - hugo: - image: - tag: $ARGO_IMAGE_TAG -... -``` - -Since I'm not using latest anymore, I need to add use a new tag every time a new image is pushed. But let's test with the preview env first: -```YAML -# ./kube/template.yaml -... -- name: $ARGO_APP_BRANCH - app: badhouseplants - branch: $ARGO_APP_BRANCH - chart_version: $ARGO_APP_CHART_VERSION - value: | - istio: - hosts: - - $ARGO_APP_HOSTNAME - hugo: - image: - tag: $ARGO_APP_IMAGE_TAG - baseURL: https://$ARGO_APP_HOSTNAME/ - buildDrafts: true -... -``` - -And the logic that I would like to have in my setup would be -- In the git repo there is only application set with the main instance only (production) -- After a new image is pushed to registry, I'm getting this application set as `yaml` and appending new generator to it. -- Applying a new `ApplicationSet` and syncing application using the `argo` CLI tool - -First, let's set environment variables: -``` -- $ARGO_APP_BRANCH = $DRONE_BRANCH | I don't want to use it directly, in case if I want to stop using Drone -- $ARGO_APP_CHART_VERSION should be taken from the `./chart/Chart.yaml` file. `cat chart/Chart.yaml | yq '.version'` -- $ARGO_APP_HOSTNAME, I want it to look like that: "$DRONE_BRANCH-dev.badhouseplants.net" -- $ARGO_APP_IMAGE_TAG = $DRONE_COMMIT_SHA -``` - -So after setting all these variables, I can use `envsubst < ./kube/template.yaml` to create a correct generator. After that I only need to append it to one that is already in k8s. *And not to append if it's already there*. - -So my pipeline for a non-main branch looks like that: -```YAML -- name: Deploy a preview ApplicationSet - image: alpine/k8s:1.24.10 - when: - branch: - exclude: - - main - environment: - KUBECONFIG_CONTENT: - from_secret: KUBECONFIG_CONTENT - commands: - - mkdir $HOME/.kube - - echo $KUBECONFIG_CONTENT | base64 -d > $HOME/.kube/config - - apk update --no-cache && apk add yq gettext - - export ARGO_APP_CHART_VERSION=`cat chart/Chart.yaml | yq '.version'` - - export ARGO_APP_BRANCH=$DRONE_BRANCH - - export ARGO_APP_HOSTNAME="${DRONE_BRANCH}-dev.badhouseplants.net" - - export ARGO_APP_IMAGE_TAG=$DRONE_COMMIT_SHA - - kubectl get -f ./kube/applicationset.yaml -o yaml > /tmp/old_appset.yaml - - yq "del(.spec.generators[].list.elements[] | select(.name == \"$ARGO_APP_BRANCH\"))" /tmp/old_appset.yaml > /tmp/clean_appset.yaml - - envsubst < ./kube/template.yaml > /tmp/elements.yaml - - yq '.spec.generators[].list.elements += load("/tmp/elements.yaml")' /tmp/clean_appset.yaml > /tmp/new_appset.yaml - - kubectl apply -f /tmp/new_appset.yaml -``` - -And even though it's very ugly, I already like it. Because it works. - -![Drone pipeline result](/posts/argocd-dynamic-environment-per-branch-part-1/drone-pipeline.png) - -I would like to move the whole pipeline logic out of the `.drone.yml` file. But I will do it later. - -After our application set is deployed, we need to update the application the is created by it. I would like to use the `argocd` CLI tool for that. To sync a specific app, we need to use selectors, and I'd like to go with labels. So let's first add labels to our `ApplicationSet` - -```YAML -... - template: - metadata: - name: "{{ app }}-{{ name }}" - namespace: argo-system - labels: - branch: "{{ name }}" - application: "{{ app }}" -... -``` - -And now let's create a job like that: -```YAML -- name: Sync application - image: argoproj/argocd - environment: - ARGOCD_SERVER: - from_secret: ARGOCD_SERVER - ARGOCD_AUTH_TOKEN: - from_secret: ARGOCD_AUTH_TOKEN - commands: - - argocd app sync -l app=badhouseplants -l branch=$DRONE_BRANCH - - argocd app wait -l app=badhouseplants -l branch=$DRONE_BRANCH -``` - -And the last step would be to remove an application when branch is merged. It could be easy with `Gitlab` because there you can use `environments` and `triggers` for removing branch *(as I remember)* But with `drone` it seems to be harder. Because `drone` won't be triggered by a removed branch. -Maybe a pull request trigger could be used for that, but I've found another way, which may not be the best, obviously. - -I've enabled only `fast-forward` merge to the `main` that that means that after merging a Pull Request the commit will have the same `SHA`. So when merging to the main branch, I can use the commit hash to remove a generator. It also means that if I have one commit deployed to several environments, I will remove more that I want. But I don't think that it will be a problem in my case. If you're not a lonely developer, but a team, you may need to choose something else. - -So I've added a new element to `preview` generator: `commit_sha: $ARGO_APP_IMAGE_TAG`, and then this command will do the trick: `yq -i "del(.spec.generators[].list.elements[] | select(.name == \"$ARGO_APP_BRANCH\"))" /tmp/appset.yaml` - -I've created a file `./kube/main-template.yaml`, that looks like that: -```YAML -- name: application - app: badhouseplants - branch: main - chart_version: $ARGO_APP_CHART_VERSION - value: | - hugo: - image: - tag: $ARGO_APP_IMAGE_TAG -``` - -And a job: -```YAML -- name: Deploy a main ApplicationSet - image: alpine/k8s:1.24.10 - when: - branch: - - main - environment: - KUBECONFIG_CONTENT: - from_secret: KUBECONFIG_CONTENT - commands: - - mkdir $HOME/.kube - - echo $KUBECONFIG_CONTENT | base64 -d > $HOME/.kube/config - - apk update --no-cache && apk add yq gettext - - export ARGO_APP_CHART_VERSION=`cat chart/Chart.yaml | yq '.version'` - - export ARGO_APP_BRANCH=$DRONE_BRANCH - - export ARGO_APP_IMAGE_TAG=$DRONE_COMMIT_SHA - - kubectl get -f ./kube/applicationset.yaml -o yaml > /tmp/old_appset.yaml - - yq "del(.spec.generators[].list.elements[] | select(.name == \"$ARGO_APP_BRANCH\"))" /tmp/old_appset.yaml > /tmp/clean_appset1.yaml - - yq "del(.spec.generators[].list.elements[] | select(.commit_sha == \"$ARGO_APP_IMAGE_TAG\"))" /tmp/clean_appset1.yaml > /tmp/clean_appset.yaml - - envsubst < ./kube/main.yaml > /tmp/elements.yaml - - yq '.spec.generators[].list.elements += load("/tmp/elements.yaml")' /tmp/clean_appset.yaml > /tmp/new_appset.yaml - - kubectl apply -f /tmp/new_appset.yaml - -``` - -> Also, I've found out that `ArgoCD` won't remove a namespace if it was created by a `SyncPolicy`, so I've added it to the helm chart, and add a new `value` to provide a name. - -### And a little bit more - -1. Since my storage capacity is a bit limited, I need to care about it. Hence, I can't store all the images there. And I had to come up with a cleaning up solution. Removing images that are older than `X` days, didn't seem to be an option, because in case I'm not pushing to the registry for quite a time, my production image will be gone, and I won't be able to run the blog fast. So I've decided that I only need to store images with tags that still exists in repo as a `commit sha`. If I have a feature branch with 100 commits, I'll have 100 images, but when I squash it before merging, I will be left with only one. So when it's merged to the `main`, I won't have to store 100 images forever. And I've decided to write a script for that. -A `Perl` script. Why Perl? Because I like it and I wanted not to forget it completely. Also, `bash` seems a little bit too primitive for that, compilable languages (`go`, `rust`) seem to be an overkill, `python` I hate. So why not `Perl`? -The initial plan to create a scheduled job that is getting all commit hashes from git, comparing them to docker tags, and if tag with a non-existent commit is found, it's getting removed. But t problem is that `Gitea` *(At the time of writing, I am using `Gitea` 1.18.3)* package registry doesn't have an API to list all tags for an image (or I'm too dummy to find it). So I've decided to use `Drone API`. Getting all commits and all drone builds, comparing builds to commits and for non-existent `SHAs` remove images from the registry. But the problem is that drone doesn't return all the builds, only recent (and again, maybe I couldn't find how to do it). So the scheduled job may not work, if I'm being very productive. So I've added a new step to the job. After syncing an `Argo Application` I'm running [this script](https://git.badhouseplants.net/badhouseplants/badhouseplants-net/src/branch/main/scripts/cleanup.pl): - -{{< details "In case you want to read it here:" >}} -```Perl -#!/usr/bin/perl - -use strict; -use warnings; -# -------------------------------------- -# -- Drone variables -# -------------------------------------- -my $drone_url="$ENV{'DRONE_SYSTEM_PROTO'}://$ENV{'DRONE_SYSTEM_HOST'}"; -my $drone_project=$ENV{'DRONE_REPO'}; -my $drone_api="$drone_url/api/repos/$drone_project/builds"; -# -------------------------------------- -# -- Gitea variables -# -------------------------------------- -my $gitea_url=$ENV{'GITEA_URL'} || 'https://git.badhouseplants.net/api/v1'; -my $gitea_org=$ENV{'GITEA_ORG'} || 'badhouseplants'; -my $gitea_package=$ENV{'GITEA_PACKAGE'} || 'badhouseplants-net'; -my $gitea_api="$gitea_url/packages/$gitea_org/container/$gitea_package"; -my $gitea_token=$ENV{'GITEA_TOKEN'}; -my $gitea_user=$ENV{'GITEA_USER'} || $ENV{'DRONE_COMMIT_AUTHOR'}; -# --------------------------------------- -# -- Get recent builds from drone-ci -# --------------------------------------- -my $builds = "curl -X 'GET' $drone_api -H 'accept: application/json' | jq -r '.[].after'"; -my @builds_out = `$builds`; -chomp @builds_out; -# --------------------------------------- -# -- Get a list of all commits + 'latest' -# --------------------------------------- -my $commits = "git log --format=format:%H --all"; -my @commits_out = `$commits`; -chomp @commits_out; -push @commits_out, 'latest'; - -# --------------------------------------- -# -- Compare builds to commits -# -- And remove obsolete imgages from -# -- registry -# --------------------------------------- -foreach my $line (@builds_out) -{ - if ( ! grep( /^$line$/, @commits_out ) ) { - my $cmd = "curl -X 'DELETE' -s \"$gitea_api/$line\" -H 'accept: application/json' -u $gitea_user:$gitea_token || true"; - print "Removing ${line}\n\n"; - my $output = `$cmd`; - print "$output \n"; - } -} -``` -{{< /details >}} - -It's far from being perfect, but it works, and I like that I was able to finally use `Perl` somewhere - -2. I want to have a manifest that I can apply in case of kind of *disaster recovery*. And it means that `ApplicationSet` should contain enough information to deploy a production instance of my blog right off the bat. But I don't want to keep it up-to-date with every new commit hash. So I've decided to keep pushing `latest` to registry but only on `main` builds. So I can use the latest tag in application set, but in the application life-time I'll keep using `SHA` as tags. The only static hard-coded value in the `ApplicationSet` is a version of the `Helm chart`. And I don't know how to automate it yet. But I'm sure that I will do it somehow. -I know that it's a very common practice to store all `Argo` resource in `git`. But I don't see any sense in storing manifests for temporary environments that can be recreated by clicking a button in `Drone` or by pushing a new commit. - -3. Some more static data that I've found later. I've understood that I'm using a badge on the [About page]({{< ref "about" >}}). And it's statically points only to the main branch, that doesn't make a lot of sense on envs built from other branches. But fortunately, *bit ups to devs*, `hugo` can use environment variables for setting up parameters of a site. I've updated the badge, so it looks like that: -``` -[![Build Status](https://drone.badhouseplants.net/api/badges/badhouseplants/badhouseplants-net/status.svg?ref=refs/heads/{{< param GitBranch >}})](https://drone.badhouseplants.net/badhouseplants/badhouseplants-net) -``` -[![Build Status](https://drone.badhouseplants.net/api/badges/badhouseplants/badhouseplants-net/status.svg?ref=refs/heads/{{< param GitBranch >}})](https://drone.badhouseplants.net/badhouseplants/badhouseplants-net) - -And then I'm setting an env var `HUGO_PARAMS_GITBRANCH`. And now badge is looking for its branch. - -### What's not done yet - -1. I'm using `Minio` as a storage for pictures, and currently all pictures (and other files) are stored in one folder regardless of the environment. I would to have something like that. -- On the first commit to a branch, sync pictures from the main dir to a new one. -- On next commits, if pictures are added, copy them to a new dir only -- When branch is merged, pictures from the branch should be synced to the main dir. - -2. Since I don't really have a static content, I can't be 100% sure that content that is generated during the run-time is what I expect to have. So I'd like to add a UI test that is executed after pod with `nginx` is started and is being used as a `startupProbe`. If test is not satisfied by a content, pod is never getting `ready` and traffic will keep going to the older version. - -3. A lot of logic that is put to `.drone.yaml` file should be moved out of it. Maybe to scripts, or to `Makefile`. But I don't think it's an important thing for this post, so I've decided not to care about it now. - -## Some kind of conclusion - -Even though my application is just a simple blog, I still believe that creating dynamic environments is a great idea that should totally replace static dev'n'stages. And it's not only my blog, I've created dynamic envs for. Two biggest pains *as I think* are `Static content` and `Persistent data` (I think, there are more, but these two are most obvious). I've already shown an example how you can handle the first one, and the second is also a big pain in the ass. In my case this data is the one coming from the `Minio` and I'm not doing anything about it, *but I'll write one more post, when it's solved*, other, in my opinion, more obvious example, are databases. You need it to contain all the data that's required for testing, but you also may want it not to be huge, and it most probably should not contain any sensible personal data. So maybe you could stream a database from the production through some kind of anonymiser, clean it up, so it's not too big. And it doesn't sound easy already. But if I'll have to add something like that to my blog once, I'll try to describe it. - -Thanks, - -Oi! - diff --git a/src/content/post/allanger/do-we-need-continuous-reconciliation.md b/src/content/post/allanger/do-we-need-continuous-reconciliation.md deleted file mode 100644 index ffdf03f..0000000 --- a/src/content/post/allanger/do-we-need-continuous-reconciliation.md +++ /dev/null @@ -1,56 +0,0 @@ -+++ -title = 'Do we really need Continuous Reconciliation after all?' -date = 2024-02-13T15:04:44+01:00 -draft = true -categories = [ - "Kubernetes", - "CI-CD" -] -+++ - -> Well, alright, I guess it depends - -## Intro - -First, let's figure out what **continuous reconciliation** stands for. Considering this post's categories, I guess we're talking **Kubernetes** here. And **continuous reconciliation** means that resources deployed to kubernetes are not only synced once, when you run `kubectl apply`, but all the time. Basically, every 30s (or whatever reconciliation period you got) something is running `kubectl apply`. - -The idea behind that (as I see) is that you're always aware of what's deployed to you cluster, by looking at the code. Let's say, there is a git repo `k8s-deployments`, and it has all the resources that you want to have running in your cluster. - -> It made a lot of sense to when I heard for the first time, not I'm rather sceptical about it. - -As far as I understand, having all you resource described in a git repository and continuously reconciled is **GitOps**, not only that of course, it's just a part of it. At least that's what I've been told by some engineers. - -## GitOps - -I don't think that I'm the one to be talking about **GitOps** because everytime I was trying to bring my point on that, I've been told that I don't know what **GitOps** is. - -> To be honest, after many conversations with different people, I think that GitOps is just a buzzword for selling technologies and services, correct me if I wrong. - -I can't talk about others opinion, so I'll jsut try to express mine. I think that **GitOps** is when you have a desired state of your infrastucture written in code, and a mechanism to make your real infrastucture state correspond the desired one. - -Let's not lean towards Kubernetes itself, and let's imaging that you, as a SRE team, have to manage Kubernetes clusters. In your cluster you'll have to run an application that is being developed by the company you're working for, and some dependencies, that this application needs in order to run. - -> Also, I guess it is an opinion that many of SREs won't share. I guess that the SRE team shouldn't be integrated to development teams. In my opinion, SRE teams should provide ingfa-as-a-service to developes and help them use it. - -So, after all, you cluster will contain approximately this: -- Very base layer - - CNI plugin (E.G. Cilium) - - CoreDNS -- System layer - - Cert Manager - - Traefik -- Monitoring layer - - Kube Prometheus Stack - - Loki - - Promtail -- Application specific dependencies - - Zalando Postgres Operator - - Redis Operator -- Application layer - - Your application - -And as an addition, you might have a GitOps tool, currently, the most popular ones are **Flux** and **ArgoCD**, I guess I will compare them later, in this article let's just use **Flux**. - -First question that comes to my mind is, onto which layer one should put Flux? Flux depends on `CNI` and `CoreDNS`, so it should be deployed after them. So should it be the System layer? It sounds good, I guess, but do we want Flux to manage **Cert manager** and **Traefik**. Me - not, but the answer that I get the most is yes. So let's assume, we've decided to manage them with Flux. It means that we should add another layer between "Very base" and "System" ones, a **GitOps layer**. To us it means that after we get a bare new empty cluster, we need to install CNI, CoreDNS, and Flux, and only then we should deploy anything else with the Flux help. - -What does it mean for us, we need to diff --git a/src/hugo.yaml b/src/hugo.yaml deleted file mode 100644 index 1c17075..0000000 --- a/src/hugo.yaml +++ /dev/null @@ -1,45 +0,0 @@ -languageCode: en-us -title: Bad Houseplants -theme: stack -favicon: /favicon.ico -Params: - GitBranch: main - GitCommit: unknown - mainSections: - - post - sidebar: - avatar: - enable: true - local: false - src: /avatar.png - subtitle: PunkOps by allanger - comments: - enabled: true - provider: remark42 - remark42: - host: https://remark42.badhouseplants.net - site: remark - locale: en - widgets: - homepage: - - type: search - - type: archives - params: - limit: 5 - - type: categories - params: - limit: 10 - #- type: tag-cloud - # params: - # limit: 10 - page: - - type: toc -related: - includeNewer: true - threshold: 60 - toLower: false - indices: - - name: tags - weight: 100 - - name: categories - weight: 200 diff --git a/src/layouts/partials/comments.html b/src/layouts/partials/comments.html deleted file mode 100644 index a43970b..0000000 --- a/src/layouts/partials/comments.html +++ /dev/null @@ -1,13 +0,0 @@ -
-
- - - diff --git a/src/layouts/partials/remark42.html b/src/layouts/partials/remark42.html deleted file mode 100644 index 3404e56..0000000 --- a/src/layouts/partials/remark42.html +++ /dev/null @@ -1,16 +0,0 @@ -
-
-

Comments are in the beta testing stage.

-
-
- - - diff --git a/src/layouts/shortcodes/audio.html b/src/layouts/shortcodes/audio.html deleted file mode 100644 index ccaf315..0000000 --- a/src/layouts/shortcodes/audio.html +++ /dev/null @@ -1,6 +0,0 @@ -
- -
\ No newline at end of file diff --git a/src/layouts/shortcodes/comments.html b/src/layouts/shortcodes/comments.html deleted file mode 100644 index bf60497..0000000 --- a/src/layouts/shortcodes/comments.html +++ /dev/null @@ -1 +0,0 @@ -{{ partial "remark42.html" . }} diff --git a/src/static/avatar.png b/src/static/avatar.png deleted file mode 100644 index 54ec2f3..0000000 --- a/src/static/avatar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:475223457ecd56a9b4450e39a1273727f98c4b0c78c6427992f4f77f6b90b957 -size 686006 diff --git a/src/static/favicon.ico b/src/static/favicon.ico deleted file mode 100644 index c5d3be1..0000000 --- a/src/static/favicon.ico +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d872fe94954e47d14563d77ddba54f15aa62f5df0a76f3ead45764847e554154 -size 15406 diff --git a/src/static/icons/beats.svg b/src/static/icons/beats.svg deleted file mode 100644 index d725db2..0000000 --- a/src/static/icons/beats.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11f41a9605317d89fb8ffc5f6e29a1b7db29e954a9d12ce98280c6d561548a75 -size 1253 diff --git a/src/static/posts/argocd-dynamic-environment-per-branch-part-1/cover.png b/src/static/posts/argocd-dynamic-environment-per-branch-part-1/cover.png deleted file mode 100644 index ee18b08..0000000 --- a/src/static/posts/argocd-dynamic-environment-per-branch-part-1/cover.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6f31eeedb306a5f06d2b7961050bdfbe78d78c7dbce8bdfa2829acee03ca4d7 -size 7963916 diff --git a/src/static/posts/argocd-dynamic-environment-per-branch-part-1/drone-pipeline.png b/src/static/posts/argocd-dynamic-environment-per-branch-part-1/drone-pipeline.png deleted file mode 100644 index 5f55e28..0000000 --- a/src/static/posts/argocd-dynamic-environment-per-branch-part-1/drone-pipeline.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:94fae326897aa04583bed82f66c348891ee0c12727cea5d834ad3b48cb4ce677 -size 305166 diff --git a/src/static/posts/argocd-vs-helmfile/app-of-apps-main.png b/src/static/posts/argocd-vs-helmfile/app-of-apps-main.png deleted file mode 100644 index 9f08643..0000000 --- a/src/static/posts/argocd-vs-helmfile/app-of-apps-main.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c329e920e735fdc52b3bee4cd60b3b8261d304a47197f44a1aaff56213b311c -size 247447 diff --git a/src/static/posts/argocd-vs-helmfile/applicationset-test.png b/src/static/posts/argocd-vs-helmfile/applicationset-test.png deleted file mode 100644 index e4b4ef4..0000000 --- a/src/static/posts/argocd-vs-helmfile/applicationset-test.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1452560f3d6d04483eeca09d100370cc5fa7120294edc9c089c758a8f4b7253f -size 332000 diff --git a/src/static/posts/argocd-vs-helmfile/cover-applications.png b/src/static/posts/argocd-vs-helmfile/cover-applications.png deleted file mode 100644 index 0e27218..0000000 --- a/src/static/posts/argocd-vs-helmfile/cover-applications.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:797fe98bbf2dc7dfae0a2876f22cca0b185afab3d928effc42bfee50fe6fb130 -size 299165 diff --git a/src/static/posts/argocd-vs-helmfile/cover-applicationset.png b/src/static/posts/argocd-vs-helmfile/cover-applicationset.png deleted file mode 100644 index e4b4ef4..0000000 --- a/src/static/posts/argocd-vs-helmfile/cover-applicationset.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1452560f3d6d04483eeca09d100370cc5fa7120294edc9c089c758a8f4b7253f -size 332000 diff --git a/src/static/posts/argocd-vs-helmfile/diff-in-ui.png b/src/static/posts/argocd-vs-helmfile/diff-in-ui.png deleted file mode 100644 index e5fbd15..0000000 --- a/src/static/posts/argocd-vs-helmfile/diff-in-ui.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60603706ad018d3c73ed54eb475058424043ce9cf87de76f236fb9be6124d048 -size 465450 diff --git a/src/static/posts/argocd-vs-helmfile/goldilocks-ui.png b/src/static/posts/argocd-vs-helmfile/goldilocks-ui.png deleted file mode 100644 index e60d54b..0000000 --- a/src/static/posts/argocd-vs-helmfile/goldilocks-ui.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e42129f54056e12affbbb81ac2597c4f07fe08c3acc9c5879c0e1b40e8b879c8 -size 385843 diff --git a/src/static/posts/argocd-vs-helmfile/update-in-ui.png b/src/static/posts/argocd-vs-helmfile/update-in-ui.png deleted file mode 100644 index 0e27218..0000000 --- a/src/static/posts/argocd-vs-helmfile/update-in-ui.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:797fe98bbf2dc7dfae0a2876f22cca0b185afab3d928effc42bfee50fe6fb130 -size 299165 diff --git a/src/static/posts/creating-a-sample-pack-kick/Kick_final_result.mp3 b/src/static/posts/creating-a-sample-pack-kick/Kick_final_result.mp3 deleted file mode 100644 index 76b061d..0000000 --- a/src/static/posts/creating-a-sample-pack-kick/Kick_final_result.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e0e778f9654025adba40dffc4cf78393b688ee865e61526b9ad8d6cc5191bb0 -size 805533 diff --git a/src/static/posts/creating-a-sample-pack-kick/Kick_v1.mp3 b/src/static/posts/creating-a-sample-pack-kick/Kick_v1.mp3 deleted file mode 100644 index d476df9..0000000 --- a/src/static/posts/creating-a-sample-pack-kick/Kick_v1.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:633d66327aa655eb6c586ee83d71feae841344534029321498cefa16aef5fd84 -size 165533 diff --git a/src/static/posts/creating-a-sample-pack-kick/Kick_v2.mkv b/src/static/posts/creating-a-sample-pack-kick/Kick_v2.mkv deleted file mode 100644 index 2c84b69..0000000 --- a/src/static/posts/creating-a-sample-pack-kick/Kick_v2.mkv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74fd914e1b849336aca27c466843cf7e9a163fe8925a8167965e6fcba3f8e14a -size 604978 diff --git a/src/static/posts/creating-a-sample-pack-kick/Kick_v2.mp4 b/src/static/posts/creating-a-sample-pack-kick/Kick_v2.mp4 deleted file mode 100644 index 7bd8601..0000000 --- a/src/static/posts/creating-a-sample-pack-kick/Kick_v2.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee2e5c700e18277b70253df905fbaabf07bfa656d79f342bc3d0340f45d7b219 -size 311020 diff --git a/src/static/posts/creating-a-sample-pack-kick/Kick_v3.mkv b/src/static/posts/creating-a-sample-pack-kick/Kick_v3.mkv deleted file mode 100644 index 283c4fa..0000000 --- a/src/static/posts/creating-a-sample-pack-kick/Kick_v3.mkv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:13d153f7d249431b295112bd93f21b2e52035e5c349a60ffb3852bc0ea200ce1 -size 528621 diff --git a/src/static/posts/creating-a-sample-pack-kick/Kick_v3.mp4 b/src/static/posts/creating-a-sample-pack-kick/Kick_v3.mp4 deleted file mode 100644 index b74a286..0000000 --- a/src/static/posts/creating-a-sample-pack-kick/Kick_v3.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:488311a0e6ea869a20cb12ef34ac9fcae983819e0e6144442f6809d30d3bcecf -size 292423 diff --git a/src/static/posts/creating-a-sample-pack-kick/Kick_v4.mkv b/src/static/posts/creating-a-sample-pack-kick/Kick_v4.mkv deleted file mode 100644 index 296ecf9..0000000 --- a/src/static/posts/creating-a-sample-pack-kick/Kick_v4.mkv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8fcf4d901648cef69b7106a8275d07de35fec4ac1cefdfe288ec67af7a4ecb5f -size 674171 diff --git a/src/static/posts/creating-a-sample-pack-kick/Kick_v4.mp4 b/src/static/posts/creating-a-sample-pack-kick/Kick_v4.mp4 deleted file mode 100644 index eb6947f..0000000 --- a/src/static/posts/creating-a-sample-pack-kick/Kick_v4.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7281dc2f93cfba5731b2bd0d38c6530ca84a33b05cf8a3ecacee583a073fb5be -size 376034 diff --git a/src/static/posts/creating-a-sample-pack-kick/cover.png b/src/static/posts/creating-a-sample-pack-kick/cover.png deleted file mode 100644 index 8fb0642..0000000 --- a/src/static/posts/creating-a-sample-pack-kick/cover.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d84081625a6b9cfb6a76948d076e02e00b626a1e288bca30d3f41879b09bf93d -size 1008850 diff --git a/src/static/posts/creating-a-sample-pack-kick/disable_note_track.png b/src/static/posts/creating-a-sample-pack-kick/disable_note_track.png deleted file mode 100644 index e12bb6b..0000000 --- a/src/static/posts/creating-a-sample-pack-kick/disable_note_track.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4d0f5650d0c4bc5d563bf340841d10c67631d5983d938a8e52847f5013ce7862 -size 974202 diff --git a/src/static/posts/creating-a-sample-pack-kick/init_vital.png b/src/static/posts/creating-a-sample-pack-kick/init_vital.png deleted file mode 100644 index dcb3ccc..0000000 --- a/src/static/posts/creating-a-sample-pack-kick/init_vital.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:34532e0757db49204f854208fd09620dded5810262bd909b29df8ec985ee9496 -size 1242149 diff --git a/src/static/posts/creating-a-sample-pack-kick/kick_basic_shape.png b/src/static/posts/creating-a-sample-pack-kick/kick_basic_shape.png deleted file mode 100644 index 9a7a21d..0000000 --- a/src/static/posts/creating-a-sample-pack-kick/kick_basic_shape.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eef68ec724e4467228eb20b04e9d62f89423925978e13ca2106d95ae86f0cb49 -size 94083 diff --git a/src/static/posts/creating-a-sample-pack-kick/kick_lfo_1.png b/src/static/posts/creating-a-sample-pack-kick/kick_lfo_1.png deleted file mode 100644 index 60a3704..0000000 --- a/src/static/posts/creating-a-sample-pack-kick/kick_lfo_1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a77078e09ad68001c5a5d05c0f41df49ab71958a8a1788cef84b3f0a1d943ca6 -size 133623 diff --git a/src/static/posts/creating-a-sample-pack-kick/kick_lfo_2.png b/src/static/posts/creating-a-sample-pack-kick/kick_lfo_2.png deleted file mode 100644 index 98bdae7..0000000 --- a/src/static/posts/creating-a-sample-pack-kick/kick_lfo_2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ab3b4fec7d092259b524e5b57e03d9ad35a01a87caccfe5d5a6b2dae3094bdd2 -size 133904 diff --git a/src/static/posts/creating-a-sample-pack-kick/unison_phase.png b/src/static/posts/creating-a-sample-pack-kick/unison_phase.png deleted file mode 100644 index b8e3fd1..0000000 --- a/src/static/posts/creating-a-sample-pack-kick/unison_phase.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:386fc8feea661abf218679d1d925994df5cbc7af2a3ee370a5c8eca206725812 -size 90664 diff --git a/src/static/posts/dont-use-argocd-for-infrastructure/3-clusters-and-gitea.png b/src/static/posts/dont-use-argocd-for-infrastructure/3-clusters-and-gitea.png deleted file mode 100644 index 825eaea..0000000 --- a/src/static/posts/dont-use-argocd-for-infrastructure/3-clusters-and-gitea.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87485f4b6c9648b35613d184e0b0df737ac779f6a005c8cd2fbab5f189a7a3ef -size 703100 diff --git a/src/static/posts/dont-use-argocd-for-infrastructure/3-clusters.png b/src/static/posts/dont-use-argocd-for-infrastructure/3-clusters.png deleted file mode 100644 index 97b2678..0000000 --- a/src/static/posts/dont-use-argocd-for-infrastructure/3-clusters.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee5b58c2aedb0dba95a8d9e26292bbe6fbd696c58d0aedcc50d8c383c004c3f8 -size 245998 diff --git a/src/static/posts/dont-use-argocd-for-infrastructure/cover.png b/src/static/posts/dont-use-argocd-for-infrastructure/cover.png deleted file mode 100644 index 7c32767..0000000 --- a/src/static/posts/dont-use-argocd-for-infrastructure/cover.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:05312a326367af2694cda92759725d74a5a3d52a67577ea784724c76ae01c1dd -size 63751 diff --git a/src/themes/stack b/src/themes/stack deleted file mode 160000 index fddab05..0000000 --- a/src/themes/stack +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fddab053628070668cd9c9eb0b96d9a6246fcc71 diff --git a/themes/papermod b/themes/papermod new file mode 160000 index 0000000..d3d90be --- /dev/null +++ b/themes/papermod @@ -0,0 +1 @@ +Subproject commit d3d90be8a4ea04433d95d02a1dc07b0014c5b8b8