<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged make</title>
<link>https://coderlegion.com/tag/make</link>
<description>Powered by Question2Answer</description>
<item>
<title>Make for Small Business: What It Is, What It Costs, and When to Use It</title>
<link>https://coderlegion.com/25684/make-for-small-business-what-it-is-what-it-costs-and-when-to-use-it</link>
<description>
&lt;p&gt;
        If you have compared automation tools for more than five minutes, you have met Make. It used to be called Integromat, and it is best known for one thing: a visual builder that looks like a real diagram, with little circles connected by lines that show your data moving from one app to the next. For a lot of people, that picture is the moment automation finally clicks.
      &lt;/p&gt;
      &lt;p&gt;
        This guide is the honest version. What Make is, what it does better than almost anyone, what it costs, and where it starts to pinch for a growing small business.
      &lt;/p&gt;

      &lt;h2 id=&quot;what-make-is&quot;&gt;What Make actually is&lt;/h2&gt;
      &lt;p&gt;
        Make is a workflow automation tool, in the same family as Zapier and n8n. You build a &lt;strong&gt;scenario&lt;/strong&gt;: a trigger that starts it, then &lt;strong&gt;modules&lt;/strong&gt; (the steps) that do the work, all laid out on a visual canvas. Read a row, send an email, call an API, filter the junk. It is the same trigger-steps-workflow model I broke down in &lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/blog/what-is-n8n-small-business&quot;&gt;what is n8n&lt;/a&gt;, just with Make's own names on it.
      &lt;/p&gt;

      &lt;h2 id=&quot;what-make-is-great-at&quot;&gt;What Make is genuinely great at&lt;/h2&gt;
      &lt;p&gt;
        Make is particularly useful when a workflow needs visible branching and data transformation:
      &lt;/p&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;strong&gt;Visual flow control.&lt;/strong&gt; Routers split one input down several paths, iterators loop over a list, and aggregators bundle the results back together on the canvas.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Built-in error handling.&lt;/strong&gt; This is the underrated one. You can attach error handlers to a module and choose what happens when a step fails: retry, skip, roll back, or stop cleanly. A failed run does not silently lose your data, which matters the moment a real business process depends on it.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Data stores.&lt;/strong&gt; Make has a small built-in database, so a scenario can remember things between runs: a list of processed orders, a counter, a lookup table. That kind of memory usually means bolting on a spreadsheet elsewhere.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;A broad integration catalog&lt;/strong&gt; plus a generic HTTP module for services with an accessible API. Compare the actual module count and monthly volume before assuming it will be cheaper than &lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/blog/zapier-for-small-business&quot;&gt;Zapier&lt;/a&gt;.&lt;/li&gt;
      &lt;/ul&gt;

      &lt;h2 id=&quot;what-make-costs&quot;&gt;What Make costs&lt;/h2&gt;
      &lt;p&gt;
        Make bills with &lt;strong&gt;credits&lt;/strong&gt;, the term that replaced operations. For non-AI apps, one operation is generally one credit, and most modules use one credit each time they perform an operation. On August 1, 2026, the public pricing page listed Free with 1,000 credits and Core from &lt;strong&gt;$12/month&lt;/strong&gt; for 10,000 credits when billed annually. Prices and AI credit rules may change.
      &lt;/p&gt;
      &lt;p&gt;
        The thing to watch is how credits add up. A scenario with several modules spends a credit per module, per run. At low volume this is comfortable and cheap. As volume climbs, or as scenarios get longer, the credit count grows with every step you add. It is predictable, but it does scale with complexity. I put real numbers next to Zapier and n8n in &lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/blog/zapier-vs-make-vs-n8n-pricing&quot;&gt;Zapier vs Make vs n8n pricing&lt;/a&gt;.
      &lt;/p&gt;

      &lt;h2 id=&quot;where-make-can-pinch&quot;&gt;Where Make can pinch&lt;/h2&gt;
      &lt;p&gt;
        A few honest caveats. First, the learning curve is a little steeper than Zapier. The same power that makes the canvas great also means there is more to understand before your first scenario runs. Second, because credits are spent per module per run, a heavy, many-step automation running thousands of times a month can get more expensive than you expected, and you cannot host it yourself to escape the meter.
      &lt;/p&gt;
      &lt;p&gt;
        Third, watch your scheduled triggers. A scenario that polls for new data runs on a timer whether or not anything is waiting, so one set to check every 15 minutes wakes up around 2,880 times a month. Exactly how those empty checks are billed has shifted as Make moved from operations to credits, so confirm the current rules for your plan in &lt;a href=&quot;https://www.make.com/en/help/&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;Make's docs&lt;/a&gt;. Either way the safe habit is the same: use instant (webhook) triggers where the app supports them, and do not poll more often than you actually need.
      &lt;/p&gt;
      &lt;p&gt;
        None of these is a dealbreaker. They are just the trade-offs to know before you commit a core business process to it.
      &lt;/p&gt;

      &lt;h2 id=&quot;what-you-can-automate&quot;&gt;What you can automate with Make&lt;/h2&gt;
      &lt;p&gt;
        Theory is dull, so here is what Make actually does for a small team. Each of these is a real scenario you can build:
      &lt;/p&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;strong&gt;Catch and follow up on new leads&lt;/strong&gt; before they go cold, pulling them from forms, email, and chat into one place. See &lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/blog/small-business-automation-philippines&quot;&gt;small business automation in the Philippines&lt;/a&gt;.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Route one input down several paths at once&lt;/strong&gt;, which is where Make's visual canvas earns its keep: send a new order to your CRM, your accounting sheet, and a Slack channel in a single scenario.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Turn a free Google Form into a real intake pipeline&lt;/strong&gt;, so submissions are logged, tagged, and acted on automatically. See the &lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/blog/free-business-automation-google-forms-no-zapier&quot;&gt;free Google Forms automation, no Zapier needed&lt;/a&gt;.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Replace manual copy-paste&lt;/strong&gt; between the tools you already pay for, so nobody moves data by hand all day.&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;
        None of these need a developer on staff. They need a clear process and a tool that can run it. Before you commit, it is worth knowing what the same workflow would cost on each platform, which I broke down in &lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/blog/cost-to-automate-lead-follow-up-philippines&quot;&gt;how much it costs to automate lead follow-up&lt;/a&gt;.
      &lt;/p&gt;

      &lt;h2 id=&quot;is-make-right&quot;&gt;Is Make right for your business?&lt;/h2&gt;
      &lt;p&gt;
        For a lot of small businesses, yes. Make is an excellent fit when your automations have real branching logic, when you want to actually see the workflow as a diagram, and when you are price-sensitive on multi-step scenarios where Zapier would charge more. If you like the visual approach and your volume is moderate, Make is a genuinely good home.
      &lt;/p&gt;
      &lt;p&gt;
        It is the wrong fit when self-hosting is a requirement or when repeated modules make the credit budget unattractive. In those cases, compare &lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/blog/what-is-n8n-small-business&quot;&gt;n8n&lt;/a&gt;, which offers a self-hosted option and bills Cloud by complete workflow executions. If the workflow is only Forms to Sheets or another connection the vendor already provides, use that native route first. The &lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/blog/zapier-vs-make-vs-n8n-pricing&quot;&gt;pricing comparison&lt;/a&gt; shows how to calculate the same workflow under each billing model.
      &lt;/p&gt;

      &lt;h2 id=&quot;where-to-learn-make&quot;&gt;Where to learn Make&lt;/h2&gt;
      &lt;p&gt;
        Make has the best learning resource of the three big tools, and it is their own: &lt;a href=&quot;https://academy.make.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;Make Academy&lt;/a&gt;. It is free, self-paced, runs from Foundation to Advanced, and you earn real Credly badges you can put on LinkedIn. Plan on roughly 15 hours for the full path. If you only do one tool's training properly, make it this one, and build the examples in your own account as you go rather than just watching. That is the difference between having seen it and being able to do it.
      &lt;/p&gt;

      &lt;h2 id=&quot;where-to-start&quot;&gt;Where to start&lt;/h2&gt;
      &lt;p&gt;
        Pick the most annoying repetitive task in your week and describe it in one sentence: when X happens, do Y, then tell me. Build that single scenario on the free plan and let it run for a week. Keep the first one small; a scenario that reliably saves ten minutes a day teaches you more than an ambitious one that breaks on its first edge case. Once it is running, the next handful of tasks become obvious. If you would rather have the first few built properly, with error handling so they do not fail silently, that is what I do.
      &lt;/p&gt;

      &lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href=&quot;https://www.make.com/en&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;make.com&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;https://www.make.com/en/integrations&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;Make integrations directory (3,000+ apps)&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;https://www.make.com/en/pricing&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;Make pricing&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;https://help.make.com/credits&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;Make credits documentation&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;

            &lt;nav class=&quot;article-related&quot; aria-label=&quot;Related reading&quot;&gt;
        &lt;p class=&quot;article-related-h mono&quot;&gt;Keep reading&lt;/p&gt;
        &lt;ul&gt;
        &lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/blog/zapier-for-small-business&quot;&gt;Zapier for Small Business&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/blog/what-is-n8n-small-business&quot;&gt;What Is n8n? A Guide for Small Business&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/blog/zapier-vs-make-vs-n8n-pricing&quot;&gt;Zapier vs Make vs n8n Pricing&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/nav&gt;

      &lt;div class=&quot;article-cta&quot; style=&quot;margin-top: 24px;&quot;&gt;
        &lt;p class=&quot;cta-h&quot;&gt;Not sure which tool fits?&lt;/p&gt;
        &lt;p&gt;
          Tell me the most repetitive task in your week. I can map a simple workflow for it and tell you honestly whether to build it on Make, Zapier, or n8n, and what it will cost to run.
        &lt;/p&gt;
        &lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/#contact&quot; class=&quot;btn btn-primary article-cta-button&quot;&gt;Get the map&lt;/a&gt;
      &lt;/div&gt;
