Compare commits

...

3 Commits
2.x ... main

Author SHA1 Message Date
a81e9b18b7 dashboard layout (#597) 2025-05-13 23:42:22 +03:00
38bafd7654 Setup Inertia (#593) 2025-05-10 11:10:11 +03:00
6eb88c7c6e laravel 12 upgrade (#586)
* laravel 12 upgrade

* upgrade scribe to v5

* fix lint
2025-04-21 21:56:53 +02:00
355 changed files with 32516 additions and 41975 deletions

View File

@ -3,12 +3,15 @@ root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_size = 2
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
ij_any_block_comment_at_first_column = false
[*.php]
indent_size = 4
[*.md]
trim_trailing_whitespace = false

View File

@ -13,3 +13,6 @@ sail
!*.blade.php
!*.sh
resources/views/ssh/
resources/views/scribe/
resources/js/ziggy.js
resources/views/mail/*

View File

@ -1,26 +1,46 @@
{
"plugins": [
"prettier-plugin-blade",
"prettier-plugin-tailwindcss",
"prettier-plugin-sh"
],
"overrides": [
{
"files": ["*.blade.php"],
"options": {
"parser": "blade",
"printWidth": 120,
"htmlWhitespaceSensitivity": "ignore",
"tabWidth": 4,
"quoteProps": "consistent",
"trailingComma": "none"
}
},
{
"files": ["*.sh"],
"options": {
"parser": "sh"
}
}
]
"semi": true,
"singleQuote": true,
"singleAttributePerLine": false,
"htmlWhitespaceSensitivity": "css",
"printWidth": 150,
"tailwindFunctions": [
"clsx",
"cn"
],
"tabWidth": 2,
"plugins": [
"prettier-plugin-blade",
"prettier-plugin-tailwindcss",
"prettier-plugin-sh"
],
"overrides": [
{
"files": [
"*.blade.php"
],
"options": {
"parser": "blade",
"printWidth": 120,
"htmlWhitespaceSensitivity": "ignore",
"tabWidth": 4,
"quoteProps": "consistent",
"trailingComma": "none"
}
},
{
"files": [
"*.sh"
],
"options": {
"parser": "sh"
}
},
{
"files": "**/*.yml",
"options": {
"tabWidth": 2
}
}
]
}

View File

@ -1,4 +1,4 @@
# GENERATED. YOU SHOULDN'T MODIFY OR DELETE THIS FILE.
# Scribe uses this file to know when you change something manually in your docs.
.scribe/intro.md=98adb6862b118c06e02e4e22390feb6f
.scribe/auth.md=7fcc12b2e5a86fa9c49f509d348f3cc2
.scribe/intro.md=ce7ca21baf0406f807aed85ee1d8fa6e
.scribe/auth.md=9bee2b1ef8a238b2e58613fa636d5f39

View File

@ -1,7 +1,3 @@
# Authenticating requests
To authenticate requests, include an **`Authorization`** header with the value **`"Bearer YOUR-API-KEY"`**.
All authenticated endpoints are marked with a `requires authentication` badge in the documentation below.
You can retrieve your token by visiting <a href="/settings/api-keys" target="_blank">here</a>
This API is not authenticated.

View File

@ -14,10 +14,9 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all cron jobs.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -35,7 +34,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -43,7 +42,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -52,15 +51,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":null,"server_id":null,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":null,"updated_at":null},{"id":null,"server_id":null,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":5,"server_id":1,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"},{"id":6,"server_id":1,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer eDa6Vdh1Z4vc35bP8E6gafk'
auth: []
controller: null
method: null
route: null
@ -76,10 +72,9 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new cron job.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -97,7 +92,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -105,7 +100,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -113,7 +108,7 @@ endpoints:
name: command
description: ''
required: true
example: quia
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -123,7 +118,7 @@ endpoints:
name: user
description: ''
required: true
example: root
example: vito
type: string
enumValues:
- root
@ -142,22 +137,19 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
command: quia
user: root
command: consequatur
user: vito
frequency: '* * * * *'
fileParameters: []
responses:
-
status: 200
content: '{"id":null,"server_id":null,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":null,"updated_at":null}'
content: '{"id":5,"server_id":1,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 66EeZvdh3kVaDP8f4ga5c1b'
auth: []
controller: null
method: null
route: null
@ -173,10 +165,9 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a cron job by ID.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -194,7 +185,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -204,7 +195,7 @@ endpoints:
name: cronJob_id
description: 'The ID of the cronJob.'
required: true
example: 6
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -212,8 +203,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
cronJob_id: 6
server_id: 32
cronJob_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -222,15 +213,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":null,"server_id":null,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":null,"updated_at":null}'
content: '{"id":5,"server_id":1,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer D4c3Z65ebv8E16fahaVgPdk'
auth: []
controller: null
method: null
route: null
@ -246,10 +234,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete cron job.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -267,7 +254,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -277,7 +264,7 @@ endpoints:
name: cronJob_id
description: 'The ID of the cronJob.'
required: true
example: 13
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -285,8 +272,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
cronJob_id: 13
server_id: 32
cronJob_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -300,10 +287,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer h3cP4aZa1v8feDdEg5b6k6V'
auth: []
controller: null
method: null
route: null

View File

@ -14,10 +14,9 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all databases.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -35,7 +34,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -43,7 +42,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -52,15 +51,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":null,"server_id":null,"name":"leffler.esther","status":"ready","created_at":null,"updated_at":null},{"id":null,"server_id":null,"name":"rhoda.rutherford","status":"ready","created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":21,"server_id":1,"name":"carolyne.luettgen","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"},{"id":22,"server_id":1,"name":"orville77","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer E1VdfegZah4k86b53Dc6Pva'
auth: []
controller: null
method: null
route: null
@ -76,10 +72,9 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new database.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -97,7 +92,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -105,7 +100,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -113,7 +108,7 @@ endpoints:
name: name
description: ''
required: true
example: quisquam
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -123,7 +118,7 @@ endpoints:
name: charset
description: ''
required: true
example: omnis
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -133,29 +128,26 @@ endpoints:
name: collation
description: ''
required: true
example: at
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
name: quisquam
charset: omnis
collation: at
name: consequatur
charset: consequatur
collation: consequatur
fileParameters: []
responses:
-
status: 200
content: '{"id":null,"server_id":null,"name":"csawayn","status":"ready","created_at":null,"updated_at":null}'
content: '{"id":21,"server_id":1,"name":"carolyne.luettgen","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer PVgkZ35ca4afd1EbD8ehv66'
auth: []
controller: null
method: null
route: null
@ -171,10 +163,9 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a database by ID.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -192,7 +183,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -202,7 +193,7 @@ endpoints:
name: id
description: 'The ID of the database.'
required: true
example: 8
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -210,8 +201,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
id: 8
server_id: 32
id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -220,15 +211,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":null,"server_id":null,"name":"sandrine43","status":"ready","created_at":null,"updated_at":null}'
content: '{"id":21,"server_id":1,"name":"carolyne.luettgen","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer EP64D8g51adf6hbceavVZ3k'
auth: []
controller: null
method: null
route: null
@ -244,10 +232,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete database.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -265,7 +252,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -275,7 +262,7 @@ endpoints:
name: database_id
description: 'The ID of the database.'
required: true
example: 8
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -283,8 +270,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
database_id: 8
server_id: 32
database_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -298,10 +285,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 8dgEk3Zv1eaVP66bDhf4ac5'
auth: []
controller: null
method: null
route: null

View File

@ -14,10 +14,9 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all database users.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -35,7 +34,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -43,7 +42,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -52,15 +51,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":null,"server_id":null,"username":"letha64","databases":[],"host":"%","status":null,"created_at":null,"updated_at":null},{"id":null,"server_id":null,"username":"hagenes.lurline","databases":[],"host":"%","status":null,"created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":19,"server_id":1,"username":"graciela37","databases":[],"host":"%","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"},{"id":20,"server_id":1,"username":"vconn","databases":[],"host":"%","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer d4g15bV3Pa6hDvck6eaEf8Z'
auth: []
controller: null
method: null
route: null
@ -76,10 +72,9 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new database user.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -97,7 +92,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -105,7 +100,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -113,7 +108,7 @@ endpoints:
name: username
description: ''
required: true
example: qui
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -123,7 +118,7 @@ endpoints:
name: password
description: ''
required: true
example: 'xYv*3,#HQ=5<w!'
example: 'O[2UZ5ij-e/dl4m{o,'
type: string
enumValues: []
exampleWasSpecified: false
@ -140,22 +135,19 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
username: qui
password: 'xYv*3,#HQ=5<w!'
username: consequatur
password: 'O[2UZ5ij-e/dl4m{o,'
host: '%'
fileParameters: []
responses:
-
status: 200
content: '{"id":null,"server_id":null,"username":"marcelle95","databases":[],"host":"%","status":null,"created_at":null,"updated_at":null}'
content: '{"id":19,"server_id":1,"username":"nolan.jaylan","databases":[],"host":"%","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 3vZ6f6kagacDEhV1Pde5b84'
auth: []
controller: null
method: null
route: null
@ -171,10 +163,9 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a database user by ID.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -192,7 +183,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -202,7 +193,7 @@ endpoints:
name: databaseUser_id
description: 'The ID of the databaseUser.'
required: true
example: 1
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -210,8 +201,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
databaseUser_id: 1
server_id: 32
databaseUser_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -220,15 +211,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":null,"server_id":null,"username":"brandi53","databases":[],"host":"%","status":null,"created_at":null,"updated_at":null}'
content: '{"id":19,"server_id":1,"username":"carolyne.luettgen","databases":[],"host":"%","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer af3b5ac6dP8ZV4vE1hk6eDg'
auth: []
controller: null
method: null
route: null
@ -244,10 +232,9 @@ endpoints:
subgroupDescription: ''
title: link
description: 'Link to databases'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -265,7 +252,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -275,7 +262,7 @@ endpoints:
name: databaseUser_id
description: 'The ID of the databaseUser.'
required: true
example: 4
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -283,8 +270,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
databaseUser_id: 4
server_id: 32
databaseUser_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -292,27 +279,24 @@ endpoints:
name: databases
description: 'Array of database names to link to the user.'
required: true
example: maiores
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
databases: maiores
databases: consequatur
fileParameters: []
responses:
-
status: 200
content: '{"id":null,"server_id":null,"username":"kschmidt","databases":[],"host":"%","status":null,"created_at":null,"updated_at":null}'
content: '{"id":19,"server_id":1,"username":"carolyne.luettgen","databases":[],"host":"%","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer b6f3Ed641gaZDcVa5k8vePh'
auth: []
controller: null
method: null
route: null
@ -328,10 +312,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete database user.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -349,7 +332,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -359,7 +342,7 @@ endpoints:
name: databaseUser_id
description: 'The ID of the databaseUser.'
required: true
example: 20
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -367,8 +350,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
databaseUser_id: 20
server_id: 32
databaseUser_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -382,10 +365,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer Zka6fh15g6eaV8vE34cDPdb'
auth: []
controller: null
method: null
route: null

View File

@ -14,10 +14,9 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all firewall rules.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -35,7 +34,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -43,7 +42,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -52,15 +51,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":null,"name":"ut","server_id":null,"type":"allow","protocol":"tcp","port":35499,"source":"177.130.54.250","mask":24,"note":"test","status":null,"created_at":null,"updated_at":null},{"id":null,"name":"totam","server_id":null,"type":"allow","protocol":"tcp","port":29448,"source":"181.194.26.13","mask":24,"note":"test","status":null,"created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":97,"name":"dolores","server_id":1,"type":"allow","protocol":"tcp","port":40770,"source":"199.76.131.15","mask":"24","note":"test","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"},{"id":98,"name":"laborum","server_id":1,"type":"allow","protocol":"tcp","port":14235,"source":"100.14.146.200","mask":"24","note":"test","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer eD368kaZfVEab4v61ghdP5c'
auth: []
controller: null
method: null
route: null
@ -76,10 +72,9 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new firewall rule.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -97,7 +92,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -105,7 +100,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -113,7 +108,7 @@ endpoints:
name: name
description: ''
required: true
example: sapiente
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -147,7 +142,7 @@ endpoints:
name: port
description: ''
required: true
example: et
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -157,7 +152,7 @@ endpoints:
name: source
description: ''
required: false
example: doloribus
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -174,25 +169,22 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: sapiente
name: consequatur
type: allow
protocol: tcp
port: et
source: doloribus
port: consequatur
source: consequatur
mask: '0'
fileParameters: []
responses:
-
status: 200
content: '{"id":null,"name":"omnis","server_id":null,"type":"allow","protocol":"tcp","port":54634,"source":"246.242.9.65","mask":24,"note":"test","status":null,"created_at":null,"updated_at":null}'
content: '{"id":97,"name":"dolores","server_id":1,"type":"allow","protocol":"tcp","port":40770,"source":"199.76.131.15","mask":"24","note":"test","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 3184PbED6aacZveV6hf5dgk'
auth: []
controller: null
method: null
route: null
@ -208,10 +200,9 @@ endpoints:
subgroupDescription: ''
title: edit
description: 'Update an existing firewall rule.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -229,7 +220,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -239,7 +230,7 @@ endpoints:
name: firewallRule_id
description: 'The ID of the firewallRule.'
required: true
example: 85
example: 94
type: integer
enumValues: []
exampleWasSpecified: false
@ -247,8 +238,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
firewallRule_id: 85
server_id: 32
firewallRule_id: 94
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -256,7 +247,7 @@ endpoints:
name: name
description: ''
required: true
example: et
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -290,7 +281,7 @@ endpoints:
name: port
description: ''
required: true
example: aut
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -300,7 +291,7 @@ endpoints:
name: source
description: ''
required: false
example: et
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -317,25 +308,22 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: et
name: consequatur
type: allow
protocol: tcp
port: aut
source: et
port: consequatur
source: consequatur
mask: '0'
fileParameters: []
responses:
-
status: 200
content: '{"id":null,"name":"consequatur","server_id":null,"type":"allow","protocol":"tcp","port":879,"source":"206.106.27.116","mask":24,"note":"test","status":null,"created_at":null,"updated_at":null}'
content: '{"id":97,"name":"dolores","server_id":1,"type":"allow","protocol":"tcp","port":40770,"source":"199.76.131.15","mask":"24","note":"test","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer ad46E3egPDc51aV6hb8vkZf'
auth: []
controller: null
method: null
route: null
@ -351,10 +339,9 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a firewall rule by ID.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -372,7 +359,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -382,7 +369,7 @@ endpoints:
name: firewallRule_id
description: 'The ID of the firewallRule.'
required: true
example: 85
example: 94
type: integer
enumValues: []
exampleWasSpecified: false
@ -390,8 +377,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
firewallRule_id: 85
server_id: 32
firewallRule_id: 94
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -400,15 +387,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":null,"name":"dolores","server_id":null,"type":"allow","protocol":"tcp","port":4691,"source":"147.108.28.144","mask":24,"note":"test","status":null,"created_at":null,"updated_at":null}'
content: '{"id":97,"name":"laborum","server_id":1,"type":"allow","protocol":"tcp","port":14235,"source":"100.14.146.200","mask":"24","note":"test","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 6gkvbDae15a6f43EVPdZh8c'
auth: []
controller: null
method: null
route: null
@ -424,10 +408,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete firewall rule.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -445,7 +428,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -455,7 +438,7 @@ endpoints:
name: firewallRule_id
description: 'The ID of the firewallRule.'
required: true
example: 85
example: 94
type: integer
enumValues: []
exampleWasSpecified: false
@ -463,8 +446,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
firewallRule_id: 85
server_id: 32
firewallRule_id: 94
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -478,10 +461,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer ZVd1fk5E3e48hDvaa6g6cPb'
auth: []
controller: null
method: null
route: null

View File

@ -29,12 +29,12 @@ endpoints:
responses:
-
status: 200
content: '{"success":true,"version":"2.4.0"}'
content: '{"success":true,"version":"2.5.0"}'
headers:
cache-control: 'no-cache, private'
content-type: application/json
x-ratelimit-limit: '60'
x-ratelimit-remaining: '59'
x-ratelimit-remaining: '57'
access-control-allow-origin: '*'
description: null
custom: []

View File

@ -14,10 +14,9 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all projects.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters: []
@ -30,15 +29,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":3,"name":"Mr. Drake Nader","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"},{"id":4,"name":"Wilhelmine Jacobson","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":3,"name":"Nash Corwin","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"},{"id":4,"name":"Patience Douglas","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer fbPE6haeDZ8v1gV5ak463dc'
auth: []
controller: null
method: null
route: null
@ -54,10 +50,9 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new project.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters: []
@ -69,27 +64,24 @@ endpoints:
name: name
description: 'The name of the project.'
required: true
example: dignissimos
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
name: dignissimos
name: consequatur
fileParameters: []
responses:
-
status: 200
content: '{"id":3,"name":"Pattie Cole","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":3,"name":"Dr. Cornelius Luettgen V","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 6ZkedcEfa5V6Dv4ab8P3g1h'
auth: []
controller: null
method: null
route: null
@ -105,10 +97,9 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a project by ID.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -132,15 +123,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":3,"name":"Mr. Elias Bauch","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":3,"name":"Orville Satterfield","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer P6ka4Zaefgh8Ec3dV15v6bD'
auth: []
controller: null
method: null
route: null
@ -156,10 +144,9 @@ endpoints:
subgroupDescription: ''
title: update
description: 'Update project.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -182,27 +169,24 @@ endpoints:
name: name
description: 'The name of the project.'
required: true
example: sunt
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
name: sunt
name: consequatur
fileParameters: []
responses:
-
status: 200
content: '{"id":3,"name":"Elfrieda Jakubowski","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":3,"name":"Dr. Cornelius Luettgen V","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer ecaDZkf5E4vgP1V86d6hb3a'
auth: []
controller: null
method: null
route: null
@ -218,10 +202,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete project.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -250,10 +233,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer h5gZ63DPVbcevE4faka86d1'
auth: []
controller: null
method: null
route: null

View File

@ -14,10 +14,9 @@ endpoints:
subgroupDescription: ''
title: index
description: 'Get all redirects.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -35,7 +34,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -45,7 +44,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -53,8 +52,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -63,15 +62,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":null,"site_id":null,"mode":307,"from":"ipsum","to":"http:\/\/fritsch.biz\/","status":"ready","created_at":null,"updated_at":null},{"id":null,"site_id":null,"mode":302,"from":"culpa","to":"http:\/\/www.huels.net\/aut-ut-ut-porro-non-rerum-voluptatum.html","status":"ready","created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":11,"site_id":1,"mode":308,"from":"dolores","to":"http:\/\/dibbert.com\/eius-est-dolor-dolores-minus-voluptatem-quisquam","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"},{"id":12,"site_id":1,"mode":302,"from":"sed","to":"http:\/\/williamson.net\/fugit-facilis-perferendis-dolores-molestias.html","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer cV16fevgEZhPadD43685akb'
auth: []
controller: null
method: null
route: null
@ -87,10 +83,9 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new redirect.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -108,7 +103,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -118,7 +113,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -126,8 +121,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -135,7 +130,7 @@ endpoints:
name: from
description: ''
required: true
example: odit
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -145,7 +140,7 @@ endpoints:
name: to
description: ''
required: true
example: incidunt
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -155,7 +150,7 @@ endpoints:
name: mode
description: ''
required: true
example: 301
example: 302
type: string
enumValues:
- 301
@ -166,9 +161,9 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
from: odit
to: incidunt
mode: 301
from: consequatur
to: consequatur
mode: 302
fileParameters: []
responses:
-
@ -178,10 +173,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer ZD45hPk638abev61EVcagdf'
auth: []
controller: null
method: null
route: null
@ -197,10 +189,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete a redirect.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -218,7 +209,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -228,7 +219,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -246,8 +237,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
redirect_id: 9
queryParameters: []
cleanQueryParameters: []
@ -262,10 +253,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer Ec3fDgdbae615aPh8k6vV4Z'
auth: []
controller: null
method: null
route: null

View File

@ -14,10 +14,9 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all servers in a project.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -41,15 +40,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":null,"project_id":null,"user_id":null,"provider_id":null,"name":"Miss Bonita Vandervort IV","ssh_user":"vito","ip":"120.222.195.212","local_ip":"138.119.37.248","port":22,"os":"ubuntu_22","type":"regular","type_data":null,"provider":"custom","provider_data":null,"public_key":"test","status":"ready","auto_update":null,"available_updates":0,"security_updates":null,"progress":100,"progress_step":null,"updates":null,"last_update_check":null,"created_at":null,"updated_at":null},{"id":null,"project_id":null,"user_id":null,"provider_id":null,"name":"Dr. Shanie Batz IV","ssh_user":"vito","ip":"241.88.138.163","local_ip":"138.226.232.93","port":22,"os":"ubuntu_22","type":"regular","type_data":null,"provider":"custom","provider_data":null,"public_key":"test","status":"ready","auto_update":null,"available_updates":0,"security_updates":null,"progress":100,"progress_step":null,"updates":null,"last_update_check":null,"created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":33,"project_id":1,"user_id":1,"provider_id":null,"name":"Maiya Connelly","ssh_user":"vito","ip":"7.83.102.177","local_ip":"130.245.181.91","port":22,"os":"ubuntu_22","type":"regular","type_data":null,"provider":"custom","provider_data":null,"public_key":"test","status":"ready","auto_update":null,"available_updates":0,"security_updates":null,"progress":100,"progress_step":null,"updates":0,"last_update_check":null,"created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"},{"id":34,"project_id":1,"user_id":1,"provider_id":null,"name":"Dr. Kyler Runolfsdottir DVM","ssh_user":"vito","ip":"106.112.51.73","local_ip":"248.246.77.93","port":22,"os":"ubuntu_22","type":"regular","type_data":null,"provider":"custom","provider_data":null,"public_key":"test","status":"ready","auto_update":null,"available_updates":0,"security_updates":null,"progress":100,"progress_step":null,"updates":0,"last_update_check":null,"created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer Pg1Vk6cvadD8eb3ZhaEf564'
auth: []
controller: null
method: null
route: null
@ -65,10 +61,9 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new server.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -91,7 +86,7 @@ endpoints:
name: provider
description: 'The server provider type'
required: true
example: fugiat
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -101,7 +96,7 @@ endpoints:
name: server_provider
description: 'If the provider is not custom, the ID of the server provider profile'
required: true
example: digitalocean
example: hetzner
type: string
enumValues:
- custom
@ -116,7 +111,7 @@ endpoints:
name: region
description: 'Provider region if the provider is not custom'
required: true
example: itaque
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -126,7 +121,7 @@ endpoints:
name: plan
description: 'Provider plan if the provider is not custom'
required: true
example: voluptatum
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -136,7 +131,7 @@ endpoints:
name: ip
description: 'SSH IP address if the provider is custom'
required: true
example: ut
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -146,7 +141,7 @@ endpoints:
name: port
description: 'SSH Port if the provider is custom'
required: true
example: reiciendis
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -156,7 +151,7 @@ endpoints:
name: name
description: 'The name of the server.'
required: true
example: et
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -166,7 +161,7 @@ endpoints:
name: os
description: 'The os of the server'
required: true
example: vel
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -176,7 +171,7 @@ endpoints:
name: webserver
description: 'Web server'
required: true
example: nginx
example: none
type: string
enumValues:
- none
@ -188,7 +183,7 @@ endpoints:
name: database
description: Database
required: true
example: mysql80
example: mariadb104
type: string
enumValues:
- none
@ -209,7 +204,7 @@ endpoints:
name: php
description: 'PHP version'
required: true
example: '7.2'
example: '8.0'
type: string
enumValues:
- '7.0'
@ -225,30 +220,27 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
provider: fugiat
server_provider: digitalocean
region: itaque
plan: voluptatum
ip: ut
port: reiciendis
name: et
os: vel
webserver: nginx
database: mysql80
php: '7.2'
provider: consequatur
server_provider: hetzner
region: consequatur
plan: consequatur
ip: consequatur
port: consequatur
name: consequatur
os: consequatur
webserver: none
database: mariadb104
php: '8.0'
fileParameters: []
responses:
-
status: 200
content: '{"id":null,"project_id":null,"user_id":null,"provider_id":null,"name":"Jeromy Mann","ssh_user":"vito","ip":"128.70.209.89","local_ip":"150.217.250.187","port":22,"os":"ubuntu_22","type":"regular","type_data":null,"provider":"custom","provider_data":null,"public_key":"test","status":"ready","auto_update":null,"available_updates":0,"security_updates":null,"progress":100,"progress_step":null,"updates":null,"last_update_check":null,"created_at":null,"updated_at":null}'
content: '{"id":33,"project_id":1,"user_id":1,"provider_id":null,"name":"Dr. Cornelius Luettgen V","ssh_user":"vito","ip":"226.187.235.251","local_ip":"18.62.212.253","port":22,"os":"ubuntu_22","type":"regular","type_data":null,"provider":"custom","provider_data":null,"public_key":"test","status":"ready","auto_update":null,"available_updates":0,"security_updates":null,"progress":100,"progress_step":null,"updates":0,"last_update_check":null,"created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 5E61e4vfcgDbVkZd68aah3P'
auth: []
controller: null
method: null
route: null
@ -264,10 +256,9 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a server by ID.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -285,7 +276,7 @@ endpoints:
name: id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -293,7 +284,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
id: 29
id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -302,15 +293,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":null,"project_id":null,"user_id":null,"provider_id":null,"name":"Miss Maya Schaden I","ssh_user":"vito","ip":"44.57.83.39","local_ip":"46.22.92.58","port":22,"os":"ubuntu_22","type":"regular","type_data":null,"provider":"custom","provider_data":null,"public_key":"test","status":"ready","auto_update":null,"available_updates":0,"security_updates":null,"progress":100,"progress_step":null,"updates":null,"last_update_check":null,"created_at":null,"updated_at":null}'
content: '{"id":33,"project_id":1,"user_id":1,"provider_id":null,"name":"Brandy Reichel","ssh_user":"vito","ip":"26.180.121.142","local_ip":"122.175.6.215","port":22,"os":"ubuntu_22","type":"regular","type_data":null,"provider":"custom","provider_data":null,"public_key":"test","status":"ready","auto_update":null,"available_updates":0,"security_updates":null,"progress":100,"progress_step":null,"updates":0,"last_update_check":null,"created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer hV3debf65aPD4E1ckag8Z6v'
auth: []
controller: null
method: null
route: null
@ -326,10 +314,9 @@ endpoints:
subgroupDescription: ''
title: reboot
description: 'Reboot a server.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -347,7 +334,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -355,7 +342,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -369,10 +356,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer b61aD6538PacZEkeghfvV4d'
auth: []
controller: null
method: null
route: null
@ -388,10 +372,9 @@ endpoints:
subgroupDescription: ''
title: upgrade
description: 'Upgrade server.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -409,7 +392,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -417,7 +400,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -431,10 +414,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer dEZaa6cePVf3k86g45vbD1h'
auth: []
controller: null
method: null
route: null
@ -450,10 +430,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete server.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -471,7 +450,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -479,7 +458,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -493,10 +472,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 6aDkZEfdP16V58gb43avhec'
auth: []
controller: null
method: null
route: null

