Compare commits

..

4 Commits
main ... 2.x

Author SHA1 Message Date
90b63d065d Create FUNDING.yml 2025-06-05 21:58:32 +02:00
2318e1b1df Add Caddy Server Support Alongside Nginx (#600)
* added enum

* add config for caddy

* add svg icon

* add caddy service class

* wip

* install caddy

* create base Caddyfile with common snippets

* Create a systemd service to run Caddy in the background.

* create uninstall file

* wip

* create path

* create vhost

* get vhost

* delete site

* add php version change file

* add custom ssl

* create redirect file

* add vhost for caddy site & load balancer

* update svg

* fix caddy icon

* fix style

* add systemctl reload method

* Reload systemd after modifying the Caddy service file.

* add caddy

* added tests

* format with pint

* prevent multiple web server installations

* added error log & access log
2025-05-29 11:25:36 +02:00
65898b0ee6 Fix mysqldump backup error
This reverts commit 564b97e2aa.
2025-05-21 20:57:38 +02:00
3124f8c795 Bump league/commonmark from 2.6.1 to 2.7.0 (#595)
Bumps [league/commonmark](https://github.com/thephpleague/commonmark) from 2.6.1 to 2.7.0.
- [Release notes](https://github.com/thephpleague/commonmark/releases)
- [Changelog](https://github.com/thephpleague/commonmark/blob/2.7/CHANGELOG.md)
- [Commits](https://github.com/thephpleague/commonmark/compare/2.6.1...2.7.0)

---
updated-dependencies:
- dependency-name: league/commonmark
  dependency-version: 2.7.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-10 11:12:50 +03:00
389 changed files with 42556 additions and 32524 deletions

View File

@ -3,15 +3,12 @@ root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_size = 4
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

1
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1 @@
github: [saeedvaziry]

View File

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

View File

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

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=ce7ca21baf0406f807aed85ee1d8fa6e
.scribe/auth.md=9bee2b1ef8a238b2e58613fa636d5f39
.scribe/intro.md=98adb6862b118c06e02e4e22390feb6f
.scribe/auth.md=7fcc12b2e5a86fa9c49f509d348f3cc2

View File

@ -1,3 +1,7 @@
# Authenticating requests
This API is not authenticated.
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>

View File

@ -14,9 +14,10 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all cron jobs.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -34,7 +35,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -42,7 +43,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -51,12 +52,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer eDa6Vdh1Z4vc35bP8E6gafk'
controller: null
method: null
route: null
@ -72,9 +76,10 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new cron job.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -92,7 +97,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -100,7 +105,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -108,7 +113,7 @@ endpoints:
name: command
description: ''
required: true
example: consequatur
example: quia
type: string
enumValues: []
exampleWasSpecified: false
@ -118,7 +123,7 @@ endpoints:
name: user
description: ''
required: true
example: vito
example: root
type: string
enumValues:
- root
@ -137,19 +142,22 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
command: consequatur
user: vito
command: quia
user: root
frequency: '* * * * *'
fileParameters: []
responses:
-
status: 200
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"}'
content: '{"id":null,"server_id":null,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":null,"updated_at":null}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 66EeZvdh3kVaDP8f4ga5c1b'
controller: null
method: null
route: null
@ -165,9 +173,10 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a cron job by ID.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -185,7 +194,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -195,7 +204,7 @@ endpoints:
name: cronJob_id
description: 'The ID of the cronJob.'
required: true
example: 17
example: 6
type: integer
enumValues: []
exampleWasSpecified: false
@ -203,8 +212,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
cronJob_id: 17
server_id: 29
cronJob_id: 6
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -213,12 +222,15 @@ endpoints:
responses:
-
status: 200
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"}'
content: '{"id":null,"server_id":null,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":null,"updated_at":null}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer D4c3Z65ebv8E16fahaVgPdk'
controller: null
method: null
route: null
@ -234,9 +246,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete cron job.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -254,7 +267,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -264,7 +277,7 @@ endpoints:
name: cronJob_id
description: 'The ID of the cronJob.'
required: true
example: 17
example: 13
type: integer
enumValues: []
exampleWasSpecified: false
@ -272,8 +285,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
cronJob_id: 17
server_id: 29
cronJob_id: 13
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -287,7 +300,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer h3cP4aZa1v8feDdEg5b6k6V'
controller: null
method: null
route: null

View File

@ -14,9 +14,10 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all databases.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -34,7 +35,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -42,7 +43,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -51,12 +52,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer E1VdfegZah4k86b53Dc6Pva'
controller: null
method: null
route: null
@ -72,9 +76,10 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new database.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -92,7 +97,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -100,7 +105,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -108,7 +113,7 @@ endpoints:
name: name
description: ''
required: true
example: consequatur
example: quisquam
type: string
enumValues: []
exampleWasSpecified: false
@ -118,7 +123,7 @@ endpoints:
name: charset
description: ''
required: true
example: consequatur
example: omnis
type: string
enumValues: []
exampleWasSpecified: false
@ -128,26 +133,29 @@ endpoints:
name: collation
description: ''
required: true
example: consequatur
example: at
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
name: consequatur
charset: consequatur
collation: consequatur
name: quisquam
charset: omnis
collation: at
fileParameters: []
responses:
-
status: 200
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"}'
content: '{"id":null,"server_id":null,"name":"csawayn","status":"ready","created_at":null,"updated_at":null}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer PVgkZ35ca4afd1EbD8ehv66'
controller: null
method: null
route: null
@ -163,9 +171,10 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a database by ID.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -183,7 +192,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -193,7 +202,7 @@ endpoints:
name: id
description: 'The ID of the database.'
required: true
example: 17
example: 8
type: integer
enumValues: []
exampleWasSpecified: false
@ -201,8 +210,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
id: 17
server_id: 29
id: 8
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -211,12 +220,15 @@ endpoints:
responses:
-
status: 200
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"}'
content: '{"id":null,"server_id":null,"name":"sandrine43","status":"ready","created_at":null,"updated_at":null}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer EP64D8g51adf6hbceavVZ3k'
controller: null
method: null
route: null
@ -232,9 +244,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete database.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -252,7 +265,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -262,7 +275,7 @@ endpoints:
name: database_id
description: 'The ID of the database.'
required: true
example: 17
example: 8
type: integer
enumValues: []
exampleWasSpecified: false
@ -270,8 +283,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
database_id: 17
server_id: 29
database_id: 8
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -285,7 +298,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 8dgEk3Zv1eaVP66bDhf4ac5'
controller: null
method: null
route: null

View File

@ -14,9 +14,10 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all database users.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -34,7 +35,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -42,7 +43,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -51,12 +52,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer d4g15bV3Pa6hDvck6eaEf8Z'
controller: null
method: null
route: null
@ -72,9 +76,10 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new database user.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -92,7 +97,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -100,7 +105,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -108,7 +113,7 @@ endpoints:
name: username
description: ''
required: true
example: consequatur
example: qui
type: string
enumValues: []
exampleWasSpecified: false
@ -118,7 +123,7 @@ endpoints:
name: password
description: ''
required: true
example: 'O[2UZ5ij-e/dl4m{o,'
example: 'xYv*3,#HQ=5<w!'
type: string
enumValues: []
exampleWasSpecified: false
@ -135,19 +140,22 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
username: consequatur
password: 'O[2UZ5ij-e/dl4m{o,'
username: qui
password: 'xYv*3,#HQ=5<w!'
host: '%'
fileParameters: []
responses:
-
status: 200
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"}'
content: '{"id":null,"server_id":null,"username":"marcelle95","databases":[],"host":"%","status":null,"created_at":null,"updated_at":null}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 3vZ6f6kagacDEhV1Pde5b84'
controller: null
method: null
route: null
@ -163,9 +171,10 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a database user by ID.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -183,7 +192,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -193,7 +202,7 @@ endpoints:
name: databaseUser_id
description: 'The ID of the databaseUser.'
required: true
example: 17
example: 1
type: integer
enumValues: []
exampleWasSpecified: false
@ -201,8 +210,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
databaseUser_id: 17
server_id: 29
databaseUser_id: 1
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -211,12 +220,15 @@ endpoints:
responses:
-
status: 200
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"}'
content: '{"id":null,"server_id":null,"username":"brandi53","databases":[],"host":"%","status":null,"created_at":null,"updated_at":null}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer af3b5ac6dP8ZV4vE1hk6eDg'
controller: null
method: null
route: null
@ -232,9 +244,10 @@ endpoints:
subgroupDescription: ''
title: link
description: 'Link to databases'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -252,7 +265,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -262,7 +275,7 @@ endpoints:
name: databaseUser_id
description: 'The ID of the databaseUser.'
required: true
example: 17
example: 4
type: integer
enumValues: []
exampleWasSpecified: false
@ -270,8 +283,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
databaseUser_id: 17
server_id: 29
databaseUser_id: 4
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -279,24 +292,27 @@ endpoints:
name: databases
description: 'Array of database names to link to the user.'
required: true
example: consequatur
example: maiores
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
databases: consequatur
databases: maiores
fileParameters: []
responses:
-
status: 200
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"}'
content: '{"id":null,"server_id":null,"username":"kschmidt","databases":[],"host":"%","status":null,"created_at":null,"updated_at":null}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer b6f3Ed641gaZDcVa5k8vePh'
controller: null
method: null
route: null
@ -312,9 +328,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete database user.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -332,7 +349,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -342,7 +359,7 @@ endpoints:
name: databaseUser_id
description: 'The ID of the databaseUser.'
required: true
example: 17
example: 20
type: integer
enumValues: []
exampleWasSpecified: false
@ -350,8 +367,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
databaseUser_id: 17
server_id: 29
databaseUser_id: 20
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -365,7 +382,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer Zka6fh15g6eaV8vE34cDPdb'
controller: null
method: null
route: null

View File

@ -14,9 +14,10 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all firewall rules.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -34,7 +35,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -42,7 +43,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -51,12 +52,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer eD368kaZfVEab4v61ghdP5c'
controller: null
method: null
route: null
@ -72,9 +76,10 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new firewall rule.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -92,7 +97,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -100,7 +105,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -108,7 +113,7 @@ endpoints:
name: name
description: ''
required: true
example: consequatur
example: sapiente
type: string
enumValues: []
exampleWasSpecified: false
@ -142,7 +147,7 @@ endpoints:
name: port
description: ''
required: true
example: consequatur
example: et
type: string
enumValues: []
exampleWasSpecified: false
@ -152,7 +157,7 @@ endpoints:
name: source
description: ''
required: false
example: consequatur
example: doloribus
type: string
enumValues: []
exampleWasSpecified: false
@ -169,22 +174,25 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: consequatur
name: sapiente
type: allow
protocol: tcp
port: consequatur
source: consequatur
port: et
source: doloribus
mask: '0'
fileParameters: []
responses:
-
status: 200
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"}'
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}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 3184PbED6aacZveV6hf5dgk'
controller: null
method: null
route: null
@ -200,9 +208,10 @@ endpoints:
subgroupDescription: ''
title: edit
description: 'Update an existing firewall rule.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -220,7 +229,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -230,7 +239,7 @@ endpoints:
name: firewallRule_id
description: 'The ID of the firewallRule.'
required: true
example: 94
example: 85
type: integer
enumValues: []
exampleWasSpecified: false
@ -238,8 +247,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
firewallRule_id: 94
server_id: 29
firewallRule_id: 85
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -247,7 +256,7 @@ endpoints:
name: name
description: ''
required: true
example: consequatur
example: et
type: string
enumValues: []
exampleWasSpecified: false
@ -281,7 +290,7 @@ endpoints:
name: port
description: ''
required: true
example: consequatur
example: aut
type: string
enumValues: []
exampleWasSpecified: false
@ -291,7 +300,7 @@ endpoints:
name: source
description: ''
required: false
example: consequatur
example: et
type: string
enumValues: []
exampleWasSpecified: false
@ -308,22 +317,25 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: consequatur
name: et
type: allow
protocol: tcp
port: consequatur
source: consequatur
port: aut
source: et
mask: '0'
fileParameters: []
responses:
-
status: 200
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"}'
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}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer ad46E3egPDc51aV6hb8vkZf'
controller: null
method: null
route: null
@ -339,9 +351,10 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a firewall rule by ID.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -359,7 +372,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -369,7 +382,7 @@ endpoints:
name: firewallRule_id
description: 'The ID of the firewallRule.'
required: true
example: 94
example: 85
type: integer
enumValues: []
exampleWasSpecified: false
@ -377,8 +390,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
firewallRule_id: 94
server_id: 29
firewallRule_id: 85
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -387,12 +400,15 @@ endpoints:
responses:
-
status: 200
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"}'
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}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 6gkvbDae15a6f43EVPdZh8c'
controller: null
method: null
route: null
@ -408,9 +424,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete firewall rule.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -428,7 +445,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -438,7 +455,7 @@ endpoints:
name: firewallRule_id
description: 'The ID of the firewallRule.'
required: true
example: 94
example: 85
type: integer
enumValues: []
exampleWasSpecified: false
@ -446,8 +463,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
firewallRule_id: 94
server_id: 29
firewallRule_id: 85
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -461,7 +478,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer ZVd1fk5E3e48hDvaa6g6cPb'
controller: null
method: null
route: null

View File

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

View File

@ -14,9 +14,10 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all projects.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters: []
@ -29,12 +30,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer fbPE6haeDZ8v1gV5ak463dc'
controller: null
method: null
route: null
@ -50,9 +54,10 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new project.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters: []
@ -64,24 +69,27 @@ endpoints:
name: name
description: 'The name of the project.'
required: true
example: consequatur
example: dignissimos
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
name: consequatur
name: dignissimos
fileParameters: []
responses:
-
status: 200
content: '{"id":3,"name":"Dr. Cornelius Luettgen V","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
content: '{"id":3,"name":"Pattie Cole","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 6ZkedcEfa5V6Dv4ab8P3g1h'
controller: null
method: null
route: null
@ -97,9 +105,10 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a project by ID.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -123,12 +132,15 @@ endpoints:
responses:
-
status: 200
content: '{"id":3,"name":"Orville Satterfield","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
content: '{"id":3,"name":"Mr. Elias Bauch","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer P6ka4Zaefgh8Ec3dV15v6bD'
controller: null
method: null
route: null
@ -144,9 +156,10 @@ endpoints:
subgroupDescription: ''
title: update
description: 'Update project.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -169,24 +182,27 @@ endpoints:
name: name
description: 'The name of the project.'
required: true
example: consequatur
example: sunt
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
name: consequatur
name: sunt
fileParameters: []
responses:
-
status: 200
content: '{"id":3,"name":"Dr. Cornelius Luettgen V","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
content: '{"id":3,"name":"Elfrieda Jakubowski","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer ecaDZkf5E4vgP1V86d6hb3a'
controller: null
method: null
route: null
@ -202,9 +218,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete project.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -233,7 +250,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer h5gZ63DPVbcevE4faka86d1'
controller: null
method: null
route: null

View File

@ -14,9 +14,10 @@ endpoints:
subgroupDescription: ''
title: index
description: 'Get all redirects.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -34,7 +35,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -44,7 +45,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 17
example: 44
type: integer
enumValues: []
exampleWasSpecified: false
@ -52,8 +53,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
site_id: 17
server_id: 29
site_id: 44
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -62,12 +63,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer cV16fevgEZhPadD43685akb'
controller: null
method: null
route: null
@ -83,9 +87,10 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new redirect.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -103,7 +108,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -113,7 +118,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 17
example: 44
type: integer
enumValues: []
exampleWasSpecified: false
@ -121,8 +126,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
site_id: 17
server_id: 29
site_id: 44
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -130,7 +135,7 @@ endpoints:
name: from
description: ''
required: true
example: consequatur
example: odit
type: string
enumValues: []
exampleWasSpecified: false
@ -140,7 +145,7 @@ endpoints:
name: to
description: ''
required: true
example: consequatur
example: incidunt
type: string
enumValues: []
exampleWasSpecified: false
@ -150,7 +155,7 @@ endpoints:
name: mode
description: ''
required: true
example: 302
example: 301
type: string
enumValues:
- 301
@ -161,9 +166,9 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
from: consequatur
to: consequatur
mode: 302
from: odit
to: incidunt
mode: 301
fileParameters: []
responses:
-
@ -173,7 +178,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer ZD45hPk638abev61EVcagdf'
controller: null
method: null
route: null
@ -189,9 +197,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete a redirect.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -209,7 +218,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -219,7 +228,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 17
example: 44
type: integer
enumValues: []
exampleWasSpecified: false
@ -237,8 +246,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
site_id: 17
server_id: 29
site_id: 44
redirect_id: 9
queryParameters: []
cleanQueryParameters: []
@ -253,7 +262,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer Ec3fDgdbae615aPh8k6vV4Z'
controller: null
method: null
route: null

View File

@ -14,9 +14,10 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all servers in a project.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -40,12 +41,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer Pg1Vk6cvadD8eb3ZhaEf564'
controller: null
method: null
route: null
@ -61,9 +65,10 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new server.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -86,7 +91,7 @@ endpoints:
name: provider
description: 'The server provider type'
required: true
example: consequatur
example: fugiat
type: string
enumValues: []
exampleWasSpecified: false
@ -96,7 +101,7 @@ endpoints:
name: server_provider
description: 'If the provider is not custom, the ID of the server provider profile'
required: true
example: hetzner
example: digitalocean
type: string
enumValues:
- custom
@ -111,7 +116,7 @@ endpoints:
name: region
description: 'Provider region if the provider is not custom'
required: true
example: consequatur
example: itaque
type: string
enumValues: []
exampleWasSpecified: false
@ -121,7 +126,7 @@ endpoints:
name: plan
description: 'Provider plan if the provider is not custom'
required: true
example: consequatur
example: voluptatum
type: string
enumValues: []
exampleWasSpecified: false
@ -131,7 +136,7 @@ endpoints:
name: ip
description: 'SSH IP address if the provider is custom'
required: true
example: consequatur
example: ut
type: string
enumValues: []
exampleWasSpecified: false
@ -141,7 +146,7 @@ endpoints:
name: port
description: 'SSH Port if the provider is custom'
required: true
example: consequatur
example: reiciendis
type: string
enumValues: []
exampleWasSpecified: false
@ -151,7 +156,7 @@ endpoints:
name: name
description: 'The name of the server.'
required: true
example: consequatur
example: et
type: string
enumValues: []
exampleWasSpecified: false
@ -161,7 +166,7 @@ endpoints:
name: os
description: 'The os of the server'
required: true
example: consequatur
example: vel
type: string
enumValues: []
exampleWasSpecified: false
@ -171,7 +176,7 @@ endpoints:
name: webserver
description: 'Web server'
required: true
example: none
example: nginx
type: string
enumValues:
- none
@ -183,7 +188,7 @@ endpoints:
name: database
description: Database
required: true
example: mariadb104
example: mysql80
type: string
enumValues:
- none
@ -204,7 +209,7 @@ endpoints:
name: php
description: 'PHP version'
required: true
example: '8.0'
example: '7.2'
type: string
enumValues:
- '7.0'
@ -220,27 +225,30 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
provider: consequatur
server_provider: hetzner
region: consequatur
plan: consequatur
ip: consequatur
port: consequatur
name: consequatur
os: consequatur
webserver: none
database: mariadb104
php: '8.0'
provider: fugiat
server_provider: digitalocean
region: itaque
plan: voluptatum
ip: ut
port: reiciendis
name: et
os: vel
webserver: nginx
database: mysql80
php: '7.2'
fileParameters: []
responses:
-
status: 200
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"}'
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}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 5E61e4vfcgDbVkZd68aah3P'
controller: null
method: null
route: null
@ -256,9 +264,10 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a server by ID.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -276,7 +285,7 @@ endpoints:
name: id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -284,7 +293,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
id: 32
id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -293,12 +302,15 @@ endpoints:
responses:
-
status: 200
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"}'
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}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer hV3debf65aPD4E1ckag8Z6v'
controller: null
method: null
route: null
@ -314,9 +326,10 @@ endpoints:
subgroupDescription: ''
title: reboot
description: 'Reboot a server.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -334,7 +347,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -342,7 +355,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -356,7 +369,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer b61aD6538PacZEkeghfvV4d'
controller: null
method: null
route: null
@ -372,9 +388,10 @@ endpoints:
subgroupDescription: ''
title: upgrade
description: 'Upgrade server.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -392,7 +409,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -400,7 +417,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -414,7 +431,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer dEZaa6cePVf3k86g45vbD1h'
controller: null
method: null
route: null
@ -430,9 +450,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete server.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -450,7 +471,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -458,7 +479,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -472,7 +493,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 6aDkZEfdP16V58gb43avhec'
controller: null
method: null
route: null

View File

@ -14,9 +14,10 @@ endpoints:
subgroupDescription: ''
title: list
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -40,12 +41,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 3evaP8h6VEZkbfgaD6d1c45'
controller: null
method: null
route: null
@ -61,9 +65,10 @@ endpoints:
subgroupDescription: ''
title: create
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -86,7 +91,7 @@ endpoints:
name: provider
description: 'The provider (aws, linode, hetzner, digitalocean, vultr, ...)'
required: true
example: consequatur
example: corrupti
type: string
enumValues: []
exampleWasSpecified: false
@ -96,7 +101,7 @@ endpoints:
name: name
description: 'The name of the server provider.'
required: true
example: consequatur
example: est
type: string
enumValues: []
exampleWasSpecified: false
@ -106,7 +111,7 @@ endpoints:
name: token
description: 'The token if provider requires api token'
required: true
example: consequatur
example: rerum
type: string
enumValues: []
exampleWasSpecified: false
@ -116,7 +121,7 @@ endpoints:
name: key
description: 'The key if provider requires key'
required: true
example: consequatur
example: ut
type: string
enumValues: []
exampleWasSpecified: false
@ -126,28 +131,31 @@ endpoints:
name: secret
description: 'The secret if provider requires key'
required: true
example: consequatur
example: sed
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
provider: consequatur
name: consequatur
token: consequatur
key: consequatur
secret: consequatur
provider: corrupti
name: est
token: rerum
key: ut
secret: sed
fileParameters: []
responses:
-
status: 200
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"}'
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"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 6g6vfEck83VaPhd5Zabe1D4'
controller: null
method: null
route: null
@ -163,9 +171,10 @@ endpoints:
subgroupDescription: ''
title: show
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -200,12 +209,15 @@ endpoints:
responses:
-
status: 200
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"}'
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"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer va63cDe8dPf5Z4Vahb1E6kg'
controller: null
method: null
route: null
@ -221,9 +233,10 @@ endpoints:
subgroupDescription: ''
title: update
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -257,7 +270,7 @@ endpoints:
name: name
description: 'The name of the server provider.'
required: true
example: consequatur
example: earum
type: string
enumValues: []
exampleWasSpecified: false
@ -276,18 +289,21 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: consequatur
name: earum
global: false
fileParameters: []
responses:
-
status: 200
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"}'
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"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 4e1dghaV6D856P3ZbfkcEva'
controller: null
method: null
route: null
@ -303,9 +319,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -345,7 +362,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer fcVa8ev63gP5DaZbkdhE461'
controller: null
method: null
route: null

View File

@ -14,9 +14,10 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all ssh keys.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -34,7 +35,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -42,7 +43,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -51,12 +52,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 165aZvb46PhacEfke83dVgD'
controller: null
method: null
route: null
@ -72,9 +76,10 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Deploy ssh key to server.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -92,7 +97,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -100,7 +105,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -108,7 +113,7 @@ endpoints:
name: key_id
description: 'The ID of the key.'
required: true
example: consequatur
example: explicabo
type: string
enumValues: []
exampleWasSpecified: false
@ -118,7 +123,7 @@ endpoints:
name: name
description: 'Key name, required if key_id is not provided.'
required: true
example: consequatur
example: deleniti
type: string
enumValues: []
exampleWasSpecified: false
@ -128,26 +133,29 @@ endpoints:
name: public_key
description: 'Public Key, required if key_id is not provided.'
required: true
example: consequatur
example: sapiente
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
key_id: consequatur
name: consequatur
public_key: consequatur
key_id: explicabo
name: deleniti
public_key: sapiente
fileParameters: []
responses:
-
status: 200
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"}'
content: '{"id":null,"user":null,"name":"Mr. Reagan Jacobson V","created_at":null,"updated_at":null}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer deDkf4E13PZb6cgaV58ha6v'
controller: null
method: null
route: null
@ -163,9 +171,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete ssh key from server.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -183,7 +192,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -201,7 +210,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
sshKey_id: 1
queryParameters: []
cleanQueryParameters: []
@ -216,7 +225,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer ec48fgVdZ6ah3kvPD16E5ab'
controller: null
method: null
route: null

View File

@ -14,9 +14,10 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all services.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -34,7 +35,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -42,7 +43,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -51,12 +52,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer gVEce46k8aZfaP3d15vbhD6'
controller: null
method: null
route: null
@ -72,9 +76,10 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a service by ID.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -92,7 +97,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -102,7 +107,7 @@ endpoints:
name: id
description: 'The ID of the service.'
required: true
example: 184
example: 169
type: integer
enumValues: []
exampleWasSpecified: false
@ -110,8 +115,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
id: 184
server_id: 29
id: 169
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -120,12 +125,15 @@ endpoints:
responses:
-
status: 200
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}'
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}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer Ef8D5gbV6cadk3Zh1vP46ea'
controller: null
method: null
route: null
@ -141,9 +149,10 @@ endpoints:
subgroupDescription: ''
title: start
description: 'Start service.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -161,7 +170,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -171,7 +180,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 184
example: 169
type: integer
enumValues: []
exampleWasSpecified: false
@ -179,8 +188,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
service_id: 184
server_id: 29
service_id: 169
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -194,7 +203,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer b3DckZ8g6ha6aPe4f5V1vdE'
controller: null
method: null
route: null
@ -210,9 +222,10 @@ endpoints:
subgroupDescription: ''
title: stop
description: 'Stop service.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -230,7 +243,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -240,7 +253,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 184
example: 169
type: integer
enumValues: []
exampleWasSpecified: false
@ -248,8 +261,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
service_id: 184
server_id: 29
service_id: 169
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -263,7 +276,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 1e8aZbfvE5643DacgkPhdV6'
controller: null
method: null
route: null
@ -279,9 +295,10 @@ endpoints:
subgroupDescription: ''
title: restart
description: 'Restart service.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -299,7 +316,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -309,7 +326,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 184
example: 169
type: integer
enumValues: []
exampleWasSpecified: false
@ -317,8 +334,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
service_id: 184
server_id: 29
service_id: 169
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -332,7 +349,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer c46baVZEg5dv1Pfe8Dha6k3'
controller: null
method: null
route: null
@ -348,9 +368,10 @@ endpoints:
subgroupDescription: ''
title: enable
description: 'Enable service.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -368,7 +389,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -378,7 +399,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 184
example: 169
type: integer
enumValues: []
exampleWasSpecified: false
@ -386,8 +407,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
service_id: 184
server_id: 29
service_id: 169
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -401,7 +422,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer EvcehkDbdV43f61P86Za5ga'
controller: null
method: null
route: null
@ -417,9 +441,10 @@ endpoints:
subgroupDescription: ''
title: disable
description: 'Disable service.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -437,7 +462,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -447,7 +472,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 184
example: 169
type: integer
enumValues: []
exampleWasSpecified: false
@ -455,8 +480,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
service_id: 184
server_id: 29
service_id: 169
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -470,7 +495,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer k8E5gf6d4h31bevaa6cVPZD'
controller: null
method: null
route: null
@ -486,9 +514,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete service.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -506,7 +535,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -516,7 +545,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 184
example: 169
type: integer
enumValues: []
exampleWasSpecified: false
@ -524,8 +553,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
service_id: 184
server_id: 29
service_id: 169
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -539,7 +568,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer Pekav16cd5ag486ZfD3EVbh'
controller: null
method: null
route: null

