├── database ├── .gitignore ├── seeders │ ├── EnvironmentSeeder.php │ ├── ServiceSeeder.php │ ├── WaitlistSeeder.php │ ├── WebhookSeeder.php │ ├── KubernetesSeeder.php │ ├── SubscriptionSeeder.php │ ├── LocalFileVolumeSeeder.php │ ├── ServiceDatabaseSeeder.php │ ├── ServiceApplicationSeeder.php │ ├── ProjectSettingSeeder.php │ ├── ProjectSeeder.php │ ├── SwarmDockerSeeder.php │ ├── ApplicationSettingsSeeder.php │ ├── ApplicationPreviewSeeder.php │ ├── StandaloneDockerSeeder.php │ ├── ServerSeeder.php │ ├── EnvironmentVariableSeeder.php │ ├── LocalPersistentVolumeSeeder.php │ ├── StandaloneRedisSeeder.php │ ├── ServerSettingSeeder.php │ ├── S3StorageSeeder.php │ ├── StandalonePostgresqlSeeder.php │ ├── GitSeeder.php │ └── UserSeeder.php └── migrations │ ├── 2023_08_22_071057_add_nixpkgsarchive_to_applications.php │ ├── 2023_08_22_071058_add_nixpkgsarchive_to_applications_remove.php │ ├── 2023_08_11_190528_add_dockerfile_to_applications_table.php │ ├── 2023_12_08_162228_add_soft_delete_services.php │ ├── 2023_03_28_062150_create_kubernetes_table.php │ ├── 2023_08_22_071048_add_boarding_to_teams.php │ ├── 2023_09_23_111816_add_destination_to_services_table.php │ ├── 2023_12_19_124111_add_swarm_cluster_grouping.php │ ├── 2024_04_16_083919_add_service_type_on_creation.php │ ├── 2023_08_15_111125_update_users_table.php │ ├── 2023_09_23_111813_update_users_databases_table.php │ ├── 2024_03_28_114620_add_watch_paths_to_apps.php │ ├── 2024_05_07_124019_add_server_metrics.php │ ├── 2023_08_22_071060_change_invitation_link_length.php │ ├── 2023_10_08_111819_add_server_unreachable_count.php │ ├── 2023_12_30_134507_add_description_to_environments.php │ ├── 2024_03_08_180457_nullable_password.php │ ├── 2023_06_23_110548_next_channel_updates.php │ ├── 2023_10_18_072519_add_custom_labels_applications_table.php │ ├── 2023_08_06_142951_add_description_field_to_applications_table.php │ ├── 2024_05_10_085215_make_stripe_comment_longer.php │ ├── 2023_08_15_111126_update_servers_add_unreachable_count_table.php │ ├── 2024_01_29_072322_change_env_variable_length.php │ ├── 2024_02_23_143119_add_custom_server_limits_to_teams_ultimate.php │ ├── 2024_02_25_222150_add_server_force_disabled_field.php │ ├── 2023_09_23_111814_update_local_file_volumes_table.php │ ├── 2023_11_07_123731_add_target_build_dockerfile.php │ ├── 2024_01_25_073212_add_server_id_to_queues.php │ ├── 2024_02_08_112304_add_dynamic_timeout_for_deployments.php │ ├── 2024_04_17_132541_add_rollback_queues.php │ ├── 2024_06_20_102551_add_server_api_sentinel.php │ ├── 2024_06_21_143358_add_api_deployment_type.php │ ├── 2014_10_12_100000_create_password_reset_tokens_table.php │ ├── 2023_06_23_114131_change_env_var_value_length.php │ └── 2023_09_20_083549_update_environment_variables_table.php ├── bootstrap ├── cache │ └── .gitignore ├── getVersion.php ├── includeHelpers.php └── helpers │ └── s3.php ├── storage ├── logs │ └── .gitignore ├── app │ ├── public │ │ └── .gitignore │ └── .gitignore └── framework │ ├── testing │ └── .gitignore │ ├── views │ └── .gitignore │ ├── sessions │ └── .gitignore │ ├── cache │ └── .gitignore │ └── .gitignore ├── pint.json ├── public ├── robots.txt ├── coolify.png ├── favicon.png ├── svgs │ ├── n8n.png │ ├── emby.png │ ├── glance.png │ ├── moodle.png │ ├── docuseal.png │ ├── dokuwiki.png │ ├── homepage.png │ ├── stirling.png │ ├── trigger.avif │ ├── trigger.png │ ├── weblate.webp │ ├── authentik.png │ ├── babybuddy.png │ ├── duplicati.webp │ ├── formbricks.png │ ├── glitchtip.png │ ├── mediawiki.ico │ ├── activepieces.png │ ├── changedetection.png │ ├── docker-registry.png │ ├── whoogle-search.png │ ├── internal-link.svg │ ├── external-link.svg │ ├── wordpress.svg │ ├── odoo.svg │ ├── unleash.svg │ ├── minio.svg │ ├── appwrite.svg │ ├── openblocks.svg │ ├── git.svg │ └── chatwoot.svg ├── favicon-dev.png ├── coolify-transparent.png ├── vendor │ └── horizon │ │ ├── img │ │ └── favicon.png │ │ └── mix-manifest.json └── .htaccess ├── tests ├── Browser │ ├── source │ │ └── .gitignore │ ├── console │ │ └── .gitignore │ ├── screenshots │ │ └── .gitignore │ ├── Pages │ │ ├── Page.php │ │ └── HomePage.php │ └── ExampleTest.php ├── TestCase.php └── CreatesApplication.php ├── docker ├── dev │ ├── etc │ │ └── s6-overlay │ │ │ └── s6-rc.d │ │ │ ├── horizon │ │ │ ├── type │ │ │ ├── dependencies.d │ │ │ │ └── init-setup │ │ │ └── run │ │ │ ├── init-setup │ │ │ ├── type │ │ │ └── up │ │ │ ├── user │ │ │ └── contents.d │ │ │ │ ├── horizon │ │ │ │ ├── init-setup │ │ │ │ └── scheduler-worker │ │ │ └── scheduler-worker │ │ │ ├── type │ │ │ ├── dependencies.d │ │ │ └── init-setup │ │ │ └── run │ └── nginx.conf └── prod │ ├── etc │ └── s6-overlay │ │ └── s6-rc.d │ │ ├── user │ │ └── contents.d │ │ │ ├── horizon │ │ │ ├── db-migration │ │ │ ├── init-script │ │ │ ├── init-seeder │ │ │ └── scheduler-worker │ │ ├── horizon │ │ ├── type │ │ └── run │ │ ├── init-script │ │ ├── type │ │ ├── dependencies.d │ │ │ └── init-seeder │ │ └── up │ │ ├── init-seeder │ │ ├── type │ │ ├── dependencies.d │ │ │ └── db-migration │ │ └── up │ │ ├── db-migration │ │ ├── type │ │ └── up │ │ └── scheduler-worker │ │ ├── type │ │ └── run │ └── nginx.conf ├── config └── version.php ├── resources ├── views │ ├── components │ │ ├── emails │ │ │ ├── header.blade.php │ │ │ ├── layout.blade.php │ │ │ └── footer.blade.php │ │ ├── layout.blade.php │ │ ├── layout-simple.blade.php │ │ ├── highlighted.blade.php │ │ ├── version.blade.php │ │ ├── internal-link.blade.php │ │ ├── chevron-down.blade.php │ │ ├── external-link.blade.php │ │ ├── use-magic-bar.blade.php │ │ ├── limit-reached.blade.php │ │ ├── status │ │ │ ├── stopped.blade.php │ │ │ └── degraded.blade.php │ │ ├── security │ │ │ └── navbar.blade.php │ │ ├── helper.blade.php │ │ ├── loading-on-button.blade.php │ │ ├── loading.blade.php │ │ └── page-loading.blade.php │ ├── vendor │ │ └── mail │ │ │ ├── text │ │ │ ├── footer.blade.php │ │ │ ├── panel.blade.php │ │ │ ├── subcopy.blade.php │ │ │ ├── table.blade.php │ │ │ ├── button.blade.php │ │ │ ├── header.blade.php │ │ │ ├── layout.blade.php │ │ │ └── message.blade.php │ │ │ └── html │ │ │ ├── table.blade.php │ │ │ ├── subcopy.blade.php │ │ │ ├── footer.blade.php │ │ │ ├── header.blade.php │ │ │ ├── panel.blade.php │ │ │ └── message.blade.php │ ├── source │ │ ├── gitlab │ │ │ ├── show.blade.php │ │ │ └── new.blade.php │ │ └── github │ │ │ ├── new.blade.php │ │ │ └── show.blade.php │ ├── livewire │ │ ├── source │ │ │ └── gitlab │ │ │ │ └── change.blade.php │ │ ├── project │ │ │ ├── database │ │ │ │ ├── backup-now.blade.php │ │ │ │ ├── init-script.blade.php │ │ │ │ ├── backup │ │ │ │ │ ├── execution.blade.php │ │ │ │ │ └── index.blade.php │ │ │ │ └── create-scheduled-backup.blade.php │ │ │ ├── new │ │ │ │ ├── empty-project.blade.php │ │ │ │ ├── docker-image.blade.php │ │ │ │ └── simple-dockerfile.blade.php │ │ │ ├── delete-project.blade.php │ │ │ ├── delete-environment.blade.php │ │ │ ├── add-environment.blade.php │ │ │ ├── application │ │ │ │ ├── destination.blade.php │ │ │ │ └── previews-compose.blade.php │ │ │ ├── resource │ │ │ │ └── environment-select.blade.php │ │ │ ├── add-empty.blade.php │ │ │ ├── shared │ │ │ │ └── storages │ │ │ │ │ └── all.blade.php │ │ │ └── service │ │ │ │ └── edit-domain.blade.php │ │ ├── verify-email.blade.php │ │ ├── server │ │ │ ├── create.blade.php │ │ │ ├── private-key │ │ │ │ └── show.blade.php │ │ │ ├── destination │ │ │ │ └── show.blade.php │ │ │ ├── proxy │ │ │ │ ├── new-dynamic-configuration.blade.php │ │ │ │ ├── modal.blade.php │ │ │ │ ├── logs.blade.php │ │ │ │ ├── show.blade.php │ │ │ │ └── dynamic-configuration-navbar.blade.php │ │ │ ├── show.blade.php │ │ │ └── configure-cloudflare-tunnels.blade.php │ │ ├── storage │ │ │ └── show.blade.php │ │ ├── subscription │ │ │ └── show.blade.php │ │ ├── team │ │ │ └── create.blade.php │ │ ├── switch-team.blade.php │ │ ├── command-center │ │ │ └── index.blade.php │ │ ├── dev │ │ │ ├── s3-test.blade.php │ │ │ └── compose.blade.php │ │ └── help.blade.php │ ├── emails │ │ ├── email-verification.blade.php │ │ ├── server-force-enabled.blade.php │ │ ├── test.blade.php │ │ ├── help.blade.php │ │ ├── waitlist-invitation.blade.php │ │ ├── updates.blade.php │ │ ├── server-revived.blade.php │ │ ├── backup-success.blade.php │ │ ├── s3-connection-error.blade.php │ │ ├── subscription-invoice-failed.blade.php │ │ ├── backup-failed.blade.php │ │ ├── container-stopped.blade.php │ │ ├── reset-password.blade.php │ │ ├── scheduled-task-failed.blade.php │ │ ├── application-status-changes.blade.php │ │ ├── server-force-disabled.blade.php │ │ ├── trial-ended.blade.php │ │ ├── trial-ends-soon.blade.php │ │ ├── high-disk-usage.blade.php │ │ ├── invitation-link.blade.php │ │ ├── application-deployment-failed.blade.php │ │ ├── application-deployment-success.blade.php │ │ ├── server-lost-connection.blade.php │ │ ├── waitlist-confirmation.blade.php │ │ ├── before-trial-conversion.blade.php │ │ ├── container-restarted.blade.php │ │ └── daily-backup.blade.php │ ├── destination │ │ └── show.blade.php │ ├── layouts │ │ ├── boarding.blade.php │ │ └── simple.blade.php │ ├── security │ │ └── index.blade.php │ ├── server │ │ └── create.blade.php │ ├── auth │ │ └── verify-email.blade.php │ └── errors │ │ ├── 402.blade.php │ │ └── 503.blade.php ├── js │ └── app.js └── fonts │ ├── inter-v13-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-100.woff2 │ ├── inter-v13-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-200.woff2 │ ├── inter-v13-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-300.woff2 │ ├── inter-v13-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-500.woff2 │ ├── inter-v13-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-600.woff2 │ ├── inter-v13-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-700.woff2 │ ├── inter-v13-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-800.woff2 │ ├── inter-v13-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-900.woff2 │ └── inter-v13-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-regular.woff2 ├── other ├── logos │ ├── bc.png │ ├── advin.png │ ├── codext.jpg │ ├── logto.webp │ ├── fractal.png │ ├── hetzner.jpg │ ├── ccc-logo.webp │ ├── supaguide.png │ └── trieve_bg.png └── scripts │ └── get-subs.php ├── app ├── Models │ ├── Kubernetes.php │ ├── Waitlist.php │ ├── Webhook.php │ ├── ServerSetting.php │ ├── ProjectSetting.php │ ├── SharedEnvironmentVariable.php │ ├── ScheduledTaskExecution.php │ ├── PersonalAccessToken.php │ ├── ScheduledDatabaseBackupExecution.php │ ├── GitlabApp.php │ ├── BaseModel.php │ ├── OauthSetting.php │ ├── ScheduledTask.php │ └── TeamInvitation.php ├── Exceptions │ └── ProcessException.php ├── Enums │ ├── ActivityTypes.php │ ├── ApplicationDeploymentStatus.php │ ├── ProxyTypes.php │ └── ProcessStatus.php ├── Notifications │ └── Channels │ │ ├── SendsEmail.php │ │ ├── SendsDiscord.php │ │ ├── SendsTelegram.php │ │ └── DiscordChannel.php ├── Livewire │ ├── Project │ │ ├── Shared │ │ │ ├── Storages │ │ │ │ └── All.php │ │ │ └── ScheduledTask │ │ │ │ └── Executions.php │ │ ├── Database │ │ │ └── BackupNow.php │ │ ├── New │ │ │ └── EmptyProject.php │ │ └── Index.php │ ├── SharedVariables │ │ ├── Index.php │ │ ├── Project │ │ │ └── Index.php │ │ └── Environment │ │ │ └── Index.php │ ├── Source │ │ └── Gitlab │ │ │ └── Change.php │ ├── Server │ │ ├── Proxy │ │ │ └── Modal.php │ │ ├── Index.php │ │ └── Create.php │ ├── Storage │ │ ├── Index.php │ │ └── Show.php │ ├── CommandCenter │ │ └── Index.php │ ├── Subscription │ │ ├── Actions.php │ │ └── Show.php │ ├── Team │ │ ├── Member │ │ │ └── Index.php │ │ └── Storage │ │ │ └── Show.php │ ├── LayoutPopups.php │ └── VerifyEmail.php ├── Data │ └── ServerMetadata.php ├── Actions │ ├── Server │ │ ├── StopSentinel.php │ │ └── RunCommand.php │ ├── Fortify │ │ └── PasswordValidationRules.php │ └── Shared │ │ └── PullImage.php ├── Events │ ├── ProxyStarted.php │ └── TestEvent.php ├── Http │ └── Middleware │ │ ├── EncryptCookies.php │ │ ├── VerifyCsrfToken.php │ │ ├── TrimStrings.php │ │ ├── TrustHosts.php │ │ ├── Authenticate.php │ │ ├── PreventRequestsDuringMaintenance.php │ │ ├── ValidateSignature.php │ │ └── TrustProxies.php ├── Providers │ ├── BroadcastServiceProvider.php │ └── AuthServiceProvider.php ├── Console │ └── Commands │ │ ├── Horizon.php │ │ ├── Scheduler.php │ │ └── CleanupQueue.php ├── Listeners │ ├── MaintenanceModeEnabledNotification.php │ └── ProxyStartedNotification.php ├── View │ └── Components │ │ ├── Services │ │ └── Explanation.php │ │ ├── Status │ │ ├── Index.php │ │ └── Services.php │ │ ├── Server │ │ └── Sidebar.php │ │ ├── ResourceView.php │ │ └── Forms │ │ └── Button.php └── Jobs │ └── ServerStorageSaveJob.php ├── postcss.config.cjs ├── versions.json ├── .env.production ├── scripts ├── generate_pg_data.sh └── cloud_upgrade.sh ├── .gitattributes ├── .coolify-logo ├── .editorconfig ├── .env.windows-docker-desktop.example ├── .env.development.example ├── examples ├── traefik-dynamic-coolify.yaml └── traefik-dynamic-catch-all.yaml ├── .dockerignore ├── SECURITY.md ├── templates └── compose │ ├── pocketbase.yaml │ ├── cloudflared.yaml │ ├── dashboard.yaml │ ├── slash.yaml │ ├── budge.yaml │ ├── wordpress-without-database.yaml │ ├── whoogle.yaml │ ├── homepage.yaml │ ├── heimdall.yaml │ ├── grocy.yaml │ ├── nocodb.yaml │ ├── metube.yaml │ ├── classicpress-without-database.yaml │ ├── embystat.yaml │ ├── dokuwiki.yaml │ ├── uptime-kuma.yaml │ ├── pairdrop.yaml │ ├── rabbitmq.yaml │ ├── snapdrop.yaml │ ├── docuseal.yaml │ ├── syncthing.yaml │ ├── statusnook.yaml │ ├── duplicati.yaml │ ├── mediawiki.yaml │ ├── babybuddy.yaml │ ├── vikunja.yaml │ ├── n8n.yaml │ ├── appsmith.yaml │ ├── emby.yaml │ ├── grafana.yaml │ ├── gitea.yaml │ ├── nextcloud.yaml │ ├── stirling-pdf.yaml │ ├── phpmyadmin.yaml │ ├── meilisearch.yaml │ ├── jellyfin.yaml │ └── openblocks.yaml ├── phpunit.dusk.xml ├── .gitignore ├── routes └── console.php └── package.json /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite* 2 | -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /pint.json: -------------------------------------------------------------------------------- 1 | { 2 | "preset": "laravel" 3 | } 4 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: / 3 | -------------------------------------------------------------------------------- /storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /tests/Browser/source/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /docker/dev/etc/s6-overlay/s6-rc.d/horizon/type: -------------------------------------------------------------------------------- 1 | longrun 2 | -------------------------------------------------------------------------------- /docker/dev/etc/s6-overlay/s6-rc.d/init-setup/type: -------------------------------------------------------------------------------- 1 | oneshot -------------------------------------------------------------------------------- /docker/dev/etc/s6-overlay/s6-rc.d/user/contents.d/horizon: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docker/prod/etc/s6-overlay/s6-rc.d/user/contents.d/horizon: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /tests/Browser/console/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /tests/Browser/screenshots/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /config/version.php: -------------------------------------------------------------------------------- 1 | 2 | WIP 3 | 4 | -------------------------------------------------------------------------------- /other/logos/bc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkGhostHunter/coolify/main/other/logos/bc.png -------------------------------------------------------------------------------- /public/coolify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkGhostHunter/coolify/main/public/coolify.png -------------------------------------------------------------------------------- /public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkGhostHunter/coolify/main/public/favicon.png -------------------------------------------------------------------------------- /public/svgs/n8n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkGhostHunter/coolify/main/public/svgs/n8n.png -------------------------------------------------------------------------------- /resources/views/components/highlighted.blade.php: -------------------------------------------------------------------------------- 1 | {{ $text }} 2 | -------------------------------------------------------------------------------- /bootstrap/getVersion.php: -------------------------------------------------------------------------------- 1 | 2 |

