docker-compose.yaml 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. {% from "macros/setup.sh.jinja" import setup_script %}
  2. {% set tpl = ix_lib.base.render.Render(values) %}
  3. {% set st = values.consts.settings %}
  4. {% set settings = [
  5. {"cmd": "options announce-lanaddresses", "value": 1 if st.announce_lan_addresses else 0, "quote": true},
  6. {"cmd": "options global-ann-enabled", "value": 1 if st.global_discovery else 0, "quote": true},
  7. {"cmd": "options local-ann-enabled", "value": 1 if st.local_discovery else 0, "quote": true},
  8. {"cmd": "options natenabled", "value": 1 if st.nat_traversal else 0, "quote": true},
  9. {"cmd": "options relays-enabled", "value": 1 if st.relaying else 0, "quote": true},
  10. {"cmd": "options uraccepted", "value": 1 if st.telemetry else -1, "quote": true},
  11. {"cmd": "options auto-upgrade-intervalh", "value": st.auto_upgrade_intervalh, "quote": true},
  12. {"cmd": "defaults folder xattr-filter max-total-size", "value": st.xattr_filter_max_total_size, "quote": false},
  13. {"cmd": "defaults folder xattr-filter max-single-entry-size", "value": st.xattr_filter_max_single_entry_size, "quote": true},
  14. {"cmd": "defaults folder send-ownership", "value": 1 if st.send_ownership else 0, "quote": false},
  15. {"cmd": "defaults folder sync-ownership", "value": 1 if st.sync_ownership else 0, "quote": false},
  16. {"cmd": "defaults folder send-xattrs", "value": 1 if st.send_xattrs else 0, "quote": false},
  17. {"cmd": "defaults folder sync-xattrs", "value": 1 if st.sync_xattrs else 0, "quote": false},
  18. {"cmd": "defaults folder ignore-perms", "value": 1 if st.ignore_perms else 0, "quote": false},
  19. {"cmd": "defaults folder path", "value": st.path, "quote": true},
  20. ] %}
  21. {% set c1 = tpl.add_container(values.consts.syncthing_container_name, "image") %}
  22. {% set config = tpl.add_container(values.consts.config_container_name, "image") %}
  23. {% do c1.depends.add_dependency(values.consts.config_container_name, "service_completed_successfully") %}
  24. {% do config.restart.set_policy("on-failure", 1) %}
  25. {% do config.remove_devices() %}
  26. {% do config.deploy.resources.set_profile("medium") %}
  27. {% do config.configs.add("setup.sh", setup_script(values, settings), "/setup.sh", "0755") %}
  28. {% do config.set_entrypoint(["/bin/sh", "-c", "/setup.sh"]) %}
  29. {% do c1.set_user(0, 0) %}
  30. {% do config.set_user(0, 0) %}
  31. {% do c1.remove_security_opt("no-new-privileges") %}
  32. {% do config.remove_security_opt("no-new-privileges") %}
  33. {% set caps = ["CHOWN", "DAC_OVERRIDE", "FOWNER", "SETGID", "SETUID", "SETFCAP", "SETPCAP", "SYS_ADMIN"] %}
  34. {% do c1.add_caps(caps) %}
  35. {% do config.add_caps(caps + ["KILL"]) %}
  36. {% do c1.healthcheck.set_test("wget", {"port": values.network.web_port.port_number, "path": "/rest/noauth/health"}) %}
  37. {% do config.healthcheck.disable() %}
  38. {% set envs = {
  39. "PCAP": ["cap_sys_admin", "cap_chown", "cap_dac_override", "cap_fowner"]|join(",") + "+ep",
  40. "STNOUPGRADE": true,
  41. "STGUIADDRESS": "0.0.0.0:%d" | format(values.network.web_port.port_number),
  42. "STGUIASSETS": "/var/truenas/assets/gui",
  43. } %}
  44. {% for k, v in envs.items() %}
  45. {% do c1.environment.add_env(k, v) %}
  46. {% do config.environment.add_env(k, v) %}
  47. {% endfor %}
  48. {% do c1.environment.add_user_envs(values.syncthing.additional_envs) %}
  49. {% do config.environment.add_user_envs(values.syncthing.additional_envs) %}
  50. {% do c1.configs.add("logo-horizontal-svg", values.consts.logo_horizontal_svg, values.consts.logo_horizontal_svg_path) %}
  51. {% do config.configs.add("logo-horizontal-svg", values.consts.logo_horizontal_svg, values.consts.logo_horizontal_svg_path) %}
  52. {% if values.network.certificate_id %}
  53. {% set cert = values.ix_certificates[values.network.certificate_id] %}
  54. {% do c1.configs.add("private", cert.privatekey, "%s/config/https-key.pem" | format(values.consts.home_path)) %}
  55. {% do c1.configs.add("public", cert.certificate, "%s/config/https-cert.pem" | format(values.consts.home_path)) %}
  56. {% do config.configs.add("private", cert.privatekey, "%s/config/https-key.pem" | format(values.consts.home_path)) %}
  57. {% do config.configs.add("public", cert.certificate, "%s/config/https-cert.pem" | format(values.consts.home_path)) %}
  58. {% endif %}
  59. {% do c1.add_port(values.network.web_port) %}
  60. {% if not values.network.host_network %}
  61. {% do c1.add_port(values.network.tcp_port, {"container_port": 22000}) %}
  62. {% do c1.add_port(values.network.quic_port, {"container_port": 22000, "protocol": "udp"}) %}
  63. {% if values.consts.settings.local_discovery %}
  64. {% do c1.add_port(values.network.local_discover_port, {"container_port": 27017, "protocol": "udp"}) %}
  65. {% endif %}
  66. {% endif %}
  67. {% do c1.add_storage(values.consts.home_path, values.storage.home) %}
  68. {% do config.add_storage(values.consts.home_path, values.storage.home) %}
  69. {% for store in values.storage.additional_storage %}
  70. {% set new_store = tpl.funcs.copy_dict(store) %}
  71. {% if new_store.type == "cifs" and new_store.cifs_config.migration_mode %}
  72. {% do new_store.update({"read_only": true}) %}
  73. {% do new_store.cifs_config.update({"options": ["cifsacl", "vers=3.0"]}) %}
  74. {% endif %}
  75. {% do c1.add_storage(new_store.mount_path, new_store) %}
  76. {% do config.add_storage(new_store.mount_path, new_store) %}
  77. {% else %}
  78. {% do tpl.funcs.fail("Expected at least one storage item to be set for Syncthing") %}
  79. {% endfor %}
  80. {% set proto = "https" if values.network.certificate_id else "http" %}
  81. {% do tpl.portals.add(values.network.web_port, {"scheme": proto}) %}
  82. {{ tpl.render() | tojson }}