View File

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

View File

@ -14,9 +14,10 @@ endpoints:
subgroupDescription: ''
title: list
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -40,12 +41,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer e3f4ag8hkb5vZcDadPEV661'
controller: null
method: null
route: null
@ -61,9 +65,10 @@ endpoints:
subgroupDescription: ''
title: create
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -99,7 +104,7 @@ endpoints:
name: name
description: 'The name of the storage provider.'
required: true
example: consequatur
example: molestias
type: string
enumValues: []
exampleWasSpecified: false
@ -109,7 +114,7 @@ endpoints:
name: token
description: 'The token if provider requires api token'
required: true
example: consequatur
example: in
type: string
enumValues: []
exampleWasSpecified: false
@ -119,7 +124,7 @@ endpoints:
name: url
description: 'The URL if the provider is Gitlab and it is self-hosted'
required: true
example: 'http://kunze.biz/iste-laborum-eius-est-dolor.html'
example: 'https://www.white.com/aperiam-dolor-nemo-qui-rerum-quod-quas'
type: string
enumValues: []
exampleWasSpecified: false
@ -129,7 +134,7 @@ endpoints:
name: username
description: 'The username if the provider is Bitbucket'
required: true
example: consequatur
example: consectetur
type: string
enumValues: []
exampleWasSpecified: false
@ -139,7 +144,7 @@ endpoints:
name: password
description: 'The password if the provider is Bitbucket'
required: true
example: 'O[2UZ5ij-e/dl4m{o,'
example: 'y*P4_]ZdjE_:'
type: string
enumValues: []
exampleWasSpecified: false
@ -147,21 +152,24 @@ endpoints:
custom: []
cleanBodyParameters:
provider: gitlab
name: consequatur
token: consequatur
url: 'http://kunze.biz/iste-laborum-eius-est-dolor.html'
username: consequatur
password: 'O[2UZ5ij-e/dl4m{o,'
name: molestias
token: in
url: 'https://www.white.com/aperiam-dolor-nemo-qui-rerum-quod-quas'
username: consectetur
password: 'y*P4_]ZdjE_:'
fileParameters: []
responses:
-
status: 200
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"}'
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"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer DfegP56vkEa364Zbhda8V1c'
controller: null
method: null
route: null
@ -177,9 +185,10 @@ endpoints:
subgroupDescription: ''
title: show
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -214,12 +223,15 @@ endpoints:
responses:
-
status: 200
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"}'
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"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer ePc6fb65vh1Z4aakE3Dgd8V'
controller: null
method: null
route: null
@ -235,9 +247,10 @@ endpoints:
subgroupDescription: ''
title: update
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -271,7 +284,7 @@ endpoints:
name: name
description: 'The name of the storage provider.'
required: true
example: consequatur
example: non
type: string
enumValues: []
exampleWasSpecified: false
@ -281,7 +294,7 @@ endpoints:
name: token
description: 'The token if provider requires api token'
required: true
example: consequatur
example: sunt
type: string
enumValues: []
exampleWasSpecified: false
@ -291,7 +304,7 @@ endpoints:
name: url
description: 'The URL if the provider is Gitlab and it is self-hosted'
required: true
example: 'http://kunze.biz/iste-laborum-eius-est-dolor.html'
example: 'https://www.frami.org/ex-at-minus-rerum-quo-minus-ea'
type: string
enumValues: []
exampleWasSpecified: false
@ -301,7 +314,7 @@ endpoints:
name: username
description: 'The username if the provider is Bitbucket'
required: true
example: consequatur
example: natus
type: string
enumValues: []
exampleWasSpecified: false
@ -311,7 +324,7 @@ endpoints:
name: password
description: 'The password if the provider is Bitbucket'
required: true
example: 'O[2UZ5ij-e/dl4m{o,'
example: 'A^">*m{p]DI'
type: string
enumValues: []
exampleWasSpecified: false
@ -321,7 +334,7 @@ endpoints:
name: global
description: 'Accessible in all projects'
required: true
example: false
example: true
type: string
enumValues:
- true
@ -330,22 +343,25 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: consequatur
token: consequatur
url: 'http://kunze.biz/iste-laborum-eius-est-dolor.html'
username: consequatur
password: 'O[2UZ5ij-e/dl4m{o,'
global: false
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
fileParameters: []
responses:
-
status: 200
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"}'
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"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer v3f6aaPk61Ze8hVdDbE5g4c'
controller: null
method: null
route: null
@ -361,9 +377,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -403,7 +420,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer fgk61vD68E4cZhP3bV5adea'
controller: null
method: null
route: null