View File

@ -14,10 +14,9 @@ endpoints:
subgroupDescription: ''
title: list
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -41,15 +40,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":3,"project_id":null,"global":true,"name":"aut","provider":"hetzner","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"},{"id":4,"project_id":null,"global":true,"name":"qui","provider":"aws","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":4,"project_id":null,"global":true,"name":"quo","provider":"custom","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"},{"id":5,"project_id":null,"global":true,"name":"sed","provider":"digitalocean","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 3evaP8h6VEZkbfgaD6d1c45'
auth: []
controller: null
method: null
route: null
@ -65,10 +61,9 @@ endpoints:
subgroupDescription: ''
title: create
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -91,7 +86,7 @@ endpoints:
name: provider
description: 'The provider (aws, linode, hetzner, digitalocean, vultr, ...)'
required: true
example: corrupti
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -101,7 +96,7 @@ endpoints:
name: name
description: 'The name of the server provider.'
required: true
example: est
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -111,7 +106,7 @@ endpoints:
name: token
description: 'The token if provider requires api token'
required: true
example: rerum
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -121,7 +116,7 @@ endpoints:
name: key
description: 'The key if provider requires key'
required: true
example: ut
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -131,31 +126,28 @@ endpoints:
name: secret
description: 'The secret if provider requires key'
required: true
example: sed
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
provider: corrupti
name: est
token: rerum
key: ut
secret: sed
provider: consequatur
name: consequatur
token: consequatur
key: consequatur
secret: consequatur
fileParameters: []
responses:
-
status: 200
content: '{"id":3,"project_id":null,"global":true,"name":"voluptas","provider":"vultr","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":4,"project_id":null,"global":true,"name":"dolores","provider":"digitalocean","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 6g6vfEck83VaPhd5Zabe1D4'
auth: []
controller: null
method: null
route: null
@ -171,10 +163,9 @@ endpoints:
subgroupDescription: ''
title: show
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -209,15 +200,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":3,"project_id":null,"global":true,"name":"et","provider":"digitalocean","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":4,"project_id":null,"global":true,"name":"voluptatem","provider":"vultr","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer va63cDe8dPf5Z4Vahb1E6kg'
auth: []
controller: null
method: null
route: null
@ -233,10 +221,9 @@ endpoints:
subgroupDescription: ''
title: update
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -270,7 +257,7 @@ endpoints:
name: name
description: 'The name of the server provider.'
required: true
example: earum
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -289,21 +276,18 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: earum
name: consequatur
global: false
fileParameters: []
responses:
-
status: 200
content: '{"id":3,"project_id":null,"global":true,"name":"architecto","provider":"digitalocean","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":4,"project_id":null,"global":true,"name":"dolores","provider":"digitalocean","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 4e1dghaV6D856P3ZbfkcEva'
auth: []
controller: null
method: null
route: null
@ -319,10 +303,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -362,10 +345,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer fcVa8ev63gP5DaZbkdhE461'
auth: []
controller: null
method: null
route: null

View File

@ -14,10 +14,9 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all ssh keys.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -35,7 +34,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -43,7 +42,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -52,15 +51,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":null,"user":null,"name":"Santa Goyette","created_at":null,"updated_at":null},{"id":null,"user":null,"name":"Cecil Cummings","created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":2,"user":{"id":1,"name":"Saeed Vaziry","email":"demo@vitodeploy.com","created_at":"2024-12-19T23:19:20.000000Z","updated_at":"2025-04-19T21:24:56.000000Z"},"name":"Prof. Aurelia Buckridge MD","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"},{"id":3,"user":{"id":1,"name":"Saeed Vaziry","email":"demo@vitodeploy.com","created_at":"2024-12-19T23:19:20.000000Z","updated_at":"2025-04-19T21:24:56.000000Z"},"name":"Jaylan Lakin","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 165aZvb46PhacEfke83dVgD'
auth: []
controller: null
method: null
route: null
@ -76,10 +72,9 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Deploy ssh key to server.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -97,7 +92,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -105,7 +100,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -113,7 +108,7 @@ endpoints:
name: key_id
description: 'The ID of the key.'
required: true
example: explicabo
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -123,7 +118,7 @@ endpoints:
name: name
description: 'Key name, required if key_id is not provided.'
required: true
example: deleniti
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -133,29 +128,26 @@ endpoints:
name: public_key
description: 'Public Key, required if key_id is not provided.'
required: true
example: sapiente
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
key_id: explicabo
name: deleniti
public_key: sapiente
key_id: consequatur
name: consequatur
public_key: consequatur
fileParameters: []
responses:
-
status: 200
content: '{"id":null,"user":null,"name":"Mr. Reagan Jacobson V","created_at":null,"updated_at":null}'
content: '{"id":2,"user":{"id":1,"name":"Saeed Vaziry","email":"demo@vitodeploy.com","created_at":"2024-12-19T23:19:20.000000Z","updated_at":"2025-04-19T21:24:56.000000Z"},"name":"Dr. Cornelius Luettgen V","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer deDkf4E13PZb6cgaV58ha6v'
auth: []
controller: null
method: null
route: null
@ -171,10 +163,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete ssh key from server.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -192,7 +183,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -210,7 +201,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
sshKey_id: 1
queryParameters: []
cleanQueryParameters: []
@ -225,10 +216,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer ec48fgVdZ6ah3kvPD16E5ab'
auth: []
controller: null
method: null
route: null

View File

@ -14,10 +14,9 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all services.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -35,7 +34,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -43,7 +42,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -52,15 +51,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":null,"server_id":null,"type":null,"type_data":null,"name":null,"version":null,"unit":null,"status":null,"is_default":null,"created_at":null,"updated_at":null},{"id":null,"server_id":null,"type":null,"type_data":null,"name":null,"version":null,"unit":null,"status":null,"is_default":null,"created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":null,"server_id":1,"type":"webserver","type_data":null,"name":"nginx","version":null,"unit":null,"status":"ready","is_default":null,"created_at":null,"updated_at":null},{"id":null,"server_id":1,"type":"webserver","type_data":null,"name":"nginx","version":null,"unit":null,"status":"ready","is_default":null,"created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer gVEce46k8aZfaP3d15vbhD6'
auth: []
controller: null
method: null
route: null
@ -76,10 +72,9 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a service by ID.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -97,7 +92,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -107,7 +102,7 @@ endpoints:
name: id
description: 'The ID of the service.'
required: true
example: 169
example: 184
type: integer
enumValues: []
exampleWasSpecified: false
@ -115,8 +110,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
id: 169
server_id: 32
id: 184
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -125,15 +120,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":null,"server_id":null,"type":null,"type_data":null,"name":null,"version":null,"unit":null,"status":null,"is_default":null,"created_at":null,"updated_at":null}'
content: '{"id":null,"server_id":1,"type":"webserver","type_data":null,"name":"nginx","version":null,"unit":null,"status":"ready","is_default":null,"created_at":null,"updated_at":null}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer Ef8D5gbV6cadk3Zh1vP46ea'
auth: []
controller: null
method: null
route: null
@ -149,10 +141,9 @@ endpoints:
subgroupDescription: ''
title: start
description: 'Start service.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -170,7 +161,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -180,7 +171,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 169
example: 184
type: integer
enumValues: []
exampleWasSpecified: false
@ -188,8 +179,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
service_id: 169
server_id: 32
service_id: 184
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -203,10 +194,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer b3DckZ8g6ha6aPe4f5V1vdE'
auth: []
controller: null
method: null
route: null
@ -222,10 +210,9 @@ endpoints:
subgroupDescription: ''
title: stop
description: 'Stop service.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -243,7 +230,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -253,7 +240,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 169
example: 184
type: integer
enumValues: []
exampleWasSpecified: false
@ -261,8 +248,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
service_id: 169
server_id: 32
service_id: 184
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -276,10 +263,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 1e8aZbfvE5643DacgkPhdV6'
auth: []
controller: null
method: null
route: null
@ -295,10 +279,9 @@ endpoints:
subgroupDescription: ''
title: restart
description: 'Restart service.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -316,7 +299,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -326,7 +309,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 169
example: 184
type: integer
enumValues: []
exampleWasSpecified: false
@ -334,8 +317,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
service_id: 169
server_id: 32
service_id: 184
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -349,10 +332,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer c46baVZEg5dv1Pfe8Dha6k3'
auth: []
controller: null
method: null
route: null
@ -368,10 +348,9 @@ endpoints:
subgroupDescription: ''
title: enable
description: 'Enable service.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -389,7 +368,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -399,7 +378,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 169
example: 184
type: integer
enumValues: []
exampleWasSpecified: false
@ -407,8 +386,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
service_id: 169
server_id: 32
service_id: 184
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -422,10 +401,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer EvcehkDbdV43f61P86Za5ga'
auth: []
controller: null
method: null
route: null
@ -441,10 +417,9 @@ endpoints:
subgroupDescription: ''
title: disable
description: 'Disable service.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -462,7 +437,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -472,7 +447,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 169
example: 184
type: integer
enumValues: []
exampleWasSpecified: false
@ -480,8 +455,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
service_id: 169
server_id: 32
service_id: 184
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -495,10 +470,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer k8E5gf6d4h31bevaa6cVPZD'
auth: []
controller: null
method: null
route: null
@ -514,10 +486,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete service.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -535,7 +506,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -545,7 +516,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 169
example: 184
type: integer
enumValues: []
exampleWasSpecified: false
@ -553,8 +524,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
service_id: 169
server_id: 32
service_id: 184
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -568,10 +539,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer Pekav16cd5ag486ZfD3EVbh'
auth: []
controller: null
method: null
route: null

View File

@ -14,10 +14,9 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all sites.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -35,7 +34,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -43,7 +42,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -52,15 +51,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":null,"server_id":null,"source_control_id":null,"type":"laravel","type_data":null,"domain":"test.com","aliases":null,"web_directory":"\/","path":"\/home","php_version":"8.2","repository":null,"branch":"main","status":"ready","port":null,"user":"vito","progress":100,"created_at":null,"updated_at":null},{"id":null,"server_id":null,"source_control_id":null,"type":"laravel","type_data":null,"domain":"test.com","aliases":null,"web_directory":"\/","path":"\/home","php_version":"8.2","repository":null,"branch":"main","status":"ready","port":null,"user":"vito","progress":100,"created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":50,"server_id":1,"source_control_id":null,"type":"laravel","type_data":null,"domain":"test.com","aliases":null,"web_directory":"\/","path":"\/home","php_version":"8.2","repository":null,"branch":"main","status":"ready","port":null,"user":"vito","progress":100,"created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"},{"id":51,"server_id":1,"source_control_id":null,"type":"laravel","type_data":null,"domain":"test.com","aliases":null,"web_directory":"\/","path":"\/home","php_version":"8.2","repository":null,"branch":"main","status":"ready","port":null,"user":"vito","progress":100,"created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer aD138EgdPf4Vhav5c6bke6Z'
auth: []
controller: null
method: null
route: null
@ -76,10 +72,9 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new site.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -97,7 +92,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -105,7 +100,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -113,7 +108,7 @@ endpoints:
name: type
description: ''
required: true
example: php-blank
example: load-balancer
type: string
enumValues:
- php
@ -129,7 +124,7 @@ endpoints:
name: domain
description: ''
required: true
example: impedit
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -140,7 +135,7 @@ endpoints:
description: ''
required: true
example:
- cum
- consequatur
type: 'string[]'
enumValues: []
exampleWasSpecified: false
@ -170,7 +165,7 @@ endpoints:
name: source_control
description: 'Source control ID, Required for Sites which support source control'
required: true
example: non
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -220,7 +215,7 @@ endpoints:
name: user
description: 'user, to isolate the website under a new user'
required: true
example: voluptate
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -240,32 +235,29 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
type: php-blank
domain: impedit
type: load-balancer
domain: consequatur
aliases:
- cum
- consequatur
php_version: '7.4'
web_directory: public
source_control: non
source_control: consequatur
repository: organization/repository
branch: main
composer: true
version: 5.2.1
user: voluptate
user: consequatur
method: ip-hash
fileParameters: []
responses:
-
status: 200
content: '{"id":null,"server_id":null,"source_control_id":null,"type":"laravel","type_data":null,"domain":"test.com","aliases":null,"web_directory":"\/","path":"\/home","php_version":"8.2","repository":null,"branch":"main","status":"ready","port":null,"user":"vito","progress":100,"created_at":null,"updated_at":null}'
content: '{"id":50,"server_id":1,"source_control_id":null,"type":"laravel","type_data":null,"domain":"test.com","aliases":null,"web_directory":"\/","path":"\/home","php_version":"8.2","repository":null,"branch":"main","status":"ready","port":null,"user":"vito","progress":100,"created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 6V3D5c4g6hZaEfb81evPadk'
auth: []
controller: null
method: null
route: null
@ -281,10 +273,9 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a site by ID.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -302,7 +293,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -312,7 +303,7 @@ endpoints:
name: id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -320,8 +311,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
id: 44
server_id: 32
id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -330,15 +321,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":null,"server_id":null,"source_control_id":null,"type":"laravel","type_data":null,"domain":"test.com","aliases":null,"web_directory":"\/","path":"\/home","php_version":"8.2","repository":null,"branch":"main","status":"ready","port":null,"user":"vito","progress":100,"created_at":null,"updated_at":null}'
content: '{"id":50,"server_id":1,"source_control_id":null,"type":"laravel","type_data":null,"domain":"test.com","aliases":null,"web_directory":"\/","path":"\/home","php_version":"8.2","repository":null,"branch":"main","status":"ready","port":null,"user":"vito","progress":100,"created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer gE86bZ6vfcd3hVP15ka4Dea'
auth: []
controller: null
method: null
route: null
@ -354,10 +342,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete site.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -375,7 +362,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -385,7 +372,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -393,8 +380,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -408,10 +395,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 8kEb6Dd613a5afZhcg4VvPe'
auth: []
controller: null
method: null
route: null
@ -427,10 +411,9 @@ endpoints:
subgroupDescription: ''
title: load-balancer
description: 'Update load balancer.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -448,7 +431,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -458,7 +441,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -466,8 +449,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -475,7 +458,7 @@ endpoints:
name: method
description: 'Load balancer method, Required if the site type is Load balancer'
required: true
example: round-robin
example: ip-hash
type: string
enumValues:
- round-robin
@ -489,16 +472,16 @@ endpoints:
description: 'Array of servers including server, port, weight, backup. (server is the local IP of the server)'
required: true
example:
- omnis
- consequatur
type: 'string[]'
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
method: round-robin
method: ip-hash
servers:
- omnis
- consequatur
fileParameters: []
responses:
-
@ -508,10 +491,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 8Da4P1c6d6gfbhZvaE3k5Ve'
auth: []
controller: null
method: null
route: null
@ -527,10 +507,9 @@ endpoints:
subgroupDescription: ''
title: aliases
description: 'Update aliases.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -548,7 +527,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -558,7 +537,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -566,8 +545,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -576,7 +555,7 @@ endpoints:
description: 'Array of aliases'
required: true
example:
- doloremque
- consequatur
type: 'string[]'
enumValues: []
exampleWasSpecified: false
@ -584,7 +563,7 @@ endpoints:
custom: []
cleanBodyParameters:
aliases:
- doloremque
- consequatur
fileParameters: []
responses:
-
@ -594,10 +573,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer d4EVa8Zkfvg1Dcbe53P6a6h'
auth: []
controller: null
method: null
route: null
@ -613,10 +589,9 @@ endpoints:
subgroupDescription: ''
title: deploy
description: 'Run site deployment script'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -634,7 +609,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -644,7 +619,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -652,8 +627,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -667,10 +642,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer dkcV5EZa8fD6vgaP1b36e4h'
auth: []
controller: null
method: null
route: null
@ -686,10 +658,9 @@ endpoints:
subgroupDescription: ''
title: deployment-script
description: 'Update site deployment script'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -707,7 +678,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -717,7 +688,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -725,8 +696,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -734,14 +705,14 @@ endpoints:
name: script
description: 'Content of the deployment script'
required: true
example: voluptatem
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
script: voluptatem
script: consequatur
fileParameters: []
responses:
-
@ -751,10 +722,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer hevV81bfZE6cdkaa453gDP6'
auth: []
controller: null
method: null
route: null
@ -770,10 +738,9 @@ endpoints:
subgroupDescription: ''
title: deployment-script
description: 'Get site deployment script content'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -791,7 +758,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -801,7 +768,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -809,8 +776,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -824,10 +791,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer a1EbvhePag4f5dk6ZV368Dc'
auth: []
controller: null
method: null
route: null
@ -843,10 +807,9 @@ endpoints:
subgroupDescription: ''
title: env
description: 'Get site .env file content'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -864,7 +827,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -874,7 +837,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -882,8 +845,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -897,10 +860,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer P8Zvch3DgV654abeaE6f1kd'
auth: []
controller: null
method: null
route: null
@ -916,10 +876,9 @@ endpoints:
subgroupDescription: ''
title: env
description: 'Update site .env file'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -937,7 +896,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -947,7 +906,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -955,8 +914,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -964,14 +923,14 @@ endpoints:
name: env
description: 'Content of the .env file'
required: true
example: quam
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
env: quam
env: consequatur
fileParameters: []
responses:
-
@ -981,10 +940,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 45acbP1h6eg6kDVdZf8E3av'
auth: []
controller: null
method: null
route: null

View File

@ -14,10 +14,9 @@ endpoints:
subgroupDescription: ''
title: list
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -41,15 +40,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":5,"project_id":null,"global":true,"name":"Zella Robel","provider":"github","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"},{"id":6,"project_id":null,"global":true,"name":"Jairo Williamson","provider":"github","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":5,"project_id":null,"global":true,"name":"Dr. Cornelius Luettgen V","provider":"github","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"},{"id":6,"project_id":null,"global":true,"name":"Orville Satterfield","provider":"github","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer e3f4ag8hkb5vZcDadPEV661'
auth: []
controller: null
method: null
route: null
@ -65,10 +61,9 @@ endpoints:
subgroupDescription: ''
title: create
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -104,7 +99,7 @@ endpoints:
name: name
description: 'The name of the storage provider.'
required: true
example: molestias
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -114,7 +109,7 @@ endpoints:
name: token
description: 'The token if provider requires api token'
required: true
example: in
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -124,7 +119,7 @@ endpoints:
name: url
description: 'The URL if the provider is Gitlab and it is self-hosted'
required: true
example: 'https://www.white.com/aperiam-dolor-nemo-qui-rerum-quod-quas'
example: 'http://kunze.biz/iste-laborum-eius-est-dolor.html'
type: string
enumValues: []
exampleWasSpecified: false
@ -134,7 +129,7 @@ endpoints:
name: username
description: 'The username if the provider is Bitbucket'
required: true
example: consectetur
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -144,7 +139,7 @@ endpoints:
name: password
description: 'The password if the provider is Bitbucket'
required: true
example: 'y*P4_]ZdjE_:'
example: 'O[2UZ5ij-e/dl4m{o,'
type: string
enumValues: []
exampleWasSpecified: false
@ -152,24 +147,21 @@ endpoints:
custom: []
cleanBodyParameters:
provider: gitlab
name: molestias
token: in
url: 'https://www.white.com/aperiam-dolor-nemo-qui-rerum-quod-quas'
username: consectetur
password: 'y*P4_]ZdjE_:'
name: consequatur
token: consequatur
url: 'http://kunze.biz/iste-laborum-eius-est-dolor.html'
username: consequatur
password: 'O[2UZ5ij-e/dl4m{o,'
fileParameters: []
responses:
-
status: 200
content: '{"id":5,"project_id":null,"global":true,"name":"Miss Claudine Goyette","provider":"github","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":5,"project_id":null,"global":true,"name":"Lonny Ankunding","provider":"github","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer DfegP56vkEa364Zbhda8V1c'
auth: []
controller: null
method: null
route: null
@ -185,10 +177,9 @@ endpoints:
subgroupDescription: ''
title: show
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -223,15 +214,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":5,"project_id":null,"global":true,"name":"Mona Stark","provider":"github","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":5,"project_id":null,"global":true,"name":"Dr. Enoch Harber II","provider":"github","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer ePc6fb65vh1Z4aakE3Dgd8V'
auth: []
controller: null
method: null
route: null
@ -247,10 +235,9 @@ endpoints:
subgroupDescription: ''
title: update
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -284,7 +271,7 @@ endpoints:
name: name
description: 'The name of the storage provider.'
required: true
example: non
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -294,7 +281,7 @@ endpoints:
name: token
description: 'The token if provider requires api token'
required: true
example: sunt
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -304,7 +291,7 @@ endpoints:
name: url
description: 'The URL if the provider is Gitlab and it is self-hosted'
required: true
example: 'https://www.frami.org/ex-at-minus-rerum-quo-minus-ea'
example: 'http://kunze.biz/iste-laborum-eius-est-dolor.html'
type: string
enumValues: []
exampleWasSpecified: false
@ -314,7 +301,7 @@ endpoints:
name: username
description: 'The username if the provider is Bitbucket'
required: true
example: natus
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -324,7 +311,7 @@ endpoints:
name: password
description: 'The password if the provider is Bitbucket'
required: true
example: 'A^">*m{p]DI'
example: 'O[2UZ5ij-e/dl4m{o,'
type: string
enumValues: []
exampleWasSpecified: false
@ -334,7 +321,7 @@ endpoints:
name: global
description: 'Accessible in all projects'
required: true
example: true
example: false
type: string
enumValues:
- true
@ -343,25 +330,22 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: non
token: sunt
url: 'https://www.frami.org/ex-at-minus-rerum-quo-minus-ea'
username: natus
password: 'A^">*m{p]DI'
global: true
name: consequatur
token: consequatur
url: 'http://kunze.biz/iste-laborum-eius-est-dolor.html'
username: consequatur
password: 'O[2UZ5ij-e/dl4m{o,'
global: false
fileParameters: []
responses:
-
status: 200
content: '{"id":5,"project_id":null,"global":true,"name":"Neha Little","provider":"github","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":5,"project_id":null,"global":true,"name":"Lonny Ankunding","provider":"github","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer v3f6aaPk61Ze8hVdDbE5g4c'
auth: []
controller: null
method: null
route: null
@ -377,10 +361,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -420,10 +403,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer fgk61vD68E4cZhP3bV5adea'
auth: []
controller: null
method: null
route: null

View File

@ -14,10 +14,9 @@ endpoints:
subgroupDescription: ''
title: list
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -41,15 +40,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":5,"project_id":null,"global":true,"name":"veritatis","provider":"ftp","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"},{"id":6,"project_id":null,"global":true,"name":"voluptas","provider":"dropbox","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":5,"project_id":null,"global":true,"name":"dolores","provider":"local","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"},{"id":6,"project_id":null,"global":true,"name":"dignissimos","provider":"dropbox","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer fgh4eV31dP58kvaDEaZbc66'
auth: []
controller: null
method: null
route: null
@ -65,10 +61,9 @@ endpoints:
subgroupDescription: ''
title: create
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -91,7 +86,7 @@ endpoints:
name: provider
description: 'The provider (aws, linode, hetzner, digitalocean, vultr, ...)'
required: true
example: ab
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -101,7 +96,7 @@ endpoints:
name: name
description: 'The name of the storage provider.'
required: true
example: quo
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -111,7 +106,7 @@ endpoints:
name: token
description: 'The token if provider requires api token'
required: true
example: in
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -121,7 +116,7 @@ endpoints:
name: key
description: 'The key if provider requires key'
required: true
example: sunt
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -131,31 +126,28 @@ endpoints:
name: secret
description: 'The secret if provider requires key'
required: true
example: molestias
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
provider: ab
name: quo
token: in
key: sunt
secret: molestias
provider: consequatur
name: consequatur
token: consequatur
key: consequatur
secret: consequatur
fileParameters: []
responses:
-
status: 200
content: '{"id":5,"project_id":null,"global":true,"name":"asperiores","provider":"dropbox","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":5,"project_id":null,"global":true,"name":"dolores","provider":"local","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer e584613dkZaPDEVvgcahbf6'
auth: []
controller: null
method: null
route: null
@ -171,10 +163,9 @@ endpoints:
subgroupDescription: ''
title: show
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -209,15 +200,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":5,"project_id":null,"global":true,"name":"ipsum","provider":"local","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":5,"project_id":null,"global":true,"name":"facilis","provider":"dropbox","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer h6Zk6834dDce5fbPa1VvagE'
auth: []
controller: null
method: null
route: null
@ -233,10 +221,9 @@ endpoints:
subgroupDescription: ''
title: update
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -270,7 +257,7 @@ endpoints:
name: name
description: 'The name of the storage provider.'
required: true
example: voluptas
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -289,21 +276,18 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: voluptas
name: consequatur
global: true
fileParameters: []
responses:
-
status: 200
content: '{"id":5,"project_id":null,"global":true,"name":"minima","provider":"ftp","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":5,"project_id":null,"global":true,"name":"dolores","provider":"local","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer ak6fgd1Eba48chvPV3e5Z6D'
auth: []
controller: null
method: null
route: null
@ -319,10 +303,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -362,10 +345,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer PcaDbh6ZE4aV1e8fdv56k3g'
auth: []
controller: null
method: null
route: null

View File

@ -12,10 +12,9 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all cron jobs.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -33,7 +32,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -41,7 +40,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -50,15 +49,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":null,"server_id":null,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":null,"updated_at":null},{"id":null,"server_id":null,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":5,"server_id":1,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"},{"id":6,"server_id":1,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer eDa6Vdh1Z4vc35bP8E6gafk'
auth: []
controller: null
method: null
route: null
@ -74,10 +70,9 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new cron job.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -95,7 +90,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -103,7 +98,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -111,7 +106,7 @@ endpoints:
name: command
description: ''
required: true
example: quia
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -121,7 +116,7 @@ endpoints:
name: user
description: ''
required: true
example: root
example: vito
type: string
enumValues:
- root
@ -140,22 +135,19 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
command: quia
user: root
command: consequatur
user: vito
frequency: '* * * * *'
fileParameters: []
responses:
-
status: 200
content: '{"id":null,"server_id":null,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":null,"updated_at":null}'
content: '{"id":5,"server_id":1,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 66EeZvdh3kVaDP8f4ga5c1b'
auth: []
controller: null
method: null
route: null
@ -171,10 +163,9 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a cron job by ID.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -192,7 +183,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -202,7 +193,7 @@ endpoints:
name: cronJob_id
description: 'The ID of the cronJob.'
required: true
example: 6
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -210,8 +201,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
cronJob_id: 6
server_id: 32
cronJob_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -220,15 +211,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":null,"server_id":null,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":null,"updated_at":null}'
content: '{"id":5,"server_id":1,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer D4c3Z65ebv8E16fahaVgPdk'
auth: []
controller: null
method: null
route: null
@ -244,10 +232,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete cron job.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -265,7 +252,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -275,7 +262,7 @@ endpoints:
name: cronJob_id
description: 'The ID of the cronJob.'
required: true
example: 13
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -283,8 +270,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
cronJob_id: 13
server_id: 32
cronJob_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -298,10 +285,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer h3cP4aZa1v8feDdEg5b6k6V'
auth: []
controller: null
method: null
route: null

