Pick the builds. Get a live environment

Environment Manager gives you your own Kubernetes namespace with the services you pick: a Harbor tag or your branch. ArgoCD deploys it, and it deletes itself when its time runs out.

From asking for a namespace to one form

Before by hand, through DevOps

  1. Ask someone for a namespace
  2. Edit Helm values and ArgoCD files by hand
  3. Hunt for URLs, ports and database passwords
  4. Forget to delete it; the cluster fills up

Now two steps in Environment Manager

NEW ENVIRONMENT

You pick a parent, the services and how long it lives.

CREATE

Environment Manager commits it; ArgoCD deploys it.

Then, with no clicks:

  • Your branch built
  • URLs grouped, one click to copy
  • JDBC URL, user and password
  • Deleted when its time runs out

How it works

  1. 1

    Sign in

    With your @friendly-tech.com e-mail and a 6-digit code.

    You
  2. 2

    Create

    A name, a parent to share, the services you run yourself, how long it lives.

    You
  3. 3

    Build and deploy

    Branches are built in GitHub Actions; ArgoCD rolls everything out.

    Automatic
  4. 4

    Use

    Open the URLs, connect to the database, read pods and logs, change services.

    You and QA
  5. 5

    Delete on time

    Every hour expired environments are removed, unless you extend yours.

    Automatic

Sign in with a code, not a password

Open env.rd.friendly-tech.com. Only @friendly-tech.com addresses can sign in. A sign-in lasts 3 days.

IllustrationE-mail, then the 6-digit code from the mail.
  • The code lives 15 minutesThe mail is “Environment Manager - Your sign-in code”. A new code can be sent after 60 seconds.
  • Or the link in the mailIt opens a card with a Sign In button. Opening the link alone signs nobody in.
  • Five wrong codesThe code is destroyed. Ask for a new one.

Your environments, and everyone else's

The first tab shows yours. Show all environments adds the rest of the team and the static ones. The list refreshes every 30 seconds.

Environment ManagerKubernetes dev environmentsArgoCDanna.k@friendly-tech.com
EnvironmentsNew environmentSettings
My environmentsAll environments
Show all environments · 5Show only mine · 2 New environment
Pods 48 of 110Yours 10
CPU in use, cores 3.10 of 8.00Yours 0.60
Memory in use 18 Gi of 32 GiYours 3.8 Gi
Storage 96 Gi of 500 GiYours 15 Gi
Filter by name, owner, parent or DBAny state Any type Updated 4 s ago Auto-refresh every 30 s
EnvironmentStateCPU, coresMemoryOwnerExpires
dev-3150partial of dev-mysql · MySQL · 1 serviceStarting220m1.1 Gianna.kin 1 dayLogs⋯
dev-3144full · MySQLHealthy380m2.7 Gianna.kin 5 daysLogs⋯
dev-samlpartial of dev-oracle · Oracle · 2 servicesDegraded140m0.9 Gioleg.sin 18 hLogs⋯
qa-regressfull · OracleStopped0m0 Mimaria.vin 3 daysLogs⋯
Static · 2 — shared, never deleted
dev-mysqlstatic · MySQLHealthy1.204.5 Gi—no auto-deleteLogs⋯
IllustrationA click anywhere on a row opens the environment. Names and numbers are sample data.

What the state means

Healthy
Every resource ArgoCD tracks is healthy.
Starting
ArgoCD is still rolling it out. If it stays here, open Pods for the pod that is not ready.
Out of sync
The cluster differs from git. Self-heal usually clears it; Sync applies git now.
Degraded
A resource is failing or missing. Open Pods for the reason, then Logs.
Stopped
Scaled to zero. Resume brings the same images back.
  • The bars on topPods, CPU, memory and storage of the whole cluster. The dark part is yours, the light part is everyone else.
  • Logs on every rowOpens the environment straight on its Logs tab. ⋯ holds Sync with ArgoCD, Stop or Resume, and Delete.
  • Static environmentsdev-mysql, dev-oracle, latest-mysql, latest-oracle are shared and never deleted. They are the parents of partial environments.

Create an environment for your branch

Tab New environment. The usual case is a partial environment: you run only what you changed, everything else comes from a parent such as dev-mysql.

