├── opsimate-docs ├── static │ ├── .nojekyll │ ├── img │ │ ├── favicon.ico │ │ ├── alertpage.png │ │ ├── auditlog.png │ │ ├── first-login.png │ │ ├── myprovider-page.png │ │ ├── serverprovider.png │ │ ├── service-sidebar.png │ │ ├── systemd_service.png │ │ ├── user-management.png │ │ ├── provider-overview.png │ │ ├── dashboard-fullview.png │ │ ├── docusaurus-social-card.jpg │ │ ├── adding-container-service.png │ │ ├── kubernetes-provider-add.png │ │ ├── adding-grafana-integration.png │ │ ├── kibana.svg │ │ ├── systemd.svg │ │ ├── slack.svg │ │ ├── opsimate-logo.svg │ │ ├── github.svg │ │ ├── docker.svg │ │ ├── vercel.svg │ │ ├── datadog.svg │ │ ├── kubernetes.svg │ │ ├── grafana.svg │ │ ├── undraw_docusaurus_tree.svg │ │ ├── undraw_docusaurus_mountain.svg │ │ └── undraw_docusaurus_react.svg │ └── css │ │ └── unused-custom.css ├── .env ├── .dockerignore ├── src │ ├── clientModules │ │ └── vercelAnalytics.ts │ ├── pages │ │ ├── markdown-page.md │ │ ├── index.module.css │ │ └── index.jsx │ ├── theme │ │ └── Layout │ │ │ └── index.js │ ├── components │ │ ├── CookieConsent.js │ │ └── CookieConsent.css │ └── css │ │ └── custom.css ├── blog │ ├── 2021-08-26-welcome │ │ ├── docusaurus-plushie-banner.jpeg │ │ └── index.md │ ├── 2019-05-28-first-blog-post.md │ ├── tags.yml │ ├── 2021-08-01-mdx-blog-post.mdx │ ├── authors.yml │ └── 2019-05-29-long-blog-post.md ├── tsconfig.json ├── .gitignore ├── dockerfile ├── docs │ ├── dashboards │ │ ├── saving-views.md │ │ ├── overview.md │ │ └── service-menu.md │ ├── user-management │ │ ├── register-login.md │ │ ├── admin-panel.md │ │ └── audit-logs.md │ ├── providers-services │ │ ├── services │ │ │ ├── kubernetes-pods.md │ │ │ ├── container-services.md │ │ │ ├── systemd-services.md │ │ │ └── add-services.md │ │ ├── providers │ │ │ ├── kubernetes-provider.md │ │ │ ├── server-provider.md │ │ │ └── add-provider.md │ │ └── overview.md │ ├── development.md │ ├── getting-started │ │ ├── system-requirements.md │ │ ├── configuration.md │ │ └── deploy.md │ ├── integrations │ │ ├── kibana.md │ │ ├── grafana.md │ │ ├── datadog.md │ │ └── overview.md │ ├── legal │ │ └── privacy.md │ ├── alerts │ │ ├── alert-management.md │ │ └── adding-alerts.md │ ├── core-features.md │ └── intro.md ├── fix-links.sh ├── vercel.json ├── package.json ├── README.md ├── sidebars.js └── docusaurus.config.js ├── package.json ├── .coderabbit.yaml ├── .github └── workflows │ ├── link-check-config.json │ └── link-check.yml ├── .gitignore └── README.md /opsimate-docs/static/.nojekyll: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /opsimate-docs/.env: -------------------------------------------------------------------------------- 1 | # Environment variables for Docusaurus deployment 2 | NODE_ENV=production 3 | -------------------------------------------------------------------------------- /opsimate-docs/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | .DS_Store 4 | .git 5 | .gitignore 6 | -------------------------------------------------------------------------------- /opsimate-docs/src/clientModules/vercelAnalytics.ts: -------------------------------------------------------------------------------- 1 | import { inject } from '@vercel/analytics'; 2 | 3 | inject(); 4 | -------------------------------------------------------------------------------- /opsimate-docs/static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfaarghya/documentation/main/opsimate-docs/static/img/favicon.ico -------------------------------------------------------------------------------- /opsimate-docs/static/img/alertpage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfaarghya/documentation/main/opsimate-docs/static/img/alertpage.png -------------------------------------------------------------------------------- /opsimate-docs/static/img/auditlog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfaarghya/documentation/main/opsimate-docs/static/img/auditlog.png -------------------------------------------------------------------------------- /opsimate-docs/static/img/first-login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfaarghya/documentation/main/opsimate-docs/static/img/first-login.png -------------------------------------------------------------------------------- /opsimate-docs/static/img/myprovider-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfaarghya/documentation/main/opsimate-docs/static/img/myprovider-page.png -------------------------------------------------------------------------------- /opsimate-docs/static/img/serverprovider.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfaarghya/documentation/main/opsimate-docs/static/img/serverprovider.png -------------------------------------------------------------------------------- /opsimate-docs/static/img/service-sidebar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfaarghya/documentation/main/opsimate-docs/static/img/service-sidebar.png -------------------------------------------------------------------------------- /opsimate-docs/static/img/systemd_service.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfaarghya/documentation/main/opsimate-docs/static/img/systemd_service.png -------------------------------------------------------------------------------- /opsimate-docs/static/img/user-management.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfaarghya/documentation/main/opsimate-docs/static/img/user-management.png -------------------------------------------------------------------------------- /opsimate-docs/static/img/provider-overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfaarghya/documentation/main/opsimate-docs/static/img/provider-overview.png -------------------------------------------------------------------------------- /opsimate-docs/static/img/dashboard-fullview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfaarghya/documentation/main/opsimate-docs/static/img/dashboard-fullview.png -------------------------------------------------------------------------------- /opsimate-docs/static/img/docusaurus-social-card.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfaarghya/documentation/main/opsimate-docs/static/img/docusaurus-social-card.jpg -------------------------------------------------------------------------------- /opsimate-docs/static/img/adding-container-service.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfaarghya/documentation/main/opsimate-docs/static/img/adding-container-service.png -------------------------------------------------------------------------------- /opsimate-docs/static/img/kubernetes-provider-add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfaarghya/documentation/main/opsimate-docs/static/img/kubernetes-provider-add.png -------------------------------------------------------------------------------- /opsimate-docs/static/img/adding-grafana-integration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfaarghya/documentation/main/opsimate-docs/static/img/adding-grafana-integration.png -------------------------------------------------------------------------------- /opsimate-docs/src/pages/markdown-page.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Markdown page example 3 | --- 4 | 5 | # Markdown page example 6 | 7 | You don't need React to write simple standalone pages. 8 | -------------------------------------------------------------------------------- /opsimate-docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfaarghya/documentation/main/opsimate-docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg -------------------------------------------------------------------------------- /opsimate-docs/static/img/kibana.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /opsimate-docs/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // This file is not used in compilation. It is here just for a nice editor experience. 3 | "extends": "@docusaurus/tsconfig", 4 | "compilerOptions": { 5 | "baseUrl": "." 6 | }, 7 | "exclude": [".docusaurus", "build"] 8 | } 9 | -------------------------------------------------------------------------------- /opsimate-docs/static/img/systemd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /opsimate-docs/.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | /node_modules 3 | 4 | # Production 5 | /build 6 | 7 | # Generated files 8 | .docusaurus 9 | .cache-loader 10 | 11 | # Misc 12 | .DS_Store 13 | .env.local 14 | .env.development.local 15 | .env.test.local 16 | .env.production.local 17 | 18 | npm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "documentation-root", 3 | "version": "1.0.0", 4 | "private": true, 5 | "workspaces": [ 6 | "opsimate-docs" 7 | ], 8 | "scripts": { 9 | "dev": "cd opsimate-docs && npm start", 10 | "build": "cd opsimate-docs && npm run build", 11 | "start": "cd opsimate-docs && npm start" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /opsimate-docs/src/theme/Layout/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Layout from '@theme-original/Layout'; 3 | import CookieConsent from '@site/src/components/CookieConsent'; 4 | 5 | export default function LayoutWrapper(props) { 6 | return ( 7 | <> 8 | 9 | 10 | 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /opsimate-docs/dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20-alpine 2 | 3 | # Set working directory 4 | WORKDIR /app 5 | 6 | # Copy package files first 7 | COPY package*.json ./ 8 | 9 | # Install dependencies 10 | RUN npm ci 11 | 12 | # Copy the rest of the code 13 | COPY . . 14 | 15 | # Expose port 16 | EXPOSE 3000 17 | 18 | # Use npm script via npx for Docusaurus 19 | CMD ["npm", "run", "start"] 20 | -------------------------------------------------------------------------------- /opsimate-docs/docs/dashboards/saving-views.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 3 3 | --- 4 | 5 | # Saving Views 6 | 7 | Save and manage filtered service views for quick access to specific service groups. 8 | 9 | ## View Management 10 | 11 | ### Creating Views 12 | 1. **Configure Filters**: Set up your desired service filters 13 | 2. **Save View**: Click "Save Current View" and provide a name 14 | -------------------------------------------------------------------------------- /opsimate-docs/fix-links.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Find all markdown files in the docs directory 4 | find docs -name "*.md" -type f | while read -r file; do 5 | # Replace all occurrences of /docs/ with / in links 6 | sed -i '' 's|href="/docs/|href="/|g' "$file" 7 | sed -i '' 's|\[.*\](/docs/|\[&\](/|g' "$file" 8 | echo "Fixed links in $file" 9 | done 10 | 11 | echo "All links have been fixed!" 12 | -------------------------------------------------------------------------------- /opsimate-docs/blog/2019-05-28-first-blog-post.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: first-blog-post 3 | title: First Blog Post 4 | authors: [slorber, yangshun] 5 | tags: [hola, docusaurus] 6 | --- 7 | 8 | Lorem ipsum dolor sit amet... 9 | 10 | 11 | 12 | ...consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 13 | -------------------------------------------------------------------------------- /opsimate-docs/blog/tags.yml: -------------------------------------------------------------------------------- 1 | facebook: 2 | label: Facebook 3 | permalink: /facebook 4 | description: Facebook tag description 5 | 6 | hello: 7 | label: Hello 8 | permalink: /hello 9 | description: Hello tag description 10 | 11 | docusaurus: 12 | label: Docusaurus 13 | permalink: /docusaurus 14 | description: Docusaurus tag description 15 | 16 | hola: 17 | label: Hola 18 | permalink: /hola 19 | description: Hola tag description 20 | -------------------------------------------------------------------------------- /.coderabbit.yaml: -------------------------------------------------------------------------------- 1 | chat: 2 | auto_reply: true 3 | reviews: 4 | poem: false 5 | profile: chill 6 | high_level_summary: true 7 | estimate_code_review_effort: false 8 | sequence_diagrams: false 9 | request_changes_workflow: false 10 | finishing_touches: 11 | docstrings: 12 | enabled: false 13 | unit_tests: 14 | enabled: false 15 | pre_merge_checks: 16 | docstrings: 17 | mode: off 18 | title: 19 | mode: off 20 | description: 21 | mode: off 22 | issue_assessment: 23 | mode: off 24 | custom_checks: [] 25 | related_issues: false 26 | -------------------------------------------------------------------------------- /opsimate-docs/docs/user-management/register-login.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | 5 | # Register and Login 6 | 7 | OpsiMate provides secure user authentication. 8 | 9 | ## Registration 10 | 11 | New users can register for OpsiMate access: 12 | 13 | 1. Enter your email address 14 | 2. Create a secure password 15 | 3. Verify your email address 16 | 17 | ## Login 18 | 19 | Existing users can log in to access their dashboard: 20 | 21 | 1. Go to the login page 22 | 2. Enter your email and password 23 | 3. Click "Sign In" to access your dashboard 24 | 25 | *[Login screenshot placeholder]* 26 | -------------------------------------------------------------------------------- /opsimate-docs/static/img/slack.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /opsimate-docs/blog/2021-08-01-mdx-blog-post.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | slug: mdx-blog-post 3 | title: MDX Blog Post 4 | authors: [slorber] 5 | tags: [docusaurus] 6 | --- 7 | 8 | Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/). 9 | 10 | :::tip 11 | 12 | Use the power of React to create interactive blog posts. 13 | 14 | ::: 15 | 16 | {/* truncate */} 17 | 18 | For example, use JSX to create an interactive button: 19 | 20 | ```js 21 | 22 | ``` 23 | 24 | 25 | -------------------------------------------------------------------------------- /opsimate-docs/docs/providers-services/services/kubernetes-pods.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 4 3 | --- 4 | 5 | # Kubernetes Pods 6 | 7 | Monitor pods running in your Kubernetes clusters. 8 | 9 | ## Adding 10 | 11 | **Automatic Detection**: Works the same way as Docker containers. 12 | 13 | ### Process 14 | 1. Click the three-dots menu 15 | 2. Select "Add Services" 16 | 3. Choose your Kubernetes provider 17 | 4. Select "Kubernetes Pod" type 18 | 5. Choose from detected pods 19 | 20 | ## Control 21 | 22 | **Kubectl Commands**: Controlled using kubectl commands. 23 | 24 | ### Basic Operations 25 | ```bash 26 | # Get pod status 27 | kubectl get pods -n namespace 28 | 29 | # Delete pod (will restart if part of deployment) 30 | kubectl delete pod pod-name -n namespace 31 | ``` -------------------------------------------------------------------------------- /opsimate-docs/blog/authors.yml: -------------------------------------------------------------------------------- 1 | yangshun: 2 | name: Yangshun Tay 3 | title: Ex-Meta Staff Engineer, Co-founder GreatFrontEnd 4 | url: https://linkedin.com/in/yangshun 5 | image_url: https://github.com/yangshun.png 6 | page: true 7 | socials: 8 | x: yangshunz 9 | linkedin: yangshun 10 | github: yangshun 11 | newsletter: https://www.greatfrontend.com 12 | 13 | slorber: 14 | name: Sébastien Lorber 15 | title: Docusaurus maintainer 16 | url: https://sebastienlorber.com 17 | image_url: https://github.com/slorber.png 18 | page: 19 | # customize the url of the author page at /blog/authors/ 20 | permalink: '/all-sebastien-lorber-articles' 21 | socials: 22 | x: sebastienlorber 23 | linkedin: sebastienlorber 24 | github: slorber 25 | newsletter: https://thisweekinreact.com 26 | -------------------------------------------------------------------------------- /opsimate-docs/static/img/opsimate-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 21 | -------------------------------------------------------------------------------- /opsimate-docs/static/img/github.svg: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | -------------------------------------------------------------------------------- /opsimate-docs/docs/development.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 10 3 | --- 4 | 5 | # Development 6 | 7 | Learn how to set up and run the OpsiMate project locally for development. 8 | 9 | ## Prerequisites 10 | 11 | - **Node.js** (v18 or higher) 12 | - **npm** (v8 or higher) 13 | - **Git** 14 | 15 | ## Getting Started 16 | 17 | ### 1. Clone the Repository 18 | 19 | ```bash 20 | git clone https://github.com/opsimate/opsimate.git 21 | cd opsimate 22 | ``` 23 | 24 | ### 2. Install Dependencies 25 | 26 | ```bash 27 | pnpm install 28 | ``` 29 | 30 | ### 3. Build the Project 31 | 32 | ```bash 33 | pnpm run build 34 | ``` 35 | 36 | ### 4. Start client and server 37 | 38 | ```bash 39 | pnpm run dev 40 | ``` 41 | 42 | The Client will be available at `http://localhost:8080` 43 | The Server will be available at `http://localhost:3001` 44 | 45 | ## Development Commands 46 | 47 | - `pnpm run test` - Run test suite 48 | - `pnpm run lint` - Check code quality 49 | -------------------------------------------------------------------------------- /.github/workflows/link-check-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "ignorePatterns": [ 3 | { 4 | "pattern": "^https://github.com/opsimate/opsimate" 5 | }, 6 | { 7 | "pattern": "^https://join.slack.com" 8 | }, 9 | { 10 | "pattern": "^https://opsimate.slack.com" 11 | }, 12 | { 13 | "pattern": "^http://localhost" 14 | } 15 | ], 16 | "replacementPatterns": [ 17 | { 18 | "pattern": "^/docs/", 19 | "replacement": "{{BASEURL}}/opsimate-docs/docs/" 20 | } 21 | ], 22 | "httpHeaders": [ 23 | { 24 | "urls": ["https://grafana.com", "https://www.datadoghq.com", "https://www.elastic.co"], 25 | "headers": { 26 | "User-Agent": "Mozilla/5.0 (compatible; documentation-link-checker)" 27 | } 28 | } 29 | ], 30 | "timeout": "10s", 31 | "retryOn429": true, 32 | "retryCount": 3, 33 | "fallbackRetryDelay": "5s", 34 | "aliveStatusCodes": [200, 206, 301, 302, 307, 308, 403, 429] 35 | } 36 | -------------------------------------------------------------------------------- /opsimate-docs/static/img/docker.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /opsimate-docs/docs/getting-started/system-requirements.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: system-requirements 3 | title: System Requirements 4 | sidebar_position: 3 5 | --- 6 | 7 | # System Requirements 8 | 9 | OpsiMate is lightweight and runs efficiently on minimal hardware. 10 | 11 | ## 💻 Hardware Requirements 12 | 13 | | Component | Minimum | Recommended | 14 | |-----------|---------|-------------| 15 | | **CPU** | 1 vCPU | 2+ vCPUs | 16 | | **RAM** | 512 MB | 2 GB+ | 17 | | **Storage** | 1 GB | 10 GB+ | 18 | ## 🐳 Software Requirements 19 | 20 | - **Docker** 20.10+ or Docker Desktop 21 | - **Operating System**: Linux, macOS 10.15+, Windows 10+ (WSL2) 22 | 23 | ## 🌐 Network Requirements 24 | 25 | - **Port 8080**: Web interface 26 | - **Port 3001**: API server 27 | - **Port 22**: SSH access to monitored servers 28 | - Internet access for Docker images 29 | 30 | :::tip Ready to Deploy? 31 | Once your system meets these requirements, head to the [deployment guide](deploy) to get started! 32 | ::: 33 | 34 | 35 | -------------------------------------------------------------------------------- /opsimate-docs/blog/2021-08-26-welcome/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: welcome 3 | title: Welcome 4 | authors: [slorber, yangshun] 5 | tags: [facebook, hello, docusaurus] 6 | --- 7 | 8 | [Docusaurus blogging features](https://docusaurus.io/docs/blog) are powered by the [blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog). 9 | 10 | Here are a few tips you might find useful. 11 | 12 | 13 | 14 | Simply add Markdown files (or folders) to the `blog` directory. 15 | 16 | Regular blog authors can be added to `authors.yml`. 17 | 18 | The blog post date can be extracted from filenames, such as: 19 | 20 | - `2019-05-30-welcome.md` 21 | - `2019-05-30-welcome/index.md` 22 | 23 | A blog post folder can be convenient to co-locate blog post images: 24 | 25 | ![Docusaurus Plushie](./docusaurus-plushie-banner.jpeg) 26 | 27 | The blog supports tags as well! 28 | 29 | **And if you don't want a blog**: just delete this directory, and use `blog: false` in your Docusaurus config. 30 | -------------------------------------------------------------------------------- /opsimate-docs/docs/integrations/kibana.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 4 3 | tags: [Links, Monitoring Data] 4 | --- 5 | 6 | # Kibana Integration 7 | 8 | **Kibana** is a data visualization dashboard for Elasticsearch. It provides search and data visualization capabilities for data indexed in Elasticsearch clusters. 9 | 10 | **Integration Capabilities:** 11 | - 🔗 **Links**: Direct access to Kibana dashboards from services 12 | 13 | ## Configuration Parameters 14 | 15 | Required credentials to connect to Kibana: 16 | 17 | - **Kibana URL**: Your Kibana instance URL (e.g., `https://kibana.company.com:5601`) 18 | - **API Key**: Authentication using Elasticsearch API key 19 | 20 | ## Functionality 21 | 22 | ### Dashboard Links 23 | - Access Kibana dashboards directly from OpsiMate services 24 | - Open dashboards in new tabs or embedded views 25 | 26 | ## Official Resources 27 | 28 | - **Kibana Website**: [https://www.elastic.co/kibana](https://www.elastic.co/kibana) 29 | - **Documentation**: [https://www.elastic.co/guide/en/kibana](https://www.elastic.co/guide/en/kibana) 30 | -------------------------------------------------------------------------------- /opsimate-docs/docs/user-management/admin-panel.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | --- 4 | 5 | # Admin Panel 6 | 7 | The Admin Panel allows administrators to manage users and system settings. 8 |
9 | User Management Interface 10 |