New GitHub Source

3 | 4 | 5 | -------------------------------------------------------------------------------- /resources/views/source/gitlab/new.blade.php: -------------------------------------------------------------------------------- 1 | 2 |

New GitHub Source

3 | 4 |
5 | -------------------------------------------------------------------------------- /public/coolify-transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkGhostHunter/coolify/main/public/coolify-transparent.png -------------------------------------------------------------------------------- /public/svgs/changedetection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkGhostHunter/coolify/main/public/svgs/changedetection.png -------------------------------------------------------------------------------- /public/svgs/docker-registry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkGhostHunter/coolify/main/public/svgs/docker-registry.png -------------------------------------------------------------------------------- /public/svgs/whoogle-search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkGhostHunter/coolify/main/public/svgs/whoogle-search.png -------------------------------------------------------------------------------- /resources/views/livewire/source/gitlab/change.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {{-- In work, do what you enjoy. --}} 3 |
4 | -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /public/vendor/horizon/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkGhostHunter/coolify/main/public/vendor/horizon/img/favicon.png -------------------------------------------------------------------------------- /docker/prod/etc/s6-overlay/s6-rc.d/db-migration/up: -------------------------------------------------------------------------------- 1 | #!/command/execlineb -P 2 | php /var/www/html/artisan migrate --force --isolated 3 | -------------------------------------------------------------------------------- /resources/views/emails/email-verification.blade.php: -------------------------------------------------------------------------------- 1 | 2 | Verify your email [here]({{ $url }}). 3 | 4 | -------------------------------------------------------------------------------- /resources/views/livewire/project/database/backup-now.blade.php: -------------------------------------------------------------------------------- 1 | Backup Now 2 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/table.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {{ Illuminate\Mail\Markdown::parse($slot) }} 3 |
4 | -------------------------------------------------------------------------------- /versions.json: -------------------------------------------------------------------------------- 1 | { 2 | "coolify": { 3 | "v4": { 4 | "version": "4.0.0-beta.306" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /resources/views/destination/show.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /resources/views/livewire/project/new/empty-project.blade.php: -------------------------------------------------------------------------------- 1 | Empty Project 2 | -------------------------------------------------------------------------------- /docker/prod/etc/s6-overlay/s6-rc.d/init-seeder/up: -------------------------------------------------------------------------------- 1 | #!/command/execlineb -P 2 | php /var/www/html/artisan db:seed --class ProductionSeeder --force 3 | -------------------------------------------------------------------------------- /resources/views/components/emails/layout.blade.php: -------------------------------------------------------------------------------- 1 | 2 | {{ Illuminate\Mail\Markdown::parse($slot) }} 3 | 4 | -------------------------------------------------------------------------------- /resources/views/emails/server-force-enabled.blade.php: -------------------------------------------------------------------------------- 1 | 2 | Your server ({{ $name }}) is enabled again! 3 | 4 | -------------------------------------------------------------------------------- /bootstrap/includeHelpers.php: -------------------------------------------------------------------------------- 1 | 2 | If you are seeing this, it means that your Email settings are correct. 3 | 4 | -------------------------------------------------------------------------------- /resources/views/emails/help.blade.php: -------------------------------------------------------------------------------- 1 | {{ $description }} 2 | 3 | {{ Illuminate\Mail\Markdown::parse('---') }} 4 | 5 | {{ Illuminate\Mail\Markdown::parse($debug) }} 6 | -------------------------------------------------------------------------------- /resources/views/livewire/verify-email.blade.php: -------------------------------------------------------------------------------- 1 |
2 | Send Verification Email Again 3 |
4 | -------------------------------------------------------------------------------- /docker/dev/etc/s6-overlay/s6-rc.d/horizon/run: -------------------------------------------------------------------------------- 1 | #!/command/execlineb -P 2 | foreground { 3 | s6-sleep 5 4 | su - webuser -c "php /var/www/html/artisan start:horizon" 5 | } 6 | -------------------------------------------------------------------------------- /docker/prod/etc/s6-overlay/s6-rc.d/horizon/run: -------------------------------------------------------------------------------- 1 | #!/command/execlineb -P 2 | foreground { 3 | s6-sleep 5 4 | su - webuser -c "php /var/www/html/artisan start:horizon" 5 | } 6 | -------------------------------------------------------------------------------- /.env.production: -------------------------------------------------------------------------------- 1 | APP_ID= 2 | APP_NAME=Coolify 3 | APP_KEY= 4 | 5 | DB_PASSWORD= 6 | REDIS_PASSWORD= 7 | 8 | PUSHER_APP_ID= 9 | PUSHER_APP_KEY= 10 | PUSHER_APP_SECRET= 11 | -------------------------------------------------------------------------------- /resources/views/emails/waitlist-invitation.blade.php: -------------------------------------------------------------------------------- 1 | 2 | You have been invited to join the Coolify Cloud: [Get Started]({{ $loginLink }}) 3 | 4 | -------------------------------------------------------------------------------- /docker/dev/etc/s6-overlay/s6-rc.d/scheduler-worker/run: -------------------------------------------------------------------------------- 1 | #!/command/execlineb -P 2 | foreground { 3 | s6-sleep 5 4 | su - webuser -c "php /var/www/html/artisan start:scheduler" 5 | } 6 | -------------------------------------------------------------------------------- /resources/views/emails/updates.blade.php: -------------------------------------------------------------------------------- 1 | 2 | If you do not like to receive these emails, you can unsubscribe [here]({{ $unsubscribeUrl }}). 3 | 4 | -------------------------------------------------------------------------------- /resources/views/livewire/server/create.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | -------------------------------------------------------------------------------- /app/Enums/ActivityTypes.php: -------------------------------------------------------------------------------- 1 | 4 | {{ $slot }} 5 | 6 | @parent 7 | @endsection 8 | -------------------------------------------------------------------------------- /app/Notifications/Channels/SendsDiscord.php: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /resources/js/app.js: -------------------------------------------------------------------------------- 1 | // import { createApp } from "vue"; 2 | // import MagicBar from "./components/MagicBar.vue"; 3 | 4 | // const app = createApp({}); 5 | // app.component("magic-bar", MagicBar); 6 | // app.mount("#vue"); 7 | -------------------------------------------------------------------------------- /resources/views/emails/server-revived.blade.php: -------------------------------------------------------------------------------- 1 | 2 | Your server ({{ $name }}) was offline for a while, but it is back online now. All automations & integrations are turned on again. 3 | 4 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/text/layout.blade.php: -------------------------------------------------------------------------------- 1 | {!! strip_tags($header) !!} 2 | 3 | {!! strip_tags($slot) !!} 4 | @isset($subcopy) 5 | {!! strip_tags($subcopy) !!} 6 | @endisset 7 | 8 | {!! strip_tags($footer) !!} 9 | -------------------------------------------------------------------------------- /resources/views/emails/backup-success.blade.php: -------------------------------------------------------------------------------- 1 | 2 | Database backup for {{ $name }} @if($database_name)(db:{{ $database_name }})@endif with frequency of {{ $frequency }} was successful. 3 | 4 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | Connection could not be established with one of your S3 Storage ({{ $name }}). Please fix it [here]({{ $url }}). 4 | 5 | {{ $reason }} 6 | 7 | -------------------------------------------------------------------------------- /resources/views/layouts/simple.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.base') 2 | @section('body') 3 | @livewireScripts 4 |
5 | {{ $slot }} 6 |
7 | @parent 8 | @endsection 9 | -------------------------------------------------------------------------------- /resources/views/livewire/storage/show.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | {{ data_get_str($storage, 'name')->limit(10) }} >Storages | Coolify 4 | 5 | 6 |
7 | -------------------------------------------------------------------------------- /docker/dev/etc/s6-overlay/s6-rc.d/init-setup/up: -------------------------------------------------------------------------------- 1 | #!/command/execlineb -P 2 | foreground { composer -d /var/www/html/ install } 3 | foreground { php /var/www/html/artisan migrate --step } 4 | foreground { php /var/www/html/artisan dev:init } 5 | 6 | -------------------------------------------------------------------------------- /public/svgs/internal-link.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /resources/views/emails/subscription-invoice-failed.blade.php: -------------------------------------------------------------------------------- 1 | 2 | Your last invoice has failed to be paid for Coolify Cloud. 3 | 4 | Please update payment details [here]({{ $stripeCustomerPortal }}). 5 | 6 | -------------------------------------------------------------------------------- /scripts/generate_pg_data.sh: -------------------------------------------------------------------------------- 1 | psql -U postgres -c "create table if not exists test (id SERIAL UNIQUE NOT NULL,article TEXT);" 2 | psql -U postgres -c "insert into test (article) select md5(random()::text) from generate_series(1, 1000000) s(i);" 3 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | 3 | *.blade.php diff=html 4 | *.css diff=css 5 | *.html diff=html 6 | *.md diff=markdown 7 | *.php diff=php 8 | 9 | /.github export-ignore 10 | CHANGELOG.md export-ignore 11 | .styleci.yml export-ignore 12 | -------------------------------------------------------------------------------- /app/Models/Waitlist.php: -------------------------------------------------------------------------------- 1 | 4 | {{ config('app.name') ?? 'Coolify' }} 5 | 6 | {{ Illuminate\Mail\Markdown::parse('[Contact Support](https://coolify.io/docs/contact)') }} 7 | -------------------------------------------------------------------------------- /resources/views/emails/backup-failed.blade.php: -------------------------------------------------------------------------------- 1 | 2 | Database backup for {{ $name }} @if($database_name)(db:{{ $database_name }})@endif with frequency of {{ $frequency }} was FAILED. 3 | 4 | ### Reason 5 | 6 | {{ $output }} 7 | 8 | -------------------------------------------------------------------------------- /resources/views/livewire/project/delete-project.blade.php: -------------------------------------------------------------------------------- 1 | 2 | This project will be deleted. It is not reversible.
Please think again. 3 |
4 | -------------------------------------------------------------------------------- /resources/views/emails/container-stopped.blade.php: -------------------------------------------------------------------------------- 1 | 2 | A resource ({{ $containerName }}) has been stopped unexpectedly on {{ $serverName }}. 3 | 4 | @if ($url) 5 | Please check what is going on [here]({{ $url }}). 6 | @endif 7 | 8 | -------------------------------------------------------------------------------- /resources/views/emails/reset-password.blade.php: -------------------------------------------------------------------------------- 1 | 2 | A password reset has been requested for this email address. 3 | 4 | Click [here]({{ $url }}) to reset your password. 5 | 6 | This link will expire in {{ $count }} minutes. 7 | 8 | -------------------------------------------------------------------------------- /resources/views/livewire/project/delete-environment.blade.php: -------------------------------------------------------------------------------- 1 | 2 | This environment will be deleted. It is not reversible.
Please think again. 3 |
4 | -------------------------------------------------------------------------------- /resources/views/emails/scheduled-task-failed.blade.php: -------------------------------------------------------------------------------- 1 | 2 | Scheduled task ({{ $task->name }}) was FAILED with the following error: 3 | 4 |
 5 | {{ $output }}
 6 | 
7 | 8 | Click [here]({{ $url }}) to view the task. 9 |
10 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/subcopy.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /resources/views/emails/application-status-changes.blade.php: -------------------------------------------------------------------------------- 1 | 2 | {{ $name }} has been stopped. 3 | 4 | If it was your intention to stop this application, you can ignore this email. 5 | 6 | If not, [check what is going on]({{ $application_url }}). 7 | 8 | -------------------------------------------------------------------------------- /database/seeders/EnvironmentSeeder.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /resources/views/components/version.blade.php: -------------------------------------------------------------------------------- 1 | merge(['class' => 'text-xs cursor-pointer opacity-90 hover:opacity-100 dark:hover:text-white hover:text-black']) }} 2 | href="https://github.com/coollabsio/coolify/releases/tag/v{{ config('version') }}">v{{ config('version') }} 3 | -------------------------------------------------------------------------------- /app/Livewire/Project/Shared/Storages/All.php: -------------------------------------------------------------------------------- 1 | '$refresh']; 12 | } 13 | -------------------------------------------------------------------------------- /app/Livewire/SharedVariables/Index.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | Subscription | Coolify 4 | 5 |

