---
# System prepended metadata

title: Appfile

---

# Appfile

```yaml

version: "1.0-alpha.1"
name: testapp

services:
  express-server:
    # this image will be used in both build and deploy config
    image: oamdev/testapp:v1

    build:
      # Here more runtime specific build templates will be supported, like NodeJS, Go, Python, Ruby.
      docker:
        file: Dockerfile
        context: .

      # Uncomment the following to push to local kind cluster
      # push:
      #   local: kind

    # type: webservice (default) | task

    cmd: ["node", "server.js"]

    route:
      domain: example.com
      http: # match the longest prefix
        "/": 8080

    env:
      - FOO=bar
      - FOO2=sec:my-secret # map the key same as the env name (`FOO2`) from my-secret to env var
      - FOO3=sec:my-secret:key # map specific key from my-secret to env var
      - sec:my-secret # map all KV pairs from my-secret to env var

    files: # Mount secret as a file
      - /mnt/path=sec:my-secret

    scale:
      replica: 2
      auto: # automatic scale up and down based on given metrics
        range: "1-10"
        cpu: 80 # if cpu utilization is above 80%, scale up
        qps: 1000 # if qps is higher than 1k, scale up

    canary: # Auto-create canary deployment. Only upgrade after verify successfully.
      replica: 1 # canary deployment size
      headers:
        - "foo:bar.*"

secrets:
  my-secret: /local-path/my-secret # load local file into k8s secret

```

---

```yaml
version: "1.0-alpha.1"

services:
  express-server:
    build:
      image: alibaba/express:v1
      registry: docker.io # 不同环境有个 default，更好地跟云服务集成
      # pushSecret: docker-secret
      # 下面使用 docker specific runtime。以后还可以添加 Go, Nodejs, Python, Ruby runtime。
      docker:
        file: Dockerfile
        context: . # Docker build context. Defaults to "."
        args:
          - foo=bar

    cmd: ["/bin/node", "app.js"]
    domain: example.com
    httpRoutes: # match the longest prefix
      "/": 80
      "/metrics": 8081
    healthCheckPath: /health
    # lifecycle:
    #   preStop:
    #     cmd: ["/bin/cleanup"]

    # endpoint: # 自动配置网络接入给用户
    #   publicIP: true
    #   publicDNS: true
    #   privateIP: true
    #   privateDNS: true
    #   tls: true

    env:
      - FOO=bar
      - FOO3=sec:my-secret # map the same key as the env name from my-secret to env var
      - FOO2=sec:my-secret:key # map specific key from my-secret to env var
      - sec:my-secret # map all KV pairs from my-secret to env var
    files: # Mount secret as a file
      - /mnt/path=sec:my-secret

    scale:
      replica: 5
      range: "1-10"
      trigger:
        cpu: 80 # if cpu utilization is above 80%, it will trigger scale up
        qps: 1000

    rollout:
      canary: # 额外生成 canary deployment 用来进行验证。Canary 验证通过后才会执行升级。
        replica: 1 # canary deployment size
        headers:
          - "foo:bar.*"

      bluegreen: # 自动生成新版本，并逐步 shift 流量到新版本中
        interval: 5m # 每次 shift 之间间隔时间
        trafficIncrement: 10 # 每次 shift 10% 流量到新版本，当所有流量都到新版本后即可删除旧版本。

      # # The following analysis will be performed against the new version deployment.
      # analysis:
      #   # If any of the alerting rules is triggered, rollout will be paused and alert will be sent
      #   alertingRules: 
      #     - expr: "job:request_latency_seconds:mean5m{job="myjob"} > 0.5"
      #       length: 10m

  # mongodb:
  #   image: alibaba/mongodb:v1 # pre-packaged
  #   volumes:
  #     - db-data:/var/lib/mongodb
  #   # 别的公司都会用 service broker 来接入中间件服务。以后可以定义 secret 等标准来自动绑定。
  #   # type: cloudservice/mongodb

secrets:
  my-secret: /local-path/my-secret # load local file into k8s secret

# volumes:
#   db-data:
#     storageClass: standard
#     size: 10Gb
```

TODO:
- cronjob 等 workload 类型如何描述？
  - 可以跟 service 同级加一层，或者 service 里面加 type
- Demo 要做的 scope 定小一点，效果做好一点
- 先把第一版 Demo 不需要的注释掉，然后再对齐一下


$ vela up
...
app status:
  ...
your app is running at https://xxx
you can view metrics at:
you can login via ssh: ...
you can view logs via cmd: ...

CLI: interactive rollout
$ vela up
...
canary rollout ...
1/5
confirm? (yes/no) yes
...
2/5
3/5
4/5
5/5

