# Preferred web app deployment tooling for small projects?

**URL:** <https://discourse.haskell.org/t/preferred-web-app-deployment-tooling-for-small-projects/14870>\
**Category:** Learn\
**Created:** [October 20, 2026, 12:30am UTC](https://discourse.haskell.org/t/preferred-web-app-deployment-tooling-for-small-projects/14870 "2026-10-20T00:30:49Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![stevechy](https://avatars.discourse-cdn.com/v4/letter/s/c0e974/32.png) [@stevechy](https://discourse.haskell.org/u/stevechy)\
**Post date:** [October 20, 2026, 12:30am UTC](https://discourse.haskell.org/t/preferred-web-app-deployment-tooling-for-small-projects/14870/1 "2026-10-20T00:30:49Z")

</div>

Hello,

Just wondering what people prefer for deploying small Haskell web projects.

I’m thinking of:

- standard stack build
- using Jib [GitHub - GoogleContainerTools/jib: 🏗 Build container images for your Java applications. · GitHub](https://github.com/googlecontainertools/jib) to add the executable stuff to a docker image that mostly matches where it is built
- deploy the container with Google Cloud Run

It looks like Nix is popular but I probably shouldn’t need that to start right?

---

<div class="post-metadata">

**Author:** ![simonmic](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/simonmic/32/1796_2.png) [@simonmic](https://discourse.haskell.org/u/simonmic)\
**Post date:** [October 20, 2026, 3:54am UTC](https://discourse.haskell.org/t/preferred-web-app-deployment-tooling-for-small-projects/14870/2 "2026-10-20T03:54:17Z")

</div>

For small projects, it doesn’t matter much, right ? If the server is powerful enough, you can stack build there; if not, try to build a compatible binary on another machine, then upload the binary and restart ? Restarting a haskell web app is usually quick. systemd is one way to manage the process.

---

<div class="post-metadata">

**Author:** ![abhin4v](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/abhin4v/32/1234_2.png) [@abhin4v](https://discourse.haskell.org/u/abhin4v)\
**Post date:** [October 20, 2026, 4:13am UTC](https://discourse.haskell.org/t/preferred-web-app-deployment-tooling-for-small-projects/14870/3 "2026-10-20T04:13:10Z")

</div>

I have a bunch of small Haskell services running on my VPS. I compile the Haskell code to statically linked standalone executables using Nix, and then wrap them into a NixOS service and run them on the VPS. Nix takes care of deployment, restarts etc. Underneath it uses systemd.

---

<div class="post-metadata">

**Author:** ![stevechy](https://avatars.discourse-cdn.com/v4/letter/s/c0e974/32.png) [@stevechy](https://discourse.haskell.org/u/stevechy)\
**Post date:** [October 20, 2026, 4:56am UTC](https://discourse.haskell.org/t/preferred-web-app-deployment-tooling-for-small-projects/14870/4 "2026-10-20T04:56:58Z")

</div>

True I will give just uploading the binary a try good to know that it should generally work.

---

<div class="post-metadata">

**Author:** ![stevechy](https://avatars.discourse-cdn.com/v4/letter/s/c0e974/32.png) [@stevechy](https://discourse.haskell.org/u/stevechy)\
**Post date:** [October 20, 2026, 4:59am UTC](https://discourse.haskell.org/t/preferred-web-app-deployment-tooling-for-small-projects/14870/5 "2026-10-20T04:59:07Z")

</div>

Oh nice so Nix handles more than just the building. I was wondering about that. Do you set up an nginx type thing in front of all the services?

---

<div class="post-metadata">

**Author:** ![abhin4v](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/abhin4v/32/1234_2.png) [@abhin4v](https://discourse.haskell.org/u/abhin4v)\
**Post date:** [October 20, 2026, 5:16am UTC](https://discourse.haskell.org/t/preferred-web-app-deployment-tooling-for-small-projects/14870/6 "2026-10-20T05:16:25Z")

</div>

Yes, I use Nginx in front, also configured via Nix.

---

<div class="post-metadata">

**Author:** ![Kleidukos](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/kleidukos/32/1213_2.png) [@Kleidukos](https://discourse.haskell.org/u/Kleidukos)\
**Post date:** [October 20, 2026, 7:26am UTC](https://discourse.haskell.org/t/preferred-web-app-deployment-tooling-for-small-projects/14870/7 "2026-10-20T07:26:41Z")

</div>

I just build on my server and run from there behind nginx. You should aim to build during Continuous Deployment if you can, so that it’s the CI runners that take the CPU load.

---

<div class="post-metadata">

**Author:** ![wiz](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/wiz/32/2408_2.png) [@wiz](https://discourse.haskell.org/u/wiz)\
**Post date:** [October 20, 2026, 2:31pm UTC](https://discourse.haskell.org/t/preferred-web-app-deployment-tooling-for-small-projects/14870/8 "2026-10-20T14:31:19Z")

</div>

I’ve used [keter](https://hackage.haskell.org/package/keter). `scp` your binary to the server and it reloads. No clusters, no containers.