View File

@ -14,9 +14,10 @@ endpoints:
subgroupDescription: ''
title: list
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -40,12 +41,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer fgh4eV31dP58kvaDEaZbc66'
controller: null
method: null
route: null
@ -61,9 +65,10 @@ endpoints:
subgroupDescription: ''
title: create
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -86,7 +91,7 @@ endpoints:
name: provider
description: 'The provider (aws, linode, hetzner, digitalocean, vultr, ...)'
required: true
example: consequatur
example: ab
type: string
enumValues: []
exampleWasSpecified: false
@ -96,7 +101,7 @@ endpoints:
name: name
description: 'The name of the storage provider.'
required: true
example: consequatur
example: quo
type: string
enumValues: []
exampleWasSpecified: false
@ -106,7 +111,7 @@ endpoints:
name: token
description: 'The token if provider requires api token'
required: true
example: consequatur
example: in
type: string
enumValues: []
exampleWasSpecified: false
@ -116,7 +121,7 @@ endpoints:
name: key
description: 'The key if provider requires key'
required: true
example: consequatur
example: sunt
type: string
enumValues: []
exampleWasSpecified: false
@ -126,28 +131,31 @@ endpoints:
name: secret
description: 'The secret if provider requires key'
required: true
example: consequatur
example: molestias
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
provider: consequatur
name: consequatur
token: consequatur
key: consequatur
secret: consequatur
provider: ab
name: quo
token: in
key: sunt
secret: molestias
fileParameters: []
responses:
-
status: 200
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"}'
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"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer e584613dkZaPDEVvgcahbf6'
controller: null
method: null
route: null
@ -163,9 +171,10 @@ endpoints:
subgroupDescription: ''
title: show
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -200,12 +209,15 @@ endpoints:
responses:
-
status: 200
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"}'
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"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer h6Zk6834dDce5fbPa1VvagE'
controller: null
method: null
route: null
@ -221,9 +233,10 @@ endpoints:
subgroupDescription: ''
title: update
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -257,7 +270,7 @@ endpoints:
name: name
description: 'The name of the storage provider.'
required: true
example: consequatur
example: voluptas
type: string
enumValues: []
exampleWasSpecified: false
@ -276,18 +289,21 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: consequatur
name: voluptas
global: true
fileParameters: []
responses:
-
status: 200
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"}'
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"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer ak6fgd1Eba48chvPV3e5Z6D'
controller: null
method: null
route: null
@ -303,9 +319,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -345,7 +362,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer PcaDbh6ZE4aV1e8fdv56k3g'
controller: null
method: null
route: null