View File

@ -12,10 +12,9 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all databases.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -33,7 +32,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -41,7 +40,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -50,15 +49,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":null,"server_id":null,"name":"leffler.esther","status":"ready","created_at":null,"updated_at":null},{"id":null,"server_id":null,"name":"rhoda.rutherford","status":"ready","created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":21,"server_id":1,"name":"carolyne.luettgen","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"},{"id":22,"server_id":1,"name":"orville77","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer E1VdfegZah4k86b53Dc6Pva'
auth: []
controller: null
method: null
route: null
@ -74,10 +70,9 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new database.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -95,7 +90,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -103,7 +98,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -111,7 +106,7 @@ endpoints:
name: name
description: ''
required: true
example: quisquam
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -121,7 +116,7 @@ endpoints:
name: charset
description: ''
required: true
example: omnis
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -131,29 +126,26 @@ endpoints:
name: collation
description: ''
required: true
example: at
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
name: quisquam
charset: omnis
collation: at
name: consequatur
charset: consequatur
collation: consequatur
fileParameters: []
responses:
-
status: 200
content: '{"id":null,"server_id":null,"name":"csawayn","status":"ready","created_at":null,"updated_at":null}'
content: '{"id":21,"server_id":1,"name":"carolyne.luettgen","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer PVgkZ35ca4afd1EbD8ehv66'
auth: []
controller: null
method: null
route: null
@ -169,10 +161,9 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a database by ID.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -190,7 +181,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -200,7 +191,7 @@ endpoints:
name: id
description: 'The ID of the database.'
required: true
example: 8
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -208,8 +199,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
id: 8
server_id: 32
id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -218,15 +209,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":null,"server_id":null,"name":"sandrine43","status":"ready","created_at":null,"updated_at":null}'
content: '{"id":21,"server_id":1,"name":"carolyne.luettgen","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer EP64D8g51adf6hbceavVZ3k'
auth: []
controller: null
method: null
route: null
@ -242,10 +230,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete database.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -263,7 +250,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -273,7 +260,7 @@ endpoints:
name: database_id
description: 'The ID of the database.'
required: true
example: 8
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -281,8 +268,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
database_id: 8
server_id: 32
database_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -296,10 +283,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 8dgEk3Zv1eaVP66bDhf4ac5'
auth: []
controller: null
method: null
route: null

View File

@ -12,10 +12,9 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all database users.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -33,7 +32,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -41,7 +40,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -50,15 +49,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":null,"server_id":null,"username":"letha64","databases":[],"host":"%","status":null,"created_at":null,"updated_at":null},{"id":null,"server_id":null,"username":"hagenes.lurline","databases":[],"host":"%","status":null,"created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":19,"server_id":1,"username":"graciela37","databases":[],"host":"%","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"},{"id":20,"server_id":1,"username":"vconn","databases":[],"host":"%","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer d4g15bV3Pa6hDvck6eaEf8Z'
auth: []
controller: null
method: null
route: null
@ -74,10 +70,9 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new database user.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -95,7 +90,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -103,7 +98,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -111,7 +106,7 @@ endpoints:
name: username
description: ''
required: true
example: qui
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -121,7 +116,7 @@ endpoints:
name: password
description: ''
required: true
example: 'xYv*3,#HQ=5<w!'
example: 'O[2UZ5ij-e/dl4m{o,'
type: string
enumValues: []
exampleWasSpecified: false
@ -138,22 +133,19 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
username: qui
password: 'xYv*3,#HQ=5<w!'
username: consequatur
password: 'O[2UZ5ij-e/dl4m{o,'
host: '%'
fileParameters: []
responses:
-
status: 200
content: '{"id":null,"server_id":null,"username":"marcelle95","databases":[],"host":"%","status":null,"created_at":null,"updated_at":null}'
content: '{"id":19,"server_id":1,"username":"nolan.jaylan","databases":[],"host":"%","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 3vZ6f6kagacDEhV1Pde5b84'
auth: []
controller: null
method: null
route: null
@ -169,10 +161,9 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a database user by ID.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -190,7 +181,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -200,7 +191,7 @@ endpoints:
name: databaseUser_id
description: 'The ID of the databaseUser.'
required: true
example: 1
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -208,8 +199,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
databaseUser_id: 1
server_id: 32
databaseUser_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -218,15 +209,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":null,"server_id":null,"username":"brandi53","databases":[],"host":"%","status":null,"created_at":null,"updated_at":null}'
content: '{"id":19,"server_id":1,"username":"carolyne.luettgen","databases":[],"host":"%","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer af3b5ac6dP8ZV4vE1hk6eDg'
auth: []
controller: null
method: null
route: null
@ -242,10 +230,9 @@ endpoints:
subgroupDescription: ''
title: link
description: 'Link to databases'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -263,7 +250,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -273,7 +260,7 @@ endpoints:
name: databaseUser_id
description: 'The ID of the databaseUser.'
required: true
example: 4
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -281,8 +268,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
databaseUser_id: 4
server_id: 32
databaseUser_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -290,27 +277,24 @@ endpoints:
name: databases
description: 'Array of database names to link to the user.'
required: true
example: maiores
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
databases: maiores
databases: consequatur
fileParameters: []
responses:
-
status: 200
content: '{"id":null,"server_id":null,"username":"kschmidt","databases":[],"host":"%","status":null,"created_at":null,"updated_at":null}'
content: '{"id":19,"server_id":1,"username":"carolyne.luettgen","databases":[],"host":"%","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer b6f3Ed641gaZDcVa5k8vePh'
auth: []
controller: null
method: null
route: null
@ -326,10 +310,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete database user.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -347,7 +330,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -357,7 +340,7 @@ endpoints:
name: databaseUser_id
description: 'The ID of the databaseUser.'
required: true
example: 20
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -365,8 +348,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
databaseUser_id: 20
server_id: 32
databaseUser_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -380,10 +363,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer Zka6fh15g6eaV8vE34cDPdb'
auth: []
controller: null
method: null
route: null

View File

@ -12,10 +12,9 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all firewall rules.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -33,7 +32,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -41,7 +40,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -50,15 +49,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":null,"name":"ut","server_id":null,"type":"allow","protocol":"tcp","port":35499,"source":"177.130.54.250","mask":24,"note":"test","status":null,"created_at":null,"updated_at":null},{"id":null,"name":"totam","server_id":null,"type":"allow","protocol":"tcp","port":29448,"source":"181.194.26.13","mask":24,"note":"test","status":null,"created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":97,"name":"dolores","server_id":1,"type":"allow","protocol":"tcp","port":40770,"source":"199.76.131.15","mask":"24","note":"test","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"},{"id":98,"name":"laborum","server_id":1,"type":"allow","protocol":"tcp","port":14235,"source":"100.14.146.200","mask":"24","note":"test","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer eD368kaZfVEab4v61ghdP5c'
auth: []
controller: null
method: null
route: null
@ -74,10 +70,9 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new firewall rule.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -95,7 +90,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -103,7 +98,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -111,7 +106,7 @@ endpoints:
name: name
description: ''
required: true
example: sapiente
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -145,7 +140,7 @@ endpoints:
name: port
description: ''
required: true
example: et
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -155,7 +150,7 @@ endpoints:
name: source
description: ''
required: false
example: doloribus
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -172,25 +167,22 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: sapiente
name: consequatur
type: allow
protocol: tcp
port: et
source: doloribus
port: consequatur
source: consequatur
mask: '0'
fileParameters: []
responses:
-
status: 200
content: '{"id":null,"name":"omnis","server_id":null,"type":"allow","protocol":"tcp","port":54634,"source":"246.242.9.65","mask":24,"note":"test","status":null,"created_at":null,"updated_at":null}'
content: '{"id":97,"name":"dolores","server_id":1,"type":"allow","protocol":"tcp","port":40770,"source":"199.76.131.15","mask":"24","note":"test","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 3184PbED6aacZveV6hf5dgk'
auth: []
controller: null
method: null
route: null
@ -206,10 +198,9 @@ endpoints:
subgroupDescription: ''
title: edit
description: 'Update an existing firewall rule.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -227,7 +218,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -237,7 +228,7 @@ endpoints:
name: firewallRule_id
description: 'The ID of the firewallRule.'
required: true
example: 85
example: 94
type: integer
enumValues: []
exampleWasSpecified: false
@ -245,8 +236,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
firewallRule_id: 85
server_id: 32
firewallRule_id: 94
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -254,7 +245,7 @@ endpoints:
name: name
description: ''
required: true
example: et
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -288,7 +279,7 @@ endpoints:
name: port
description: ''
required: true
example: aut
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -298,7 +289,7 @@ endpoints:
name: source
description: ''
required: false
example: et
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -315,25 +306,22 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: et
name: consequatur
type: allow
protocol: tcp
port: aut
source: et
port: consequatur
source: consequatur
mask: '0'
fileParameters: []
responses:
-
status: 200
content: '{"id":null,"name":"consequatur","server_id":null,"type":"allow","protocol":"tcp","port":879,"source":"206.106.27.116","mask":24,"note":"test","status":null,"created_at":null,"updated_at":null}'
content: '{"id":97,"name":"dolores","server_id":1,"type":"allow","protocol":"tcp","port":40770,"source":"199.76.131.15","mask":"24","note":"test","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer ad46E3egPDc51aV6hb8vkZf'
auth: []
controller: null
method: null
route: null
@ -349,10 +337,9 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a firewall rule by ID.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -370,7 +357,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -380,7 +367,7 @@ endpoints:
name: firewallRule_id
description: 'The ID of the firewallRule.'
required: true
example: 85
example: 94
type: integer
enumValues: []
exampleWasSpecified: false
@ -388,8 +375,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
firewallRule_id: 85
server_id: 32
firewallRule_id: 94
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -398,15 +385,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":null,"name":"dolores","server_id":null,"type":"allow","protocol":"tcp","port":4691,"source":"147.108.28.144","mask":24,"note":"test","status":null,"created_at":null,"updated_at":null}'
content: '{"id":97,"name":"laborum","server_id":1,"type":"allow","protocol":"tcp","port":14235,"source":"100.14.146.200","mask":"24","note":"test","status":"creating","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 6gkvbDae15a6f43EVPdZh8c'
auth: []
controller: null
method: null
route: null
@ -422,10 +406,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete firewall rule.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -443,7 +426,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -453,7 +436,7 @@ endpoints:
name: firewallRule_id
description: 'The ID of the firewallRule.'
required: true
example: 85
example: 94
type: integer
enumValues: []
exampleWasSpecified: false
@ -461,8 +444,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
firewallRule_id: 85
server_id: 32
firewallRule_id: 94
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -476,10 +459,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer ZVd1fk5E3e48hDvaa6g6cPb'
auth: []
controller: null
method: null
route: null

View File

@ -27,12 +27,12 @@ endpoints:
responses:
-
status: 200
content: '{"success":true,"version":"2.4.0"}'
content: '{"success":true,"version":"2.5.0"}'
headers:
cache-control: 'no-cache, private'
content-type: application/json
x-ratelimit-limit: '60'
x-ratelimit-remaining: '59'
x-ratelimit-remaining: '57'
access-control-allow-origin: '*'
description: null
custom: []

View File

@ -12,10 +12,9 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all projects.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters: []
@ -28,15 +27,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":3,"name":"Mr. Drake Nader","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"},{"id":4,"name":"Wilhelmine Jacobson","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":3,"name":"Nash Corwin","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"},{"id":4,"name":"Patience Douglas","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer fbPE6haeDZ8v1gV5ak463dc'
auth: []
controller: null
method: null
route: null
@ -52,10 +48,9 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new project.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters: []
@ -67,27 +62,24 @@ endpoints:
name: name
description: 'The name of the project.'
required: true
example: dignissimos
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
name: dignissimos
name: consequatur
fileParameters: []
responses:
-
status: 200
content: '{"id":3,"name":"Pattie Cole","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":3,"name":"Dr. Cornelius Luettgen V","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 6ZkedcEfa5V6Dv4ab8P3g1h'
auth: []
controller: null
method: null
route: null
@ -103,10 +95,9 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a project by ID.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -130,15 +121,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":3,"name":"Mr. Elias Bauch","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":3,"name":"Orville Satterfield","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer P6ka4Zaefgh8Ec3dV15v6bD'
auth: []
controller: null
method: null
route: null
@ -154,10 +142,9 @@ endpoints:
subgroupDescription: ''
title: update
description: 'Update project.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -180,27 +167,24 @@ endpoints:
name: name
description: 'The name of the project.'
required: true
example: sunt
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
name: sunt
name: consequatur
fileParameters: []
responses:
-
status: 200
content: '{"id":3,"name":"Elfrieda Jakubowski","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":3,"name":"Dr. Cornelius Luettgen V","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer ecaDZkf5E4vgP1V86d6hb3a'
auth: []
controller: null
method: null
route: null
@ -216,10 +200,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete project.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -248,10 +231,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer h5gZ63DPVbcevE4faka86d1'
auth: []
controller: null
method: null
route: null

View File

@ -12,10 +12,9 @@ endpoints:
subgroupDescription: ''
title: index
description: 'Get all redirects.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -33,7 +32,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -43,7 +42,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -51,8 +50,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -61,15 +60,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":null,"site_id":null,"mode":307,"from":"ipsum","to":"http:\/\/fritsch.biz\/","status":"ready","created_at":null,"updated_at":null},{"id":null,"site_id":null,"mode":302,"from":"culpa","to":"http:\/\/www.huels.net\/aut-ut-ut-porro-non-rerum-voluptatum.html","status":"ready","created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":11,"site_id":1,"mode":308,"from":"dolores","to":"http:\/\/dibbert.com\/eius-est-dolor-dolores-minus-voluptatem-quisquam","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"},{"id":12,"site_id":1,"mode":302,"from":"sed","to":"http:\/\/williamson.net\/fugit-facilis-perferendis-dolores-molestias.html","status":"ready","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer cV16fevgEZhPadD43685akb'
auth: []
controller: null
method: null
route: null
@ -85,10 +81,9 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new redirect.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -106,7 +101,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -116,7 +111,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -124,8 +119,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -133,7 +128,7 @@ endpoints:
name: from
description: ''
required: true
example: odit
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -143,7 +138,7 @@ endpoints:
name: to
description: ''
required: true
example: incidunt
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -153,7 +148,7 @@ endpoints:
name: mode
description: ''
required: true
example: 301
example: 302
type: string
enumValues:
- 301
@ -164,9 +159,9 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
from: odit
to: incidunt
mode: 301
from: consequatur
to: consequatur
mode: 302
fileParameters: []
responses:
-
@ -176,10 +171,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer ZD45hPk638abev61EVcagdf'
auth: []
controller: null
method: null
route: null
@ -195,10 +187,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete a redirect.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -216,7 +207,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -226,7 +217,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -244,8 +235,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
redirect_id: 9
queryParameters: []
cleanQueryParameters: []
@ -260,10 +251,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer Ec3fDgdbae615aPh8k6vV4Z'
auth: []
controller: null
method: null
route: null

View File

@ -12,10 +12,9 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all servers in a project.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -39,15 +38,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":null,"project_id":null,"user_id":null,"provider_id":null,"name":"Miss Bonita Vandervort IV","ssh_user":"vito","ip":"120.222.195.212","local_ip":"138.119.37.248","port":22,"os":"ubuntu_22","type":"regular","type_data":null,"provider":"custom","provider_data":null,"public_key":"test","status":"ready","auto_update":null,"available_updates":0,"security_updates":null,"progress":100,"progress_step":null,"updates":null,"last_update_check":null,"created_at":null,"updated_at":null},{"id":null,"project_id":null,"user_id":null,"provider_id":null,"name":"Dr. Shanie Batz IV","ssh_user":"vito","ip":"241.88.138.163","local_ip":"138.226.232.93","port":22,"os":"ubuntu_22","type":"regular","type_data":null,"provider":"custom","provider_data":null,"public_key":"test","status":"ready","auto_update":null,"available_updates":0,"security_updates":null,"progress":100,"progress_step":null,"updates":null,"last_update_check":null,"created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":33,"project_id":1,"user_id":1,"provider_id":null,"name":"Maiya Connelly","ssh_user":"vito","ip":"7.83.102.177","local_ip":"130.245.181.91","port":22,"os":"ubuntu_22","type":"regular","type_data":null,"provider":"custom","provider_data":null,"public_key":"test","status":"ready","auto_update":null,"available_updates":0,"security_updates":null,"progress":100,"progress_step":null,"updates":0,"last_update_check":null,"created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"},{"id":34,"project_id":1,"user_id":1,"provider_id":null,"name":"Dr. Kyler Runolfsdottir DVM","ssh_user":"vito","ip":"106.112.51.73","local_ip":"248.246.77.93","port":22,"os":"ubuntu_22","type":"regular","type_data":null,"provider":"custom","provider_data":null,"public_key":"test","status":"ready","auto_update":null,"available_updates":0,"security_updates":null,"progress":100,"progress_step":null,"updates":0,"last_update_check":null,"created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer Pg1Vk6cvadD8eb3ZhaEf564'
auth: []
controller: null
method: null
route: null
@ -63,10 +59,9 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new server.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -89,7 +84,7 @@ endpoints:
name: provider
description: 'The server provider type'
required: true
example: fugiat
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -99,7 +94,7 @@ endpoints:
name: server_provider
description: 'If the provider is not custom, the ID of the server provider profile'
required: true
example: digitalocean
example: hetzner
type: string
enumValues:
- custom
@ -114,7 +109,7 @@ endpoints:
name: region
description: 'Provider region if the provider is not custom'
required: true
example: itaque
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -124,7 +119,7 @@ endpoints:
name: plan
description: 'Provider plan if the provider is not custom'
required: true
example: voluptatum
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -134,7 +129,7 @@ endpoints:
name: ip
description: 'SSH IP address if the provider is custom'
required: true
example: ut
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -144,7 +139,7 @@ endpoints:
name: port
description: 'SSH Port if the provider is custom'
required: true
example: reiciendis
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -154,7 +149,7 @@ endpoints:
name: name
description: 'The name of the server.'
required: true
example: et
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -164,7 +159,7 @@ endpoints:
name: os
description: 'The os of the server'
required: true
example: vel
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -174,7 +169,7 @@ endpoints:
name: webserver
description: 'Web server'
required: true
example: nginx
example: none
type: string
enumValues:
- none
@ -186,7 +181,7 @@ endpoints:
name: database
description: Database
required: true
example: mysql80
example: mariadb104
type: string
enumValues:
- none
@ -207,7 +202,7 @@ endpoints:
name: php
description: 'PHP version'
required: true
example: '7.2'
example: '8.0'
type: string
enumValues:
- '7.0'
@ -223,30 +218,27 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
provider: fugiat
server_provider: digitalocean
region: itaque
plan: voluptatum
ip: ut
port: reiciendis
name: et
os: vel
webserver: nginx
database: mysql80
php: '7.2'
provider: consequatur
server_provider: hetzner
region: consequatur
plan: consequatur
ip: consequatur
port: consequatur
name: consequatur
os: consequatur
webserver: none
database: mariadb104
php: '8.0'
fileParameters: []
responses:
-
status: 200
content: '{"id":null,"project_id":null,"user_id":null,"provider_id":null,"name":"Jeromy Mann","ssh_user":"vito","ip":"128.70.209.89","local_ip":"150.217.250.187","port":22,"os":"ubuntu_22","type":"regular","type_data":null,"provider":"custom","provider_data":null,"public_key":"test","status":"ready","auto_update":null,"available_updates":0,"security_updates":null,"progress":100,"progress_step":null,"updates":null,"last_update_check":null,"created_at":null,"updated_at":null}'
content: '{"id":33,"project_id":1,"user_id":1,"provider_id":null,"name":"Dr. Cornelius Luettgen V","ssh_user":"vito","ip":"226.187.235.251","local_ip":"18.62.212.253","port":22,"os":"ubuntu_22","type":"regular","type_data":null,"provider":"custom","provider_data":null,"public_key":"test","status":"ready","auto_update":null,"available_updates":0,"security_updates":null,"progress":100,"progress_step":null,"updates":0,"last_update_check":null,"created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 5E61e4vfcgDbVkZd68aah3P'
auth: []
controller: null
method: null
route: null
@ -262,10 +254,9 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a server by ID.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -283,7 +274,7 @@ endpoints:
name: id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -291,7 +282,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
id: 29
id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -300,15 +291,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":null,"project_id":null,"user_id":null,"provider_id":null,"name":"Miss Maya Schaden I","ssh_user":"vito","ip":"44.57.83.39","local_ip":"46.22.92.58","port":22,"os":"ubuntu_22","type":"regular","type_data":null,"provider":"custom","provider_data":null,"public_key":"test","status":"ready","auto_update":null,"available_updates":0,"security_updates":null,"progress":100,"progress_step":null,"updates":null,"last_update_check":null,"created_at":null,"updated_at":null}'
content: '{"id":33,"project_id":1,"user_id":1,"provider_id":null,"name":"Brandy Reichel","ssh_user":"vito","ip":"26.180.121.142","local_ip":"122.175.6.215","port":22,"os":"ubuntu_22","type":"regular","type_data":null,"provider":"custom","provider_data":null,"public_key":"test","status":"ready","auto_update":null,"available_updates":0,"security_updates":null,"progress":100,"progress_step":null,"updates":0,"last_update_check":null,"created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer hV3debf65aPD4E1ckag8Z6v'
auth: []
controller: null
method: null
route: null
@ -324,10 +312,9 @@ endpoints:
subgroupDescription: ''
title: reboot
description: 'Reboot a server.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -345,7 +332,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -353,7 +340,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -367,10 +354,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer b61aD6538PacZEkeghfvV4d'
auth: []
controller: null
method: null
route: null
@ -386,10 +370,9 @@ endpoints:
subgroupDescription: ''
title: upgrade
description: 'Upgrade server.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -407,7 +390,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -415,7 +398,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -429,10 +412,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer dEZaa6cePVf3k86g45vbD1h'
auth: []
controller: null
method: null
route: null
@ -448,10 +428,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete server.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -469,7 +448,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -477,7 +456,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -491,10 +470,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 6aDkZEfdP16V58gb43avhec'
auth: []
controller: null
method: null
route: null

View File

@ -12,10 +12,9 @@ endpoints:
subgroupDescription: ''
title: list
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -39,15 +38,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":3,"project_id":null,"global":true,"name":"aut","provider":"hetzner","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"},{"id":4,"project_id":null,"global":true,"name":"qui","provider":"aws","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":4,"project_id":null,"global":true,"name":"quo","provider":"custom","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"},{"id":5,"project_id":null,"global":true,"name":"sed","provider":"digitalocean","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 3evaP8h6VEZkbfgaD6d1c45'
auth: []
controller: null
method: null
route: null
@ -63,10 +59,9 @@ endpoints:
subgroupDescription: ''
title: create
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -89,7 +84,7 @@ endpoints:
name: provider
description: 'The provider (aws, linode, hetzner, digitalocean, vultr, ...)'
required: true
example: corrupti
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -99,7 +94,7 @@ endpoints:
name: name
description: 'The name of the server provider.'
required: true
example: est
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -109,7 +104,7 @@ endpoints:
name: token
description: 'The token if provider requires api token'
required: true
example: rerum
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -119,7 +114,7 @@ endpoints:
name: key
description: 'The key if provider requires key'
required: true
example: ut
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -129,31 +124,28 @@ endpoints:
name: secret
description: 'The secret if provider requires key'
required: true
example: sed
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
provider: corrupti
name: est
token: rerum
key: ut
secret: sed
provider: consequatur
name: consequatur
token: consequatur
key: consequatur
secret: consequatur
fileParameters: []
responses:
-
status: 200
content: '{"id":3,"project_id":null,"global":true,"name":"voluptas","provider":"vultr","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":4,"project_id":null,"global":true,"name":"dolores","provider":"digitalocean","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 6g6vfEck83VaPhd5Zabe1D4'
auth: []
controller: null
method: null
route: null
@ -169,10 +161,9 @@ endpoints:
subgroupDescription: ''
title: show
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -207,15 +198,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":3,"project_id":null,"global":true,"name":"et","provider":"digitalocean","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":4,"project_id":null,"global":true,"name":"voluptatem","provider":"vultr","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer va63cDe8dPf5Z4Vahb1E6kg'
auth: []
controller: null
method: null
route: null
@ -231,10 +219,9 @@ endpoints:
subgroupDescription: ''
title: update
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -268,7 +255,7 @@ endpoints:
name: name
description: 'The name of the server provider.'
required: true
example: earum
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -287,21 +274,18 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: earum
name: consequatur
global: false
fileParameters: []
responses:
-
status: 200
content: '{"id":3,"project_id":null,"global":true,"name":"architecto","provider":"digitalocean","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":4,"project_id":null,"global":true,"name":"dolores","provider":"digitalocean","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 4e1dghaV6D856P3ZbfkcEva'
auth: []
controller: null
method: null
route: null
@ -317,10 +301,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -360,10 +343,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer fcVa8ev63gP5DaZbkdhE461'
auth: []
controller: null
method: null
route: null

View File

@ -12,10 +12,9 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all ssh keys.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -33,7 +32,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -41,7 +40,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -50,15 +49,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":null,"user":null,"name":"Santa Goyette","created_at":null,"updated_at":null},{"id":null,"user":null,"name":"Cecil Cummings","created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":2,"user":{"id":1,"name":"Saeed Vaziry","email":"demo@vitodeploy.com","created_at":"2024-12-19T23:19:20.000000Z","updated_at":"2025-04-19T21:24:56.000000Z"},"name":"Prof. Aurelia Buckridge MD","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"},{"id":3,"user":{"id":1,"name":"Saeed Vaziry","email":"demo@vitodeploy.com","created_at":"2024-12-19T23:19:20.000000Z","updated_at":"2025-04-19T21:24:56.000000Z"},"name":"Jaylan Lakin","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 165aZvb46PhacEfke83dVgD'
auth: []
controller: null
method: null
route: null
@ -74,10 +70,9 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Deploy ssh key to server.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -95,7 +90,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -103,7 +98,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -111,7 +106,7 @@ endpoints:
name: key_id
description: 'The ID of the key.'
required: true
example: explicabo
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -121,7 +116,7 @@ endpoints:
name: name
description: 'Key name, required if key_id is not provided.'
required: true
example: deleniti
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -131,29 +126,26 @@ endpoints:
name: public_key
description: 'Public Key, required if key_id is not provided.'
required: true
example: sapiente
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
key_id: explicabo
name: deleniti
public_key: sapiente
key_id: consequatur
name: consequatur
public_key: consequatur
fileParameters: []
responses:
-
status: 200
content: '{"id":null,"user":null,"name":"Mr. Reagan Jacobson V","created_at":null,"updated_at":null}'
content: '{"id":2,"user":{"id":1,"name":"Saeed Vaziry","email":"demo@vitodeploy.com","created_at":"2024-12-19T23:19:20.000000Z","updated_at":"2025-04-19T21:24:56.000000Z"},"name":"Dr. Cornelius Luettgen V","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer deDkf4E13PZb6cgaV58ha6v'
auth: []
controller: null
method: null
route: null
@ -169,10 +161,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete ssh key from server.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -190,7 +181,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -208,7 +199,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
sshKey_id: 1
queryParameters: []
cleanQueryParameters: []
@ -223,10 +214,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer ec48fgVdZ6ah3kvPD16E5ab'
auth: []
controller: null
method: null
route: null

