<!-- Generated from the canonical HTML page. Do not edit separately. -->
# The Minimalist’s Guide to Homelab Setup | Ankra

Canonical: https://ankra.ai/blog/minimalist-guide

Deploy your favourite and essential homelab applications with Ankra in just a few clicks

[Back to Blog](https://ankra.ai/blog)

[Homelab](https://ankra.ai/blog/tag/homelab)  [Kubernetes](https://ankra.ai/blog/tag/kubernetes)  [DevOps](https://ankra.ai/blog/tag/devops)

# The Minimalist’s Guide to Homelab Setup

[Shiva Swaroop N K](https://ankra.ai/blog/author/shiva-swaroop)

August 11, 2025

4 min read

### On this page

Welcome wanderer!

If you’ve clicked on this blog, you either stumbled upon Ankra and are finding out how it can accelerate your productivity, or are just curious about building homelab in simple steps.

By the end of this guide, you will have a WordPress blog hosted on your homelab, accessible securely from anywhere via a Cloudflare tunnel.

Before we dive right into it, here are the *recommended* prerequisites to go ahead. In case you don’t meet the requirements, don’t worry, we got you covered.

1. Ankra account: head out to  [ankra.ai](https://ankra.ai/)  to create one if you already don’t have one
2. A Kubernetes Cluster: It does not have to be on a cloud provider. You can have a small single node cluster with  [kind](https://kind.sigs.k8s.io/)  or  [minikube](https://minikube.sigs.k8s.io/docs/start/?arch=%2Fmacos%2Farm64%2Fstable%2Fbinary+download) .
3. A domain of your choice: This is so that all your applications can have a subdomain of your choice. A domain on  [cloudflare](https://www.cloudflare.com/en-gb/)  or  [godaddy](http://godaddy.com/)  can help you access your homelab applications from anywhere in the world. If not, you can have a domain locally in your home network.

## Setting up your cluster

Now that we have out prerequisites covered, let’s start with setting everything up.

Upon creating an Ankra account, you shall be prompted to import a Kubernetes cluster, follow along.

Landing Page

Once you give it a name and click on import, you get a pop up to install Ankra agent on your cluster.

Helm command

If you forgot to copy the command, you can always go to settings and click on generate command like below.

Helm command

You should see this if the command has run successfully

Reconciled successfully

Now that we have connected our cluster, it’s time to deploy some stacks.

To begin with, we need to connect a github account/repository so that a backend IAAC can be configured. Click on stacks on the left pane

## Setting up IAAC

Default Stack Page

Connect to GitHub

Once this is done, any applications you add/update/delete on the UI will reflect on your repository and vice-versa.

> It’s important to know that all kubernetes manifests will automatically be committed to the git repository you connect Ankra with. Make sure you do not commit any secrets/api keys to a public repository.

I have a cloudflare domain  [shivu.io](http://shivu.io/)  and I want to deploy a wordpress app on the homelab. Wordpress can be used for various things. I want to have a handy workspace for all my blog ideas and it’s a great tool for that purpose.

Once the stack is deployed, I will have a  [wordpress.shivu.io](http://wordpress.shivu.io/)  deployed with ssl enabled, so the website will be https and I can access it from anywhere on the internet.

## Deploying your stack

A stack on Ankra is a set of applications logically put together in the form of a interactive flowchart. Ankra supports applications as Addons (helm charts) or Manifests. For my stack, I will have the following applications.

- [Wordpress](https://artifacthub.io/packages/helm/bitnami/wordpress) : Community helm chart as an Addon
- [Cert Manager](https://artifacthub.io/packages/helm/cert-manager/cert-manager) : Community helm chart as an Addon for certificates

  - ClusterIssuer: A single manifest additional to the add on to specify cloudflare as my domain issuer.
- [Cloudflared](https://community-charts.github.io/docs/category/cloudflared) : Community helm chart as an Addon for tunnelling locally hosted applications to the internet.

Ankra Stack

The values.yaml for all these are as below

wordpress-values.yaml

```
# Global parametersglobal:  imageRegistry: ""  imagePullSecrets: []  defaultStorageClass: "standard"  security:    allowInsecureImages: true
# Common configurationkubeVersion: ""nameOverride: ""fullnameOverride: ""commonLabels: {}commonAnnotations: {}clusterDomain: cluster.localextraDeploy: []usePasswordFiles: truediagnosticMode:  enabled: false
# WordPress Imageimage:  registry: docker.io  repository: bitnami/wordpress  tag: latest  digest: ""  pullPolicy: IfNotPresent  pullSecrets: []  debug: true
# WordPress ConfigurationwordpressUsername: adminwordpressPassword: devpassword123wordpressEmail: dev@example.comwordpressBlogName: Dev Blogpersistence:  enabled: true  storageClass: ""  accessModes:    - ReadWriteOnce  size: 2Gi
# Deployment SettingsreplicaCount: 1updateStrategy:  type: RollingUpdateschedulerName: ""terminationGracePeriodSeconds: ""topologySpreadConstraints: []priorityClassName: ""automountServiceAccountToken: false
# Resource AllocationresourcesPreset: "nano"resources:  requests:    cpu: 100m    memory: 128Mi  limits:    cpu: 250m    memory: 256Mi
# Service Configurationservice:  metadata:    name: wordpress  type: ClusterIP  ports:    http: 80    https: 443  clusterIP: ""  loadBalancerIP: ""  loadBalancerSourceRanges: []
# Database Configurationmariadb:  enabled: true  architecture: standalone  auth:    rootPassword: rootpassword    database: bitnami_wordpress    username: bn_wordpress    password: dbpassword  primary:    persistence:      enabled: true      storageClass: ""      accessModes:        - ReadWriteOnce      size: 2Gi
# Disable Production Featuresautoscaling:  enabled: falsepdb:  create: falsemetrics:  enabled: falsenetworkPolicy:  enabled: falsememcached:  enabled: false
# Development-Specific OverridesallowEmptyPassword: truewordpressSkipInstall: falseoverrideDatabaseSettings: true
```

> To ensure WordPress runs smoothly without crashing or timing out, it’s crucial to configure resource limits and requests in your Helm chart values. For example, setting modest CPU and memory limits helps Kubernetes manage pod stability and readiness checks effectively.

One additional thing that cert-manager requires is the cloudflare api token to create certs for the domains configured.

You can create this by executing:

```
kubectl -n cert-manager create secret generic cloudflare-api-token-secret --from-literal=api-token=<YOUR_CLOUDFLARE_API_TOKEN>
```

cert-manager-values.yaml

```
installCRDs: true
```

clusterissuer-manifest.yaml

```
apiVersion: cert-manager.io/v1kind: ClusterIssuermetadata:  name: letsencrypt-dns01spec:  acme:    email: <your-email>    privateKeySecretRef:      name: letsencrypt-dns01    server: https://acme-v02.api.letsencrypt.org/directory    solvers:    - dns01:        cloudflare:          apiTokenSecretRef:            key: api-token            name: cloudflare-api-token
```

In order to configure cloudflared tunnel, you need a couple of things. In order to generate them. Install  [cloudflared](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/)  locally. Setting this up might take a while if you are new to cloudflare, but the docs are clear and concise.

1. [Pem certificate](https://developers.cloudflare.com/cloudflare-one/tutorials/cli/) : Upon login, a pem file is generated.
2. [Config File](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/do-more-with-tunnels/local-management/tunnel-useful-commands/) : Upon creation of a tunnel, a config is placed in ~/.cloudflared/config

cloudflared-values.yaml

```
tunnelSecrets:  base64EncodedPemFile: "<base64 encoded pem file>"  base64EncodedConfigJsonFile: "<base64 encoded config.json"
replica:  # -- This will use DaemonSet to deploy cloudflared to all nodes  allNodes: false  # -- If previous flag disabled, this will use Deployment to deploy cloudflared only number of following count  count: 1
tunnelConfig:  name: cloudflared-tunnel  metricsUpdateFrequency: 10s  logLevel: info  warpRouting: true

ingress:  - hostname: wordpress.shivu.io    service: http://wordpress.wordpress.svc.cluster.local:80  - service: http_status:404
```

Click on apply on the bottom of the page and you’re good to go.

In order to access your wordpress on the browser, you must add the URL of your tunnel as a CNAME record on the cloudflare dashboard.

Cloudflare Dashboard

The target here is `<tunnel-id>.cfargotunnel.com`. The tunnel-id can be fetched from the cloudflare dashboard or the first line of the cloudflared logs.

Cloudflared Logs

> A quick clarification: The Cloudflared tunnel works independently from Kubernetes ingress controllers. While Kubernetes ingress manages traffic routing inside your cluster, the Cloudflared tunnel securely connects traffic from Cloudflare’s network to your cluster. Think of Cloudflared as the gateway that tunnels external requests safely, whereas Kubernetes ingress handles traffic once inside the cluster.

## Accessing your application

If everything goes well, you should see this on your hostname

Wordpress Screenshot

Common points to debug:

1. Check the logs of cert-manager if it has created the necessary certificates
2. Check the logs of cloudflared pods if it has registered the tunnel
3. Check the wordpress logs if it is serving traffic
4. Check the initial cloudflared values.yaml to make sure you’ve provided the right names for the service, hostname and namespace.

Join our slack:  [**Join Community**](https://join.slack.com/t/ankra-community/shared_invite/zt-3a5rem8f8-cUho4epX2MoLT83bFf~VSA)

Follow us on:  [LinkedIn](https://www.linkedin.com/company/ankra) ,  [GitHub](https://github.com/ankraio)

Contact us:  [hello@ankra.ai](mailto:hello@ankra.ai)

Share  [X](https://x.com/intent/post?url=https%3A%2F%2Fankra.ai%2Fblog%2Fminimalist-guide&text=The%20Minimalist%E2%80%99s%20Guide%20to%20Homelab%20Setup)  [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fankra.ai%2Fblog%2Fminimalist-guide)  [HN](https://news.ycombinator.com/submitlink?u=https%3A%2F%2Fankra.ai%2Fblog%2Fminimalist-guide&t=The%20Minimalist%E2%80%99s%20Guide%20to%20Homelab%20Setup)

### Get the next post in your inbox

Written by

 [Shiva Swaroop N K](https://ankra.ai/blog/author/shiva-swaroop)

Shiv writes hands-on guides for running real workloads on Kubernetes with Ankra, from homelab setups to production deployments.

[All posts](https://ankra.ai/blog/author/shiva-swaroop)  [LinkedIn](https://www.linkedin.com/in/shivaswaroop-nittoor-krishnamurthy-67551a14b/)

## Related Posts

[Kubernetes](https://ankra.ai/blog/tag/kubernetes)  [Engineering](https://ankra.ai/blog/tag/engineering)  [Homelab](https://ankra.ai/blog/tag/homelab)

[## Kubernetes the Hard Way, Part 3: Back Up etcd and Restore a Lost Control Plane](https://ankra.ai/blog/kubernetes-the-hard-way-backup-restore)

Back up a Kubernetes 1.37 cluster by hand with etcd snapshots, then delete the control plane and restore it. Includes the encryption key trap, all tested.

[Mattias Åsell](https://ankra.ai/blog/author/mattias-asell)

October 25, 2026

12 min read

[Kubernetes](https://ankra.ai/blog/tag/kubernetes)  [Engineering](https://ankra.ai/blog/tag/engineering)  [Homelab](https://ankra.ai/blog/tag/homelab)

[## Kubernetes the Hard Way, Part 5: Certificates, Expiry and Renewal Without Downtime](https://ankra.ai/blog/kubernetes-the-hard-way-certificates)

Read every Kubernetes certificate, watch one expire, and renew them all by hand. Most components reload a renewed certificate with no restart at all. Tested.

[Mattias Åsell](https://ankra.ai/blog/author/mattias-asell)

October 25, 2026

9 min read

[Back to Blog](https://ankra.ai/blog)