User management dashboard for adding and configuring team members

11 |
12 | 13 | 14 | ## User Management 15 | 16 | ### Adding Users 17 | 18 | 1. Navigate to **Admin Panel** → **Users** 19 | 2. Click **Add User** button 20 | 3. Enter user details: 21 | - Email address 22 | - Full name 23 | - Role (Admin, User, Viewer) 24 | 25 | ## User Roles 26 | 27 | - **Admin**: Full system access and user management 28 | - **User**: Standard monitoring and configuration access 29 | - **Viewer**: Read-only access to dashboards and alerts 30 | 31 | -------------------------------------------------------------------------------- /opsimate-docs/vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "buildCommand": "npm run build", 3 | "outputDirectory": "build", 4 | "framework": "docusaurus", 5 | "rewrites": [ 6 | { "source": "/(.*)", "destination": "/index.html" } 7 | ], 8 | "headers": [ 9 | { 10 | "source": "/assets/(.*)", 11 | "headers": [ 12 | { 13 | "key": "Cache-Control", 14 | "value": "public, max-age=31536000, immutable" 15 | } 16 | ] 17 | }, 18 | { 19 | "source": "/(.*)", 20 | "headers": [ 21 | { 22 | "key": "X-Content-Type-Options", 23 | "value": "nosniff" 24 | }, 25 | { 26 | "key": "X-Frame-Options", 27 | "value": "DENY" 28 | }, 29 | { 30 | "key": "X-XSS-Protection", 31 | "value": "1; mode=block" 32 | }, 33 | { 34 | "key": "Strict-Transport-Security", 35 | "value": "max-age=63072000; includeSubDomains; preload" 36 | } 37 | ] 38 | } 39 | ], 40 | "github": { 41 | "silent": true 42 | } 43 | } 44 | 45 | 46 | -------------------------------------------------------------------------------- /opsimate-docs/docs/user-management/audit-logs.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 3 3 | --- 4 | 5 | # Audit Logs 6 | 7 | OpsiMate maintains comprehensive audit logs for all provider-related activities and system changes. 8 | 9 |
10 | Audit Log Dashboard 11 |

Comprehensive audit log showing all system activities and user actions

12 |
13 | 14 | ## Provider Audit Logs 15 | 16 | Track all actions performed on providers: 17 | 18 | - **Provider Creation**: When new providers are added 19 | - **Configuration Changes**: Modifications to provider settings 20 | - **Provider Removal**: When providers are deleted 21 | 22 | ## Log Information 23 | 24 | Each audit entry includes: 25 | 26 | - **Timestamp**: When the action occurred 27 | - **User**: Who performed the action 28 | - **Action Type**: What was done 29 | - **Provider**: Which provider was affected 30 | -------------------------------------------------------------------------------- /opsimate-docs/docs/providers-services/services/container-services.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 3 3 | --- 4 | 5 | # Docker Containers 6 | 7 | Monitor Docker containers running on your servers. 8 | 9 | ## Adding 10 | 11 | **Automatic Detection**: OpsiMate checks for existing containers, and you can add them directly from the add screen. 12 | 13 | ### Process 14 | 1. Click the three-dots menu 15 | 2. Select "Add Services" 16 | 3. Choose your server provider 17 | 4. Select "Docker Container" type 18 | 5. Choose from detected containers 19 | 20 |
21 | Adding Container Service 22 |

Adding a Docker container service to OpsiMate

23 |
24 | 25 | ## Control 26 | 27 | **Docker Commands**: Controlled via SSH commands with Docker. 28 | 29 | ### Basic Operations 30 | ```bash 31 | # Start container 32 | docker start container-name 33 | 34 | # Stop container 35 | docker stop container-name 36 | 37 | # Restart container 38 | docker restart container-name 39 | 40 | ``` 41 | -------------------------------------------------------------------------------- /opsimate-docs/docs/providers-services/services/systemd-services.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | --- 4 | 5 | # Systemd Services 6 | 7 | Monitor Linux system services managed by systemd. 8 | 9 | ## Adding 10 | 11 | **Manual Entry**: Added manually by entering the service name. 12 | 13 | ### Process 14 | 1. Click the three-dots menu 15 | 2. Select "Add Services" 16 | 3. Choose your server provider 17 | 4. Select "Systemd Service" type 18 | 5. Enter the service name (e.g., "nginx", "postgresql") 19 | 20 |
21 | Systemd Service Configuration 22 |

Adding a systemd service to OpsiMate

23 |
24 | 25 | ## Control 26 | 27 | **SSH Commands**: Controlled via SSH commands using `service start`, `stop`, `restart`, to manage the service. 28 | 29 | ### Basic Operations 30 | ```bash 31 | # Start service 32 | sudo systemctl start service-name 33 | 34 | # Stop service 35 | sudo systemctl stop service-name 36 | 37 | # Restart service 38 | sudo systemctl restart service-name 39 | ``` -------------------------------------------------------------------------------- /opsimate-docs/docs/integrations/grafana.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | tags: [Links, Monitoring Data, Alerts] 4 | --- 5 | 6 | # Grafana Integration 7 | 8 | **Grafana** is an open-source analytics and interactive visualization platform. It provides charts, graphs, and alerts for monitoring data from various sources. 9 | 10 | **Integration Capabilities:** 11 | - 🔗 **Links**: Direct access to Grafana dashboards from services 12 | - 🚨 **Alerts**: Receive Grafana alerts in OpsiMate 13 | 14 | ## Configuration Parameters 15 | 16 | Required credentials to connect to Grafana: 17 | 18 | - **Grafana URL**: Your Grafana instance URL (e.g., `https://grafana.company.com`) 19 | - **API Key**: Generated from Grafana with Admin or Editor role 20 | 21 | ## Functionality 22 | 23 | ### Dashboard Links 24 | - Access Grafana dashboards directly from OpsiMate services 25 | - Automatic linking based on service names and tags 26 | - Open dashboards in new tabs or embedded views 27 | 28 | ### Alert Integration 29 | - Receive Grafana alerts in OpsiMate notification system 30 | - Correlate alerts with service status and events 31 | - Unified alert management across monitoring tools 32 | 33 | ## Official Resources 34 | 35 | - **Grafana Website**: [https://grafana.com](https://grafana.com) 36 | - **Documentation**: [https://grafana.com/docs](https://grafana.com/docs) 37 | -------------------------------------------------------------------------------- /opsimate-docs/docs/legal/privacy.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Privacy Policy & Cookie Policy 3 | description: OpsiMate Privacy Policy and Cookie Usage 4 | sidebar_position: 1 5 | --- 6 | 7 | # Privacy Policy & Cookie Policy 8 | 9 | Last updated: January 2025 10 | 11 | ## Cookie Usage 12 | 13 | OpsiMate uses cookies and similar technologies to provide, secure, and improve our services. 14 | 15 | ### Essential Cookies 16 | These cookies are necessary for the website to function and cannot be switched off. 17 | 18 | ### Analytics Cookies 19 | These cookies help us understand how visitors interact with our documentation. 20 | 21 | ### Marketing Cookies 22 | These cookies are used to track visitors across websites to display relevant advertisements. 23 | 24 | ## Your Choices 25 | 26 | You can manage your cookie preferences at any time by clearing your browser cookies or using the cookie consent banner. 27 | 28 | --- 29 | 30 | ## Privacy Policy 31 | 32 | ### Information We Collect 33 | - Usage data and analytics 34 | - Cookie preferences 35 | - Documentation access patterns 36 | 37 | ### How We Use Your Information 38 | - Improve our documentation 39 | - Understand user needs 40 | - Provide better support 41 | 42 | ### Data Protection 43 | We are committed to protecting your privacy and securing your data. 44 | 45 | ### Contact Us 46 | For privacy-related questions, contact our team. -------------------------------------------------------------------------------- /opsimate-docs/docs/providers-services/services/add-services.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | 5 | # Add Services 6 | 7 | Add and configure services for monitoring across your providers. 8 | 9 | ## Basic Flow 10 | 11 | Adding services is done using the **Add Services** button in the menu that opens when clicking the three-dots icon. 12 | 13 | 1. **Go to “My Provider” Page** 14 | Open the **My Provider** page in your OpsiMate dashboard. 15 | 16 | 2. **Access the Menu** 17 | Click the **three‑dots** menu icon for the chosen provider. 18 | 19 | 3. **Add Services** 20 | Select **Add Services** from the menu options. 21 | 22 | 4. **Select Services** 23 | Choose the services you want to connect and manage. 24 | 25 | 5. **Start Managing** 26 | Confirm your selection. OpsiMate will now let you monitor and control these services. 27 | 28 | Based on the provider, you can select the services that are relevant to that specific provider. 29 | 30 | 31 | 32 | ## Next Steps 33 | 34 | After adding your services: 35 | 36 | 1. **[Monitor Services](../../dashboards/overview)** - View service status and metrics 37 | 2. **[Set Up Alerts](../../alerts/adding-alerts)** - Get notified of issues 38 | 39 | :::tip Pro Tip 40 | Start with basic health checks and gradually add more sophisticated monitoring as you learn what works best for your services. 41 | ::: 42 | -------------------------------------------------------------------------------- /opsimate-docs/docs/providers-services/providers/kubernetes-provider.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 3 3 | --- 4 | 5 | # Kubernetes Provider 6 | 7 | Monitor Kubernetes clusters through kubeconfig-based API connectivity. 8 | 9 | ## Configuration 10 | 11 | Kubernetes providers require kubeconfig file access to establish cluster monitoring capabilities. 12 | 13 | ### Connection Parameters 14 | 15 | | Parameter | Type | Description | Required | 16 | |-----------|------|-------------|----------| 17 | | **Kubeconfig File** | String | Kubeconfig filename for cluster access | Yes | 18 | 19 | ### Kubeconfig Configuration 20 | 21 | Place your kubeconfig files in the `data/private-keys/` directory and reference only the filename: 22 | 23 |
24 | Adding Kubernetes Provider 25 |

Kubernetes provider configuration form

26 |
27 | 28 | ## Types of Services 29 | 30 | Kubernetes providers support automatic pod discovery. 31 | 32 | ### Pods 33 | 34 | **Automatic Discovery**: OpsiMate automatically detects all pods within the configured cluster context and you can add them as a services directly from the my providers page. -------------------------------------------------------------------------------- /opsimate-docs/docs/alerts/alert-management.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | --- 4 | 5 | # Alert Management 6 | 7 | The Alert Management page provides a centralized view of all alerts across your services and integrations. 8 | 9 | 10 |
11 | OpsiMate Alerts Page 12 |

OpsiMate alerts dashboard showing real-time notifications and alert management