View File

@ -12,10 +12,9 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all services.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -33,7 +32,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -41,7 +40,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -50,15 +49,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":null,"server_id":null,"type":null,"type_data":null,"name":null,"version":null,"unit":null,"status":null,"is_default":null,"created_at":null,"updated_at":null},{"id":null,"server_id":null,"type":null,"type_data":null,"name":null,"version":null,"unit":null,"status":null,"is_default":null,"created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":null,"server_id":1,"type":"webserver","type_data":null,"name":"nginx","version":null,"unit":null,"status":"ready","is_default":null,"created_at":null,"updated_at":null},{"id":null,"server_id":1,"type":"webserver","type_data":null,"name":"nginx","version":null,"unit":null,"status":"ready","is_default":null,"created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer gVEce46k8aZfaP3d15vbhD6'
auth: []
controller: null
method: null
route: null
@ -74,10 +70,9 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a service by ID.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -95,7 +90,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -105,7 +100,7 @@ endpoints:
name: id
description: 'The ID of the service.'
required: true
example: 169
example: 184
type: integer
enumValues: []
exampleWasSpecified: false
@ -113,8 +108,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
id: 169
server_id: 32
id: 184
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -123,15 +118,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":null,"server_id":null,"type":null,"type_data":null,"name":null,"version":null,"unit":null,"status":null,"is_default":null,"created_at":null,"updated_at":null}'
content: '{"id":null,"server_id":1,"type":"webserver","type_data":null,"name":"nginx","version":null,"unit":null,"status":"ready","is_default":null,"created_at":null,"updated_at":null}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer Ef8D5gbV6cadk3Zh1vP46ea'
auth: []
controller: null
method: null
route: null
@ -147,10 +139,9 @@ endpoints:
subgroupDescription: ''
title: start
description: 'Start service.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -168,7 +159,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -178,7 +169,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 169
example: 184
type: integer
enumValues: []
exampleWasSpecified: false
@ -186,8 +177,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
service_id: 169
server_id: 32
service_id: 184
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -201,10 +192,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer b3DckZ8g6ha6aPe4f5V1vdE'
auth: []
controller: null
method: null
route: null
@ -220,10 +208,9 @@ endpoints:
subgroupDescription: ''
title: stop
description: 'Stop service.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -241,7 +228,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -251,7 +238,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 169
example: 184
type: integer
enumValues: []
exampleWasSpecified: false
@ -259,8 +246,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
service_id: 169
server_id: 32
service_id: 184
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -274,10 +261,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 1e8aZbfvE5643DacgkPhdV6'
auth: []
controller: null
method: null
route: null
@ -293,10 +277,9 @@ endpoints:
subgroupDescription: ''
title: restart
description: 'Restart service.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -314,7 +297,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -324,7 +307,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 169
example: 184
type: integer
enumValues: []
exampleWasSpecified: false
@ -332,8 +315,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
service_id: 169
server_id: 32
service_id: 184
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -347,10 +330,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer c46baVZEg5dv1Pfe8Dha6k3'
auth: []
controller: null
method: null
route: null
@ -366,10 +346,9 @@ endpoints:
subgroupDescription: ''
title: enable
description: 'Enable service.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -387,7 +366,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -397,7 +376,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 169
example: 184
type: integer
enumValues: []
exampleWasSpecified: false
@ -405,8 +384,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
service_id: 169
server_id: 32
service_id: 184
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -420,10 +399,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer EvcehkDbdV43f61P86Za5ga'
auth: []
controller: null
method: null
route: null
@ -439,10 +415,9 @@ endpoints:
subgroupDescription: ''
title: disable
description: 'Disable service.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -460,7 +435,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -470,7 +445,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 169
example: 184
type: integer
enumValues: []
exampleWasSpecified: false
@ -478,8 +453,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
service_id: 169
server_id: 32
service_id: 184
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -493,10 +468,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer k8E5gf6d4h31bevaa6cVPZD'
auth: []
controller: null
method: null
route: null
@ -512,10 +484,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete service.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -533,7 +504,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -543,7 +514,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 169
example: 184
type: integer
enumValues: []
exampleWasSpecified: false
@ -551,8 +522,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
service_id: 169
server_id: 32
service_id: 184
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -566,10 +537,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer Pekav16cd5ag486ZfD3EVbh'
auth: []
controller: null
method: null
route: null

View File