View File

@ -12,9 +12,10 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all cron jobs.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -32,7 +33,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -40,7 +41,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -49,12 +50,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer eDa6Vdh1Z4vc35bP8E6gafk'
controller: null
method: null
route: null
@ -70,9 +74,10 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new cron job.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -90,7 +95,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -98,7 +103,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -106,7 +111,7 @@ endpoints:
name: command
description: ''
required: true
example: consequatur
example: quia
type: string
enumValues: []
exampleWasSpecified: false
@ -116,7 +121,7 @@ endpoints:
name: user
description: ''
required: true
example: vito
example: root
type: string
enumValues:
- root
@ -135,19 +140,22 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
command: consequatur
user: vito
command: quia
user: root
frequency: '* * * * *'
fileParameters: []
responses:
-
status: 200
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"}'
content: '{"id":null,"server_id":null,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":null,"updated_at":null}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 66EeZvdh3kVaDP8f4ga5c1b'
controller: null
method: null
route: null
@ -163,9 +171,10 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a cron job by ID.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -183,7 +192,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -193,7 +202,7 @@ endpoints:
name: cronJob_id
description: 'The ID of the cronJob.'
required: true
example: 17
example: 6
type: integer
enumValues: []
exampleWasSpecified: false
@ -201,8 +210,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
cronJob_id: 17
server_id: 29
cronJob_id: 6
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -211,12 +220,15 @@ endpoints:
responses:
-
status: 200
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"}'
content: '{"id":null,"server_id":null,"command":"ls -la","user":"root","frequency":"* * * * *","status":"ready","created_at":null,"updated_at":null}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer D4c3Z65ebv8E16fahaVgPdk'
controller: null
method: null
route: null
@ -232,9 +244,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete cron job.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -252,7 +265,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -262,7 +275,7 @@ endpoints:
name: cronJob_id
description: 'The ID of the cronJob.'
required: true
example: 17
example: 13
type: integer
enumValues: []
exampleWasSpecified: false
@ -270,8 +283,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
cronJob_id: 17
server_id: 29
cronJob_id: 13
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -285,7 +298,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer h3cP4aZa1v8feDdEg5b6k6V'
controller: null
method: null
route: null

View File

@ -12,9 +12,10 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all databases.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -32,7 +33,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -40,7 +41,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -49,12 +50,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer E1VdfegZah4k86b53Dc6Pva'
controller: null
method: null
route: null
@ -70,9 +74,10 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new database.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -90,7 +95,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -98,7 +103,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -106,7 +111,7 @@ endpoints:
name: name
description: ''
required: true
example: consequatur
example: quisquam
type: string
enumValues: []
exampleWasSpecified: false
@ -116,7 +121,7 @@ endpoints:
name: charset
description: ''
required: true
example: consequatur
example: omnis
type: string
enumValues: []
exampleWasSpecified: false
@ -126,26 +131,29 @@ endpoints:
name: collation
description: ''
required: true
example: consequatur
example: at
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
name: consequatur
charset: consequatur
collation: consequatur
name: quisquam
charset: omnis
collation: at
fileParameters: []
responses:
-
status: 200
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"}'
content: '{"id":null,"server_id":null,"name":"csawayn","status":"ready","created_at":null,"updated_at":null}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer PVgkZ35ca4afd1EbD8ehv66'
controller: null
method: null
route: null
@ -161,9 +169,10 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a database by ID.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -181,7 +190,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -191,7 +200,7 @@ endpoints:
name: id
description: 'The ID of the database.'
required: true
example: 17
example: 8
type: integer
enumValues: []
exampleWasSpecified: false
@ -199,8 +208,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
id: 17
server_id: 29
id: 8
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -209,12 +218,15 @@ endpoints:
responses:
-
status: 200
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"}'
content: '{"id":null,"server_id":null,"name":"sandrine43","status":"ready","created_at":null,"updated_at":null}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer EP64D8g51adf6hbceavVZ3k'
controller: null
method: null
route: null
@ -230,9 +242,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete database.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -250,7 +263,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -260,7 +273,7 @@ endpoints:
name: database_id
description: 'The ID of the database.'
required: true
example: 17
example: 8
type: integer
enumValues: []
exampleWasSpecified: false
@ -268,8 +281,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
database_id: 17
server_id: 29
database_id: 8
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -283,7 +296,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 8dgEk3Zv1eaVP66bDhf4ac5'
controller: null
method: null
route: null

View File

