ETMS Cloud

Infrastructure Management Login

{{ loginError }}

{{ view }}

{{ currentUser.username[0].toUpperCase() }}
{{ currentUser.username }}
{{ currentUser.role || 'user' }}
🎁

New Version Available! v{{ versionInfo.latest_version }}

A new update is available. Current version: v{{ versionInfo.current_version }}.

{{ versionInfo.changelog }}
DEPLOYMENT LOGS: {{ task.type }}
{{ task.error ? 'FAILED' : (task.finished ? 'COMPLETED' : 'IN PROGRESS') }}
{{ log.message }} ...
{{ log.detail }}
Identity Resources Status Apps Actions
{{ site.subdomain }}
{{ site.domain }}
{{ site.bench_name }} ({{ getBenchVersion(site.bench_name) }}) Pending Apps Delete Requested
Assigned: {{ assign.username || ('ID: ' + assign.user_id) }} None
{{ site.metrics?.cpu || '0%' }} {{ site.metrics?.mem || '0MB' }} {{ site.metrics?.disk || '0MB' }}
Maint
Failure
Active
Page {{ sitePage }} of {{ totalSitePages }}
Page {{ appsPage }} of {{ totalAppsPages }}
ID: {{ b.id }}

{{ b.name }}

{{ b.frappe_version }} Update Available
Sites: {{ sites.filter(s => s.bench_name === b.name).length }} Status: Ready
Assigned Users:
{{ usr.username }} No assignments
{{ tag.tag_name }}
{{ t.name }}
Page {{ benchPage }} of {{ totalBenchPages }}

Bench Groups

{{ g.name }}

{{ new Date(g.created_at).toLocaleDateString() }} {{ g.version }}

{{ g.description }}

No description provided.

{{ bName }}
No benches in this group.
Total Sites in Group: {{ sites.filter(s => g.bench_names.includes(s.bench_name)).length }} Sites
No bench groups found matching your search. Click "New Group" to create one!
Page {{ benchGroupsPage }} of {{ totalBenchGroupsPages }}

Server Status

{{ s.name }}

{{ s.status }}

Created At: {{ new Date(s.created_at).toLocaleDateString() }}

CPU Cores {{ s.cpu_cores }} Cores
Total RAM {{ s.ram_gb }} GB
Disk Storage {{ s.disk_gb }} GB
Active Resources {{ benches.length }} Benches / {{ sites.length }} Sites 0 Benches / 0 Sites
CPU Load {{ s.metrics.cpu_percent }}% 0%
RAM Consumption {{ s.metrics.ram_used_gb }} GB / {{ s.ram_gb }} GB ({{ s.metrics.ram_percent }}%) 0 GB / {{ s.ram_gb }} GB (0%)
Disk Occupied {{ s.metrics.disk_used_gb }} GB / {{ s.disk_gb }} GB ({{ s.metrics.disk_percent }}%) 0 GB / {{ s.disk_gb }} GB (0%)
No servers found matching your search. Try adjusting your query or click "Add Server" to add a new node!

System Activities

ActionTargetStatusTime
{{ a.job_type }} {{ a.target }} {{ a.status }} {{ new Date(a.created_at).toLocaleString() }}
No activities recorded matching criteria.
Page {{ activitiesPage }} of {{ totalActivitiesPages }}

System Configuration

Configure external platform integrations and custom system tags

Integrations

Connect your external accounts to automate workflows and sync data across platforms.

GitHub Integrations
{{ githubAccounts.length }} Account{{ githubAccounts.length > 1 ? 's' : '' }} Connected Not Connected
{{ acc.alias }}
@{{ acc.username }}
{{ acc.type === 'others' ? 'Others' : 'ETMS' }} Expired Checking Offline Active

No GitHub Accounts Connected

Connect one or more GitHub accounts to easily pull private repositories into benches.

Connecting your GitHub accounts allows you to import repositories as global applications directly from your integrations.

AI & Diagnostics
{{ aiProvidersList.length }} Provider{{ aiProvidersList.length > 1 ? 's' : '' }} Configured Disabled
{{ prov.alias }} Active Expired / Failed
{{ prov.provider === 'gemini' ? 'Google Gemini' : prov.provider === 'openai' ? 'OpenAI' : 'Ollama' }} {{ prov.model }}
Connected
Failed
{{ prov.testError }}

No AI Providers Connected

Connect one or more AI providers like Google Gemini or OpenAI to enable log diagnostics.

Enabling AI diagnostics allows the platform to analyze server logs, identify deployment issues, and recommend one-click automated fixes.