&lt;p&gt;&lt;em&gt;Originally published on &lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/blog/make-for-small-business&quot;&gt;FloxoLab&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/25684/make-for-small-business-what-it-is-what-it-costs-and-when-to-use-it</guid>
<pubDate>Fri, 23 Oct 2026 15:50:00 +0000</pubDate>
</item>
<item>
<title>Determinism Is a Core Contract in Build Caching</title>
<link>https://coderlegion.com/23974/determinism-is-a-core-contract-in-build-caching</link>
<description>&lt;p&gt;If you have set up a remote build cache and watched the hit rate sit stubbornly low, nondeterministic outputs are one important suspect — but not the only one. Source churn, changing flags, platform differences, toolchain changes, eviction, and incomplete input declarations also cause misses. Nondeterminism is particularly dangerous because it can quietly reduce reuse or make cached results untrustworthy without producing an obvious build error. It is worth understanding exactly how that happens and how to isolate it.&lt;/p&gt;
&lt;h3 id=&quot;why-determinism-is-the-contract-not-a-nice-to-have&quot;&gt;Why determinism is the contract, not a nice-to-have&lt;/h3&gt;
&lt;p&gt;A build cache works by fingerprinting an action's inputs and using that fingerprint to look up a previously computed output. The entire scheme rests on one assumption: identical inputs produce identical outputs. That is the contract. Break it and one of two bad things happens.&lt;/p&gt;
&lt;p&gt;If the cache keys only on inputs — which is how these systems work — and your action is nondeterministic, then the cache will happily hand back &lt;em&gt;an&lt;/em&gt; output for those inputs, but not necessarily the one a fresh run would produce. Best case, the variation is cosmetic and harmless. Worst case, you have just served a subtly wrong artifact from cache and you will spend a very confusing afternoon. Either way, the cache is now a source of doubt rather than speed.&lt;/p&gt;
&lt;p&gt;Another operational outcome is cascading misses, and that is where determinism stops being abstract.&lt;/p&gt;
&lt;h3 id=&quot;one-bad-action-poisons-everything-downstream&quot;&gt;One bad action poisons everything downstream&lt;/h3&gt;
&lt;p&gt;Builds are graphs. The output of one action is the input to the next. So consider what happens when a single early action — say, a code generator — embeds the current timestamp in its output. Each time that generator actually runs, the file it produces is byte-for-byte different, so its content hash changes.&lt;/p&gt;
&lt;p&gt;Whenever that generator has to execute again — because its entry was evicted, the cache was bypassed, or another declared input changed — it produces a new content digest. Every action that consumes the generated file then sees a different input and misses its previous cache entry. Their outputs feed further actions, so the effect can cascade through the subgraph. You did not merely lose reuse for one action; you invalidated downstream keys even when the semantic content did not need to change.&lt;/p&gt;
&lt;h3 id=&quot;where-nondeterminism-actually-comes-from&quot;&gt;Where nondeterminism actually comes from&lt;/h3&gt;
&lt;p&gt;The sources are mundane, which is what makes them easy to miss. The usual suspects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Timestamps baked into outputs — &lt;code&gt;__DATE__&lt;/code&gt; and &lt;code&gt;__TIME__&lt;/code&gt; macros, build IDs, and the modification times stored inside archive formats like &lt;code&gt;.a&lt;/code&gt;, &lt;code&gt;.tar&lt;/code&gt;, and &lt;code&gt;.zip&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Absolute paths leaking into outputs — debug info that records the full build directory, &lt;code&gt;__FILE__&lt;/code&gt; expansions, paths embedded by the linker. Build the same code in &lt;code&gt;/home/alice&lt;/code&gt; and &lt;code&gt;/home/bob&lt;/code&gt; and you get different bytes.&lt;/li&gt;
&lt;li&gt;Iteration order — generating code by walking a hash map or set, whose iteration order is unspecified, so the output lines come out shuffled run to run.&lt;/li&gt;
&lt;li&gt;Concurrency — actions that assemble output from parallel work without imposing a stable order on the result.&lt;/li&gt;
&lt;li&gt;Randomness — UUIDs, unseeded PRNGs, anything that reaches for entropy at build time.&lt;/li&gt;
&lt;li&gt;The ambient environment — locale, hostname, username, and stray environment variables that the action reads but never declared as inputs.&lt;/li&gt;
&lt;li&gt;Filesystem ordering — relying on &lt;code&gt;readdir&lt;/code&gt; order, which varies across filesystems and runs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of these throws an error. Each just makes one action's output wiggle, and the cache does the rest of the damage.&lt;/p&gt;
&lt;h3 id=&quot;how-to-hunt-them-down&quot;&gt;How to hunt them down&lt;/h3&gt;
&lt;p&gt;The basic diagnostic is to execute the same build twice from clean, isolated directories with cache reuse disabled, then compare the outputs bit for bit. Anything that differs deserves investigation. &lt;a rel=&quot;nofollow&quot; href=&quot;https://diffoscope.org/&quot;&gt;&lt;code&gt;diffoscope&lt;/code&gt;&lt;/a&gt; is the right tool here — it understands archives, binaries, and debug information and can show not just &lt;em&gt;that&lt;/em&gt; two outputs differ but &lt;em&gt;where&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The fixes are well-trodden, because the reproducible-builds community has been fighting this war for years:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Timestamps: honor &lt;code&gt;SOURCE_DATE_EPOCH&lt;/code&gt; so embedded dates are fixed rather than &quot;now&quot;; build archives in deterministic mode (&lt;code&gt;tar --sort=name --mtime=...&lt;/code&gt;, &lt;code&gt;ar&lt;/code&gt; in its deterministic &lt;code&gt;D&lt;/code&gt; mode).&lt;/li&gt;
&lt;li&gt;Absolute paths: use &lt;code&gt;-ffile-prefix-map&lt;/code&gt; / &lt;code&gt;-fdebug-prefix-map&lt;/code&gt; to rewrite build paths to a stable placeholder, so debug info does not depend on where you built.&lt;/li&gt;
&lt;li&gt;Iteration order: sort before you emit. If codegen walks a map, sort the keys first. Never let an unordered container decide output order.&lt;/li&gt;
&lt;li&gt;Environment: pin the locale (&lt;code&gt;LC_ALL=C&lt;/code&gt;), and run actions in a sandbox that only exposes declared inputs, so an undeclared environment dependency fails loudly instead of silently varying.&lt;/li&gt;
&lt;li&gt;Randomness: seed it, or design it out. A build is not the place for entropy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;hermeticity-is-how-you-keep-it-fixed&quot;&gt;Hermeticity is how you keep it fixed&lt;/h3&gt;
&lt;p&gt;Fixing the determinism bugs you have is half the job. The other half is preventing new ones, and hermetic, sandboxed builds remove many sources of ambient input. A filesystem sandbox can hide undeclared files and tools, and a controlled environment can pin locale and environment variables. Sandboxing alone does not necessarily hide the wall clock, randomness, hostname, kernel details, or every network source; those must be blocked, virtualized, or deliberately normalized. The goal is to make undeclared dependencies fail loudly or become stable rather than silently changing outputs.&lt;/p&gt;
&lt;h3 id=&quot;measure-it-because-it-regresses&quot;&gt;Measure it, because it regresses&lt;/h3&gt;
&lt;p&gt;Determinism is not a one-time cleanup. It rots. Someone adds a code generator, someone embeds a build timestamp &quot;just for diagnostics,&quot; and reuse slides without anyone noticing. Treat cache hit rate as a first-class metric, but segment it by action type, platform, branch, and miss reason because determinism is only one contributor. Track reproducibility separately with scheduled rebuild-and-compare tests. When hit rate drops and action keys churn without meaningful input changes, reach for build-twice-and-diff before blaming the cache infrastructure.&lt;/p&gt;
&lt;p&gt;That is the real point. Determinism is not purity for its own sake. Along with complete input declarations, compatible platforms and toolchains, and retained cache entries, it is a precondition for trustworthy reuse. Get it wrong and the cache may return questionable outputs or lose reuse across a large subgraph. Get it right and equivalent actions can reliably share results across developers and CI. Determinism is not the whole cache system, but it is part of its correctness contract.&lt;/p&gt;
&lt;p&gt;Further reading: the &lt;a rel=&quot;nofollow&quot; href=&quot;https://reproducible-builds.org/docs/&quot;&gt;Reproducible Builds documentation&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/23974/determinism-is-a-core-contract-in-build-caching</guid>
<pubDate>Tue, 04 Aug 2026 14:30:00 +0000</pubDate>
</item>
<item>
<title>Understanding Systemd.exec - Part 1: How to Secure Applications Running in Systemd?</title>
<link>https://coderlegion.com/16114/understanding-systemd-exec-part-1-how-to-secure-applications-running-in-systemd</link>
<description>
&lt;p&gt;Hello, I'm Ganesh. I'm building &lt;em&gt;git-lrc&lt;/em&gt;, an AI code reviewer that runs on every commit. It is free, unlimited, and source-available on GitHub. &lt;a href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;Star Us&lt;/a&gt; to help devs discover the project. Do give it a try and share your feedback for improving the product.&lt;/p&gt;

