docs/en/deploy/astrbot/kubernetes.md
[!WARNING] You can deploy AstrBot in a high-availability setup using Kubernetes (K8s), allowing it to automatically recover from failures.
Due to the current use of an SQLite database, this deployment does not support horizontal scaling with multiple replicas. Additionally, if using the Sidecar mode, pay special attention to the persistence of NapCat's login state.
The following tutorial assumes that you have
kubectlinstalled and configured, and that you can connect to your K8s cluster.
Before you begin, make sure your Kubernetes cluster meets the following conditions:
PersistentVolumeClaim (PVC). You can check this with kubectl get sc. If you don't have one, you need to manually create a PersistentVolume (PV) or install a corresponding storage plugin (e.g., nfs-client-provisioner).docker.io or your specified image repository.We offer two deployment options:
This method is located in the k8s/astrbot_with_napcat directory.
# 1. Create namespace
kubectl apply -f k8s/astrbot_with_napcat/00-namespace.yaml
# 2. Create Persistent Volume Claim
# Note: astrbot-data-shared-pvc requires ReadWriteMany (RWX) access mode.
# If your cluster does not support RWX, you need to configure shared storage such as NFS and modify the storageClassName in 01-pvc.yaml.
kubectl apply -f k8s/astrbot_with_napcat/01-pvc.yaml
# 3. Deploy the application
kubectl apply -f k8s/astrbot_with_napcat/02-deployment.yaml
Option A: NodePort
kubectl apply -f k8s/astrbot_with_napcat/03-service-nodeport.yaml
The service will be exposed via the node IP and a port automatically assigned by Kubernetes. You can find the port with the following command:
kubectl get svc -n astrbot-ns
In the output, find the PORT(S) column for astrbot-webui-svc and napcat-web-svc. The format is <internal-port>:<NodePort>/TCP. For example, if you see 8080:30185/TCP, the access address is http://<NodeIP>:30185.
Option B: LoadBalancer
If your cluster supports LoadBalancer type services (usually provided in K8s services from cloud providers), you can use this method.
kubectl apply -f k8s/astrbot_with_napcat/04-service-loadbalancer.yaml
After execution, check the assigned external IP (EXTERNAL-IP) with kubectl get svc -n astrbot-ns.
Since AstrBot and NapCat are in the same Pod, they can communicate directly via localhost.
Add a message platform in AstrBot:
Platform -> Add.aiocqhttpnapcat (or custom)0.0.0.06199Configure Websocket Client in NapCat:
Settings -> Reverse WS -> Add.ws://localhost:6199/wsArrayThis method is located in the k8s/astrbot directory.
# 1. Create namespace
kubectl apply -f k8s/astrbot/00-namespace.yaml
# 2. Create Persistent Volume Claim
kubectl apply -f k8s/astrbot/01-pvc.yaml
# 3. Deploy the application
kubectl apply -f k8s/astrbot/02-deployment.yaml
Option A: NodePort
kubectl apply -f k8s/astrbot/03-service-nodeport.yaml
The service will be exposed via the node IP and a port automatically assigned by Kubernetes. You can find the port with the following command:
kubectl get svc -n astrbot-standalone-ns
In the output, find the PORT(S) column for astrbot-webui-svc. The format is <internal-port>:<NodePort>/TCP. For example, if you see 8080:30185/TCP, the access address is http://<NodeIP>:30185.
Option B: LoadBalancer
kubectl apply -f k8s/astrbot/04-service-loadbalancer.yaml
After execution, check the assigned external IP (EXTERNAL-IP) with kubectl get svc -n astrbot-standalone-ns.
If you have difficulty pulling the soulter/astrbot:latest or mlikiowa/napcat-docker:latest images, you can manually edit the corresponding 02-deployment.yaml file and replace the image field with a domestic mirror address, for example:
# Example:
# image: soulter/astrbot:latest
# Replace with:
image: m.daocloud.io/docker.io/soulter/astrbot:latest
If you need to use the sandbox code executor, you need to mount the Docker socket file into the Pod.
Edit the 02-deployment.yaml file and add volumes and volumeMounts under spec.template.spec:
Add the following to the volumeMounts list of the astrbot container:
- name: docker-sock
mountPath: /var/run/docker.sock
Add the following to the spec.template.spec.volumes list:
- name: docker-sock
hostPath:
path: /var/run/docker.sock
type: Socket
[!WARNING] Mounting the Docker socket into a Pod poses a security risk. Please ensure you understand the implications.
Sidecar Deployment Mode:
# View AstrBot logs
kubectl logs -f -n astrbot-ns deployment/astrbot-stack -c astrbot
# View NapCat logs
kubectl logs -f -n astrbot-ns deployment/astrbot-stack -c napcat
Standalone Deployment Mode:
kubectl logs -f -n astrbot-standalone-ns deployment/astrbot-standalone
After deploying and exposing the service, you can access the AstrBot admin panel through the corresponding IP and port.
New users must use the random password printed in the startup logs for the first login. Use the username shown in the logs (usually
astrbot) and change it after logging in.