netdata.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package docker
  2. import (
  3. "fmt"
  4. "github.com/docker/docker/api/types/container"
  5. "github.com/docker/go-connections/nat"
  6. "goseg/config"
  7. "os"
  8. "path/filepath"
  9. )
  10. func LoadNetdata() error {
  11. logger.Info("Loading NetData container")
  12. confPath := filepath.Join(config.BasePath, "settings", "netdata.json")
  13. _, err := os.Open(confPath)
  14. if err != nil {
  15. // create a default if it doesn't exist
  16. err = config.CreateDefaultNetdataConf()
  17. if err != nil {
  18. // panic if we can't create it
  19. errmsg := fmt.Sprintf("Unable to create NetData config! %v", err)
  20. logger.Error(errmsg)
  21. panic(errmsg)
  22. }
  23. }
  24. logger.Info("Running NetData")
  25. info, err := StartContainer("netdata", "netdata")
  26. if err != nil {
  27. logger.Error(fmt.Sprintf("Error starting NetData: %v", err))
  28. return err
  29. }
  30. config.UpdateContainerState("netdata", info)
  31. return nil
  32. }
  33. // netdata container config builder
  34. func netdataContainerConf() (container.Config, container.HostConfig, error) {
  35. var containerConfig container.Config
  36. var hostConfig container.HostConfig
  37. // construct the container metadata from version server info
  38. containerInfo, err := GetLatestContainerInfo("netdata")
  39. if err != nil {
  40. return containerConfig, hostConfig, err
  41. }
  42. desiredTag := containerInfo["tag"]
  43. desiredHash := containerInfo["hash"]
  44. desiredRepo := containerInfo["repo"]
  45. desiredImage := fmt.Sprintf("%s:%s@sha256:%s", desiredRepo, desiredTag, desiredHash)
  46. // construct the container config struct
  47. containerConfig = container.Config{
  48. Image: desiredImage,
  49. ExposedPorts: nat.PortSet{"19999/tcp": struct{}{}},
  50. Volumes: map[string]struct{}{
  51. "/etc/netdata": {},
  52. "/var/lib/netdata": {},
  53. "/var/cache/netdata": {},
  54. "/host/etc/passwd": {},
  55. "/host/etc/group": {},
  56. "/host/proc": {},
  57. "/host/sys": {},
  58. "/host/etc/os-release": {},
  59. },
  60. }
  61. hostConfig = container.HostConfig{
  62. CapAdd: []string{"SYS_PTRACE"},
  63. RestartPolicy: container.RestartPolicy{
  64. Name: "unless-stopped",
  65. },
  66. SecurityOpt: []string{"apparmor=unconfined"},
  67. PortBindings: nat.PortMap{
  68. "19999/tcp": []nat.PortBinding{
  69. {HostIP: "0.0.0.0", HostPort: "19999"},
  70. },
  71. },
  72. Binds: []string{
  73. "netdataconfig:/etc/netdata",
  74. "netdatalib:/var/lib/netdata",
  75. "netdatacache:/var/cache/netdata",
  76. "/etc/passwd:/host/etc/passwd:ro",
  77. "/etc/group:/host/etc/group:ro",
  78. "/proc:/host/proc:ro",
  79. "/sys:/host/sys:ro",
  80. "/etc/os-release:/host/etc/os-release:ro",
  81. },
  82. }
  83. return containerConfig, hostConfig, nil
  84. }