EnvironmentsNew environmentSettings
New environment

A Kubernetes namespace with the services you tick. It appears in your list as soon as you create it.

Name
Lowercase letters, digits and hyphens · becomes the Kubernetes namespace
Delete automatically
After 1 day
You can extend it later from the environment
Type
Partial — runs on a parent’s database
Parent environment
dev-mysql · MySQL
Shares its database, and every service you leave on it

Services

Every service starts from dev-mysql. Pick Harbor tag or Branch to run your own version of it here.

ServiceSourceVersion
ACSdev-mysqlHarbor tagBranchv7.1.2feat/loginbuilds on Create
UI Backenddev-mysqlHarbor tagBranchv7.1.2
UI Portalsdev-mysqlHarbor tagBranchv7.1.2
Optional, Helm-managed · 1 — never shared; runs here or not at all
Grafana☐ Run in this environment
Partial of dev-mysql · 0 services · deleted after 1 day (Oct 11)Partial of dev-mysql · 1 of your own · ACS from feat/login · deleted after 1 day (Oct 11) Create environment
dev-3150 is created

ArgoCD is deploying it. 1 service builds from a branch first and starts once its image is ready. You can leave this page.

ACS from feat/loginBuilding · run #4182
Open dev-3150Create another
IllustrationName it, switch ACS to your branch, Create. The branch is built and the environment appears in your list.
  • NameLowercase letters, digits and hyphens, up to 63. It becomes the namespace and part of every URL: ftacs.dev-3150.rd.friendly-tech.com.
  • Delete automaticallyAfter 1 day by default; 3, 7, 14 or 30 days, or Never. You can extend it later.
  • BranchBuilt by the service's GitHub Actions workflow. The Harbor tag is the branch name made safe: feat/login becomes feat-login.
  • Enable ArgoCD Image UpdaterRedeploys when the tag you picked is pushed again. It never moves to another tag.

Type: Partial or Full

The one choice that decides where the database, the infrastructure and every service you do not touch come from.

Partial — default

Your services on a parent’s base

dev-3150your namespace
ACS · feat-login
dev-mysqlparent
MySQLHazelcastClickHouseUI BackendUI PortalsFT Configs Service…every service you left on it
What runs in yours
Only the services you switch to Harbor tag or Branch. Every other row stays on the parent’s name.
Where the rest comes from
The parent: its database and infrastructure (MySQL or Oracle, Hazelcast, ClickHouse) and every service you did not pick. Your services reach them inside the cluster at <service>.dev-mysql.svc.cluster.local.
Which parent
A running full or static environment: dev-mysql by default, dev-oracle for Oracle, or a teammate’s full one.
Take into account
  • The data is shared. You write into the parent’s database; everyone on that parent sees it.
  • The parent must run. If it is stopped or deleted, your environment stops working.
  • Nothing is added for you. If your change needs a new version of another service too, switch that one as well.
  • Parent URLs lead to the parent. Overview lists them under “From dev-mysql”.
Full

Everything of its own

dev-3144your namespace, no parent
ACS · latestFT Configs Service · needed by ACSHazelcast · needed by ACSMySQL or Oracle · its own
What makes it full
Its own database (you choose MySQL or Oracle) and its own infrastructure in its own namespace. It depends on no other environment.
What runs
Nothing until you pick it. What a service needs is switched on with it, at Harbor tag latest, marked needed by; its Off option is locked while something needs it.
What pulls in what
ACS → FT Configs Service and Hazelcast · UI Backend → ACS and FT Device Network · UI Portals → UI Backend · UI AI Agent → AI Agent Sandbox.
Take into account
  • Heavier. It takes more CPU, memory and storage from the cluster (the bars on the list) and longer to start.
  • Its data is its own. Nothing from dev-mysql is in it, and nobody else writes to it.
  • It can be a parent. Teammates can run partial environments on it while it runs.
Choose Partial

You change one or two services and test them against the usual data. Most branches.

Choose Full

You need clean or private data, a database migration, Oracle on your own, or a base for others.

QA: everything about one environment in one window

Click its row. Four tabs: Overview, Pods, Services, Logs. Nothing to look up elsewhere.