13 |
14 | 15 | ## Overview 16 | 17 | Access the Alert Management page to: 18 | 19 | - **View all alerts**: See alerts from all integration sources in one place 20 | - **Filter and search**: Find specific alerts by service, severity, or status 21 | 22 | ## Alert Dashboard Features 23 | 24 | ### All Active Alerts 25 | View currently active alerts across all your services: 26 | - Real-time status updates from integration providers 27 | - Severity levels (Critical, Warning, Info) 28 | - Associated services and tags 29 | - Time since alert started 30 | 31 | ## Integration Sources 32 | 33 | Alerts are aggregated from all configured integrations: 34 | - Grafana alert rules 35 | 36 | Each alert shows its source integration for easy traceability back to the original monitoring system. 37 | -------------------------------------------------------------------------------- /opsimate-docs/docs/integrations/datadog.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 5 3 | tags: [Links, Monitoring Data] 4 | --- 5 | 6 | # DataDog Integration 7 | 8 | **DataDog** is a monitoring and analytics platform for cloud-scale applications, providing monitoring of servers, databases, tools, and services through a SaaS-based data analytics platform. 9 | 10 | **Integration Capabilities:** 11 | - 🔗 **Links**: Direct access to DataDog dashboards and metrics from services 12 | 13 | ## Configuration Parameters 14 | 15 | Required credentials to connect to DataDog: 16 | 17 | - **DataDog Site**: Your DataDog site (e.g., `us5.datadoghq.com` for US, `datadoghq.eu` for EU) 18 | - **API Key**: Your DataDog API key for authentication 19 | - **Application Key**: (Optional) Required for certain API operations 20 | 21 | ## Functionality 22 | 23 | ### Dashboard Links 24 | - Access DataDog dashboards directly from OpsiMate services 25 | - View service-specific metrics and logs in DataDog 26 | - Quick navigation to related dashboards and monitors 27 | 28 | ## Official Resources 29 | 30 | - **DataDog Website**: [https://www.datadoghq.com/](https://www.datadoghq.com/) 31 | - **Documentation**: [https://docs.datadoghq.com/](https://docs.datadoghq.com/) 32 | - **API Documentation**: [https://docs.datadoghq.com/api/](https://docs.datadoghq.com/) 33 | - **Getting Started**: [https://docs.datadoghq.com/getting_started/](https://docs.datadoghq.com/getting_started/) 34 | -------------------------------------------------------------------------------- /opsimate-docs/static/img/vercel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /opsimate-docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "opsimate-docs", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "docusaurus": "docusaurus", 7 | "start": "docusaurus start", 8 | "build": "docusaurus build", 9 | "swizzle": "docusaurus swizzle", 10 | "deploy": "docusaurus deploy", 11 | "clear": "docusaurus clear", 12 | "serve": "docusaurus serve", 13 | "write-translations": "docusaurus write-translations", 14 | "write-heading-ids": "docusaurus write-heading-ids", 15 | "typecheck": "tsc" 16 | }, 17 | "dependencies": { 18 | "@docsearch/css": "^4.1.0", 19 | "@docsearch/js": "^4.1.0", 20 | "@docusaurus/core": "3.8.1", 21 | "@docusaurus/preset-classic": "3.8.1", 22 | "@mdx-js/react": "^3.0.0", 23 | "@vercel/analytics": "^1.3.1", 24 | "clsx": "^2.0.0", 25 | "prism-react-renderer": "^2.3.0", 26 | "react": "^19.0.0", 27 | "react-dom": "^19.0.0" 28 | }, 29 | "devDependencies": { 30 | "@docusaurus/module-type-aliases": "3.8.1", 31 | "@docusaurus/tsconfig": "3.8.1", 32 | "@docusaurus/types": "3.8.1", 33 | "typescript": "~5.6.2" 34 | }, 35 | "browserslist": { 36 | "production": [ 37 | ">0.5%", 38 | "not dead", 39 | "not op_mini all" 40 | ], 41 | "development": [ 42 | "last 3 chrome version", 43 | "last 3 firefox version", 44 | "last 5 safari version" 45 | ] 46 | }, 47 | "engines": { 48 | "node": ">=18.0" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /opsimate-docs/docs/providers-services/providers/server-provider.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | --- 4 | 5 | # Server Provider 6 | 7 | Monitor services running on individual servers with SSH access. 8 | 9 | ## What is a Server Provider? 10 | 11 | A Server Provider represents a single server that hosts multiple services. This is the most common provider type for traditional infrastructure. 12 | 13 | ## Quick Setup 14 | 15 | ### Prerequisites 16 | - SSH access to the target server 17 | - SSH key authentication (recommended) or password access 18 | - Server running Linux, macOS, or Windows with SSH server 19 | 20 | ### Basic Configuration 21 | 22 | ```yaml 23 | name: "Production Web Server" 24 | type: "server" 25 | host: "192.168.1.100" 26 | port: 22 27 | 28 | ```yaml 29 | ssh_key_file: "server_key.pem" 30 | ``` 31 | 32 |
33 | Audit Log Dashboard 34 |

Adding a server provider to OpsiMate

35 |
36 | 37 | ## Types of Services 38 | 39 | Server providers support two primary service monitoring approaches: 40 | 41 | ### Docker Containers 42 | 43 | **Automatic Discovery**: OpsiMate automatically detects all Docker containers running on the server, and you can add them directly from the my providers page. 44 | 45 | ### Systemd Services 46 | 47 | **Manual Configuration**: Systemd services require manual specification during the service addition process. 48 | -------------------------------------------------------------------------------- /opsimate-docs/docs/getting-started/configuration.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: configuration 3 | title: Configuration 4 | sidebar_position: 3 5 | --- 6 | 7 | # Configuration 8 | 9 | OpsiMate uses a YAML configuration file to manage application settings. This guide covers all available configuration options. 10 | 11 | ## Basic Configuration 12 | 13 | ### Minimal Configuration 14 | 15 | ```yaml title="configfile.yml" 16 | # OpsiMate Configuration 17 | # Simple configuration file with essential settings 18 | 19 | # Server configuration 20 | server: 21 | port: 3001 # Backend API server port 22 | host: "localhost" # Use "0.0.0.0" for Docker 23 | 24 | # Client configuration 25 | client: 26 | port: 8080 # Frontend development server port 27 | api_url: "http://localhost:3001/api/v1" # Backend API URL 28 | 29 | # Database configuration 30 | database: 31 | path: "/app/data/database/opsimate.db" # SQLite database file path (mounted volume) 32 | 33 | # Security configuration 34 | security: 35 | private_keys_path: "/app/data/private-keys" # SSH private keys directory (mounted volume) 36 | 37 | ``` 38 | 39 | ## Next Steps 40 | 41 | After configuring OpsiMate: 42 | 43 | 1. **Restart the container** to apply changes 44 | 2. **Add providers** - [Learn how](../providers-services/providers/add-provider) 45 | 3. **Set up monitoring** - [Configure alerts](../alerts/adding-alerts.md) 46 | 4. **Start discovering services** - [Quick start guide](../providers-services/services/add-services) 47 | 48 | ## Support 49 | 50 | If you need help with configuration: 51 | 52 | - Check the [deployment guide](deploy) for basic setup 53 | - Join our [community discussions](https://github.com/opsimate/opsimate/discussions) 54 | - Report configuration issues on [GitHub](https://github.com/opsimate/opsimate/issues) 55 | -------------------------------------------------------------------------------- /opsimate-docs/docs/alerts/adding-alerts.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | 5 | # Adding Alerts 6 | 7 | Learn how to set up alerts for your services through integration providers like Grafana. 8 | 9 | ## How It Works 10 | 11 | Alerts in OpsiMate are created through integrations with external alert providers. When you configure an integration like Grafana, alerts from that system are automatically pulled into OpsiMate and associated with your services. 12 | 13 | ## Setting Up Alerts 14 | 15 | ### 1. Tag Your Services 16 | First, ensure your services have proper tags that match your alert configuration: 17 | 18 | - Navigate to your service in the dashboard 19 | - Add relevant tags that correspond to your alert rules 20 | - Common tags include: `environment`, `team`, `criticality`, `component` 21 | 22 | ### 2. Configure Integration 23 | Set up your alert provider integration: 24 | 25 | - Go to **Integrations** → **External Integrations** 26 | - Configure your alert provider (e.g., Grafana) 27 | - Ensure the integration has access to your alert rules 28 | - Map alert tags to service tags for proper association 29 | 30 | ### 3. Alert Association 31 | OpsiMate automatically associates alerts with services based on: 32 | 33 | **Tag matching**: Alerts with tags that match service tags 34 | 35 | ## Viewing Alerts 36 | 37 | Once configured, you can view alerts directly in the **Service Menu** within the dashboard: 38 | 39 | - Navigate to any service in your dashboard 40 | - Click on the service to open the Service Menu 41 | - Alerts will appear in the alerts section 42 | - View alert status, severity, and details 43 | 44 | ## Alert States 45 | 46 | Alerts can have the following states: 47 | - **Active**: Currently firing 48 | - **Dismissed**: Manually acknowledged by a user 49 | 50 | The system automatically updates alert states based on your integration provider's data. 51 | -------------------------------------------------------------------------------- /opsimate-docs/docs/providers-services/providers/add-provider.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | 5 | # Adding Providers 6 | 7 | Connect your infrastructure to OpsiMate. 8 | 9 | ## Quick Setup 10 | 11 | ### Add Provider 12 | 13 | Adding a provider to OpsiMate is simple and takes just a few steps: 14 | 15 | 1. **Open the Providers Section** 16 | From your OpsiMate dashboard, navigate to **Providers**. 17 | 18 | 2. **Select a Provider Type** 19 | Choose from the available types such as Server, Kubernetes or other supported providers. 20 | 21 | 3. **Configure and Test** 22 | Enter the required connection details and run a quick test to confirm connectivity. 23 | 24 | 4. **Enable Monitoring** 25 | Save your configuration and start adding services. 26 | 27 |
28 | My Providers Dashboard 29 |

My Providers page showing configured infrastructure providers and their services

30 |
31 | 32 | ## Next Steps 33 | 34 | Once your provider is added: 35 | 36 | 1. **[Configure Services](../services/add-services)** - Fine-tune service monitoring 37 | 2. **[Set Up Alerts](../../alerts/adding-alerts)** - Get notified of issues 38 | 39 | :::info Provider Types 40 | You can find detailed guides for specific provider types in the other pages in this folder: 41 | 42 | - **[Server Provider](server-provider)** - SSH-based server monitoring 43 | - **[Kubernetes Provider](kubernetes-provider)** - K8s cluster integration 44 | ::: 45 | 46 | :::tip Best Practice 47 | Start with one provider and ensure it's working perfectly before adding more. This makes troubleshooting much easier! 48 | ::: 49 | -------------------------------------------------------------------------------- /opsimate-docs/docs/integrations/overview.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | 5 | # Integrations Overview 6 | 7 | Integrations are the way to connect external tools to OpsiMate. The goal is to leverage existing tools to enable monitoring, control, and interaction with other interfaces. 8 | 9 | ## Integration Layers 10 | 11 |
12 |
13 | 🚨 Receiving Alerts 14 |

Get alerts from external monitoring systems

15 |
16 |
17 | 🔗 External Links 18 |

Link external URLs and dashboards to services

19 |
20 |
21 | 📊 Monitoring Data 22 |

Add logs, metrics, and performance data

23 |
24 |
25 | ⚡ Actions 26 |

Use tools to control services and run actions

27 |
28 |
29 | 30 | ## Available Integrations 31 | 32 | ### Grafana 33 | 34 | Visualization and dashboarding platform for metrics and monitoring data. 35 | 36 | ### Kibana 37 | 38 | Data visualization dashboard for Elasticsearch, used for log analysis and search. 39 | 40 | ### DataDog 41 | 42 | Cloud monitoring and analytics platform for infrastructure, applications, and logs. 43 | 44 | ## Getting Started 45 | 46 | 1. Navigate to **My Integrations** page 47 | 2. Click **External Integrations** tab 48 | 3. Choose your integration type 49 | 4. Follow the setup instructions 50 | 51 |
52 | Grafana Integration Setup 53 |

Setting up Grafana integration in OpsiMate

54 |
55 | 56 | Select an integration to learn how to set it up: 57 | 58 | - [Setting up Grafana Integration](/docs/integrations/grafana) 59 | - [Setting up Kibana Integration](/docs/integrations/kibana) 60 | -------------------------------------------------------------------------------- /opsimate-docs/README.md: -------------------------------------------------------------------------------- 1 | # OpsiMate Documentation 2 | 3 | This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. 4 | 5 | ## Installation 6 | 7 | ```bash 8 | npm install 9 | ``` 10 | 11 | ## Local Development 12 | 13 | ```bash 14 | npm run start 15 | ``` 16 | 17 | This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. 18 | 19 | ## Build 20 | 21 | ```bash 22 | npm run build 23 | ``` 24 | 25 | This command generates static content into the `build` directory and can be served using any static contents hosting service. 26 | 27 | ## Deployment to Vercel 28 | 29 | This documentation site is configured for seamless deployment on Vercel. Follow these steps to deploy: 30 | 31 | 1. **Push your code to GitHub** 32 | ```bash 33 | git add . 34 | git commit -m "Documentation ready for deployment" 35 | git push 36 | ``` 37 | 38 | 2. **Import to Vercel** 39 | - Go to [Vercel](https://vercel.com/new) 40 | - Import your GitHub repository 41 | - Select the repository containing this documentation 42 | 43 | 3. **Configure the project** 44 | - Framework Preset: Select "Docusaurus" 45 | - Build Command: `npm run build` 46 | - Output Directory: `build` 47 | - Install Command: `npm install` 48 | 49 | 4. **Environment Variables** 50 | No additional environment variables are required for basic deployment. 51 | 52 | 5. **Deploy** 53 | Click "Deploy" and Vercel will build and deploy your documentation site. 54 | 55 | ## Features 56 | 57 | - **Multi-page Documentation**: Organized into logical sections 58 | - **Responsive Design**: Works on mobile and desktop 59 | - **Search**: Built-in search functionality 60 | - **Versioning**: Support for multiple versions of documentation 61 | - **Community Links**: Integration with Slack and GitHub 62 | 63 | ## Community 64 | 65 | - [GitHub Repository](https://github.com/Fifaboyz/OpsiMate) 66 | - [Slack Community](https://join.slack.com/t/opsimate/shared_invite/zt-39bq3x6et-NrVCZzH7xuBGIXmOjJM7gA) 67 | -------------------------------------------------------------------------------- /opsimate-docs/docs/core-features.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | --- 4 | 5 | # 🚀 Core Features 6 | 7 | OpsiMate brings everything together in one powerful platform - your complete infrastructure command center. 8 | 9 | ## 🌐 All in the Same Place 10 | 11 | **Every Infrastructure, Everywhere** 12 | - From bare metal servers to Kubernetes clusters 13 | - AWS Lambda functions and cloud services 14 | - Docker containers and virtual machines 15 | - All your monitoring tools and 3rd party integrations 16 | - One unified view of your entire technology stack 17 | 18 | ## 💍 One Ring to Rule Them All 19 | 20 | **Control Everything from One Place** 21 | - Want to run a script on a server? ✅ 22 | - Need to restart a Docker container? ✅ 23 | - Trigger a Jenkins pipeline? ✅ 24 | - Scale your Kubernetes deployment? ✅ 25 | - Execute any action across your entire infrastructure and toolchain 26 | 27 | ## 👥 Simple for Everyone 28 | 29 | **User Interface Made for All** 30 | - **Project Owners & Customers**: Clear status dashboards to understand system health 31 | - **DevOps Engineers**: Powerful controls to manage and fix issues quickly 32 | - **Software Engineers**: Easy access to logs, metrics, and troubleshooting tools 33 | - **Non-Technical Users**: Simple, intuitive interface that anyone can understand 34 | 35 | ## 📊 Unified Monitoring View 36 | 37 | **Connect All Your Tools** 38 | - Integrate monitoring tools, alerts, metrics, and logs 39 | - See exactly what impacts your environment 40 | - Correlate data from multiple sources 41 | - Get the complete picture in one consolidated view 42 | 43 | --- 44 | 45 | ## 🎯 Getting Started 46 | 47 | Ready to explore OpsiMate's capabilities? Start with: 48 | 49 | 1. **[Deploy OpsiMate](getting-started/deploy)** - Set up your monitoring platform 50 | 2. **[Add Providers](providers-services/providers/add-provider)** - Connect your infrastructure 51 | 3. **[Configure Services](providers-services/services/add-services)** - Set up service monitoring 52 | 4. **[Create Alerts](alerts/adding-alerts)** - Get notified of issues 53 | 54 | :::tip 55 | OpsiMate automatically discovers services when you add providers, making setup fast and comprehensive. 56 | ::: 57 | -------------------------------------------------------------------------------- /opsimate-docs/docs/intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: intro 3 | slug: / 4 | sidebar_position: 1 5 | --- 6 | 7 | # Welcome to OpsiMate 8 | 9 |
10 |
11 |