@ -12,10 +12,9 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all sites.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -33,7 +32,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -41,7 +40,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -50,15 +49,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":null,"server_id":null,"source_control_id":null,"type":"laravel","type_data":null,"domain":"test.com","aliases":null,"web_directory":"\/","path":"\/home","php_version":"8.2","repository":null,"branch":"main","status":"ready","port":null,"user":"vito","progress":100,"created_at":null,"updated_at":null},{"id":null,"server_id":null,"source_control_id":null,"type":"laravel","type_data":null,"domain":"test.com","aliases":null,"web_directory":"\/","path":"\/home","php_version":"8.2","repository":null,"branch":"main","status":"ready","port":null,"user":"vito","progress":100,"created_at":null,"updated_at":null}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":50,"server_id":1,"source_control_id":null,"type":"laravel","type_data":null,"domain":"test.com","aliases":null,"web_directory":"\/","path":"\/home","php_version":"8.2","repository":null,"branch":"main","status":"ready","port":null,"user":"vito","progress":100,"created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"},{"id":51,"server_id":1,"source_control_id":null,"type":"laravel","type_data":null,"domain":"test.com","aliases":null,"web_directory":"\/","path":"\/home","php_version":"8.2","repository":null,"branch":"main","status":"ready","port":null,"user":"vito","progress":100,"created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer aD138EgdPf4Vhav5c6bke6Z'
auth: []
controller: null
method: null
route: null
@ -74,10 +70,9 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new site.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -95,7 +90,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -103,7 +98,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
server_id: 32
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -111,7 +106,7 @@ endpoints:
name: type
description: ''
required: true
example: php-blank
example: load-balancer
type: string
enumValues:
- php
@ -127,7 +122,7 @@ endpoints:
name: domain
description: ''
required: true
example: impedit
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -138,7 +133,7 @@ endpoints:
description: ''
required: true
example:
- cum
- consequatur
type: 'string[]'
enumValues: []
exampleWasSpecified: false
@ -168,7 +163,7 @@ endpoints:
name: source_control
description: 'Source control ID, Required for Sites which support source control'
required: true
example: non
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -218,7 +213,7 @@ endpoints:
name: user
description: 'user, to isolate the website under a new user'
required: true
example: voluptate
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -238,32 +233,29 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
type: php-blank
domain: impedit
type: load-balancer
domain: consequatur
aliases:
- cum
- consequatur
php_version: '7.4'
web_directory: public
source_control: non
source_control: consequatur
repository: organization/repository
branch: main
composer: true
version: 5.2.1
user: voluptate
user: consequatur
method: ip-hash
fileParameters: []
responses:
-
status: 200
content: '{"id":null,"server_id":null,"source_control_id":null,"type":"laravel","type_data":null,"domain":"test.com","aliases":null,"web_directory":"\/","path":"\/home","php_version":"8.2","repository":null,"branch":"main","status":"ready","port":null,"user":"vito","progress":100,"created_at":null,"updated_at":null}'
content: '{"id":50,"server_id":1,"source_control_id":null,"type":"laravel","type_data":null,"domain":"test.com","aliases":null,"web_directory":"\/","path":"\/home","php_version":"8.2","repository":null,"branch":"main","status":"ready","port":null,"user":"vito","progress":100,"created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 6V3D5c4g6hZaEfb81evPadk'
auth: []
controller: null
method: null
route: null
@ -279,10 +271,9 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a site by ID.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -300,7 +291,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -310,7 +301,7 @@ endpoints:
name: id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -318,8 +309,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
id: 44
server_id: 32
id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -328,15 +319,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":null,"server_id":null,"source_control_id":null,"type":"laravel","type_data":null,"domain":"test.com","aliases":null,"web_directory":"\/","path":"\/home","php_version":"8.2","repository":null,"branch":"main","status":"ready","port":null,"user":"vito","progress":100,"created_at":null,"updated_at":null}'
content: '{"id":50,"server_id":1,"source_control_id":null,"type":"laravel","type_data":null,"domain":"test.com","aliases":null,"web_directory":"\/","path":"\/home","php_version":"8.2","repository":null,"branch":"main","status":"ready","port":null,"user":"vito","progress":100,"created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer gE86bZ6vfcd3hVP15ka4Dea'
auth: []
controller: null
method: null
route: null
@ -352,10 +340,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete site.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -373,7 +360,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -383,7 +370,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -391,8 +378,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -406,10 +393,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 8kEb6Dd613a5afZhcg4VvPe'
auth: []
controller: null
method: null
route: null
@ -425,10 +409,9 @@ endpoints:
subgroupDescription: ''
title: load-balancer
description: 'Update load balancer.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -446,7 +429,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -456,7 +439,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -464,8 +447,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -473,7 +456,7 @@ endpoints:
name: method
description: 'Load balancer method, Required if the site type is Load balancer'
required: true
example: round-robin
example: ip-hash
type: string
enumValues:
- round-robin
@ -487,16 +470,16 @@ endpoints:
description: 'Array of servers including server, port, weight, backup. (server is the local IP of the server)'
required: true
example:
- omnis
- consequatur
type: 'string[]'
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
method: round-robin
method: ip-hash
servers:
- omnis
- consequatur
fileParameters: []
responses:
-
@ -506,10 +489,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 8Da4P1c6d6gfbhZvaE3k5Ve'
auth: []
controller: null
method: null
route: null
@ -525,10 +505,9 @@ endpoints:
subgroupDescription: ''
title: aliases
description: 'Update aliases.'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -546,7 +525,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -556,7 +535,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -564,8 +543,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -574,7 +553,7 @@ endpoints:
description: 'Array of aliases'
required: true
example:
- doloremque
- consequatur
type: 'string[]'
enumValues: []
exampleWasSpecified: false
@ -582,7 +561,7 @@ endpoints:
custom: []
cleanBodyParameters:
aliases:
- doloremque
- consequatur
fileParameters: []
responses:
-
@ -592,10 +571,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer d4EVa8Zkfvg1Dcbe53P6a6h'
auth: []
controller: null
method: null
route: null
@ -611,10 +587,9 @@ endpoints:
subgroupDescription: ''
title: deploy
description: 'Run site deployment script'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -632,7 +607,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -642,7 +617,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -650,8 +625,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -665,10 +640,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer dkcV5EZa8fD6vgaP1b36e4h'
auth: []
controller: null
method: null
route: null
@ -684,10 +656,9 @@ endpoints:
subgroupDescription: ''
title: deployment-script
description: 'Update site deployment script'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -705,7 +676,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -715,7 +686,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -723,8 +694,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -732,14 +703,14 @@ endpoints:
name: script
description: 'Content of the deployment script'
required: true
example: voluptatem
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
script: voluptatem
script: consequatur
fileParameters: []
responses:
-
@ -749,10 +720,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer hevV81bfZE6cdkaa453gDP6'
auth: []
controller: null
method: null
route: null
@ -768,10 +736,9 @@ endpoints:
subgroupDescription: ''
title: deployment-script
description: 'Get site deployment script content'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -789,7 +756,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -799,7 +766,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -807,8 +774,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -822,10 +789,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer a1EbvhePag4f5dk6ZV368Dc'
auth: []
controller: null
method: null
route: null
@ -841,10 +805,9 @@ endpoints:
subgroupDescription: ''
title: env
description: 'Get site .env file content'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -862,7 +825,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -872,7 +835,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -880,8 +843,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -895,10 +858,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer P8Zvch3DgV654abeaE6f1kd'
auth: []
controller: null
method: null
route: null
@ -914,10 +874,9 @@ endpoints:
subgroupDescription: ''
title: env
description: 'Update site .env file'
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -935,7 +894,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 29
example: 32
type: integer
enumValues: []
exampleWasSpecified: false
@ -945,7 +904,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 44
example: 17
type: integer
enumValues: []
exampleWasSpecified: false
@ -953,8 +912,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 29
site_id: 44
server_id: 32
site_id: 17
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -962,14 +921,14 @@ endpoints:
name: env
description: 'Content of the .env file'
required: true
example: quam
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
env: quam
env: consequatur
fileParameters: []
responses:
-
@ -979,10 +938,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer 45acbP1h6eg6kDVdZf8E3av'
auth: []
controller: null
method: null
route: null

View File

@ -12,10 +12,9 @@ endpoints:
subgroupDescription: ''
title: list
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -39,15 +38,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":5,"project_id":null,"global":true,"name":"Zella Robel","provider":"github","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"},{"id":6,"project_id":null,"global":true,"name":"Jairo Williamson","provider":"github","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":5,"project_id":null,"global":true,"name":"Dr. Cornelius Luettgen V","provider":"github","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"},{"id":6,"project_id":null,"global":true,"name":"Orville Satterfield","provider":"github","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer e3f4ag8hkb5vZcDadPEV661'
auth: []
controller: null
method: null
route: null
@ -63,10 +59,9 @@ endpoints:
subgroupDescription: ''
title: create
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -102,7 +97,7 @@ endpoints:
name: name
description: 'The name of the storage provider.'
required: true
example: molestias
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -112,7 +107,7 @@ endpoints:
name: token
description: 'The token if provider requires api token'
required: true
example: in
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -122,7 +117,7 @@ endpoints:
name: url
description: 'The URL if the provider is Gitlab and it is self-hosted'
required: true
example: 'https://www.white.com/aperiam-dolor-nemo-qui-rerum-quod-quas'
example: 'http://kunze.biz/iste-laborum-eius-est-dolor.html'
type: string
enumValues: []
exampleWasSpecified: false
@ -132,7 +127,7 @@ endpoints:
name: username
description: 'The username if the provider is Bitbucket'
required: true
example: consectetur
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -142,7 +137,7 @@ endpoints:
name: password
description: 'The password if the provider is Bitbucket'
required: true
example: 'y*P4_]ZdjE_:'
example: 'O[2UZ5ij-e/dl4m{o,'
type: string
enumValues: []
exampleWasSpecified: false
@ -150,24 +145,21 @@ endpoints:
custom: []
cleanBodyParameters:
provider: gitlab
name: molestias
token: in
url: 'https://www.white.com/aperiam-dolor-nemo-qui-rerum-quod-quas'
username: consectetur
password: 'y*P4_]ZdjE_:'
name: consequatur
token: consequatur
url: 'http://kunze.biz/iste-laborum-eius-est-dolor.html'
username: consequatur
password: 'O[2UZ5ij-e/dl4m{o,'
fileParameters: []
responses:
-
status: 200
content: '{"id":5,"project_id":null,"global":true,"name":"Miss Claudine Goyette","provider":"github","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":5,"project_id":null,"global":true,"name":"Lonny Ankunding","provider":"github","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer DfegP56vkEa364Zbhda8V1c'
auth: []
controller: null
method: null
route: null
@ -183,10 +175,9 @@ endpoints:
subgroupDescription: ''
title: show
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -221,15 +212,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":5,"project_id":null,"global":true,"name":"Mona Stark","provider":"github","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":5,"project_id":null,"global":true,"name":"Dr. Enoch Harber II","provider":"github","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer ePc6fb65vh1Z4aakE3Dgd8V'
auth: []
controller: null
method: null
route: null
@ -245,10 +233,9 @@ endpoints:
subgroupDescription: ''
title: update
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -282,7 +269,7 @@ endpoints:
name: name
description: 'The name of the storage provider.'
required: true
example: non
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -292,7 +279,7 @@ endpoints:
name: token
description: 'The token if provider requires api token'
required: true
example: sunt
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -302,7 +289,7 @@ endpoints:
name: url
description: 'The URL if the provider is Gitlab and it is self-hosted'
required: true
example: 'https://www.frami.org/ex-at-minus-rerum-quo-minus-ea'
example: 'http://kunze.biz/iste-laborum-eius-est-dolor.html'
type: string
enumValues: []
exampleWasSpecified: false
@ -312,7 +299,7 @@ endpoints:
name: username
description: 'The username if the provider is Bitbucket'
required: true
example: natus
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -322,7 +309,7 @@ endpoints:
name: password
description: 'The password if the provider is Bitbucket'
required: true
example: 'A^">*m{p]DI'
example: 'O[2UZ5ij-e/dl4m{o,'
type: string
enumValues: []
exampleWasSpecified: false
@ -332,7 +319,7 @@ endpoints:
name: global
description: 'Accessible in all projects'
required: true
example: true
example: false
type: string
enumValues:
- true
@ -341,25 +328,22 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: non
token: sunt
url: 'https://www.frami.org/ex-at-minus-rerum-quo-minus-ea'
username: natus
password: 'A^">*m{p]DI'
global: true
name: consequatur
token: consequatur
url: 'http://kunze.biz/iste-laborum-eius-est-dolor.html'
username: consequatur
password: 'O[2UZ5ij-e/dl4m{o,'
global: false
fileParameters: []
responses:
-
status: 200
content: '{"id":5,"project_id":null,"global":true,"name":"Neha Little","provider":"github","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":5,"project_id":null,"global":true,"name":"Lonny Ankunding","provider":"github","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer v3f6aaPk61Ze8hVdDbE5g4c'
auth: []
controller: null
method: null
route: null
@ -375,10 +359,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -418,10 +401,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer fgk61vD68E4cZhP3bV5adea'
auth: []
controller: null
method: null
route: null

View File

@ -12,10 +12,9 @@ endpoints:
subgroupDescription: ''
title: list
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -39,15 +38,12 @@ endpoints:
responses:
-
status: 200
content: '{"data":[{"id":5,"project_id":null,"global":true,"name":"veritatis","provider":"ftp","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"},{"id":6,"project_id":null,"global":true,"name":"voluptas","provider":"dropbox","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
content: '{"data":[{"id":5,"project_id":null,"global":true,"name":"dolores","provider":"local","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"},{"id":6,"project_id":null,"global":true,"name":"dignissimos","provider":"dropbox","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}],"links":{"first":"\/?page=1","last":"\/?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"&laquo; Previous","active":false},{"url":"\/?page=1","label":"1","active":true},{"url":null,"label":"Next &raquo;","active":false}],"path":"\/","per_page":25,"to":2,"total":2}}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer fgh4eV31dP58kvaDEaZbc66'
auth: []
controller: null
method: null
route: null
@ -63,10 +59,9 @@ endpoints:
subgroupDescription: ''
title: create
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -89,7 +84,7 @@ endpoints:
name: provider
description: 'The provider (aws, linode, hetzner, digitalocean, vultr, ...)'
required: true
example: ab
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -99,7 +94,7 @@ endpoints:
name: name
description: 'The name of the storage provider.'
required: true
example: quo
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -109,7 +104,7 @@ endpoints:
name: token
description: 'The token if provider requires api token'
required: true
example: in
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -119,7 +114,7 @@ endpoints:
name: key
description: 'The key if provider requires key'
required: true
example: sunt
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -129,31 +124,28 @@ endpoints:
name: secret
description: 'The secret if provider requires key'
required: true
example: molestias
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
provider: ab
name: quo
token: in
key: sunt
secret: molestias
provider: consequatur
name: consequatur
token: consequatur
key: consequatur
secret: consequatur
fileParameters: []
responses:
-
status: 200
content: '{"id":5,"project_id":null,"global":true,"name":"asperiores","provider":"dropbox","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":5,"project_id":null,"global":true,"name":"dolores","provider":"local","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer e584613dkZaPDEVvgcahbf6'
auth: []
controller: null
method: null
route: null
@ -169,10 +161,9 @@ endpoints:
subgroupDescription: ''
title: show
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -207,15 +198,12 @@ endpoints:
responses:
-
status: 200
content: '{"id":5,"project_id":null,"global":true,"name":"ipsum","provider":"local","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":5,"project_id":null,"global":true,"name":"facilis","provider":"dropbox","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer h6Zk6834dDce5fbPa1VvagE'
auth: []
controller: null
method: null
route: null
@ -231,10 +219,9 @@ endpoints:
subgroupDescription: ''
title: update
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -268,7 +255,7 @@ endpoints:
name: name
description: 'The name of the storage provider.'
required: true
example: voluptas
example: consequatur
type: string
enumValues: []
exampleWasSpecified: false
@ -287,21 +274,18 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: voluptas
name: consequatur
global: true
fileParameters: []
responses:
-
status: 200
content: '{"id":5,"project_id":null,"global":true,"name":"minima","provider":"ftp","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
content: '{"id":5,"project_id":null,"global":true,"name":"dolores","provider":"local","created_at":"2025-04-21T18:40:20.000000Z","updated_at":"2025-04-21T18:40:20.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer ak6fgd1Eba48chvPV3e5Z6D'
auth: []
controller: null
method: null
route: null
@ -317,10 +301,9 @@ endpoints:
subgroupDescription: ''
title: delete
description: ''
authenticated: true
authenticated: false
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -360,10 +343,7 @@ endpoints:
description: ''
custom: []
responseFields: []
auth:
- headers
- Authorization
- 'Bearer PcaDbh6ZE4aV1e8fdv56k3g'
auth: []
controller: null
method: null
route: null

View File

@ -3,11 +3,11 @@ # Introduction
VitoDeploy's API documentation.
<aside>
<strong>Base URL</strong>: <code>https://your-vito-url</code>
<strong>Base URL</strong>: <code>https://vito.test</code>
</aside>
This documentation aims to provide all the information you need to work with our API.
This documentation aims to provide all the information you need to work with our API.
<aside>As you scroll, you'll see code examples for working with the API in different programming languages in the dark area to the right (or as part of the content on mobile).
You can switch the language used with the tabs at the top right (or from the nav menu at the top left on mobile).</aside>
<aside>As you scroll, you'll see code examples for working with the API in different programming languages in the dark area to the right (or as part of the content on mobile).
You can switch the language used with the tabs at the top right (or from the nav menu at the top left on mobile).</aside>

View File

@ -48,11 +48,6 @@ ## Credits
- PHPSecLib
- PHPUnit
- Tailwindcss
- Alpinejs
- Livewire
- Vite
- Prettier
- Postcss
- FilamentPHP
- Mobiledetect
- Spatie

View File

@ -17,6 +17,7 @@
use Exception;
use Illuminate\Database\Query\Builder;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
use Illuminate\Validation\Rule;
use Illuminate\Validation\ValidationException;
@ -29,6 +30,8 @@ class CreateServer
*/
public function create(User $creator, Project $project, array $input): Server
{
Validator::make($input, self::rules($project, $input))->validate();
$server = new Server([
'project_id' => $project->id,
'user_id' => $creator->id,

View File

@ -8,6 +8,7 @@
use App\Models\User;
use App\ServerProviders\ServerProvider as ServerProviderContract;
use Exception;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
use Illuminate\Validation\ValidationException;
@ -20,6 +21,8 @@ class CreateServerProvider
*/
public function create(User $user, Project $project, array $input): ServerProvider
{
Validator::make($input, self::rules($input))->validate();
$provider = self::getProvider($input['provider']);
try {

View File

@ -15,7 +15,7 @@
* @method static string upload(string $local, string $remote, ?string $owner = null)
* @method static string download(string $local, string $remote)
* @method static string write(string $path, string $content, string $owner = null)
* @method static string assertExecuted(array<int, string>|string $commands)
* @method static string assertExecuted(mixed $commands)
* @method static string assertExecutedContains(string $command)
* @method static string assertFileUploaded(string $toPath, ?string $content = null)
* @method static string getUploadedLocalPath()

View File

@ -0,0 +1,88 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Auth\Events\Lockout;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException;
use Inertia\Inertia;
use Inertia\Response;
use Spatie\RouteAttributes\Attributes\Get;
use Spatie\RouteAttributes\Attributes\Post;
class AuthenticatedSessionController extends Controller
{
#[Get('login', name: 'login', middleware: 'guest')]
public function create(Request $request): Response
{
return Inertia::render('auth/login', [
'canResetPassword' => Route::has('password.request'),
'status' => $request->session()->get('status'),
]);
}
#[Post('login', name: 'login', middleware: 'guest')]
public function store(Request $request): RedirectResponse
{
$this->validate($request, [
'email' => ['required', 'string', 'email'],
'password' => ['required', 'string'],
]);
$this->ensureIsNotRateLimited();
if (! Auth::attempt(['email' => $request->email, 'password' => $request->password], $request->remember)) {
RateLimiter::hit($this->throttleKey());
throw ValidationException::withMessages([
'email' => __('auth.failed'),
]);
}
RateLimiter::clear($this->throttleKey());
Session::regenerate();
return redirect()->intended(route('servers', absolute: false));
}
#[Post('logout', name: 'logout', middleware: 'auth')]
public function destroy(Request $request): RedirectResponse
{
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}
protected function ensureIsNotRateLimited(): void
{
if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) {
return;
}
event(new Lockout(request()));
$seconds = RateLimiter::availableIn($this->throttleKey());
throw ValidationException::withMessages([
'email' => __('auth.throttle', [
'seconds' => $seconds,
'minutes' => ceil($seconds / 60),
]),
]);
}
protected function throttleKey(): string
{
return Str::transliterate(Str::lower(request()->email).'|'.request()->ip());
}
}

View File

@ -0,0 +1,43 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;
use Inertia\Inertia;
use Inertia\Response;
use Spatie\RouteAttributes\Attributes\Get;
use Spatie\RouteAttributes\Attributes\Middleware;
use Spatie\RouteAttributes\Attributes\Post;
use Spatie\RouteAttributes\Attributes\Prefix;
#[Prefix('confirm-password')]
#[Middleware('auth')]
class ConfirmablePasswordController extends Controller
{
#[Get('/', name: 'password.confirm')]
public function show(): Response
{
return Inertia::render('auth/confirm-password');
}
#[Post('/', name: 'password.confirm')]
public function store(Request $request): RedirectResponse
{
if (! Auth::guard('web')->validate([
'email' => $request->user()->email,
'password' => $request->password,
])) {
throw ValidationException::withMessages([
'password' => __('auth.password'),
]);
}
$request->session()->put('auth.password_confirmed_at', time());
return redirect()->intended(route('dashboard', absolute: false));
}
}

View File

@ -0,0 +1,69 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Password;
use Illuminate\Support\Str;
use Illuminate\Validation\Rules;
use Illuminate\Validation\ValidationException;
use Inertia\Inertia;
use Inertia\Response;
use Spatie\RouteAttributes\Attributes\Get;
use Spatie\RouteAttributes\Attributes\Middleware;
use Spatie\RouteAttributes\Attributes\Post;
use Spatie\RouteAttributes\Attributes\Prefix;
#[Prefix(('reset-password'))]
#[Middleware('guest')]
class NewPasswordController extends Controller
{
#[Get('{token}', name: 'password.reset')]
public function create(Request $request): Response
{
return Inertia::render('auth/reset-password', [
'email' => $request->email,
'token' => $request->route('token'),
]);
}
#[Post('/', name: 'password.store')]
public function store(Request $request): RedirectResponse
{
$request->validate([
'token' => 'required',
'email' => 'required|email',
'password' => ['required', 'confirmed', Rules\Password::defaults()],
]);
// Here we will attempt to reset the user's password. If it is successful we
// will update the password on an actual user model and persist it to the
// database. Otherwise we will parse the error and return the response.
$status = Password::reset(
$request->only('email', 'password', 'password_confirmation', 'token'),
function ($user) use ($request) {
$user->forceFill([
'password' => Hash::make($request->password),
'remember_token' => Str::random(60),
])->save();
event(new PasswordReset($user));
}
);
// If the password was successfully reset, we will redirect the user back to
// the application's home authenticated view. If there is an error we can
// redirect them back to where they came from with their error message.
if ($status == Password::PasswordReset) {
return to_route('login')->with('status', __($status));
}
throw ValidationException::withMessages([
'email' => [__($status)],
]);
}
}

View File

@ -0,0 +1,41 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Password;
use Inertia\Inertia;
use Inertia\Response;
use Spatie\RouteAttributes\Attributes\Get;
use Spatie\RouteAttributes\Attributes\Middleware;
use Spatie\RouteAttributes\Attributes\Post;
use Spatie\RouteAttributes\Attributes\Prefix;
#[Prefix('forgot-password')]
#[Middleware('guest')]
class PasswordResetLinkController extends Controller
{
#[Get('/', name: 'password.request')]
public function create(Request $request): Response
{
return Inertia::render('auth/forgot-password', [
'status' => $request->session()->get('status'),
]);
}
#[Post('/', name: 'password.email')]
public function store(Request $request): RedirectResponse
{
$request->validate([
'email' => 'required|email',
]);
Password::sendResetLink(
$request->only('email')
);
return back()->with('status', __('A reset link will be sent if the account exists.'));
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Spatie\RouteAttributes\Attributes\Get;
class HomeController extends Controller
{
#[Get('/', name: 'home')]
public function __invoke(): RedirectResponse
{
if (auth()->check()) {
return redirect()->route('servers');
}
return redirect()->route('login');
}
}

View File

@ -0,0 +1,90 @@
<?php
namespace App\Http\Controllers;
use App\Actions\Server\CreateServer;
use App\Http\Resources\ServerLogResource;
use App\Http\Resources\ServerProviderResource;
use App\Http\Resources\ServerResource;
use App\Models\Server;
use App\Models\ServerProvider;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Inertia\Response;
use Inertia\ResponseFactory;
use Spatie\RouteAttributes\Attributes\Delete;
use Spatie\RouteAttributes\Attributes\Get;
use Spatie\RouteAttributes\Attributes\Middleware;
use Spatie\RouteAttributes\Attributes\Post;
use Spatie\RouteAttributes\Attributes\Prefix;
#[Prefix('servers')]
#[Middleware(['auth', 'has-project'])]
class ServerController extends Controller
{
#[Get('/', name: 'servers')]
public function index(): Response|ResponseFactory
{
$project = user()->currentProject;
$this->authorize('viewAny', [Server::class, $project]);
$servers = $project->servers()->simplePaginate(config('web.pagination_size'));
return inertia('servers/index', [
'servers' => ServerResource::collection($servers),
'public_key' => __('servers.create.public_key_text', ['public_key' => get_public_key_content()]),
'server_providers' => ServerProviderResource::collection(ServerProvider::getByProjectId($project->id)->get()),
]);
}
#[Post('/', name: 'servers.store')]
public function store(Request $request): RedirectResponse
{
$project = user()->currentProject;
$this->authorize('create', [Server::class, $project]);
$server = app(CreateServer::class)->create(user(), $project, $request->all());
return redirect()->route('servers.show', ['server' => $server->id]);
}
#[Get('/{server}', name: 'servers.show')]
public function show(Server $server): Response|ResponseFactory
{
$this->authorize('view', $server);
return inertia('servers/show', [
'server' => ServerResource::make($server),
'logs' => ServerLogResource::collection($server->logs()->latest()->paginate(config('web.pagination_size'))),
]);
}
#[Post('/{server}/switch', name: 'servers.switch')]
public function switch(Server $server): RedirectResponse
{
$this->authorize('view', $server);
return redirect()->route('servers.show', ['server' => $server->id]);
}
#[Delete('/{server}', name: 'servers.destroy')]
public function destroy(Server $server, Request $request): RedirectResponse
{
$this->authorize('delete', $server);
$this->validate($request, [
'name' => [
'required',
Rule::in([$server->name]),
],
]);
$server->delete();
return redirect()->route('servers')
->with('success', __('Server deleted successfully.'));
}
}

View File

@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers;
use App\Models\Server;
use App\Models\ServerLog;
use Spatie\RouteAttributes\Attributes\Get;
use Spatie\RouteAttributes\Attributes\Middleware;
use Spatie\RouteAttributes\Attributes\Prefix;
#[Prefix('servers/{server}/logs')]
#[Middleware(['auth', 'has-project'])]
class ServerLogController extends Controller
{
#[Get('/{log}', name: 'logs.show')]
public function show(Server $server, ServerLog $log): string
{
$this->authorize('view', $log);
return $log->getContent();
}
}

View File

@ -0,0 +1,91 @@
<?php
namespace App\Http\Controllers\Settings;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rule;
use Illuminate\Validation\Rules\Password;
use Inertia\Inertia;
use Inertia\Response;
use Spatie\RouteAttributes\Attributes\Delete;
use Spatie\RouteAttributes\Attributes\Get;
use Spatie\RouteAttributes\Attributes\Middleware;
use Spatie\RouteAttributes\Attributes\Patch;
use Spatie\RouteAttributes\Attributes\Prefix;
use Spatie\RouteAttributes\Attributes\Put;
#[Prefix('settings/profile')]
#[Middleware(['auth'])]
class ProfileController extends Controller
{
#[Get('/', name: 'profile')]
public function edit(Request $request): Response
{
return Inertia::render('settings/profile/index', [
'mustVerifyEmail' => $request->user() instanceof MustVerifyEmail,
'status' => $request->session()->get('status'),
]);
}
#[Patch('/', name: 'profile.update')]
public function update(Request $request): RedirectResponse
{
$this->validate($request, [
'name' => ['required', 'string', 'max:255'],
'email' => [
'required',
'string',
'lowercase',
'email',
'max:255',
Rule::unique(User::class)->ignore(user()->id),
],
]);
$request->user()->fill($request->only('name', 'email'));
$request->user()->save();
return to_route('profile');
}
#[Put('/', name: 'profile.password')]
public function password(Request $request): RedirectResponse
{
$validated = $request->validate([
'current_password' => ['required', 'current_password'],
'password' => ['required', Password::defaults(), 'confirmed'],
]);
$request->user()->update([
'password' => Hash::make($validated['password']),
]);
return back();
}
#[Delete('/', name: 'profile.destroy')]
public function destroy(Request $request): RedirectResponse
{
$request->validate([
'password' => ['required', 'current_password'],
]);
$user = $request->user();
Auth::logout();
$user->delete();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace App\Http\Controllers\Settings;
use App\Http\Controllers\Controller;
use App\Models\Project;
use Illuminate\Http\RedirectResponse;
use Spatie\RouteAttributes\Attributes\Middleware;
use Spatie\RouteAttributes\Attributes\Post;
use Spatie\RouteAttributes\Attributes\Prefix;
#[Prefix('settings/projects')]
#[Middleware(['auth'])]
class ProjectController extends Controller
{
#[Post('switch/{project}', name: 'projects.switch')]
public function switch(Project $project): RedirectResponse
{
$this->authorize('view', $project);
user()->update([
'current_project_id' => $project->id,
]);
return redirect()->route('servers');
}
}

View File

@ -0,0 +1,57 @@
<?php
namespace App\Http\Controllers\Settings;
use App\Actions\ServerProvider\CreateServerProvider;
use App\Http\Controllers\Controller;
use App\Http\Resources\ServerProviderResource;
use App\Models\ServerProvider;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\ResourceCollection;
use Spatie\RouteAttributes\Attributes\Get;
use Spatie\RouteAttributes\Attributes\Middleware;
use Spatie\RouteAttributes\Attributes\Post;
use Spatie\RouteAttributes\Attributes\Prefix;
#[Prefix('settings/server-providers')]
#[Middleware(['auth'])]
class ServerProviderController extends Controller
{
public function index(): void {}
#[Get('/', name: 'server-providers.all')]
public function all(): ResourceCollection
{
$this->authorize('viewAny', ServerProvider::class);
return ServerProviderResource::collection(ServerProvider::getByProjectId(user()->current_project_id)->get());
}
#[Post('/', name: 'server-providers.store')]
public function store(Request $request): RedirectResponse
{
$this->authorize('create', ServerProvider::class);
app(CreateServerProvider::class)->create(user(), user()->currentProject, $request->all());
return back()->with('success', 'Server provider created.');
}
#[Get('/{serverProvider}/regions', name: 'server-providers.regions')]
public function regions(ServerProvider $serverProvider): JsonResponse
{
$this->authorize('view', $serverProvider);
return response()->json($serverProvider->provider()->regions());
}
#[Get('{serverProvider}/regions/{region}/plans', name: 'server-providers.plans')]
public function plans(ServerProvider $serverProvider, string $region): JsonResponse
{
$this->authorize('view', $serverProvider);
return response()->json($serverProvider->provider()->plans($region));
}
}

View File

@ -36,6 +36,9 @@ class Kernel extends HttpKernel
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\HandleInertiaRequests::class,
\App\Http\Middleware\HandleAppearance::class,
\Illuminate\Http\Middleware\AddLinkHeadersForPreloadedAssets::class,
],
'api' => [

View File

@ -9,10 +9,7 @@
class CanSeeProjectMiddleware
{
/**
* @return mixed
*/
public function handle(Request $request, Closure $next)
public function handle(Request $request, Closure $next): mixed
{
/** @var User $user */
$user = $request->user();

View File

@ -0,0 +1,23 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\View;
use Symfony\Component\HttpFoundation\Response;
class HandleAppearance
{
/**
* Handle an incoming request.
*
* @param Closure(Request): (Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
View::share('appearance', $request->cookie('appearance') ?? 'system');
return $next($request);
}
}

View File

@ -0,0 +1,73 @@
<?php
namespace App\Http\Middleware;
use App\Http\Resources\ServerResource;
use App\Models\Server;
use App\Models\User;
use Illuminate\Foundation\Inspiring;
use Illuminate\Http\Request;
use Inertia\Middleware;
use Tighten\Ziggy\Ziggy;
class HandleInertiaRequests extends Middleware
{
/**
* The root template that's loaded on the first page visit.
*
* @see https://inertiajs.com/server-side-setup#root-template
*
* @var string
*/
protected $rootView = 'app';
/**
* Determines the current asset version.
*
* @see https://inertiajs.com/asset-versioning
*/
public function version(Request $request): ?string
{
return parent::version($request);
}
/**
* Define the props that are shared by default.
*
* @see https://inertiajs.com/shared-data
*
* @return array<string, mixed>
*/
public function share(Request $request): array
{
[$message, $author] = str(Inspiring::quotes()->random())->explode('-');
/** @var ?User $user */
$user = $request->user();
// servers
$servers = [];
if ($user && $user->can('viewAny', [Server::class, $user->currentProject])) {
$servers = ServerResource::collection($user->currentProject?->servers);
}
return [
...parent::share($request),
'name' => config('app.name'),
'quote' => ['message' => trim($message), 'author' => trim($author)],
'auth' => [
'user' => $user,
'projects' => $user?->allProjects()->get(),
'currentProject' => $user?->currentProject,
],
'publicKeyText' => __('servers.create.public_key_text', ['public_key' => get_public_key_content()]),
'projectServers' => $servers,
'configs' => config('core'),
'ziggy' => fn (): array => [
...(new Ziggy)->toArray(),
'location' => $request->url(),
],
'sidebarOpen' => ! $request->hasCookie('sidebar_state') || $request->cookie('sidebar_state') === 'true',
];
}
}

View File

@ -2,16 +2,14 @@
namespace App\Http\Middleware;
use App\Models\Project;
use App\Models\User;
use Closure;
use Illuminate\Http\Request;
class HasProjectMiddleware
{
/**
* @return mixed
*/
public function handle(Request $request, Closure $next)
public function handle(Request $request, Closure $next): mixed
{
/** @var ?User $user */
$user = $request->user();
@ -21,7 +19,7 @@ public function handle(Request $request, Closure $next)
if (! $user->currentProject) {
if ($user->allProjects()->count() > 0) {
/** @var \App\Models\Project $firstProject */
/** @var Project $firstProject */
$firstProject = $user->allProjects()->first();
$user->current_project_id = $firstProject->id;
$user->save();

View File

@ -0,0 +1,31 @@
<?php
namespace App\Http\Resources;
use App\Models\ServerLog;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
/** @mixin ServerLog */
class ServerLogResource extends JsonResource
{
/**
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'server_id' => $this->server_id,
'site_id' => $this->site_id,
'type' => $this->type,
'name' => $this->name,
'disk' => $this->disk,
'is_remote' => $this->is_remote,
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
'created_at_by_timezone' => $this->created_at_by_timezone,
'updated_at_by_timezone' => $this->updated_at_by_timezone,
];
}
}

View File

@ -22,6 +22,8 @@ public function toArray(Request $request): array
'provider' => $this->provider,
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
'created_at_by_timezone' => $this->created_at_by_timezone,
'updated_at_by_timezone' => $this->updated_at_by_timezone,
];
}
}

View File

@ -38,8 +38,11 @@ public function toArray(Request $request): array
'progress_step' => $this->progress_step,
'updates' => $this->updates,
'last_update_check' => $this->last_update_check,
'status_color' => $this->getStatusColor(),
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
'created_at_by_timezone' => $this->created_at_by_timezone,
'updated_at_by_timezone' => $this->updated_at_by_timezone,
];
}
}

View File

@ -13,6 +13,7 @@
use App\SSH\Systemd\Systemd;
use App\Support\Testing\SSHFake;
use Carbon\Carbon;
use Database\Factories\ServerFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
@ -68,7 +69,7 @@
*/
class Server extends AbstractModel
{
/** @use HasFactory<\Database\Factories\ServerFactory> */
/** @use HasFactory<ServerFactory> */
use HasFactory;
protected $fillable = [
@ -570,4 +571,13 @@ public function download(string $path, string $disk = 'tmp'): void
$path
);
}
public function getStatusColor(): string
{
if (isset(self::$statusColors[$this->status])) {
return self::$statusColors[$this->status];
}
return 'gray';
}
}

View File

@ -5,8 +5,7 @@
use App\Enums\UserRole;
use App\Traits\HasTimezoneTimestamps;
use Carbon\Carbon;
use Filament\Models\Contracts\FilamentUser;
use Filament\Panel;
use Database\Factories\UserFactory;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
@ -43,11 +42,11 @@
* @property Carbon $created_at
* @property Carbon $updated_at
*/
class User extends Authenticatable implements FilamentUser
class User extends Authenticatable
{
use HasApiTokens;
/** @use HasFactory<\Database\Factories\UserFactory> */
/** @use HasFactory<UserFactory> */
use HasFactory;
use HasTimezoneTimestamps;
@ -70,8 +69,7 @@ class User extends Authenticatable implements FilamentUser
'two_factor_secret',
];
protected $appends = [
];
protected $appends = [];
/**
* @return HasMany<Server, covariant $this>
@ -204,9 +202,4 @@ public function allServers(): Builder
});
});
}
public function canAccessPanel(Panel $panel): bool
{
return true;
}
}

View File

@ -4,7 +4,6 @@
use App\Models\NotificationChannel;
use App\Notifications\NotificationInterface;
use App\Web\Pages\Settings\NotificationChannels\Index;
use Illuminate\Support\Facades\Http;
class Discord extends AbstractNotificationChannel
@ -39,7 +38,7 @@ public function connect(): bool
__('Congratulations! 🎉'),
__("You've connected your Discord to :app", ['app' => config('app.name')])."\n".
__('Manage your notification channels')."\n".
Index::getUrl()
'/settings/notification-channels',
);
if (! $connect) {

View File

@ -4,7 +4,6 @@
use App\Models\NotificationChannel;
use App\Notifications\NotificationInterface;
use App\Web\Pages\Settings\NotificationChannels\Index;
use Illuminate\Support\Facades\Http;
class Slack extends AbstractNotificationChannel
@ -39,7 +38,7 @@ public function connect(): bool
__('Congratulations! 🎉'),
__("You've connected your Slack to :app", ['app' => config('app.name')])."\n".
__('Manage your notification channels')."\n".
Index::getUrl()
'/settings/notification-channels',
);
if (! $connect) {

View File

@ -26,9 +26,9 @@ public function boot(): void
ResourceCollection::withoutWrapping();
// facades
$this->app->bind('ssh', fn (): \App\Helpers\SSH => new SSH);
$this->app->bind('notifier', fn (): \App\Helpers\Notifier => new Notifier);
$this->app->bind('ftp', fn (): \App\Helpers\FTP => new FTP);
$this->app->bind('ssh', fn (): SSH => new SSH);
$this->app->bind('notifier', fn (): Notifier => new Notifier);
$this->app->bind('ftp', fn (): FTP => new FTP);
Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class);
}

View File

@ -1,123 +0,0 @@
<?php
namespace App\Providers;
use App\Http\Middleware\HasProjectMiddleware;
use App\Web\Pages\Login;
use App\Web\Pages\Settings\Profile;
use App\Web\Pages\Settings\Projects\Widgets\SelectProject;
use Exception;
use Filament\Facades\Filament;
use Filament\Http\Middleware\Authenticate;
use Filament\Http\Middleware\DisableBladeIconComponents;
use Filament\Http\Middleware\DispatchServingFilamentEvent;
use Filament\Navigation\MenuItem;
use Filament\Panel;
use Filament\Support\Assets\Js;
use Filament\Support\Colors\Color;
use Filament\Support\Enums\MaxWidth;
use Filament\Support\Facades\FilamentAsset;
use Filament\Support\Facades\FilamentColor;
use Filament\Support\Facades\FilamentView;
use Filament\View\PanelsRenderHook;
use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
use Illuminate\Cookie\Middleware\EncryptCookies;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
use Illuminate\Routing\Middleware\SubstituteBindings;
use Illuminate\Session\Middleware\AuthenticateSession;
use Illuminate\Session\Middleware\StartSession;
use Illuminate\Support\Facades\Vite;
use Illuminate\Support\ServiceProvider;
use Illuminate\View\Middleware\ShareErrorsFromSession;
use Livewire\Livewire;
class WebServiceProvider extends ServiceProvider
{
/**
* @throws Exception
*/
public function register(): void
{
Filament::registerPanel($this->panel(Panel::make()));
}
public function boot(): void
{
FilamentView::registerRenderHook(
PanelsRenderHook::SIDEBAR_NAV_START,
fn () => Livewire::mount(SelectProject::class)
);
FilamentView::registerRenderHook(
PanelsRenderHook::SIDEBAR_FOOTER,
fn () => view('components.app-version')
);
FilamentAsset::register([
Js::make('app', Vite::asset('resources/js/app.js'))->module(),
]);
FilamentColor::register([
'slate' => Color::Slate,
'gray' => Color::Zinc,
'red' => Color::Red,
'orange' => Color::Orange,
'amber' => Color::Amber,
'yellow' => Color::Yellow,
'lime' => Color::Lime,
'green' => Color::Green,
'emerald' => Color::Emerald,
'teal' => Color::Teal,
'cyan' => Color::Cyan,
'sky' => Color::Sky,
'blue' => Color::Blue,
'indigo' => Color::Indigo,
'violet' => Color::Violet,
'purple' => Color::Purple,
'fuchsia' => Color::Fuchsia,
'pink' => Color::Pink,
'rose' => Color::Rose,
]);
}
/**
* @throws Exception
*/
public function panel(Panel $panel): Panel
{
return $panel
->default()
->id('app')
->path('')
->passwordReset()
->colors([
'primary' => Color::Indigo,
])
->maxContentWidth(MaxWidth::ScreenTwoExtraLarge)
->viteTheme('resources/css/filament/app/theme.css')
->brandLogo(fn () => view('components.brand'))
->brandLogoHeight('30px')
->discoverPages(in: app_path('Web/Pages'), for: 'App\\Web\\Pages')
->middleware([
EncryptCookies::class,
AddQueuedCookiesToResponse::class,
StartSession::class,
AuthenticateSession::class,
ShareErrorsFromSession::class,
VerifyCsrfToken::class,
SubstituteBindings::class,
DisableBladeIconComponents::class,
DispatchServingFilamentEvent::class,
])
->authMiddleware([
Authenticate::class,
HasProjectMiddleware::class,
])
->userMenuItems([
'profile' => MenuItem::make()
->url(fn (): string => Profile\Index::getUrl()),
])
->login(Login::class)
->spa()
->globalSearchKeyBindings(['command+k', 'ctrl+k'])
->sidebarCollapsibleOnDesktop()
->globalSearchFieldKeyBindingSuffix();
}
}

View File

@ -1,12 +1,9 @@
<?php
use App\Exceptions\SSHError;
use Filament\Notifications\Actions\Action;
use Filament\Notifications\Notification;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Route;
use Illuminate\Validation\ValidationException;
function generate_public_key(string $privateKeyPath, string $publicKeyPath): void
{
@ -57,6 +54,10 @@ function convert_time_format(string $string): string
function get_public_key_content(): string
{
if (cache()->has('ssh_public_key_content')) {
return cache()->get('ssh_public_key_content');
}
if (! file_exists(storage_path(config('core.ssh_public_key_name')))) {
Artisan::call('ssh-key:generate --force');
}
@ -67,46 +68,13 @@ function get_public_key_content(): string
return '';
}
return str($content)
$content = str($content)
->replace("\n", '')
->toString();
}
function run_action(object $static, Closure $callback): void
{
try {
$callback();
} catch (SSHError $e) {
$actions = [];
if ($e->getLog() instanceof \App\Models\ServerLog) {
$actions[] = Action::make('View Logs')
->url(App\Web\Pages\Servers\Logs\Index::getUrl([
'server' => $e->getLog()->server_id,
]))
->openUrlInNewTab();
}
Notification::make()
->danger()
->title($e->getMessage())
->body($e->getLog()?->getContent(30))
->actions($actions)
->send();
cache()->put('ssh_public_key_content', $content, 60 * 60 * 24);
if (method_exists($static, 'halt')) {
$reflectionMethod = new ReflectionMethod($static, 'halt');
$reflectionMethod->invoke($static);
}
} catch (ValidationException $e) {
Notification::make()
->danger()
->title($e->getMessage())
->send();
if (method_exists($static, 'halt')) {
$reflectionMethod = new ReflectionMethod($static, 'halt');
$reflectionMethod->invoke($static);
}
}
return $content;
}
/**
@ -251,3 +219,11 @@ function format_nginx_config(string $config): string
return implode("\n", $formattedLines)."\n";
}
function user(): User
{
/** @var User $user */
$user = auth()->user();
return $user;
}

View File

@ -1,26 +0,0 @@
<?php
namespace App\Web\Components;
use Illuminate\Contracts\Support\Htmlable;
use Illuminate\Contracts\View\View;
use Illuminate\View\Component;
class Link extends Component implements Htmlable
{
public function __construct(public string $href, public string $text, public bool $external = false) {}
public function render(): View
{
return view('components.link');
}
public function toHtml(): View|string
{
return $this->render()->with([
'href' => $this->href,
'text' => $this->text,
'external' => $this->external,
]);
}
}

View File

@ -1,59 +0,0 @@
<?php
namespace App\Web\Components;
use App\Models\User;
use Filament\Pages\Page as BasePage;
use Illuminate\View\ComponentAttributeBag;
abstract class Page extends BasePage
{
protected static string $view = 'components.page';
protected ?string $live = '5s';
/**
* @var array<string, mixed>
*/
protected array $extraAttributes = [];
/**
* @return array<string, mixed>
*/
protected function getExtraAttributes(): array
{
$attributes = $this->extraAttributes;
if (! in_array($this->getLive(), [null, '', '0'], true)) {
$attributes['wire:poll.'.$this->getLive()] = '$dispatch(\'$refresh\')';
}
return $attributes;
}
public function getExtraAttributesBag(): ComponentAttributeBag
{
return new ComponentAttributeBag($this->getExtraAttributes());
}
public function getLive(): ?string
{
return $this->live;
}
/**
* @return array<int, mixed>
*/
public function getWidgets(): array
{
return [];
}
protected function getUser(): User
{
/** @var User $user */
$user = auth()->user();
return $user;
}
}

View File

@ -1,11 +0,0 @@
<?php
namespace App\Web\Contracts;
interface HasSecondSubNav
{
/**
* @return array<mixed>
*/
public function getSecondSubNavigation(): array;
}

View File

@ -1,72 +0,0 @@
<?php
namespace App\Web\Fields;
use Filament\Forms\Components\Field;
class AlertField extends Field
{
protected string $view = 'fields.alert';
public string $color = 'blue';
public string $icon = 'heroicon-o-information-circle';
public string $message = '';
public function color(string $color): static
{
$this->color = $color;
return $this;
}
public function icon(string $icon): static
{
$this->icon = $icon;
return $this;
}
public function message(string $message): static
{
$this->message = $message;
return $this;
}
public function success(): static
{
return $this->color('green')->icon('heroicon-o-check-circle');
}
public function warning(): static
{
return $this->color('yellow')->icon('heroicon-o-exclamation-circle');
}
public function danger(): static
{
return $this->color('red')->icon('heroicon-o-x-circle');
}
public function info(): static
{
return $this->color('blue')->icon('heroicon-o-information-circle');
}
public function getColor(): string
{
return $this->color;
}
public function getIcon(): string
{
return $this->icon;
}
public function getMessage(): string
{
return $this->message;
}
}

View File

@ -1,27 +0,0 @@
<?php
namespace App\Web\Fields;
use Filament\Forms\Components\Field;
class CodeEditorField extends Field
{
protected string $view = 'fields.code-editor';
public string $lang = '';
public bool $readonly = false;
/**
* @return array<string, mixed>
*/
public function getOptions(): array
{
return [
'id' => $this->getId(),
'name' => $this->getName(),
'lang' => $this->lang,
'value' => json_encode($this->getState() ?? ''),
];
}
}

View File

@ -1,10 +0,0 @@
<?php
namespace App\Web\Fields;
use Filament\Forms\Components\Field;
class ProviderField extends Field
{
protected string $view = 'fields.provider';
}

View File

@ -1,156 +0,0 @@
<?php
namespace App\Web\Pages;
use App\Models\User;
use Filament\Actions\Action;
use Filament\Facades\Filament;
use Filament\Forms\Components\TextInput;
use Filament\Http\Responses\Auth\Contracts\LoginResponse;
use Filament\Support\Facades\FilamentView;
use Filament\View\PanelsRenderHook;
use Illuminate\Support\Facades\Blade;
use Illuminate\Validation\ValidationException;
use Laravel\Fortify\Http\Requests\TwoFactorLoginRequest;
class Login extends \Filament\Pages\Auth\Login
{
public function mount(): void
{
if (Filament::auth()->check()) {
redirect()->intended(Filament::getUrl());
}
$this->initTwoFactor();
$this->form->fill();
if (config('app.demo')) {
$this->form->fill([
'email' => 'demo@vitodeploy.com',
'password' => 'password',
]);
}
}
public function logoutAction(): Action
{
return Action::make('logout')
->label('Logout')
->color('danger')
->link()
->action(function (): void {
Filament::auth()->logout();
session()->forget('login.id');
$this->redirect(Filament::getLoginUrl());
});
}
protected function getForms(): array
{
if (request()->session()->has('login.id')) {
return [
'form' => $this->form(
$this->makeForm()
->schema([
TextInput::make('code')
->label('2FA Code')
->autofocus(),
TextInput::make('recovery_code')
->label('Recovery Code')
->autofocus(),
])
->statePath('data'),
),
];
}
return parent::getForms();
}
public function authenticate(): ?LoginResponse
{
if (request()->session()->has('login.id')) {
return $this->confirmTwoFactor();
}
$loginResponse = parent::authenticate();
/** @var ?User $user */
$user = Filament::auth()->getUser();
if ($user && $user->two_factor_secret) {
Filament::auth()->logout();
request()->session()->put([
'login.id' => $user->getKey(),
'login.remember' => $this->data['remember'] ?? false,
]);
$this->redirect(Filament::getLoginUrl());
return null;
}
return $loginResponse;
}
private function confirmTwoFactor(): LoginResponse
{
$request = TwoFactorLoginRequest::createFrom(request())->merge([
'code' => $this->data['code'] ?? null,
'recovery_code' => $this->data['recovery_code'] ?? null,
]);
/** @var ?User $user */
$user = $request->challengedUser();
if (! $user) {
$this->redirect(Filament::getLoginUrl());
return app(LoginResponse::class);
}
if ($code = $request->validRecoveryCode()) {
$user->replaceRecoveryCode($code);
} elseif (! $request->hasValidCode()) {
$field = $request->input('recovery_code') ? 'recovery_code' : 'code';
$this->initTwoFactor();
throw ValidationException::withMessages([
'data.'.$field => 'Invalid code!',
]);
}
Filament::auth()->login($user, $request->remember());
return app(LoginResponse::class);
}
protected function getAuthenticateFormAction(): Action
{
if (request()->session()->has('login.id')) {
return Action::make('verify')
->label('Verify')
->submit('authenticate');
}
return parent::getAuthenticateFormAction();
}
private function initTwoFactor(): void
{
if (request()->session()->has('login.id')) {
FilamentView::registerRenderHook(
PanelsRenderHook::AUTH_LOGIN_FORM_BEFORE,
fn (): string => Blade::render(
<<<BLADE
<x-slot name="subheading">{$this->logoutAction()->render()->render()}</x-slot>
BLADE
),
);
}
}
}

View File

@ -1,83 +0,0 @@
<?php
namespace App\Web\Pages\Scripts;
use App\Actions\Script\ExecuteScript;
use App\Models\Script;
use App\Models\Server;
use App\Web\Components\Page;
use Filament\Actions\Action;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Get;
use Filament\Support\Enums\MaxWidth;
use Illuminate\Contracts\Support\Htmlable;
class Executions extends Page
{
protected static bool $shouldRegisterNavigation = false;
protected static ?string $slug = 'scripts/{script}/executions';
public Script $script;
public function getTitle(): string|Htmlable
{
return $this->script->name.' - Executions';
}
public function mount(): void
{
$this->authorize('view', $this->script);
}
public function getWidgets(): array
{
return [
[Widgets\ScriptExecutionsList::class, ['script' => $this->script]],
];
}
protected function getHeaderActions(): array
{
$form = [
Select::make('server')
->options(fn () => auth()->user()?->currentProject?->servers?->pluck('name', 'id') ?? [])
->rules(fn (Get $get) => ExecuteScript::rules($get())['server'])
->searchable()
->reactive(),
Select::make('user')
->rules(fn (Get $get) => ExecuteScript::rules($get())['user'])
->native(false)
->options(function (Get $get): array {
$users = ['root'];
/** @var ?Server $server */
$server = Server::query()->find($get('server'));
if ($server) {
$users = $server->getSshUsers();
}
return array_combine($users, $users);
}),
];
foreach ($this->script->getVariables() as $variable) {
$form[] = TextInput::make('variables.'.$variable)
->label($variable)
->rules(fn (Get $get) => ExecuteScript::rules($get())['variables.*']);
}
return [
Action::make('execute')
->icon('heroicon-o-bolt')
->modalWidth(MaxWidth::Large)
->form($form)
->action(function (array $data): void {
app(ExecuteScript::class)->execute($this->script, $data);
$this->dispatch('$refresh');
}),
];
}
}

View File

@ -1,78 +0,0 @@
<?php
namespace App\Web\Pages\Scripts;
use App\Actions\Script\CreateScript;
use App\Models\Script;
use App\Models\User;
use App\Web\Components\Page;
use App\Web\Fields\CodeEditorField;
use Filament\Actions\Action;
use Filament\Forms\Components\Checkbox;
use Filament\Forms\Components\TextInput;
use Filament\Support\Enums\MaxWidth;
class Index extends Page
{
protected static ?string $slug = 'scripts';
protected static ?string $navigationIcon = 'heroicon-o-bolt';
protected static ?int $navigationSort = 2;
protected static ?string $title = 'Scripts';
public static function getNavigationItemActiveRoutePattern(): string
{
return static::getRouteName().'*';
}
public static function canAccess(): bool
{
return auth()->user()?->can('viewAny', Script::class) ?? false;
}
public function getWidgets(): array
{
return [
[Widgets\ScriptsList::class],
];
}
protected function getHeaderActions(): array
{
/** @var User $user */
$user = auth()->user();
return [
Action::make('read-the-docs')
->label('Read the Docs')
->icon('heroicon-o-document-text')
->color('gray')
->url('https://vitodeploy.com/scripts')
->openUrlInNewTab(),
Action::make('create')
->label('Create a Script')
->icon('heroicon-o-plus')
->authorize('create', Script::class)
->modalWidth(MaxWidth::ThreeExtraLarge)
->form([
TextInput::make('name')
->rules(CreateScript::rules()['name']),
CodeEditorField::make('content')
->rules(CreateScript::rules()['content'])
->helperText('You can use variables like ${VARIABLE_NAME} in the script. The variables will be asked when executing the script'),
Checkbox::make('global')
->label('Is Global (Accessible in all projects)'),
])
->modalSubmitActionLabel('Create')
->action(function (array $data) use ($user): void {
run_action($this, function () use ($data, $user): void {
app(CreateScript::class)->create($user, $data);
$this->dispatch('$refresh');
});
}),
];
}
}

View File

@ -1,87 +0,0 @@
<?php
namespace App\Web\Pages\Scripts\Widgets;
use App\Models\Script;
use App\Models\ScriptExecution;
use App\Web\Pages\Servers\View;
use Filament\Tables\Actions\Action;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Filament\Widgets\TableWidget as Widget;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\View\ComponentAttributeBag;
class ScriptExecutionsList extends Widget
{
/**
* @var array<string>
*/
protected $listeners = ['$refresh'];
public Script $script;
/**
* @return Builder<ScriptExecution>
*/
protected function getTableQuery(): Builder
{
return ScriptExecution::query()->where('script_id', $this->script->id);
}
/**
* @param Builder<ScriptExecution> $query
* @return Builder<ScriptExecution>
*/
protected function applyDefaultSortingToTableQuery(Builder $query): Builder
{
return $query->latest('created_at');
}
protected function getTableColumns(): array
{
return [
TextColumn::make('server')
->formatStateUsing(fn (ScriptExecution $record) => $record->getServer()->name ?? 'Unknown')
->url(function (ScriptExecution $record): ?string {
$server = $record->getServer();
return $server instanceof \App\Models\Server ? View::getUrl(['server' => $server]) : null;
})
->searchable()
->sortable(),
TextColumn::make('created_at')
->label('Executed At')
->formatStateUsing(fn (ScriptExecution $record) => $record->created_at_by_timezone)
->searchable()
->sortable(),
TextColumn::make('status')
->label('Status')
->badge()
->color(fn (ScriptExecution $record) => ScriptExecution::$statusColors[$record->status])
->sortable(),
];
}
public function table(Table $table): Table
{
return $table
->heading(null)
->query($this->getTableQuery())
->columns($this->getTableColumns())
->actions([
Action::make('logs')
->hiddenLabel()
->tooltip('Logs')
->icon('heroicon-o-eye')
->authorize(fn (ScriptExecution $record) => auth()->user()?->can('view', $record->serverLog))
->modalHeading('View Log')
->modalContent(fn (ScriptExecution $record) => view('components.console-view', [
'slot' => $record->serverLog?->getContent(),
'attributes' => new ComponentAttributeBag,
]))
->modalSubmitAction(false)
->modalCancelActionLabel('Close'),
]);
}
}

View File

@ -1,100 +0,0 @@
<?php
namespace App\Web\Pages\Scripts\Widgets;
use App\Actions\Script\EditScript;
use App\Models\Script;
use App\Models\User;
use App\Web\Fields\CodeEditorField;
use App\Web\Pages\Scripts\Executions;
use Filament\Forms\Components\Checkbox;
use Filament\Forms\Components\TextInput;
use Filament\Support\Enums\MaxWidth;
use Filament\Tables\Actions\DeleteAction;
use Filament\Tables\Actions\EditAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Filament\Widgets\TableWidget as Widget;
use Illuminate\Database\Eloquent\Builder;
class ScriptsList extends Widget
{
/**
* @var array<string>
*/
protected $listeners = ['$refresh'];
/**
* @return Builder<Script>
*/
protected function getTableQuery(): Builder
{
/** @var User $user */
$user = auth()->user();
return Script::getByProjectId($user->current_project_id, $user->id);
}
protected function getTableColumns(): array
{
return [
TextColumn::make('name')
->searchable()
->sortable(),
TextColumn::make('id')
->label('Global')
->badge()
->color(fn ($record): string => $record->project_id ? 'gray' : 'success')
->formatStateUsing(fn (Script $record): string => $record->project_id ? 'No' : 'Yes'),
TextColumn::make('created_at')
->label('Created At')
->formatStateUsing(fn (Script $record) => $record->created_at_by_timezone)
->searchable()
->sortable(),
];
}
public function table(Table $table): Table
{
/** @var User $user */
$user = auth()->user();
return $table
->heading(null)
->query($this->getTableQuery())
->columns($this->getTableColumns())
->recordUrl(fn (Script $record): string => Executions::getUrl(['script' => $record]))
->actions([
EditAction::make('edit')
->label('Edit')
->modalHeading('Edit Script')
->mutateRecordDataUsing(fn (array $data, Script $record): array => [
'name' => $record->name,
'content' => $record->content,
'global' => $record->project_id === null,
])
->form([
TextInput::make('name')
->rules(EditScript::rules()['name']),
CodeEditorField::make('content')
->rules(EditScript::rules()['content'])
->helperText('You can use variables like ${VARIABLE_NAME} in the script. The variables will be asked when executing the script'),
Checkbox::make('global')
->label('Is Global (Accessible in all projects)'),
])
->authorize(fn (Script $record) => $user->can('update', $record))
->using(function (array $data, Script $record) use ($user): void {
app(EditScript::class)->edit($record, $user, $data);
$this->dispatch('$refresh');
})
->modalWidth(MaxWidth::ThreeExtraLarge),
DeleteAction::make('delete')
->label('Delete')
->modalHeading('Delete Script')
->authorize(fn (Script $record) => $user->can('delete', $record))
->using(function (array $data, Script $record): void {
$record->delete();
}),
]);
}
}

View File

@ -1,46 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Console;
use App\Web\Pages\Servers\Page;
use Filament\Actions\Action;
class Index extends Page
{
protected ?string $live = '';
/**
* @var array<string>
*/
protected $listeners = [];
protected static ?string $slug = 'servers/{server}/console';
protected static ?string $title = 'Headless Console';
protected static ?string $navigationLabel = 'Console';
public function mount(): void
{
$this->authorize('manage', $this->server);
}
public function getWidgets(): array
{
return [
[Widgets\Console::class, ['server' => $this->server]],
];
}
protected function getHeaderActions(): array
{
return [
Action::make('read-the-docs')
->label('Read the Docs')
->icon('heroicon-o-document-text')
->color('gray')
->url('https://vitodeploy.com/servers/console.html')
->openUrlInNewTab(),
];
}
}

View File

@ -1,19 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Console\Widgets;
use App\Models\Server;
use Illuminate\Contracts\View\View;
use Livewire\Component;
class Console extends Component
{
public Server $server;
public function render(): View
{
return view('components.console', [
'server' => $this->server,
]);
}
}

View File

@ -1,31 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Console\Widgets;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Illuminate\Support\Facades\Cache;
use Livewire\Component;
class StopCommand extends Component implements HasForms
{
use InteractsWithForms;
public function stop(): void
{
Cache::put('console', 0);
}
public function render(): string
{
return <<<'BLADE'
<div>
<x-filament::icon
icon="heroicon-o-stop"
wire:click="stop"
class="h-5 w-5 text-danger-400 cursor-pointer"
/>
</div>
BLADE;
}
}

View File

@ -1,87 +0,0 @@
<?php
namespace App\Web\Pages\Servers\CronJobs;
use App\Actions\CronJob\CreateCronJob;
use App\Models\CronJob;
use App\Web\Pages\Servers\Page;
use Filament\Actions\Action;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Filament\Support\Enums\MaxWidth;
class Index extends Page
{
protected static ?string $slug = 'servers/{server}/cronjobs';
protected static ?string $title = 'Cron Jobs';
/**
* @var array<string>
*/
protected $listeners = ['$refresh'];
public function mount(): void
{
$this->authorize('viewAny', [CronJob::class, $this->server]);
}
public function getWidgets(): array
{
return [
[Widgets\CronJobsList::class, ['server' => $this->server]],
];
}
protected function getHeaderActions(): array
{
$users = $this->server->getSshUsers();
return [
Action::make('read-the-docs')
->label('Read the Docs')
->icon('heroicon-o-document-text')
->color('gray')
->url('https://vitodeploy.com/servers/cronjobs')
->openUrlInNewTab(),
Action::make('create')
->authorize(fn () => auth()->user()?->can('create', [CronJob::class, $this->server]))
->icon('heroicon-o-plus')
->modalWidth(MaxWidth::ExtraLarge)
->form([
TextInput::make('command')
->rules(fn (callable $get) => CreateCronJob::rules($get(), $this->server)['command'])
->helperText(fn () => view('components.link', [
'href' => 'https://vitodeploy.com/servers/cronjobs',
'external' => true,
'text' => 'How the command should look like?',
])),
Select::make('user')
->rules(fn (callable $get) => CreateCronJob::rules($get(), $this->server)['user'])
->options(array_combine($users, $users)),
Select::make('frequency')
->options(config('core.cronjob_intervals'))
->reactive()
->rules(fn (callable $get) => CreateCronJob::rules($get(), $this->server)['frequency']),
TextInput::make('custom')
->label('Custom Frequency (Cron)')
->rules(fn (callable $get) => CreateCronJob::rules($get(), $this->server)['custom'])
->visible(fn (callable $get): bool => $get('frequency') === 'custom')
->placeholder('0 * * * *'),
])
->action(function (array $data): void {
run_action($this, function () use ($data): void {
app(CreateCronJob::class)->create($this->server, $data);
$this->dispatch('$refresh');
Notification::make()
->success()
->title('Cron Job created!')
->send();
});
}),
];
}
}

View File

@ -1,116 +0,0 @@
<?php
namespace App\Web\Pages\Servers\CronJobs\Widgets;
use App\Actions\CronJob\DeleteCronJob;
use App\Actions\CronJob\DisableCronJob;
use App\Actions\CronJob\EnableCronJob;
use App\Models\CronJob;
use App\Models\Server;
use App\Models\User;
use Exception;
use Filament\Notifications\Notification;
use Filament\Tables\Actions\Action;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Filament\Widgets\TableWidget as Widget;
use Illuminate\Database\Eloquent\Builder;
class CronJobsList extends Widget
{
public Server $server;
/**
* @var array<string>
*/
protected $listeners = ['$refresh'];
/**
* @return Builder<CronJob>
*/
protected function getTableQuery(): Builder
{
return CronJob::query()->where('server_id', $this->server->id);
}
protected function getTableColumns(): array
{
return [
TextColumn::make('command')
->limit(40)
->tooltip(fn (CronJob $cronJob) => $cronJob->command)
->searchable()
->copyable(),
TextColumn::make('frequency')
->formatStateUsing(fn (CronJob $cronJob): string => $cronJob->frequencyLabel())
->searchable()
->sortable()
->copyable(),
TextColumn::make('status')
->label('Status')
->badge()
->color(fn (CronJob $record) => CronJob::$statusColors[$record->status])
->searchable()
->sortable(),
TextColumn::make('created_at')
->formatStateUsing(fn (CronJob $cronJob) => $cronJob->created_at_by_timezone)
->sortable(),
];
}
public function table(Table $table): Table
{
/** @var User $user */
$user = auth()->user();
return $table
->heading(null)
->query($this->getTableQuery())
->columns($this->getTableColumns())
->actions([
Action::make('enable')
->hiddenLabel()
->tooltip('Enable')
->icon('heroicon-o-play')
->requiresConfirmation()
->authorize(fn (CronJob $record) => $user->can('update', [$record, $this->server]))
->visible(fn (CronJob $record): bool => $record->isDisabled())
->action(function (CronJob $record): void {
run_action($this, function () use ($record): void {
app(EnableCronJob::class)->enable($this->server, $record);
});
}),
Action::make('disable')
->hiddenLabel()
->tooltip('Disable')
->icon('heroicon-o-stop')
->requiresConfirmation()
->authorize(fn (CronJob $record) => $user->can('update', [$record, $this->server]))
->visible(fn (CronJob $record): bool => $record->isEnabled())
->action(function (CronJob $record): void {
run_action($this, function () use ($record): void {
app(DisableCronJob::class)->disable($this->server, $record);
});
}),
Action::make('delete')
->icon('heroicon-o-trash')
->tooltip('Delete')
->color('danger')
->hiddenLabel()
->requiresConfirmation()
->authorize(fn (CronJob $record) => $user->can('delete', $record))
->action(function (CronJob $record): void {
try {
app(DeleteCronJob::class)->delete($this->server, $record);
} catch (Exception $e) {
Notification::make()
->danger()
->title($e->getMessage())
->send();
}
$this->dispatch('$refresh');
}),
]);
}
}

View File

@ -1,99 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Databases;
use App\Actions\Database\ManageBackup;
use App\Models\Backup;
use App\Models\StorageProvider;
use App\Models\User;
use App\Web\Contracts\HasSecondSubNav;
use App\Web\Pages\Servers\Page;
use App\Web\Pages\Settings\StorageProviders\Actions\Create;
use Filament\Actions\Action;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Filament\Support\Enums\MaxWidth;
class Backups extends Page implements HasSecondSubNav
{
use Traits\Navigation;
protected static ?string $slug = 'servers/{server}/databases/backups';
protected static ?string $title = 'Backups';
public function mount(): void
{
$this->authorize('viewAny', [Backup::class, $this->server]);
}
protected function getHeaderActions(): array
{
/** @var User $user */
$user = auth()->user();
return [
Action::make('create')
->icon('heroicon-o-plus')
->modalWidth(MaxWidth::Large)
->authorize(fn () => $user->can('create', [Backup::class, $this->server]))
->form([
Select::make('database')
->label('Database')
->options($this->server->databases()->pluck('name', 'id')->toArray())
->rules(fn (callable $get) => ManageBackup::rules($this->server, $get())['database'])
->searchable(),
Select::make('storage')
->label('Storage')
->options(StorageProvider::getByProjectId($this->server->project_id)->pluck('profile', 'id')->toArray())
->rules(fn (callable $get) => ManageBackup::rules($this->server, $get())['storage'])
->suffixAction(
\Filament\Forms\Components\Actions\Action::make('connect')
->form(Create::form())
->modalHeading('Connect to a new storage provider')
->modalSubmitActionLabel('Connect')
->icon('heroicon-o-wifi')
->tooltip('Connect to a new storage provider')
->modalWidth(MaxWidth::Medium)
->authorize(fn () => $user->can('create', StorageProvider::class))
->action(fn (array $data) => Create::action($data))
),
Select::make('interval')
->label('Interval')
->options(config('core.cronjob_intervals'))
->reactive()
->rules(fn (callable $get) => ManageBackup::rules($this->server, $get())['interval']),
TextInput::make('custom_interval')
->label('Custom Interval (Cron)')
->rules(fn (callable $get) => ManageBackup::rules($this->server, $get())['custom_interval'])
->visible(fn (callable $get): bool => $get('interval') === 'custom')
->placeholder('0 * * * *'),
TextInput::make('keep')
->label('Backups to Keep')
->rules(fn (callable $get) => ManageBackup::rules($this->server, $get())['keep'])
->helperText('How many backups to keep before deleting the oldest one'),
])
->modalSubmitActionLabel('Create')
->action(function (array $data): void {
run_action($this, function () use ($data): void {
app(ManageBackup::class)->create($this->server, $data);
$this->dispatch('$refresh');
Notification::make()
->success()
->title('Backup created!')
->send();
});
}),
];
}
public function getWidgets(): array
{
return [
[Widgets\BackupsList::class, ['server' => $this->server]],
];
}
}

View File

@ -1,163 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Databases;
use App\Actions\Database\CreateDatabase;
use App\Actions\Database\SyncDatabases;
use App\Models\Database;
use App\Models\Server;
use App\Web\Contracts\HasSecondSubNav;
use App\Web\Pages\Servers\Page;
use Filament\Actions\Action;
use Filament\Forms\Components\Checkbox;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Get;
use Filament\Forms\Set;
use Filament\Notifications\Notification;
use Filament\Support\Enums\MaxWidth;
class Index extends Page implements HasSecondSubNav
{
use Traits\Navigation;
protected static ?string $slug = 'servers/{server}/databases';
protected static ?string $title = 'Databases';
public function mount(): void
{
$this->authorize('viewAny', [Database::class, $this->server]);
}
public static function getCharsetInput(Server $server): Select
{
return Select::make('charset')
->label('Charset / Encoding')
->native(false)
->live()
->default(function () use ($server) {
$service = $server->defaultService('database');
return $service->type_data['defaultCharset'] ?? null;
})
->options(function () use ($server): array {
$service = $server->defaultService('database');
$charsets = $service->type_data['charsets'] ?? [];
return array_combine(
array_keys($charsets),
array_keys($charsets)
);
})
->afterStateUpdated(function (Get $get, Set $set, $state) use ($server): void {
$service = $server->defaultService('database');
$charsets = $service->type_data['charsets'] ?? [];
$set('collation', $charsets[$state]['default'] ?? null);
})
->rules(fn (callable $get) => CreateDatabase::rules($server, $get())['charset']);
}
public static function getCollationInput(Server $server): Select
{
return Select::make('collation')
->label('Collation')
->native(false)
->live()
->default(function (Get $get) use ($server) {
$service = $server->defaultService('database');
$charsets = $service->type_data['charsets'] ?? [];
$charset = $get('charset') ?? $service->type_data['default'] ?? 'utf8mb4';
return $charsets[$charset]['default'] ?? null;
})
->options(function (Get $get) use ($server): array {
$service = $server->defaultService('database');
$collations = $service->type_data['charsets'][$get('charset')]['list'] ?? [];
return array_combine(
array_values($collations),
array_values($collations)
);
})
->rules(fn (callable $get) => CreateDatabase::rules($server, $get())['collation']);
}
protected function getHeaderActions(): array
{
return [
Action::make('sync')
->color('gray')
->label('Sync Databases')
->icon('heroicon-o-arrow-path')
->authorize(fn () => auth()->user()?->can('create', [Database::class, $this->server]))
->requiresConfirmation()
->modalDescription('This will create databases that exist on the server but not in Vito.')
->modalSubmitActionLabel('Sync')
->action(function (): void {
run_action($this, function (): void {
app(SyncDatabases::class)->sync($this->server);
$this->dispatch('$refresh');
Notification::make()
->success()
->title('Databases synced!')
->send();
});
}),
Action::make('create')
->label('Create Database')
->icon('heroicon-o-plus')
->modalWidth(MaxWidth::Large)
->authorize(fn () => auth()->user()?->can('create', [Database::class, $this->server]))
->form([
TextInput::make('name')
->rules(fn (callable $get) => CreateDatabase::rules($this->server, $get())['name']),
self::getCharsetInput($this->server),
self::getCollationInput($this->server),
Checkbox::make('user')
->label('Create User')
->default(false)
->reactive(),
TextInput::make('username')
->label('Username')
->rules(fn (callable $get) => CreateDatabase::rules($this->server, $get())['username'])
->hidden(fn (callable $get): bool => $get('user') !== true),
TextInput::make('password')
->label('Password')
->rules(fn (callable $get) => CreateDatabase::rules($this->server, $get())['password'])
->hidden(fn (callable $get): bool => $get('user') !== true),
Checkbox::make('remote')
->label('Remote')
->default(false)
->hidden(fn (callable $get): bool => $get('user') !== true)
->reactive(),
TextInput::make('host')
->label('Host')
->rules(fn (callable $get) => CreateDatabase::rules($this->server, $get())['host'])
->hidden(fn (callable $get): bool => $get('remote') !== true),
])
->modalSubmitActionLabel('Create')
->action(function (array $data): void {
run_action($this, function () use ($data): void {
app(CreateDatabase::class)->create($this->server, $data);
$this->dispatch('$refresh');
Notification::make()
->success()
->title('Database Created!')
->send();
});
}),
];
}
public function getWidgets(): array
{
return [
[Widgets\DatabasesList::class, ['server' => $this->server]],
];
}
}

View File

@ -1,50 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Databases\Traits;
use App\Models\Backup;
use App\Models\Database;
use App\Models\DatabaseUser;
use App\Models\User;
use App\Web\Pages\Servers\Databases\Backups;
use App\Web\Pages\Servers\Databases\Index as Databases;
use App\Web\Pages\Servers\Databases\Users;
use Filament\Navigation\NavigationGroup;
use Filament\Navigation\NavigationItem;
trait Navigation
{
public function getSecondSubNavigation(): array
{
/** @var User $user */
$user = auth()->user();
$items = [];
if ($user->can('viewAny', [Database::class, $this->server])) {
$items[] = NavigationItem::make(Databases::getNavigationLabel())
->icon('heroicon-o-circle-stack')
->isActiveWhen(fn () => request()->routeIs(Databases::getRouteName()))
->url(Databases::getUrl(parameters: ['server' => $this->server]));
}
if ($user->can('viewAny', [DatabaseUser::class, $this->server])) {
$items[] = NavigationItem::make(Users::getNavigationLabel())
->icon('heroicon-o-users')
->isActiveWhen(fn () => request()->routeIs(Users::getRouteName()))
->url(Users::getUrl(parameters: ['server' => $this->server]));
}
if ($user->can('viewAny', [Backup::class, $this->server])) {
$items[] = NavigationItem::make(Backups::getNavigationLabel())
->icon('heroicon-o-cloud')
->isActiveWhen(fn () => request()->routeIs(Backups::getRouteName()))
->url(Backups::getUrl(parameters: ['server' => $this->server]));
}
return [
NavigationGroup::make()
->items($items),
];
}
}

View File

@ -1,96 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Databases;
use App\Actions\Database\CreateDatabase;
use App\Actions\Database\CreateDatabaseUser;
use App\Actions\Database\SyncDatabaseUsers;
use App\Models\DatabaseUser;
use App\Web\Contracts\HasSecondSubNav;
use App\Web\Pages\Servers\Page;
use Filament\Actions\Action;
use Filament\Forms\Components\Checkbox;
use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Filament\Support\Enums\MaxWidth;
class Users extends Page implements HasSecondSubNav
{
use Traits\Navigation;
protected static ?string $slug = 'servers/{server}/databases/users';
protected static ?string $title = 'Database Users';
public function mount(): void
{
$this->authorize('viewAny', [DatabaseUser::class, $this->server]);
}
protected function getHeaderActions(): array
{
return [
Action::make('sync')
->color('gray')
->label('Sync Users')
->icon('heroicon-o-arrow-path')
->authorize(fn () => auth()->user()?->can('create', [DatabaseUser::class, $this->server]))
->requiresConfirmation()
->modalDescription('This will create db users that exist on the server but not in Vito.')
->modalSubmitActionLabel('Sync')
->action(function (): void {
run_action($this, function (): void {
app(SyncDatabaseUsers::class)->sync($this->server);
$this->dispatch('$refresh');
Notification::make()
->success()
->title('Users synced!')
->send();
});
}),
Action::make('create')
->icon('heroicon-o-plus')
->modalWidth(MaxWidth::Large)
->authorize(fn () => auth()->user()?->can('create', [DatabaseUser::class, $this->server]))
->form([
TextInput::make('username')
->label('Username')
->rules(fn (callable $get) => CreateDatabaseUser::rules($this->server, $get())['username']),
TextInput::make('password')
->label('Password')
->rules(fn (callable $get) => CreateDatabaseUser::rules($this->server, $get())['password']),
Checkbox::make('remote')
->label('Remote')
->default(false)
->visible(in_array($this->server->database()->name, ['mysql', 'mariadb']))
->reactive(),
TextInput::make('host')
->label('Host')
->rules(fn (callable $get) => CreateDatabase::rules($this->server, $get())['host'])
->hidden(fn (callable $get): bool => $get('remote') !== true),
])
->modalSubmitActionLabel('Create')
->action(function (array $data): void {
run_action($this, function () use ($data): void {
app(CreateDatabaseUser::class)->create($this->server, $data);
$this->dispatch('$refresh');
Notification::make()
->success()
->title('Database user created!')
->send();
});
}),
];
}
public function getWidgets(): array
{
return [
[Widgets\DatabaseUsersList::class, ['server' => $this->server]],
];
}
}

View File

@ -1,136 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Databases\Widgets;
use App\Actions\Database\ManageBackupFile;
use App\Actions\Database\RestoreBackup;
use App\Models\Backup;
use App\Models\BackupFile;
use App\Models\Database;
use App\Models\User;
use Filament\Forms\Components\Select;
use Filament\Notifications\Notification;
use Filament\Support\Enums\MaxWidth;
use Filament\Tables\Actions\Action;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Filament\Widgets\TableWidget as Widget;
use Illuminate\Database\Eloquent\Builder;
class BackupFilesList extends Widget
{
public Backup $backup;
/**
* @var array<string>
*/
protected $listeners = ['$refresh'];
/**
* @return Builder<BackupFile>
*/
protected function getTableQuery(): Builder
{
return BackupFile::query()->where('backup_id', $this->backup->id);
}
/**
* @return array<int, mixed>
*/
protected function getTableColumns(): array
{
return [
TextColumn::make('name')
->searchable(),
TextColumn::make('created_at')
->formatStateUsing(fn (BackupFile $record) => $record->created_at_by_timezone)
->sortable(),
TextColumn::make('restored_to')
->searchable(),
TextColumn::make('restored_at')
->formatStateUsing(fn (BackupFile $record): string => $record->getDateTimeByTimezone($record->restored_at))
->sortable(),
TextColumn::make('status')
->badge()
->color(fn ($state) => BackupFile::$statusColors[$state])
->sortable(),
];
}
/**
* @param Builder<BackupFile> $query
* @return Builder<BackupFile>
*/
protected function applyDefaultSortingToTableQuery(Builder $query): Builder
{
return $query->latest('created_at');
}
public function table(Table $table): Table
{
/** @var User $user */
$user = auth()->user();
return $table
->heading(null)
->query($this->getTableQuery())
->columns($this->getTableColumns())
->actions([
Action::make('download')
->hiddenLabel()
->icon('heroicon-o-arrow-down-tray')
->visible(fn (BackupFile $record): bool => $record->isAvailable() && $record->isLocal())
->tooltip('Download')
->action(fn (BackupFile $record) => app(ManageBackupFile::class)->download($record))
->authorize(fn (BackupFile $record) => $user->can('view', $record)),
Action::make('restore')
->hiddenLabel()
->icon('heroicon-o-arrow-path')
->modalHeading('Restore Backup')
->tooltip('Restore Backup')
->disabled(fn (BackupFile $record): bool => ! $record->isAvailable())
->authorize(fn (BackupFile $record) => $user->can('update', $record->backup))
->form([
Select::make('database')
->label('Restore to')
->options($this->backup->server->databases()->pluck('name', 'id'))
->rules(RestoreBackup::rules()['database'])
->native(false),
])
->modalWidth(MaxWidth::Large)
->action(function (BackupFile $record, array $data): void {
run_action($this, function () use ($record, $data): void {
$this->validate();
/** @var Database $database */
$database = Database::query()->findOrFail($data['database']);
$this->authorize('update', $database);
app(RestoreBackup::class)->restore($record, $data);
Notification::make()
->success()
->title('Backup is being restored')
->send();
$this->dispatch('$refresh');
});
}),
Action::make('delete')
->hiddenLabel()
->icon('heroicon-o-trash')
->modalHeading('Delete Backup File')
->color('danger')
->disabled(fn (BackupFile $record): bool => ! $record->isAvailable())
->tooltip('Delete')
->authorize(fn (BackupFile $record) => $user->can('delete', $record))
->requiresConfirmation()
->action(function (BackupFile $record): void {
app(ManageBackupFile::class)->delete($record);
$this->dispatch('$refresh');
}),
]);
}
}

View File

@ -1,160 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Databases\Widgets;
use App\Actions\Database\ManageBackup;
use App\Actions\Database\RunBackup;
use App\Models\Backup;
use App\Models\BackupFile;
use App\Models\Server;
use App\Models\User;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Filament\Support\Enums\MaxWidth;
use Filament\Tables\Actions\Action;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Filament\Widgets\TableWidget as Widget;
use Illuminate\Database\Eloquent\Builder;
class BackupsList extends Widget
{
public Server $server;
/**
* @var array<string>
*/
protected $listeners = ['$refresh'];
/**
* @return Builder<Backup>
*/
protected function getTableQuery(): Builder
{
return Backup::query()->where('server_id', $this->server->id);
}
protected function getTableColumns(): array
{
return [
TextColumn::make('database.name')
->label('Database')
->tooltip(fn (Backup $record) => $record->database->deleted_at ? 'Deleted at '.$record->database->deleted_at->format('Y-m-d H:i:s') : null)
->searchable(),
TextColumn::make('storage.profile')
->label('Storage')
->searchable(),
TextColumn::make('status')
->label('Status')
->badge()
->color(fn (Backup $backup) => Backup::$statusColors[$backup->status])
->sortable(),
TextColumn::make('lastFile.status')
->label('Last file status')
->badge()
->color(fn ($state) => BackupFile::$statusColors[$state])
->sortable(),
TextColumn::make('created_at')
->label('Created At')
->formatStateUsing(fn ($record) => $record->created_at_by_timezone)
->sortable(),
];
}
public function table(Table $table): Table
{
/** @var User $user */
$user = auth()->user();
return $table
->heading(null)
->query($this->getTableQuery())
->columns($this->getTableColumns())
->actions([
Action::make('edit')
->hiddenLabel()
->icon('heroicon-o-pencil')
->tooltip('Edit Configuration')
->disabled(fn (Backup $record): bool => ! in_array($record->status, ['running', 'failed']))
->authorize(fn (Backup $record) => $user->can('update', $record))
->modelLabel('Edit Backup')
->modalWidth(MaxWidth::Large)
->modalSubmitActionLabel('Update')
->form([
Select::make('interval')
->label('Interval')
->options(config('core.cronjob_intervals'))
->reactive()
->default(fn (Backup $record) => $record->isCustomInterval() ? 'custom' : $record->interval)
->rules(fn (callable $get) => ManageBackup::rules($this->server, $get())['interval']),
TextInput::make('custom_interval')
->label('Custom Interval (Cron)')
->rules(fn (callable $get) => ManageBackup::rules($this->server, $get())['custom_interval'])
->visible(fn (callable $get): bool => $get('interval') === 'custom')
->default(fn (Backup $record) => $record->isCustomInterval() ? $record->interval : '')
->placeholder('0 * * * *'),
TextInput::make('keep')
->label('Backups to Keep')
->default(fn (Backup $record) => $record->keep_backups)
->rules(fn (callable $get) => ManageBackup::rules($this->server, $get())['keep'])
->helperText('How many backups to keep before deleting the oldest one'),
])
->action(function (Backup $backup, array $data): void {
run_action($this, function () use ($data, $backup): void {
app(ManageBackup::class)->update($backup, $data);
$this->dispatch('$refresh');
Notification::make()
->success()
->title('Backup updated!')
->send();
});
}),
Action::make('files')
->hiddenLabel()
->icon('heroicon-o-rectangle-stack')
->modalHeading('Backup Files')
->color('gray')
->tooltip('Show backup files')
->disabled(fn (Backup $record): bool => ! in_array($record->status, ['running', 'failed']))
->authorize(fn (Backup $record) => $user->can('viewAny', [BackupFile::class, $record]))
->modalContent(fn (Backup $record) => view('components.dynamic-widget', [
'widget' => BackupFilesList::class,
'params' => [
'backup' => $record,
],
]))
->modalWidth(MaxWidth::FiveExtraLarge)
->slideOver()
->modalSubmitAction(false)
->modalCancelActionLabel('Close')
->modalFooterActions([
Action::make('backup')
->label('Run Backup')
->icon('heroicon-o-play')
->color('primary')
->action(function (Backup $record): void {
app(RunBackup::class)->run($record);
$this->dispatch('$refresh');
}),
]),
Action::make('delete')
->hiddenLabel()
->icon('heroicon-o-trash')
->modalHeading('Delete Backup & Files')
->disabled(fn (Backup $record): bool => ! in_array($record->status, ['running', 'failed']))
->color('danger')
->tooltip('Delete')
->authorize(fn (Backup $record) => $user->can('delete', $record))
->requiresConfirmation()
->action(function (Backup $record): void {
app(ManageBackup::class)->delete($record);
$this->dispatch('$refresh');
}),
]);
}
}

View File

@ -1,145 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Databases\Widgets;
use App\Actions\Database\DeleteDatabaseUser;
use App\Actions\Database\LinkUser;
use App\Models\DatabaseUser;
use App\Models\Server;
use App\Models\User;
use Filament\Forms\Components\CheckboxList;
use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Filament\Support\Enums\MaxWidth;
use Filament\Tables\Actions\Action;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Filament\Widgets\TableWidget as Widget;
use Illuminate\Database\Eloquent\Builder;
class DatabaseUsersList extends Widget
{
public Server $server;
/**
* @var array<string>
*/
protected $listeners = ['$refresh'];
/**
* @return Builder<DatabaseUser>
*/
protected function getTableQuery(): Builder
{
return DatabaseUser::query()->where('server_id', $this->server->id);
}
protected function getTableColumns(): array
{
return [
TextColumn::make('username')
->searchable(),
TextColumn::make('status')
->label('Status')
->badge()
->color(fn (DatabaseUser $databaseUser) => DatabaseUser::$statusColors[$databaseUser->status])
->sortable(),
TextColumn::make('created_at')
->label('Created At')
->formatStateUsing(fn ($record) => $record->created_at_by_timezone)
->sortable(),
];
}
public function table(Table $table): Table
{
return $table
->heading(null)
->query($this->getTableQuery())
->columns($this->getTableColumns())
->actions([
$this->passwordAction(),
$this->linkAction(),
$this->deleteAction(),
]);
}
private function passwordAction(): Action
{
/** @var User $user */
$user = auth()->user();
return Action::make('password')
->hiddenLabel()
->icon('heroicon-o-key')
->color('gray')
->modalHeading('Database user\'s password')
->modalWidth(MaxWidth::Large)
->tooltip('Show the password')
->authorize(fn ($record) => $user->can('view', $record))
->form([
TextInput::make('password')
->label('Password')
->default(fn (DatabaseUser $record) => $record->password)
->disabled(),
])
->action(function (DatabaseUser $record, array $data): void {
//
})
->modalSubmitAction(false)
->modalCancelActionLabel('Close');
}
private function linkAction(): Action
{
/** @var User $user */
$user = auth()->user();
return Action::make('link')
->hiddenLabel()
->icon('heroicon-o-link')
->modalHeading('Link user to databases')
->modalWidth(MaxWidth::Large)
->tooltip('Link user')
->modalSubmitActionLabel('Save')
->authorize(fn ($record) => $user->can('update', $record))
->form([
CheckboxList::make('databases')
->label('Databases')
->options($this->server->databases()->pluck('name', 'name')->toArray())
->rules(fn (callable $get): array => LinkUser::rules($this->server, $get()))
->default(fn (DatabaseUser $record) => $record->databases),
])
->action(function (DatabaseUser $record, array $data): void {
run_action($this, function () use ($record, $data): void {
app(LinkUser::class)->link($record, $data);
Notification::make()
->success()
->title('User linked to databases!')
->send();
});
});
}
private function deleteAction(): Action
{
/** @var User $user */
$user = auth()->user();
return Action::make('delete')
->hiddenLabel()
->icon('heroicon-o-trash')
->modalHeading('Delete Database User')
->color('danger')
->tooltip('Delete')
->authorize(fn ($record) => $user->can('delete', $record))
->requiresConfirmation()
->action(function (DatabaseUser $record): void {
run_action($this, function () use ($record): void {
app(DeleteDatabaseUser::class)->delete($this->server, $record);
$this->dispatch('$refresh');
});
});
}
}

View File

@ -1,81 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Databases\Widgets;
use App\Actions\Database\DeleteDatabase;
use App\Models\Database;
use App\Models\Server;
use App\Models\User;
use Filament\Tables\Actions\Action;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Filament\Widgets\TableWidget as Widget;
use Illuminate\Database\Eloquent\Builder;
class DatabasesList extends Widget
{
public Server $server;
/**
* @var array<string>
*/
protected $listeners = ['$refresh'];
/**
* @return Builder<Database>
*/
protected function getTableQuery(): Builder
{
return Database::query()->where('server_id', $this->server->id);
}
protected function getTableColumns(): array
{
return [
TextColumn::make('name')
->searchable(),
TextColumn::make('charset')
->label('Charset / Encoding')
->sortable(),
TextColumn::make('collation')
->label('Collation')
->sortable(),
TextColumn::make('status')
->label('Status')
->badge()
->color(fn (Database $database) => Database::$statusColors[$database->status])
->sortable(),
TextColumn::make('created_at')
->label('Created At')
->formatStateUsing(fn ($record) => $record->created_at_by_timezone)
->sortable(),
];
}
public function table(Table $table): Table
{
/** @var User $user */
$user = auth()->user();
return $table
->heading(null)
->query($this->getTableQuery())
->columns($this->getTableColumns())
->actions([
Action::make('delete')
->hiddenLabel()
->icon('heroicon-o-trash')
->modalHeading('Delete Database')
->color('danger')
->tooltip('Delete')
->authorize(fn ($record) => $user->can('delete', $record))
->requiresConfirmation()
->action(function (Database $record): void {
run_action($this, function () use ($record): void {
app(DeleteDatabase::class)->delete($this->server, $record);
$this->dispatch('$refresh');
});
}),
]);
}
}

View File

@ -1,29 +0,0 @@
<?php
namespace App\Web\Pages\Servers\FileManager;
use App\Web\Pages\Servers\Page;
class Index extends Page
{
protected static ?string $slug = 'servers/{server}/file-manager';
protected static ?string $title = 'File Manager';
/**
* @var array<string>
*/
protected $listeners = ['$refresh'];
public function mount(): void
{
$this->authorize('manage', $this->server);
}
public function getWidgets(): array
{
return [
[Widgets\FilesList::class, ['server' => $this->server]],
];
}
}

View File

@ -1,379 +0,0 @@
<?php
namespace App\Web\Pages\Servers\FileManager\Widgets;
use App\Actions\FileManager\FetchFiles;
use App\Exceptions\SSHError;
use App\Models\File;
use App\Models\Server;
use App\Models\User;
use App\Web\Fields\CodeEditorField;
use App\Web\Pages\Servers\FileManager\Index;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\TextInput;
use Filament\Support\Enums\ActionSize;
use Filament\Support\Enums\IconPosition;
use Filament\Tables\Actions\Action;
use Filament\Tables\Actions\ActionGroup;
use Filament\Tables\Actions\DeleteBulkAction;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Filament\Widgets\TableWidget as Widget;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Storage;
class FilesList extends Widget
{
public Server $server;
public string $serverUser;
public string $path;
/**
* @var array<string>
*/
protected $listeners = ['$refresh'];
public function mount(): void
{
$this->serverUser = $this->server->ssh_user;
$this->path = home_path($this->serverUser);
if (request()->has('path') && request()->has('user')) {
$this->path = request('path');
$this->serverUser = request('user');
}
$this->refresh();
}
/**
* @return array<int, mixed>
*/
protected function getTableHeaderActions(): array
{
return [
$this->homeAction(),
$this->userAction(),
ActionGroup::make([
$this->refreshAction(),
$this->newFileAction(),
$this->newDirectoryAction(),
$this->uploadAction(),
])
->tooltip('Toolbar')
->icon('heroicon-o-ellipsis-vertical')
->color('gray')
->size(ActionSize::Large)
->iconPosition(IconPosition::After)
->dropdownPlacement('bottom-end'),
];
}
/**
* @return Builder<File>
*/
protected function getTableQuery(): Builder
{
return File::query()
->where('user_id', auth()->id())
->where('server_id', $this->server->id);
}
public function table(Table $table): Table
{
auth()->user();
return $table
->query($this->getTableQuery())
->headerActions($this->getTableHeaderActions())
->heading(str($this->path)->substr(-50)->start(str($this->path)->length() > 50 ? '...' : ''))
->columns([
IconColumn::make('type')
->sortable()
->icon(fn (File $file): string => $this->getIcon($file)),
TextColumn::make('name')
->sortable(),
TextColumn::make('size')
->sortable(),
TextColumn::make('owner')
->sortable(),
TextColumn::make('group')
->sortable(),
TextColumn::make('date')
->sortable(),
TextColumn::make('permissions')
->sortable(),
])
->recordUrl(function (File $file): string {
if ($file->type === 'directory') {
return Index::getUrl([
'server' => $this->server->id,
'user' => $file->server_user,
'path' => absolute_path($file->path.'/'.$file->name),
]);
}
return '';
})
->defaultSort('type')
->actions([
$this->extractAction(),
$this->downloadAction(),
$this->editAction(),
$this->deleteAction(),
])
->checkIfRecordIsSelectableUsing(
fn (File $file): bool => $file->name !== '..',
)
->bulkActions([
DeleteBulkAction::make()
->requiresConfirmation(),
]);
}
public function changeUser(string $user): void
{
$this->redirect(
Index::getUrl([
'server' => $this->server->id,
'user' => $user,
'path' => home_path($user),
]),
true
);
}
public function refresh(): void
{
/** @var User $user */
$user = auth()->user();
try {
app(FetchFiles::class)->fetch(
$user,
$this->server,
[
'user' => $this->serverUser,
'path' => $this->path,
]
);
} catch (SSHError) {
abort(404);
}
$this->dispatch('$refresh');
}
protected function getIcon(File $file): string
{
if ($file->type === 'directory') {
return 'heroicon-o-folder';
}
if (str($file->name)->endsWith('.blade.php')) {
return 'laravel';
}
if (str($file->name)->endsWith('.php')) {
return 'php';
}
return 'heroicon-o-document-text';
}
protected function homeAction(): Action
{
return Action::make('home')
->label('Home')
->size(ActionSize::Small)
->icon('heroicon-o-home')
->action(function (): void {
$this->path = home_path($this->serverUser);
$this->refresh();
});
}
protected function userAction(): ActionGroup
{
$users = [];
foreach ($this->server->getSshUsers() as $user) {
$users[] = Action::make('user-'.$user)
->action(fn () => $this->changeUser($user))
->label($user);
}
return ActionGroup::make($users)
->tooltip('Change user')
->label($this->serverUser)
->button()
->size(ActionSize::Small)
->color('gray')
->icon('heroicon-o-chevron-up-down')
->iconPosition(IconPosition::After)
->dropdownPlacement('bottom-end');
}
protected function refreshAction(): Action
{
return Action::make('refresh')
->label('Refresh')
->icon('heroicon-o-arrow-path')
->action(fn () => $this->refresh());
}
protected function newFileAction(): Action
{
return Action::make('new-file')
->label('New File')
->icon('heroicon-o-document-text')
->action(function (array $data): void {
run_action($this, function () use ($data): void {
$this->server->os()->write(
$this->path.'/'.$data['name'],
str_replace("\r\n", "\n", $data['content']),
$this->serverUser
);
$this->refresh();
});
})
->form(fn (): array => [
TextInput::make('name')
->placeholder('file-name.txt'),
CodeEditorField::make('content'),
])
->modalSubmitActionLabel('Create')
->modalHeading('New File')
->modalWidth('4xl');
}
protected function newDirectoryAction(): Action
{
return Action::make('new-directory')
->label('New Directory')
->icon('heroicon-o-folder')
->action(function (array $data): void {
run_action($this, function () use ($data): void {
$this->server->os()->mkdir(
$this->path.'/'.$data['name'],
$this->serverUser
);
$this->refresh();
});
})
->form(fn (): array => [
TextInput::make('name')
->placeholder('directory name'),
])
->modalSubmitActionLabel('Create')
->modalHeading('New Directory')
->modalWidth('lg');
}
protected function uploadAction(): Action
{
return Action::make('upload')
->label('Upload File')
->icon('heroicon-o-arrow-up-on-square')
->action(function (array $data): void {
//
})
->after(function (array $data): void {
run_action($this, function () use ($data): void {
foreach ($data['file'] as $file) {
$this->server->ssh()->upload(
Storage::disk('tmp')->path($file),
$this->path.'/'.$file,
$this->serverUser
);
}
$this->refresh();
});
})
->form(fn (): array => [
FileUpload::make('file')
->disk('tmp')
->multiple()
->preserveFilenames(),
])
->modalSubmitActionLabel('Upload to Server')
->modalHeading('Upload File')
->modalWidth('xl');
}
protected function extractAction(): Action
{
return Action::make('extract')
->tooltip('Extract')
->icon('heroicon-o-archive-box')
->hiddenLabel()
->visible(fn (File $file): bool => $file->isExtractable())
->action(function (File $file): void {
$file->server->os()->extract($file->getFilePath(), $file->path, $file->server_user);
$this->refresh();
});
}
protected function downloadAction(): Action
{
return Action::make('download')
->tooltip('Download')
->icon('heroicon-o-arrow-down-tray')
->hiddenLabel()
->visible(fn (File $file): bool => $file->type === 'file')
->action(function (File $file) {
$file->server->ssh($file->server_user)->download(
Storage::disk('tmp')->path($file->name),
$file->getFilePath()
);
return Storage::disk('tmp')->download($file->name);
});
}
protected function editAction(): Action
{
return Action::make('edit')
->tooltip('Edit')
->icon('heroicon-o-pencil')
->hiddenLabel()
->visible(fn (File $file): bool => $file->type === 'file')
->action(function (File $file, array $data): void {
$file->server->os()->write(
$file->getFilePath(),
str_replace("\r\n", "\n", $data['content']),
$file->server_user
);
$this->refresh();
})
->form(fn (File $file): array => [
CodeEditorField::make('content')
->formatStateUsing(function () use ($file) {
$file->server->ssh($file->server_user)->download(
Storage::disk('tmp')->path($file->name),
$file->getFilePath()
);
return Storage::disk('tmp')->get(basename($file->getFilePath()));
}),
])
->modalSubmitActionLabel('Save')
->modalHeading('Edit')
->modalWidth('4xl');
}
protected function deleteAction(): Action
{
return Action::make('delete')
->tooltip('Delete')
->icon('heroicon-o-trash')
->color('danger')
->hiddenLabel()
->requiresConfirmation()
->visible(fn (File $file): bool => $file->name !== '..')
->action(function (File $file): void {
run_action($this, function () use ($file): void {
$file->delete();
});
});
}
}

View File

@ -1,133 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Firewall;
use App\Actions\FirewallRule\ManageRule;
use App\Models\FirewallRule;
use App\Web\Pages\Servers\Page;
use Filament\Actions\Action;
use Filament\Forms\Components\Checkbox;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Get;
use Filament\Notifications\Notification;
use Filament\Support\Enums\MaxWidth;
use Illuminate\Support\Facades\Request;
class Index extends Page
{
protected static ?string $slug = 'servers/{server}/firewall';
protected static ?string $title = 'Firewall';
/**
* @var array<string>
*/
protected $listeners = ['$refresh'];
public function mount(): void
{
$this->authorize('viewAny', [FirewallRule::class, $this->server]);
}
public function getWidgets(): array
{
return [
[Widgets\RulesList::class, ['server' => $this->server]],
];
}
/**
* @return array<int, mixed>
*/
public static function getFirewallForm(?FirewallRule $record = null): array
{
return [
TextInput::make('name')
->label('Purpose')
->default($record->name ?? null)
->rules(ManageRule::rules()['name']),
Select::make('type')
->label('Type')
->default($record->type ?? 'allow')
->options([
'allow' => 'Allow',
'deny' => 'Deny',
])
->rules(ManageRule::rules()['type']),
Select::make('protocol')
->label('Protocol')
->default($record->protocol ?? 'tcp')
->options([
'tcp' => 'TCP',
'udp' => 'UDP',
])
->rules(ManageRule::rules()['protocol']),
TextInput::make('port')
->label('Port')
->default($record->port ?? null)
->rules(['required', 'integer']),
Checkbox::make('source_any')
->label('Any Source')
->default(($record->source ?? null) == null)
->rules(['boolean'])
->helperText('Allow connections from any source, regardless of their IP address or subnet mask.')
->live(),
TextInput::make('source')
->hidden(fn (Get $get): bool => $get('source_any') == true)
->label('Source')
->helperText('The IP address of the source of the connection.')
->rules(ManageRule::rules()['source'])
->default($record->source ?? null)
->suffixAction(
\Filament\Forms\Components\Actions\Action::make('get_ip')
->icon('heroicon-o-globe-alt')
->color('primary')
->tooltip('Use My IP')
->action(function ($set): void {
$ip = Request::ip();
$set('source', $ip);
})
),
TextInput::make('mask')
->hidden(fn (Get $get): bool => $get('source_any') == true)
->label('Mask')
->default($record->mask ?? null)
->helperText('The subnet mask of the source of the connection. Leave blank for a single IP address.')
->rules(ManageRule::rules()['mask']),
];
}
protected function getHeaderActions(): array
{
return [
Action::make('read-the-docs')
->label('Read the Docs')
->icon('heroicon-o-document-text')
->color('gray')
->url('https://vitodeploy.com/servers/firewall')
->openUrlInNewTab(),
Action::make('create')
->authorize(fn () => auth()->user()?->can('create', [FirewallRule::class, $this->server]))
->label('Create a Rule')
->icon('heroicon-o-plus')
->modalWidth(MaxWidth::Large)
->modalHeading('Create Firewall Rule')
->modalDescription('Add a new rule to the firewall')
->modalSubmitActionLabel('Create')
->form(self::getFirewallForm())
->action(function (array $data): void {
run_action($this, function () use ($data): void {
app(ManageRule::class)->create($this->server, $data);
$this->dispatch('$refresh');
Notification::make()
->success()
->title('Applying Firewall Rule')
->send();
});
}),
];
}
}

View File

@ -1,130 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Firewall\Widgets;
use App\Actions\FirewallRule\ManageRule;
use App\Models\FirewallRule;
use App\Models\Server;
use App\Models\User;
use App\Web\Pages\Servers\Firewall\Index;
use Exception;
use Filament\Notifications\Notification;
use Filament\Support\Enums\MaxWidth;
use Filament\Tables\Actions\Action;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Filament\Widgets\TableWidget as Widget;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Str;
class RulesList extends Widget
{
public Server $server;
/**
* @var array<string>
*/
protected $listeners = ['$refresh'];
/**
* @return Builder<FirewallRule>
*/
protected function getTableQuery(): Builder
{
return FirewallRule::query()->where('server_id', $this->server->id);
}
protected function getTableColumns(): array
{
return [
TextColumn::make('name')
->searchable()
->sortable()
->label('Purpose'),
TextColumn::make('type')
->sortable()
->badge()
->color(fn ($state): string => $state === 'allow' ? 'success' : 'warning')
->label('Type')
->formatStateUsing(fn ($state) => Str::upper($state)),
TextColumn::make('id')
->sortable()
->label('Source')
->formatStateUsing(function (FirewallRule $record) {
$source = $record->source == null ? 'any' : $record->source;
if ($source !== 'any' && $record->mask !== null) {
$source .= '/'.$record->mask;
}
return $source;
}),
TextColumn::make('protocol')
->sortable()
->badge()
->color('primary')
->label('Protocol')
->formatStateUsing(fn ($state) => Str::upper($state)),
TextColumn::make('port')
->sortable()
->label('Port'),
TextColumn::make('status')
->label('Status')
->badge()
->color(fn (FirewallRule $record): string => $record->getStatusColor()),
];
}
public function table(Table $table): Table
{
/** @var User $user */
$user = auth()->user();
return $table
->heading(null)
->query($this->getTableQuery())
->columns($this->getTableColumns())
->actions([
Action::make('edit')
->icon('heroicon-o-pencil')
->tooltip('Edit')
->hiddenLabel()
->modalWidth(MaxWidth::Large)
->modalHeading('Edit Firewall Rule')
->modalDescription('Edit the associated servers firewall rule.')
->modalSubmitActionLabel('Update')
->authorize(fn (FirewallRule $record) => $user->can('update', $record))
->form(fn ($record): array => Index::getFirewallForm($record))
->action(function (FirewallRule $record, array $data): void {
run_action($this, function () use ($record, $data): void {
app(ManageRule::class)->update($record, $data);
$this->dispatch('$refresh');
Notification::make()
->success()
->title('Applying Firewall Rule')
->send();
});
}),
Action::make('delete')
->icon('heroicon-o-trash')
->tooltip('Delete')
->color('danger')
->hiddenLabel()
->requiresConfirmation()
->authorize(fn (FirewallRule $record) => $user->can('delete', $record))
->action(function (FirewallRule $record): void {
try {
app(ManageRule::class)->delete($record);
} catch (Exception $e) {
Notification::make()
->danger()
->title($e->getMessage())
->send();
}
$this->dispatch('$refresh');
}),
]);
}
}

View File

@ -1,251 +0,0 @@
<?php
namespace App\Web\Pages\Servers;
use App\Actions\Server\CreateServer as CreateServerAction;
use App\Enums\Database;
use App\Enums\PHP;
use App\Enums\ServerProvider;
use App\Enums\Webserver;
use App\Models\Project;
use App\Models\Server;
use App\Models\User;
use App\Web\Components\Page;
use App\Web\Fields\AlertField;
use App\Web\Fields\ProviderField;
use App\Web\Pages\Settings\ServerProviders\Actions\Create;
use Filament\Forms\Components\Actions\Action;
use Filament\Forms\Components\Fieldset;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Filament\Support\Enums\MaxWidth;
class Index extends Page
{
protected static ?string $slug = 'servers';
protected static ?string $navigationIcon = 'heroicon-o-server-stack';
protected static ?int $navigationSort = 1;
protected static ?string $title = 'Servers';
public static function getNavigationItemActiveRoutePattern(): string
{
return static::getRouteName().'*';
}
public function mount(): void
{
/** @var User $user */
$user = auth()->user();
$this->authorize('viewAny', [Server::class, $user->currentProject]);
}
public function getWidgets(): array
{
return [
[Widgets\ServersList::class],
];
}
protected function getHeaderActions(): array
{
$publicKey = __('servers.create.public_key_text', [
'public_key' => get_public_key_content(),
]);
/** @var User $user */
$user = auth()->user();
/** @var Project $project */
$project = $user->currentProject;
return [
\Filament\Actions\Action::make('read-the-docs')
->label('Read the Docs')
->icon('heroicon-o-document-text')
->color('gray')
->url('https://vitodeploy.com')
->openUrlInNewTab(),
\Filament\Actions\Action::make('create')
->label('Create a Server')
->icon('heroicon-o-plus')
->authorize('create', [Server::class, $user->currentProject])
->modalWidth(MaxWidth::FiveExtraLarge)
->slideOver()
->form([
ProviderField::make('provider')
->label('Select a provider')
->default(ServerProvider::CUSTOM)
->live()
->reactive()
->afterStateUpdated(function (callable $set): void {
$set('server_provider', null);
$set('region', null);
$set('plan', null);
})
->rules(fn ($get) => CreateServerAction::rules($project, $get())['provider']),
AlertField::make('alert')
->warning()
->message(__('servers.create.public_key_warning'))
->visible(fn ($get): bool => $get('provider') === ServerProvider::CUSTOM),
Select::make('server_provider')
->visible(fn ($get): bool => $get('provider') !== ServerProvider::CUSTOM)
->label('Server provider connection')
->rules(fn ($get) => CreateServerAction::rules($project, $get())['server_provider'])
->options(fn ($get) => \App\Models\ServerProvider::getByProjectId($project->id)
->where('provider', $get('provider'))
->pluck('profile', 'id'))
->suffixAction(
Action::make('connect')
->form(Create::form())
->modalHeading('Connect to a new server provider')
->modalSubmitActionLabel('Connect')
->icon('heroicon-o-wifi')
->tooltip('Connect to a new server provider')
->modalWidth(MaxWidth::Medium)
->authorize(fn () => $user->can('create', \App\Models\ServerProvider::class))
->action(fn (array $data) => Create::action($data))
)
->placeholder('Select profile')
->native(false)
->live()
->reactive()
->selectablePlaceholder(false)
->visible(fn ($get): bool => $get('provider') !== ServerProvider::CUSTOM),
Grid::make()
->schema([
Select::make('region')
->label('Region')
->rules(fn ($get) => CreateServerAction::rules($project, $get())['region'] ?? [])
->live()
->reactive()
->options(function ($get): array {
if (! $get('server_provider')) {
return [];
}
return \App\Models\ServerProvider::regions($get('server_provider'));
})
->loadingMessage('Loading regions...')
->disabled(fn ($get): bool => ! $get('server_provider'))
->placeholder(fn ($get): string => $get('server_provider') ? 'Select region' : 'Select connection first')
->searchable(),
Select::make('plan')
->label('Plan')
->rules(fn ($get) => CreateServerAction::rules($project, $get())['plan'] ?? [])
->reactive()
->options(function ($get): array {
if (! $get('server_provider') || ! $get('region')) {
return [];
}
return \App\Models\ServerProvider::plans($get('server_provider'), $get('region'));
})
->loadingMessage('Loading plans...')
->disabled(fn ($get): bool => ! $get('region'))
->placeholder(fn ($get): string => $get('region') ? 'Select plan' : 'Select plan first')
->searchable(),
])
->visible(fn ($get): bool => $get('provider') !== ServerProvider::CUSTOM),
TextInput::make('public_key')
->label('Public Key')
->default($publicKey)
->suffixAction(
Action::make('copy')
->icon('heroicon-o-clipboard-document-list')
->tooltip('Copy')
->action(function ($livewire, string $state): void {
$livewire->js(
'window.navigator.clipboard.writeText("'.$state.'");'
);
Notification::make()
->success()
->title('Copied!')
->send();
})
)
->helperText('Run this command on your server as root user')
->disabled()
->visible(fn ($get): bool => $get('provider') === ServerProvider::CUSTOM),
Grid::make()
->schema([
TextInput::make('name')
->label('Name')
->rules(fn ($get) => CreateServerAction::rules($project, $get())['name']),
Select::make('os')
->label('OS')
->native(false)
->rules(fn ($get) => CreateServerAction::rules($project, $get())['os'])
->options(
collect((array) config('core.operating_systems'))
->mapWithKeys(fn ($value) => [$value => $value])
),
]),
Grid::make()
->schema([
TextInput::make('ip')
->label('SSH IP Address')
->rules(fn ($get) => CreateServerAction::rules($project, $get())['ip']),
TextInput::make('port')
->label('SSH Port')
->rules(fn ($get) => CreateServerAction::rules($project, $get())['port']),
])
->visible(fn ($get): bool => $get('provider') === ServerProvider::CUSTOM),
Fieldset::make('Services')
->columns(1)
->schema([
AlertField::make('alert')
->info()
->message('You can install/uninstall services later'),
Grid::make(3)
->schema([
Select::make('webserver')
->label('Webserver')
->native(false)
->selectablePlaceholder(false)
->rules(fn ($get) => CreateServerAction::rules($project, $get())['webserver'] ?? [])
->default(Webserver::NONE)
->options(
collect((array) config('core.webservers'))->mapWithKeys(fn ($value) => [$value => $value])
),
Select::make('database')
->label('Database')
->native(false)
->selectablePlaceholder(false)
->rules(fn ($get) => CreateServerAction::rules($project, $get())['database'] ?? [])
->default(Database::NONE)
->options(
collect((array) config('core.databases_name'))
->mapWithKeys(fn ($value, $key) => [
$key => $value.' '.config('core.databases_version')[$key],
])
),
Select::make('php')
->label('PHP')
->native(false)
->selectablePlaceholder(false)
->rules(fn ($get) => CreateServerAction::rules($project, $get())['php'] ?? [])
->default(PHP::NONE)
->options(
collect((array) config('core.php_versions'))
->mapWithKeys(fn ($value) => [$value => $value])
),
]),
]),
])
->modalSubmitActionLabel('Create')
->action(function (array $data) use ($user, $project): void {
run_action($this, function () use ($data, $user, $project): void {
$server = app(CreateServerAction::class)->create($user, $project, $data);
$this->redirect(View::getUrl(['server' => $server]));
});
}),
];
}
}

View File

@ -1,34 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Logs;
use App\Models\ServerLog;
use App\Web\Contracts\HasSecondSubNav;
use App\Web\Pages\Servers\Logs\Widgets\LogsList;
use App\Web\Pages\Servers\Page;
class Index extends Page implements HasSecondSubNav
{
use Traits\Navigation;
protected static ?string $slug = 'servers/{server}/logs';
protected static ?string $title = 'Logs';
public function mount(): void
{
$this->authorize('viewAny', [ServerLog::class, $this->server]);
}
public function getWidgets(): array
{
return [
[LogsList::class, ['server' => $this->server]],
];
}
protected function getHeaderActions(): array
{
return [];
}
}

View File

@ -1,54 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Logs;
use App\Actions\Server\CreateServerLog;
use App\Models\ServerLog;
use App\Web\Contracts\HasSecondSubNav;
use App\Web\Pages\Servers\Logs\Widgets\LogsList;
use App\Web\Pages\Servers\Page;
use Filament\Actions\Action;
use Filament\Forms\Components\TextInput;
use Filament\Support\Enums\MaxWidth;
class RemoteLogs extends Page implements HasSecondSubNav
{
use Traits\Navigation;
protected static ?string $slug = 'servers/{server}/logs/remote';
protected static ?string $title = 'Remote Logs';
public function mount(): void
{
$this->authorize('viewAny', [ServerLog::class, $this->server]);
}
public function getWidgets(): array
{
return [
[LogsList::class, ['server' => $this->server, 'remote' => true]],
];
}
protected function getHeaderActions(): array
{
return [
Action::make('create')
->icon('heroicon-o-plus')
->modalWidth(MaxWidth::Large)
->authorize(fn () => auth()->user()?->can('create', [ServerLog::class, $this->server]))
->form([
TextInput::make('path')
->helperText('The full path of the log file on the server')
->rules(fn (callable $get) => CreateServerLog::rules()['path']),
])
->modalSubmitActionLabel('Create')
->action(function (array $data): void {
app(CreateServerLog::class)->create($this->server, $data);
$this->dispatch('$refresh');
}),
];
}
}

View File

@ -1,38 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Logs\Traits;
use App\Models\ServerLog;
use App\Models\User;
use App\Web\Pages\Servers\Logs\Index;
use App\Web\Pages\Servers\Logs\RemoteLogs;
use Filament\Navigation\NavigationGroup;
use Filament\Navigation\NavigationItem;
trait Navigation
{
public function getSecondSubNavigation(): array
{
/** @var User $user */
$user = auth()->user();
$items = [];
if ($user->can('viewAny', [ServerLog::class, $this->server])) {
$items[] = NavigationItem::make(Index::getNavigationLabel())
->icon('heroicon-o-square-3-stack-3d')
->isActiveWhen(fn () => request()->routeIs(Index::getRouteName()))
->url(Index::getUrl(parameters: ['server' => $this->server]));
$items[] = NavigationItem::make(RemoteLogs::getNavigationLabel())
->icon('heroicon-o-wifi')
->isActiveWhen(fn () => request()->routeIs(RemoteLogs::getRouteName()))
->url(RemoteLogs::getUrl(parameters: ['server' => $this->server]));
}
return [
NavigationGroup::make()
->items($items),
];
}
}

View File

@ -1,134 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Logs\Widgets;
use App\Models\Server;
use App\Models\ServerLog;
use App\Models\Site;
use App\Models\User;
use Exception;
use Filament\Forms\Components\DatePicker;
use Filament\Tables\Actions\Action;
use Filament\Tables\Actions\DeleteAction;
use Filament\Tables\Actions\DeleteBulkAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\Filter;
use Filament\Tables\Table;
use Filament\Widgets\TableWidget as Widget;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\View\ComponentAttributeBag;
use Symfony\Component\HttpFoundation\StreamedResponse;
class LogsList extends Widget
{
public Server $server;
public ?Site $site = null;
public bool $remote = false;
/**
* @var array<string>
*/
protected $listeners = ['$refresh'];
/**
* @return Builder<ServerLog>
*/
protected function getTableQuery(): Builder
{
return ServerLog::query()
->where('server_id', $this->server->id)
->where(function (Builder $query): void {
if ($this->site instanceof Site) {
$query->where('site_id', $this->site->id);
}
})
->where('is_remote', $this->remote);
}
protected function getTableColumns(): array
{
return [
TextColumn::make('name')
->label('Event')
->searchable()
->sortable(),
TextColumn::make('created_at')
->label('Created At')
->formatStateUsing(fn ($record) => $record->created_at_by_timezone)
->sortable(),
];
}
/**
* @param Builder<ServerLog> $query
* @return Builder<ServerLog>
*/
protected function applyDefaultSortingToTableQuery(Builder $query): Builder
{
return $query->latest('created_at');
}
/**
* @throws Exception
*/
public function table(Table $table): Table
{
/** @var User $user */
$user = auth()->user();
return $table
->heading(null)
->query($this->getTableQuery())
->columns($this->getTableColumns())
->filters([
Filter::make('created_at')
->form([
DatePicker::make('created_from'),
DatePicker::make('created_until'),
])
->query(fn (Builder $query, array $data): Builder => $query
->when(
$data['created_from'],
fn (Builder $query, $date): Builder => $query->whereDate('created_at', '>=', $date),
)
->when(
$data['created_until'],
fn (Builder $query, $date): Builder => $query->whereDate('created_at', '<=', $date),
)),
])
->actions([
Action::make('view')
->hiddenLabel()
->tooltip('View')
->icon('heroicon-o-eye')
->authorize(fn ($record) => $user->can('view', $record))
->modalHeading('View Log')
->modalContent(fn (ServerLog $record) => view('components.console-view', [
'slot' => $record->getContent(),
'attributes' => new ComponentAttributeBag,
]))
->modalSubmitAction(false)
->modalCancelActionLabel('Close'),
Action::make('download')
->hiddenLabel()
->tooltip('Download')
->color('gray')
->icon('heroicon-o-archive-box-arrow-down')
->authorize(fn ($record) => $user->can('view', $record))
->action(fn (ServerLog $record): StreamedResponse => $record->download()),
DeleteAction::make()
->hiddenLabel()
->tooltip('Delete')
->icon('heroicon-o-trash')
->color('danger')
->authorize(fn ($record) => $user->can('delete', $record)),
])
->bulkActions([
DeleteBulkAction::make()
->requiresConfirmation()
->authorize($user->can('deleteMany', [ServerLog::class, $this->server])),
]);
}
}

View File

@ -1,67 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Metrics;
use App\Actions\Monitoring\UpdateMetricSettings;
use App\Models\Metric;
use App\Web\Pages\Servers\Page;
use Filament\Actions\Action;
use Filament\Forms\Components\Select;
use Filament\Notifications\Notification;
use Filament\Support\Enums\MaxWidth;
class Index extends Page
{
protected static ?string $slug = 'servers/{server}/metrics';
protected static ?string $title = 'Metrics';
public function mount(): void
{
$this->authorize('viewAny', [Metric::class, $this->server]);
}
public function getWidgets(): array
{
return [
[Widgets\FilterForm::class, ['server' => $this->server]],
[Widgets\MetricDetails::class, ['server' => $this->server]],
];
}
protected function getHeaderActions(): array
{
return [
Action::make('data-retention')
->button()
->color('gray')
->icon('heroicon-o-trash')
->label('Data Retention')
->modalWidth(MaxWidth::Large)
->form([
Select::make('data_retention')
->options([
7 => '7 days',
14 => '14 days',
30 => '30 days',
60 => '60 days',
90 => '90 days',
180 => '180 days',
365 => '365 days',
])
->rules(UpdateMetricSettings::rules()['data_retention'])
->label('Data Retention')
->default($this->server->monitoring()?->type_data['data_retention'] ?? 30),
])
->modalSubmitActionLabel('Save')
->action(function (array $data): void {
app(UpdateMetricSettings::class)->update($this->server, $data);
Notification::make()
->success()
->title('Data retention updated')
->send();
}),
];
}
}

View File

@ -1,92 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Metrics\Widgets;
use App\Actions\Monitoring\GetMetrics;
use App\Models\Server;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\ViewField;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Forms\Form;
use Filament\Forms\Get;
use Filament\Widgets\Widget;
class FilterForm extends Widget implements HasForms
{
use InteractsWithForms;
protected static string $view = 'components.form';
/**
* @var ?array<string, mixed>
*/
public ?array $data = [
'period' => '1h',
'from' => null,
'to' => null,
];
public function updated(string $name, mixed $value): void
{
if ($value !== 'custom') {
$this->dispatch('updateFilters', filters: $this->data);
}
$from = $this->data['from'] ?? null;
$to = $this->data['to'] ?? null;
if ($value === 'custom' && $from && $to) {
$this->dispatch('updateFilters', filters: $this->data);
}
}
public Server $server;
public function form(Form $form): Form
{
return $form
->schema([
Grid::make()
->columns(3)
->schema([
Select::make('period')
->live()
->reactive()
->options([
'10m' => '10 Minutes',
'30m' => '30 Minutes',
'1h' => '1 Hour',
'12h' => '12 Hours',
'1d' => '1 Day',
'7d' => '7 Days',
'custom' => 'Custom',
])
->rules(fn (Get $get) => GetMetrics::rules($get())['period']),
DatePicker::make('from')
->reactive()
->visible(fn (Get $get): bool => $get('period') === 'custom')
->maxDate(fn (Get $get) => now())
->rules(fn (Get $get) => GetMetrics::rules($get())['from']),
DatePicker::make('to')
->reactive()
->visible(fn (Get $get): bool => $get('period') === 'custom')
->minDate(fn (Get $get) => $get('from') ?: now())
->maxDate(now())
->rules(fn (Get $get) => GetMetrics::rules($get())['to']),
]),
ViewField::make('data')
->reactive()
->view('components.dynamic-widget', [
'widget' => Metrics::class,
'params' => [
'server' => $this->server,
'filters' => $this->data,
],
]),
])
->statePath('data');
}
}

View File

@ -1,86 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Metrics\Widgets;
use App\Models\Metric;
use App\Models\Server;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Infolists\Components\Grid;
use Filament\Infolists\Components\Section;
use Filament\Infolists\Components\TextEntry;
use Filament\Infolists\Concerns\InteractsWithInfolists;
use Filament\Infolists\Contracts\HasInfolists;
use Filament\Infolists\Infolist;
use Filament\Widgets\Widget;
use Illuminate\Support\Number;
class MetricDetails extends Widget implements HasForms, HasInfolists
{
use InteractsWithForms;
use InteractsWithInfolists;
/**
* @var array<string>
*/
protected $listeners = ['$refresh'];
protected static bool $isLazy = false;
protected static string $view = 'components.infolist';
public Server $server;
public function infolist(Infolist $infolist): Infolist
{
return $infolist
->record($this->server->metrics()->latest()->first() ?? new Metric)
->schema([
Grid::make()
->schema([
Section::make()
->heading('Memory')
->description('More details on memory')
->columnSpan(1)
->schema([
TextEntry::make('memory_total')
->label('Total Memory')
->alignRight()
->formatStateUsing(fn (Metric $record) => Number::fileSize($record->memory_total_in_bytes, 2))
->inlineLabel(),
TextEntry::make('memory_used')
->label('Used Memory')
->alignRight()
->formatStateUsing(fn (Metric $record) => Number::fileSize($record->memory_used_in_bytes, 2))
->inlineLabel(),
TextEntry::make('memory_free')
->label('Free Memory')
->formatStateUsing(fn (Metric $record) => Number::fileSize($record->memory_free_in_bytes, 2))
->alignRight()
->inlineLabel(),
]),
Section::make()
->heading('Disk')
->description('More details on disk')
->columnSpan(1)
->schema([
TextEntry::make('disk_total')
->label('Total Disk')
->formatStateUsing(fn (Metric $record) => Number::fileSize($record->disk_total_in_bytes, 2))
->alignRight()
->inlineLabel(),
TextEntry::make('disk_used')
->label('Used Disk')
->formatStateUsing(fn (Metric $record) => Number::fileSize($record->disk_used_in_bytes, 2))
->alignRight()
->inlineLabel(),
TextEntry::make('disk_free')
->label('Free Disk')
->formatStateUsing(fn (Metric $record) => Number::fileSize($record->disk_free_in_bytes, 2))
->alignRight()
->inlineLabel(),
]),
]),
]);
}
}

View File

@ -1,54 +0,0 @@
<?php
namespace App\Web\Pages\Servers\Metrics\Widgets;
use App\Actions\Monitoring\GetMetrics;
use App\Models\Metric;
use App\Models\Server;
use Filament\Widgets\StatsOverviewWidget as BaseWidget;
use Filament\Widgets\StatsOverviewWidget\Stat;
use Illuminate\Support\Number;
use Livewire\Attributes\On;
class Metrics extends BaseWidget
{
public Server $server;
/**
* @var array<string, mixed>
*/
public array $filters = [];
protected static bool $isLazy = false;
/**
* @param array<string, mixed> $filters
*/
#[On('updateFilters')]
public function updateFilters(array $filters): void
{
$this->filters = $filters;
}
protected function getStats(): array
{
/** @var Metric $lastMetric */
$lastMetric = $this->server
->metrics()
->latest()
->first();
$metrics = app(GetMetrics::class)->filter($this->server, $this->filters);
return [
Stat::make('CPU Load', $lastMetric->load ?? 0)
->color('success')
->chart($metrics->pluck('load')->toArray()),
Stat::make('Memory Usage', Number::fileSize($lastMetric->memory_used_in_bytes ?? 0, 2))
->color('warning')
->chart($metrics->pluck('memory_used')->toArray()),
Stat::make('Disk Usage', Number::fileSize($lastMetric->disk_used_in_bytes ?? 0, 2))
->color('primary')
->chart($metrics->pluck('disk_used')->toArray()),
];
}
}

Some files were not shown because too many files have changed in this diff Show More