@ -12,9 +12,10 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all database users.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -32,7 +33,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -40,7 +41,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -49,12 +50,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer d4g15bV3Pa6hDvck6eaEf8Z'
controller: null
method: null
route: null
@ -70,9 +74,10 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new database user.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -90,7 +95,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -98,7 +103,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -106,7 +111,7 @@ endpoints:
name: username
description: ''
required: true
example: consequatur
example: qui
type: string
enumValues: []
exampleWasSpecified: false
@ -116,7 +121,7 @@ endpoints:
name: password
description: ''
required: true
example: 'O[2UZ5ij-e/dl4m{o,'
example: 'xYv*3,#HQ=5<w!'
type: string
enumValues: []
exampleWasSpecified: false
@ -133,19 +138,22 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
username: consequatur
password: 'O[2UZ5ij-e/dl4m{o,'
username: qui
password: 'xYv*3,#HQ=5<w!'
host: '%'
fileParameters: []
responses:
-
status: 200
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"}'
content: '{"id":null,"server_id":null,"username":"marcelle95","databases":[],"host":"%","status":null,"created_at":null,"updated_at":null}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 3vZ6f6kagacDEhV1Pde5b84'
controller: null
method: null
route: null
@ -161,9 +169,10 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a database user by ID.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -181,7 +190,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -191,7 +200,7 @@ endpoints:
name: databaseUser_id
description: 'The ID of the databaseUser.'
required: true
example: 17
example: 1
type: integer
enumValues: []
exampleWasSpecified: false
@ -199,8 +208,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
databaseUser_id: 17
server_id: 29
databaseUser_id: 1
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -209,12 +218,15 @@ endpoints:
responses:
-
status: 200
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"}'
content: '{"id":null,"server_id":null,"username":"brandi53","databases":[],"host":"%","status":null,"created_at":null,"updated_at":null}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer af3b5ac6dP8ZV4vE1hk6eDg'
controller: null
method: null
route: null
@ -230,9 +242,10 @@ endpoints:
subgroupDescription: ''
title: link
description: 'Link to databases'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -250,7 +263,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -260,7 +273,7 @@ endpoints:
name: databaseUser_id
description: 'The ID of the databaseUser.'
required: true
example: 17
example: 4
type: integer
enumValues: []
exampleWasSpecified: false
@ -268,8 +281,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
databaseUser_id: 17
server_id: 29
databaseUser_id: 4
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -277,24 +290,27 @@ endpoints:
name: databases
description: 'Array of database names to link to the user.'
required: true
example: consequatur
example: maiores
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
databases: consequatur
databases: maiores
fileParameters: []
responses:
-
status: 200
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"}'
content: '{"id":null,"server_id":null,"username":"kschmidt","databases":[],"host":"%","status":null,"created_at":null,"updated_at":null}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer b6f3Ed641gaZDcVa5k8vePh'
controller: null
method: null
route: null
@ -310,9 +326,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete database user.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -330,7 +347,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -340,7 +357,7 @@ endpoints:
name: databaseUser_id
description: 'The ID of the databaseUser.'
required: true
example: 17
example: 20
type: integer
enumValues: []
exampleWasSpecified: false
@ -348,8 +365,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
databaseUser_id: 17
server_id: 29
databaseUser_id: 20
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -363,7 +380,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer Zka6fh15g6eaV8vE34cDPdb'
controller: null
method: null
route: null

View File

@ -12,9 +12,10 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all firewall rules.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -32,7 +33,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -40,7 +41,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -49,12 +50,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer eD368kaZfVEab4v61ghdP5c'
controller: null
method: null
route: null
@ -70,9 +74,10 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new firewall rule.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -90,7 +95,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -98,7 +103,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -106,7 +111,7 @@ endpoints:
name: name
description: ''
required: true
example: consequatur
example: sapiente
type: string
enumValues: []
exampleWasSpecified: false
@ -140,7 +145,7 @@ endpoints:
name: port
description: ''
required: true
example: consequatur
example: et
type: string
enumValues: []
exampleWasSpecified: false
@ -150,7 +155,7 @@ endpoints:
name: source
description: ''
required: false
example: consequatur
example: doloribus
type: string
enumValues: []
exampleWasSpecified: false
@ -167,22 +172,25 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: consequatur
name: sapiente
type: allow
protocol: tcp
port: consequatur
source: consequatur
port: et
source: doloribus
mask: '0'
fileParameters: []
responses:
-
status: 200
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"}'
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}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 3184PbED6aacZveV6hf5dgk'
controller: null
method: null
route: null
@ -198,9 +206,10 @@ endpoints:
subgroupDescription: ''
title: edit
description: 'Update an existing firewall rule.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -218,7 +227,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -228,7 +237,7 @@ endpoints:
name: firewallRule_id
description: 'The ID of the firewallRule.'
required: true
example: 94
example: 85
type: integer
enumValues: []
exampleWasSpecified: false
@ -236,8 +245,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
firewallRule_id: 94
server_id: 29
firewallRule_id: 85
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -245,7 +254,7 @@ endpoints:
name: name
description: ''
required: true
example: consequatur
example: et
type: string
enumValues: []
exampleWasSpecified: false
@ -279,7 +288,7 @@ endpoints:
name: port
description: ''
required: true
example: consequatur
example: aut
type: string
enumValues: []
exampleWasSpecified: false
@ -289,7 +298,7 @@ endpoints:
name: source
description: ''
required: false
example: consequatur
example: et
type: string
enumValues: []
exampleWasSpecified: false
@ -306,22 +315,25 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: consequatur
name: et
type: allow
protocol: tcp
port: consequatur
source: consequatur
port: aut
source: et
mask: '0'
fileParameters: []
responses:
-
status: 200
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"}'
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}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer ad46E3egPDc51aV6hb8vkZf'
controller: null
method: null
route: null
@ -337,9 +349,10 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a firewall rule by ID.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -357,7 +370,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -367,7 +380,7 @@ endpoints:
name: firewallRule_id
description: 'The ID of the firewallRule.'
required: true
example: 94
example: 85
type: integer
enumValues: []
exampleWasSpecified: false
@ -375,8 +388,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
firewallRule_id: 94
server_id: 29
firewallRule_id: 85
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -385,12 +398,15 @@ endpoints:
responses:
-
status: 200
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"}'
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}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 6gkvbDae15a6f43EVPdZh8c'
controller: null
method: null
route: null
@ -406,9 +422,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete firewall rule.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -426,7 +443,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -436,7 +453,7 @@ endpoints:
name: firewallRule_id
description: 'The ID of the firewallRule.'
required: true
example: 94
example: 85
type: integer
enumValues: []
exampleWasSpecified: false
@ -444,8 +461,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
firewallRule_id: 94
server_id: 29
firewallRule_id: 85
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -459,7 +476,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer ZVd1fk5E3e48hDvaa6g6cPb'
controller: null
method: null
route: null

View File

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

View File

@ -12,9 +12,10 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all projects.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters: []
@ -27,12 +28,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer fbPE6haeDZ8v1gV5ak463dc'
controller: null
method: null
route: null
@ -48,9 +52,10 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new project.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters: []
@ -62,24 +67,27 @@ endpoints:
name: name
description: 'The name of the project.'
required: true
example: consequatur
example: dignissimos
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
name: consequatur
name: dignissimos
fileParameters: []
responses:
-
status: 200
content: '{"id":3,"name":"Dr. Cornelius Luettgen V","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
content: '{"id":3,"name":"Pattie Cole","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 6ZkedcEfa5V6Dv4ab8P3g1h'
controller: null
method: null
route: null
@ -95,9 +103,10 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a project by ID.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -121,12 +130,15 @@ endpoints:
responses:
-
status: 200
content: '{"id":3,"name":"Orville Satterfield","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
content: '{"id":3,"name":"Mr. Elias Bauch","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer P6ka4Zaefgh8Ec3dV15v6bD'
controller: null
method: null
route: null
@ -142,9 +154,10 @@ endpoints:
subgroupDescription: ''
title: update
description: 'Update project.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -167,24 +180,27 @@ endpoints:
name: name
description: 'The name of the project.'
required: true
example: consequatur
example: sunt
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
name: consequatur
name: sunt
fileParameters: []
responses:
-
status: 200
content: '{"id":3,"name":"Dr. Cornelius Luettgen V","created_at":"2025-04-21T18:40:19.000000Z","updated_at":"2025-04-21T18:40:19.000000Z"}'
content: '{"id":3,"name":"Elfrieda Jakubowski","created_at":"2025-04-05T17:48:03.000000Z","updated_at":"2025-04-05T17:48:03.000000Z"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer ecaDZkf5E4vgP1V86d6hb3a'
controller: null
method: null
route: null
@ -200,9 +216,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete project.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -231,7 +248,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer h5gZ63DPVbcevE4faka86d1'
controller: null
method: null
route: null

View File

@ -12,9 +12,10 @@ endpoints:
subgroupDescription: ''
title: index
description: 'Get all redirects.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -32,7 +33,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -42,7 +43,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 17
example: 44
type: integer
enumValues: []
exampleWasSpecified: false
@ -50,8 +51,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
site_id: 17
server_id: 29
site_id: 44
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -60,12 +61,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer cV16fevgEZhPadD43685akb'
controller: null
method: null
route: null
@ -81,9 +85,10 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new redirect.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -101,7 +106,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -111,7 +116,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 17
example: 44
type: integer
enumValues: []
exampleWasSpecified: false
@ -119,8 +124,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
site_id: 17
server_id: 29
site_id: 44
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -128,7 +133,7 @@ endpoints:
name: from
description: ''
required: true
example: consequatur
example: odit
type: string
enumValues: []
exampleWasSpecified: false
@ -138,7 +143,7 @@ endpoints:
name: to
description: ''
required: true
example: consequatur
example: incidunt
type: string
enumValues: []
exampleWasSpecified: false
@ -148,7 +153,7 @@ endpoints:
name: mode
description: ''
required: true
example: 302
example: 301
type: string
enumValues:
- 301
@ -159,9 +164,9 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
from: consequatur
to: consequatur
mode: 302
from: odit
to: incidunt
mode: 301
fileParameters: []
responses:
-
@ -171,7 +176,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer ZD45hPk638abev61EVcagdf'
controller: null
method: null
route: null
@ -187,9 +195,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete a redirect.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -207,7 +216,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -217,7 +226,7 @@ endpoints:
name: site_id
description: 'The ID of the site.'
required: true
example: 17
example: 44
type: integer
enumValues: []
exampleWasSpecified: false
@ -235,8 +244,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
site_id: 17
server_id: 29
site_id: 44
redirect_id: 9
queryParameters: []
cleanQueryParameters: []
@ -251,7 +260,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer Ec3fDgdbae615aPh8k6vV4Z'
controller: null
method: null
route: null

View File