&lt;p&gt;If you are running applications with systemd and want to restrict how they interact with Linux kernel features (like filesystem, processes, and capabilities), you can use the systemd.exec configuration options. &lt;/p&gt;

&lt;p&gt;In this article I will be going to explain how to use these options to secure your application.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are systemd.exec options?
&lt;/h2&gt;

&lt;p&gt;Systemd.exec options are a set of configuration options that are used to configure how a systemd service interacts with the Linux kernel. &lt;/p&gt;

&lt;p&gt;This feature is mainly used to provide security for the applications running in systemd.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why we need this option in first place?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hardening services (Postgres, Nginx, workers, etc) which are mostly open to the internet&lt;/li&gt;
&lt;li&gt;Reducing blast radius after compromise &lt;/li&gt;
&lt;li&gt;Lightweight (no container overhead)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How is this different from Docker?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Works on a single process/service.&lt;/li&gt;
&lt;li&gt;Applies restrictions on top of the host.&lt;/li&gt;
&lt;li&gt;Uses kernel features (namespaces, cgroups, capabilities)&lt;/li&gt;
&lt;li&gt;Shares the same root filesystem (by default)&lt;/li&gt;
&lt;li&gt;No packaging, no images&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is the real usecase?
&lt;/h2&gt;

&lt;p&gt;Let's take an example of service.&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;/etc/systemd/system/myapp.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside this file, we can control:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where the app runs&lt;/li&gt;
&lt;li&gt;Which user it runs as&lt;/li&gt;
&lt;li&gt;What it can access&lt;/li&gt;
&lt;li&gt;How secure / isolated it is&lt;/li&gt;
&lt;li&gt;What resources it can use&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Most common options
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Run a service as non-root (security)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Set &lt;code&gt;User=&lt;/code&gt; &lt;code&gt;Group=&lt;/code&gt; to a non-privileged user (e.g. &lt;code&gt;postgres&lt;/code&gt;, &lt;code&gt;www-data&lt;/code&gt;).&lt;br&gt;
This will prevent the service from running as root, which can lead to security vulnerabilities.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Service]
&lt;span class=&quot;nv&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;postgres
&lt;span class=&quot;nv&quot;&gt;Group&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;postgres
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Restrict filesystem access&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Set &lt;code&gt;ProtectSystem=&lt;/code&gt; &lt;code&gt;ProtectHome=&lt;/code&gt; &lt;code&gt;ReadWritePaths=&lt;/code&gt; &lt;code&gt;ReadOnlyPaths=&lt;/code&gt; to control filesystem access.&lt;br&gt;
This will make service only read/ write specifed directory.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Service]
&lt;span class=&quot;nv&quot;&gt;ProtectSystem&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;strict
&lt;span class=&quot;nv&quot;&gt;ProtectHome&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;yes
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ReadWritePaths&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/lib/postgresql
&lt;span class=&quot;nv&quot;&gt;ReadOnlyPaths&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/lib/postgresql/16/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Isolate runtime environment (like lightweight container)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Set &lt;code&gt;PrivateTmp=yes&lt;/code&gt; &lt;code&gt;NoNewPrivileges=yes&lt;/code&gt; to isolate runtime environment.&lt;br&gt;
As there is no container like docker this will be running in the host but under private tmp and no new privileges.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Service]
&lt;span class=&quot;nv&quot;&gt;PrivateTmp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;yes
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;NoNewPrivileges&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Limit resources (avoid abuse / crashes)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Set &lt;code&gt;CPUQuota=&lt;/code&gt; &lt;code&gt;MemoryMax=&lt;/code&gt; &lt;code&gt;MemoryHigh=&lt;/code&gt; &lt;code&gt;MemoryLimit=&lt;/code&gt; &lt;code&gt;MemoryAccounting=&lt;/code&gt; to limit resources.&lt;br&gt;
If we want specific service to use only limited resources, we can use these options.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Service]
&lt;span class=&quot;nv&quot;&gt;CPUQuota&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;50%
&lt;span class=&quot;nv&quot;&gt;MemoryMax&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;512M
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Provide controlled writable directories
Set &lt;code&gt;ReadWritePaths=&lt;/code&gt; &lt;code&gt;ReadOnlyPaths=&lt;/code&gt; to control filesystem access.
This will make service only read/ write specifed directory.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Service]
&lt;span class=&quot;nv&quot;&gt;ReadWritePaths&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/lib/postgresql
&lt;span class=&quot;nv&quot;&gt;ReadOnlyPaths&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/lib/postgresql/16/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Drop dangerous privileges&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Set &lt;code&gt;CapabilityBoundingSet=&lt;/code&gt; to drop dangerous privileges.&lt;br&gt;
This will make service only able to run commands with specific privileges.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Service]
&lt;span class=&quot;nv&quot;&gt;CapabilityBoundingSet&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;CAP_NET_BIND_SERVICE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Run temporary / ephemeral services
Set &lt;code&gt;RuntimeDirectory=&lt;/code&gt; &lt;code&gt;StateDirectory=&lt;/code&gt; &lt;code&gt;LogsDirectory=&lt;/code&gt; to run temporary / ephemeral services.
This will run the service in a temporary / ephemeral directory.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Service]
&lt;span class=&quot;nv&quot;&gt;RuntimeDirectory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;myapp
&lt;span class=&quot;nv&quot;&gt;StateDirectory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;myapp
&lt;span class=&quot;nv&quot;&gt;LogsDirectory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;myapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Limit process / thread count
Set &lt;code&gt;TasksMax=&lt;/code&gt; to limit process / thread count.
This will make service only able to run with specific process / thread count.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Service]
&lt;span class=&quot;nv&quot;&gt;TasksMax&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Restrict access to system calls
Set &lt;code&gt;SystemCallFilter=&lt;/code&gt; &lt;code&gt;SystemCallArchitectures=&lt;/code&gt; to restrict access to system calls.
This will make service only able to use specific system calls.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Service]
&lt;span class=&quot;nv&quot;&gt;SystemCallFilter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;open,read,write,close
&lt;span class=&quot;nv&quot;&gt;SystemCallArchitectures&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;amd64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Security measures for Docker Engine
Set &lt;code&gt;Delegate=yes&lt;/code&gt; to run Docker Engine with specific privileges.
This will make Docker Engine only able to run with specific privileges.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Service]
&lt;span class=&quot;nv&quot;&gt;Delegate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;We could able to use systemd.exec options to secure application running in systemd.&lt;/p&gt;

&lt;p&gt;But Until we integrate with real application and test these options, we can't be sure about the security.&lt;/p&gt;

&lt;p&gt;In the next article we will see how service react with integrations of these options.&lt;/p&gt;

&lt;p&gt;Reference Man Page Systemd : &lt;a href=&quot;https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;&lt;img src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabn6nl3iehrohehnxgje.png&quot; alt=&quot;git-lrc&quot; width=&quot;800&quot; height=&quot;373&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Any feedback or contributors are welcome! It&amp;rsquo;s online, source-available, and ready for anyone to use. &lt;br&gt;
&amp;#11088; Star it on GitHub: &lt;a href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;https://github.com/HexmosTech/git-lrc&lt;/a&gt;&lt;/p&gt;


</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/16114/understanding-systemd-exec-part-1-how-to-secure-applications-running-in-systemd</guid>
<pubDate>Sat, 02 May 2026 02:27:26 +0000</pubDate>
</item>
</channel>
</rss>