Simplify Your Infrastructure Management

12 |

One platform to monitor, manage, and optimize your entire infrastructure

13 |
14 |
15 | 16 | ## 🚀 The OpsiMate Vision 17 | 18 | In today's complex infrastructure landscape, teams struggle with fragmented monitoring tools, scattered dashboards, and reactive incident management. **OpsiMate was born from a simple yet powerful idea**: *What if you could manage your entire infrastructure from a single, intuitive platform?* 19 | 20 | :::tip 💡 Our Mission 21 | To transform how teams monitor and manage their infrastructure by providing a unified, intelligent platform that turns complexity into clarity. 22 | ::: 23 | 24 | ## 🎯 Why OpsiMate Exists 25 | 26 | **The Problem We Solve:** 27 | - 🔍 **Fragmented Visibility** - Multiple tools, multiple dashboards, no single source of truth 28 | - ⚡ **Reactive Operations** - Discovering issues after they impact users 29 | - 🔄 **Manual Processes** - Time-consuming manual tasks that could be automated 30 | - 📊 **Data Silos** - Metrics, logs, and alerts scattered across different systems 31 | 32 | **Our Solution:** 33 | OpsiMate unifies your entire infrastructure ecosystem into one intelligent platform that not only monitors but actively helps you manage and optimize your services. 34 | 35 | ## 🌱 Getting Started 36 | 37 | Ready to transform your infrastructure management? OpsiMate is designed to get you up and running quickly: 38 | 39 | 1. **📝 [Installation Guide](./getting-started/deploy)** - Set up OpsiMate in minutes 40 | 2. **📚 [Explore Features](./core-features)** - Discover what OpsiMate can do for your team 41 | 42 | :::info 👥 Join Our Community 43 | Have questions? Join our [Slack Community](https://join.slack.com/t/opsimate/shared_invite/zt-39bq3x6et-NrVCZzH7xuBGIXmOjJM7gA) or check out our [GitHub](https://github.com/Fifaboyz/OpsiMate) repository. 44 | ::: 45 | 46 | --- 47 | 48 | *Ready to simplify your infrastructure management? Let's get started! 🚀* 49 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | *node_modules* 3 | node_modules/ 4 | */node_modules/ 5 | 6 | # Logs 7 | npm-debug.log* 8 | yarn-debug.log* 9 | yarn-error.log* 10 | lerna-debug.log* 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Coverage directory used by tools like istanbul 19 | coverage/ 20 | *.lcov 21 | 22 | # nyc test coverage 23 | .nyc_output 24 | 25 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 26 | .grunt 27 | 28 | # Bower dependency directory (https://bower.io/) 29 | bower_components 30 | 31 | # node-waf configuration 32 | .lock-wscript 33 | 34 | # Compiled binary addons (https://nodejs.org/api/addons.html) 35 | build/Release 36 | 37 | # Dependency directories 38 | jspm_packages/ 39 | 40 | # TypeScript v1 declaration files 41 | typings/ 42 | 43 | # TypeScript cache 44 | *.tsbuildinfo 45 | 46 | # Optional npm cache directory 47 | .npm 48 | 49 | # Optional eslint cache 50 | .eslintcache 51 | 52 | # Microbundle cache 53 | .rpt2_cache/ 54 | .rts2_cache_cjs/ 55 | .rts2_cache_es/ 56 | .rts2_cache_umd/ 57 | 58 | # Optional REPL history 59 | .node_repl_history 60 | 61 | # Output of 'npm pack' 62 | *.tgz 63 | 64 | # Yarn Integrity file 65 | .yarn-integrity 66 | 67 | # dotenv environment variables file 68 | .env 69 | .env.test 70 | .env.local 71 | .env.development.local 72 | .env.test.local 73 | .env.production.local 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | .parcel-cache 78 | 79 | # Next.js build output 80 | .next 81 | 82 | # Nuxt.js build / generate output 83 | .nuxt 84 | dist 85 | 86 | # Gatsby files 87 | .cache/ 88 | public 89 | 90 | # Storybook build outputs 91 | .out 92 | .storybook-out 93 | 94 | # Temporary folders 95 | tmp/ 96 | temp/ 97 | 98 | # Logs 99 | logs 100 | *.log 101 | 102 | # Runtime data 103 | pids 104 | *.pid 105 | *.seed 106 | *.pid.lock 107 | 108 | # Optional npm cache directory 109 | .npm 110 | 111 | # Optional REPL history 112 | .node_repl_history 113 | 114 | # Output of 'npm pack' 115 | *.tgz 116 | 117 | # Yarn Integrity file 118 | .yarn-integrity 119 | 120 | # dotenv environment variables file 121 | .env 122 | 123 | # IDE files 124 | .vscode/ 125 | .idea/ 126 | *.swp 127 | *.swo 128 | *~ 129 | 130 | # OS generated files 131 | .DS_Store 132 | .DS_Store? 133 | ._* 134 | .Spotlight-V100 135 | .Trashes 136 | ehthumbs.db 137 | Thumbs.db 138 | 139 | # Build outputs 140 | build/ 141 | dist/ 142 | -------------------------------------------------------------------------------- /opsimate-docs/docs/dashboards/overview.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | 5 | # Dashboard Overview 6 | 7 | The main interface for monitoring and controlling your services. 8 | 9 |
10 | OpsiMate Dashboard 11 |

OpsiMate main dashboard showing service overview and controls

12 |
13 | 14 | ## Service Control 15 | 16 | Control services directly from the dashboard interface. 17 | 18 |
19 |
20 |

Start/Stop/Restart Services

21 |

Control service lifecycle with one-click actions

22 |
23 |
24 |

Control Services

25 |

Control services with one-click actions

26 |
27 |
28 | 29 |
30 |
31 |

One Ring to rule them all

32 |

Intagrate With all your tools related to your services

33 |
34 |
35 |

Monitor Status

36 |

Real-time service health and performance metrics and logs

37 |
38 |
39 | 40 | ## Service Filtering 41 | 42 | Filter and organize services for better visibility. 43 | 44 | ### Search Functionality 45 | - **Quick Search**: Find services by name or description 46 | - **Saved Searches**: Store frequently used filter combinations 47 | -------------------------------------------------------------------------------- /.github/workflows/link-check.yml: -------------------------------------------------------------------------------- 1 | name: Documentation Link Check 2 | 3 | on: 4 | push: 5 | branches: [main, master, develop] 6 | paths: 7 | - 'opsimate-docs/docs/**/*.md' 8 | - 'opsimate-docs/docs/**/*.mdx' 9 | pull_request: 10 | branches: [main, master, develop] 11 | paths: 12 | - 'opsimate-docs/docs/**/*.md' 13 | - 'opsimate-docs/docs/**/*.mdx' 14 | schedule: 15 | # Run weekly on Monday at 9:00 AM UTC 16 | - cron: '0 9 * * 1' 17 | workflow_dispatch: # Allow manual trigger 18 | 19 | jobs: 20 | link-check: 21 | name: Check Documentation Links 22 | runs-on: ubuntu-latest 23 | 24 | steps: 25 | - name: Checkout repository 26 | uses: actions/checkout@v4 27 | 28 | - name: Setup Node.js 29 | uses: actions/setup-node@v4 30 | with: 31 | node-version: '18' 32 | cache: 'npm' 33 | cache-dependency-path: 'opsimate-docs/package-lock.json' 34 | 35 | - name: Install dependencies 36 | working-directory: ./opsimate-docs 37 | run: npm ci 38 | 39 | - name: Build documentation 40 | working-directory: ./opsimate-docs 41 | run: npm run build 42 | env: 43 | # Fail on broken links 44 | NODE_ENV: production 45 | 46 | - name: Check internal links with markdown-link-check 47 | uses: gaurav-nelson/github-action-markdown-link-check@v1 48 | with: 49 | config-file: '.github/workflows/link-check-config.json' 50 | base-branch: 'main' 51 | use-quiet-mode: 'no' 52 | use-verbose-mode: 'yes' 53 | folder-path: 'opsimate-docs/docs/' 54 | file-extension: '.md,.mdx' 55 | 56 | - name: Generate link check report 57 | if: failure() 58 | run: | 59 | echo "## Link Check Failed ❌" >> $GITHUB_STEP_SUMMARY 60 | echo "" >> $GITHUB_STEP_SUMMARY 61 | echo "Some documentation links are broken. Please review the logs above." >> $GITHUB_STEP_SUMMARY 62 | echo "" >> $GITHUB_STEP_SUMMARY 63 | echo "### Common Issues:" >> $GITHUB_STEP_SUMMARY 64 | echo "- Renamed or moved files without updating references" >> $GITHUB_STEP_SUMMARY 65 | echo "- Typos in file paths" >> $GITHUB_STEP_SUMMARY 66 | echo "- Missing documentation pages" >> $GITHUB_STEP_SUMMARY 67 | 68 | - name: Success message 69 | if: success() 70 | run: | 71 | echo "## Link Check Passed ✅" >> $GITHUB_STEP_SUMMARY 72 | echo "" >> $GITHUB_STEP_SUMMARY 73 | echo "All documentation links are valid!" >> $GITHUB_STEP_SUMMARY 74 | -------------------------------------------------------------------------------- /opsimate-docs/static/css/unused-custom.css: -------------------------------------------------------------------------------- 1 | /* ────────────────────────────────────────────── 2 |    OpsiMate – Global Custom Styles (Blue Theme) 3 |    ────────────────────────────────────────────── */ 4 | 5 | /* ---------- Brand & Base Colors - BLUE THEME ---------- */ 6 | :root { 7 | --ifm-color-primary: #2196f3; 8 | --ifm-color-primary-dark: #1976d2; 9 | --ifm-color-primary-darker: #1565c0; 10 | --ifm-color-primary-light: #64b5f6; 11 | --ifm-color-primary-lighter: #90caf9; 12 | } 13 | 14 | /* ---------- Navbar - BLUE THEME ---------- */ 15 | .navbar { 16 | background-color: #2196f3; 17 | padding: 0.5rem 1rem; 18 | } 19 | 20 | .navbar__title { 21 | font-weight: 700; 22 | color: #fff; 23 | } 24 | 25 | .navbar__link, 26 | .navbar__brand { 27 | color: #fff; 28 | } 29 | 30 | .navbar__link:hover { 31 | color: #e3f2fd; 32 | } 33 | 34 | /* ---------- GitHub & Slack icon links ---------- */ 35 | .navbar__icon-link { 36 | display: flex; 37 | align-items: center; 38 | justify-content: center; 39 | width: 40px; 40 | height: 40px; 41 | margin: 0 0.25rem; 42 | padding: 8px; 43 | border-radius: 4px; 44 | transition: all 0.2s ease; 45 | color: white !important; 46 | } 47 | 48 | .navbar__icon-link:hover { 49 | background-color: rgba(255, 255, 255, 0.1); 50 | color: #e3f2fd !important; 51 | text-decoration: none; 52 | } 53 | 54 | .navbar__icon-link svg { 55 | width: 24px; 56 | height: 24px; 57 | } 58 | 59 | .navbar__items--right { 60 | display: flex; 61 | align-items: center; 62 | gap: 0.5rem; 63 | } 64 | 65 | /* ---------- Footer - BLUE THEME ---------- */ 66 | .footer { 67 | background-color: #2196f3; 68 | color: #fff; 69 | } 70 | 71 | .footer__link-item { 72 | color: #e3f2fd; 73 | } 74 | 75 | .footer__link-item:hover { 76 | color: #fff; 77 | } 78 | 79 | /* ---------- Global link colors ---------- */ 80 | a { 81 | color: #2196f3; 82 | } 83 | 84 | a:hover { 85 | color: #1976d2; 86 | } 87 | 88 | /* ---------- Mobile Navigation ---------- */ 89 | @media (max-width: 1024px) { 90 | .navbar__toggle { 91 | display: block; 92 | color: #fff; 93 | } 94 | 95 | .navbar__items--left { 96 | display: none; 97 | } 98 | 99 | .navbar__icon-link { 100 | width: 36px; 101 | height: 36px; 102 | padding: 6px; 103 | } 104 | } 105 | 106 | /* FIX: Hide the hamburger menu icon on wide screens (desktop) 107 | If the screen is 1025px or wider, explicitly hide the toggle button. 108 | */ 109 | @media (min-width: 1025px) { 110 | .navbar__toggle { 111 | display: none; 112 | } 113 | 114 | /* Ensure the main navigation links are visible on desktop */ 115 | .navbar__items--left { 116 | display: flex; /* Assuming the default desktop layout is flex */ 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /opsimate-docs/src/components/CookieConsent.js: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from "react"; 2 | import BrowserOnly from "@docusaurus/BrowserOnly"; 3 | import "./CookieConsent.css"; 4 | 5 | const CookieConsent = () => { 6 | const [showBanner, setShowBanner] = useState(false); 7 | 8 | useEffect(() => { 9 | // Check if user has already made a choice 10 | const consentGiven = localStorage.getItem("opsimateCookieConsent"); 11 | if (!consentGiven) { 12 | setShowBanner(true); 13 | } 14 | }, []); 15 | 16 | const handleAccept = () => { 17 | localStorage.setItem("opsimateCookieConsent", "accepted"); 18 | setShowBanner(false); 19 | // You can trigger additional analytics scripts here 20 | if (typeof window !== "undefined") { 21 | // Add your analytics scripts here when accepted 22 | console.log("Cookies accepted - analytics enabled"); 23 | } 24 | }; 25 | 26 | const handleReject = () => { 27 | localStorage.setItem("opsimateCookieConsent", "rejected"); 28 | setShowBanner(false); 29 | // Ensure analytics scripts are not loaded 30 | console.log("Cookies rejected - analytics disabled"); 31 | }; 32 | 33 | if (!showBanner) return null; 34 | 35 | return ( 36 |
37 |
38 |
39 |

🍪 We use cookies

40 |

41 | We, our service providers and third-party partners use cookies and other 42 | technologies to personalize content, measure usage, support marketing efforts 43 | (including cross-contextual and behavioral targeting advertising efforts) and 44 | provide an optimal experience as permitted by applicable law. Some cookies 45 | are required for the site to function and cannot be turned off. Update your 46 | preferences any time by selecting the "Privacy Choices" link. By accepting, 47 | you agree to the OpsiMate{" "} 48 | Cookie Policy. 49 |