@ -12,9 +12,10 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all servers in a project.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -38,12 +39,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer Pg1Vk6cvadD8eb3ZhaEf564'
controller: null
method: null
route: null
@ -59,9 +63,10 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Create a new server.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -84,7 +89,7 @@ endpoints:
name: provider
description: 'The server provider type'
required: true
example: consequatur
example: fugiat
type: string
enumValues: []
exampleWasSpecified: false
@ -94,7 +99,7 @@ endpoints:
name: server_provider
description: 'If the provider is not custom, the ID of the server provider profile'
required: true
example: hetzner
example: digitalocean
type: string
enumValues:
- custom
@ -109,7 +114,7 @@ endpoints:
name: region
description: 'Provider region if the provider is not custom'
required: true
example: consequatur
example: itaque
type: string
enumValues: []
exampleWasSpecified: false
@ -119,7 +124,7 @@ endpoints:
name: plan
description: 'Provider plan if the provider is not custom'
required: true
example: consequatur
example: voluptatum
type: string
enumValues: []
exampleWasSpecified: false
@ -129,7 +134,7 @@ endpoints:
name: ip
description: 'SSH IP address if the provider is custom'
required: true
example: consequatur
example: ut
type: string
enumValues: []
exampleWasSpecified: false
@ -139,7 +144,7 @@ endpoints:
name: port
description: 'SSH Port if the provider is custom'
required: true
example: consequatur
example: reiciendis
type: string
enumValues: []
exampleWasSpecified: false
@ -149,7 +154,7 @@ endpoints:
name: name
description: 'The name of the server.'
required: true
example: consequatur
example: et
type: string
enumValues: []
exampleWasSpecified: false
@ -159,7 +164,7 @@ endpoints:
name: os
description: 'The os of the server'
required: true
example: consequatur
example: vel
type: string
enumValues: []
exampleWasSpecified: false
@ -169,7 +174,7 @@ endpoints:
name: webserver
description: 'Web server'
required: true
example: none
example: nginx
type: string
enumValues:
- none
@ -181,7 +186,7 @@ endpoints:
name: database
description: Database
required: true
example: mariadb104
example: mysql80
type: string
enumValues:
- none
@ -202,7 +207,7 @@ endpoints:
name: php
description: 'PHP version'
required: true
example: '8.0'
example: '7.2'
type: string
enumValues:
- '7.0'
@ -218,27 +223,30 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
provider: consequatur
server_provider: hetzner
region: consequatur
plan: consequatur
ip: consequatur
port: consequatur
name: consequatur
os: consequatur
webserver: none
database: mariadb104
php: '8.0'
provider: fugiat
server_provider: digitalocean
region: itaque
plan: voluptatum
ip: ut
port: reiciendis
name: et
os: vel
webserver: nginx
database: mysql80
php: '7.2'
fileParameters: []
responses:
-
status: 200
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"}'
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}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 5E61e4vfcgDbVkZd68aah3P'
controller: null
method: null
route: null
@ -254,9 +262,10 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a server by ID.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -274,7 +283,7 @@ endpoints:
name: id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -282,7 +291,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
id: 32
id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -291,12 +300,15 @@ endpoints:
responses:
-
status: 200
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"}'
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}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer hV3debf65aPD4E1ckag8Z6v'
controller: null
method: null
route: null
@ -312,9 +324,10 @@ endpoints:
subgroupDescription: ''
title: reboot
description: 'Reboot a server.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -332,7 +345,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -340,7 +353,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -354,7 +367,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer b61aD6538PacZEkeghfvV4d'
controller: null
method: null
route: null
@ -370,9 +386,10 @@ endpoints:
subgroupDescription: ''
title: upgrade
description: 'Upgrade server.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -390,7 +407,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -398,7 +415,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -412,7 +429,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer dEZaa6cePVf3k86g45vbD1h'
controller: null
method: null
route: null
@ -428,9 +448,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete server.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -448,7 +469,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -456,7 +477,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -470,7 +491,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 6aDkZEfdP16V58gb43avhec'
controller: null
method: null
route: null

View File

@ -12,9 +12,10 @@ endpoints:
subgroupDescription: ''
title: list
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -38,12 +39,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 3evaP8h6VEZkbfgaD6d1c45'
controller: null
method: null
route: null
@ -59,9 +63,10 @@ endpoints:
subgroupDescription: ''
title: create
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -84,7 +89,7 @@ endpoints:
name: provider
description: 'The provider (aws, linode, hetzner, digitalocean, vultr, ...)'
required: true
example: consequatur
example: corrupti
type: string
enumValues: []
exampleWasSpecified: false
@ -94,7 +99,7 @@ endpoints:
name: name
description: 'The name of the server provider.'
required: true
example: consequatur
example: est
type: string
enumValues: []
exampleWasSpecified: false
@ -104,7 +109,7 @@ endpoints:
name: token
description: 'The token if provider requires api token'
required: true
example: consequatur
example: rerum
type: string
enumValues: []
exampleWasSpecified: false
@ -114,7 +119,7 @@ endpoints:
name: key
description: 'The key if provider requires key'
required: true
example: consequatur
example: ut
type: string
enumValues: []
exampleWasSpecified: false
@ -124,28 +129,31 @@ endpoints:
name: secret
description: 'The secret if provider requires key'
required: true
example: consequatur
example: sed
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
provider: consequatur
name: consequatur
token: consequatur
key: consequatur
secret: consequatur
provider: corrupti
name: est
token: rerum
key: ut
secret: sed
fileParameters: []
responses:
-
status: 200
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"}'
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"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 6g6vfEck83VaPhd5Zabe1D4'
controller: null
method: null
route: null
@ -161,9 +169,10 @@ endpoints:
subgroupDescription: ''
title: show
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -198,12 +207,15 @@ endpoints:
responses:
-
status: 200
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"}'
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"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer va63cDe8dPf5Z4Vahb1E6kg'
controller: null
method: null
route: null
@ -219,9 +231,10 @@ endpoints:
subgroupDescription: ''
title: update
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -255,7 +268,7 @@ endpoints:
name: name
description: 'The name of the server provider.'
required: true
example: consequatur
example: earum
type: string
enumValues: []
exampleWasSpecified: false
@ -274,18 +287,21 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: consequatur
name: earum
global: false
fileParameters: []
responses:
-
status: 200
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"}'
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"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 4e1dghaV6D856P3ZbfkcEva'
controller: null
method: null
route: null
@ -301,9 +317,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -343,7 +360,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer fcVa8ev63gP5DaZbkdhE461'
controller: null
method: null
route: null

View File

@ -12,9 +12,10 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all ssh keys.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -32,7 +33,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -40,7 +41,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -49,12 +50,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 165aZvb46PhacEfke83dVgD'
controller: null
method: null
route: null
@ -70,9 +74,10 @@ endpoints:
subgroupDescription: ''
title: create
description: 'Deploy ssh key to server.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -90,7 +95,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -98,7 +103,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters:
@ -106,7 +111,7 @@ endpoints:
name: key_id
description: 'The ID of the key.'
required: true
example: consequatur
example: explicabo
type: string
enumValues: []
exampleWasSpecified: false
@ -116,7 +121,7 @@ endpoints:
name: name
description: 'Key name, required if key_id is not provided.'
required: true
example: consequatur
example: deleniti
type: string
enumValues: []
exampleWasSpecified: false
@ -126,26 +131,29 @@ endpoints:
name: public_key
description: 'Public Key, required if key_id is not provided.'
required: true
example: consequatur
example: sapiente
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
key_id: consequatur
name: consequatur
public_key: consequatur
key_id: explicabo
name: deleniti
public_key: sapiente
fileParameters: []
responses:
-
status: 200
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"}'
content: '{"id":null,"user":null,"name":"Mr. Reagan Jacobson V","created_at":null,"updated_at":null}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer deDkf4E13PZb6cgaV58ha6v'
controller: null
method: null
route: null
@ -161,9 +169,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete ssh key from server.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -181,7 +190,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -199,7 +208,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
sshKey_id: 1
queryParameters: []
cleanQueryParameters: []
@ -214,7 +223,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer ec48fgVdZ6ah3kvPD16E5ab'
controller: null
method: null
route: null

View File

@ -12,9 +12,10 @@ endpoints:
subgroupDescription: ''
title: list
description: 'Get all services.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -32,7 +33,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -40,7 +41,7 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
server_id: 29
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -49,12 +50,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer gVEce46k8aZfaP3d15vbhD6'
controller: null
method: null
route: null
@ -70,9 +74,10 @@ endpoints:
subgroupDescription: ''
title: show
description: 'Get a service by ID.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -90,7 +95,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -100,7 +105,7 @@ endpoints:
name: id
description: 'The ID of the service.'
required: true
example: 184
example: 169
type: integer
enumValues: []
exampleWasSpecified: false
@ -108,8 +113,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
id: 184
server_id: 29
id: 169
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -118,12 +123,15 @@ endpoints:
responses:
-
status: 200
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}'
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}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer Ef8D5gbV6cadk3Zh1vP46ea'
controller: null
method: null
route: null
@ -139,9 +147,10 @@ endpoints:
subgroupDescription: ''
title: start
description: 'Start service.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -159,7 +168,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -169,7 +178,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 184
example: 169
type: integer
enumValues: []
exampleWasSpecified: false
@ -177,8 +186,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
service_id: 184
server_id: 29
service_id: 169
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -192,7 +201,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer b3DckZ8g6ha6aPe4f5V1vdE'
controller: null
method: null
route: null
@ -208,9 +220,10 @@ endpoints:
subgroupDescription: ''
title: stop
description: 'Stop service.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -228,7 +241,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -238,7 +251,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 184
example: 169
type: integer
enumValues: []
exampleWasSpecified: false
@ -246,8 +259,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
service_id: 184
server_id: 29
service_id: 169
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -261,7 +274,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer 1e8aZbfvE5643DacgkPhdV6'
controller: null
method: null
route: null
@ -277,9 +293,10 @@ endpoints:
subgroupDescription: ''
title: restart
description: 'Restart service.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -297,7 +314,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -307,7 +324,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 184
example: 169
type: integer
enumValues: []
exampleWasSpecified: false
@ -315,8 +332,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
service_id: 184
server_id: 29
service_id: 169
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -330,7 +347,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer c46baVZEg5dv1Pfe8Dha6k3'
controller: null
method: null
route: null
@ -346,9 +366,10 @@ endpoints:
subgroupDescription: ''
title: enable
description: 'Enable service.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -366,7 +387,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -376,7 +397,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 184
example: 169
type: integer
enumValues: []
exampleWasSpecified: false
@ -384,8 +405,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
service_id: 184
server_id: 29
service_id: 169
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -399,7 +420,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer EvcehkDbdV43f61P86Za5ga'
controller: null
method: null
route: null
@ -415,9 +439,10 @@ endpoints:
subgroupDescription: ''
title: disable
description: 'Disable service.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -435,7 +460,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -445,7 +470,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 184
example: 169
type: integer
enumValues: []
exampleWasSpecified: false
@ -453,8 +478,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
service_id: 184
server_id: 29
service_id: 169
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -468,7 +493,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer k8E5gf6d4h31bevaa6cVPZD'
controller: null
method: null
route: null
@ -484,9 +512,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: 'Delete service.'
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -504,7 +533,7 @@ endpoints:
name: server_id
description: 'The ID of the server.'
required: true
example: 32
example: 29
type: integer
enumValues: []
exampleWasSpecified: false
@ -514,7 +543,7 @@ endpoints:
name: service_id
description: 'The ID of the service.'
required: true
example: 184
example: 169
type: integer
enumValues: []
exampleWasSpecified: false
@ -522,8 +551,8 @@ endpoints:
custom: []
cleanUrlParameters:
project_id: 1
server_id: 32
service_id: 184
server_id: 29
service_id: 169
queryParameters: []
cleanQueryParameters: []
bodyParameters: []
@ -537,7 +566,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer Pekav16cd5ag486ZfD3EVbh'
controller: null
method: null
route: null