Subscription

6 |
Here you can see and manage your subscription.
7 | 8 | 9 | -------------------------------------------------------------------------------- /.coolify-logo: -------------------------------------------------------------------------------- 1 | _____ _ _ __ 2 | / ____| | (_)/ _| 3 | | | ___ ___ | |_| |_ _ _ 4 | | | / _ \ / _ \| | | _| | | | 5 | | |___| (_) | (_) | | | | | |_| | 6 | \_____\___/ \___/|_|_|_| \__, | 7 | __/ | 8 | |___/ 9 | -------------------------------------------------------------------------------- /resources/views/emails/server-force-disabled.blade.php: -------------------------------------------------------------------------------- 1 | 2 | Your server ({{ $name }}) disabled because it is not paid! All automations and integrations are stopped. 3 | 4 | Please update your subscription to enable the server again [here](https://app.coolify.io/subsciprtions). 5 | 6 | -------------------------------------------------------------------------------- /resources/views/livewire/server/private-key/show.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | Server Connection | Coolify 4 | 5 | 6 | 7 |
8 | -------------------------------------------------------------------------------- /app/Models/Webhook.php: -------------------------------------------------------------------------------- 1 | 'string', 13 | 'payload' => 'encrypted', 14 | ]; 15 | } 16 | -------------------------------------------------------------------------------- /database/seeders/ServiceSeeder.php: -------------------------------------------------------------------------------- 1 | belongsTo(Server::class); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /database/seeders/KubernetesSeeder.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 |
Private Keys
6 |
7 |
8 | 9 | -------------------------------------------------------------------------------- /app/Models/ProjectSetting.php: -------------------------------------------------------------------------------- 1 | belongsTo(Project::class); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /database/seeders/SubscriptionSeeder.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /resources/views/emails/trial-ended.blade.php: -------------------------------------------------------------------------------- 1 | 2 | Your trial ended. All automations and integrations are disabled for all of your servers. 3 | 4 | Please update payment details [here]({{ $stripeCustomerPortal }}) or in [Coolify Cloud](https://app.coolify.io) to continue using our services. 5 | 6 | -------------------------------------------------------------------------------- /resources/views/emails/trial-ends-soon.blade.php: -------------------------------------------------------------------------------- 1 | 2 | Your trial ends soon. Please update payment details [here]({{ $stripeCustomerPortal }}), 3 | 4 | Your servers & deployed resources will be untouched, but you won't be able to deploy new resources and lose all automations and integrations. 5 | 6 | -------------------------------------------------------------------------------- /database/seeders/LocalFileVolumeSeeder.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{ data_get_str($server, 'name')->limit(10) }} > Server Destinations | Coolify 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /resources/views/livewire/team/create.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | Continue 6 | 7 | 8 | -------------------------------------------------------------------------------- /database/seeders/ServiceApplicationSeeder.php: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/Enums/ApplicationDeploymentStatus.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Save 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/Models/SharedEnvironmentVariable.php: -------------------------------------------------------------------------------- 1 | 'string', 13 | 'value' => 'encrypted', 14 | ]; 15 | } 16 | -------------------------------------------------------------------------------- /resources/views/livewire/switch-team.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | @foreach (auth()->user()->teams as $team) 4 | 5 | @endforeach 6 | 7 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 4 7 | indent_style = space 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{yml,yaml}] 15 | indent_size = 2 16 | 17 | [docker-compose.yml] 18 | indent_size = 4 19 | -------------------------------------------------------------------------------- /.env.windows-docker-desktop.example: -------------------------------------------------------------------------------- 1 | IS_WINDOWS_DOCKER_DESKTOP=true 2 | 3 | APP_ID=coolify-windows-docker-desktop 4 | APP_NAME=Coolify 5 | APP_KEY=base64:ssTlCmrIE/q7whnKMvT6DwURikg69COzGsAwFVROm80= 6 | 7 | DB_PASSWORD=coolify 8 | REDIS_PASSWORD=coolify 9 | 10 | PUSHER_APP_ID=coolify 11 | PUSHER_APP_KEY=coolify 12 | PUSHER_APP_SECRET=coolify 13 | -------------------------------------------------------------------------------- /app/Data/ServerMetadata.php: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/Enums/ProcessStatus.php: -------------------------------------------------------------------------------- 1 | dispatch('proxyStatusUpdated'); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /.env.development.example: -------------------------------------------------------------------------------- 1 | APP_NAME=Coolify-localhost 2 | APP_ID=development 3 | APP_ENV=local 4 | APP_KEY= 5 | APP_DEBUG=true 6 | APP_URL=http://localhost 7 | APP_PORT=8000 8 | MUX_ENABLED=false 9 | 10 | DUSK_DRIVER_URL=http://selenium:4444 11 | 12 | ## For Andras only 13 | # To purge cache 14 | BUNNY_API_KEY= 15 | # To upload assets 16 | BUNNY_STORAGE_API_KEY= 17 | -------------------------------------------------------------------------------- /examples/traefik-dynamic-coolify.yaml: -------------------------------------------------------------------------------- 1 | # This is an example dynamic configuration. 2 | http: 3 | routers: 4 | coolify-http: 5 | entryPoints: 6 | - http 7 | service: coolify 8 | rule: Host(`coolify.io`) 9 | services: 10 | coolify: 11 | loadBalancer: 12 | servers: 13 | - 14 | url: 'http://coolify:80' -------------------------------------------------------------------------------- /app/Models/ScheduledTaskExecution.php: -------------------------------------------------------------------------------- 1 | belongsTo(ScheduledTask::class); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/Actions/Server/StopSentinel.php: -------------------------------------------------------------------------------- 1 | 2 |

Destination

3 |
The destination server / network where your application will be deployed to.
4 |
5 |

Server: {{ data_get($destination, 'server.name') }}

6 |

Destination Network: {{ $destination->network }}

7 |
8 | 9 | -------------------------------------------------------------------------------- /scripts/cloud_upgrade.sh: -------------------------------------------------------------------------------- 1 | set -e 2 | export IMAGE=$1 3 | docker system prune -af 4 | docker compose pull 5 | read -p "Press Enter to update Coolify to $IMAGE..." last_version 9 | docker compose logs -f 10 | -------------------------------------------------------------------------------- /resources/views/components/use-magic-bar.blade.php: -------------------------------------------------------------------------------- 1 |
2 | @if (isset($link)) 3 | Create a new one 4 | 5 | here. 6 | 7 | {{-- @else 8 | Use the magic 9 | bar (press /) to create a new one. --}} 10 | @endif 11 |
12 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | /.phpunit.cache 2 | /node_modules 3 | /public/build 4 | /public/hot 5 | /public/storage 6 | /storage/*.key 7 | /vendor 8 | .env 9 | .env.backup 10 | .env.secrets 11 | .phpunit.result.cache 12 | Homestead.json 13 | Homestead.yaml 14 | auth.json 15 | npm-debug.log 16 | yarn-error.log 17 | /.fleet 18 | /.idea 19 | /.vscode 20 | /.npm 21 | /.bash_history 22 | /_data 23 | .rnd 24 | /.ssh 25 | -------------------------------------------------------------------------------- /app/Models/PersonalAccessToken.php: -------------------------------------------------------------------------------- 1 | 2 | Your server ({{ $name }}) has high disk usage ({{ $disk_usage }}% used). Threshold is {{ $threshold }}%. 3 | 4 | Please cleanup your disk to prevent data-loss. Here are some [tips](https://coolify.io/docs/knowledge-base/server/automated-cleanup). 5 | 6 | (You can change the threshold in the Server Settings menu.) 7 | 8 | -------------------------------------------------------------------------------- /resources/views/emails/invitation-link.blade.php: -------------------------------------------------------------------------------- 1 | 2 | You have been invited to "{{ $team }}" on "{{ config('app.name') }}". 3 | 4 | Please [click here]({{ $invitation_link }}) to accept the invitation. 5 | 6 | If you have any questions, please contact the team owner.

7 | 8 | If it was not you who requested this invitation, please ignore this email. 9 |
10 | -------------------------------------------------------------------------------- /other/scripts/get-subs.php: -------------------------------------------------------------------------------- 1 | $handle = fopen("/tmp/export.csv", "w"); 2 | App\Models\Team::chunk(100, function ($teams) use ($handle) { 3 | foreach ($teams as $team) { 4 | if ($team->subscription->stripe_invoice_paid == true) { 5 | foreach ($team->members as $member) { 6 | fputcsv($handle, [$member->email, $member->name], ","); 7 | } 8 | } 9 | } 10 | }); 11 | fclose($handle); 12 | -------------------------------------------------------------------------------- /resources/views/emails/application-deployment-failed.blade.php: -------------------------------------------------------------------------------- 1 | 2 | @if ($pull_request_id === 0) 3 | Failed to deploy a new version of {{ $name }} at [{{ $fqdn }}]({{ $fqdn }}) . 4 | @else 5 | Failed to deploy a pull request #{{ $pull_request_id }} of {{ $name }} at 6 | [{{ $fqdn }}]({{ $fqdn }}). 7 | @endif 8 | 9 | [View Deployment Logs]({{ $deployment_url }}) 10 | 11 | -------------------------------------------------------------------------------- /resources/views/emails/application-deployment-success.blade.php: -------------------------------------------------------------------------------- 1 | 2 | @if ($pull_request_id === 0) 3 | A new version of {{ $name }} is available at [{{ $fqdn }}]({{ $fqdn }}) . 4 | @else 5 | Pull request #{{ $pull_request_id }} of {{ $name }} deployed successfully 6 | [{{ $fqdn }}]({{ $fqdn }}). 7 | @endif 8 | 9 | [View Deployment Logs]({{ $deployment_url }}) 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/Http/Middleware/EncryptCookies.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /app/Models/ScheduledDatabaseBackupExecution.php: -------------------------------------------------------------------------------- 1 | belongsTo(ScheduledDatabaseBackup::class); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /resources/views/livewire/server/proxy/new-dynamic-configuration.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | Save 5 | 6 | -------------------------------------------------------------------------------- /resources/views/components/limit-reached.blade.php: -------------------------------------------------------------------------------- 1 |
2 | You have reached the limit of {{ $name }} you can create. 3 | Please upgrade your 4 | subscription to create more 5 | {{ $name }}. 6 |
7 | -------------------------------------------------------------------------------- /resources/views/emails/server-lost-connection.blade.php: -------------------------------------------------------------------------------- 1 | 2 | Coolify cannot connect to your server ({{ $name }}). Please check your server and make sure it is running. 3 | 4 | All automations & integrations are turned off! 5 | 6 | IMPORTANT: We automatically try to revive your server and turn on all automations & integrations. 7 | 8 | If you have any questions, please contact us. 9 | 10 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/footer.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/Http/Middleware/VerifyCsrfToken.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /resources/views/emails/waitlist-confirmation.blade.php: -------------------------------------------------------------------------------- 1 | 2 | Someone added this email to the Coolify Cloud's waitlist. [Click here]({{ $confirmation_url }}) to confirm! 3 | 4 | The link will expire in {{ config('constants.waitlist.expiration') }} minutes. 5 | 6 | You have no idea what [Coolify Cloud](https://coolify.io) is or this waitlist? [Click here]({{ $cancel_url }}) to remove you from the waitlist. 7 | 8 | -------------------------------------------------------------------------------- /resources/views/emails/before-trial-conversion.blade.php: -------------------------------------------------------------------------------- 1 | 2 | We would like to inform you that a {{ config('constants.limits.trial_period') }} days of trial has been added to all subscription plans. 3 | 4 | You can try out Coolify, without payment information for free. If you like it, you can upgrade to a paid plan at any time. 5 | 6 | [Click here](https://app.coolify.io/subscription/new) to start your trial. 7 | 8 | -------------------------------------------------------------------------------- /resources/views/livewire/project/application/previews-compose.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 4 | Save 5 | Generate 6 | Domain 7 |
8 | -------------------------------------------------------------------------------- /resources/views/livewire/project/resource/environment-select.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @foreach ($environments as $environment) 5 | 7 | @endforeach 8 | 9 | -------------------------------------------------------------------------------- /database/seeders/ProjectSettingSeeder.php: -------------------------------------------------------------------------------- 1 | settings->wildcard_domain = 'wildcard.example.com'; 13 | // $first_project->settings->save(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /resources/views/server/create.blade.php: -------------------------------------------------------------------------------- 1 | 2 | @if ($private_keys->count() === 0) 3 |

Create Private Key

4 |
You need to create a private key before you can create a server.
5 | 6 | @else 7 | 8 | @endif 9 |
10 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/header.blade.php: -------------------------------------------------------------------------------- 1 | @props(['url']) 2 | 3 | 4 | 5 | @if (trim($slot) === 'Laravel') 6 | 7 | @else 8 | {{ $slot }} 9 | @endif 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/Livewire/Storage/Index.php: -------------------------------------------------------------------------------- 1 | s3 = S3Storage::ownedByCurrentTeam()->get(); 15 | } 16 | 17 | public function render() 18 | { 19 | return view('livewire.storage.index'); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | Use this section to tell people about which versions of your project are 6 | currently being supported with security updates. 7 | 8 | | Version | Supported | 9 | | ------- | ------------------ | 10 | | > 4 | :white_check_mark: | 11 | | 3 | :x: | 12 | 13 | 14 | ## Reporting a Vulnerability 15 | 16 | If you have any vulnerability please report at hi@coollabs.io 17 | -------------------------------------------------------------------------------- /resources/views/components/status/stopped.blade.php: -------------------------------------------------------------------------------- 1 | @props([ 2 | 'status' => 'Stopped', 3 | ]) 4 |
5 | 6 | 7 |
8 |
{{ str($status)->before(':')->headline() }}
9 |
10 |
11 | -------------------------------------------------------------------------------- /database/seeders/ProjectSeeder.php: -------------------------------------------------------------------------------- 1 | 'My first project', 14 | 'description' => 'This is a test project in development', 15 | 'team_id' => 0, 16 | ]); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/Livewire/CommandCenter/Index.php: -------------------------------------------------------------------------------- 1 | servers = Server::isReachable()->get(); 15 | } 16 | 17 | public function render() 18 | { 19 | return view('livewire.command-center.index'); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Models/GitlabApp.php: -------------------------------------------------------------------------------- 1 | morphMany(Application::class, 'source'); 15 | } 16 | 17 | public function privateKey() 18 | { 19 | return $this->belongsTo(PrivateKey::class); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /tests/Browser/Pages/Page.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | public static function siteElements(): array 15 | { 16 | return [ 17 | '@element' => '#selector', 18 | ]; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/Providers/BroadcastServiceProvider.php: -------------------------------------------------------------------------------- 1 | 'Swarm Docker 1', 17 | // 'server_id' => 1, 18 | // ]); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /tests/Browser/ExampleTest.php: -------------------------------------------------------------------------------- 1 | browse(function (Browser $browser) { 16 | $browser->visit('/') 17 | ->assertSee('Laravel'); 18 | }); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrimStrings.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | 'current_password', 16 | 'password', 17 | 'password_confirmation', 18 | ]; 19 | } 20 | -------------------------------------------------------------------------------- /public/vendor/horizon/mix-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "/app.js": "/app.js?id=b4f3f08e60211bd6948ec35e5e9de9a1", 3 | "/app-dark.css": "/app-dark.css?id=15c72df05e2b1147fa3e4b0670cfb435", 4 | "/app.css": "/app.css?id=4d6a1a7fe095eedc2cb2a4ce822ea8a5", 5 | "/img/favicon.png": "/img/favicon.png?id=1542bfe8a0010dcbee710da13cce367f", 6 | "/img/horizon.svg": "/img/horizon.svg?id=904d5b5185fefb09035384e15bfca765", 7 | "/img/sprite.svg": "/img/sprite.svg?id=afc4952b74895bdef3ab4ebe9adb746f" 8 | } 9 | -------------------------------------------------------------------------------- /tests/CreatesApplication.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class)->bootstrap(); 18 | 19 | return $app; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrustHosts.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | public function hosts(): array 15 | { 16 | return [ 17 | $this->allSubdomainsOfApplicationUrl(), 18 | ]; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /resources/views/emails/container-restarted.blade.php: -------------------------------------------------------------------------------- 1 | 2 | A resource ({{ $containerName }}) has been restarted automatically on {{ $serverName }}, because it was stopped unexpectedly. 3 | 4 | @if ($containerName === 'coolify-proxy') 5 | Coolify Proxy should run on your server as you have FQDNs set up in one of your resources. 6 | 7 | If you don't want to use Coolify Proxy, please remove FQDN from your resources or set Proxy type to Custom(None). 8 | @endif 9 | 10 | -------------------------------------------------------------------------------- /resources/views/emails/daily-backup.blade.php: -------------------------------------------------------------------------------- 1 | 2 | @foreach ($databases as $database_name => $databases) 3 | 4 | @if(data_get($databases,'failed_count') > 0) 5 | 6 |
7 | 8 | "{{ $database_name }}" backups: There were some failed backups. Please login and check the logs for more details. 9 | 10 |
11 | 12 | @else 13 | 14 | "{{ $database_name }}" backups: All backups were successful. 15 | 16 | @endif 17 | 18 | @endforeach 19 |
20 | -------------------------------------------------------------------------------- /resources/views/livewire/server/proxy/modal.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 | Close 9 | 10 | 11 | 12 |
13 | -------------------------------------------------------------------------------- /templates/compose/pocketbase.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://pocketbase.io/docs/ 2 | # slogan: Open Source backend for your next SaaS and Mobile app in 1 file 3 | # tags: pocketbase,backend,saas,mobile,api 4 | # logo: svgs/pocketbase.svg 5 | # port: 8080 6 | 7 | services: 8 | pocketbase: 9 | image: ghcr.io/coollabsio/pocketbase:latest 10 | environment: 11 | - SERVICE_FQDN_POCKETBASE_8080 12 | volumes: 13 | - pocketbase-data:/app/pb_data 14 | - pocketbase-hooks:/app/pb_hooks 15 | -------------------------------------------------------------------------------- /app/Actions/Server/RunCommand.php: -------------------------------------------------------------------------------- 1 | value); 16 | 17 | return $activity; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/Livewire/Project/Database/BackupNow.php: -------------------------------------------------------------------------------- 1 | backup 16 | )); 17 | $this->dispatch('success', 'Backup queued. It will be available in a few minutes.'); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/Actions/Fortify/PasswordValidationRules.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected function passwordRules(): array 15 | { 16 | return ['required', 'string', new Password, 'confirmed']; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/Http/Middleware/Authenticate.php: -------------------------------------------------------------------------------- 1 | expectsJson() ? null : route('login'); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/Livewire/Server/Index.php: -------------------------------------------------------------------------------- 1 | servers = Server::ownedByCurrentTeam()->get(); 16 | } 17 | 18 | public function render() 19 | { 20 | return view('livewire.server.index'); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /public/svgs/wordpress.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/Http/Middleware/PreventRequestsDuringMaintenance.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | 'webhooks/*', 16 | '/api/health', 17 | ]; 18 | } 19 | -------------------------------------------------------------------------------- /templates/compose/cloudflared.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/ 2 | # slogan: Client for Cloudflare Tunnel, a daemon that exposes private services through the Cloudflare edge. 3 | # logo: svgs/cloudflared.svg 4 | 5 | services: 6 | cloudflared: 7 | container_name: cloudflare-tunnel 8 | image: cloudflare/cloudflared:latest 9 | restart: unless-stopped 10 | command: tunnel run 11 | environment: 12 | - TUNNEL_TOKEN=$CLOUDFLARE_TUNNEL_TOKEN 13 | -------------------------------------------------------------------------------- /database/seeders/ApplicationSettingsSeeder.php: -------------------------------------------------------------------------------- 1 | load(['settings']); 16 | $application_1->settings->is_debug_enabled = false; 17 | $application_1->settings->save(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /resources/views/livewire/command-center/index.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | Command Center | Coolify 4 | 5 |

Command Center

6 |
Execute commands on your servers without leaving the browser.
7 | @if ($servers->count() > 0) 8 | 9 | @else 10 |
11 |
No servers found. Without a server, you won't be able to do much.
12 |
13 | @endif 14 |
15 | -------------------------------------------------------------------------------- /resources/views/livewire/project/new/docker-image.blade.php: -------------------------------------------------------------------------------- 1 |
2 |

Create a new Application

3 |
You can deploy an existing Docker Image from any Registry.
4 |
5 |
6 |

Docker Image

7 | Save 8 |
9 | 10 | 11 |
12 | -------------------------------------------------------------------------------- /resources/views/livewire/server/proxy/logs.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | Proxy Logs | Coolify 4 | 5 | 6 |
7 | 8 |
9 |

Logs

10 | 11 |
12 |
13 |
14 | -------------------------------------------------------------------------------- /app/Livewire/Subscription/Actions.php: -------------------------------------------------------------------------------- 1 | server_limits = Team::serverLimit(); 15 | } 16 | 17 | public function stripeCustomerPortal() 18 | { 19 | $session = getStripeCustomerPortalSession(currentTeam()); 20 | redirect($session->url); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Models/BaseModel.php: -------------------------------------------------------------------------------- 1 | uuid) { 17 | $model->uuid = (string) new Cuid2(7); 18 | } 19 | }); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /database/seeders/ApplicationPreviewSeeder.php: -------------------------------------------------------------------------------- 1 | $application_1->id, 17 | // 'pull_request_id' => 1 18 | // ]); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /resources/views/livewire/project/database/init-script.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | Save 5 | 6 | This script will be deleted. It is not reversible.
Please think again. 7 |
8 |
9 | 10 | 11 | -------------------------------------------------------------------------------- /resources/views/livewire/project/add-empty.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
New project will have a default production environment.
5 | 6 | Continue 7 | 8 | 9 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/panel.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/Livewire/SharedVariables/Project/Index.php: -------------------------------------------------------------------------------- 1 | projects = Project::ownedByCurrentTeam()->get(); 16 | } 17 | 18 | public function render() 19 | { 20 | return view('livewire.shared-variables.project.index'); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /database/seeders/StandaloneDockerSeeder.php: -------------------------------------------------------------------------------- 1 | 0, 17 | 'name' => 'Standalone Docker 1', 18 | 'network' => 'coolify', 19 | 'server_id' => 0, 20 | ]); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Livewire/Project/New/EmptyProject.php: -------------------------------------------------------------------------------- 1 | generate_random_name(), 14 | 'team_id' => currentTeam()->id, 15 | ]); 16 | 17 | return redirect()->route('project.show', ['project_uuid' => $project->uuid, 'environment_name' => 'production']); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/Livewire/SharedVariables/Environment/Index.php: -------------------------------------------------------------------------------- 1 | projects = Project::ownedByCurrentTeam()->get(); 16 | } 17 | 18 | public function render() 19 | { 20 | return view('livewire.shared-variables.environment.index'); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /resources/views/livewire/server/show.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | {{ data_get_str($server, 'name')->limit(10) }} > Server Configurations | Coolify 4 | 5 | 6 | 7 | @if ($server->isFunctional() && $server->isMetricsEnabled()) 8 |
9 | 10 |
11 | @endif 12 | 13 |
14 | -------------------------------------------------------------------------------- /templates/compose/dashboard.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://github.com/phntxx/dashboard?tab=readme-ov-file#dashboard 2 | # slogan: A dashboard, inspired by SUI. 3 | # tags: dashboard, web, search, bookmarks 4 | # port: 8080 5 | 6 | services: 7 | dashboard: 8 | image: phntxx/dashboard:latest 9 | environment: 10 | - SERVICE_FQDN_DASHBOARD_8080 11 | volumes: 12 | - dashboard-data:/app/data 13 | healthcheck: 14 | test: ["CMD", "curl", "-f", "http://127.0.0.1:8080"] 15 | interval: 2s 16 | timeout: 10s 17 | retries: 15 18 | -------------------------------------------------------------------------------- /app/Livewire/Team/Member/Index.php: -------------------------------------------------------------------------------- 1 | user()->isAdminFromSession()) { 15 | $this->invitations = TeamInvitation::whereTeamId(currentTeam()->id)->get(); 16 | } 17 | } 18 | 19 | public function render() 20 | { 21 | return view('livewire.team.member.index'); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /resources/views/components/security/navbar.blade.php: -------------------------------------------------------------------------------- 1 |
2 |

Security

3 |
Security related settings.
4 | 14 |
15 | -------------------------------------------------------------------------------- /app/Console/Commands/Horizon.php: -------------------------------------------------------------------------------- 1 | info('Horizon is enabled. Starting.'); 17 | $this->call('horizon'); 18 | exit(0); 19 | } else { 20 | exit(0); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/Livewire/Storage/Show.php: -------------------------------------------------------------------------------- 1 | storage = S3Storage::ownedByCurrentTeam()->whereUuid(request()->storage_uuid)->first(); 15 | if (! $this->storage) { 16 | abort(404); 17 | } 18 | } 19 | 20 | public function render() 21 | { 22 | return view('livewire.storage.show'); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /database/seeders/ServerSeeder.php: -------------------------------------------------------------------------------- 1 | 0, 14 | 'name' => 'localhost', 15 | 'description' => 'This is a test docker container in development mode', 16 | 'ip' => 'coolify-testing-host', 17 | 'team_id' => 0, 18 | 'private_key_id' => 0, 19 | ]); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /phpunit.dusk.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | ./tests/Browser 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.phpunit.cache 2 | /node_modules 3 | /public/build 4 | /public/hot 5 | /public/storage 6 | /storage/*.key 7 | /vendor 8 | .env 9 | .env.backup 10 | .env.secrets 11 | .phpunit.result.cache 12 | Homestead.json 13 | Homestead.yaml 14 | auth.json 15 | npm-debug.log 16 | yarn-error.log 17 | /.fleet 18 | /.idea 19 | /.vscode 20 | /.npm 21 | /.bash_history 22 | /_data 23 | _testing_hosts/ 24 | _volumes/ 25 | .lesshst 26 | psysh_history 27 | .psql_history 28 | _ide_helper.php 29 | .gitignore 30 | .phpstorm.meta.php 31 | _ide_helper_models.php 32 | .rnd 33 | /.ssh 34 | scripts/load-test/* 35 | -------------------------------------------------------------------------------- /app/Http/Middleware/ValidateSignature.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 'fbclid', 16 | // 'utm_campaign', 17 | // 'utm_content', 18 | // 'utm_medium', 19 | // 'utm_source', 20 | // 'utm_term', 21 | ]; 22 | } 23 | -------------------------------------------------------------------------------- /app/Livewire/Team/Storage/Show.php: -------------------------------------------------------------------------------- 1 | storage = S3Storage::ownedByCurrentTeam()->whereUuid(request()->storage_uuid)->first(); 15 | if (! $this->storage) { 16 | abort(404); 17 | } 18 | } 19 | 20 | public function render() 21 | { 22 | return view('livewire.storage.show'); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /public/svgs/odoo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /templates/compose/slash.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://github.com/yourselfhosted/slash 2 | # slogan: An open source, self-hosted links shortener and sharing platform. 3 | # tags: links, shortener, sharing, url, short, link, sharing 4 | # port: 5231 5 | 6 | services: 7 | slash: 8 | image: yourselfhosted/slash 9 | environment: 10 | - SERVICE_FQDN_SLASH_5231 11 | volumes: 12 | - slash-data:/var/opt/slash 13 | healthcheck: 14 | test: ["CMD", "wget", "-q", "--spider", "http://127.0.0.1:5231"] 15 | interval: 2s 16 | timeout: 10s 17 | retries: 15 18 | -------------------------------------------------------------------------------- /app/Listeners/MaintenanceModeEnabledNotification.php: -------------------------------------------------------------------------------- 1 | 'NODE_ENV', 16 | // 'value' => 'production', 17 | // 'is_build_time' => true, 18 | // 'application_id' => 1, 19 | // ]); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /public/svgs/unleash.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/views/auth/verify-email.blade.php: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |

Verification Email Sent

5 |
6 |
To activate your account, please open the email and follow the 7 | instructions. 8 |
9 | 10 |
11 |
12 |
13 | -------------------------------------------------------------------------------- /resources/views/livewire/project/new/simple-dockerfile.blade.php: -------------------------------------------------------------------------------- 1 |
2 |

Create a new Application

3 |
You can deploy a simple Dockerfile, without Git.
4 |
5 |
6 |

Dockerfile

7 | Save 8 |
9 | 14 |
15 |
16 | -------------------------------------------------------------------------------- /templates/compose/budge.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://github.com/linuxserver/budge 2 | # slogan: A budgeting personal finance app. 3 | # tags: personal finance, budgeting, expense tracking 4 | 5 | services: 6 | budge: 7 | image: lscr.io/linuxserver/budge:latest 8 | environment: 9 | - SERVICE_FQDN_BUDGE 10 | - PUID=1000 11 | - PGID=1000 12 | - TZ=Europe/Madrid 13 | volumes: 14 | - budge-config:/config 15 | healthcheck: 16 | test: ["CMD", "curl", "-f", "http://127.0.0.1:80"] 17 | interval: 2s 18 | timeout: 10s 19 | retries: 15 20 | -------------------------------------------------------------------------------- /app/Console/Commands/Scheduler.php: -------------------------------------------------------------------------------- 1 | info('Scheduler is enabled. Starting.'); 17 | $this->call('schedule:work'); 18 | exit(0); 19 | } else { 20 | exit(0); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /examples/traefik-dynamic-catch-all.yaml: -------------------------------------------------------------------------------- 1 | # This is an example dynamic configuration. 2 | http: 3 | routers: 4 | catchall: 5 | entryPoints: 6 | - http 7 | - https 8 | service: noop 9 | rule: HostRegexp(`{catchall:.*}`) 10 | priority: 1 11 | middlewares: 12 | - redirect-regexp 13 | services: 14 | noop: 15 | loadBalancer: 16 | servers: 17 | - url: '' 18 | middlewares: 19 | redirect-regexp: 20 | redirectRegex: 21 | regex: '(.*)' 22 | replacement: 'https://coolify.io' 23 | permanent: false -------------------------------------------------------------------------------- /templates/compose/wordpress-without-database.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://wordpress.org 2 | # slogan: Wordpress is open source software you can use to create a beautiful website, blog, or app. 3 | # tags: cms, blog, content, management 4 | # logo: svgs/wordpress.svg 5 | 6 | services: 7 | wordpress: 8 | image: wordpress:latest 9 | volumes: 10 | - wordpress-files:/var/www/html 11 | environment: 12 | - SERVICE_FQDN_WORDPRESS 13 | healthcheck: 14 | test: ["CMD", "curl", "-f", "http://127.0.0.1"] 15 | interval: 2s 16 | timeout: 10s 17 | retries: 10 18 | -------------------------------------------------------------------------------- /templates/compose/whoogle.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://github.com/benbusby/whoogle-search?tab=readme-ov-file 2 | # slogan: Whoogle is a self-hosted, privacy-focused search engine front-end for accessing Google search results without tracking and data collection. 3 | # tags: privacy, search engine 4 | # port: 5000 5 | 6 | services: 7 | whoogle: 8 | image: benbusby/whoogle-search:latest 9 | environment: 10 | - SERVICE_FQDN_WHOOGLE_5000 11 | healthcheck: 12 | test: ["CMD", "curl", "-f", "http://127.0.0.1:5000"] 13 | interval: 2s 14 | timeout: 10s 15 | retries: 15 16 | -------------------------------------------------------------------------------- /resources/views/livewire/dev/s3-test.blade.php: -------------------------------------------------------------------------------- 1 |
2 |

S3 Test

3 |
4 | 5 | @error('file') 6 | {{ $message }} 7 | @enderror 8 |
Uploading to server...
9 | @if ($file) 10 | Upload file to s3:/files 11 | @endif 12 |
13 |

Functions

14 | Get s3:/files 15 |
16 | -------------------------------------------------------------------------------- /resources/views/livewire/project/database/backup/execution.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | {{ data_get_str($database, 'name')->limit(10) }} > Backup | Coolify 4 | 5 |

Backups

6 | 7 | 8 |
9 | 10 | 11 |
12 |
13 | -------------------------------------------------------------------------------- /resources/views/livewire/server/proxy/show.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | Proxy Configuration | Coolify 4 | 5 | 6 | @if ($server->isFunctional()) 7 |
8 | 9 |
10 | 11 |
12 |
13 | @else 14 |
Server is not validated. Validate first.
15 | @endif 16 |
17 | -------------------------------------------------------------------------------- /app/Listeners/ProxyStartedNotification.php: -------------------------------------------------------------------------------- 1 | server = data_get($event, 'data'); 17 | $this->server->setupDefault404Redirect(); 18 | $this->server->setupDynamicProxyConfiguration(); 19 | $this->server->proxy->force_stop = false; 20 | $this->server->save(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /database/seeders/LocalPersistentVolumeSeeder.php: -------------------------------------------------------------------------------- 1 | 'test-pv', 18 | 'mount_path' => '/data', 19 | 'resource_id' => 1, 20 | 'resource_type' => Application::class, 21 | ]); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /templates/compose/homepage.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://gethomepage.dev/latest/ 2 | # slogan: A modern, fully static, fast, secure fully proxied, highly customizable application dashboard 3 | # tags: dashboard, homepage 4 | # logo: svgs/homepage.png 5 | # port: 3000 6 | 7 | services: 8 | homepage: 9 | image: ghcr.io/gethomepage/homepage:latest 10 | environment: 11 | - SERVICE_FQDN_HOMEPAGE_3000 12 | - HOMEPAGE_VAR_BASE=${SERVICE_FQDN_HOMEPAGE} 13 | volumes: 14 | - homepage-config:/app/config 15 | - homepage-images:/app/public/images 16 | - /var/run/docker.sock:/var/run/docker.sock 17 | -------------------------------------------------------------------------------- /app/View/Components/Services/Explanation.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/views/livewire/server/proxy/dynamic-configuration-navbar.blade.php: -------------------------------------------------------------------------------- 1 |
2 |

File: {{ str_replace('|', '.', $fileName) }}

3 |
4 | 5 | 7 | 8 |
9 | Delete 10 |
11 | -------------------------------------------------------------------------------- /app/Livewire/LayoutPopups.php: -------------------------------------------------------------------------------- 1 | user()->currentTeam()->id; 12 | 13 | return [ 14 | "echo-private:team.{$teamId},TestEvent" => 'testEvent', 15 | ]; 16 | } 17 | 18 | public function testEvent() 19 | { 20 | $this->dispatch('success', 'Realtime events configured!'); 21 | } 22 | 23 | public function render() 24 | { 25 | return view('livewire.layout-popups'); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /public/svgs/appwrite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /templates/compose/heimdall.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://github.com/linuxserver/Heimdall 2 | # slogan: Heimdall is a dashboard for managing and organizing your server applications. 3 | # tags: dashboard, server, applications, interface 4 | 5 | services: 6 | heimdall: 7 | image: lscr.io/linuxserver/heimdall:latest 8 | environment: 9 | - SERVICE_FQDN_HEIMDALL 10 | - PUID=1000 11 | - PGID=1000 12 | - TZ=Europe/Madrid 13 | volumes: 14 | - heimdall-config:/config 15 | healthcheck: 16 | test: ["CMD", "curl", "-f", "http://127.0.0.1:80"] 17 | interval: 2s 18 | timeout: 10s 19 | retries: 15 20 | -------------------------------------------------------------------------------- /templates/compose/grocy.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://github.com/grocy/grocy 2 | # slogan: Grocy is a web-based household management and grocery list application. 3 | # tags: groceries, household, management, grocery, shopping 4 | # logo: svgs/grocy.svg 5 | 6 | services: 7 | grocy: 8 | image: lscr.io/linuxserver/grocy:latest 9 | environment: 10 | - SERVICE_FQDN_GROCY 11 | - PUID=1000 12 | - PGID=1000 13 | - TZ=Europe/Madrid 14 | volumes: 15 | - grocy-config:/config 16 | healthcheck: 17 | test: ["CMD", "curl", "-f", "http://127.0.0.1:80"] 18 | interval: 2s 19 | timeout: 10s 20 | retries: 15 21 | -------------------------------------------------------------------------------- /app/Livewire/Project/Shared/ScheduledTask/Executions.php: -------------------------------------------------------------------------------- 1 | selectedKey) { 23 | $this->selectedKey = null; 24 | 25 | return; 26 | } 27 | $this->selectedKey = $key; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /templates/compose/nocodb.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://nocodb.com/ 2 | # slogan: NocoDB is an open source Airtable alternative. Turns any MySQL, PostgreSQL, SQL Server, SQLite & MariaDB into a smart-spreadsheet. 3 | # tags: nocodb,airtable,mysql,postgresql,sqlserver,sqlite,mariadb 4 | # logo: svgs/nocodb.svg 5 | # port: 8080 6 | 7 | services: 8 | nocodb: 9 | image: nocodb/nocodb 10 | environment: 11 | - SERVICE_FQDN_NOCODB_8080 12 | volumes: 13 | - nocodb-data:/usr/app/data/ 14 | healthcheck: 15 | test: ["CMD", "wget", "-q", "--spider", "http://127.0.0.1:8080"] 16 | interval: 5s 17 | timeout: 20s 18 | retries: 10 19 | -------------------------------------------------------------------------------- /app/Models/OauthSetting.php: -------------------------------------------------------------------------------- 1 | empty($value) ? null : Crypt::decryptString($value), 18 | set: fn (?string $value) => empty($value) ? null : Crypt::encryptString($value), 19 | ); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/View/Components/Status/Index.php: -------------------------------------------------------------------------------- 1 | 'Local PostgreSQL', 15 | 'description' => 'Local PostgreSQL for testing', 16 | 'redis_password' => 'redis', 17 | 'environment_id' => 1, 18 | 'destination_id' => 0, 19 | 'destination_type' => StandaloneDocker::class, 20 | ]); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /database/seeders/ServerSettingSeeder.php: -------------------------------------------------------------------------------- 1 | load(['settings']); 16 | $server_2->settings->wildcard_domain = 'http://127.0.0.1.sslip.io'; 17 | $server_2->settings->is_build_server = false; 18 | $server_2->settings->is_usable = true; 19 | $server_2->settings->is_reachable = true; 20 | $server_2->settings->save(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /resources/views/livewire/dev/compose.blade.php: -------------------------------------------------------------------------------- 1 |
2 |

Compose

3 |
All kinds of compose files.
4 |

Services

5 | @foreach ($services as $serviceName => $value) 6 | {{ Str::headline($serviceName) }} 7 | @endforeach 8 |

Base64 En/Decode

9 | Copy Base64 Compose 10 |
11 | 12 |
13 |
14 | -------------------------------------------------------------------------------- /app/View/Components/Server/Sidebar.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 19 | })->purpose('Display an inspiring quote'); 20 | -------------------------------------------------------------------------------- /templates/compose/metube.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://github.com/alexta69/metube 2 | # slogan: A web GUI for youtube-dl with playlist support. It enables you to effortlessly download videos from YouTube and dozens of other sites. 3 | # tags: youtube, download, videos, playlist 4 | # port: 8081 5 | 6 | services: 7 | metube: 8 | image: ghcr.io/alexta69/metube:latest 9 | environment: 10 | - SERVICE_FQDN_METUBE_8081 11 | - UID=1000 12 | - GID=1000 13 | volumes: 14 | - metube-downloads:/downloads 15 | healthcheck: 16 | test: ["CMD", "curl", "-f", "http://127.0.0.1:8081"] 17 | interval: 2s 18 | timeout: 10s 19 | retries: 15 20 | -------------------------------------------------------------------------------- /app/Notifications/Channels/DiscordChannel.php: -------------------------------------------------------------------------------- 1 | toDiscord($notifiable); 16 | $webhookUrl = $notifiable->routeNotificationForDiscord(); 17 | if (! $webhookUrl) { 18 | return; 19 | } 20 | dispatch(new SendMessageToDiscordJob($message, $webhookUrl)); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /database/migrations/2023_08_22_071057_add_nixpkgsarchive_to_applications.php: -------------------------------------------------------------------------------- 1 | string('nixpkgsarchive')->nullable(); 13 | }); 14 | } 15 | 16 | public function down(): void 17 | { 18 | Schema::table('teams', function (Blueprint $table) { 19 | $table->dropColumn('nixpkgsarchive'); 20 | }); 21 | } 22 | }; 23 | -------------------------------------------------------------------------------- /database/seeders/S3StorageSeeder.php: -------------------------------------------------------------------------------- 1 | 'Local MinIO', 17 | 'description' => 'Local MinIO S3 Storage', 18 | 'key' => 'minioadmin', 19 | 'secret' => 'minioadmin', 20 | 'bucket' => 'local', 21 | 'endpoint' => 'http://coolify-minio:9000', 22 | 'team_id' => 0, 23 | ]); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /templates/compose/classicpress-without-database.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://www.classicpress.net/ 2 | # slogan: A lightweight, stable, instantly familiar free open-source content management system, based on WordPress without the block editor (Gutenberg). 3 | # tags: cms, blog, content, management 4 | # logo: svgs/classicpress.svg 5 | 6 | services: 7 | classicpress: 8 | image: classicpress/classicpress:latest 9 | volumes: 10 | - classicpress-files:/var/www/html 11 | environment: 12 | - SERVICE_FQDN_CLASSICPRESS 13 | healthcheck: 14 | test: ["CMD", "curl", "-f", "http://127.0.0.1"] 15 | interval: 2s 16 | timeout: 10s 17 | retries: 10 18 | -------------------------------------------------------------------------------- /templates/compose/embystat.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://github.com/mregni/EmbyStat 2 | # slogan: EmnyStat is a web analytics tool, designed to provide insight into website traffic and user behavior. 3 | # tags: media, server, movies, tv, music 4 | # port: 6555 5 | 6 | services: 7 | embystat: 8 | image: lscr.io/linuxserver/embystat:latest 9 | environment: 10 | - SERVICE_FQDN_EMBYSTAT_6555 11 | - PUID=1000 12 | - PGID=1000 13 | - TZ=Europe/Madrid 14 | volumes: 15 | - embystat-config:/config 16 | healthcheck: 17 | test: ["CMD", "curl", "-f", "http://127.0.0.1:6555"] 18 | interval: 2s 19 | timeout: 10s 20 | retries: 15 21 | -------------------------------------------------------------------------------- /resources/views/livewire/help.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
Your feedback helps us to improve Coolify. Thank you! 💜
3 |
4 | 5 | 7 |
8 | Send 9 |
10 |
11 | -------------------------------------------------------------------------------- /templates/compose/dokuwiki.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://www.dokuwiki.org/ 2 | # slogan: A lightweight and easy-to-use wiki platform for creating and managing documentation and knowledge bases. 3 | # tags: wiki, documentation, knowledge, base 4 | # logo: svgs/dokuwiki.png 5 | 6 | services: 7 | dokuwiki: 8 | image: lscr.io/linuxserver/dokuwiki:latest 9 | environment: 10 | - SERVICE_FQDN_DOKUWIKI 11 | - PUID=1000 12 | - PGID=1000 13 | - TZ=Europe/Madrid 14 | volumes: 15 | - dokuwiki-config:/config 16 | healthcheck: 17 | test: ["CMD", "curl", "-f", "http://127.0.0.1:80"] 18 | interval: 2s 19 | timeout: 10s 20 | retries: 15 21 | -------------------------------------------------------------------------------- /app/Livewire/Subscription/Show.php: -------------------------------------------------------------------------------- 1 | route('dashboard'); 13 | } 14 | if (auth()->user()?->isMember()) { 15 | return redirect()->route('dashboard'); 16 | } 17 | if (! data_get(currentTeam(), 'subscription')) { 18 | return redirect()->route('subscription.index'); 19 | } 20 | } 21 | 22 | public function render() 23 | { 24 | return view('livewire.subscription.show'); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /database/migrations/2023_08_22_071058_add_nixpkgsarchive_to_applications_remove.php: -------------------------------------------------------------------------------- 1 | dropColumn('nixpkgsarchive'); 13 | }); 14 | } 15 | 16 | public function down(): void 17 | { 18 | Schema::table('teams', function (Blueprint $table) { 19 | $table->string('nixpkgsarchive')->nullable(); 20 | }); 21 | } 22 | }; 23 | -------------------------------------------------------------------------------- /database/seeders/StandalonePostgresqlSeeder.php: -------------------------------------------------------------------------------- 1 | 'Local PostgreSQL', 15 | 'description' => 'Local PostgreSQL for testing', 16 | 'postgres_password' => 'postgres', 17 | 'environment_id' => 1, 18 | 'destination_id' => 0, 19 | 'destination_type' => StandaloneDocker::class, 20 | ]); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /resources/views/livewire/server/configure-cloudflare-tunnels.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | 5 | Automated Configuration (experimental) 6 |

Or

7 | I have already set up the tunnel manually on the server. 8 | 9 | -------------------------------------------------------------------------------- /templates/compose/uptime-kuma.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://github.com/louislam/uptime-kuma?tab=readme-ov-file 2 | # slogan: Uptime Kuma is a monitoring tool for tracking the status and performance of your applications in real-time. 3 | # tags: monitoring, status, performance, web, services, applications, real-time 4 | # logo: svgs/uptime-kuma.svg 5 | # port: 3001 6 | 7 | services: 8 | uptime-kuma: 9 | image: louislam/uptime-kuma:1 10 | environment: 11 | - SERVICE_FQDN_UPTIME-KUMA_3001 12 | volumes: 13 | - uptime-kuma:/app/data 14 | healthcheck: 15 | test: ["CMD-SHELL", "extra/healthcheck"] 16 | interval: 2s 17 | timeout: 10s 18 | retries: 15 19 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Send Requests To Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /resources/views/components/status/degraded.blade.php: -------------------------------------------------------------------------------- 1 | @props([ 2 | 'status' => 'Degraded', 3 | ]) 4 |
5 | 6 | 7 |
8 |
9 | {{ str($status)->before(':')->headline() }} 10 |
11 | @if (!str($status)->startsWith('Proxy') && !str($status)->contains('(')) 12 |
({{ str($status)->after(':') }})
13 | @endif 14 |
15 |
16 | -------------------------------------------------------------------------------- /templates/compose/pairdrop.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://pairdrop.net/ 2 | # slogan: Pairdrop is a self-hosted file sharing and collaboration platform, offering secure file sharing and collaboration capabilities for efficient teamwork. 3 | # tags: file, sharing, collaboration, teamwork 4 | # port: 3000 5 | 6 | services: 7 | pairdrop: 8 | image: lscr.io/linuxserver/pairdrop:latest 9 | environment: 10 | - SERVICE_FQDN_PAIRDROP_3000 11 | - PUID=1000 12 | - PGID=1000 13 | - TZ=Europe/Madrid 14 | - DEBUG_MODE=false 15 | healthcheck: 16 | test: ["CMD", "curl", "-f", "http://127.0.0.1:3000"] 17 | interval: 2s 18 | timeout: 10s 19 | retries: 15 20 | -------------------------------------------------------------------------------- /templates/compose/rabbitmq.yaml: -------------------------------------------------------------------------------- 1 | # ignore: true 2 | # documentation: https://www.rabbitmq.com/documentation.html 3 | # slogan: With tens of thousands of users, RabbitMQ is one of the most popular open source message brokers. 4 | # tags: message broker, message queue, message-oriented middleware, MOM, AMQP, MQTT, STOMP, messaging 5 | 6 | services: 7 | rabbitmq: 8 | image: rabbitmq:3 9 | environment: 10 | - SERVICE_FQDN_RABBITMQ_5672 11 | - RABBITMQ_DEFAULT_USER=$SERVICE_USER_RABBITMQ 12 | - RABBITMQ_DEFAULT_PASS=$SERVICE_PASSWORD_RABBITMQ 13 | healthcheck: 14 | test: rabbitmq-diagnostics -q ping 15 | interval: 30s 16 | timeout: 30s 17 | retries: 3 18 | -------------------------------------------------------------------------------- /templates/compose/snapdrop.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://github.com/RobinLinus/snapdrop 2 | # slogan: A self-hosted file-sharing service for secure and convenient file transfers, whether on a local network or the internet. 3 | # tags: file, sharing, transfer, local, network, internet 4 | 5 | services: 6 | snapdrop: 7 | image: lscr.io/linuxserver/snapdrop:latest 8 | environment: 9 | - SERVICE_FQDN_SNAPDROP 10 | - PUID=1000 11 | - PGID=1000 12 | - TZ=Europe/Madrid 13 | volumes: 14 | - snapdrop-config:/config 15 | healthcheck: 16 | test: ["CMD", "curl", "-f", "http://127.0.0.1:80"] 17 | interval: 2s 18 | timeout: 10s 19 | retries: 15 20 | -------------------------------------------------------------------------------- /templates/compose/docuseal.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://www.docuseal.co/ 2 | # slogan: Document Signing for Everyone free forever for individuals, extensible for businesses and developers. Open Source Alternative to DocuSign, PandaDoc and more. 3 | # tags: documentation 4 | # logo: svgs/docuseal.png 5 | # port: 3000 6 | 7 | services: 8 | docuseal: 9 | image: docuseal/docuseal:latest 10 | environment: 11 | - SERVICE_FQDN_DOCUSEAL_3000 12 | - HOST=${SERVICE_FQDN_DOCUSEAL} 13 | volumes: 14 | - docuseal-data:/data 15 | healthcheck: 16 | test: ["CMD", "wget", "-q", "--spider", "http://127.0.0.1:3000"] 17 | interval: 5s 18 | timeout: 20s 19 | retries: 10 20 | -------------------------------------------------------------------------------- /app/Providers/AuthServiceProvider.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | protected $policies = [ 16 | // 'App\Models\Model' => 'App\Policies\ModelPolicy', 17 | ]; 18 | 19 | /** 20 | * Register any authentication / authorization services. 21 | */ 22 | public function boot(): void 23 | { 24 | // 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /templates/compose/syncthing.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://syncthing.net/ 2 | # slogan: Syncthing synchronizes files between two or more computers in real time. 3 | # tags: filestorage, data, synchronization 4 | # logo: svgs/syncthing.svg 5 | # port: 8384 6 | 7 | services: 8 | syncthing: 9 | image: 'lscr.io/linuxserver/syncthing:latest' 10 | environment: 11 | - SERVICE_FQDN_SYNCTHING_8384 12 | - PUID=1000 13 | - PGID=1000 14 | - TZ=Etc/UTC 15 | volumes: 16 | - 'syncthing-config:/config' 17 | - 'syncthing-data1:/data1' 18 | - 'syncthing-data2:/data2' 19 | ports: 20 | - '22000:22000/tcp' 21 | - '22000:22000/udp' 22 | - '21027:21027/udp' 23 | -------------------------------------------------------------------------------- /resources/views/components/helper.blade.php: -------------------------------------------------------------------------------- 1 |
merge(['class' => 'group']) }}> 2 |
3 | @isset($icon) 4 | {{ $icon }} 5 | @else 6 | 7 | 9 | 10 | @endisset 11 | 12 |
13 |
14 |
15 | {!! $helper !!} 16 |
17 |
18 |
19 | -------------------------------------------------------------------------------- /resources/views/components/loading-on-button.blade.php: -------------------------------------------------------------------------------- 1 | @props(['text' => null]) 2 |
3 | @if (isset($text)) 4 |
{{ $text }}
5 | @endif 6 | 8 | 9 | 11 | 12 | 13 |
14 | -------------------------------------------------------------------------------- /templates/compose/statusnook.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://statusnook.com 2 | # slogan: Effortlessly deploy a status page and start monitoring endpoints in minutes 3 | # tags: go,html,monitoring,sqlite,self,hosted,status,page,htmx,smtp,slack 4 | # logo: svgs/statusnook.svg 5 | # port: 8000 6 | 7 | services: 8 | statusnook: 9 | environment: 10 | - SERVICE_FQDN_STATUSNOOK_8000 11 | volumes: 12 | - "statusnook-data:/app/statusnook-data" 13 | image: goksan/statusnook 14 | healthcheck: 15 | test: 16 | - CMD 17 | - wget 18 | - "-q" 19 | - "--spider" 20 | - "http://127.0.0.1:8000" 21 | interval: 2s 22 | timeout: 10s 23 | retries: 15 24 | -------------------------------------------------------------------------------- /database/seeders/GitSeeder.php: -------------------------------------------------------------------------------- 1 | 'https://api.github.com', 20 | // 'html_url' => 'https://github.com', 21 | // 'is_public' => false, 22 | // 'private_key_id' => $private_key_1->id, 23 | // 'project_id' => $project->id, 24 | // ]); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/Livewire/Project/Index.php: -------------------------------------------------------------------------------- 1 | private_keys = PrivateKey::ownedByCurrentTeam()->get(); 21 | $this->projects = Project::ownedByCurrentTeam()->get(); 22 | $this->servers = Server::ownedByCurrentTeam()->count(); 23 | } 24 | 25 | public function render() 26 | { 27 | return view('livewire.project.index'); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /resources/views/components/loading.blade.php: -------------------------------------------------------------------------------- 1 | @props(['text' => null]) 2 |
3 | @if (isset($text)) 4 |
{{ $text }}
5 | @endif 6 | 8 | 9 | 11 | 12 | 13 |
14 | -------------------------------------------------------------------------------- /resources/views/errors/402.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.base') 2 | 3 |
4 |
5 |

