# SiYuan — Deploy no Kubernetes (marinalva)

> **SiYuan** é um sistema de notas pessoais open-source, privado e auto-hospedado.
> URL oficial: https://github.com/siyuan-note/siyuan

---

## 📋 Resumo do Deploy

| Item | Valor |
|:-----|:------|
| 🌐 **URL** | `https://siyuan.marinalva.geisler.eti.br` |
| 👤 **Login** | Qualquer usuário criado no SiYuan |
| 🔑 **Access Code** | `***` |
| 🐳 **Imagem** | `b3log/siyuan:latest` |
| 📦 **Namespace** | `siyuan` |
| 🗄️ **PVC** | `siyuan-data` — 10Gi (local-path) |
| 📡 **Porta** | 6806 |
| 🔒 **TLS** | LetsEncrypt (automático via cert-manager) |

---

## 🚀 Deploy

### 1. Namespace + Recursos

```bash
kubectl create namespace siyuan
```

### 2. PVC para dados persistentes

```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: siyuan-data
  namespace: siyuan
spec:
  accessModes: [ReadWriteOnce]
  resources:
    requests:
      storage: 10Gi
  storageClassName: local-path
```

### 3. Deployment

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: siyuan
  namespace: siyuan
spec:
  replicas: 1
  selector:
    matchLabels:
      app: siyuan
  template:
    metadata:
      labels:
        app: siyuan
    spec:
      containers:
      - name: siyuan
        image: b3log/siyuan:latest
        args:
        - "serve"
        - "--workspace=/siyuan/workspace"
        - "--accessAuthCode=siyuan123"
        ports:
        - containerPort: 6806
        volumeMounts:
        - name: data
          mountPath: /siyuan/workspace
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: siyuan-data
```

### 4. Service

```yaml
apiVersion: v1
kind: Service
metadata:
  name: siyuan
  namespace: siyuan
spec:
  selector:
    app: siyuan
  ports:
  - port: 6806
    targetPort: 6806
```

### 5. Ingress (TLS com LetsEncrypt)

```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: siyuan
  namespace: siyuan
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  ingressClassName: traefik
  rules:
  - host: siyuan.marinalva.geisler.eti.br
    http:
      paths:
      - backend:
          service:
            name: siyuan
            port:
              number: 6806
        path: /
        pathType: Prefix
  tls:
  - hosts:
    - siyuan.marinalva.geisler.eti.br
    secretName: siyuan-tls
```

---

## 🔧 Comandos Úteis

```bash
# Ver logs
kubectl logs -n siyuan deploy/siyuan -f

# Ver pod
kubectl get pods -n siyuan

# Ver PVC
kubectl get pvc -n siyuan

# Acessar o pod
kubectl exec -n siyuan deploy/siyuan -it -- sh

# Restart
kubectl rollout restart -n siyuan deploy/siyuan

# Alterar access code
kubectl patch deployment siyuan -n siyuan -p \
  '{"spec":{"template":{"spec":{"containers":[{"name":"siyuan","args":["serve","--workspace=/siyuan/workspace","--accessAuthCode=NOVA_SENHA"]}]}}}}'
```

---

## 🔍 Troubleshooting

| Problema | Causa | Solução |
|:---------|:------|:--------|
| 401 Unauthorized | Access code necessário | Adicionar `?accessAuthCode=...` na URL ou configurar no app |
| Pod CrashLoopBackOff | Args incorretos | Usar `serve --workspace=...` (comando `serve` antes dos args) |
| Certificado não emite | DNS não configurado | Verificar se `siyuan.marinalva.geisler.eti.br` aponta para o IP do cluster |

---

## 📦 Backup

Os dados ficam no PVC `siyuan-data`. Para backup:

```bash
# Backup via Velero
velero backup create siyuan-backup \
  --include-namespaces siyuan \
  --default-volumes-to-fs-backup --wait

# Ou dump manual (dentro do pod)
kubectl exec -n siyuan deploy/siyuan -- tar czf - /siyuan/workspace > siyuan-backup-$(date +%Y%m%d).tar.gz
```