Categorization

Create and manage custom tags to organize your sites, benches, and applications dynamically.

Tags Management

Organize system items dynamically with custom labels

Create New Tag
System Tags
No tags created yet.
{{ tag.name }}

Change Password

Secure your account by updating your credential secret

{{ profileError }}
Password changed successfully!

Users ({{ iamUsers.length }})

UsernameRoleBench AssignmentsSite AssignmentsManage
{{ usr.username[0].toUpperCase() }}
{{ usr.username }} Superuser Active Deactivated
{{ usr.created_at ? new Date(usr.created_at).toLocaleDateString() : '' }}
{{ getRoleBadge(usr.role).label }}
{{ b }}
{{ s.subdomain }}

All Assignments

UserRoleTypeResourceAction
No assignments yet — use the buttons above to assign benches or sites to users
No jobs recorded matching criteria.
{{ j.job_type }}
{{ j.target }}
{{ j.status }} {{ new Date(j.started_at).toLocaleString() }}
Loading pipeline steps...
No steps recorded for this job.
Pipeline Steps ({{ jobSteps.length }}) All Completed
{{ new Date(s.created_at).toLocaleTimeString() }}
Page {{ jobsPage }} of {{ totalJobsPages }}
ActionTargetError SummaryDetailTime
{{ log.job_type }} {{ log.target }} {{ log.error_summary }} {{ new Date(log.created_at).toLocaleString() }}
No error logs recorded matching criteria.
Page {{ logsPage }} of {{ totalLogsPages }}

{{ editingGithubAccountIndex !== null ? 'Edit GitHub Account' : 'Connect GitHub' }}

Generate a token with repo permissions on GitHub settings to allow cloning.

{{ editingAiProviderIndex !== null ? 'Edit AI Provider' : 'Connect AI Provider' }}

New Bench

Provision Site

Create a new site in one of your active benches.

Default Login Credentials After the site is successfully created, log in to Frappe using:
Username: Administrator (case-sensitive)
Password: changeme
.etms.cloud
{{ siteNameError }}
Loading apps...
No apps found on this bench

Database Backup

Upload database file (.sql or .sql.gz)

{{ newSiteFileNames.db }}

Public Files

Upload public files (-files.tar)

{{ newSiteFileNames.public }}

Private Files

Upload private files (-private-files.tar)

{{ newSiteFileNames.private }}

Site Config

Upload config file (-site_config_backup.json)

{{ newSiteFileNames.config }}
{{ liveBackupsError }}

{{ liveBackupsList.length }} backup(s) found — latest shown first.

Rename Bench

Drop Bench?

This action is irreversible. All associated sites and data will be permanently destroyed. Are you absolutely sure?

{{ userToToggleActive?.is_active !== false ? 'Deactivate' : 'Activate' }} User?

Are you sure you want to {{ userToToggleActive?.is_active !== false ? 'deactivate' : 'activate' }} account for "{{ userToToggleActive?.username }}"? The user will not be able to log in to the dashboard anymore. The user will be able to log in and use the dashboard.

Uninstall {{ appToUninstall }}?

This action is irreversible. All data associated with the {{ appToUninstall }} app on {{ siteToActOn?.subdomain }} will be permanently deleted. Are you absolutely sure?

Renew SSL Cert?

This will force Let's Encrypt to renew the SSL certificate for {{ siteToRenewSSL?.domain }} and all of its custom domains. Would you like to proceed?

Update Site?

This will run database migrations on {{ siteToUpdate?.subdomain }}. A safety backup will be automatically taken before modifying the database. Proceed?

Delete Site?

This action is completely irreversible. The site {{ siteToDelete?.subdomain }} along with its database and all uploaded files will be permanently purged.

Please type {{ siteToDelete?.subdomain }} to confirm:

Request Deletion?

This will submit a request to the system administrators to delete the site {{ siteToRequestDelete?.subdomain }}.

Please type {{ siteToRequestDelete?.subdomain }} to confirm:

{{ targetStatus === 'Maintenance' ? 'Deactivate Site?' : 'Activate Site?' }}

This will put {{ siteToToggle?.subdomain }} into maintenance mode, making it inaccessible to users. Proceed? This will bring {{ siteToToggle?.subdomain }} back online and accessible. Proceed?

Clear Site Cache?

This will flush Redis cache and clear compiled files for {{ siteToClearCache?.subdomain }}. The next page load might be slightly slower.