402

6 |

Payment required.

7 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /templates/compose/duplicati.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://duplicati.readthedocs.io 2 | # slogan: Duplicati is a backup solution, allowing you to make scheduled backups with encryption. 3 | # tags: backup, encryption 4 | # logo: svgs/duplicati.webp 5 | # port: 8200 6 | 7 | services: 8 | duplicati: 9 | image: lscr.io/linuxserver/duplicati:latest 10 | environment: 11 | - SERVICE_FQDN_DUPLICATI_8200 12 | - PUID=1000 13 | - PGID=1000 14 | - TZ=Europe/Madrid 15 | volumes: 16 | - duplicati-config:/config 17 | - duplicati-backups:/backups 18 | healthcheck: 19 | test: ["CMD", "curl", "-f", "http://127.0.0.1:8200"] 20 | interval: 2s 21 | timeout: 10s 22 | retries: 15 23 | -------------------------------------------------------------------------------- /app/Livewire/Server/Create.php: -------------------------------------------------------------------------------- 1 | private_keys = PrivateKey::ownedByCurrentTeam()->get(); 18 | if (! isCloud()) { 19 | $this->limit_reached = false; 20 | 21 | return; 22 | } 23 | $this->limit_reached = Team::serverLimitReached(); 24 | } 25 | 26 | public function render() 27 | { 28 | return view('livewire.server.create'); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /templates/compose/mediawiki.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://www.mediawiki.org 2 | # slogan: MediaWiki is a collaboration and documentation platform brought to you by a vibrant community. 3 | # tags: wiki, collaboration, documentation 4 | # logo: svgs/mediawiki.ico 5 | # port: 80 6 | 7 | services: 8 | mediawiki: 9 | image: mediawiki:latest 10 | environment: 11 | - SERVICE_FQDN_MEDIAWIKI_80 12 | volumes: 13 | - mediawiki-images:/var/www/html/images 14 | - mediawiki-sqlite:/var/www/html/data 15 | - ./LocalSettings.php:/var/www/html/LocalSettings.php 16 | healthcheck: 17 | test: ["CMD", "curl", "-f", "http://localhost:80"] 18 | interval: 5s 19 | timeout: 20s 20 | retries: 10 21 | -------------------------------------------------------------------------------- /app/Actions/Shared/PullImage.php: -------------------------------------------------------------------------------- 1 | saveComposeConfigs(); 15 | 16 | $commands[] = 'cd '.$resource->workdir(); 17 | $commands[] = "echo 'Saved configuration files to {$resource->workdir()}.'"; 18 | $commands[] = 'docker compose pull'; 19 | 20 | $server = data_get($resource, 'server'); 21 | 22 | if (! $server) { 23 | return; 24 | } 25 | 26 | instant_remote_process($commands, $resource->server); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Console/Commands/CleanupQueue.php: -------------------------------------------------------------------------------- 1 | keys('*:laravel*'); 19 | foreach ($keys as $key) { 20 | $keyWithoutPrefix = str_replace($prefix, '', $key); 21 | Redis::connection()->del($keyWithoutPrefix); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /resources/views/components/page-loading.blade.php: -------------------------------------------------------------------------------- 1 | @props(['text' => "Loading..."]) 2 |
3 | @if (isset($text)) 4 |
{{ $text }}
5 | @endif 6 | 8 | 9 | 11 | 12 | 13 |
14 | -------------------------------------------------------------------------------- /templates/compose/babybuddy.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://docs.baby-buddy.net 2 | # slogan: It helps parents track their baby's daily activities, growth, and health with ease. 3 | # tags: baby, parents, health, growth, activities 4 | # logo: svgs/babybuddy.png 5 | 6 | services: 7 | babybuddy: 8 | image: lscr.io/linuxserver/babybuddy:latest 9 | environment: 10 | - SERVICE_FQDN_BABYBUDDY 11 | - PUID=1000 12 | - PGID=1000 13 | - TZ=Europe/Madrid 14 | - CSRF_TRUSTED_ORIGINS=$SERVICE_FQDN_BABYBUDDY 15 | volumes: 16 | - babybuddy-config:/config 17 | healthcheck: 18 | test: ["CMD", "curl", "-f", "http://127.0.0.1:8000"] 19 | interval: 2s 20 | timeout: 10s 21 | retries: 15 22 | -------------------------------------------------------------------------------- /app/Livewire/VerifyEmail.php: -------------------------------------------------------------------------------- 1 | rateLimit(1, 300); 16 | auth()->user()->sendVerificationEmail(); 17 | $this->dispatch('success', 'Email verification link sent!'); 18 | 19 | } catch (\Exception $e) { 20 | ray($e); 21 | 22 | return handleError($e, $this); 23 | } 24 | } 25 | 26 | public function render() 27 | { 28 | return view('livewire.verify-email'); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /database/migrations/2023_08_11_190528_add_dockerfile_to_applications_table.php: -------------------------------------------------------------------------------- 1 | longText('dockerfile')->nullable(); 16 | }); 17 | } 18 | 19 | public function down(): void 20 | { 21 | Schema::table('applications', function (Blueprint $table) { 22 | $table->dropColumn('dockerfile'); 23 | }); 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /app/Jobs/ServerStorageSaveJob.php: -------------------------------------------------------------------------------- 1 | localFileVolume->saveStorageOnServer(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /bootstrap/helpers/s3.php: -------------------------------------------------------------------------------- 1 | endpoint) { 10 | $is_digital_ocean = Str::contains($s3->endpoint, 'digitaloceanspaces.com'); 11 | } 12 | config()->set('filesystems.disks.custom-s3', [ 13 | 'driver' => 's3', 14 | 'region' => $s3['region'], 15 | 'key' => $s3['key'], 16 | 'secret' => $s3['secret'], 17 | 'bucket' => $s3['bucket'], 18 | 'endpoint' => $s3['endpoint'], 19 | 'use_path_style_endpoint' => true, 20 | 'bucket_endpoint' => $is_digital_ocean, 21 | 'aws_url' => $s3->awsUrl(), 22 | ]); 23 | } 24 | -------------------------------------------------------------------------------- /templates/compose/vikunja.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://vikunja.io 2 | # slogan: The open-source, self-hostable to-do app. Organize everything, on all platforms. 3 | # tags: productivity,todo 4 | # logo: svgs/vikunja.svg 5 | # port: 3456 6 | 7 | services: 8 | vikunja: 9 | image: vikunja/vikunja 10 | environment: 11 | - SERVICE_FQDN_VIKUNJA 12 | - VIKUNJA_SERVICE_PUBLICURL=$SERVICE_FQDN_VIKUNJA 13 | - VIKUNJA_SERVICE_JWTSECRET=$SERVICE_PASSWORD_JWTSECRET 14 | - VIKUNJA_SERVICE_ENABLEREGISTRATION=true 15 | volumes: 16 | - vikunja-data:/app/vikunja/ 17 | healthcheck: 18 | test: ["CMD", "wget", "--spider", "http://127.0.0.1:3456"] 19 | interval: 5s 20 | timeout: 20s 21 | retries: 10 22 | -------------------------------------------------------------------------------- /app/View/Components/ResourceView.php: -------------------------------------------------------------------------------- 1 | softDeletes(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('services', function (Blueprint $table) { 25 | $table->dropSoftDeletes(); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /templates/compose/n8n.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://n8n.io 2 | # slogan: n8n is an extendable workflow automation tool. 3 | # tags: n8n,workflow,automation,open,source,low,code 4 | # logo: svgs/n8n.png 5 | # port: 5678 6 | 7 | services: 8 | n8n: 9 | image: docker.n8n.io/n8nio/n8n 10 | environment: 11 | - SERVICE_FQDN_N8N_5678 12 | - N8N_EDITOR_BASE_URL=${SERVICE_FQDN_N8N} 13 | - WEBHOOK_URL=${SERVICE_FQDN_N8N} 14 | - N8N_HOST=${SERVICE_URL_N8N} 15 | - GENERIC_TIMEZONE=Europe/Berlin 16 | - TZ=Europe/Berlin 17 | volumes: 18 | - n8n-data:/home/node/.n8n 19 | healthcheck: 20 | test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:5678/"] 21 | interval: 5s 22 | timeout: 20s 23 | retries: 10 24 | -------------------------------------------------------------------------------- /public/svgs/openblocks.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /tests/Browser/Pages/HomePage.php: -------------------------------------------------------------------------------- 1 | 29 | */ 30 | public function elements(): array 31 | { 32 | return [ 33 | '@element' => '#selector', 34 | ]; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /database/migrations/2023_03_28_062150_create_kubernetes_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->string('uuid')->unique(); 17 | 18 | $table->timestamps(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | */ 25 | public function down(): void 26 | { 27 | Schema::dropIfExists('kubernetes'); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /public/svgs/git.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /templates/compose/appsmith.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://appsmith.com 2 | # slogan: A low-code application platform for building internal tools. 3 | # tags: lowcode,nocode,no,low,platform 4 | # logo: svgs/appsmith.svg 5 | 6 | services: 7 | appsmith: 8 | image: index.docker.io/appsmith/appsmith-ce:latest 9 | environment: 10 | - SERVICE_FQDN_APPSMITH 11 | - APPSMITH_MAIL_ENABLED=false 12 | - APPSMITH_DISABLE_TELEMETRY=true 13 | - APPSMITH_DISABLE_INTERCOM=true 14 | - APPSMITH_SENTRY_DSN= 15 | - APPSMITH_SMART_LOOK_ID= 16 | volumes: 17 | - stacks-data:/appsmith-stacks 18 | healthcheck: 19 | test: ["CMD", "curl", "-f", "http://127.0.0.1:80"] 20 | interval: 5s 21 | timeout: 20s 22 | retries: 10 23 | -------------------------------------------------------------------------------- /app/View/Components/Forms/Button.php: -------------------------------------------------------------------------------- 1 | noStyle) { 21 | $this->defaultClass = ''; 22 | } 23 | } 24 | 25 | public function render(): View|Closure|string 26 | { 27 | return view('components.forms.button'); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/Events/TestEvent.php: -------------------------------------------------------------------------------- 1 | teamId = auth()->user()->currentTeam()->id; 20 | } 21 | 22 | public function broadcastOn(): array 23 | { 24 | return [ 25 | new PrivateChannel("team.{$this->teamId}"), 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /templates/compose/emby.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://emby.media/support/articles/Home.html 2 | # slogan: A media server software that allows you to organize, stream, and access your multimedia content effortlessly. 3 | # tags: media, server, movies, tv, music 4 | # logo: svgs/emby.png 5 | # port: 8096 6 | 7 | services: 8 | emby: 9 | image: lscr.io/linuxserver/emby:latest 10 | environment: 11 | - SERVICE_FQDN_EMBY_8096 12 | - PUID=1000 13 | - PGID=1000 14 | - TZ=Europe/Madrid 15 | volumes: 16 | - emby-config:/config 17 | - emby-tvshows:/tvshows 18 | - emby-movies:/movies 19 | healthcheck: 20 | test: ["CMD", "curl", "-f", "http://127.0.0.1:8096"] 21 | interval: 2s 22 | timeout: 10s 23 | retries: 15 24 | -------------------------------------------------------------------------------- /templates/compose/grafana.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://grafana.com 2 | # slogan: Grafana is the open source analytics & monitoring solution for every database. 3 | # tags: grafana,analytics,monitoring,dashboard 4 | # logo: svgs/grafana.svg 5 | # port: 3000 6 | 7 | services: 8 | grafana: 9 | image: grafana/grafana-oss 10 | environment: 11 | - SERVICE_FQDN_GRAFANA_3000 12 | - GF_SERVER_ROOT_URL=${SERVICE_FQDN_GRAFANA} 13 | - GF_SERVER_DOMAIN=${SERVICE_FQDN_GRAFANA} 14 | - GF_SECURITY_ADMIN_PASSWORD=${SERVICE_PASSWORD_GRAFANA} 15 | volumes: 16 | - grafana-data:/var/lib/grafana 17 | healthcheck: 18 | test: ["CMD", "curl", "-f", "http://127.0.0.1:3000/api/health"] 19 | interval: 5s 20 | timeout: 20s 21 | retries: 10 22 | -------------------------------------------------------------------------------- /database/migrations/2023_08_22_071048_add_boarding_to_teams.php: -------------------------------------------------------------------------------- 1 | boolean('show_boarding')->default(false); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('teams', function (Blueprint $table) { 25 | $table->dropColumn('show_boarding'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /resources/views/errors/503.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.base') 2 |
3 |
4 |