50 |
51 |
52 | 55 | 58 |
59 |
60 |
61 | ); 62 | }; 63 | 64 | // Wrap in BrowserOnly to avoid SSR issues 65 | export default function CookieConsentWrapper() { 66 | return ( 67 | 68 | {() => } 69 | 70 | ); 71 | } -------------------------------------------------------------------------------- /opsimate-docs/sidebars.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Creating a sidebar enables you to: 3 | - create an ordered group of docs 4 | - render a sidebar for each doc of that group 5 | - provide next/previous navigation 6 | 7 | The sidebars can be generated from the filesystem, or explicitly defined here. 8 | 9 | Create as many sidebars as you want. 10 | */ 11 | 12 | // @ts-check 13 | 14 | /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ 15 | const sidebars = { 16 | tutorialSidebar: [ 17 | 'intro', 18 | 'core-features', 19 | { 20 | type: 'category', 21 | label: 'Getting Started', 22 | collapsed: true, 23 | items: [ 24 | 'getting-started/deploy', 25 | 'getting-started/configuration', 26 | 'getting-started/system-requirements', 27 | ], 28 | }, 29 | { 30 | type: 'category', 31 | label: 'Providers & Services', 32 | collapsed: true, 33 | items: [ 34 | 'providers-services/overview', 35 | { 36 | type: 'category', 37 | label: 'Providers', 38 | collapsed: true, 39 | items: [ 40 | 'providers-services/providers/add-provider', 41 | 'providers-services/providers/server-provider', 42 | 'providers-services/providers/kubernetes-provider', 43 | ], 44 | }, 45 | { 46 | type: 'category', 47 | label: 'Services', 48 | collapsed: true, 49 | items: [ 50 | 'providers-services/services/add-services', 51 | 'providers-services/services/container-services', 52 | 'providers-services/services/systemd-services', 53 | 'providers-services/services/kubernetes-pods', 54 | ], 55 | }, 56 | ], 57 | }, 58 | { 59 | type: 'category', 60 | label: 'Integrations', 61 | collapsed: true, 62 | items: [ 63 | 'integrations/overview', 64 | 'integrations/grafana', 65 | 'integrations/kibana', 66 | 'integrations/datadog', 67 | ], 68 | }, 69 | { 70 | type: 'category', 71 | label: 'Dashboard', 72 | collapsed: true, 73 | items: [ 74 | 'dashboards/overview', 75 | 'dashboards/service-menu', 76 | 'dashboards/saving-views', 77 | ], 78 | }, 79 | { 80 | type: 'category', 81 | label: 'Alerts', 82 | collapsed: true, 83 | items: ['alerts/adding-alerts', 'alerts/alert-management'], 84 | }, 85 | { 86 | type: 'category', 87 | label: 'User Management & Security', 88 | collapsed: true, 89 | items: ['user-management/register-login', 'user-management/admin-panel', 'user-management/audit-logs'], 90 | }, 91 | 'development', 92 | ], 93 | }; 94 | 95 | module.exports = sidebars; 96 | -------------------------------------------------------------------------------- /opsimate-docs/static/img/datadog.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /opsimate-docs/src/components/CookieConsent.css: -------------------------------------------------------------------------------- 1 | /* src/components/CookieConsent.css */ 2 | .cookie-consent-banner { 3 | position: fixed; 4 | bottom: 0; 5 | left: 0; 6 | right: 0; 7 | background: #1a1a1a; 8 | color: white; 9 | padding: 1.5rem; 10 | box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.3); 11 | z-index: 1000; 12 | border-top: 1px solid #333; 13 | animation: slideUp 0.3s ease-out; 14 | } 15 | 16 | @keyframes slideUp { 17 | from { 18 | transform: translateY(100%); 19 | } 20 | to { 21 | transform: translateY(0); 22 | } 23 | } 24 | 25 | .cookie-consent-content { 26 | max-width: 1200px; 27 | margin: 0 auto; 28 | display: flex; 29 | justify-content: space-between; 30 | align-items: center; 31 | gap: 2rem; 32 | } 33 | 34 | .cookie-text { 35 | flex: 1; 36 | } 37 | 38 | .cookie-text h4 { 39 | margin: 0 0 0.5rem 0; 40 | color: #bbdefb; 41 | font-size: 1.1rem; 42 | font-weight: 600; 43 | } 44 | 45 | .cookie-text p { 46 | margin: 0; 47 | font-size: 0.9rem; 48 | line-height: 1.5; 49 | color: #e3f2fd; 50 | } 51 | 52 | .cookie-text a { 53 | color: #bbdefb; 54 | text-decoration: underline; 55 | transition: color 0.2s ease; 56 | } 57 | 58 | .cookie-text a:hover { 59 | color: #90caf9; 60 | } 61 | 62 | .cookie-actions { 63 | display: flex; 64 | gap: 1rem; 65 | flex-shrink: 0; 66 | } 67 | 68 | .cookie-btn { 69 | padding: 0.75rem 1.5rem; 70 | border: none; 71 | border-radius: 6px; 72 | font-weight: 600; 73 | cursor: pointer; 74 | transition: all 0.3s ease; 75 | font-size: 0.9rem; 76 | min-width: 120px; 77 | } 78 | 79 | .cookie-btn-reject { 80 | background: transparent; 81 | color: #bbdefb; 82 | border: 1px solid #bbdefb; 83 | } 84 | 85 | .cookie-btn-reject:hover { 86 | background: rgba(187, 222, 251, 0.1); 87 | transform: translateY(-1px); 88 | } 89 | 90 | .cookie-btn-accept { 91 | background: #3949ab; 92 | color: white; 93 | border: 1px solid #3949ab; 94 | } 95 | 96 | .cookie-btn-accept:hover { 97 | background: #303f9f; 98 | border-color: #303f9f; 99 | transform: translateY(-1px); 100 | } 101 | 102 | /* Responsive design */ 103 | @media (max-width: 996px) { 104 | .cookie-consent-content { 105 | flex-direction: column; 106 | text-align: center; 107 | gap: 1.5rem; 108 | } 109 | 110 | .cookie-actions { 111 | width: 100%; 112 | justify-content: center; 113 | } 114 | } 115 | 116 | @media (max-width: 768px) { 117 | .cookie-consent-banner { 118 | padding: 1rem; 119 | } 120 | 121 | .cookie-actions { 122 | flex-direction: column; 123 | gap: 0.75rem; 124 | } 125 | 126 | .cookie-btn { 127 | width: 100%; 128 | max-width: 200px; 129 | } 130 | } 131 | 132 | @media (max-width: 480px) { 133 | .cookie-text h4 { 134 | font-size: 1rem; 135 | } 136 | 137 | .cookie-text p { 138 | font-size: 0.85rem; 139 | } 140 | 141 | .cookie-btn { 142 | padding: 0.6rem 1.2rem; 143 | font-size: 0.85rem; 144 | } 145 | } -------------------------------------------------------------------------------- /opsimate-docs/static/img/kubernetes.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /opsimate-docs/blog/2019-05-29-long-blog-post.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: long-blog-post 3 | title: Long Blog Post 4 | authors: yangshun 5 | tags: [hello, docusaurus] 6 | --- 7 | 8 | This is the summary of a very long blog post, 9 | 10 | Use a `` comment to limit blog post size in the list view. 11 | 12 | 13 | 14 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 15 | 16 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 17 | 18 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 19 | 20 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 21 | 22 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 23 | 24 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 25 | 26 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 27 | 28 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 29 | 30 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 31 | 32 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 33 | 34 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 35 | 36 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 37 | 38 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 39 | 40 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 41 | 42 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 43 | 44 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 45 | -------------------------------------------------------------------------------- /opsimate-docs/docs/getting-started/deploy.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: deploy 3 | title: Deploy OpsiMate 4 | sidebar_position: 2 5 | --- 6 | 7 | # Deploy OpsiMate 8 | 9 | OpsiMate is designed for easy deployment using Docker. This guide will walk you through deploying OpsiMate using Docker Compose or Docker run commands. 10 | 11 | :::info Before You Begin 12 | Make sure your system meets the [system requirements](system-requirements) and that Docker is installed and running. 13 | ::: 14 | 15 | ## Quick Start (Recommended) 16 | 17 | The easiest way to get started with OpsiMate is using our one-line installation script: 18 | 19 | ```bash 20 | curl -fsSL https://raw.githubusercontent.com/OpsiMate/OpsiMate/main/scripts/start-docker.sh | sh 21 | ``` 22 | 23 | This script will: 24 | - Download the latest OpsiMate Docker Compose configuration 25 | - Set up the necessary directories and permissions 26 | - Start OpsiMate using Docker Compose 27 | - Verify that all services are running correctly 28 | 29 | :::tip What happens next? 30 | Once the script completes, OpsiMate will be running at `http://localhost:8080`. You'll be able to register your first admin user and start managing your infrastructure right away! 31 | ::: 32 | 33 | ## Alternative Deployment Methods 34 | 35 | If you prefer more control over your deployment or need to customize the setup, you can use the Docker run command below. 36 | 37 | ### Docker Run Command 38 | 39 | Deploy OpsiMate with a single Docker command: 40 | 41 | ```bash 42 | docker run -d \ 43 | --name opsimate \ 44 | --rm \ 45 | -p 3001:3001 -p 8080:8080 \ 46 | opsimate/opsimate 47 | ``` 48 | 49 | ### Volume Mounts 50 | 51 | | Volume | Purpose | 52 | |--------|---------| 53 | | `/app/data/database` | SQLite database persistence | 54 | | `/app/data/private-keys` | SSH private keys for authentication | 55 | | `/app/config/config.yml` | Custom configuration | 56 | 57 | :::success 58 | OpsiMate is now running at `http://localhost:8080` 59 | Register a user for the first time - it will be the first admin user 60 | ::: 61 | 62 | ### Verify Deployment 63 | 64 | ```bash 65 | # Check container status 66 | docker ps | grep opsimate 67 | 68 | # View application logs 69 | docker logs opsimate 70 | 71 | # Check health status 72 | curl http://localhost:8080/health 73 | ``` 74 | 75 | ## First Login 76 | 77 | When you first access OpsiMate at `http://localhost:8080`, you'll be prompted to create your first admin user: 78 | 79 | First Login Screen 80 | 81 | Simply fill in your email, full name, and password to create the initial admin account. This user will have full administrative privileges to configure providers, manage services, and access all OpsiMate features. 82 | 83 | ## Next Steps 84 | 85 | After deployment: 86 | 87 | 1. **Access OpsiMate** at `http://localhost:8080` 88 | 2. **Configure your settings** - [See configuration guide](configuration) 89 | 3. **Check system requirements** - [System requirements](system-requirements) 90 | 91 | ## Support 92 | 93 | If you encounter issues during deployment: 94 | 95 | - Check the [configuration guide](configuration) 96 | - Join our [community discussions](https://github.com/opsimate/opsimate/discussions) 97 | - Report bugs on [GitHub Issues](https://github.com/opsimate/opsimate/issues) 98 | -------------------------------------------------------------------------------- /opsimate-docs/docs/dashboards/service-menu.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | --- 4 | 5 | # Service Menu 6 | 7 | Access service-specific options and controls through the right-side menu. 8 | 9 | ## Accessing the Service Menu 10 | 11 | Click on any service in the dashboard to open the service-specific menu panel. 12 | 13 |
14 | Service Menu Sidebar 15 |

Service menu sidebar with detailed controls and information

16 |
17 | 18 |
19 |
20 |

Service Details

21 |

View comprehensive service information and status

22 |
23 |
24 |

Quick Actions

25 |

Start, stop, restart, and manage services

26 |
27 |
28 | 29 | ## Menu Options 30 | 31 | ### Service Control 32 | - **Start Service**: Activate inactive services 33 | - **Stop Service**: Gracefully stop running services 34 | - **Restart Service**: Restart services to resolve issues 35 | - **Force Stop**: Emergency service termination 36 | 37 | ### Monitoring & Alerts 38 | - **Configure Alerts**: Set up service-specific notifications 39 | - **View Metrics**: Access detailed performance data 40 | - **Health Checks**: Configure and view service health status 41 | - **Threshold Settings**: Set resource usage alerts 42 | 43 | ### Logs & Diagnostics 44 | - **View Logs**: Access real-time service logs 45 | - **Download Logs**: Export log files for analysis 46 | - **Log Filtering**: Search and filter log entries 47 | - **Error Analysis**: Identify and analyze service errors 48 | 49 | ### Service Configuration 50 | - **Edit Settings**: Modify service configuration 51 | - **Environment Variables**: Manage service environment 52 | - **Resource Limits**: Set CPU and memory constraints 53 | - **Dependency Management**: Configure service dependencies 54 | 55 | ### Tags & Organization 56 | - **Add Tags**: Label services for better organization 57 | - **Edit Description**: Update service descriptions 58 | - **Group Assignment**: Assign services to logical groups 59 | - **Priority Settings**: Set service monitoring priority 60 | 61 | ## Context-Sensitive Options 62 | 63 | Menu options adapt based on service type and current status. 64 | 65 | ### For Running Services 66 | - Stop and restart options available 67 | - Real-time metrics and logs accessible 68 | - Performance monitoring active 69 | 70 | ### For Stopped Services 71 | - Start option prominently displayed 72 | - Configuration editing enabled 73 | - Historical data available 74 | 75 | ### Service Type Specific 76 | - **Systemd Services**: Systemctl command options 77 | - **Docker Containers**: Container management commands 78 | - **Kubernetes Pods**: Kubectl operations and namespace management 79 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

OpsiMate - documentation repo!

2 |

The official documentation of OpsiMate - https://opsimate.vercel.app/

3 |

One console for servers, Docker, and Kubernetes—discover, monitor, and act.

4 |

5 | Built for DevOps/NOC/IT teams that need a single place to see service health, 6 | jump to dashboards, and perform safe start/stop/restart operations. 7 |

8 | 9 |

10 | 11 | Commit activity 12 | 13 | 14 | Latest release 15 | 16 | 17 | License 18 | 19 | 20 | GitHub stars 21 | 22 | 23 | Join Slack 24 | 25 |

26 | 27 |

28 | Get Started · 29 | Docs · 30 | Website · 31 | Report Bug 32 |

33 | 34 | ## Contributing & running 35 | 36 | ```bash 37 | #install documentation dependencies 38 | npm install 39 | 40 | #build the documentation 41 | npm run build 42 | 43 | #run the documentation 44 | npm run dev 45 | 46 | ``` 47 | now the docs are available at http://localhost:8080/ 48 | 49 | 50 | ## Docker 51 | 52 | You can build and run the OpsiMate documentation inside a Docker container for a clean and reproducible environment. 53 | 54 | ### Build the Docker image 55 | 56 | ```bash 57 | cd opsimate-docs 58 | docker build -t opsimate-docs . 59 | 60 | ``` 61 | 62 | ### Run the Container 63 | 64 | ```bash 65 | docker run -p 3000:3000 --env-file .env opsimate-docs 66 | ``` 67 | 68 | ## Support 69 | 70 | - **[Documentation](https://opsimate.vercel.app/)** - Comprehensive guides and API reference 71 | - **[GitHub Issues](https://github.com/opsimate/opsimate/issues)** - Bug reports and feature requests 72 | - **[Slack Community](https://join.slack.com/t/opsimate/shared_invite/zt-39bq3x6et-NrVCZzH7xuBGIXmOjJM7gA)** - Join our discussions and get help 73 | - **[Website](https://www.opsimate.com/)** - Learn more about OpsiMate 74 | 75 | --- 76 | 77 |
78 |

Built with ❤️ by the OpsiMate team

79 |

© 2025 OpsiMate. All rights reserved.