{{ siteToActOn?.scheduler_enabled ? 'Disable Scheduler?' : 'Enable Scheduler?' }}

Are you sure you want to {{ siteToActOn?.scheduler_enabled ? 'disable' : 'enable' }} the background scheduler for site {{ siteToActOn?.subdomain }}?

Missing Apps on Target Bench

The remote live site contains applications that are not installed on the target bench.
Please add these apps to the bench before proceeding with the restore.

Missing Applications ({{ missingAppsData.missing.length }})
{{ app }} Not in bench
Available Bench Apps ({{ missingAppsData.bench.length }})
{{ app }}

How to Resolve

Navigate to {{ missingAppsData.bench_name }} settings and add the missing applications using "Fetch Apps", then retry the restoration.

Application Version Mismatch

The backup contains newer application versions than those currently installed on the target container. Choose an action to resolve the conflict:

Mismatched Applications
{{ app }}
Server: {{ info.container_version }} Backup: {{ info.database_version }}

Backups: {{ siteToActOn?.subdomain }}

Take a new manual backup now:
No backups found for this site.
File Name Size Date Download
{{ b.name }} {{ b.size }} MB {{ new Date(b.time * 1000).toLocaleString() }}
DL

Restore Backup

Selected Backup:

{{ backupToRestore?.name }}

* Warning: This will overwrite the target site's database and files.

Critical Action

You are about to overwrite {{ targetSiteForRestore?.subdomain }}. This will permanently erase its current database and files and replace them with the selected backup. Are you absolutely certain?

Backup Selected
{{ backupToRestore?.name }}

Site Config (JSON)

Editing: {{ siteToActOn?.subdomain }}

Manage Domains

Primary Domain
{{ siteToActOn?.domain }}
Primary
Custom DomainActions
No custom domains added yet.
{{ dom }}

Add App

Step {{ fetchAppsWizardStep }} of 2: Add app to {{ benchToActOn?.name }}

Delete Bench Group?

Are you sure you want to delete the group "{{ groupToDelete?.name }}"? This action is permanent and cannot be undone. Note: Deleting this group will not delete the benches belonging to it.

Add Server

Delete Server?

Are you sure you want to remove the server "{{ serverToDelete?.name }}"? This will disconnect the server registry from the manager.

Create Bench Group

Please select a Frappe version first.
No matching benches found.

Bulk Update: {{ selectedGroupForUpdate?.name }}

Select target versions for apps inside all benches of the group. If an app is not installed on a specific bench, it will be skipped automatically.

{{ editingApp ? 'Edit App' : 'Add New App' }}

No connected GitHub accounts found for {{ appForm.type === 'etms' ? 'ETMS' : 'Others' }} category. Go to Settings to connect one.
Fetching Frappe repositories...
{{ filteredFrappePublicRepos.length }}/{{ frappePublicRepos.length }}
No matching repositories
{{ repo.name }}
{{ repo.description }}
{{ selectedImportRepoFullName }}
Click "Load Repos" to browse Frappe's public repositories
{{ filteredGithubAccountRepos.length }}/{{ githubAccountRepos.length }}
Fetching repositories...
{{ filteredGithubAccountRepos.length }}/{{ githubAccountRepos.length }}
{{ repoSearchQuery ? 'No matching repositories' : 'No repositories found' }}
{{ repo.name }}
{{ repo.description }}
{{ selectedImportRepoFullName }}
Fetching branches...
{{ appForm.branch || '-- Choose a Branch --' }}
No branches match
{{ br }}
{{ tag }}
No requirements selected (Optional)

Update Bench {{ benchToActOn?.name }}

Applying updates to {{ benchToActOn?.name }}

Select apps to update

App From To Status
Loading apps...
No apps found on this bench
{{ app === 'frappe' ? 'Frappe Framework' : (app === 'erpnext' ? 'ERPNext' : app) }} {{ appVersionInfo[app] ? (appVersionInfo[app].current_version || 'Unknown') : 'Loading...' }}
{{ appVersionInfo[app]?.current_version || 'latest' }} ↑ new commits
No Remote
Checking... Local App ↑ Update Update Avail. Latest Version

Switch App Branch {{ benchToActOn?.name }}

Switching branches on {{ benchToActOn?.name }}

Select apps to switch branches

App From To Branch Status
Loading apps...
No apps found on this bench
{{ app === 'frappe' ? 'Frappe Framework' : (app === 'erpnext' ? 'ERPNext' : app) }} {{ appVersionInfo[app] ? (appVersionInfo[app].current_version || 'Unknown') : 'Loading...' }}
No Remote
Checking... Local App Branch Switch Same Branch

