coolipy.resources.databases
Databases resource clients (sync + async).
1"""Databases resource clients (sync + async).""" 2 3from __future__ import annotations 4 5from typing import Any 6 7from coolipy._base import AsyncResourceBase, ResourceBase 8from coolipy._response import CoolipyAPIResponse 9from coolipy.exceptions import CoolipyValidationError 10from coolipy.models.common import ( 11 BulkEnvsUpdate, 12 DeploymentQueuedResponse, 13 EnvironmentVariable, 14 EnvironmentVariableCreate, 15 EnvironmentVariableUpdate, 16 Logs, 17 MessageResponse, 18 StorageCreate, 19 StorageUpdate, 20 Tag, 21 TagsCreate, 22 UUIDResponse, 23 VolumeBackupScheduleRequest, 24 VolumeBackupScheduleResponse, 25) 26from coolipy.models.databases import ( 27 ClickhouseModelCreate, 28 DatabaseBackupCreate, 29 DatabaseModel, 30 DatabaseUpdateModel, 31 DragonflyModelCreate, 32 KeyDBModelCreate, 33 MariaDBModelCreate, 34 MongoDBModelCreate, 35 MySQLModelCreate, 36 PostgreSQLModelCreate, 37 RedisModelCreate, 38) 39 40DatabaseList = list[DatabaseModel] 41EnvironmentVariableList = list[EnvironmentVariable] 42TagList = list[Tag] 43 44_DATABASE_CREATE_PATHS: dict[type, str] = { 45 PostgreSQLModelCreate: "/databases/postgresql", 46 MySQLModelCreate: "/databases/mysql", 47 MariaDBModelCreate: "/databases/mariadb", 48 MongoDBModelCreate: "/databases/mongodb", 49 RedisModelCreate: "/databases/redis", 50 ClickhouseModelCreate: "/databases/clickhouse", 51 DragonflyModelCreate: "/databases/dragonfly", 52 KeyDBModelCreate: "/databases/keydb", 53} 54 55 56def _dump(model: Any) -> dict[str, Any]: 57 return model.model_dump(mode="json", exclude_none=True) 58 59 60class Databases(ResourceBase): 61 """Synchronous client for Coolify databases.""" 62 63 def list(self) -> CoolipyAPIResponse[DatabaseList]: 64 """List all databases.""" 65 return self._get("/databases", response_model=list[DatabaseModel]) 66 67 def get(self, uuid: str) -> CoolipyAPIResponse[DatabaseModel]: 68 """Get a database by UUID.""" 69 return self._get(f"/databases/{uuid}", response_model=DatabaseModel) 70 71 def create(self, model: Any) -> CoolipyAPIResponse[Any]: 72 """Create a database from one of the supported create models.""" 73 path = _DATABASE_CREATE_PATHS.get(type(model)) 74 if path is None: 75 raise CoolipyValidationError( 76 f"Unsupported database create model: {type(model).__name__}" 77 ) 78 return self._post(path, json=_dump(model)) 79 80 def update(self, uuid: str, model: DatabaseUpdateModel) -> CoolipyAPIResponse[Any]: 81 """Update a database by UUID.""" 82 return self._patch(f"/databases/{uuid}", json=_dump(model)) 83 84 def delete( 85 self, 86 uuid: str, 87 *, 88 delete_configurations: bool = True, 89 delete_volumes: bool = True, 90 docker_cleanup: bool = True, 91 delete_connected_networks: bool = True, 92 ) -> CoolipyAPIResponse[MessageResponse]: 93 """Delete a database by UUID.""" 94 params = { 95 "delete_configurations": delete_configurations, 96 "delete_volumes": delete_volumes, 97 "docker_cleanup": docker_cleanup, 98 "delete_connected_networks": delete_connected_networks, 99 } 100 return self._delete(f"/databases/{uuid}", params=params, response_model=MessageResponse) 101 102 def backups(self, uuid: str) -> CoolipyAPIResponse[Any]: 103 """List scheduled backups for a database.""" 104 return self._get(f"/databases/{uuid}/backups") 105 106 def create_backup(self, uuid: str, model: DatabaseBackupCreate) -> CoolipyAPIResponse[dict]: 107 """Create a scheduled backup configuration for a database.""" 108 return self._post(f"/databases/{uuid}/backups", json=_dump(model), response_model=dict) 109 110 def update_backup( 111 self, uuid: str, scheduled_backup_uuid: str, model: DatabaseBackupCreate 112 ) -> CoolipyAPIResponse[Any]: 113 """Update a scheduled backup configuration.""" 114 return self._patch(f"/databases/{uuid}/backups/{scheduled_backup_uuid}", json=_dump(model)) 115 116 def delete_backup(self, uuid: str, scheduled_backup_uuid: str) -> CoolipyAPIResponse[Any]: 117 """Delete a scheduled backup configuration.""" 118 return self._delete(f"/databases/{uuid}/backups/{scheduled_backup_uuid}") 119 120 def backup_executions(self, uuid: str, scheduled_backup_uuid: str) -> CoolipyAPIResponse[Any]: 121 """List executions of a scheduled backup.""" 122 return self._get(f"/databases/{uuid}/backups/{scheduled_backup_uuid}/executions") 123 124 def delete_backup_execution( 125 self, uuid: str, scheduled_backup_uuid: str, execution_uuid: str 126 ) -> CoolipyAPIResponse[Any]: 127 """Delete a backup execution.""" 128 return self._delete( 129 f"/databases/{uuid}/backups/{scheduled_backup_uuid}/executions/{execution_uuid}" 130 ) 131 132 def logs(self, uuid: str) -> CoolipyAPIResponse[Logs]: 133 """Get database logs.""" 134 return self._get(f"/databases/{uuid}/logs", response_model=Logs) 135 136 def move(self, uuid: str, environment_uuid: str) -> CoolipyAPIResponse[dict]: 137 """Move a database to another environment.""" 138 return self._post( 139 f"/databases/{uuid}/move", 140 json={"environment_uuid": environment_uuid}, 141 response_model=dict, 142 ) 143 144 def migrate( 145 self, uuid: str, destination_uuid: str, *, migrate_volumes: bool = True 146 ) -> CoolipyAPIResponse[Any]: 147 """Migrate a database to another destination/server.""" 148 body = {"destination_uuid": destination_uuid, "migrate_volumes": migrate_volumes} 149 return self._post(f"/databases/{uuid}/migrate", json=body) 150 151 def start(self, uuid: str) -> CoolipyAPIResponse[DeploymentQueuedResponse]: 152 """Start a database.""" 153 return self._post(f"/databases/{uuid}/start", response_model=DeploymentQueuedResponse) 154 155 def stop(self, uuid: str) -> CoolipyAPIResponse[MessageResponse]: 156 """Stop a database.""" 157 return self._post(f"/databases/{uuid}/stop", response_model=MessageResponse) 158 159 def restart(self, uuid: str) -> CoolipyAPIResponse[DeploymentQueuedResponse]: 160 """Restart a database.""" 161 return self._post(f"/databases/{uuid}/restart", response_model=DeploymentQueuedResponse) 162 163 def envs(self, uuid: str) -> CoolipyAPIResponse[EnvironmentVariableList]: 164 """List environment variables for a database.""" 165 return self._get(f"/databases/{uuid}/envs", response_model=list[EnvironmentVariable]) 166 167 def create_env( 168 self, uuid: str, model: EnvironmentVariableCreate 169 ) -> CoolipyAPIResponse[UUIDResponse]: 170 """Create an environment variable for a database.""" 171 return self._post(f"/databases/{uuid}/envs", json=_dump(model), response_model=UUIDResponse) 172 173 def update_env( 174 self, uuid: str, model: EnvironmentVariableUpdate 175 ) -> CoolipyAPIResponse[EnvironmentVariable]: 176 """Update an environment variable for a database.""" 177 return self._patch( 178 f"/databases/{uuid}/envs", json=_dump(model), response_model=EnvironmentVariable 179 ) 180 181 def bulk_update_envs( 182 self, uuid: str, model: BulkEnvsUpdate 183 ) -> CoolipyAPIResponse[EnvironmentVariableList]: 184 """Bulk-update environment variables for a database.""" 185 return self._patch( 186 f"/databases/{uuid}/envs/bulk", 187 json=_dump(model), 188 response_model=list[EnvironmentVariable], 189 ) 190 191 def delete_env(self, uuid: str, env_uuid: str) -> CoolipyAPIResponse[MessageResponse]: 192 """Delete an environment variable by UUID.""" 193 return self._delete(f"/databases/{uuid}/envs/{env_uuid}", response_model=MessageResponse) 194 195 def storages(self, uuid: str) -> CoolipyAPIResponse[dict]: 196 """List storages for a database.""" 197 return self._get(f"/databases/{uuid}/storages", response_model=dict) 198 199 def create_storage(self, uuid: str, model: StorageCreate) -> CoolipyAPIResponse[dict]: 200 """Create a storage for a database.""" 201 return self._post(f"/databases/{uuid}/storages", json=_dump(model), response_model=dict) 202 203 def update_storage(self, uuid: str, model: StorageUpdate) -> CoolipyAPIResponse[dict]: 204 """Update a storage for a database.""" 205 return self._patch(f"/databases/{uuid}/storages", json=_dump(model), response_model=dict) 206 207 def delete_storage(self, uuid: str, storage_uuid: str) -> CoolipyAPIResponse[MessageResponse]: 208 """Delete a storage by UUID.""" 209 return self._delete( 210 f"/databases/{uuid}/storages/{storage_uuid}", response_model=MessageResponse 211 ) 212 213 def tags(self, uuid: str) -> CoolipyAPIResponse[TagList]: 214 """List tags for a database.""" 215 return self._get(f"/databases/{uuid}/tags", response_model=list[Tag]) 216 217 def add_tags(self, uuid: str, model: TagsCreate) -> CoolipyAPIResponse[TagList]: 218 """Add one or more tags to a database.""" 219 return self._post(f"/databases/{uuid}/tags", json=_dump(model), response_model=list[Tag]) 220 221 def delete_tag(self, uuid: str, tag_uuid: str) -> CoolipyAPIResponse[Any]: 222 """Remove a tag from a database.""" 223 return self._delete(f"/databases/{uuid}/tags/{tag_uuid}") 224 225 def clone( 226 self, 227 uuid: str, 228 destination_uuid: str, 229 *, 230 name: str | None = None, 231 clone_volumes: bool = False, 232 ) -> CoolipyAPIResponse[dict]: 233 """Clone a database into a destination.""" 234 body = {"destination_uuid": destination_uuid, "name": name, "clone_volumes": clone_volumes} 235 return self._post(f"/databases/{uuid}/clone", json=body, response_model=dict) 236 237 def update_storage_backup( 238 self, uuid: str, storage_uuid: str, model: VolumeBackupScheduleRequest 239 ) -> CoolipyAPIResponse[VolumeBackupScheduleResponse]: 240 """Schedule backups for a storage volume.""" 241 return self._put( 242 f"/databases/{uuid}/storages/{storage_uuid}/backups", 243 json=_dump(model), 244 response_model=VolumeBackupScheduleResponse, 245 ) 246 247 def delete_storage_backup( 248 self, uuid: str, storage_uuid: str 249 ) -> CoolipyAPIResponse[MessageResponse]: 250 """Remove the backup schedule for a storage volume.""" 251 return self._delete( 252 f"/databases/{uuid}/storages/{storage_uuid}/backups", response_model=MessageResponse 253 ) 254 255 def run_storage_backup( 256 self, uuid: str, storage_uuid: str 257 ) -> CoolipyAPIResponse[MessageResponse]: 258 """Run a storage backup now.""" 259 return self._post( 260 f"/databases/{uuid}/storages/{storage_uuid}/backups/run", response_model=MessageResponse 261 ) 262 263 264class AsyncDatabases(AsyncResourceBase): 265 """Asynchronous client for Coolify databases.""" 266 267 async def list(self) -> CoolipyAPIResponse[DatabaseList]: 268 """List all databases.""" 269 return await self._get("/databases", response_model=list[DatabaseModel]) 270 271 async def get(self, uuid: str) -> CoolipyAPIResponse[DatabaseModel]: 272 """Get a database by UUID.""" 273 return await self._get(f"/databases/{uuid}", response_model=DatabaseModel) 274 275 async def create(self, model: Any) -> CoolipyAPIResponse[Any]: 276 """Create a database from one of the supported create models.""" 277 path = _DATABASE_CREATE_PATHS.get(type(model)) 278 if path is None: 279 raise CoolipyValidationError( 280 f"Unsupported database create model: {type(model).__name__}" 281 ) 282 return await self._post(path, json=_dump(model)) 283 284 async def update(self, uuid: str, model: DatabaseUpdateModel) -> CoolipyAPIResponse[Any]: 285 """Update a database by UUID.""" 286 return await self._patch(f"/databases/{uuid}", json=_dump(model)) 287 288 async def delete( 289 self, 290 uuid: str, 291 *, 292 delete_configurations: bool = True, 293 delete_volumes: bool = True, 294 docker_cleanup: bool = True, 295 delete_connected_networks: bool = True, 296 ) -> CoolipyAPIResponse[MessageResponse]: 297 """Delete a database by UUID.""" 298 params = { 299 "delete_configurations": delete_configurations, 300 "delete_volumes": delete_volumes, 301 "docker_cleanup": docker_cleanup, 302 "delete_connected_networks": delete_connected_networks, 303 } 304 return await self._delete( 305 f"/databases/{uuid}", params=params, response_model=MessageResponse 306 ) 307 308 async def backups(self, uuid: str) -> CoolipyAPIResponse[Any]: 309 """List scheduled backups for a database.""" 310 return await self._get(f"/databases/{uuid}/backups") 311 312 async def create_backup( 313 self, uuid: str, model: DatabaseBackupCreate 314 ) -> CoolipyAPIResponse[dict]: 315 """Create a scheduled backup configuration for a database.""" 316 return await self._post( 317 f"/databases/{uuid}/backups", json=_dump(model), response_model=dict 318 ) 319 320 async def update_backup( 321 self, uuid: str, scheduled_backup_uuid: str, model: DatabaseBackupCreate 322 ) -> CoolipyAPIResponse[Any]: 323 """Update a scheduled backup configuration.""" 324 return await self._patch( 325 f"/databases/{uuid}/backups/{scheduled_backup_uuid}", json=_dump(model) 326 ) 327 328 async def delete_backup(self, uuid: str, scheduled_backup_uuid: str) -> CoolipyAPIResponse[Any]: 329 """Delete a scheduled backup configuration.""" 330 return await self._delete(f"/databases/{uuid}/backups/{scheduled_backup_uuid}") 331 332 async def backup_executions( 333 self, uuid: str, scheduled_backup_uuid: str 334 ) -> CoolipyAPIResponse[Any]: 335 """List executions of a scheduled backup.""" 336 return await self._get(f"/databases/{uuid}/backups/{scheduled_backup_uuid}/executions") 337 338 async def delete_backup_execution( 339 self, uuid: str, scheduled_backup_uuid: str, execution_uuid: str 340 ) -> CoolipyAPIResponse[Any]: 341 """Delete a backup execution.""" 342 return await self._delete( 343 f"/databases/{uuid}/backups/{scheduled_backup_uuid}/executions/{execution_uuid}" 344 ) 345 346 async def logs(self, uuid: str) -> CoolipyAPIResponse[Logs]: 347 """Get database logs.""" 348 return await self._get(f"/databases/{uuid}/logs", response_model=Logs) 349 350 async def move(self, uuid: str, environment_uuid: str) -> CoolipyAPIResponse[dict]: 351 """Move a database to another environment.""" 352 return await self._post( 353 f"/databases/{uuid}/move", 354 json={"environment_uuid": environment_uuid}, 355 response_model=dict, 356 ) 357 358 async def migrate( 359 self, uuid: str, destination_uuid: str, *, migrate_volumes: bool = True 360 ) -> CoolipyAPIResponse[Any]: 361 """Migrate a database to another destination/server.""" 362 body = {"destination_uuid": destination_uuid, "migrate_volumes": migrate_volumes} 363 return await self._post(f"/databases/{uuid}/migrate", json=body) 364 365 async def start(self, uuid: str) -> CoolipyAPIResponse[DeploymentQueuedResponse]: 366 """Start a database.""" 367 return await self._post(f"/databases/{uuid}/start", response_model=DeploymentQueuedResponse) 368 369 async def stop(self, uuid: str) -> CoolipyAPIResponse[MessageResponse]: 370 """Stop a database.""" 371 return await self._post(f"/databases/{uuid}/stop", response_model=MessageResponse) 372 373 async def restart(self, uuid: str) -> CoolipyAPIResponse[DeploymentQueuedResponse]: 374 """Restart a database.""" 375 return await self._post( 376 f"/databases/{uuid}/restart", response_model=DeploymentQueuedResponse 377 ) 378 379 async def envs(self, uuid: str) -> CoolipyAPIResponse[EnvironmentVariableList]: 380 """List environment variables for a database.""" 381 return await self._get(f"/databases/{uuid}/envs", response_model=list[EnvironmentVariable]) 382 383 async def create_env( 384 self, uuid: str, model: EnvironmentVariableCreate 385 ) -> CoolipyAPIResponse[UUIDResponse]: 386 """Create an environment variable for a database.""" 387 return await self._post( 388 f"/databases/{uuid}/envs", json=_dump(model), response_model=UUIDResponse 389 ) 390 391 async def update_env( 392 self, uuid: str, model: EnvironmentVariableUpdate 393 ) -> CoolipyAPIResponse[EnvironmentVariable]: 394 """Update an environment variable for a database.""" 395 return await self._patch( 396 f"/databases/{uuid}/envs", json=_dump(model), response_model=EnvironmentVariable 397 ) 398 399 async def bulk_update_envs( 400 self, uuid: str, model: BulkEnvsUpdate 401 ) -> CoolipyAPIResponse[EnvironmentVariableList]: 402 """Bulk-update environment variables for a database.""" 403 return await self._patch( 404 f"/databases/{uuid}/envs/bulk", 405 json=_dump(model), 406 response_model=list[EnvironmentVariable], 407 ) 408 409 async def delete_env(self, uuid: str, env_uuid: str) -> CoolipyAPIResponse[MessageResponse]: 410 """Delete an environment variable by UUID.""" 411 return await self._delete( 412 f"/databases/{uuid}/envs/{env_uuid}", response_model=MessageResponse 413 ) 414 415 async def storages(self, uuid: str) -> CoolipyAPIResponse[dict]: 416 """List storages for a database.""" 417 return await self._get(f"/databases/{uuid}/storages", response_model=dict) 418 419 async def create_storage(self, uuid: str, model: StorageCreate) -> CoolipyAPIResponse[dict]: 420 """Create a storage for a database.""" 421 return await self._post( 422 f"/databases/{uuid}/storages", json=_dump(model), response_model=dict 423 ) 424 425 async def update_storage(self, uuid: str, model: StorageUpdate) -> CoolipyAPIResponse[dict]: 426 """Update a storage for a database.""" 427 return await self._patch( 428 f"/databases/{uuid}/storages", json=_dump(model), response_model=dict 429 ) 430 431 async def delete_storage( 432 self, uuid: str, storage_uuid: str 433 ) -> CoolipyAPIResponse[MessageResponse]: 434 """Delete a storage by UUID.""" 435 return await self._delete( 436 f"/databases/{uuid}/storages/{storage_uuid}", response_model=MessageResponse 437 ) 438 439 async def tags(self, uuid: str) -> CoolipyAPIResponse[TagList]: 440 """List tags for a database.""" 441 return await self._get(f"/databases/{uuid}/tags", response_model=list[Tag]) 442 443 async def add_tags(self, uuid: str, model: TagsCreate) -> CoolipyAPIResponse[TagList]: 444 """Add one or more tags to a database.""" 445 return await self._post( 446 f"/databases/{uuid}/tags", json=_dump(model), response_model=list[Tag] 447 ) 448 449 async def delete_tag(self, uuid: str, tag_uuid: str) -> CoolipyAPIResponse[Any]: 450 """Remove a tag from a database.""" 451 return await self._delete(f"/databases/{uuid}/tags/{tag_uuid}") 452 453 async def clone( 454 self, 455 uuid: str, 456 destination_uuid: str, 457 *, 458 name: str | None = None, 459 clone_volumes: bool = False, 460 ) -> CoolipyAPIResponse[dict]: 461 """Clone a database into a destination.""" 462 body = {"destination_uuid": destination_uuid, "name": name, "clone_volumes": clone_volumes} 463 return await self._post(f"/databases/{uuid}/clone", json=body, response_model=dict) 464 465 async def update_storage_backup( 466 self, uuid: str, storage_uuid: str, model: VolumeBackupScheduleRequest 467 ) -> CoolipyAPIResponse[VolumeBackupScheduleResponse]: 468 """Schedule backups for a storage volume.""" 469 return await self._put( 470 f"/databases/{uuid}/storages/{storage_uuid}/backups", 471 json=_dump(model), 472 response_model=VolumeBackupScheduleResponse, 473 ) 474 475 async def delete_storage_backup( 476 self, uuid: str, storage_uuid: str 477 ) -> CoolipyAPIResponse[MessageResponse]: 478 """Remove the backup schedule for a storage volume.""" 479 return await self._delete( 480 f"/databases/{uuid}/storages/{storage_uuid}/backups", response_model=MessageResponse 481 ) 482 483 async def run_storage_backup( 484 self, uuid: str, storage_uuid: str 485 ) -> CoolipyAPIResponse[MessageResponse]: 486 """Run a storage backup now.""" 487 return await self._post( 488 f"/databases/{uuid}/storages/{storage_uuid}/backups/run", response_model=MessageResponse 489 )
61class Databases(ResourceBase): 62 """Synchronous client for Coolify databases.""" 63 64 def list(self) -> CoolipyAPIResponse[DatabaseList]: 65 """List all databases.""" 66 return self._get("/databases", response_model=list[DatabaseModel]) 67 68 def get(self, uuid: str) -> CoolipyAPIResponse[DatabaseModel]: 69 """Get a database by UUID.""" 70 return self._get(f"/databases/{uuid}", response_model=DatabaseModel) 71 72 def create(self, model: Any) -> CoolipyAPIResponse[Any]: 73 """Create a database from one of the supported create models.""" 74 path = _DATABASE_CREATE_PATHS.get(type(model)) 75 if path is None: 76 raise CoolipyValidationError( 77 f"Unsupported database create model: {type(model).__name__}" 78 ) 79 return self._post(path, json=_dump(model)) 80 81 def update(self, uuid: str, model: DatabaseUpdateModel) -> CoolipyAPIResponse[Any]: 82 """Update a database by UUID.""" 83 return self._patch(f"/databases/{uuid}", json=_dump(model)) 84 85 def delete( 86 self, 87 uuid: str, 88 *, 89 delete_configurations: bool = True, 90 delete_volumes: bool = True, 91 docker_cleanup: bool = True, 92 delete_connected_networks: bool = True, 93 ) -> CoolipyAPIResponse[MessageResponse]: 94 """Delete a database by UUID.""" 95 params = { 96 "delete_configurations": delete_configurations, 97 "delete_volumes": delete_volumes, 98 "docker_cleanup": docker_cleanup, 99 "delete_connected_networks": delete_connected_networks, 100 } 101 return self._delete(f"/databases/{uuid}", params=params, response_model=MessageResponse) 102 103 def backups(self, uuid: str) -> CoolipyAPIResponse[Any]: 104 """List scheduled backups for a database.""" 105 return self._get(f"/databases/{uuid}/backups") 106 107 def create_backup(self, uuid: str, model: DatabaseBackupCreate) -> CoolipyAPIResponse[dict]: 108 """Create a scheduled backup configuration for a database.""" 109 return self._post(f"/databases/{uuid}/backups", json=_dump(model), response_model=dict) 110 111 def update_backup( 112 self, uuid: str, scheduled_backup_uuid: str, model: DatabaseBackupCreate 113 ) -> CoolipyAPIResponse[Any]: 114 """Update a scheduled backup configuration.""" 115 return self._patch(f"/databases/{uuid}/backups/{scheduled_backup_uuid}", json=_dump(model)) 116 117 def delete_backup(self, uuid: str, scheduled_backup_uuid: str) -> CoolipyAPIResponse[Any]: 118 """Delete a scheduled backup configuration.""" 119 return self._delete(f"/databases/{uuid}/backups/{scheduled_backup_uuid}") 120 121 def backup_executions(self, uuid: str, scheduled_backup_uuid: str) -> CoolipyAPIResponse[Any]: 122 """List executions of a scheduled backup.""" 123 return self._get(f"/databases/{uuid}/backups/{scheduled_backup_uuid}/executions") 124 125 def delete_backup_execution( 126 self, uuid: str, scheduled_backup_uuid: str, execution_uuid: str 127 ) -> CoolipyAPIResponse[Any]: 128 """Delete a backup execution.""" 129 return self._delete( 130 f"/databases/{uuid}/backups/{scheduled_backup_uuid}/executions/{execution_uuid}" 131 ) 132 133 def logs(self, uuid: str) -> CoolipyAPIResponse[Logs]: 134 """Get database logs.""" 135 return self._get(f"/databases/{uuid}/logs", response_model=Logs) 136 137 def move(self, uuid: str, environment_uuid: str) -> CoolipyAPIResponse[dict]: 138 """Move a database to another environment.""" 139 return self._post( 140 f"/databases/{uuid}/move", 141 json={"environment_uuid": environment_uuid}, 142 response_model=dict, 143 ) 144 145 def migrate( 146 self, uuid: str, destination_uuid: str, *, migrate_volumes: bool = True 147 ) -> CoolipyAPIResponse[Any]: 148 """Migrate a database to another destination/server.""" 149 body = {"destination_uuid": destination_uuid, "migrate_volumes": migrate_volumes} 150 return self._post(f"/databases/{uuid}/migrate", json=body) 151 152 def start(self, uuid: str) -> CoolipyAPIResponse[DeploymentQueuedResponse]: 153 """Start a database.""" 154 return self._post(f"/databases/{uuid}/start", response_model=DeploymentQueuedResponse) 155 156 def stop(self, uuid: str) -> CoolipyAPIResponse[MessageResponse]: 157 """Stop a database.""" 158 return self._post(f"/databases/{uuid}/stop", response_model=MessageResponse) 159 160 def restart(self, uuid: str) -> CoolipyAPIResponse[DeploymentQueuedResponse]: 161 """Restart a database.""" 162 return self._post(f"/databases/{uuid}/restart", response_model=DeploymentQueuedResponse) 163 164 def envs(self, uuid: str) -> CoolipyAPIResponse[EnvironmentVariableList]: 165 """List environment variables for a database.""" 166 return self._get(f"/databases/{uuid}/envs", response_model=list[EnvironmentVariable]) 167 168 def create_env( 169 self, uuid: str, model: EnvironmentVariableCreate 170 ) -> CoolipyAPIResponse[UUIDResponse]: 171 """Create an environment variable for a database.""" 172 return self._post(f"/databases/{uuid}/envs", json=_dump(model), response_model=UUIDResponse) 173 174 def update_env( 175 self, uuid: str, model: EnvironmentVariableUpdate 176 ) -> CoolipyAPIResponse[EnvironmentVariable]: 177 """Update an environment variable for a database.""" 178 return self._patch( 179 f"/databases/{uuid}/envs", json=_dump(model), response_model=EnvironmentVariable 180 ) 181 182 def bulk_update_envs( 183 self, uuid: str, model: BulkEnvsUpdate 184 ) -> CoolipyAPIResponse[EnvironmentVariableList]: 185 """Bulk-update environment variables for a database.""" 186 return self._patch( 187 f"/databases/{uuid}/envs/bulk", 188 json=_dump(model), 189 response_model=list[EnvironmentVariable], 190 ) 191 192 def delete_env(self, uuid: str, env_uuid: str) -> CoolipyAPIResponse[MessageResponse]: 193 """Delete an environment variable by UUID.""" 194 return self._delete(f"/databases/{uuid}/envs/{env_uuid}", response_model=MessageResponse) 195 196 def storages(self, uuid: str) -> CoolipyAPIResponse[dict]: 197 """List storages for a database.""" 198 return self._get(f"/databases/{uuid}/storages", response_model=dict) 199 200 def create_storage(self, uuid: str, model: StorageCreate) -> CoolipyAPIResponse[dict]: 201 """Create a storage for a database.""" 202 return self._post(f"/databases/{uuid}/storages", json=_dump(model), response_model=dict) 203 204 def update_storage(self, uuid: str, model: StorageUpdate) -> CoolipyAPIResponse[dict]: 205 """Update a storage for a database.""" 206 return self._patch(f"/databases/{uuid}/storages", json=_dump(model), response_model=dict) 207 208 def delete_storage(self, uuid: str, storage_uuid: str) -> CoolipyAPIResponse[MessageResponse]: 209 """Delete a storage by UUID.""" 210 return self._delete( 211 f"/databases/{uuid}/storages/{storage_uuid}", response_model=MessageResponse 212 ) 213 214 def tags(self, uuid: str) -> CoolipyAPIResponse[TagList]: 215 """List tags for a database.""" 216 return self._get(f"/databases/{uuid}/tags", response_model=list[Tag]) 217 218 def add_tags(self, uuid: str, model: TagsCreate) -> CoolipyAPIResponse[TagList]: 219 """Add one or more tags to a database.""" 220 return self._post(f"/databases/{uuid}/tags", json=_dump(model), response_model=list[Tag]) 221 222 def delete_tag(self, uuid: str, tag_uuid: str) -> CoolipyAPIResponse[Any]: 223 """Remove a tag from a database.""" 224 return self._delete(f"/databases/{uuid}/tags/{tag_uuid}") 225 226 def clone( 227 self, 228 uuid: str, 229 destination_uuid: str, 230 *, 231 name: str | None = None, 232 clone_volumes: bool = False, 233 ) -> CoolipyAPIResponse[dict]: 234 """Clone a database into a destination.""" 235 body = {"destination_uuid": destination_uuid, "name": name, "clone_volumes": clone_volumes} 236 return self._post(f"/databases/{uuid}/clone", json=body, response_model=dict) 237 238 def update_storage_backup( 239 self, uuid: str, storage_uuid: str, model: VolumeBackupScheduleRequest 240 ) -> CoolipyAPIResponse[VolumeBackupScheduleResponse]: 241 """Schedule backups for a storage volume.""" 242 return self._put( 243 f"/databases/{uuid}/storages/{storage_uuid}/backups", 244 json=_dump(model), 245 response_model=VolumeBackupScheduleResponse, 246 ) 247 248 def delete_storage_backup( 249 self, uuid: str, storage_uuid: str 250 ) -> CoolipyAPIResponse[MessageResponse]: 251 """Remove the backup schedule for a storage volume.""" 252 return self._delete( 253 f"/databases/{uuid}/storages/{storage_uuid}/backups", response_model=MessageResponse 254 ) 255 256 def run_storage_backup( 257 self, uuid: str, storage_uuid: str 258 ) -> CoolipyAPIResponse[MessageResponse]: 259 """Run a storage backup now.""" 260 return self._post( 261 f"/databases/{uuid}/storages/{storage_uuid}/backups/run", response_model=MessageResponse 262 )
Synchronous client for Coolify databases.
64 def list(self) -> CoolipyAPIResponse[DatabaseList]: 65 """List all databases.""" 66 return self._get("/databases", response_model=list[DatabaseModel])
List all databases.
68 def get(self, uuid: str) -> CoolipyAPIResponse[DatabaseModel]: 69 """Get a database by UUID.""" 70 return self._get(f"/databases/{uuid}", response_model=DatabaseModel)
Get a database by UUID.
72 def create(self, model: Any) -> CoolipyAPIResponse[Any]: 73 """Create a database from one of the supported create models.""" 74 path = _DATABASE_CREATE_PATHS.get(type(model)) 75 if path is None: 76 raise CoolipyValidationError( 77 f"Unsupported database create model: {type(model).__name__}" 78 ) 79 return self._post(path, json=_dump(model))
Create a database from one of the supported create models.
81 def update(self, uuid: str, model: DatabaseUpdateModel) -> CoolipyAPIResponse[Any]: 82 """Update a database by UUID.""" 83 return self._patch(f"/databases/{uuid}", json=_dump(model))
Update a database by UUID.
85 def delete( 86 self, 87 uuid: str, 88 *, 89 delete_configurations: bool = True, 90 delete_volumes: bool = True, 91 docker_cleanup: bool = True, 92 delete_connected_networks: bool = True, 93 ) -> CoolipyAPIResponse[MessageResponse]: 94 """Delete a database by UUID.""" 95 params = { 96 "delete_configurations": delete_configurations, 97 "delete_volumes": delete_volumes, 98 "docker_cleanup": docker_cleanup, 99 "delete_connected_networks": delete_connected_networks, 100 } 101 return self._delete(f"/databases/{uuid}", params=params, response_model=MessageResponse)
Delete a database by UUID.
103 def backups(self, uuid: str) -> CoolipyAPIResponse[Any]: 104 """List scheduled backups for a database.""" 105 return self._get(f"/databases/{uuid}/backups")
List scheduled backups for a database.
107 def create_backup(self, uuid: str, model: DatabaseBackupCreate) -> CoolipyAPIResponse[dict]: 108 """Create a scheduled backup configuration for a database.""" 109 return self._post(f"/databases/{uuid}/backups", json=_dump(model), response_model=dict)
Create a scheduled backup configuration for a database.
111 def update_backup( 112 self, uuid: str, scheduled_backup_uuid: str, model: DatabaseBackupCreate 113 ) -> CoolipyAPIResponse[Any]: 114 """Update a scheduled backup configuration.""" 115 return self._patch(f"/databases/{uuid}/backups/{scheduled_backup_uuid}", json=_dump(model))
Update a scheduled backup configuration.
117 def delete_backup(self, uuid: str, scheduled_backup_uuid: str) -> CoolipyAPIResponse[Any]: 118 """Delete a scheduled backup configuration.""" 119 return self._delete(f"/databases/{uuid}/backups/{scheduled_backup_uuid}")
Delete a scheduled backup configuration.
121 def backup_executions(self, uuid: str, scheduled_backup_uuid: str) -> CoolipyAPIResponse[Any]: 122 """List executions of a scheduled backup.""" 123 return self._get(f"/databases/{uuid}/backups/{scheduled_backup_uuid}/executions")
List executions of a scheduled backup.
125 def delete_backup_execution( 126 self, uuid: str, scheduled_backup_uuid: str, execution_uuid: str 127 ) -> CoolipyAPIResponse[Any]: 128 """Delete a backup execution.""" 129 return self._delete( 130 f"/databases/{uuid}/backups/{scheduled_backup_uuid}/executions/{execution_uuid}" 131 )
Delete a backup execution.
133 def logs(self, uuid: str) -> CoolipyAPIResponse[Logs]: 134 """Get database logs.""" 135 return self._get(f"/databases/{uuid}/logs", response_model=Logs)
Get database logs.
137 def move(self, uuid: str, environment_uuid: str) -> CoolipyAPIResponse[dict]: 138 """Move a database to another environment.""" 139 return self._post( 140 f"/databases/{uuid}/move", 141 json={"environment_uuid": environment_uuid}, 142 response_model=dict, 143 )
Move a database to another environment.
145 def migrate( 146 self, uuid: str, destination_uuid: str, *, migrate_volumes: bool = True 147 ) -> CoolipyAPIResponse[Any]: 148 """Migrate a database to another destination/server.""" 149 body = {"destination_uuid": destination_uuid, "migrate_volumes": migrate_volumes} 150 return self._post(f"/databases/{uuid}/migrate", json=body)
Migrate a database to another destination/server.
152 def start(self, uuid: str) -> CoolipyAPIResponse[DeploymentQueuedResponse]: 153 """Start a database.""" 154 return self._post(f"/databases/{uuid}/start", response_model=DeploymentQueuedResponse)
Start a database.
156 def stop(self, uuid: str) -> CoolipyAPIResponse[MessageResponse]: 157 """Stop a database.""" 158 return self._post(f"/databases/{uuid}/stop", response_model=MessageResponse)
Stop a database.
160 def restart(self, uuid: str) -> CoolipyAPIResponse[DeploymentQueuedResponse]: 161 """Restart a database.""" 162 return self._post(f"/databases/{uuid}/restart", response_model=DeploymentQueuedResponse)
Restart a database.
164 def envs(self, uuid: str) -> CoolipyAPIResponse[EnvironmentVariableList]: 165 """List environment variables for a database.""" 166 return self._get(f"/databases/{uuid}/envs", response_model=list[EnvironmentVariable])
List environment variables for a database.
168 def create_env( 169 self, uuid: str, model: EnvironmentVariableCreate 170 ) -> CoolipyAPIResponse[UUIDResponse]: 171 """Create an environment variable for a database.""" 172 return self._post(f"/databases/{uuid}/envs", json=_dump(model), response_model=UUIDResponse)
Create an environment variable for a database.
174 def update_env( 175 self, uuid: str, model: EnvironmentVariableUpdate 176 ) -> CoolipyAPIResponse[EnvironmentVariable]: 177 """Update an environment variable for a database.""" 178 return self._patch( 179 f"/databases/{uuid}/envs", json=_dump(model), response_model=EnvironmentVariable 180 )
Update an environment variable for a database.
182 def bulk_update_envs( 183 self, uuid: str, model: BulkEnvsUpdate 184 ) -> CoolipyAPIResponse[EnvironmentVariableList]: 185 """Bulk-update environment variables for a database.""" 186 return self._patch( 187 f"/databases/{uuid}/envs/bulk", 188 json=_dump(model), 189 response_model=list[EnvironmentVariable], 190 )
Bulk-update environment variables for a database.
192 def delete_env(self, uuid: str, env_uuid: str) -> CoolipyAPIResponse[MessageResponse]: 193 """Delete an environment variable by UUID.""" 194 return self._delete(f"/databases/{uuid}/envs/{env_uuid}", response_model=MessageResponse)
Delete an environment variable by UUID.
196 def storages(self, uuid: str) -> CoolipyAPIResponse[dict]: 197 """List storages for a database.""" 198 return self._get(f"/databases/{uuid}/storages", response_model=dict)
List storages for a database.
200 def create_storage(self, uuid: str, model: StorageCreate) -> CoolipyAPIResponse[dict]: 201 """Create a storage for a database.""" 202 return self._post(f"/databases/{uuid}/storages", json=_dump(model), response_model=dict)
Create a storage for a database.
204 def update_storage(self, uuid: str, model: StorageUpdate) -> CoolipyAPIResponse[dict]: 205 """Update a storage for a database.""" 206 return self._patch(f"/databases/{uuid}/storages", json=_dump(model), response_model=dict)
Update a storage for a database.
208 def delete_storage(self, uuid: str, storage_uuid: str) -> CoolipyAPIResponse[MessageResponse]: 209 """Delete a storage by UUID.""" 210 return self._delete( 211 f"/databases/{uuid}/storages/{storage_uuid}", response_model=MessageResponse 212 )
Delete a storage by UUID.
222 def delete_tag(self, uuid: str, tag_uuid: str) -> CoolipyAPIResponse[Any]: 223 """Remove a tag from a database.""" 224 return self._delete(f"/databases/{uuid}/tags/{tag_uuid}")
Remove a tag from a database.
226 def clone( 227 self, 228 uuid: str, 229 destination_uuid: str, 230 *, 231 name: str | None = None, 232 clone_volumes: bool = False, 233 ) -> CoolipyAPIResponse[dict]: 234 """Clone a database into a destination.""" 235 body = {"destination_uuid": destination_uuid, "name": name, "clone_volumes": clone_volumes} 236 return self._post(f"/databases/{uuid}/clone", json=body, response_model=dict)
Clone a database into a destination.
238 def update_storage_backup( 239 self, uuid: str, storage_uuid: str, model: VolumeBackupScheduleRequest 240 ) -> CoolipyAPIResponse[VolumeBackupScheduleResponse]: 241 """Schedule backups for a storage volume.""" 242 return self._put( 243 f"/databases/{uuid}/storages/{storage_uuid}/backups", 244 json=_dump(model), 245 response_model=VolumeBackupScheduleResponse, 246 )
Schedule backups for a storage volume.
248 def delete_storage_backup( 249 self, uuid: str, storage_uuid: str 250 ) -> CoolipyAPIResponse[MessageResponse]: 251 """Remove the backup schedule for a storage volume.""" 252 return self._delete( 253 f"/databases/{uuid}/storages/{storage_uuid}/backups", response_model=MessageResponse 254 )
Remove the backup schedule for a storage volume.
256 def run_storage_backup( 257 self, uuid: str, storage_uuid: str 258 ) -> CoolipyAPIResponse[MessageResponse]: 259 """Run a storage backup now.""" 260 return self._post( 261 f"/databases/{uuid}/storages/{storage_uuid}/backups/run", response_model=MessageResponse 262 )
Run a storage backup now.
265class AsyncDatabases(AsyncResourceBase): 266 """Asynchronous client for Coolify databases.""" 267 268 async def list(self) -> CoolipyAPIResponse[DatabaseList]: 269 """List all databases.""" 270 return await self._get("/databases", response_model=list[DatabaseModel]) 271 272 async def get(self, uuid: str) -> CoolipyAPIResponse[DatabaseModel]: 273 """Get a database by UUID.""" 274 return await self._get(f"/databases/{uuid}", response_model=DatabaseModel) 275 276 async def create(self, model: Any) -> CoolipyAPIResponse[Any]: 277 """Create a database from one of the supported create models.""" 278 path = _DATABASE_CREATE_PATHS.get(type(model)) 279 if path is None: 280 raise CoolipyValidationError( 281 f"Unsupported database create model: {type(model).__name__}" 282 ) 283 return await self._post(path, json=_dump(model)) 284 285 async def update(self, uuid: str, model: DatabaseUpdateModel) -> CoolipyAPIResponse[Any]: 286 """Update a database by UUID.""" 287 return await self._patch(f"/databases/{uuid}", json=_dump(model)) 288 289 async def delete( 290 self, 291 uuid: str, 292 *, 293 delete_configurations: bool = True, 294 delete_volumes: bool = True, 295 docker_cleanup: bool = True, 296 delete_connected_networks: bool = True, 297 ) -> CoolipyAPIResponse[MessageResponse]: 298 """Delete a database by UUID.""" 299 params = { 300 "delete_configurations": delete_configurations, 301 "delete_volumes": delete_volumes, 302 "docker_cleanup": docker_cleanup, 303 "delete_connected_networks": delete_connected_networks, 304 } 305 return await self._delete( 306 f"/databases/{uuid}", params=params, response_model=MessageResponse 307 ) 308 309 async def backups(self, uuid: str) -> CoolipyAPIResponse[Any]: 310 """List scheduled backups for a database.""" 311 return await self._get(f"/databases/{uuid}/backups") 312 313 async def create_backup( 314 self, uuid: str, model: DatabaseBackupCreate 315 ) -> CoolipyAPIResponse[dict]: 316 """Create a scheduled backup configuration for a database.""" 317 return await self._post( 318 f"/databases/{uuid}/backups", json=_dump(model), response_model=dict 319 ) 320 321 async def update_backup( 322 self, uuid: str, scheduled_backup_uuid: str, model: DatabaseBackupCreate 323 ) -> CoolipyAPIResponse[Any]: 324 """Update a scheduled backup configuration.""" 325 return await self._patch( 326 f"/databases/{uuid}/backups/{scheduled_backup_uuid}", json=_dump(model) 327 ) 328 329 async def delete_backup(self, uuid: str, scheduled_backup_uuid: str) -> CoolipyAPIResponse[Any]: 330 """Delete a scheduled backup configuration.""" 331 return await self._delete(f"/databases/{uuid}/backups/{scheduled_backup_uuid}") 332 333 async def backup_executions( 334 self, uuid: str, scheduled_backup_uuid: str 335 ) -> CoolipyAPIResponse[Any]: 336 """List executions of a scheduled backup.""" 337 return await self._get(f"/databases/{uuid}/backups/{scheduled_backup_uuid}/executions") 338 339 async def delete_backup_execution( 340 self, uuid: str, scheduled_backup_uuid: str, execution_uuid: str 341 ) -> CoolipyAPIResponse[Any]: 342 """Delete a backup execution.""" 343 return await self._delete( 344 f"/databases/{uuid}/backups/{scheduled_backup_uuid}/executions/{execution_uuid}" 345 ) 346 347 async def logs(self, uuid: str) -> CoolipyAPIResponse[Logs]: 348 """Get database logs.""" 349 return await self._get(f"/databases/{uuid}/logs", response_model=Logs) 350 351 async def move(self, uuid: str, environment_uuid: str) -> CoolipyAPIResponse[dict]: 352 """Move a database to another environment.""" 353 return await self._post( 354 f"/databases/{uuid}/move", 355 json={"environment_uuid": environment_uuid}, 356 response_model=dict, 357 ) 358 359 async def migrate( 360 self, uuid: str, destination_uuid: str, *, migrate_volumes: bool = True 361 ) -> CoolipyAPIResponse[Any]: 362 """Migrate a database to another destination/server.""" 363 body = {"destination_uuid": destination_uuid, "migrate_volumes": migrate_volumes} 364 return await self._post(f"/databases/{uuid}/migrate", json=body) 365 366 async def start(self, uuid: str) -> CoolipyAPIResponse[DeploymentQueuedResponse]: 367 """Start a database.""" 368 return await self._post(f"/databases/{uuid}/start", response_model=DeploymentQueuedResponse) 369 370 async def stop(self, uuid: str) -> CoolipyAPIResponse[MessageResponse]: 371 """Stop a database.""" 372 return await self._post(f"/databases/{uuid}/stop", response_model=MessageResponse) 373 374 async def restart(self, uuid: str) -> CoolipyAPIResponse[DeploymentQueuedResponse]: 375 """Restart a database.""" 376 return await self._post( 377 f"/databases/{uuid}/restart", response_model=DeploymentQueuedResponse 378 ) 379 380 async def envs(self, uuid: str) -> CoolipyAPIResponse[EnvironmentVariableList]: 381 """List environment variables for a database.""" 382 return await self._get(f"/databases/{uuid}/envs", response_model=list[EnvironmentVariable]) 383 384 async def create_env( 385 self, uuid: str, model: EnvironmentVariableCreate 386 ) -> CoolipyAPIResponse[UUIDResponse]: 387 """Create an environment variable for a database.""" 388 return await self._post( 389 f"/databases/{uuid}/envs", json=_dump(model), response_model=UUIDResponse 390 ) 391 392 async def update_env( 393 self, uuid: str, model: EnvironmentVariableUpdate 394 ) -> CoolipyAPIResponse[EnvironmentVariable]: 395 """Update an environment variable for a database.""" 396 return await self._patch( 397 f"/databases/{uuid}/envs", json=_dump(model), response_model=EnvironmentVariable 398 ) 399 400 async def bulk_update_envs( 401 self, uuid: str, model: BulkEnvsUpdate 402 ) -> CoolipyAPIResponse[EnvironmentVariableList]: 403 """Bulk-update environment variables for a database.""" 404 return await self._patch( 405 f"/databases/{uuid}/envs/bulk", 406 json=_dump(model), 407 response_model=list[EnvironmentVariable], 408 ) 409 410 async def delete_env(self, uuid: str, env_uuid: str) -> CoolipyAPIResponse[MessageResponse]: 411 """Delete an environment variable by UUID.""" 412 return await self._delete( 413 f"/databases/{uuid}/envs/{env_uuid}", response_model=MessageResponse 414 ) 415 416 async def storages(self, uuid: str) -> CoolipyAPIResponse[dict]: 417 """List storages for a database.""" 418 return await self._get(f"/databases/{uuid}/storages", response_model=dict) 419 420 async def create_storage(self, uuid: str, model: StorageCreate) -> CoolipyAPIResponse[dict]: 421 """Create a storage for a database.""" 422 return await self._post( 423 f"/databases/{uuid}/storages", json=_dump(model), response_model=dict 424 ) 425 426 async def update_storage(self, uuid: str, model: StorageUpdate) -> CoolipyAPIResponse[dict]: 427 """Update a storage for a database.""" 428 return await self._patch( 429 f"/databases/{uuid}/storages", json=_dump(model), response_model=dict 430 ) 431 432 async def delete_storage( 433 self, uuid: str, storage_uuid: str 434 ) -> CoolipyAPIResponse[MessageResponse]: 435 """Delete a storage by UUID.""" 436 return await self._delete( 437 f"/databases/{uuid}/storages/{storage_uuid}", response_model=MessageResponse 438 ) 439 440 async def tags(self, uuid: str) -> CoolipyAPIResponse[TagList]: 441 """List tags for a database.""" 442 return await self._get(f"/databases/{uuid}/tags", response_model=list[Tag]) 443 444 async def add_tags(self, uuid: str, model: TagsCreate) -> CoolipyAPIResponse[TagList]: 445 """Add one or more tags to a database.""" 446 return await self._post( 447 f"/databases/{uuid}/tags", json=_dump(model), response_model=list[Tag] 448 ) 449 450 async def delete_tag(self, uuid: str, tag_uuid: str) -> CoolipyAPIResponse[Any]: 451 """Remove a tag from a database.""" 452 return await self._delete(f"/databases/{uuid}/tags/{tag_uuid}") 453 454 async def clone( 455 self, 456 uuid: str, 457 destination_uuid: str, 458 *, 459 name: str | None = None, 460 clone_volumes: bool = False, 461 ) -> CoolipyAPIResponse[dict]: 462 """Clone a database into a destination.""" 463 body = {"destination_uuid": destination_uuid, "name": name, "clone_volumes": clone_volumes} 464 return await self._post(f"/databases/{uuid}/clone", json=body, response_model=dict) 465 466 async def update_storage_backup( 467 self, uuid: str, storage_uuid: str, model: VolumeBackupScheduleRequest 468 ) -> CoolipyAPIResponse[VolumeBackupScheduleResponse]: 469 """Schedule backups for a storage volume.""" 470 return await self._put( 471 f"/databases/{uuid}/storages/{storage_uuid}/backups", 472 json=_dump(model), 473 response_model=VolumeBackupScheduleResponse, 474 ) 475 476 async def delete_storage_backup( 477 self, uuid: str, storage_uuid: str 478 ) -> CoolipyAPIResponse[MessageResponse]: 479 """Remove the backup schedule for a storage volume.""" 480 return await self._delete( 481 f"/databases/{uuid}/storages/{storage_uuid}/backups", response_model=MessageResponse 482 ) 483 484 async def run_storage_backup( 485 self, uuid: str, storage_uuid: str 486 ) -> CoolipyAPIResponse[MessageResponse]: 487 """Run a storage backup now.""" 488 return await self._post( 489 f"/databases/{uuid}/storages/{storage_uuid}/backups/run", response_model=MessageResponse 490 )
Asynchronous client for Coolify databases.
268 async def list(self) -> CoolipyAPIResponse[DatabaseList]: 269 """List all databases.""" 270 return await self._get("/databases", response_model=list[DatabaseModel])
List all databases.
272 async def get(self, uuid: str) -> CoolipyAPIResponse[DatabaseModel]: 273 """Get a database by UUID.""" 274 return await self._get(f"/databases/{uuid}", response_model=DatabaseModel)
Get a database by UUID.
276 async def create(self, model: Any) -> CoolipyAPIResponse[Any]: 277 """Create a database from one of the supported create models.""" 278 path = _DATABASE_CREATE_PATHS.get(type(model)) 279 if path is None: 280 raise CoolipyValidationError( 281 f"Unsupported database create model: {type(model).__name__}" 282 ) 283 return await self._post(path, json=_dump(model))
Create a database from one of the supported create models.
285 async def update(self, uuid: str, model: DatabaseUpdateModel) -> CoolipyAPIResponse[Any]: 286 """Update a database by UUID.""" 287 return await self._patch(f"/databases/{uuid}", json=_dump(model))
Update a database by UUID.
289 async def delete( 290 self, 291 uuid: str, 292 *, 293 delete_configurations: bool = True, 294 delete_volumes: bool = True, 295 docker_cleanup: bool = True, 296 delete_connected_networks: bool = True, 297 ) -> CoolipyAPIResponse[MessageResponse]: 298 """Delete a database by UUID.""" 299 params = { 300 "delete_configurations": delete_configurations, 301 "delete_volumes": delete_volumes, 302 "docker_cleanup": docker_cleanup, 303 "delete_connected_networks": delete_connected_networks, 304 } 305 return await self._delete( 306 f"/databases/{uuid}", params=params, response_model=MessageResponse 307 )
Delete a database by UUID.
309 async def backups(self, uuid: str) -> CoolipyAPIResponse[Any]: 310 """List scheduled backups for a database.""" 311 return await self._get(f"/databases/{uuid}/backups")
List scheduled backups for a database.
313 async def create_backup( 314 self, uuid: str, model: DatabaseBackupCreate 315 ) -> CoolipyAPIResponse[dict]: 316 """Create a scheduled backup configuration for a database.""" 317 return await self._post( 318 f"/databases/{uuid}/backups", json=_dump(model), response_model=dict 319 )
Create a scheduled backup configuration for a database.
321 async def update_backup( 322 self, uuid: str, scheduled_backup_uuid: str, model: DatabaseBackupCreate 323 ) -> CoolipyAPIResponse[Any]: 324 """Update a scheduled backup configuration.""" 325 return await self._patch( 326 f"/databases/{uuid}/backups/{scheduled_backup_uuid}", json=_dump(model) 327 )
Update a scheduled backup configuration.
329 async def delete_backup(self, uuid: str, scheduled_backup_uuid: str) -> CoolipyAPIResponse[Any]: 330 """Delete a scheduled backup configuration.""" 331 return await self._delete(f"/databases/{uuid}/backups/{scheduled_backup_uuid}")
Delete a scheduled backup configuration.
333 async def backup_executions( 334 self, uuid: str, scheduled_backup_uuid: str 335 ) -> CoolipyAPIResponse[Any]: 336 """List executions of a scheduled backup.""" 337 return await self._get(f"/databases/{uuid}/backups/{scheduled_backup_uuid}/executions")
List executions of a scheduled backup.
339 async def delete_backup_execution( 340 self, uuid: str, scheduled_backup_uuid: str, execution_uuid: str 341 ) -> CoolipyAPIResponse[Any]: 342 """Delete a backup execution.""" 343 return await self._delete( 344 f"/databases/{uuid}/backups/{scheduled_backup_uuid}/executions/{execution_uuid}" 345 )
Delete a backup execution.
347 async def logs(self, uuid: str) -> CoolipyAPIResponse[Logs]: 348 """Get database logs.""" 349 return await self._get(f"/databases/{uuid}/logs", response_model=Logs)
Get database logs.
351 async def move(self, uuid: str, environment_uuid: str) -> CoolipyAPIResponse[dict]: 352 """Move a database to another environment.""" 353 return await self._post( 354 f"/databases/{uuid}/move", 355 json={"environment_uuid": environment_uuid}, 356 response_model=dict, 357 )
Move a database to another environment.
359 async def migrate( 360 self, uuid: str, destination_uuid: str, *, migrate_volumes: bool = True 361 ) -> CoolipyAPIResponse[Any]: 362 """Migrate a database to another destination/server.""" 363 body = {"destination_uuid": destination_uuid, "migrate_volumes": migrate_volumes} 364 return await self._post(f"/databases/{uuid}/migrate", json=body)
Migrate a database to another destination/server.
366 async def start(self, uuid: str) -> CoolipyAPIResponse[DeploymentQueuedResponse]: 367 """Start a database.""" 368 return await self._post(f"/databases/{uuid}/start", response_model=DeploymentQueuedResponse)
Start a database.
370 async def stop(self, uuid: str) -> CoolipyAPIResponse[MessageResponse]: 371 """Stop a database.""" 372 return await self._post(f"/databases/{uuid}/stop", response_model=MessageResponse)
Stop a database.
374 async def restart(self, uuid: str) -> CoolipyAPIResponse[DeploymentQueuedResponse]: 375 """Restart a database.""" 376 return await self._post( 377 f"/databases/{uuid}/restart", response_model=DeploymentQueuedResponse 378 )
Restart a database.
380 async def envs(self, uuid: str) -> CoolipyAPIResponse[EnvironmentVariableList]: 381 """List environment variables for a database.""" 382 return await self._get(f"/databases/{uuid}/envs", response_model=list[EnvironmentVariable])
List environment variables for a database.
384 async def create_env( 385 self, uuid: str, model: EnvironmentVariableCreate 386 ) -> CoolipyAPIResponse[UUIDResponse]: 387 """Create an environment variable for a database.""" 388 return await self._post( 389 f"/databases/{uuid}/envs", json=_dump(model), response_model=UUIDResponse 390 )
Create an environment variable for a database.
392 async def update_env( 393 self, uuid: str, model: EnvironmentVariableUpdate 394 ) -> CoolipyAPIResponse[EnvironmentVariable]: 395 """Update an environment variable for a database.""" 396 return await self._patch( 397 f"/databases/{uuid}/envs", json=_dump(model), response_model=EnvironmentVariable 398 )
Update an environment variable for a database.
400 async def bulk_update_envs( 401 self, uuid: str, model: BulkEnvsUpdate 402 ) -> CoolipyAPIResponse[EnvironmentVariableList]: 403 """Bulk-update environment variables for a database.""" 404 return await self._patch( 405 f"/databases/{uuid}/envs/bulk", 406 json=_dump(model), 407 response_model=list[EnvironmentVariable], 408 )
Bulk-update environment variables for a database.
410 async def delete_env(self, uuid: str, env_uuid: str) -> CoolipyAPIResponse[MessageResponse]: 411 """Delete an environment variable by UUID.""" 412 return await self._delete( 413 f"/databases/{uuid}/envs/{env_uuid}", response_model=MessageResponse 414 )
Delete an environment variable by UUID.
416 async def storages(self, uuid: str) -> CoolipyAPIResponse[dict]: 417 """List storages for a database.""" 418 return await self._get(f"/databases/{uuid}/storages", response_model=dict)
List storages for a database.
420 async def create_storage(self, uuid: str, model: StorageCreate) -> CoolipyAPIResponse[dict]: 421 """Create a storage for a database.""" 422 return await self._post( 423 f"/databases/{uuid}/storages", json=_dump(model), response_model=dict 424 )
Create a storage for a database.
426 async def update_storage(self, uuid: str, model: StorageUpdate) -> CoolipyAPIResponse[dict]: 427 """Update a storage for a database.""" 428 return await self._patch( 429 f"/databases/{uuid}/storages", json=_dump(model), response_model=dict 430 )
Update a storage for a database.
432 async def delete_storage( 433 self, uuid: str, storage_uuid: str 434 ) -> CoolipyAPIResponse[MessageResponse]: 435 """Delete a storage by UUID.""" 436 return await self._delete( 437 f"/databases/{uuid}/storages/{storage_uuid}", response_model=MessageResponse 438 )
Delete a storage by UUID.
450 async def delete_tag(self, uuid: str, tag_uuid: str) -> CoolipyAPIResponse[Any]: 451 """Remove a tag from a database.""" 452 return await self._delete(f"/databases/{uuid}/tags/{tag_uuid}")
Remove a tag from a database.
454 async def clone( 455 self, 456 uuid: str, 457 destination_uuid: str, 458 *, 459 name: str | None = None, 460 clone_volumes: bool = False, 461 ) -> CoolipyAPIResponse[dict]: 462 """Clone a database into a destination.""" 463 body = {"destination_uuid": destination_uuid, "name": name, "clone_volumes": clone_volumes} 464 return await self._post(f"/databases/{uuid}/clone", json=body, response_model=dict)
Clone a database into a destination.
466 async def update_storage_backup( 467 self, uuid: str, storage_uuid: str, model: VolumeBackupScheduleRequest 468 ) -> CoolipyAPIResponse[VolumeBackupScheduleResponse]: 469 """Schedule backups for a storage volume.""" 470 return await self._put( 471 f"/databases/{uuid}/storages/{storage_uuid}/backups", 472 json=_dump(model), 473 response_model=VolumeBackupScheduleResponse, 474 )
Schedule backups for a storage volume.
476 async def delete_storage_backup( 477 self, uuid: str, storage_uuid: str 478 ) -> CoolipyAPIResponse[MessageResponse]: 479 """Remove the backup schedule for a storage volume.""" 480 return await self._delete( 481 f"/databases/{uuid}/storages/{storage_uuid}/backups", response_model=MessageResponse 482 )
Remove the backup schedule for a storage volume.
484 async def run_storage_backup( 485 self, uuid: str, storage_uuid: str 486 ) -> CoolipyAPIResponse[MessageResponse]: 487 """Run a storage backup now.""" 488 return await self._post( 489 f"/databases/{uuid}/storages/{storage_uuid}/backups/run", response_model=MessageResponse 490 )
Run a storage backup now.