{"id":50037531,"url":"https://github.com/dturovskiy/armactl","last_synced_at":"2026-05-21T01:12:32.585Z","repository":{"id":347242954,"uuid":"1193307629","full_name":"dturovskiy/armactl","owner":"dturovskiy","description":"Installer, manager and TUI for Arma Reforger Dedicated Server on Ubuntu","archived":false,"fork":false,"pushed_at":"2026-05-13T17:12:05.000Z","size":1817,"stargazers_count":2,"open_issues_count":10,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-13T17:19:36.555Z","etag":null,"topics":["ar","arma","arma-reforger","dedicated-server","gameserver","linux","python","steamcmd","systemd","textual","tui","ubuntu"],"latest_commit_sha":null,"homepage":"https://github.com/dturovskiy/armactl/releases/latest","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dturovskiy.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":"SUPPORT.md","governance":null,"roadmap":"docs/roadmap.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-27T04:47:16.000Z","updated_at":"2026-05-13T16:48:28.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/dturovskiy/armactl","commit_stats":null,"previous_names":["dturovskiy/armactl"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/dturovskiy/armactl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dturovskiy%2Farmactl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dturovskiy%2Farmactl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dturovskiy%2Farmactl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dturovskiy%2Farmactl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dturovskiy","download_url":"https://codeload.github.com/dturovskiy/armactl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dturovskiy%2Farmactl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33283694,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-20T15:12:43.734Z","status":"ssl_error","status_checked_at":"2026-05-20T15:12:42.300Z","response_time":356,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ar","arma","arma-reforger","dedicated-server","gameserver","linux","python","steamcmd","systemd","textual","tui","ubuntu"],"created_at":"2026-05-21T01:12:31.134Z","updated_at":"2026-05-21T01:12:32.580Z","avatar_url":"https://github.com/dturovskiy.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# armactl\n\n[![CI](https://github.com/dturovskiy/armactl/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/dturovskiy/armactl/actions/workflows/ci.yml)\n[![Latest Release](https://img.shields.io/github/v/release/dturovskiy/armactl)](https://github.com/dturovskiy/armactl/releases)\n[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n[![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](pyproject.toml)\n[![Ubuntu 24.04](https://img.shields.io/badge/ubuntu-24.04-E95420.svg)](README.md)\n\nInstaller, manager, and TUI for **Arma Reforger Dedicated Server** on Ubuntu.\n\n`armactl` is built for operators who want one tool that can install a server\nfrom scratch, detect an existing installation, repair broken state, manage\n`systemd`, edit `config.json`, work with mods, and optionally expose a Telegram\nadmin bot.\n\n## Screenshot\n\n![armactl TUI main menu](assets/tui-main-menu.png)\n\n## Who this is for\n\n- Ubuntu 24.04 hosts\n- single dedicated server instance\n- single Linux user\n- operators who prefer a repo-local launcher over global package setup\n\n## Quick start\n\n```bash\ngit clone https://github.com/dturovskiy/armactl.git\ncd armactl\n./armactl\n```\n\nOn first run, `./armactl` bootstraps the repo-local environment automatically\nand then opens the TUI. After that, keep using the same launcher: no PATH\nchanges, no manual venv activation.\n\nIf you want the development toolchain from the first launch too, use:\n\n```bash\nARMACTL_BOOTSTRAP_MODE=--dev ./armactl\n```\n\n## Core scenarios\n\n### Fresh host\n\nUse `./armactl` on a clean Ubuntu host and choose `Install New Server`.\n`armactl` will bootstrap the environment, install SteamCMD if needed, download\nthe server, create config and runtime directories, generate `systemd` units,\nand start the service.\n\n### Existing server\n\nUse `Detect Existing Server` or `Manage Existing Server`. `armactl` will look\nfor the runtime root, `config.json`, `systemd` service, timer, and current\nports, then switch into management mode without reinstalling the server.\n\n### Broken install / repair\n\nUse `Repair Installation` in the TUI or:\n\n```bash\narmactl repair\n```\n\nRepair re-checks the installation, validates or regenerates missing pieces,\nrebuilds service and timer files, reinstalls the secure helper when needed, and\nrefreshes `state.json`.\n\n## What armactl does\n\n- install a server from scratch via SteamCMD\n- detect and manage an existing installation\n- start, stop, restart, and inspect the server\n- safely edit `config.json`, with an optional raw JSON screen\n- manage mods: add, remove, dedupe, import, export\n- manage scheduled restarts through `systemd`\n- expose optional Telegram bot controls\n- show real Arma Reforger server FPS/frame-time telemetry when `-logStats` data is available\n- keep runtime data separated from repo code\n\n## Scheduled restarts\n\nIn TUI, `Restart Schedule` accepts exact times instead of raw `systemd` syntax:\n\n```text\n08:00\n08:00, 20:00\n08:00 20:00\n```\n\n`armactl` converts those values into the correct `OnCalendar=` entries in the\ntimer unit automatically.\n\n## Server FPS telemetry\n\n`armactl` can show real Arma Reforger Dedicated Server FPS and frame-time\ntelemetry.\n\nFor generated services, `start-armareforger.sh` starts the server with:\n\n```text\n-logStats 10000\n```\n\nThe server writes periodic engine telemetry into the runtime console log, and\n`armactl` reads the latest valid `FPS:` line from:\n\n```text\n~/armactl-data/\u003cinstance\u003e/config/logs/*/console.log\n```\n\nExample:\n\n```text\nServer FPS:  60.0\nFrame time:  16.7 ms avg / 18.5 ms max\nTelemetry:   4s old\n```\n\nThis value is the server engine's own FPS telemetry. It is not estimated from\nCPU usage.\n\nFor existing installations, regenerate the service/start script and restart the\nserver after updating `armactl` so the process starts with `-logStats 10000`.\n\n## Runtime layout\n\n`armactl` separates three layers:\n\n| Layer | Location | Purpose |\n|-------|----------|---------|\n| Source code | this repository | CLI + TUI + backend modules |\n| Runtime data | `~/armactl-data/default/` | server files, config, backups, state |\n| System services | `/etc/systemd/system/` | auto-start and scheduled restarts |\n\nTypical runtime structure:\n\n```text\n~/armactl-data/default/\n├── server/\n├── config/config.json\n├── backups/\n├── state.json\n└── start-armareforger.sh\n```\n\n## Telegram bot\n\nTelegram bot management is optional and runs as a separate `systemd` unit:\n\n- `armactl-bot.service`\n- TUI settings screen: `Manage Existing Server -\u003e Telegram Bot`\n- instance-scoped `.env` as the single source of truth for bot settings\n\nRuntime config path:\n\n```text\n~/armactl-data/\u003cinstance\u003e/bot/.env\n```\n\nThe repository ships [.env.example](.env.example) as a template, while real\nruntime `.env` files stay out of git.\n\nCurrent bot capabilities include:\n\n- status\n- metrics\n- details\n- start / stop / restart\n- scheduled restart management\n- player visibility through A2S and local RCON\n- real Server FPS/frame-time metrics when server telemetry is available\n\nSee [docs/telegram-bot.md](docs/telegram-bot.md) for the full flow.\n\n## Documentation\n\n- [Architecture](docs/architecture.md)\n- [Localization](docs/localization.md)\n- [Telegram Bot](docs/telegram-bot.md)\n- [Troubleshooting](docs/troubleshooting.md)\n- [Development](docs/development.md)\n- [Release Process](docs/release-process.md)\n- [Roadmap](docs/roadmap.md)\n- [Checklist](docs/checklist.md)\n\n## CLI commands\n\n```text\narmactl detect\narmactl install\narmactl repair\n\narmactl start\narmactl stop\narmactl restart\narmactl status\narmactl logs\narmactl ports\n\narmactl config show\narmactl config validate\n\narmactl mods list\narmactl mods add\narmactl mods remove\narmactl mods dedupe\narmactl mods export FILE\narmactl mods import FILE\n\narmactl schedule show\narmactl schedule set\narmactl schedule enable\narmactl schedule disable\n```\n\n## Development\n\n```bash\n./scripts/run-host-tests\n.venv/bin/pytest\n.venv/bin/ruff check src tests\n```\n\nIf the repo was only bootstrapped in prod mode before, both `./armactl` and\n`./scripts/run-host-tests` will refresh the repo-local `.venv` automatically\nafter `pyproject.toml` dependency changes.\n\n## Project health\n\n- [Contributing](CONTRIBUTING.md)\n- [Code of Conduct](CODE_OF_CONDUCT.md)\n- [Security Policy](SECURITY.md)\n- [Support](SUPPORT.md)\n- [Changelog](CHANGELOG.md)\n\n## License\n\nMIT\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdturovskiy%2Farmactl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdturovskiy%2Farmactl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdturovskiy%2Farmactl/lists"}