Build Site Assets {{ siteToActOn?.subdomain }}

Rebuild CSS & JS assets for site

Loading site apps...

Select which application's assets you want to build:

Remove App from Bench

Uninstall App v2.1.5

Warning: Forcefully removing an app uninstalls it from the bench. Make sure it is uninstalled from all active sites first. This action is irreversible.
No extra apps installed
{{ app }} Installed on {{ benchToActOn?.name }}

Remove {{ removeAppForm.app_name }}?

This action is irreversible. All data, customizations, and code associated with the {{ removeAppForm.app_name }} app will be completely purged from {{ benchToActOn?.name }}. Are you absolutely sure?

Manage Apps

Apps for {{ siteToActOn?.domain }}

Loading apps...
No apps found on this bench
{{ app }} {{ appVersionInfo[app].current_version }}
Default
Not Installed

Bench Configuration (common_site_config.json)

{{ selectedError.job_type }}
{{ selectedError.target }}
{{ selectedError.error_detail || 'No detail available.' }}
AI Agent Diagnostics
Analysis Complete

Need help troubleshooting?

Let our intelligent diagnosis agent analyze the error log, trace the root cause, and provide a one-click automated fix.

AI Agent is analyzing...

Checking traceback patterns and preparing automated solutions.

تحليل الخطأ

{{ aiDiagnosisResult.explanation }}

السبب الجذري

{{ aiDiagnosisResult.root_cause }}

خطوات الحل اليدوي
  • {{ step }}

Delete Application

Are you sure you want to delete {{ appToDelete?.name }} from the global repository? This action cannot be undone.

{{ editingPackage ? 'Edit Package' : 'New Package Bundle' }}

Group multiple applications into a reusable bundle

{{ app.name }} {{ app.type }} {{ app.version || 'main' }} Exp.

{{ app.description || 'No description' }}

{{ globalApps.length === 0 ? 'No applications available. Add apps first.' : 'No apps match your search.' }}

Delete Package

Are you sure you want to delete the package {{ packageToDelete?.name }}? This will only remove the bundle, not the applications inside.

Delete System Tag

Are you sure you want to delete the tag {{ tagToDelete?.name }}? This will remove it from all items permanently.

Manual Restoration

Are you sure you want to restore {{ siteToActOn?.domain }}? This will overwrite the current database with the uploaded file.

Restore Site

Restore your site using a backup.

This will overwrite all data & apps in your site with those from the backup

Database Backup

Upload the database backup file. Usually file name ends in .sql.gz or .sql

{{ manualRestoreFileNames.db }}

Public Files

Upload the public files backup. Usually file name ends in -files.tar

{{ manualRestoreFileNames.public }}

Private Files

Upload the private files backup. Usually file name ends in -private-files.tar

{{ manualRestoreFileNames.private }}

Site Config (required if backup is encrypted)

Upload the site config file. Usually file name ends in -site_config_backup.json

{{ manualRestoreFileNames.config }}
{{ liveBackupsError }}

Showing {{ liveBackupsList.length }} available backup(s), latest first.

Create User

Add a new dashboard user with a role

{{ createUserError }}
{{ selectedUser?.username?.[0]?.toUpperCase() }}

Edit User

{{ selectedUser?.username }}

{{ resetUserPasswordError }}

Assign Bench

Assign a bench to an Infra User

{{ assignBenchForm.bench_name }}
{{ iamUsers.find(u => u.id == assignBenchForm.user_id)?.username }}

Assign Site

Assign a site to a Site User or Infra User

{{ sites.find(s => s.id == assignSiteForm.site_id)?.subdomain }}
{{ iamUsers.find(u => u.id == assignSiteForm.user_id)?.username }}

Add User to Group

Assign {{ selectedUser?.username }} to an IAM Group.

User is already in all available groups.

Attach Policy to User

Attach an IAM Policy directly to user {{ selectedUser?.username }}.

All policies are already attached to this user.

Create IAM Group

Create a group to consolidate permissions.

{{ createGroupError }}

Attach Policy to Group

Attach an IAM Policy to group {{ selectedGroup?.name }}.

All policies are already attached to this group.

Create IAM Policy

Create a custom AWS-like JSON authorization document.

{{ createPolicyError }}

View IAM Policy Document

JSON definitions for {{ selectedPolicy?.name }}.

{{ formatPolicyDoc(selectedPolicy?.document) }}
{{ toastMessage }}