IllustrationCopy a URL, copy the JDBC URL, restart a crashing pod, search its log.
  • Service URLsGrouped (Core, APIs, Portals…). Base copies the host, Swagger / UI / Metrics the full link. URLs from the parent are listed apart: those requests go to the parent.
  • DatabasePick a database (ftacs, admin, configs…) and copy JDBC, User or Password. Ports list the NodePorts for MySQL, MQTT, USP and JDWP debug.
  • PodsStatus shows the reason, e.g. CrashLoopBackOff. ⋯ → Restart pod… or Restart deployment… (same tag, rolling).
  • LogsOpens on the pod that needs attention most. Search with Enter / Shift+Enter, Previous container (after a crash), Follow · every 5 s. Stack traces are folded.

What the Overview tab gives you

Everything you need to connect to the environment: links, device ports, debug ports and the database. Each copy button puts the value on your clipboard.

dev-2358-2Healthy
partial of dev-mysql · MySQL · Expires in 17 h Extend
OverviewPods 7Services 7Logs
1
Service URLs 7
CORE
ACSftacs.dev-2358-2.rd.friendly-tech.com/rest/swagger-uiBaseSwagger
ACS SOAP WSDLftacs.dev-2358-2.rd.friendly-tech.com/ACSServer-ACSBaseUI
TESTING
TR-069 Emulatortr069-emulator.dev-2358-2.rd.friendly-tech.comBase
2
From dev-mysql 10 — these requests reach the parent, not this environment
Northbound API parentnbi-api.dev-mysql.rd.friendly-tech.com/iot-webserviceBaseSwagger
3
Device connection 10
MQTT31709→ 1883
MQTT TLS32409→ 8883
USP CoAP32209→ 5783
USP WebSocket31809→ 8025
4
Debug (JDWP) 5
FT Configs Service31509
ACS30809
5
Database shared
ftacsJDBC · User · Password

IllustrationNumbers and names are sample data. Ports differ per environment.

  1. 1
    Service URLs — this environmentLinks to the services that run in your namespace, grouped Core, APIs, Portals, Testing… Base copies http://host; Swagger / UI / Metrics copy the full link.
  2. 2
    From the parent partial onlyServices you left on the parent. Requests to these links go to the parent, not to your environment — test your change on the links in block 1.
  3. 3
    Device connectionPorts for real devices and emulators: MQTT, USP (CoAP, DTLS, MQTT, STOMP, WebSocket, Bulk) and more. Left: the NodePort to connect to from outside the cluster; right: the port inside. Point the device at dev-2358-2.rd.friendly-tech.com:31709 (the same host the JDBC URL uses). Every environment has its own numbers: base + its port offset (Details).
  4. 4
    Debug (JDWP)Every dynamic environment runs with debug on. In IntelliJ: Run → Edit Configurations → Remote JVM Debug, host = the environment host, port = the number next to the service, e.g. FT Configs Service 31509. Breakpoints then stop the running pod.
  5. 5
    DatabasePick a database (ftacs, admin, configs…) and copy JDBC, User or Password into your SQL client. shared means it is the parent’s: writes reach every environment on it.

Developer: change what runs, without a new environment

Tab Services. Switch a service to another tag or your branch, take it back to the parent, or turn it off. Nothing changes until Apply changes.

OverviewPods 7Services 1Logs
ServiceRunning nowSourceVersion
ACSchangedfeat-loginv7.1.3dev-mysqlHarbor tagBranchfeat/loginv7.1.3
UI Backendfrom dev-mysqldev-mysqlHarbor tagBranchv7.1.2
1 change · ACS feat/login → v7.1.3
Apply commits to git, then ArgoCD syncs; changed services roll out.
DiscardApply changes
Changes applied to dev-3150
IllustrationACS goes from your branch to a release tag.

Reading the Services tab