503

5 |

We are working on serious things.

6 |

Service Unavailable. Be right back. Thanks for your 7 | patience. 8 |

9 | 15 |
16 |
17 | -------------------------------------------------------------------------------- /resources/views/livewire/project/database/create-scheduled-backup.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | @if ($s3s->count() === 0) 6 | 7 | @else 8 | @foreach ($s3s as $s3) 9 | 10 | @endforeach 11 | @endif 12 | 13 | 14 | Save 15 | 16 | 17 | -------------------------------------------------------------------------------- /templates/compose/gitea.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://docs.gitea.com 2 | # slogan: Gitea is a self-hosted, lightweight Git service, offering version control, collaboration, and code hosting. 3 | # tags: version control, collaboration, code, hosting, lightweight 4 | # logo: svgs/gitea.svg 5 | 6 | services: 7 | gitea: 8 | image: gitea/gitea:latest 9 | environment: 10 | - SERVICE_FQDN_GITEA_3000 11 | - USER_UID=1000 12 | - USER_GID=1000 13 | ports: 14 | - 22222:22 15 | volumes: 16 | - gitea-data:/data 17 | - gitea-timezone:/etc/timezone:ro 18 | - gitea-localtime:/etc/localtime:ro 19 | healthcheck: 20 | test: ["CMD", "curl", "-f", "http://127.0.0.1:3000"] 21 | interval: 2s 22 | timeout: 10s 23 | retries: 15 24 | -------------------------------------------------------------------------------- /templates/compose/nextcloud.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://docs.nextcloud.com 2 | # slogan: NextCloud is a self-hosted, open-source platform that provides file storage, collaboration, and communication tools for seamless data management. 3 | # tags: cloud, collaboration, communication, filestorage, data 4 | # logo: svgs/nextcloud.svg 5 | 6 | services: 7 | nextcloud: 8 | image: lscr.io/linuxserver/nextcloud:latest 9 | environment: 10 | - SERVICE_FQDN_NEXTCLOUD 11 | - PUID=1000 12 | - PGID=1000 13 | - TZ=Europe/Madrid 14 | volumes: 15 | - nextcloud-config:/config 16 | - nextcloud-data:/data 17 | healthcheck: 18 | test: ["CMD", "curl", "-f", "http://127.0.0.1:80"] 19 | interval: 2s 20 | timeout: 10s 21 | retries: 15 22 | -------------------------------------------------------------------------------- /templates/compose/stirling-pdf.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://github.com/Stirling-Tools/Stirling-PDF 2 | # slogan: Stirling is a powerful web based PDF manipulation tool 3 | # tags: pdf, manipulation, web, tool 4 | # logo: svgs/stirling.png 5 | # port: 8080 6 | 7 | services: 8 | stirling-pdf: 9 | image: frooodle/s-pdf:latest 10 | volumes: 11 | - stirling-training-data:/usr/share/tesseract-ocr/5/tessdata 12 | - stirling-configs:/configs 13 | - stirling-custom-files:/customFiles/ 14 | - stirling-logs:/logs/ 15 | environment: 16 | - SERVICE_FQDN_SPDF_8080 17 | - DOCKER_ENABLE_SECURITY=false 18 | healthcheck: 19 | test: 'curl --fail -I http://127.0.0.1:8080 || exit 1' 20 | interval: 5s 21 | timeout: 20s 22 | retries: 10 23 | -------------------------------------------------------------------------------- /app/Models/ScheduledTask.php: -------------------------------------------------------------------------------- 1 | belongsTo(Service::class); 15 | } 16 | 17 | public function application() 18 | { 19 | return $this->belongsTo(Application::class); 20 | } 21 | 22 | public function latest_log(): HasOne 23 | { 24 | return $this->hasOne(ScheduledTaskExecution::class)->latest(); 25 | } 26 | 27 | public function executions(): HasMany 28 | { 29 | return $this->hasMany(ScheduledTaskExecution::class); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /database/migrations/2023_09_23_111816_add_destination_to_services_table.php: -------------------------------------------------------------------------------- 1 | nullableMorphs('destination'); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('services', function (Blueprint $table) { 25 | $table->dropMorphs('destination'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2023_12_19_124111_add_swarm_cluster_grouping.php: -------------------------------------------------------------------------------- 1 | integer('swarm_cluster')->nullable(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('servers', function (Blueprint $table) { 25 | $table->dropColumn('swarm_cluster'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_04_16_083919_add_service_type_on_creation.php: -------------------------------------------------------------------------------- 1 | string('service_type')->nullable(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('services', function (Blueprint $table) { 25 | $table->dropColumn('service_type'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /resources/views/livewire/project/shared/storages/all.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 | @foreach ($resource->persistentStorages as $storage) 4 | @if ($resource->type() === 'service') 5 | 7 | @else 8 | 11 | @endif 12 | @endforeach 13 |
14 |
15 | -------------------------------------------------------------------------------- /templates/compose/phpmyadmin.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://phpmyadmin.net 2 | # slogan: phpMyAdmin is a web-based database management tool for administering your MySQL and MariaDB databases through a user-friendly interface. 3 | # tags: database management 4 | # logo: svgs/phpmyadmin.svg 5 | 6 | services: 7 | phpmyadmin: 8 | image: lscr.io/linuxserver/phpmyadmin:latest 9 | environment: 10 | - SERVICE_FQDN_PHPMYADMIN 11 | - PUID=1000 12 | - PGID=1000 13 | - TZ=Europe/Madrid 14 | - PMA_ARBITRARY=1 15 | - PMA_ABSOLUTE_URI=$SERVICE_FQDN_PHPMYADMIN 16 | volumes: 17 | - phpmyadmin-config:/config 18 | healthcheck: 19 | test: ["CMD", "curl", "-f", "http://127.0.0.1:80"] 20 | interval: 2s 21 | timeout: 10s 22 | retries: 15 23 | -------------------------------------------------------------------------------- /database/migrations/2023_08_15_111125_update_users_table.php: -------------------------------------------------------------------------------- 1 | boolean('force_password_reset')->default(false); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('users', function (Blueprint $table) { 25 | $table->dropColumn('force_password_reset'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2023_09_23_111813_update_users_databases_table.php: -------------------------------------------------------------------------------- 1 | boolean('marketing_emails')->default(true); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('users', function (Blueprint $table) { 25 | $table->dropColumn('marketing_emails'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_03_28_114620_add_watch_paths_to_apps.php: -------------------------------------------------------------------------------- 1 | longText('watch_paths')->nullable(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('applications', function (Blueprint $table) { 25 | $table->dropColumn('watch_paths'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_05_07_124019_add_server_metrics.php: -------------------------------------------------------------------------------- 1 | boolean('is_metrics_enabled')->default(true); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('servers', function (Blueprint $table) { 25 | $table->dropColumn('is_metrics_enabled'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/seeders/UserSeeder.php: -------------------------------------------------------------------------------- 1 | create([ 13 | 'id' => 0, 14 | 'name' => 'Root User', 15 | 'email' => 'test@example.com', 16 | ]); 17 | User::factory()->create([ 18 | 'id' => 1, 19 | 'name' => 'Normal User (but in root team)', 20 | 'email' => 'test2@example.com', 21 | ]); 22 | User::factory()->create([ 23 | 'id' => 2, 24 | 'name' => 'Normal User (not in root team)', 25 | 'email' => 'test3@example.com', 26 | ]); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /templates/compose/meilisearch.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://www.meilisearch.com 2 | # slogan: MeiliSearch is a powerful, fast, easy to use and deploy search engine. 3 | # tags: search,engine,fulltext,full,text,meilisearch 4 | # logo: svgs/meilisearch.svg 5 | # port: 7700 6 | 7 | services: 8 | meilisearch: 9 | image: getmeili/meilisearch:latest 10 | environment: 11 | - SERVICE_FQDN_MEILISEARCH_7700 12 | - MEILI_NO_ANALYTICS=${MEILI_NO_ANALYTICS:-true} 13 | - MEILI_ENV=${MEILI_ENV:-production} 14 | - MEILI_MASTER_KEY=${SERVICE_PASSWORD_MEILISEARCH} 15 | volumes: 16 | - meilisearch-data:/meili_data 17 | healthcheck: 18 | test: ["CMD", "curl", "-f", "http://127.0.0.1:7700/health"] 19 | interval: 2s 20 | timeout: 10s 21 | retries: 15 22 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrustProxies.php: -------------------------------------------------------------------------------- 1 | |string|null 14 | */ 15 | protected $proxies = '*'; 16 | 17 | /** 18 | * The headers that should be used to detect proxies. 19 | * 20 | * @var int 21 | */ 22 | protected $headers = 23 | Request::HEADER_X_FORWARDED_FOR | 24 | Request::HEADER_X_FORWARDED_HOST | 25 | Request::HEADER_X_FORWARDED_PORT | 26 | Request::HEADER_X_FORWARDED_PROTO | 27 | Request::HEADER_X_FORWARDED_AWS_ELB; 28 | } 29 | -------------------------------------------------------------------------------- /database/migrations/2023_08_22_071060_change_invitation_link_length.php: -------------------------------------------------------------------------------- 1 | text('link')->change(); 16 | 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | */ 23 | public function down(): void 24 | { 25 | Schema::table('team_invitations', function (Blueprint $table) { 26 | $table->string('link')->change(); 27 | }); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /database/migrations/2023_10_08_111819_add_server_unreachable_count.php: -------------------------------------------------------------------------------- 1 | integer('unreachable_count')->default(0); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('servers', function (Blueprint $table) { 25 | $table->dropColumn('unreachable_count'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2023_12_30_134507_add_description_to_environments.php: -------------------------------------------------------------------------------- 1 | string('description')->nullable(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('environments', function (Blueprint $table) { 25 | $table->dropColumn('description'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_03_08_180457_nullable_password.php: -------------------------------------------------------------------------------- 1 | string('password')->nullable()->change(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('users', function (Blueprint $table) { 25 | $table->string('password')->nullable(false)->change(); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "type": "module", 4 | "scripts": { 5 | "dev": "vite", 6 | "build": "vite build" 7 | }, 8 | "devDependencies": { 9 | "@vitejs/plugin-vue": "4.5.1", 10 | "autoprefixer": "10.4.19", 11 | "axios": "1.7.2", 12 | "laravel-echo": "1.16.1", 13 | "laravel-vite-plugin": "0.8.1", 14 | "postcss": "8.4.38", 15 | "pusher-js": "8.4.0-rc2", 16 | "tailwindcss": "3.4.4", 17 | "vite": "4.5.3", 18 | "vue": "3.4.29" 19 | }, 20 | "dependencies": { 21 | "@tailwindcss/forms": "0.5.7", 22 | "@tailwindcss/typography": "0.5.13", 23 | "alpinejs": "3.14.0", 24 | "ioredis": "5.4.1", 25 | "tailwindcss-scrollbar": "0.1.0" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/message.blade.php: -------------------------------------------------------------------------------- 1 | 2 | {{-- Header --}} 3 | 4 | 5 | {{ config('app.name') }} 6 | 7 | 8 | 9 | {{-- Body --}} 10 | {{ $slot }} 11 | 12 | {{-- Subcopy --}} 13 | @isset($subcopy) 14 | 15 | 16 | {{ $subcopy }} 17 | 18 | 19 | @endisset 20 | 21 | {{-- Footer --}} 22 | 23 | 24 | © {{ date('Y') }} {{ config('app.name') }}. @lang('All rights reserved.') 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/text/message.blade.php: -------------------------------------------------------------------------------- 1 | 2 | {{-- Header --}} 3 | 4 | 5 | {{ config('app.name') }} 6 | 7 | 8 | 9 | {{-- Body --}} 10 | {{ $slot }} 11 | 12 | {{-- Subcopy --}} 13 | @isset($subcopy) 14 | 15 | 16 | {{ $subcopy }} 17 | 18 | 19 | @endisset 20 | 21 | {{-- Footer --}} 22 | 23 | 24 | © {{ date('Y') }} {{ config('app.name') }}. @lang('All rights reserved.') 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /database/migrations/2023_06_23_110548_next_channel_updates.php: -------------------------------------------------------------------------------- 1 | boolean('next_channel')->default(false); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('instance_settings', function (Blueprint $table) { 25 | $table->dropColumn('next_channel'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2023_10_18_072519_add_custom_labels_applications_table.php: -------------------------------------------------------------------------------- 1 | text('custom_labels')->nullable(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('applications', function (Blueprint $table) { 25 | $table->dropColumn('custom_labels'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2023_08_06_142951_add_description_field_to_applications_table.php: -------------------------------------------------------------------------------- 1 | string('description')->nullable(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('applications', function (Blueprint $table) { 25 | $table->dropColumn('description'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_05_10_085215_make_stripe_comment_longer.php: -------------------------------------------------------------------------------- 1 | longText('stripe_comment')->change(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('subscriptions', function (Blueprint $table) { 25 | $table->string('stripe_comment')->change(); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /app/Models/TeamInvitation.php: -------------------------------------------------------------------------------- 1 | belongsTo(Team::class); 21 | } 22 | 23 | public function isValid() 24 | { 25 | $createdAt = $this->created_at; 26 | $diff = $createdAt->diffInMinutes(now()); 27 | if ($diff <= config('constants.invitation.link.expiration')) { 28 | return true; 29 | } else { 30 | $this->delete(); 31 | 32 | return false; 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /database/migrations/2023_08_15_111126_update_servers_add_unreachable_count_table.php: -------------------------------------------------------------------------------- 1 | integer('unreachable_count')->default(0); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('servers', function (Blueprint $table) { 25 | $table->dropColumn('unreachable_count'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_01_29_072322_change_env_variable_length.php: -------------------------------------------------------------------------------- 1 | text('value')->change(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('shared_environment_variables', function (Blueprint $table) { 25 | $table->string('value')->change(); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_02_23_143119_add_custom_server_limits_to_teams_ultimate.php: -------------------------------------------------------------------------------- 1 | integer('custom_server_limit')->nullable(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('teams', function (Blueprint $table) { 25 | $table->dropColumn('custom_server_limit'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_02_25_222150_add_server_force_disabled_field.php: -------------------------------------------------------------------------------- 1 | boolean('force_disabled')->default(false); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('server_settings', function (Blueprint $table) { 25 | $table->dropColumn('force_disabled'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /public/svgs/chatwoot.svg: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | -------------------------------------------------------------------------------- /resources/views/livewire/project/database/backup/index.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | {{ data_get_str($database, 'name')->limit(10) }} > Backups | Coolify 4 | 5 |