View File

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

View File

@ -12,9 +12,10 @@ endpoints:
subgroupDescription: ''
title: list
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -38,12 +39,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer e3f4ag8hkb5vZcDadPEV661'
controller: null
method: null
route: null
@ -59,9 +63,10 @@ endpoints:
subgroupDescription: ''
title: create
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -97,7 +102,7 @@ endpoints:
name: name
description: 'The name of the storage provider.'
required: true
example: consequatur
example: molestias
type: string
enumValues: []
exampleWasSpecified: false
@ -107,7 +112,7 @@ endpoints:
name: token
description: 'The token if provider requires api token'
required: true
example: consequatur
example: in
type: string
enumValues: []
exampleWasSpecified: false
@ -117,7 +122,7 @@ endpoints:
name: url
description: 'The URL if the provider is Gitlab and it is self-hosted'
required: true
example: 'http://kunze.biz/iste-laborum-eius-est-dolor.html'
example: 'https://www.white.com/aperiam-dolor-nemo-qui-rerum-quod-quas'
type: string
enumValues: []
exampleWasSpecified: false
@ -127,7 +132,7 @@ endpoints:
name: username
description: 'The username if the provider is Bitbucket'
required: true
example: consequatur
example: consectetur
type: string
enumValues: []
exampleWasSpecified: false
@ -137,7 +142,7 @@ endpoints:
name: password
description: 'The password if the provider is Bitbucket'
required: true
example: 'O[2UZ5ij-e/dl4m{o,'
example: 'y*P4_]ZdjE_:'
type: string
enumValues: []
exampleWasSpecified: false
@ -145,21 +150,24 @@ endpoints:
custom: []
cleanBodyParameters:
provider: gitlab
name: consequatur
token: consequatur
url: 'http://kunze.biz/iste-laborum-eius-est-dolor.html'
username: consequatur
password: 'O[2UZ5ij-e/dl4m{o,'
name: molestias
token: in
url: 'https://www.white.com/aperiam-dolor-nemo-qui-rerum-quod-quas'
username: consectetur
password: 'y*P4_]ZdjE_:'
fileParameters: []
responses:
-
status: 200
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"}'
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"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer DfegP56vkEa364Zbhda8V1c'
controller: null
method: null
route: null
@ -175,9 +183,10 @@ endpoints:
subgroupDescription: ''
title: show
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -212,12 +221,15 @@ endpoints:
responses:
-
status: 200
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"}'
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"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer ePc6fb65vh1Z4aakE3Dgd8V'
controller: null
method: null
route: null
@ -233,9 +245,10 @@ endpoints:
subgroupDescription: ''
title: update
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -269,7 +282,7 @@ endpoints:
name: name
description: 'The name of the storage provider.'
required: true
example: consequatur
example: non
type: string
enumValues: []
exampleWasSpecified: false
@ -279,7 +292,7 @@ endpoints:
name: token
description: 'The token if provider requires api token'
required: true
example: consequatur
example: sunt
type: string
enumValues: []
exampleWasSpecified: false
@ -289,7 +302,7 @@ endpoints:
name: url
description: 'The URL if the provider is Gitlab and it is self-hosted'
required: true
example: 'http://kunze.biz/iste-laborum-eius-est-dolor.html'
example: 'https://www.frami.org/ex-at-minus-rerum-quo-minus-ea'
type: string
enumValues: []
exampleWasSpecified: false
@ -299,7 +312,7 @@ endpoints:
name: username
description: 'The username if the provider is Bitbucket'
required: true
example: consequatur
example: natus
type: string
enumValues: []
exampleWasSpecified: false
@ -309,7 +322,7 @@ endpoints:
name: password
description: 'The password if the provider is Bitbucket'
required: true
example: 'O[2UZ5ij-e/dl4m{o,'
example: 'A^">*m{p]DI'
type: string
enumValues: []
exampleWasSpecified: false
@ -319,7 +332,7 @@ endpoints:
name: global
description: 'Accessible in all projects'
required: true
example: false
example: true
type: string
enumValues:
- true
@ -328,22 +341,25 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: consequatur
token: consequatur
url: 'http://kunze.biz/iste-laborum-eius-est-dolor.html'
username: consequatur
password: 'O[2UZ5ij-e/dl4m{o,'
global: false
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
fileParameters: []
responses:
-
status: 200
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"}'
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"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer v3f6aaPk61Ze8hVdDbE5g4c'
controller: null
method: null
route: null
@ -359,9 +375,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -401,7 +418,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer fgk61vD68E4cZhP3bV5adea'
controller: null
method: null
route: null

View File

@ -12,9 +12,10 @@ endpoints:
subgroupDescription: ''
title: list
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -38,12 +39,15 @@ endpoints:
responses:
-
status: 200
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}}'
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}}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer fgh4eV31dP58kvaDEaZbc66'
controller: null
method: null
route: null
@ -59,9 +63,10 @@ endpoints:
subgroupDescription: ''
title: create
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -84,7 +89,7 @@ endpoints:
name: provider
description: 'The provider (aws, linode, hetzner, digitalocean, vultr, ...)'
required: true
example: consequatur
example: ab
type: string
enumValues: []
exampleWasSpecified: false
@ -94,7 +99,7 @@ endpoints:
name: name
description: 'The name of the storage provider.'
required: true
example: consequatur
example: quo
type: string
enumValues: []
exampleWasSpecified: false
@ -104,7 +109,7 @@ endpoints:
name: token
description: 'The token if provider requires api token'
required: true
example: consequatur
example: in
type: string
enumValues: []
exampleWasSpecified: false
@ -114,7 +119,7 @@ endpoints:
name: key
description: 'The key if provider requires key'
required: true
example: consequatur
example: sunt
type: string
enumValues: []
exampleWasSpecified: false
@ -124,28 +129,31 @@ endpoints:
name: secret
description: 'The secret if provider requires key'
required: true
example: consequatur
example: molestias
type: string
enumValues: []
exampleWasSpecified: false
nullable: false
custom: []
cleanBodyParameters:
provider: consequatur
name: consequatur
token: consequatur
key: consequatur
secret: consequatur
provider: ab
name: quo
token: in
key: sunt
secret: molestias
fileParameters: []
responses:
-
status: 200
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"}'
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"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer e584613dkZaPDEVvgcahbf6'
controller: null
method: null
route: null
@ -161,9 +169,10 @@ endpoints:
subgroupDescription: ''
title: show
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -198,12 +207,15 @@ endpoints:
responses:
-
status: 200
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"}'
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"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer h6Zk6834dDce5fbPa1VvagE'
controller: null
method: null
route: null
@ -219,9 +231,10 @@ endpoints:
subgroupDescription: ''
title: update
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -255,7 +268,7 @@ endpoints:
name: name
description: 'The name of the storage provider.'
required: true
example: consequatur
example: voluptas
type: string
enumValues: []
exampleWasSpecified: false
@ -274,18 +287,21 @@ endpoints:
nullable: false
custom: []
cleanBodyParameters:
name: consequatur
name: voluptas
global: true
fileParameters: []
responses:
-
status: 200
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"}'
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"}'
headers: []
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer ak6fgd1Eba48chvPV3e5Z6D'
controller: null
method: null
route: null
@ -301,9 +317,10 @@ endpoints:
subgroupDescription: ''
title: delete
description: ''
authenticated: false
authenticated: true
custom: []
headers:
Authorization: 'Bearer YOUR-API-KEY'
Content-Type: application/json
Accept: application/json
urlParameters:
@ -343,7 +360,10 @@ endpoints:
description: ''
custom: []
responseFields: []
auth: []
auth:
- headers
- Authorization
- 'Bearer PcaDbh6ZE4aV1e8fdv56k3g'
controller: null
method: null
route: null

View File

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

View File

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

View File

@ -17,7 +17,6 @@
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;
@ -30,8 +29,6 @@ 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,7 +8,6 @@
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;
@ -21,8 +20,6 @@ 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

@ -7,4 +7,6 @@ final class Webserver
const NONE = 'none';
const NGINX = 'nginx';
const CADDY = 'caddy';
}

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(mixed $commands)
* @method static string assertExecuted(array<int, string>|string $commands)
* @method static string assertExecutedContains(string $command)
* @method static string assertFileUploaded(string $toPath, ?string $content = null)
* @method static string getUploadedLocalPath()

View File