80 |
81 | 82 | ## 💖 Our Amazing Contributors 83 | 84 | This project wouldn’t be what it is today without the incredible people who have shared their time, knowledge, and creativity. 85 | A huge thank you to everyone who has helped and continues to help make OpsiMate better every day! 🙌 86 | 87 | 88 | 89 | 90 | 91 | --- 92 | -------------------------------------------------------------------------------- /opsimate-docs/docs/providers-services/overview.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | 5 | # Providers & Services Overview 6 | 7 | Understanding the relationship between providers and services is key to effectively using OpsiMate for infrastructure monitoring. 8 | 9 | ## What are Providers? 10 | 11 | **Providers** are the infrastructure platforms where your applications run. Think of them as the "containers" that host your services: 12 | 13 |
14 |
15 |

🖥️ Server Provider

16 |

A single server or VM that hosts multiple services

17 |
    18 |
  • Systemd services
  • 19 |
  • Docker containers
  • 20 |
  • Background processes
  • 21 |
22 |
23 | 24 |
25 |

☸️ K8S Cluster

26 |

Kubernetes cluster with multiple nodes

27 |
    28 |
  • Pods across nodes
  • 29 |
  • Deployments
  • 30 |
  • Services & ingress
  • 31 |
32 |
33 |
34 | 35 |
36 | Provider Overview Dashboard 37 |

OpsiMate provider overview showing connected infrastructure

38 |
39 | 40 | ## What are Services? 41 | 42 | **Services** are the core applications and processes within your system—delivering value or enabling critical capabilities, not necessarily only for end‑users. These are the components you need to both monitor and control to ensure smooth operation and effective management. 43 | 44 | ### Service Types 45 | 46 |
47 | 48 |
49 | 🐳 Containers
50 | Docker containers running your applications 51 |
52 |
53 | 54 |
55 | ⚙️ Systemd Services
56 | Linux system services managed by systemd 57 |
58 |
59 | 60 |
61 | 🎯 Kubernetes Pods
62 | Containerized apps in Kubernetes clusters 63 |
64 |
65 |
66 | 67 | 68 | ## Getting Started 69 | 70 | Ready to set up your infrastructure monitoring? 71 | 72 | 1. **[Add Providers](providers/add-provider)** - Connect your infrastructure 73 | 2. **[Discover Services](services/add-services)** - Find and import your applications 74 | 3. **[Monitor Everything](../dashboards/overview)** - Keep your services healthy 75 | 76 | :::tip Pro Tip 77 | Start with one provider and let OpsiMate discover its services automatically. You can always add more providers and manually add specific services later! 78 | ::: 79 | -------------------------------------------------------------------------------- /opsimate-docs/static/img/grafana.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /opsimate-docs/src/pages/index.module.css: -------------------------------------------------------------------------------- 1 | /** 2 | * src/pages/index.module.css 3 | * Scoped CSS module for homepage sections (Hero, Features, Community) 4 | */ 5 | 6 | /* ---------- Hero Section (Darker Indigo Gradient) ---------- */ 7 | .hero { 8 | padding: 4rem 0 2rem; 9 | text-align: center; 10 | color: white; 11 | min-height: 100vh; 12 | background: linear-gradient(135deg, #1a237e 0%, #283593 50%, #3949ab 100%); 13 | } 14 | 15 | [data-theme='dark'] .hero { 16 | background: linear-gradient(135deg, #1a237e 0%, #283593 50%, #3949ab 100%) !important; 17 | } 18 | 19 | .heroContent { 20 | max-width: 800px; 21 | margin: 0 auto 4rem; 22 | } 23 | 24 | .heroTitle { 25 | font-size: 3rem; 26 | font-weight: 700; 27 | margin-bottom: 1rem; 28 | color: white; 29 | } 30 | 31 | .heroSubtitle { 32 | font-size: 1.5rem; 33 | font-weight: 400; 34 | margin-bottom: 1rem; 35 | color: #e3f2fd; 36 | } 37 | 38 | .heroDescription { 39 | font-size: 1.1rem; 40 | color: #bbdefb; 41 | line-height: 1.6; 42 | max-width: 600px; 43 | margin: 0 auto; 44 | } 45 | 46 | /* ---------- Features Section ---------- */ 47 | .featuresSection { 48 | padding: 4rem 0; 49 | border-radius: 12px; 50 | margin: 2rem auto; 51 | max-width: 1200px; 52 | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); 53 | background: white; 54 | } 55 | 56 | [data-theme='dark'] .featuresSection { 57 | background: #000000; 58 | box-shadow: 0 2px 8px rgba(51, 103, 214, 0.2); 59 | } 60 | 61 | .featuresTitle { 62 | font-size: 2.5rem; 63 | font-weight: 600; 64 | text-align: center; 65 | margin-bottom: 3rem; 66 | color: var(--ifm-color-primary) !important; 67 | } 68 | 69 | .featuresGrid { 70 | display: grid; 71 | grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); 72 | gap: 2rem; 73 | padding: 0 2rem; 74 | } 75 | 76 | .featureCard { 77 | display: flex; 78 | align-items: flex-start; 79 | border-radius: 8px; 80 | padding: 1.5rem; 81 | text-decoration: none; 82 | transition: all 0.3s ease; 83 | height: 100%; 84 | background: #f8f9fa; 85 | border: 1px solid #e0e0e0; 86 | } 87 | 88 | [data-theme='dark'] .featureCard { 89 | background: #111111; 90 | border: 1px solid #333333; 91 | } 92 | 93 | .featureCard:hover { 94 | border-color: var(--ifm-color-primary); 95 | transform: translateY(-2px); 96 | box-shadow: 0 4px 12px rgba(83, 109, 254, 0.15); /* subtle indigo shadow */ 97 | } 98 | 99 | /* Card Icon */ 100 | .cardIcon { 101 | width: 48px; 102 | height: 48px; 103 | background: var(--ifm-color-primary); /* unified indigo */ 104 | border-radius: 8px; 105 | display: flex; 106 | align-items: center; 107 | justify-content: center; 108 | color: white; 109 | margin-right: 1.5rem; 110 | flex-shrink: 0; 111 | } 112 | 113 | .cardIcon svg { 114 | width: 24px; 115 | height: 24px; 116 | } 117 | 118 | .cardContent { 119 | flex: 1; 120 | text-align: left; 121 | } 122 | 123 | .cardTitle { 124 | font-size: 1.25rem; 125 | font-weight: 600; 126 | margin-bottom: 0.5rem; 127 | color: var(--ifm-color-primary); 128 | } 129 | 130 | [data-theme='dark'] .cardTitle { 131 | color: #ffffff; 132 | } 133 | 134 | .cardDescription { 135 | line-height: 1.5; 136 | margin: 0; 137 | color: #424242; 138 | } 139 | 140 | [data-theme='dark'] .cardDescription { 141 | color: #bbbbbb; 142 | } 143 | 144 | /* ---------- Community Section ---------- */ 145 | .communitySection { 146 | padding: 3rem 0; 147 | text-align: center; 148 | border-radius: 12px; 149 | margin: 2rem auto; 150 | max-width: 800px; 151 | background: #f5f5f5; 152 | border: 1px solid #e0e0e0; 153 | } 154 | 155 | [data-theme='dark'] .communitySection { 156 | background: #111111; 157 | border: 1px solid #333333; 158 | } 159 | 160 | .communityTitle { 161 | font-size: 2rem; 162 | font-weight: 600; 163 | margin-bottom: 1rem; 164 | color: var(--ifm-color-primary) !important; 165 | } 166 | 167 | [data-theme='dark'] .communityTitle { 168 | color: #ffffff; 169 | } 170 | 171 | .communityDescription { 172 | font-size: 1.1rem; 173 | margin-bottom: 2rem; 174 | line-height: 1.6; 175 | color: #424242; 176 | } 177 | 178 | [data-theme='dark'] .communityDescription { 179 | color: #bbbbbb; 180 | } 181 | 182 | /* Buttons */ 183 | .communityButtons { 184 | display: flex; 185 | gap: 1rem; 186 | justify-content: center; 187 | flex-wrap: wrap; 188 | } 189 | 190 | .communityButton, 191 | .homepage__cta { 192 | display: inline-flex; 193 | align-items: center; 194 | padding: 0.75rem 2rem; 195 | background-color: var(--ifm-color-primary) !important; 196 | border: 2px solid var(--ifm-color-primary) !important; 197 | color: #fff !important; 198 | border-radius: 6px; 199 | font-weight: 500; 200 | transition: all 0.3s ease; 201 | text-decoration: none; 202 | } 203 | 204 | .communityButton:hover, 205 | .homepage__cta:hover { 206 | background-color: var(--ifm-color-primary-dark) !important; 207 | border-color: var(--ifm-color-primary-dark) !important; 208 | color: #fff !important; 209 | } 210 | 211 | /* ---------- Responsive Design ---------- */ 212 | @media screen and (max-width: 996px) { 213 | .hero { 214 | padding: 2rem 0 1rem; 215 | } 216 | 217 | .heroTitle { 218 | font-size: 2.5rem; 219 | } 220 | 221 | .heroSubtitle { 222 | font-size: 1.3rem; 223 | } 224 | 225 | .featuresGrid { 226 | grid-template-columns: 1fr; 227 | gap: 1.5rem; 228 | padding: 0 1rem; 229 | } 230 | 231 | .featureCard { 232 | flex-direction: column; 233 | text-align: center; 234 | } 235 | 236 | .cardIcon { 237 | margin-right: 0; 238 | margin-bottom: 1rem; 239 | } 240 | 241 | .communityButtons { 242 | flex-direction: column; 243 | align-items: center; 244 | } 245 | 246 | .communityButton { 247 | width: 200px; 248 | justify-content: center; 249 | } 250 | } 251 | 252 | @media screen and (max-width: 768px) { 253 | .heroTitle { 254 | font-size: 2rem; 255 | } 256 | 257 | .heroSubtitle { 258 | font-size: 1.1rem; 259 | } 260 | 261 | .featuresTitle { 262 | font-size: 2rem; 263 | } 264 | 265 | .communityTitle { 266 | font-size: 1.5rem; 267 | } 268 | 269 | .featuresGrid { 270 | grid-template-columns: 1fr; 271 | } 272 | 273 | .featureCard { 274 | padding: 1.2rem; 275 | } 276 | } 277 | 278 | -------------------------------------------------------------------------------- /opsimate-docs/src/pages/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Layout from '@theme/Layout'; 3 | import Link from '@docusaurus/Link'; 4 | import styles from './index.module.css'; 5 | 6 | // Icons with OpsiMate blue theme 7 | const GettingStartedIcon = () => ( 8 | 9 | 10 | 11 | ); 12 | 13 | const IntegrationsIcon = () => ( 14 | 15 | 16 | 17 | ); 18 | 19 | const AlertsIcon = () => ( 20 | 21 | 22 | 23 | ); 24 | 25 | const DashboardIcon = () => ( 26 | 27 | 28 | 29 | ); 30 | 31 | const UserManagementIcon = () => ( 32 | 33 | 34 | 35 | ); 36 | 37 | const DevelopmentIcon = () => ( 38 | 39 | 40 | 41 | ); 42 | 43 | // ✅ New: Slack & GitHub brand icons 44 | const GitHubIcon = () => ( 45 | 52 | 53 | 54 | ); 55 | 56 | const SlackIcon = () => ( 57 | 64 | 65 | 66 | ); 67 | 68 | const FeatureCard = ({ icon: Icon, title, description, to }) => ( 69 | 70 |
71 | 72 |
73 |
74 |

{title}

75 |

{description}