OverviewPods 7Services 7Logs
ServiceRunning now 1Source 2Version 3Build 4
Services · 18
ACSlatestsha256:20be7847fbc1dev-mysqlHarbor tagBranchlatestpick a branch first
UI Backendfeature/dev-2358sha256:b90b106ecb15dev-mysqlHarbor tagBranchfeature/dev-2358Build
UI Portalsfrom dev-mysqldev-mysqlHarbor tagBranchdev
AI Agent Sandboxfrom dev-mysqldev-mysqlHarbor taglatest
  1. 1
    Running nowWhat the pod runs at this moment: the tag and its image digest, or from dev-mysql when the parent serves it. Compare it with Version to see whether your change has rolled out.
  2. 2
    Sourcedev-mysql (the parent’s name; Off on a full environment) — not yours. Harbor tag — a ready image. Branch — your git branch, built for you. Highlighted rows are the ones you run yourself. A service without a git repository has no Branch, e.g. AI Agent Sandbox.
  3. 3
    VersionThe tag or branch to run. The list comes from Harbor (tags) or GitHub (branches).
  4. 4
    BuildOnly for Branch. Builds the branch into a Harbor tag: Dispatched → Building → Built. Until a branch is picked it says pick a branch first.
Run your branch here
  1. Source → Branch, pick your branch in Version.
  2. Press Build and wait for Built.
  3. Press Apply changes at the bottom. ArgoCD rolls the service out; Running now shows your branch.
Go back to the parent
  1. Source → dev-mysql, then Apply changes. Your pod stops; requests go to the parent again.
  • New commits on your branchPress Build again in the row, then Apply if the tag changed. With Image Updater on, a rebuilt tag is redeployed by itself.
  • ApplyCommits the change to git and ArgoCD rolls the service out. If it fails, your changes stay and Retry apply is offered.
  • Static environments are read-onlydev-mysql and the others change through GitOps, not here. Their Services tab only shows what runs.

Every environment has a delete-by time

So the cluster does not fill up with forgotten namespaces. Extend it from the environment when you need it longer.

  1. Created

    Expires in 1 day

    The time starts with Create.

  2. Extend

    +1 · +3 · +7 · +14 days

    Added to the current expiry. Never-expiring ones get Set expiry… instead.

  3. Stop

    Scaled to 0

    Volumes and the database are kept. The time keeps running.

  4. Resume

    Same images back

    Same replica counts, ArgoCD auto-sync on again.

  5. Expired

    Under 24 h: ⚠

    The list warns on the last day.

  6. Deleted

    Hourly cleanup

    Namespace, ArgoCD app and volumes. Stopped ones too.

IllustrationDelete can also be pressed by hand: ⋯ → Delete environment…. It cannot be undone.

When something goes wrong

The state tells you where to look. The messages say what to do.

Build failedYour branch did not build

  • That service does not start
  • Fix the branch and press Build again in Services
  • Or pick a Harbor tag for it instead

DegradedA pod is failing

  • Pods shows the reason (CrashLoopBackOff, OOMKilled…)
  • Logs opens on that pod; tick Previous container after a crash
  • On a partial: is the parent running? A stopped parent breaks its partials

Couldn’t …env-manager did not answer

  • Check your connection (VPN) and try again
  • “Kubernetes or ArgoCD isn’t reachable”: wait a minute and retry

CarefulAnyone can delete a dynamic environment

  • There is no owner check on Delete
  • Look at the Owner column before you press it

Questions we get

I pushed again to my branch. How do I get it?

Services → Build in that row. With Image Updater on, ArgoCD redeploys by itself when the tag is pushed again.

Does Restart deployment pull my new image?

Only for :latest or imagePullPolicy Always. To run another tag, change it in Services.

Why can’t I change dev-mysql?

Static environments are the shared base for partial ones. They change through GitOps, and only admins can stop or resume them.

My test data showed up in someone else’s environment.

A partial environment uses its parent’s database. Create a Full one when you need your own data.

Who sees my environment?

Everyone, under Show all environments, with you as the owner.

It stays in Starting.

A branch build may still be running, or a pod is not ready. Open Pods for the one that is not ready, then its Logs.

Questions?

Create one for your next branch. Tell us what was unclear, what was missing or what broke.

What was unclear?A label, a state or a message you had to read twice.
What was missing?A service, a URL or a port you had to look up elsewhere.
For developers of the toolEndpoints, settings and tests in the env-manager README.
Open Environment Manager