@ -52,7 +52,7 @@ public function index(Project $project): ResourceCollection
#[BodyParam(name: 'port', description: 'SSH Port if the provider is custom')]
#[BodyParam(name: 'name', description: 'The name of the server.', required: true)]
#[BodyParam(name: 'os', description: 'The os of the server', required: true)]
#[BodyParam(name: 'webserver', description: 'Web server', required: true, enum: [Webserver::NONE, Webserver::NGINX])]
#[BodyParam(name: 'webserver', description: 'Web server', required: true, enum: [Webserver::NONE, Webserver::NGINX, Webserver::CADDY])]
#[BodyParam(name: 'database', description: 'Database', required: true, enum: [Database::NONE, Database::MYSQL57, Database::MYSQL80, Database::MARIADB103, Database::MARIADB104, Database::MARIADB103, Database::POSTGRESQL12, Database::POSTGRESQL13, Database::POSTGRESQL14, Database::POSTGRESQL15, Database::POSTGRESQL16], )]
#[BodyParam(name: 'php', description: 'PHP version', required: true, enum: [PHP::V70, PHP::V71, PHP::V72, PHP::V73, PHP::V74, PHP::V80, PHP::V81, PHP::V82, PHP::V83])]
#[ResponseFromApiResource(ServerResource::class, Server::class)]

View File

@ -1,88 +0,0 @@
<?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

@ -1,43 +0,0 @@
<?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

@ -1,69 +0,0 @@
<?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

@ -1,41 +0,0 @@
<?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

@ -1,19 +0,0 @@
<?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

@ -1,90 +0,0 @@
<?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

@ -1,22 +0,0 @@
<?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

@ -1,91 +0,0 @@
<?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

@ -1,27 +0,0 @@
<?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

@ -1,57 +0,0 @@
<?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,9 +36,6 @@ 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,7 +9,10 @@
class CanSeeProjectMiddleware
{
public function handle(Request $request, Closure $next): mixed
/**
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
/** @var User $user */
$user = $request->user();

View File

@ -1,23 +0,0 @@
<?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

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,123 @@
<?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

@ -3,5 +3,37 @@
namespace App\SSH\Services\Webserver;
use App\SSH\Services\AbstractService;
use Closure;
abstract class AbstractWebserver extends AbstractService implements Webserver {}
abstract class AbstractWebserver extends AbstractService implements Webserver
{
public function creationRules(array $input): array
{
return [
'type' => [
'required',
function (string $attribute, mixed $value, Closure $fail): void {
$webserverExists = $this->service->server->webserver();
if ($webserverExists) {
$fail('You already have a webserver service on the server.');
}
},
],
];
}
public function deletionRules(): array
{
return [
'service' => [
function (string $attribute, mixed $value, Closure $fail): void {
$hasSite = $this->service->server->sites()
->exists();
if ($hasSite) {
$fail('Cannot uninstall webserver while you have websites using it.');
}
},
],
];
}
}

View File

@ -0,0 +1,195 @@
<?php
namespace App\SSH\Services\Webserver;
use App\Exceptions\SSHError;
use App\Exceptions\SSLCreationException;
use App\Models\Site;
use App\Models\Ssl;
use Throwable;
class Caddy extends AbstractWebserver
{
/**
* @throws SSHError
*/
public function install(): void
{
$this->service->server->ssh()->exec(
view('ssh.services.webserver.caddy.install-caddy'),
'install-caddy'
);
$this->service->server->ssh()->write(
'/etc/caddy/Caddyfile',
view('ssh.services.webserver.caddy.caddy'),
'root'
);
$this->service->server->ssh()->write(
'/etc/systemd/system/caddy.service',
view('ssh.services.webserver.caddy.caddy-systemd'),
'root'
);
$this->service->server->systemd()->reload();
$this->service->server->systemd()->restart('caddy');
$this->service->server->os()->cleanup();
}
/**
* @throws SSHError
*/
public function uninstall(): void
{
$this->service->server->ssh()->exec(
view('ssh.services.webserver.caddy.uninstall-caddy'),
'uninstall-caddy'
);
$this->service->server->os()->cleanup();
}
/**
* @throws SSHError
*/
public function createVHost(Site $site): void
{
// We need to get the isolated user first, if the site is isolated
// otherwise, use the default ssh user
$ssh = $this->service->server->ssh($site->user);
$ssh->exec(
view('ssh.services.webserver.caddy.create-path', [
'path' => $site->path,
]),
'create-path',
$site->id
);
$this->service->server->ssh()->write(
'/etc/caddy/sites-available/'.$site->domain,
$this->generateVhost($site),
'root'
);
$this->service->server->ssh()->exec(
view('ssh.services.webserver.caddy.create-vhost', [
'domain' => $site->domain,
]),
'create-vhost',
$site->id
);
}
/**
* @throws SSHError
*/
public function updateVHost(Site $site, ?string $vhost = null): void
{
$this->service->server->ssh()->write(
'/etc/caddy/sites-available/'.$site->domain,
$vhost ?? $this->generateVhost($site),
'root'
);
$this->service->server->systemd()->restart('caddy');
}
/**
* @throws SSHError
*/
public function getVHost(Site $site): string
{
return $this->service->server->ssh()->exec(
view('ssh.services.webserver.caddy.get-vhost', [
'domain' => $site->domain,
]),
);
}
/**
* @throws SSHError
*/
public function deleteSite(Site $site): void
{
$this->service->server->ssh()->exec(
view('ssh.services.webserver.caddy.delete-site', [
'domain' => $site->domain,
'path' => $site->path,
]),
'delete-vhost',
$site->id
);
$this->service->restart();
}
/**
* @throws SSHError
*/
public function changePHPVersion(Site $site, string $version): void
{
$this->service->server->ssh()->exec(
view('ssh.services.webserver.caddy.change-php-version', [
'domain' => $site->domain,
'oldVersion' => $site->php_version,
'newVersion' => $version,
]),
'change-php-version',
$site->id
);
}
/**
* @throws SSHError
*/
public function setupSSL(Ssl $ssl): void
{
if ($ssl->type == 'custom') {
$ssl->certificate_path = '/etc/ssl/'.$ssl->id.'/cert.pem';
$ssl->pk_path = '/etc/ssl/'.$ssl->id.'/privkey.pem';
$ssl->save();
$command = view('ssh.services.webserver.caddy.create-custom-ssl', [
'path' => dirname($ssl->certificate_path),
'certificate' => $ssl->certificate,
'pk' => $ssl->pk,
'certificatePath' => $ssl->certificate_path,
'pkPath' => $ssl->pk_path,
]);
$result = $this->service->server->ssh()->setLog($ssl->log)->exec(
$command,
'create-ssl',
$ssl->site_id
);
if (! $ssl->validateSetup($result)) {
throw new SSLCreationException;
}
}
}
/**
* @throws Throwable
*/
public function removeSSL(Ssl $ssl): void
{
if ($ssl->certificate_path) {
$this->service->server->ssh()->exec(
'sudo rm -rf '.dirname($ssl->certificate_path),
'remove-ssl',
$ssl->site_id
);
}
$this->updateVHost($ssl->site);
}
private function generateVhost(Site $site): string
{
$vhost = view('ssh.services.webserver.caddy.vhost', [
'site' => $site,
]);
return format_nginx_config($vhost);
}
}

View File

@ -6,7 +6,6 @@
use App\Exceptions\SSLCreationException;
use App\Models\Site;
use App\Models\Ssl;
use Closure;
use Throwable;
class Nginx extends AbstractWebserver
@ -34,21 +33,6 @@ public function install(): void
$this->service->server->os()->cleanup();
}
public function deletionRules(): array
{
return [
'service' => [
function (string $attribute, mixed $value, Closure $fail): void {
$hasSite = $this->service->server->sites()
->exists();
if ($hasSite) {
$fail('Cannot uninstall webserver while you have websites using it.');
}
},
],
];
}
/**
* @throws SSHError
*/

View File

@ -87,4 +87,16 @@ public function disable(string $unit): string
return $this->server->ssh()->exec($command, sprintf('disable-%s', $unit));
}
/**
* @throws SSHError
*/
public function reload(): string
{
$command = <<<'EOD'
sudo systemctl daemon-reload
EOD;
return $this->server->ssh()->exec($command, 'reload-systemctl');
}
}

View File

@ -1,9 +1,12 @@
<?php
use App\Models\User;
use App\Exceptions\SSHError;
use Filament\Notifications\Actions\Action;
use Filament\Notifications\Notification;
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
{
@ -54,10 +57,6 @@ 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');
}
@ -68,13 +67,46 @@ function get_public_key_content(): string
return '';
}
$content = str($content)
return str($content)
->replace("\n", '')
->toString();
}
cache()->put('ssh_public_key_content', $content, 60 * 60 * 24);
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();
return $content;
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);
}
}
}
/**
@ -219,11 +251,3 @@ 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

@ -0,0 +1,26 @@
<?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

@ -0,0 +1,59 @@
<?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

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

View File

@ -0,0 +1,72 @@
<?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

@ -0,0 +1,27 @@
<?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

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

156
app/Web/Pages/Login.php Normal file
View File

@ -0,0 +1,156 @@
<?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

@ -0,0 +1,83 @@
<?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

@ -0,0 +1,78 @@
<?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

@ -0,0 +1,87 @@
<?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

@ -0,0 +1,100 @@
<?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

@ -0,0 +1,46 @@
<?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

@ -0,0 +1,19 @@
<?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

@ -0,0 +1,31 @@
<?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

@ -0,0 +1,87 @@
<?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

@ -0,0 +1,116 @@
<?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

@ -0,0 +1,99 @@
<?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

@ -0,0 +1,163 @@
<?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

@ -0,0 +1,50 @@
<?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

@ -0,0 +1,96 @@
<?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

@ -0,0 +1,136 @@
<?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

@ -0,0 +1,160 @@
<?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

@ -0,0 +1,145 @@
<?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

@ -0,0 +1,81 @@
<?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

@ -0,0 +1,29 @@
<?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

@ -0,0 +1,379 @@
<?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

@ -0,0 +1,133 @@
<?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

@ -0,0 +1,130 @@
<?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

@ -0,0 +1,251 @@
<?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

@ -0,0 +1,34 @@
<?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 [];
}
}

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