Backups

6 | 7 | 8 |
9 |
10 |

Scheduled Backups

11 | 12 | 13 | 14 |
15 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /app/View/Components/Status/Services.php: -------------------------------------------------------------------------------- 1 | complexStatus = $service->status(); 21 | } 22 | 23 | /** 24 | * Get the view / contents that represent the component. 25 | */ 26 | public function render(): View|Closure|string 27 | { 28 | return view('components.status.services'); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /database/migrations/2023_09_23_111814_update_local_file_volumes_table.php: -------------------------------------------------------------------------------- 1 | boolean('is_directory')->default(false); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('local_file_volumes', function (Blueprint $table) { 25 | $table->dropColumn('is_directory'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2023_11_07_123731_add_target_build_dockerfile.php: -------------------------------------------------------------------------------- 1 | string('dockerfile_target_build')->nullable(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('applications', function (Blueprint $table) { 25 | $table->dropColumn('dockerfile_target_build'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_01_25_073212_add_server_id_to_queues.php: -------------------------------------------------------------------------------- 1 | integer('server_id')->nullable(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('application_deployment_queues', function (Blueprint $table) { 25 | $table->dropColumn('server_id'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_02_08_112304_add_dynamic_timeout_for_deployments.php: -------------------------------------------------------------------------------- 1 | integer('dynamic_timeout')->default(3600); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('server_settings', function (Blueprint $table) { 25 | $table->dropColumn('dynamic_timeout'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_04_17_132541_add_rollback_queues.php: -------------------------------------------------------------------------------- 1 | boolean('rollback')->default(false); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('application_deployment_queues', function (Blueprint $table) { 25 | $table->dropColumn('rollback'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_06_20_102551_add_server_api_sentinel.php: -------------------------------------------------------------------------------- 1 | boolean('is_server_api_enabled')->default(false); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('server_settings', function (Blueprint $table) { 25 | $table->dropColumn('is_server_api_enabled'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_06_21_143358_add_api_deployment_type.php: -------------------------------------------------------------------------------- 1 | boolean('is_api')->default(false); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('application_deployment_queues', function (Blueprint $table) { 25 | $table->dropColumn('is_api'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /resources/views/livewire/project/service/edit-domain.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
Note: If a service has a defined port, do not delete it.
If you want to use your custom domain, you can add it with a port.
3 | 5 | Save 6 |
7 | -------------------------------------------------------------------------------- /templates/compose/jellyfin.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://jellyfin.org 2 | # slogan: Jellyfin is a media server for hosting and streaming your media collection. 3 | # tags: media, server, movies, tv, music 4 | # logo: svgs/jellyfin.svg 5 | # port: 8096 6 | 7 | services: 8 | jellyfin: 9 | image: lscr.io/linuxserver/jellyfin:latest 10 | environment: 11 | - SERVICE_FQDN_JELLYFIN_8096 12 | - PUID=1000 13 | - PGID=1000 14 | - TZ=Europe/Madrid 15 | - JELLYFIN_PublishedServerUrl=$SERVICE_FQDN_JELLYFIN 16 | volumes: 17 | - jellyfin-config:/config 18 | - jellyfin-tvshows:/data/tvshows 19 | - jellyfin-movies:/data/movies 20 | healthcheck: 21 | test: ["CMD", "curl", "-f", "http://127.0.0.1:8096"] 22 | interval: 2s 23 | timeout: 10s 24 | retries: 15 25 | -------------------------------------------------------------------------------- /templates/compose/openblocks.yaml: -------------------------------------------------------------------------------- 1 | # documentation: https://openblocks.dev 2 | # slogan: OpenBlocks is a self-hosted, open-source, low-code platform for building internal tools. 3 | # tags: openblocks,low,code,platform,open,source,low,code 4 | # logo: svgs/openblocks.svg 5 | # port: 3000 6 | 7 | services: 8 | openblocks: 9 | image: openblocksdev/openblocks-ce 10 | environment: 11 | - SERVICE_FQDN_OPENBLOCKS_3000 12 | - ENABLE_USER_SIGN_UP=${ENABLE_USER_SIGN_UP:-true} 13 | - ENCRYPTION_PASSWORD=$SERVICE_PASSWORD_ENCRYPTION 14 | - ENCRYPTION_SALT=$SERVICE_PASSWORD_SALT 15 | volumes: 16 | - openblocks-data:/openblocks-stacks 17 | healthcheck: 18 | test: ["CMD", "curl", "-f", "http://127.0.0.1:3000/health"] 19 | interval: 5s 20 | timeout: 20s 21 | retries: 10 22 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php: -------------------------------------------------------------------------------- 1 | string('email')->primary(); 16 | $table->string('token'); 17 | $table->timestamp('created_at')->nullable(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | */ 24 | public function down(): void 25 | { 26 | Schema::dropIfExists('password_reset_tokens'); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2023_06_23_114131_change_env_var_value_length.php: -------------------------------------------------------------------------------- 1 | text('value')->nullable()->change(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('environment_variables', function (Blueprint $table) { 25 | $table->string('value')->nullable()->change(); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2023_09_20_083549_update_environment_variables_table.php: -------------------------------------------------------------------------------- 1 | foreignId('service_id')->nullable(); 16 | 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | */ 23 | public function down(): void 24 | { 25 | Schema::table('environment_variables', function (Blueprint $table) { 26 | $table->dropColumn('service_id'); 27 | }); 28 | } 29 | }; 30 | --------------------------------------------------------------------------------