# Project inheritance across multiple gateways

**URL:** <https://forum.inductiveautomation.com/t/project-inheritance-across-multiple-gateways/104120>\
**Category:** Ignition\
**Tags:** vision\
**Created:** [March 24, 2025, 6:44pm UTC](https://forum.inductiveautomation.com/t/project-inheritance-across-multiple-gateways/104120 "2025-03-24T18:44:04Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![sherman](https://avatars.discourse-cdn.com/v4/letter/s/e5b9ba/32.png) [@sherman](https://forum.inductiveautomation.com/u/sherman)\
**Post date:** [March 24, 2025, 6:44pm UTC](https://forum.inductiveautomation.com/t/project-inheritance-across-multiple-gateways/104120/1 "2025-03-24T18:44:05Z")

</div>

I'd like to inherit my core projects from my main gateway into a secondary gateway. Basically, I want to be able to have a single source of truth for my core scripting and templating, but be able to have projects that depend on those things be running in another gateway. Is there a way / best way to do this?

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [March 24, 2025, 6:45pm UTC](https://forum.inductiveautomation.com/t/project-inheritance-across-multiple-gateways/104120/2 "2025-03-24T18:45:16Z")

</div>

Hmm, some options:

- CTRL+C, CTRL+V
- [EAM Module](https://www.docs.inductiveautomation.com/docs/8.1/ignition-modules/enterprise-administration/agent-tasks/send-project)
- Git?

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [March 24, 2025, 7:43pm UTC](https://forum.inductiveautomation.com/t/project-inheritance-across-multiple-gateways/104120/3 "2025-03-24T19:43:32Z")

</div>

Okay this is ~~maybe~~  ~~probably~~ definitely a bad idea, but I wonder if you could use [sshfs](https://github.com/libfuse/sshfs) to mount the folder of the parent project on the remote gateway and then create a symlink to the mount on the local gateway under the appropriate `data/projects/$projectName` folder...

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [March 24, 2025, 7:46pm UTC](https://forum.inductiveautomation.com/t/project-inheritance-across-multiple-gateways/104120/4 "2025-03-24T19:46:25Z")

</div>

> [@Kevin.Herron](#):
>
> a bad idea

Oy! Definitely. I can image a comms hiccup stalling the entire gateway.

---

<div class="post-metadata">

**Author:** ![sherman](https://avatars.discourse-cdn.com/v4/letter/s/e5b9ba/32.png) [@sherman](https://forum.inductiveautomation.com/u/sherman)\
**Post date:** [March 24, 2025, 8:34pm UTC](https://forum.inductiveautomation.com/t/project-inheritance-across-multiple-gateways/104120/5 "2025-03-24T20:34:32Z")

</div>

Seems like the EAM would be the way to go, thanks for that link. Does it support event based transfers if I want to force lockstep between the systems? Or does it only support triggered or timed execution?

While I could probably make the sshfs link work better than Phil might think, since I could be running both gateways containerized with access to reliable filesystems, I'd much rather use a supported mechanism for this.

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [March 24, 2025, 8:38pm UTC](https://forum.inductiveautomation.com/t/project-inheritance-across-multiple-gateways/104120/6 "2025-03-24T20:38:02Z")

</div>

I think you can create a "Send Project" task and then invoke it with [system.eam.runTask](https://docs.inductiveautomation.com/docs/8.1/appendix/scripting-functions/system-eam/system-eam-runTask).

---

<div class="post-metadata">

**Author:** ![sherman](https://avatars.discourse-cdn.com/v4/letter/s/e5b9ba/32.png) [@sherman](https://forum.inductiveautomation.com/u/sherman)\
**Post date:** [March 24, 2025, 8:48pm UTC](https://forum.inductiveautomation.com/t/project-inheritance-across-multiple-gateways/104120/7 "2025-03-24T20:48:50Z")

</div>

Ok that might be the place to go, I can put that into a gateway script. Do you think it will behave as expected tucked into a Gateway Update script?

---

<div class="post-metadata">

**Author:** ![sherman](https://avatars.discourse-cdn.com/v4/letter/s/e5b9ba/32.png) [@sherman](https://forum.inductiveautomation.com/u/sherman)\
**Post date:** [March 24, 2025, 9:46pm UTC](https://forum.inductiveautomation.com/t/project-inheritance-across-multiple-gateways/104120/8 "2025-03-24T21:46:07Z")

</div>

Looks like it mostly works, although I'd like to identify the file that is being saved during the update so that I can route to the correct EAM task and only sync a file that is handled in those tasks and only sync the file that was updated.

I accessed the 'resources' dictionary as referenced at the top of the "Project Update Script" window and it looks like `{'modified': [{'name': 'event-scripts', 'path': 'ignition/event-scripts', 'resourceType': 'ignition/event-scripts'}], 'removed': [], 'added': [], 'manifestChanged': False}`. What I really want is for it to spit out the project name; it didn't so I guess I will use `system.util.getProjectName()` which should work since this always has to be saved from inside a client designer.

I can't find a way to check upstream for if EAM Agent Tasks exist before I call them, the only system.eam options are "getGroups" (I guess I could put each of the agents tasks in their own group that has the same name and check that way? Seems clunky). I could call them and let them bounce if nothing exists to execute, but that is going to fill my log with unuseful errors.

I take it that it is not common to have multiple gateways that are kept in lockstep?

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [March 24, 2025, 10:29pm UTC](https://forum.inductiveautomation.com/t/project-inheritance-across-multiple-gateways/104120/9 "2025-03-24T22:29:04Z")

</div>

> [@sherman](#):
>
> kept in lockstep?

No, as this sort of thing causes project restarts, and that is often disruptive to production. Synchronization is _ **scheduled** _ for outage windows among my clients, for the most part.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [March 24, 2025, 10:34pm UTC](https://forum.inductiveautomation.com/t/project-inheritance-across-multiple-gateways/104120/10 "2025-03-24T22:34:59Z")

</div>

It'd be pretty easy to set up `rsync` + `cron` nightly 🤷

It really depends on how much you actually expect this 'core' to change, how critical it is that you get updates **immediately** vs **eventually** , and a bunch of other constraints only you are really going to know.

---

<div class="post-metadata">

**Author:** ![sherman](https://avatars.discourse-cdn.com/v4/letter/s/e5b9ba/32.png) [@sherman](https://forum.inductiveautomation.com/u/sherman)\
**Post date:** [March 24, 2025, 10:55pm UTC](https://forum.inductiveautomation.com/t/project-inheritance-across-multiple-gateways/104120/11 "2025-03-24T22:55:06Z")

</div>

I understand for a slower-evolving production system why we'd want to schedule at most nightly or developer-initiated syncs, but this system is in continuous development at a pretty fast pace so having the systems lockstepped could be a mode we are looking to have (amongst the other slower, more regular modes).

I've got it logic-gated in my gateway update script now (behind both permission and estop status tags), it seems to be working well enough

---

<div class="post-metadata">

**Author:** ![csjohnson](https://avatars.discourse-cdn.com/v4/letter/c/5f8ce5/32.png) [@csjohnson](https://forum.inductiveautomation.com/u/csjohnson)\
**Post date:** [March 25, 2025, 3:39am UTC](https://forum.inductiveautomation.com/t/project-inheritance-across-multiple-gateways/104120/12 "2025-03-25T03:39:40Z")

</div>

We are in the same situation as you. A single parent project that is used globally and is actively being developed and used in production. Go-Go-Go Fast-Fast-Fast. It’s not fun.

The grouping sounds interesting. Could you create a group of resources that are updated together, in EAM?  
That would help with resource dependency.

---

<div class="post-metadata">

**Author:** ![sherman](https://avatars.discourse-cdn.com/v4/letter/s/e5b9ba/32.png) [@sherman](https://forum.inductiveautomation.com/u/sherman)\
**Post date:** [March 25, 2025, 4:09am UTC](https://forum.inductiveautomation.com/t/project-inheritance-across-multiple-gateways/104120/13 "2025-03-25T04:09:25Z")

</div>

I think you can yes, I've so far only gotten to individual agent tasks but there's definitely something designed for group execution in there
