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,4 +1,14 @@
{
"semi": true,
"singleQuote": true,
"singleAttributePerLine": false,
"htmlWhitespaceSensitivity": "css",
"printWidth": 150,
"tailwindFunctions": [
"clsx",
"cn"
],
"tabWidth": 2,
"plugins": [
"prettier-plugin-blade",
"prettier-plugin-tailwindcss",
@ -6,7 +16,9 @@
],
"overrides": [
{
"files": ["*.blade.php"],
"files": [
"*.blade.php"
],
"options": {
"parser": "blade",
"printWidth": 120,
@ -17,10 +29,18 @@
}
},
{
"files": ["*.sh"],
"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,7 +3,7 @@ # 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.

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