76 |
77 | 78 | ); 79 | 80 | export default function Home() { 81 | const features = [ 82 | { icon: GettingStartedIcon, title: 'Getting Started', description: 'Deploy and configure OpsiMate with our comprehensive setup guide', to: '/docs/getting-started/deploy' }, 83 | { icon: DashboardIcon, title: 'Dashboard', description: 'Create custom dashboards and save views for your services', to: '/docs/dashboards/overview' }, 84 | { icon: AlertsIcon, title: 'Alerts', description: 'Configure intelligent alerts and manage notifications effectively', to: '/docs/alerts/adding-alerts' }, 85 | { icon: IntegrationsIcon, title: 'Integrations', description: 'Connect with Grafana, Kibana, Datadog and other monitoring tools', to: '/docs/integrations/overview' }, 86 | { icon: UserManagementIcon, title: 'User Management & Security', description: 'Manage users, admin panels, and audit logs for secure operations', to: '/docs/user-management/register-login' }, 87 | { icon: DevelopmentIcon, title: 'Development', description: 'Extend and customize OpsiMate for your specific needs', to: '/docs/development' } 88 | ]; 89 | 90 | return ( 91 | 92 |
93 |
94 |
95 |

Welcome to OpsiMate

96 |

Simplify Your Infrastructure Management

97 |

98 | One platform to monitor, manage, and optimize your entire infrastructure 99 |

100 |
101 | 102 | {/* Feature Cards Section */} 103 |
104 |

Explore the Docs

105 |
106 | {features.map((feature, index) => ( 107 | 108 | ))} 109 |
110 |
111 | 112 | {/* Community Section with icons */} 113 |
114 |

Join Our Community

115 |

116 | Have questions? Join our Slack Community or check out our GitHub repository. 117 |

118 |
119 | 123 | GitHub 124 | 125 | 129 | Slack Community 130 | 131 |
132 |
133 |
134 |
135 |
136 | ); 137 | } 138 | 139 | 140 | 141 | -------------------------------------------------------------------------------- /opsimate-docs/docusaurus.config.js: -------------------------------------------------------------------------------- 1 | // docusaurus.config.js 2 | module.exports = { 3 | title: 'OpsiMate', 4 | tagline: 'One console for servers, Docker, and Kubernetes', 5 | url: 'https://your-site.com', 6 | baseUrl: '/', 7 | favicon: 'img/favicon.ico', 8 | organizationName: 'OpsiMate', 9 | projectName: 'documentation', 10 | 11 | onBrokenLinks: 'warn', 12 | onBrokenMarkdownLinks: 'warn', 13 | 14 | presets: [ 15 | [ 16 | 'classic', 17 | { 18 | docs: { 19 | routeBasePath: '/docs', 20 | sidebarPath: require.resolve('./sidebars.js'), 21 | showLastUpdateTime: true, 22 | editUrl: 'https://github.com/OpsiMate/documentation/edit/main/', 23 | }, 24 | blog: false, 25 | theme: { customCss: require.resolve('./src/css/custom.css') }, 26 | }, 27 | ], 28 | ], 29 | 30 | themeConfig: { 31 | // Color mode configuration - THIS ENABLES THE TOGGLE 32 | colorMode: { 33 | defaultMode: 'light', 34 | disableSwitch: false, // This enables the toggle! 35 | respectPrefersColorScheme: true, 36 | }, 37 | 38 | navbar: { 39 | title: 'OpsiMate', 40 | logo: { alt: 'OpsiMate Logo', src: 'img/opsimate-logo.svg' }, 41 | items: [ 42 | { type: 'docSidebar', sidebarId: 'tutorialSidebar', position: 'left', label: 'Docs' }, 43 | { type: 'doc', docId: 'dashboards/overview', position: 'left', label: 'Dashboard' }, 44 | { type: 'doc', docId: 'alerts/adding-alerts', position: 'left', label: 'Alerts' }, 45 | { type: 'doc', docId: 'integrations/overview', position: 'left', label: 'Integrations' }, 46 | { type: 'doc', docId: 'user-management/register-login', position: 'left', label: 'User Management' }, 47 | 48 | // --- Right-side icons (GitHub + Slack) --- 49 | { 50 | type: 'html', 51 | position: 'right', 52 | value: ` 53 | 67 | `, 68 | }, 69 | ], 70 | }, 71 | 72 | footer: { 73 | style: 'dark', 74 | links: [ 75 | { 76 | title: 'Integrate with', 77 | items: [ 78 | { 79 | html: ` 80 | 118 | `, 119 | }, 120 | ], 121 | }, 122 | { 123 | title: 'Community', 124 | items: [ 125 | { 126 | html: ` 127 | 141 | `, 142 | }, 143 | ], 144 | }, 145 | ], 146 | // --- VERCEL CARD FOOTER BOTTOM --- 147 | copyright: ` 148 | 165 | `, 166 | }, 167 | 168 | algolia: { 169 | appId: 'GADD2TVEH5', 170 | apiKey: 'cc7b48e597d80aa85aad4c50df82812f', 171 | indexName: 'OpsiMate Docs', 172 | contextualSearch: true, 173 | }, 174 | }, 175 | }; 176 | 177 | 178 | -------------------------------------------------------------------------------- /opsimate-docs/static/img/undraw_docusaurus_tree.svg: -------------------------------------------------------------------------------- 1 | 2 | Focus on What Matters 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /opsimate-docs/src/css/custom.css: -------------------------------------------------------------------------------- 1 | /** 2 | * OpsiMate – Darker Blue-Indigo Theme 3 | */ 4 | 5 | /* ---------- Base Colors ---------- */ 6 | :root { 7 | --ifm-color-primary: #3949ab; 8 | --ifm-color-primary-dark: #303f9f; 9 | --ifm-color-primary-darker: #283593; 10 | --ifm-color-primary-light: #5c6bc0; 11 | --ifm-color-primary-lighter: #7986cb; 12 | --ifm-code-font-size: 95%; 13 | 14 | --ifm-background-color: #ffffff; 15 | --ifm-background-surface-color: #f8f9fa; 16 | --ifm-font-color-base: #000000; 17 | --ifm-heading-color: #1a237e; 18 | --ifm-navbar-background-color: #000000; 19 | --ifm-footer-background-color: #3949ab; 20 | } 21 | 22 | [data-theme="dark"] { 23 | --ifm-background-color: #000000; 24 | --ifm-background-surface-color: #111111; 25 | --ifm-font-color-base: #e6eef6; 26 | --ifm-heading-color: #ffffff; 27 | --ifm-navbar-background-color: #000000; 28 | --ifm-footer-background-color: #3949ab; 29 | } 30 | 31 | /* ---------- Fonts ---------- */ 32 | @import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"); 33 | :root { 34 | --ifm-font-family-base: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, 35 | "Helvetica Neue", Arial; 36 | } 37 | 38 | body, 39 | .markdown { 40 | font-family: var(--ifm-font-family-base); 41 | -webkit-font-smoothing: antialiased; 42 | -moz-osx-font-smoothing: grayscale; 43 | color: var(--ifm-font-color-base); 44 | background: var(--ifm-background-color); 45 | } 46 | 47 | h1, 48 | h2, 49 | h3, 50 | h4, 51 | h5, 52 | h6 { 53 | color: var(--ifm-heading-color); 54 | font-weight: 700; 55 | } 56 | 57 | /* ---------- Navbar Icons ---------- */ 58 | .navbar-icons-container { 59 | display: flex; 60 | align-items: center; 61 | gap: 16px; 62 | margin-left: 10px; 63 | } 64 | 65 | .navbar-icon-link, 66 | .footer-community-icon-link { 67 | display: flex; 68 | align-items: center; 69 | justify-content: center; 70 | width: 40px; 71 | height: 40px; 72 | border-radius: 6px; 73 | transition: all 0.3s ease; 74 | background-color: transparent; 75 | color: #ffffff !important; 76 | } 77 | 78 | .navbar-icon, 79 | .footer-community-icon { 80 | width: 24px; 81 | height: 24px; 82 | filter: brightness(0) invert(1); 83 | transition: all 0.3s ease; 84 | } 85 | 86 | .navbar-icon-link:hover, 87 | .footer-community-icon-link:hover { 88 | background-color: rgba(57, 73, 171, 0.3); 89 | transform: translateY(-1px); 90 | } 91 | 92 | .navbar-icon-link:hover .navbar-icon, 93 | .footer-community-icon-link:hover .footer-community-icon { 94 | filter: invert(35%) sepia(100%) saturate(800%) hue-rotate(240deg); 95 | } 96 | 97 | /* Navbar text links */ 98 | .navbar__title, 99 | .navbar__brand, 100 | .navbar__link { 101 | color: white !important; 102 | } 103 | .navbar__link--active { 104 | color: #bbdefb !important; 105 | } 106 | .navbar__link:hover { 107 | color: #5c6bc0 !important; 108 | background-color: rgba(57, 73, 171, 0.1); 109 | } 110 | .navbar { 111 | background-color: #000000 !important; 112 | border-bottom: 1px solid rgba(255, 255, 255, 0.1); 113 | } 114 | 115 | /* ---------- Footer ---------- */ 116 | .footer { 117 | background-color: var(--ifm-footer-background-color) !important; 118 | color: white; 119 | border-top: 1px solid rgba(255, 255, 255, 0.1); 120 | padding: 3rem 0 1.5rem !important; 121 | } 122 | 123 | .footer__container { 124 | max-width: 1200px; 125 | margin: 0 auto; 126 | display: flex; 127 | justify-content: space-between; 128 | align-items: flex-start; 129 | flex-wrap: wrap; 130 | gap: 2rem; 131 | } 132 | 133 | .footer__links { 134 | display: flex; 135 | gap: 3rem; 136 | flex-wrap: wrap; 137 | } 138 | .footer__col { 139 | flex: 1; 140 | min-width: 200px; 141 | } 142 | .footer__title { 143 | color: #ffffff !important; 144 | font-size: 1.1rem !important; 145 | font-weight: 600 !important; 146 | margin-bottom: 1.5rem !important; 147 | border-bottom: 2px solid rgba(255, 255, 255, 0.2); 148 | padding-bottom: 0.5rem; 149 | } 150 | 151 | .footer__link-item { 152 | color: #e3f2fd !important; 153 | transition: all 0.3s ease !important; 154 | padding: 0.3rem 0; 155 | display: block; 156 | text-decoration: none !important; 157 | } 158 | .footer__link-item:hover { 159 | color: #bbdefb !important; 160 | transform: translateX(5px); 161 | text-decoration: none !important; 162 | background: rgba(255, 255, 255, 0.05); 163 | } 164 | 165 | /* ---------- Footer Community Icons ---------- */ 166 | .footer-community-icons { 167 | display: flex; 168 | align-items: center; 169 | gap: 12px; 170 | margin-top: 0.5rem; 171 | } 172 | 173 | /* Footer bottom / Vercel card remains unchanged (from your original CSS) */ 174 | 175 | /* ---------- Responsive adjustments (navbar + footer icons included) ---------- */ 176 | @media (max-width: 1024px) { 177 | .navbar-icon-link, 178 | .footer-community-icon-link { 179 | width: 36px; 180 | height: 36px; 181 | } 182 | .navbar-icon, 183 | .footer-community-icon { 184 | width: 20px; 185 | height: 20px; 186 | } 187 | .navbar-icons-container, 188 | .footer-community-icons { 189 | gap: 12px; 190 | } 191 | } 192 | 193 | /* ---------- Remove old conflicting hidden classes ---------- */ 194 | /* removed: .footer-icons-container, .footer-community-section, etc. */ 195 | 196 | /* ===== VERCEL CARD - SLEEK RECTANGULAR DESIGN (INCREASED SIZE) ===== */ 197 | .vercel-card-container { 198 | text-decoration: none; 199 | display: block; 200 | } 201 | 202 | .vercel-card { 203 | display: flex; 204 | align-items: center; 205 | gap: 0.85rem; /* Increased gap */ 206 | padding: 0.9rem 1.5rem; /* Increased padding */ 207 | background: #000000; 208 | border: 1.75px solid #334155; /* Slightly thicker border */ 209 | border-radius: 7px; /* Slightly larger radius */ 210 | transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); 211 | min-width: 175px; /* Increased min-width */ 212 | box-shadow: 0 3px 10px rgba(0, 0, 0, 0.35); /* Enhanced shadow */ 213 | position: relative; 214 | overflow: hidden; 215 | } 216 | 217 | .vercel-card::before { 218 | content: ""; 219 | position: absolute; 220 | top: 0; 221 | left: 0; 222 | right: 0; 223 | bottom: 0; 224 | background: linear-gradient( 225 | 135deg, 226 | rgba(79, 70, 229, 0.18) 0%, 227 | /* Slightly stronger gradient */ rgba(0, 0, 0, 0.85) 100% 228 | ); 229 | opacity: 0; 230 | transition: opacity 0.3s ease; 231 | } 232 | 233 | .vercel-card:hover { 234 | background: #111827; 235 | border-color: #4f46e5; 236 | transform: translateY(-2px); 237 | box-shadow: 0 6px 25px rgba(79, 70, 229, 0.3); /* Enhanced hover shadow */ 238 | text-decoration: none; 239 | } 240 | 241 | .vercel-card:hover::before { 242 | opacity: 1; 243 | } 244 | 245 | .vercel-card-logo { 246 | width: 22px; /* Increased logo size */ 247 | height: 22px; /* Increased logo size */ 248 | filter: brightness(0) invert(1); 249 | transition: transform 0.3s ease; 250 | position: relative; 251 | z-index: 1; 252 | } 253 | 254 | .vercel-card:hover .vercel-card-logo { 255 | transform: scale(1.15); /* Slightly larger hover scale */ 256 | } 257 | 258 | .vercel-card-text { 259 | color: #ffffff; 260 | font-size: 0.95rem; /* Increased font size */ 261 | font-weight: 700; /* Bolder font weight */ 262 | letter-spacing: 0.4px; /* Slightly more letter spacing */ 263 | opacity: 0.95; /* Increased opacity */ 264 | position: relative; 265 | z-index: 1; 266 | transition: all 0.3s ease; 267 | } 268 | 269 | .vercel-card:hover .vercel-card-text { 270 | opacity: 1; 271 | transform: translateX(1px); /* Subtle text movement on hover */ 272 | } 273 | 274 | /* ===== FOOTER BOTTOM LAYOUT ===== */ 275 | .footer-bottom { 276 | width: 100%; 277 | margin-top: 3rem; 278 | padding-top: 2rem; 279 | border-top: 1px solid rgba(255, 255, 255, 0.15); 280 | } 281 | 282 | .footer-bottom-content { 283 | display: flex; 284 | justify-content: space-between; 285 | align-items: center; 286 | max-width: 1200px; 287 | margin: 0 auto; 288 | padding: 0 20px; 289 | } 290 | 291 | .footer-copyright { 292 | color: #e3f2fd; 293 | font-size: 0.9rem; 294 | opacity: 0.8; 295 | } 296 | 297 | /* ===== COMMUNITY SECTION - ICONS ONLY ===== */ 298 | .footer-community-icons { 299 | display: flex; 300 | align-items: center; 301 | gap: 16px; 302 | margin-top: 0.5rem; 303 | } 304 | 305 | .footer-community-icon-link { 306 | display: flex; 307 | align-items: center; 308 | justify-content: center; 309 | width: 40px; 310 | height: 40px; 311 | border-radius: 6px; 312 | transition: all 0.3s ease; 313 | background-color: transparent; 314 | } 315 | 316 | .footer-community-icon { 317 | width: 24px; 318 | height: 24px; 319 | transition: all 0.3s ease; 320 | filter: brightness(0) invert(1); 321 | } 322 | 323 | .footer-community-icon-link:hover { 324 | background-color: rgba(57, 73, 171, 0.3); 325 | transform: translateY(-1px); 326 | } 327 | 328 | .footer-community-icon-link:hover .footer-community-icon { 329 | filter: invert(35%) sepia(100%) saturate(800%) hue-rotate(240deg); 330 | } 331 | 332 | /* ===== RESPONSIVE DESIGN ===== */ 333 | @media (max-width: 996px) { 334 | .footer__container { 335 | flex-direction: column; 336 | text-align: center; 337 | } 338 | 339 | .footer__links { 340 | justify-content: center; 341 | gap: 2rem; 342 | } 343 | 344 | .footer__col { 345 | min-width: 180px; 346 | } 347 | 348 | .footer-bottom-content { 349 | flex-direction: column; 350 | align-items: center; 351 | gap: 1.5rem; 352 | text-align: center; 353 | } 354 | 355 | .footer-community-icons { 356 | justify-content: center; 357 | } 358 | } 359 | 360 | @media (max-width: 768px) { 361 | .footer { 362 | padding: 2rem 0 1rem !important; 363 | } 364 | 365 | .footer__links { 366 | flex-direction: column; 367 | gap: 1.5rem; 368 | } 369 | 370 | .vercel-card { 371 | min-width: 165px; /* Adjusted for mobile */ 372 | padding: 0.85rem 1.3rem; /* Adjusted for mobile */ 373 | } 374 | 375 | .footer-copyright { 376 | order: 2; 377 | } 378 | 379 | .vercel-card-container { 380 | order: 1; 381 | } 382 | } 383 | 384 | @media (max-width: 480px) { 385 | .footer-bottom-content { 386 | padding: 0 15px; 387 | } 388 | 389 | .vercel-card { 390 | min-width: 155px; /* Adjusted for small mobile */ 391 | padding: 0.75rem 1.1rem; /* Adjusted for small mobile */ 392 | } 393 | 394 | .vercel-card-text { 395 | font-size: 0.88rem; /* Slightly smaller on very small screens */ 396 | } 397 | 398 | .vercel-card-logo { 399 | width: 20px; /* Slightly smaller on very small screens */ 400 | height: 20px; 401 | } 402 | 403 | .footer-community-icons { 404 | gap: 12px; 405 | } 406 | 407 | .footer-community-icon-link { 408 | width: 36px; 409 | height: 36px; 410 | } 411 | 412 | .footer-community-icon { 413 | width: 20px; 414 | height: 20px; 415 | } 416 | } 417 | 418 | /* ===== Integration Layers Tiles with Indigo Borders ===== */ 419 | .integration-grid { 420 | display: grid; 421 | grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); 422 | gap: 1.5rem; 423 | margin: 2rem 0; 424 | } 425 | 426 | .integration-card { 427 | background-color: var(--ifm-background-surface-color); 428 | border-radius: 12px; 429 | border: 2px solid var(--ifm-color-primary); /* Indigo border */ 430 | padding: 1.5rem 1rem; 431 | box-shadow: 0 4px 15px rgba(0, 0, 0, 0.08); 432 | display: flex; 433 | flex-direction: column; 434 | align-items: center; 435 | text-align: center; 436 | transition: transform 0.3s ease, box-shadow 0.3s ease, border-color 0.3s ease; 437 | } 438 | 439 | .integration-card:hover { 440 | transform: translateY(-4px); 441 | box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); 442 | border-color: var(--ifm-color-primary-light); /* Lighter indigo on hover */ 443 | } 444 | 445 | .integration-card strong { 446 | display: block; 447 | font-size: 1.1rem; 448 | margin-bottom: 0.5rem; 449 | color: var(--ifm-heading-color); 450 | } 451 | 452 | .integration-card p { 453 | font-size: 0.95rem; 454 | color: var(--ifm-font-color-base); 455 | line-height: 1.4; 456 | } 457 | 458 | /* ===== Responsive ===== */ 459 | @media (max-width: 768px) { 460 | .integration-grid { 461 | grid-template-columns: 1fr 1fr; /* 2 per row on tablet */ 462 | } 463 | } 464 | 465 | @media (max-width: 480px) { 466 | .integration-grid { 467 | grid-template-columns: 1fr; /* 1 per row on mobile */ 468 | } 469 | } 470 | 471 | /* ===== INTEGRATIONS SECTION ===== */ 472 | .footer-integrations { 473 | display: grid; 474 | grid-template-columns: repeat(3, 1fr); 475 | gap: 1rem; 476 | margin-top: 0.5rem; 477 | } 478 | 479 | .integration-link { 480 | display: flex; 481 | align-items: center; 482 | justify-content: center; 483 | width: 60px; 484 | height: 60px; 485 | border-radius: 8px; 486 | transition: all 0.3s ease; 487 | background: rgba(255, 255, 255, 0.05); 488 | border: 1px solid rgba(255, 255, 255, 0.1); 489 | } 490 | 491 | .integration-link:hover { 492 | background: rgba(57, 73, 171, 0.2); 493 | border-color: rgba(57, 73, 171, 0.4); 494 | transform: translateY(-2px); 495 | box-shadow: 0 4px 12px rgba(57, 73, 171, 0.2); 496 | } 497 | 498 | .integration-icon { 499 | width: 32px; 500 | height: 32px; 501 | transition: all 0.3s ease; 502 | filter: brightness(0) invert(1) opacity(0.8); 503 | } 504 | 505 | .integration-link:hover .integration-icon { 506 | filter: brightness(0) invert(1) opacity(1); 507 | transform: scale(1.1); 508 | } 509 | 510 | /* ===== INTEGRATIONS SECTION WITH LABELS ===== */ 511 | .footer-integrations { 512 | display: grid; 513 | grid-template-columns: repeat(3, 1fr); 514 | gap: 1.5rem; 515 | margin-top: 0.5rem; 516 | } 517 | 518 | .integration-item { 519 | display: flex; 520 | flex-direction: column; 521 | align-items: center; 522 | text-decoration: none; 523 | transition: all 0.3s ease; 524 | padding: 1rem 0.5rem; 525 | border-radius: 10px; 526 | background: rgba(255, 255, 255, 0.05); 527 | border: 1px solid rgba(255, 255, 255, 0.1); 528 | min-width: 90px; 529 | } 530 | 531 | .integration-item:hover { 532 | background: rgba(57, 73, 171, 0.2); 533 | border-color: rgba(57, 73, 171, 0.4); 534 | transform: translateY(-3px); 535 | box-shadow: 0 6px 16px rgba(57, 73, 171, 0.25); 536 | text-decoration: none; 537 | } 538 | 539 | .integration-icon-container { 540 | display: flex; 541 | align-items: center; 542 | justify-content: center; 543 | width: 50px; 544 | height: 50px; 545 | margin-bottom: 0.5rem; 546 | } 547 | 548 | .integration-icon { 549 | width: 40px; 550 | height: 40px; 551 | transition: all 0.3s ease; 552 | filter: brightness(0) invert(1) opacity(0.9); 553 | } 554 | 555 | .integration-item:hover .integration-icon { 556 | filter: brightness(0) invert(1) opacity(1); 557 | transform: scale(1.15); 558 | } 559 | 560 | .integration-name { 561 | color: #e3f2fd; 562 | font-size: 0.8rem; 563 | font-weight: 600; 564 | text-align: center; 565 | line-height: 1.2; 566 | transition: color 0.3s ease; 567 | } 568 | 569 | .integration-item:hover .integration-name { 570 | color: #bbdefb; 571 | } 572 | 573 | /* ===== RESPONSIVE INTEGRATIONS WITH LABELS ===== */ 574 | @media (max-width: 996px) { 575 | .footer-integrations { 576 | grid-template-columns: repeat(3, 1fr); 577 | gap: 1rem; 578 | } 579 | 580 | .integration-item { 581 | padding: 0.75rem 0.25rem; 582 | min-width: 80px; 583 | } 584 | 585 | .integration-icon-container { 586 | width: 45px; 587 | height: 45px; 588 | } 589 | 590 | .integration-icon { 591 | width: 35px; 592 | height: 35px; 593 | } 594 | 595 | .integration-name { 596 | font-size: 0.75rem; 597 | } 598 | } 599 | 600 | @media (max-width: 768px) { 601 | .footer-integrations { 602 | grid-template-columns: repeat(3, 1fr); 603 | gap: 0.75rem; 604 | } 605 | 606 | .integration-item { 607 | padding: 0.5rem 0.25rem; 608 | min-width: 70px; 609 | } 610 | 611 | .integration-icon-container { 612 | width: 40px; 613 | height: 40px; 614 | } 615 | 616 | .integration-icon { 617 | width: 30px; 618 | height: 30px; 619 | } 620 | 621 | .integration-name { 622 | font-size: 0.7rem; 623 | } 624 | } 625 | 626 | @media (max-width: 480px) { 627 | .footer-integrations { 628 | grid-template-columns: repeat(3, 1fr); 629 | gap: 0.5rem; 630 | } 631 | 632 | .integration-item { 633 | padding: 0.4rem 0.2rem; 634 | min-width: 65px; 635 | } 636 | 637 | .integration-icon-container { 638 | width: 35px; 639 | height: 35px; 640 | } 641 | 642 | .integration-icon { 643 | width: 25px; 644 | height: 25px; 645 | } 646 | 647 | .integration-name { 648 | font-size: 0.65rem; 649 | } 650 | } 651 | 652 | /* ===== LIGHT/DARK MODE TOGGLE VISIBILITY ===== */ 653 | 654 | /* Ensure toggle is visible in light mode */ 655 | .navbar__toggle { 656 | display: flex !important; 657 | align-items: center; 658 | justify-content: center; 659 | width: 40px; 660 | height: 40px; 661 | border-radius: 6px; 662 | transition: all 0.3s ease; 663 | margin-right: 8px; 664 | } 665 | 666 | /* Light mode styling */ 667 | html[data-theme="light"] .navbar__toggle { 668 | color: #3949ab !important; /* Indigo color */ 669 | background: transparent; 670 | border: 1px solid rgba(57, 73, 171, 0.2); 671 | } 672 | 673 | html[data-theme="light"] .navbar__toggle:hover { 674 | color: #283593 !important; /* Darker indigo */ 675 | background: rgba(57, 73, 171, 0.1); 676 | border-color: #3949ab; 677 | } 678 | 679 | /* Dark mode styling */ 680 | html[data-theme="dark"] .navbar__toggle { 681 | color: #bbdefb !important; /* Light blue for contrast */ 682 | background: transparent; 683 | border: 1px solid rgba(187, 222, 251, 0.3); 684 | } 685 | 686 | html[data-theme="dark"] .navbar__toggle:hover { 687 | color: #ffffff !important; 688 | background: rgba(187, 222, 251, 0.1); 689 | border-color: #bbdefb; 690 | } 691 | 692 | /* Toggle icon sizing */ 693 | .navbar__toggle svg { 694 | width: 20px; 695 | height: 20px; 696 | } 697 | 698 | /* Ensure proper spacing with other navbar icons */ 699 | .navbar-icons-container { 700 | display: flex; 701 | align-items: center; 702 | gap: 8px; /* Reduced gap to accommodate toggle */ 703 | } 704 | 705 | /* If the toggle is still not appearing, force its display */ 706 | button[class*="toggle"] { 707 | display: inline-flex !important; 708 | visibility: visible !important; 709 | opacity: 1 !important; 710 | } 711 | 712 | /* Additional fallback for toggle visibility */ 713 | .navbar .react-toggle, 714 | .navbar .toggle_vylO { 715 | display: flex !important; 716 | visibility: visible !important; 717 | } 718 | 719 | /* Remove indigo left borders from homepage cards */ 720 | .homepage-section { 721 | background: var(--ifm-background-surface-color); 722 | border-radius: 8px; 723 | padding: 20px; 724 | margin: 15px 0; 725 | border-left: none; /* Remove the indigo left border */ 726 | transition: all 0.3s ease; 727 | border: 1px solid rgba(0, 0, 0, 0.1); /* Add subtle border */ 728 | } 729 | 730 | [data-theme="dark"] .homepage-section { 731 | background: #111111; 732 | border-left: none; /* Remove for dark mode too */ 733 | border: 1px solid rgba(255, 255, 255, 0.1); /* Subtle border for dark mode */ 734 | } 735 | 736 | .homepage-section:hover { 737 | background: rgba(57, 73, 171, 0.05); 738 | transform: translateY(-2px); 739 | box-shadow: 0 4px 12px rgba(57, 73, 171, 0.1); 740 | border-color: #3949ab; /* Indigo border on hover */ 741 | } 742 | 743 | [data-theme="dark"] .homepage-section:hover { 744 | background: rgba(57, 73, 171, 0.1); 745 | border-color: #5c6bc0; /* Lighter indigo for dark mode */ 746 | } 747 | 748 | /* Remove specific indigo borders from community and feature cards */ 749 | .communitySection.homepage-section, 750 | .featureCard.homepage-section { 751 | border-left: none !important; 752 | border: 1px solid rgba(0, 0, 0, 0.1); 753 | } 754 | 755 | [data-theme="dark"] .communitySection.homepage-section, 756 | [data-theme="dark"] .featureCard.homepage-section { 757 | border-left: none !important; 758 | border: 1px solid rgba(255, 255, 255, 0.1); 759 | } 760 | 761 | .communitySection.homepage-section:hover, 762 | .featureCard.homepage-section:hover { 763 | border-left: none !important; 764 | border-color: #3949ab; 765 | } 766 | 767 | [data-theme="dark"] .communitySection.homepage-section:hover, 768 | [data-theme="dark"] .featureCard.homepage-section:hover { 769 | border-left: none !important; 770 | border-color: #5c6bc0; 771 | } 772 | 773 | /* ===== NAVBAR BACKGROUND COLORS ===== */ 774 | 775 | /* Light mode - Indigo background */ 776 | html[data-theme="light"] .navbar { 777 | background-color: #3949ab !important; /* Indigo background */ 778 | border-bottom: 1px solid rgba(255, 255, 255, 0.2); 779 | } 780 | 781 | /* Dark mode - Keep black background */ 782 | html[data-theme="dark"] .navbar { 783 | background-color: #000000 !important; 784 | border-bottom: 1px solid rgba(255, 255, 255, 0.1); 785 | } 786 | 787 | /* ===== LIGHT MODE TOGGLE VISIBILITY ON INDIGO BACKGROUND ===== */ 788 | 789 | /* Light mode toggle styling - White on indigo */ 790 | html[data-theme="light"] .navbar__toggle { 791 | color: #ffffff !important; /* White color for contrast on indigo */ 792 | background: rgba(255, 255, 255, 0.1); 793 | border: 1px solid rgba(255, 255, 255, 0.3); 794 | border-radius: 6px; 795 | } 796 | 797 | html[data-theme="light"] .navbar__toggle:hover { 798 | color: #ffffff !important; 799 | background: rgba(255, 255, 255, 0.2); 800 | border-color: rgba(255, 255, 255, 0.5); 801 | } 802 | 803 | /* Dark mode toggle styling - Keep existing */ 804 | html[data-theme="dark"] .navbar__toggle { 805 | color: #bbdefb !important; 806 | background: transparent; 807 | border: 1px solid rgba(187, 222, 251, 0.3); 808 | border-radius: 6px; 809 | } 810 | 811 | html[data-theme="dark"] .navbar__toggle:hover { 812 | color: #ffffff !important; 813 | background: rgba(187, 222, 251, 0.1); 814 | border-color: #bbdefb; 815 | } 816 | 817 | /* ===== NAVBAR TEXT COLORS FOR LIGHT MODE ===== */ 818 | 819 | /* Light mode - White text on indigo */ 820 | html[data-theme="light"] .navbar__title, 821 | html[data-theme="light"] .navbar__brand, 822 | html[data-theme="light"] .navbar__link { 823 | color: #ffffff !important; 824 | } 825 | 826 | html[data-theme="light"] .navbar__link--active { 827 | color: #bbdefb !important; /* Light blue for active state */ 828 | } 829 | 830 | html[data-theme="light"] .navbar__link:hover { 831 | color: #bbdefb !important; 832 | background-color: rgba(255, 255, 255, 0.1); 833 | } 834 | 835 | /* ===== RESTORE ORIGINAL DARK MODE HOVER EFFECTS ===== */ 836 | 837 | /* Dark mode - Keep original indigo hover effects */ 838 | html[data-theme="dark"] .navbar__link--active { 839 | color: #bbdefb !important; 840 | } 841 | 842 | html[data-theme="dark"] .navbar__link:hover { 843 | color: #5c6bc0 !important; 844 | background-color: rgba(57, 73, 171, 0.1); 845 | } 846 | 847 | /* ===== NAVBAR ICONS FOR LIGHT MODE ===== */ 848 | 849 | /* Light mode - White icons on indigo */ 850 | html[data-theme="light"] .navbar-icon { 851 | filter: brightness(0) invert(1); /* White icons */ 852 | } 853 | 854 | html[data-theme="light"] .navbar-icon-link:hover .navbar-icon { 855 | filter: invert(35%) sepia(100%) saturate(800%) hue-rotate(240deg) 856 | brightness(2); /* Brighter indigo on hover */ 857 | } 858 | 859 | html[data-theme="light"] .navbar-icon-link { 860 | background-color: rgba(255, 255, 255, 0.1); 861 | } 862 | 863 | html[data-theme="light"] .navbar-icon-link:hover { 864 | background-color: rgba(255, 255, 255, 0.2); 865 | color: #bbdefb !important; 866 | } 867 | 868 | /* Dark mode - Keep existing icon styles with indigo hover */ 869 | html[data-theme="dark"] .navbar-icon { 870 | filter: brightness(0) invert(1); 871 | } 872 | 873 | html[data-theme="dark"] .navbar-icon-link:hover .navbar-icon { 874 | filter: invert(35%) sepia(100%) saturate(800%) hue-rotate(240deg); 875 | } 876 | 877 | html[data-theme="dark"] .navbar-icon-link:hover { 878 | background-color: rgba(57, 73, 171, 0.3); 879 | color: #bbdefb !important; 880 | } 881 | 882 | /* ===== ENSURE TOGGLE IS VISIBLE ===== */ 883 | 884 | /* Make sure toggle container is visible */ 885 | .navbar__toggle { 886 | display: flex !important; 887 | align-items: center; 888 | justify-content: center; 889 | width: 40px; 890 | height: 40px; 891 | border-radius: 6px; 892 | transition: all 0.3s ease; 893 | margin-right: 8px; 894 | visibility: visible !important; 895 | opacity: 1 !important; 896 | } 897 | 898 | /* Toggle icon sizing */ 899 | .navbar__toggle svg { 900 | width: 20px; 901 | height: 20px; 902 | } 903 | 904 | /* Force toggle display if still hidden */ 905 | button[class*="toggle"] { 906 | display: inline-flex !important; 907 | visibility: visible !important; 908 | opacity: 1 !important; 909 | } 910 | 911 | .navbar .react-toggle { 912 | display: flex !important; 913 | visibility: visible !important; 914 | } 915 | 916 | @media (min-width: 1025px) { 917 | .navbar .navbar__toggle { 918 | display: none !important; 919 | visibility: hidden !important; 920 | opacity: 0 !important; 921 | } 922 | } 923 | 924 | .doc-image { 925 | border: 1px solid #e5e7eb; 926 | border-radius: 8px; 927 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); 928 | margin: 1rem 0; 929 | } 930 | -------------------------------------------------------------------------------- /opsimate-docs/static/img/undraw_docusaurus_mountain.svg: -------------------------------------------------------------------------------- 1 | 2 | Easy to Use 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | -------------------------------------------------------------------------------- /opsimate-docs/static/img/undraw_docusaurus_react.svg: -------------------------------------------------------------------------------- 1 | 2 | Powered by React 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | --------------------------------------------------------------------------------