{"id":16989934,"url":"https://github.com/x39/unitedtacticalforces","last_synced_at":"2026-04-06T08:02:10.809Z","repository":{"id":74149853,"uuid":"603896102","full_name":"X39/UnitedTacticalForces","owner":"X39","description":"Arma Web-App to control and update servers or plan events for your community","archived":false,"fork":false,"pushed_at":"2025-05-07T23:34:44.000Z","size":1265,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-08T00:26:55.087Z","etag":null,"topics":["arma3","asp-net-core","blazor-webassembly","cross-platform","dotnet","linux","mudblazor","steamcmd","windows"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/X39.png","metadata":{"files":{"readme":"ReadMe.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-02-19T21:49:17.000Z","updated_at":"2025-05-07T23:23:53.000Z","dependencies_parsed_at":"2025-05-08T00:22:31.954Z","dependency_job_id":"f1bcf859-e94e-4111-9486-a61e885cc1c5","html_url":"https://github.com/X39/UnitedTacticalForces","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/X39/UnitedTacticalForces","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/X39%2FUnitedTacticalForces","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/X39%2FUnitedTacticalForces/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/X39%2FUnitedTacticalForces/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/X39%2FUnitedTacticalForces/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/X39","download_url":"https://codeload.github.com/X39/UnitedTacticalForces/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/X39%2FUnitedTacticalForces/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31464115,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T21:22:52.476Z","status":"online","status_checked_at":"2026-04-06T02:00:07.287Z","response_time":112,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["arma3","asp-net-core","blazor-webassembly","cross-platform","dotnet","linux","mudblazor","steamcmd","windows"],"created_at":"2024-10-14T03:08:29.095Z","updated_at":"2026-04-06T08:02:10.791Z","avatar_url":"https://github.com/X39.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# How to develop?\n\nFor development, use the IDE that matches your taste (personally, i highly\nenjoy [Rider](https://www.jetbrains.com/rider/) but you may\nuse [Visual Studio Community](https://visualstudio.microsoft.com/de/) too).\nIn there, you just have to open the `.sln` file. Ensure that you have\nthe [development version of dotnet installed](https://dotnet.microsoft.com/en-us/download).\nAfter opening the `.sln` file, you will be greeted with a project that contains numerous folders.\nThe backend is located in `source\\X39.UnitedTacticalForces.Api` while the frontend is located\nin `source\\X39.UnitedTacticalForces.WebApp`.\n\n# How to Install?\n\nThe installation for this is a two part system,\none is the static SPA front-end (the actual website),\nthe other one a dynamic back-end (the api the website communicates with).\nHence, follow both steps carefully:\n\n## Back-End\n\n### Linux-SystemD\n\n1. Install postgresql on your machine\n2. Log into your admin user using eg. `sudo -u postgres psql` (`\\q` will exit the REPL terminal) and create a new user and database on it using the\n   following SQL:\n   ```postgresql\n   CREATE USER username WITH PASSWORD 'password';\n   CREATE DATABASE dbname;\n   GRANT ALL PRIVILEGES ON DATABASE dbname TO username;\n   ```\n3. [Install dotnet on your machine](https://learn.microsoft.com/en-us/dotnet/core/install/linux)\n4. Create a new folder at `/var/aspnetcore/utf-api`\n5. Paste the [latest backend artifacts](https://github.com/X39/UnitedTacticalForces/actions) flat in here\n6. Create a new file at `/etc/systemd/system/utf-api.service` with the following contents:\n   ```\n   [Unit]\n   Description=UTF Web API\n   \n   [Service]\n   WorkingDirectory=/var/aspnetcore/utf-api\n   ExecStart=/usr/bin/dotnet /var/aspnetcore/utf-api/X39.UnitedTacticalForces.Api.dll\n   Restart=always\n   # Restart service after 10 seconds if dotnet service crashes:\n   RestartSec=10\n   KillSignal=SIGINT\n   SyslogIdentifier=utf-api\n   User=www-data\n   Environment=ASPNETCORE_ENVIRONMENT=Production\n   Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false\n   \n   [Install]\n   WantedBy=multi-user.target\n   ```\n7. Create a new file at `var/aspnetcore/utf-api/appsettings.secret.json` with the following content:\n   ```json\n   {\n     \"ConnectionStrings\": {\n       \"ApiDbContext\": \"YOUR_POSTGRES_CONNECTION_STRING\"\n     },\n     \"Steam\": {\n       // https://steamcommunity.com/dev/apikey\n       \"ApiKey\": \"YOUR_SECRET\",\n       \"Username\": \"STEAM_USERNAME_ONLY_NEEDED_IF_ANONYMOUS_ONLY_FALSE\",\n       \"Password\": \"STEAM_PASSWORD_ONLY_NEEDED_IF_ANONYMOUS_ONLY_FALSE\"\n     },\n     \"Jwt\": {\n       \"SecretKey\": \"YOUR_SECRET_KEY\"\n     }\n   }\n   ```\n8. Check the other `appsettings.json` files present if they match your liking.\n   *It is recommended to write changes to the default values into a `appsettings.User.json` file instead of modifying\n   the files directly.*\n9. Start the API using `systemctl start utf-api`\n10. Continue with the front-end installation, then come back here\n11. Login to frontend\n12. Use `sudo -u postgres psql` again to connect to postgres.\n13. Enter `\\connect dbname` to connect to the database created earlier\n14. Use `INSERT INTO \"RoleUser\" (\"RolesPrimaryKey\", \"UsersPrimaryKey\") VALUES ((SELECT \"PrimaryKey\" FROM \"Roles\" WHERE \"Identifier\" = 'admin'), (SELECT \"PrimaryKey\" FROM \"Users\"));`\n    to give yourself administrative rights.\n    *Note that if more then a single user logged in, the value must be entered manually with the query above. Further users\n    can be administrated from the web app*\n15. You are done!\n\n## Front-End\n\n### Linux-NGINX with SSL\n\n1. Create a new folder at `/var/www/utf-frontend`\n2. Paste the [latest frontent artifacts](https://github.com/X39/UnitedTacticalForces/actions) flat in here\n3. Setup SSL certificate for your domain (in this case: `subdomain.yourdomain.xx`)\n4. Add a file with the following contents to `/etc/nginx/sites-available/utf.webapp`:\n   ```\n   # HTTP server configuration\n   server {\n   listen      80;\n   listen [::]:80;\n   server_name subdomain.yourdomain.xx;\n   \n       # Redirect all HTTP traffic to HTTPS\n       return 301 https://$host$request_uri;\n   }\n   \n   # HTTPS server configuration\n   server {\n   listen      443 ssl http2;\n   listen [::]:443 ssl http2;\n   server_name subdomain.yourdomain.xx;\n   \n       # SSL settings\n       ssl_certificate /path/to/certificate.cer;\n       ssl_certificate_key /path/to/certificate-key.key;\n       ssl_session_timeout 5m;\n       ssl_dhparam /path/to/diffie-hellman-parameter.pem;\n       ssl_stapling on;\n       ssl_stapling_verify on;\n   \n       # ASP.NET Core API location\n       location /api {\n           proxy_pass         http://localhost:5000; # Port where your API is running\n           proxy_http_version 1.1;\n           proxy_set_header   Upgrade $http_upgrade;\n           proxy_set_header   Connection keep-alive;\n           proxy_set_header   Host $host;\n           proxy_cache_bypass $http_upgrade;\n           proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;\n           proxy_set_header   X-Forwarded-Proto $scheme;\n   \n           # Blazor Server settings (if needed)\n           proxy_buffering           off;\n           proxy_buffer_size         16k;\n           proxy_buffers             4 16k;\n           proxy_busy_buffers_size   24k;\n           proxy_max_temp_file_size 0;\n        }\n   \n        # Blazor WebAssembly app location\n        location / {\n            root /var/www/utf-frontend/wwwroot;\n            try_files $uri $uri/ /index.html =404;\n   \n            # WebSockets settings (if needed)\n            include /etc/nginx/mime.types;\n            add_header Cache-Control no-cache always;\n        }\n   }\n   ```\n5. Create a link using `ln /etc/nginx/sites-enabled/utf-webapp /etc/nginx/sites-available/utf.webapp`\n6. Reload your nginx server by using `service nginx reload`","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fx39%2Funitedtacticalforces","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fx39%2Funitedtacticalforces","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fx39%2Funitedtacticalforces/lists"}