Compare commits

...

45 Commits
main ... v4.0.0

Author SHA1 Message Date
Gary
9cf6925652 main: change version numbering 2024-03-06 11:55:06 -08:00
Gary
3aa9a8973b docker-compose: change imgae to 4.0.0 2024-03-06 11:43:50 -08:00
Gary
a04abdcca9 main: fix for various bugs 2024-03-05 16:39:13 -08:00
Gary
7238918f35 main: change CDN url paths 2024-03-01 19:42:21 -08:00
Gary
68c933b09e Revert "main: replace curl install commands with wget"
This reverts commit e2a5d71134.
We should use a CDN url for this to work.
2024-03-01 19:36:13 -08:00
Gary
fdf832e9c7 main: replace curl with wget on install.sh 2024-03-01 19:32:37 -08:00
Gary
e2a5d71134 main: replace curl install commands with wget 2024-03-01 19:23:14 -08:00
Gary
5f87e99a61 main: fix CDN url 2024-03-01 19:17:11 -08:00
Gary
2d6b84c737 main: replace CDN with githaven urls 2024-03-01 18:43:19 -08:00
Gary
6a97eaad12 main: begin major rewrite for lasthour 2024-03-01 18:37:31 -08:00
Gary
24cac5feba main: modify copy on guided tour blade. 2024-03-01 16:46:04 -08:00
Gary
f335adaaed main: Begin launch files rewrite
Docker image now on githaven
2024-03-01 16:16:09 -08:00
Gary
3ea111478e main: change upgrade.sh and local_install.sh 2024-02-29 10:49:13 -08:00
Gary
633cd4ca7c main: change docker run upgrade.sh 2024-02-29 10:46:20 -08:00
Gary
0903cc537f main: modify compose prod file and local and upgrade sh 2024-02-29 10:38:46 -08:00
Gary
bf2b4dfa44 main: WIP docker compose and local_install.sh 2024-02-27 15:31:05 -08:00
Gary
714d059745 main: WIP compose files and local_install.sh 2024-02-27 15:15:06 -08:00
Gary
57c71fa451 main: fix local_install 2024-02-23 16:31:43 -08:00
Gary
deb8b3319d main: further changes to upgrade.sh 2024-02-23 16:22:34 -08:00
Gary
9b2d0e08e0 Revert "main: simplify launch scripts"
This reverts commit 1c27ca0ce4.
2024-02-23 16:20:06 -08:00
Gary
ae661990de main: modify local_install.sh 2024-02-23 15:48:11 -08:00
Gary
239f9e9b31 main: modify path local_install and upgrade 2024-02-23 15:32:23 -08:00
Gary
c34013f7e2 main: modify local_install.sh mkdir path 2024-02-23 15:26:50 -08:00
Gary
eda724cf6c main: modify local_install 2024-02-23 15:16:10 -08:00
Gary
1c27ca0ce4 main: simplify launch scripts 2024-02-23 15:06:09 -08:00
Gary
977c6c10f4 main: fix login blade 2024-02-23 11:21:57 -08:00
Gary
44a0d61d0e main: modify upgrade.sh to include copy script 2024-02-23 10:59:29 -08:00
Gary
0a31199ecd main: modify local_install.sh 2024-02-23 09:34:07 -08:00
Gary
fce392c7ed main: modify local_install.sh 2024-02-23 09:12:55 -08:00
Gary
21598780a6 main: modify docker-compose.prod.yml 2024-02-23 08:51:04 -08:00
Gary
0154e9eff8 main: change local_install.sh 2024-02-22 18:09:33 -08:00
Gary
376ee8d3d7 main: fix to local_install.sh cp commands 2024-02-22 18:04:03 -08:00
Gary
e9fad4f1a1 main: WIP upgrade.sh
Need to replace the CDN links for remote upgrade
2024-02-22 17:55:59 -08:00
Gary
8aba1f0795 main: modify local install script 2024-02-22 17:43:23 -08:00
Gary
6f6a839c8e main: change docker-compose.prod volume paths 2024-02-22 17:00:07 -08:00
Gary
ddcd7d21e6 main: changed wording on blades 2024-02-22 16:40:59 -08:00
Gary
1babe6d91b main: rename local install script 2024-02-22 16:25:04 -08:00
Gary
b60e437d66 main: modify docker compose and local launch sequence 2024-02-22 16:22:33 -08:00
Gary
e7448f5e6b main: path modify composer file 2024-02-21 17:14:38 -08:00
Gary
eed96f4134 main: change bind source path compose file 2024-02-21 17:03:53 -08:00
Gary
3ff76e16ca main: change compose bind source type 2024-02-21 17:00:59 -08:00
Gary
eb226f1a39 main: modify compose file 2024-02-21 16:58:14 -08:00
Gary
94004acdfe main: revise docker compose file 2024-02-21 16:56:01 -08:00
Gary
3e21cb29f6 main: changes to docker file 2024-02-21 15:49:11 -08:00
Gary
a2a2a69eb8 main: initial app rewrite 2024-02-21 15:21:08 -08:00
101 changed files with 465 additions and 740 deletions

View File

@ -1,8 +0,0 @@
_____ _ _ __
/ ____| | (_)/ _|
| | ___ ___ | |_| |_ _ _
| | / _ \ / _ \| | | _| | | |
| |___| (_) | (_) | | | | | |_| |
\_____\___/ \___/|_|_|_| \__, |
__/ |
|___/

View File

@ -12,7 +12,7 @@ tasks:
./vendor/bin/spin exec -u webuser coolify php artisan key:generate ./vendor/bin/spin exec -u webuser coolify php artisan key:generate
./vendor/bin/spin exec -u webuser coolify php artisan storage:link ./vendor/bin/spin exec -u webuser coolify php artisan storage:link
./vendor/bin/spin exec -u webuser coolify php artisan migrate:fresh --seed ./vendor/bin/spin exec -u webuser coolify php artisan migrate:fresh --seed
cat .coolify-logo cat .jesus-is-king
gp sync-done spin-is-ready gp sync-done spin-is-ready
- name: Install Node dependencies and run Vite - name: Install Node dependencies and run Vite

6
.jesus-is-king Normal file
View File

@ -0,0 +1,6 @@
__ _ __ __ _
/ /__ _______ _______ (_)____ / //_/(_)___ ____ _
__ / / _ \/ ___/ / / / ___/ / / ___/ / ,< / / __ \/ __ `/
/ /_/ / __(__ ) /_/ (__ ) / (__ ) / /| |/ / / / / /_/ /
\____/\___/____/\__,_/____/ /_/____/ /_/ |_/_/_/ /_/\__, /
/____/

View File

@ -19,7 +19,7 @@
<<<EOF <<<EOF
Hello, Hello,
Welcome to Coolify Cloud. Welcome to Last Hour Cloud.
Here is your user id: $user->id Here is your user id: $user->id
EOF EOF

View File

@ -1,94 +0,0 @@
# Citizen Code of Conduct
## 1. Purpose
A primary goal of Coolify is to be inclusive to the largest number of contributors, with the most varied and diverse backgrounds possible. As such, we are committed to providing a friendly, safe and welcoming environment for all, regardless of gender, sexual orientation, ability, ethnicity, socioeconomic status, and religion (or lack thereof).
This code of conduct outlines our expectations for all those who participate in our community, as well as the consequences for unacceptable behavior.
We invite all those who participate in Coolify to help us create safe and positive experiences for everyone.
## 2. Open [Source/Culture/Tech] Citizenship
A supplemental goal of this Code of Conduct is to increase open [source/culture/tech] citizenship by encouraging participants to recognize and strengthen the relationships between our actions and their effects on our community.
Communities mirror the societies in which they exist and positive action is essential to counteract the many forms of inequality and abuses of power that exist in society.
If you see someone who is making an extra effort to ensure our community is welcoming, friendly, and encourages all participants to contribute to the fullest extent, we want to know.
## 3. Expected Behavior
The following behaviors are expected and requested of all community members:
* Participate in an authentic and active way. In doing so, you contribute to the health and longevity of this community.
* Exercise consideration and respect in your speech and actions.
* Attempt collaboration before conflict.
* Refrain from demeaning, discriminatory, or harassing behavior and speech.
* Be mindful of your surroundings and of your fellow participants. Alert community leaders if you notice a dangerous situation, someone in distress, or violations of this Code of Conduct, even if they seem inconsequential.
* Remember that community event venues may be shared with members of the public; please be respectful to all patrons of these locations.
## 4. Unacceptable Behavior
The following behaviors are considered harassment and are unacceptable within our community:
* Violence, threats of violence or violent language directed against another person.
* Sexist, racist, homophobic, transphobic, ableist or otherwise discriminatory jokes and language.
* Posting or displaying sexually explicit or violent material.
* Posting or threatening to post other people's personally identifying information ("doxing").
* Personal insults, particularly those related to gender, sexual orientation, race, religion, or disability.
* Inappropriate photography or recording.
* Inappropriate physical contact. You should have someone's consent before touching them.
* Unwelcome sexual attention. This includes, sexualized comments or jokes; inappropriate touching, groping, and unwelcomed sexual advances.
* Deliberate intimidation, stalking or following (online or in person).
* Advocating for, or encouraging, any of the above behavior.
* Sustained disruption of community events, including talks and presentations.
## 5. Weapons Policy
No weapons will be allowed at Coolify events, community spaces, or in other spaces covered by the scope of this Code of Conduct. Weapons include but are not limited to guns, explosives (including fireworks), and large knives such as those used for hunting or display, as well as any other item used for the purpose of causing injury or harm to others. Anyone seen in possession of one of these items will be asked to leave immediately, and will only be allowed to return without the weapon. Community members are further expected to comply with all state and local laws on this matter.
## 6. Consequences of Unacceptable Behavior
Unacceptable behavior from any community member, including sponsors and those with decision-making authority, will not be tolerated.
Anyone asked to stop unacceptable behavior is expected to comply immediately.
If a community member engages in unacceptable behavior, the community organizers may take any action they deem appropriate, up to and including a temporary ban or permanent expulsion from the community without warning (and without refund in the case of a paid event).
## 7. Reporting Guidelines
If you are subject to or witness unacceptable behavior, or have any other concerns, please notify a community organizer as soon as possible. hi@coollabs.io.
Additionally, community organizers are available to help community members engage with local law enforcement or to otherwise help those experiencing unacceptable behavior feel safe. In the context of in-person events, organizers will also provide escorts as desired by the person experiencing distress.
## 8. Addressing Grievances
If you feel you have been falsely or unfairly accused of violating this Code of Conduct, you should notify coollabsio with a concise description of your grievance. Your grievance will be handled in accordance with our existing governing policies.
## 9. Scope
We expect all community participants (contributors, paid or otherwise; sponsors; and other guests) to abide by this Code of Conduct in all community venues--online and in-person--as well as in all one-on-one communications pertaining to community business.
This code of conduct and its related procedures also applies to unacceptable behavior occurring outside the scope of community activities when such behavior has the potential to adversely affect the safety and well-being of community members.
## 10. Contact info
hi@coollabs.io
## 11. License and attribution
The Citizen Code of Conduct is distributed by [Stumptown Syndicate](http://stumptownsyndicate.org) under a [Creative Commons Attribution-ShareAlike license](http://creativecommons.org/licenses/by-sa/3.0/).
Portions of text derived from the [Django Code of Conduct](https://www.djangoproject.com/conduct/) and the [Geek Feminism Anti-Harassment Policy](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy).
_Revision 2.3. Posted 6 March 2017._
_Revision 2.2. Posted 4 February 2016._
_Revision 2.1. Posted 23 June 2014._
_Revision 2.0, adopted by the [Stumptown Syndicate](http://stumptownsyndicate.org) board on 10 January 2013. Posted 17 March 2013._

View File

@ -1,34 +0,0 @@
# Contributing
> "First, thanks for considering to contribute to my project.
It really means a lot!" - [@andrasbacsai](https://github.com/andrasbacsai)
You can ask for guidance anytime on our
[Discord server](https://coollabs.io/discord) in the `#contribution` channel.
## Code Contribution
### 1) Setup your development environment
- You need to have Docker Engine (or equivalent) [installed](https://docs.docker.com/engine/install/) on your system.
- For better DX, install [Spin](https://serversideup.net/open-source/spin/).
### 2) Set your environment variables
- Copy [.env.development.example](./.env.development.example) to .env.
## 3) Start & setup Coolify
- Run `spin up` - You can notice that errors will be thrown. Don't worry.
- If you see weird permission errors, especially on Mac, run `sudo spin up` instead.
### 4) Start development
You can login your Coolify instance at `localhost:8000` with `test@example.com` and `password`.
Your horizon (Laravel scheduler): `localhost:8000/horizon` - Only reachable if you logged in with root user.
Mails are caught by Mailpit: `localhost:8025`
## New Service Contribution
Check out the docs [here](https://coolify.io/docs/how-to-add-a-service).

103
README.md
View File

@ -1,103 +0,0 @@
# About the Project
Coolify is an open-source & self-hostable alternative to Heroku / Netlify / Vercel / etc.
It helps you to manage your servers, applications, databases on your own hardware, all you need is SSH connection. You can manage VPS, Bare Metal, Raspberry PI's anything.
Imagine if you could have the ease of a cloud but with your own servers. That is **Coolify**.
No vendor lock-in, which means that all the configuration for your applications/databases/etc are saved to your server. So if you decide to stop using Coolify (oh nooo), you could still manage your running resources. You just lose the automations and all the magic. 🪄️
For more information, take a look at our landing page [here](https://coolify.io).
# Installation
```bash
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash
```
You can find the installation script source [here](./scripts/install.sh).
# Support
Contact us [here](https://coolify.io/docs/contact).
# Donations
To stay completely free, open-source, no feature behind paywall and evolve the project, we need your help. If you like Coolify, please consider donating to help us fund the future development of the project.
https://coolify.io/sponsorships
Thank you so much!
Special thanks to our biggest sponsors, [CCCareers](https://cccareers.org/) and [Appwrite](https://appwrite.io)!
<a href="https://cccareers.org/" target="_blank"><img src="./other/logos/ccc-logo.webp" alt="cccareers logo" width="200"/></a>
<a href="https://appwrite.io" target="_blank"><img src="./other/logos/appwrite.svg" alt="appwrite logo" width="200"/></a>
## Github Sponsors ($15+)
<a href="https://bc.direct"><img width="60px" alt="BC Direct" src="https://github.com/coollabsio/coolify/assets/5845193/a4063c41-95ed-4a32-8814-cd1475572e37"/></a>
<a href="https://github.com/automazeio"><img src="https://github.com/automazeio.png" width="60px" alt="Corentin Clichy" /></a>
<a href="https://github.com/corentinclichy"><img src="https://github.com/corentinclichy.png" width="60px" alt="Corentin Clichy" /></a>
<a href="https://github.com/Niki2k1"><img src="https://github.com/Niki2k1.png" width="60px" alt="Niklas Lausch" /></a>
<a href="https://github.com/pixelinfinito"><img src="https://github.com/pixelinfinito.png" width="60px" alt="Pixel Infinito" /></a>
<a href="https://github.com/whitesidest"><img src="https://avatars.githubusercontent.com/u/12365916?s=52&v=4" width="60px" alt="Tyler Whitesides" /></a>
<a href="https://github.com/aniftyco"><img src="https://github.com/aniftyco.png" width="60px" alt="NiftyCo" /></a>
<a href="https://github.com/iujlaki"><img src="https://github.com/iujlaki.png" width="60px" alt="Imre Ujlaki" /></a>
<a href="https://il.ly"><img src="https://github.com/Illyism.png" width="60px" alt="Ilias Ism" /></a>
<a href="https://github.com/urtho"><img src="https://github.com/urtho.png" width="60px" alt="Paweł Pierścionek" /></a>
<a href="https://github.com/monocursive"><img src="https://github.com/monocursive.png" width="60px" alt="Michael Mazurczak" /></a>
## Organizations
<a href="https://opencollective.com/coollabsio/organization/0/website"><img src="https://opencollective.com/coollabsio/organization/0/avatar.svg"></a>
<a href="https://opencollective.com/coollabsio/organization/1/website"><img src="https://opencollective.com/coollabsio/organization/1/avatar.svg"></a>
<a href="https://opencollective.com/coollabsio/organization/2/website"><img src="https://opencollective.com/coollabsio/organization/2/avatar.svg"></a>
<a href="https://opencollective.com/coollabsio/organization/3/website"><img src="https://opencollective.com/coollabsio/organization/3/avatar.svg"></a>
<a href="https://opencollective.com/coollabsio/organization/4/website"><img src="https://opencollective.com/coollabsio/organization/4/avatar.svg"></a>
<a href="https://opencollective.com/coollabsio/organization/5/website"><img src="https://opencollective.com/coollabsio/organization/5/avatar.svg"></a>
<a href="https://opencollective.com/coollabsio/organization/6/website"><img src="https://opencollective.com/coollabsio/organization/6/avatar.svg"></a>
<a href="https://opencollective.com/coollabsio/organization/7/website"><img src="https://opencollective.com/coollabsio/organization/7/avatar.svg"></a>
<a href="https://opencollective.com/coollabsio/organization/8/website"><img src="https://opencollective.com/coollabsio/organization/8/avatar.svg"></a>
<a href="https://opencollective.com/coollabsio/organization/9/website"><img src="https://opencollective.com/coollabsio/organization/9/avatar.svg"></a>
## Individuals
<a href="https://opencollective.com/coollabsio"><img src="https://opencollective.com/coollabsio/individuals.svg?width=890"></a>
# Cloud
If you do not want to self-host Coolify, there is a paid cloud version available: https://app.coolify.io
For more information & pricing, take a look at our landing page [here](https://coolify.io).
## Why should I use the Cloud version?
The recommended way to use Coolify is to have one server for Coolify and one (or more) for the resources you are deploying. A server is around 4-5$/month.
By subscribing to the cloud version, you get the Coolify server for the same price, but with:
- High-availability
- Free email notifications
- Better support
- Less maintenance for you
# Recognitions
<p>
<a href="https://news.ycombinator.com/item?id=26624341">
<img
style="width: 250px; height: 54px;" width="250" height="54"
alt="Featured on Hacker News"
src="https://hackernews-badge.vercel.app/api?id=26624341"
/>
</a>
</p>
<a href="https://www.producthunt.com/posts/coolify?utm_source=badge-featured&utm_medium=badge&utm_souce=badge-coolify" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=338273&theme=light" alt="Coolify - An&#0032;open&#0045;source&#0032;&#0038;&#0032;self&#0045;hostable&#0032;Heroku&#0044;&#0032;Netlify&#0032;alternative | Product Hunt" style="width: 250px; height: 54px;" width="250" height="54" /></a>
<a href="https://trendshift.io/repositories/634" target="_blank"><img src="https://trendshift.io/api/badge/repositories/634" alt="coollabsio%2Fcoolify | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
# Repo Activity
![Alt](https://repobeats.axiom.co/api/embed/eab1c8066f9c59d0ad37b76c23ebb5ccac4278ae.svg "Repobeats analytics image")
# Star History
[![Star History Chart](https://api.star-history.com/svg?repos=coollabsio/coolify&type=Date)](https://star-history.com/#coollabsio/coolify&Date)

View File

@ -64,7 +64,7 @@ private function update()
} else { } else {
ray('Running update on production server'); ray('Running update on production server');
remote_process([ remote_process([
"curl -fsSL https://cdn.coollabs.io/coolify/upgrade.sh -o /data/coolify/source/upgrade.sh", "curl -fsSL https://cdn.lasthourhosting.org/lasthourcloud/scripts/upgrade.sh -o /data/coolify/source/upgrade.sh",
"bash /data/coolify/source/upgrade.sh $this->latestVersion" "bash /data/coolify/source/upgrade.sh $this->latestVersion"
], $this->server); ], $this->server);
return; return;

View File

@ -58,7 +58,7 @@ private function restore_coolify_db_backup()
try { try {
$database = StandalonePostgresql::withTrashed()->find(0); $database = StandalonePostgresql::withTrashed()->find(0);
if ($database && $database->trashed()) { if ($database && $database->trashed()) {
echo "Restoring coolify db backup\n"; echo "Restoring Last Hour Cloud db backup\n";
$database->restore(); $database->restore();
$scheduledBackup = ScheduledDatabaseBackup::find(0); $scheduledBackup = ScheduledDatabaseBackup::find(0);
if (!$scheduledBackup) { if (!$scheduledBackup) {
@ -74,7 +74,7 @@ private function restore_coolify_db_backup()
} }
} }
} catch (\Throwable $e) { } catch (\Throwable $e) {
echo "Error in restoring coolify db backup: {$e->getMessage()}\n"; echo "Error in restoring Last Hour Cloud db backup: {$e->getMessage()}\n";
} }
} }
private function cleanup_stucked_helper_containers() private function cleanup_stucked_helper_containers()
@ -97,7 +97,7 @@ private function alive()
return; return;
} }
try { try {
Http::get("https://undead.coolify.io/v4/alive?appId=$id&version=$version"); Http::get("");
echo "I am alive!\n"; echo "I am alive!\n";
} catch (\Throwable $e) { } catch (\Throwable $e) {
echo "Error in alive: {$e->getMessage()}\n"; echo "Error in alive: {$e->getMessage()}\n";

View File

@ -47,7 +47,7 @@ private function showHelp()
<<<'HTML' <<<'HTML'
<div> <div>
<div class="title-box"> <div class="title-box">
Coolify Last Hour Cloud
</div> </div>
<p class="mt-1 ml-1 "> <p class="mt-1 ml-1 ">
Demo Notify <strong class="text-coolify">=></strong> Send a demo notification to a given channel. Demo Notify <strong class="text-coolify">=></strong> Send a demo notification to a given channel.
@ -70,7 +70,7 @@ private function showHelp()
ask(<<<'HTML' ask(<<<'HTML'
<div class="mr-1"> <div class="mr-1">
In which manner you wish a <strong class="text-coolify">coolified</strong> notification? In which manner you wish a <strong class="text-coolify">Last Hour Cloud</strong> notification?
</div> </div>
HTML, ['email', 'slack', 'discord', 'telegram']); HTML, ['email', 'slack', 'discord', 'telegram']);
} }

View File

@ -24,17 +24,17 @@ public function deploy(Request $request)
$force = $request->query->get('force') ?? false; $force = $request->query->get('force') ?? false;
if ($uuids && $tags) { if ($uuids && $tags) {
return response()->json(['error' => 'You can only use uuid or tag, not both.', 'docs' => 'https://coolify.io/docs/api/deploy-webhook'], 400); return response()->json(['error' => 'You can only use uuid or tag, not both.', 'upstream docs' => 'https://coolify.io/docs/api/deploy-webhook'], 400);
} }
if (is_null($teamId)) { if (is_null($teamId)) {
return response()->json(['error' => 'Invalid token.', 'docs' => 'https://coolify.io/docs/api/authentication'], 400); return response()->json(['error' => 'Invalid token.', 'upstream docs' => 'https://coolify.io/docs/api/authentication'], 400);
} }
if ($tags) { if ($tags) {
return $this->by_tags($tags, $teamId, $force); return $this->by_tags($tags, $teamId, $force);
} else if ($uuids) { } else if ($uuids) {
return $this->by_uuids($uuids, $teamId, $force); return $this->by_uuids($uuids, $teamId, $force);
} }
return response()->json(['error' => 'You must provide uuid or tag.', 'docs' => 'https://coolify.io/docs/api/deploy-webhook'], 400); return response()->json(['error' => 'You must provide uuid or tag.', 'upstream docs' => 'https://coolify.io/docs/api/deploy-webhook'], 400);
} }
private function by_uuids(string $uuid, int $teamId, bool $force = false) private function by_uuids(string $uuid, int $teamId, bool $force = false)
{ {
@ -42,7 +42,7 @@ private function by_uuids(string $uuid, int $teamId, bool $force = false)
$uuids = collect(array_filter($uuids)); $uuids = collect(array_filter($uuids));
if (count($uuids) === 0) { if (count($uuids) === 0) {
return response()->json(['error' => 'No UUIDs provided.', 'docs' => 'https://coolify.io/docs/api/deploy-webhook'], 400); return response()->json(['error' => 'No UUIDs provided.', 'upstream docs' => 'https://coolify.io/docs/api/deploy-webhook'], 400);
} }
$message = collect([]); $message = collect([]);
foreach ($uuids as $uuid) { foreach ($uuids as $uuid) {
@ -55,7 +55,7 @@ private function by_uuids(string $uuid, int $teamId, bool $force = false)
if ($message->count() > 0) { if ($message->count() > 0) {
return response()->json(['message' => $message->toArray()], 200); return response()->json(['message' => $message->toArray()], 200);
} }
return response()->json(['error' => "No resources found.", 'docs' => 'https://coolify.io/docs/api/deploy-webhook'], 404); return response()->json(['error' => "No resources found.", 'upstream docs' => 'https://coolify.io/docs/api/deploy-webhook'], 404);
} }
public function by_tags(string $tags, int $team_id, bool $force = false) public function by_tags(string $tags, int $team_id, bool $force = false)
{ {
@ -63,7 +63,7 @@ public function by_tags(string $tags, int $team_id, bool $force = false)
$tags = collect(array_filter($tags)); $tags = collect(array_filter($tags));
if (count($tags) === 0) { if (count($tags) === 0) {
return response()->json(['error' => 'No TAGs provided.', 'docs' => 'https://coolify.io/docs/api/deploy-webhook'], 400); return response()->json(['error' => 'No TAGs provided.', 'upstream docs' => 'https://coolify.io/docs/api/deploy-webhook'], 400);
} }
$message = collect([]); $message = collect([]);
foreach ($tags as $tag) { foreach ($tags as $tag) {
@ -91,7 +91,7 @@ public function by_tags(string $tags, int $team_id, bool $force = false)
return response()->json(['message' => $message->toArray()], 200); return response()->json(['message' => $message->toArray()], 200);
} }
return response()->json(['error' => "No resources found.", 'docs' => 'https://coolify.io/docs/api/deploy-webhook'], 404); return response()->json(['error' => "No resources found.", 'upstream docs' => 'https://coolify.io/docs/api/deploy-webhook'], 404);
} }
public function deploy_resource($resource, bool $force = false): Collection public function deploy_resource($resource, bool $force = false): Collection
{ {

View File

@ -12,7 +12,7 @@ public function projects(Request $request)
{ {
$teamId = get_team_id_from_token(); $teamId = get_team_id_from_token();
if (is_null($teamId)) { if (is_null($teamId)) {
return response()->json(['error' => 'Invalid token.', 'docs' => 'https://coolify.io/docs/api/authentication'], 400); return response()->json(['error' => 'Invalid token.', 'upstream docs' => 'https://coolify.io/docs/api/authentication'], 400);
} }
$projects = ModelsProject::whereTeamId($teamId)->select('id', 'name', 'uuid')->get(); $projects = ModelsProject::whereTeamId($teamId)->select('id', 'name', 'uuid')->get();
return response()->json($projects); return response()->json($projects);
@ -21,7 +21,7 @@ public function project_by_uuid(Request $request)
{ {
$teamId = get_team_id_from_token(); $teamId = get_team_id_from_token();
if (is_null($teamId)) { if (is_null($teamId)) {
return response()->json(['error' => 'Invalid token.', 'docs' => 'https://coolify.io/docs/api/authentication'], 400); return response()->json(['error' => 'Invalid token.', 'upstream docs' => 'https://coolify.io/docs/api/authentication'], 400);
} }
$project = ModelsProject::whereTeamId($teamId)->whereUuid(request()->uuid)->first()->load(['environments']); $project = ModelsProject::whereTeamId($teamId)->whereUuid(request()->uuid)->first()->load(['environments']);
return response()->json($project); return response()->json($project);
@ -30,7 +30,7 @@ public function environment_details(Request $request)
{ {
$teamId = get_team_id_from_token(); $teamId = get_team_id_from_token();
if (is_null($teamId)) { if (is_null($teamId)) {
return response()->json(['error' => 'Invalid token.', 'docs' => 'https://coolify.io/docs/api/authentication'], 400); return response()->json(['error' => 'Invalid token.', 'upstream docs' => 'https://coolify.io/docs/api/authentication'], 400);
} }
$project = ModelsProject::whereTeamId($teamId)->whereUuid(request()->uuid)->first(); $project = ModelsProject::whereTeamId($teamId)->whereUuid(request()->uuid)->first();
$environment = $project->environments()->whereName(request()->environment_name)->first()->load(['applications', 'postgresqls', 'redis', 'mongodbs', 'mysqls', 'mariadbs', 'services']); $environment = $project->environments()->whereName(request()->environment_name)->first()->load(['applications', 'postgresqls', 'redis', 'mongodbs', 'mysqls', 'mariadbs', 'services']);

View File

@ -12,7 +12,7 @@ public function servers(Request $request)
{ {
$teamId = get_team_id_from_token(); $teamId = get_team_id_from_token();
if (is_null($teamId)) { if (is_null($teamId)) {
return response()->json(['error' => 'Invalid token.', 'docs' => 'https://coolify.io/docs/api/authentication'], 400); return response()->json(['error' => 'Invalid token.', 'upstream docs' => 'https://coolify.io/docs/api/authentication'], 400);
} }
$servers = ModelsServer::whereTeamId($teamId)->select('id', 'name', 'uuid', 'ip', 'user', 'port')->get()->load(['settings'])->map(function ($server) { $servers = ModelsServer::whereTeamId($teamId)->select('id', 'name', 'uuid', 'ip', 'user', 'port')->get()->load(['settings'])->map(function ($server) {
$server['is_reachable'] = $server->settings->is_reachable; $server['is_reachable'] = $server->settings->is_reachable;
@ -26,7 +26,7 @@ public function server_by_uuid(Request $request)
{ {
$teamId = get_team_id_from_token(); $teamId = get_team_id_from_token();
if (is_null($teamId)) { if (is_null($teamId)) {
return response()->json(['error' => 'Invalid token.', 'docs' => 'https://coolify.io/docs/api/authentication'], 400); return response()->json(['error' => 'Invalid token.', 'upstream docs' => 'https://coolify.io/docs/api/authentication'], 400);
} }
$server = ModelsServer::whereTeamId($teamId)->whereUuid(request()->uuid)->first(); $server = ModelsServer::whereTeamId($teamId)->whereUuid(request()->uuid)->first();
if (is_null($server)) { if (is_null($server)) {

View File

@ -58,8 +58,8 @@ public function mount()
AAAECBQw4jg1WRT2IGHMncCiZhURCts2s24HoDS0thHnnRKVuGmoeGq/pojrsyP1pszcNV AAAECBQw4jg1WRT2IGHMncCiZhURCts2s24HoDS0thHnnRKVuGmoeGq/pojrsyP1pszcNV
uZx9iFkCELtxrh31QJ68AAAAEXNhaWxANzZmZjY2ZDJlMmRkAQIDBA== uZx9iFkCELtxrh31QJ68AAAAEXNhaWxANzZmZjY2ZDJlMmRkAQIDBA==
-----END OPENSSH PRIVATE KEY-----'; -----END OPENSSH PRIVATE KEY-----';
$this->privateKeyDescription = 'Created by Coolify'; $this->privateKeyDescription = 'Created by Last Hour Cloud';
$this->remoteServerDescription = 'Created by Coolify'; $this->remoteServerDescription = 'Created by Last Hour Cloud';
$this->remoteServerHost = 'coolify-testing-host'; $this->remoteServerHost = 'coolify-testing-host';
} }
} }
@ -280,7 +280,7 @@ public function showNewResource()
private function createNewPrivateKey() private function createNewPrivateKey()
{ {
$this->privateKeyName = generate_random_name(); $this->privateKeyName = generate_random_name();
$this->privateKeyDescription = 'Created by Coolify'; $this->privateKeyDescription = 'Created by Last Hour Cloud';
['private' => $this->privateKey, 'public' => $this->publicKey] = generateSSHKey(); ['private' => $this->privateKey, 'public' => $this->publicKey] = generateSSHKey();
} }
public function render() public function render()

View File

@ -53,9 +53,9 @@ public function submit()
'content' => "User: `" . auth()->user()?->email . "` with subject: `" . $this->subject . "` has the following problem: `" . $this->description . "`" 'content' => "User: `" . auth()->user()?->email . "` with subject: `" . $this->subject . "` has the following problem: `" . $this->description . "`"
]); ]);
} else { } else {
send_user_an_email($mail, auth()->user()?->email, 'hi@coollabs.io'); send_user_an_email($mail, auth()->user()?->email, 'support@lasthourhosting.org');
} }
$this->dispatch('success', 'Feedback sent.', 'We will get in touch with you as soon as possible.'); $this->dispatch('success', 'Help request sent.', 'Thank you! We will get in touch with you as soon as possible.');
} catch (\Throwable $e) { } catch (\Throwable $e) {
return handleError($e, $this); return handleError($e, $this);
} }

View File

@ -240,7 +240,7 @@ public function submit($showToaster = true)
if ($this->application->additional_servers->count() === 0) { if ($this->application->additional_servers->count() === 0) {
foreach ($domains as $domain) { foreach ($domains as $domain) {
if (!validate_dns_entry($domain, $this->application->destination->server)) { if (!validate_dns_entry($domain, $this->application->destination->server)) {
$showToaster && $this->dispatch('error', "Validating DNS ($domain) failed.", "Make sure you have added the DNS records correctly.<br><br>Check this <a target='_blank' class='text-white underline' href='https://coolify.io/docs/dns-settings'>documentation</a> for further help."); $showToaster && $this->dispatch('error', "Validating DNS ($domain) failed.", "Make sure you have added the DNS records correctly.<br><br>Check this upstream <a target='_blank' class='text-white underline' href='https://coolify.io/docs/dns-settings'>documentation</a> for further help.");
} }
} }
} }

View File

@ -60,7 +60,7 @@ public function deploy(bool $force_rebuild = false)
return; return;
} }
if (data_get($this->application, 'settings.is_build_server_enabled') && str($this->application->docker_registry_image_name)->isEmpty()) { if (data_get($this->application, 'settings.is_build_server_enabled') && str($this->application->docker_registry_image_name)->isEmpty()) {
$this->dispatch('error', 'Failed to deploy.', 'To use a build server, you must first set a Docker image.<br>More information here: <a target="_blank" class="underline" href="https://coolify.io/docs/server/build-server">documentation</a>'); $this->dispatch('error', 'Failed to deploy.', 'To use a build server, you must first set a Docker image.<br>More information here in upstream docs: <a target="_blank" class="underline" href="https://coolify.io/docs/server/build-server">documentation</a>');
return; return;
} }
if ($this->application->additional_servers->count() > 0 && str($this->application->docker_registry_image_name)->isEmpty()) { if ($this->application->additional_servers->count() > 0 && str($this->application->docker_registry_image_name)->isEmpty()) {
@ -103,7 +103,7 @@ public function stop()
public function restart() public function restart()
{ {
if ($this->application->additional_servers->count() > 0 && str($this->application->docker_registry_image_name)->isEmpty()) { if ($this->application->additional_servers->count() > 0 && str($this->application->docker_registry_image_name)->isEmpty()) {
$this->dispatch('error', 'Failed to deploy', 'Before deploying to multiple servers, you must first set a Docker image in the General tab.<br>More information here: <a target="_blank" class="underline" href="https://coolify.io/docs/server/multiple-servers">documentation</a>'); $this->dispatch('error', 'Failed to deploy', 'Before deploying to multiple servers, you must first set a Docker image in the General tab.<br>More information here in upstream docs: <a target="_blank" class="underline" href="https://coolify.io/docs/server/multiple-servers">documentation</a>');
return; return;
} }
$this->setDeploymentUuid(); $this->setDeploymentUuid();

View File

@ -44,7 +44,7 @@ public function loadData()
public function redeploy(int $network_id, int $server_id) public function redeploy(int $network_id, int $server_id)
{ {
if ($this->resource->additional_servers->count() > 0 && str($this->resource->docker_registry_image_name)->isEmpty()) { if ($this->resource->additional_servers->count() > 0 && str($this->resource->docker_registry_image_name)->isEmpty()) {
$this->dispatch('error', 'Failed to deploy.', 'Before deploying to multiple servers, you must first set a Docker image in the General tab.<br>More information here: <a target="_blank" class="underline" href="https://coolify.io/docs/server/multiple-servers">documentation</a>'); $this->dispatch('error', 'Failed to deploy.', 'Before deploying to multiple servers, you must first set a Docker image in the General tab.<br>More information here in upstream docs: <a target="_blank" class="underline" href="https://coolify.io/docs/server/multiple-servers">documentation</a>');
return; return;
} }
$deployment_uuid = new Cuid2(7); $deployment_uuid = new Cuid2(7);

View File

@ -31,7 +31,7 @@ public function generateNewKey()
try { try {
$this->rateLimit(10); $this->rateLimit(10);
$this->name = generate_random_name(); $this->name = generate_random_name();
$this->description = 'Created by Coolify'; $this->description = 'Created by Last Hour Cloud';
['private' => $this->value, 'public' => $this->publicKey] = generateSSHKey(); ['private' => $this->value, 'public' => $this->publicKey] = generateSSHKey();
} catch(\Throwable $e) { } catch(\Throwable $e) {
return handleError($e, $this); return handleError($e, $this);

View File

@ -82,7 +82,7 @@ public function checkLocalhostConnection()
$this->server->settings->is_usable = true; $this->server->settings->is_usable = true;
$this->server->settings->save(); $this->server->settings->save();
} else { } else {
$this->dispatch('error', 'Server is not reachable.', 'Please validate your configuration and connection.<br><br>Check this <a target="_blank" class="underline" href="https://coolify.io/docs/server/openssh">documentation</a> for further help.'); $this->dispatch('error', 'Server is not reachable.', 'Please validate your configuration and connection.<br><br>Check this upstream <a target="_blank" class="underline" href="https://coolify.io/docs/server/openssh">documentation</a> for further help.');
return; return;
} }
} }

View File

@ -39,7 +39,7 @@ public function checkConnection()
if ($uptime) { if ($uptime) {
$this->dispatch('success', 'Server is reachable.'); $this->dispatch('success', 'Server is reachable.');
} else { } else {
$this->dispatch('error', 'Server is not reachable.<br>Please validate your configuration and connection.<br><br>Check this <a target="_blank" class="underline" href="https://coolify.io/docs/server/openssh#openssh">documentation</a> for further help.'); $this->dispatch('error', 'Server is not reachable.<br>Please validate your configuration and connection.<br><br>Check this upstream <a target="_blank" class="underline" href="https://coolify.io/docs/server/openssh#openssh">documentation</a> for further help.');
return; return;
} }
} catch (\Throwable $e) { } catch (\Throwable $e) {

View File

@ -68,7 +68,7 @@ public function validateConnection()
{ {
$this->uptime = $this->server->validateConnection(); $this->uptime = $this->server->validateConnection();
if (!$this->uptime) { if (!$this->uptime) {
$this->error = 'Server is not reachable. Please validate your configuration and connection.<br><br>Check this <a target="_blank" class="underline" href="https://coolify.io/docs/server/openssh">documentation</a> for further help.'; $this->error = 'Server is not reachable. Please validate your configuration and connection.<br><br>Check this upstream <a target="_blank" class="underline" href="https://coolify.io/docs/server/openssh">documentation</a> for further help.';
return; return;
} }
} }

View File

@ -47,7 +47,7 @@ public function testConnection(bool $shouldSave = false)
$this->is_usable = false; $this->is_usable = false;
if ($this->unusable_email_sent === false && is_transactional_emails_active()) { if ($this->unusable_email_sent === false && is_transactional_emails_active()) {
$mail = new MailMessage(); $mail = new MailMessage();
$mail->subject('Coolify: S3 Storage Connection Error'); $mail->subject('Last Hour Cloud: S3 Storage Connection Error');
$mail->view('emails.s3-connection-error', ['name' => $this->name, 'reason' => $e->getMessage(), 'url' => route('team.storage.show', ['storage_uuid' => $this->uuid])]); $mail->view('emails.s3-connection-error', ['name' => $this->name, 'reason' => $e->getMessage(), 'url' => route('team.storage.show', ['storage_uuid' => $this->uuid])]);
$users = collect([]); $users = collect([]);
$members = $this->team->members()->get(); $members = $this->team->members()->get();

View File

@ -93,7 +93,7 @@ public function sendVerificationEmail()
$mail->view('emails.email-verification', [ $mail->view('emails.email-verification', [
'url' => $url, 'url' => $url,
]); ]);
$mail->subject('Coolify: Verify your email.'); $mail->subject('Last Hour Cloud: Verify your email.');
send_user_an_email($mail, $this->email); send_user_an_email($mail, $this->email);
} }
public function sendPasswordResetNotification($token): void public function sendPasswordResetNotification($token): void

View File

@ -52,10 +52,10 @@ public function toMail(): MailMessage
$pull_request_id = data_get($this->preview, 'pull_request_id', 0); $pull_request_id = data_get($this->preview, 'pull_request_id', 0);
$fqdn = $this->fqdn; $fqdn = $this->fqdn;
if ($pull_request_id === 0) { if ($pull_request_id === 0) {
$mail->subject('Coolify: Deployment failed of ' . $this->application_name . '.'); $mail->subject('Last Hour Cloud: Deployment failed of ' . $this->application_name . '.');
} else { } else {
$fqdn = $this->preview->fqdn; $fqdn = $this->preview->fqdn;
$mail->subject('Coolify: Deployment failed of pull request #' . $this->preview->pull_request_id . ' of ' . $this->application_name . '.'); $mail->subject('Last Hour Cloud: Deployment failed of pull request #' . $this->preview->pull_request_id . ' of ' . $this->application_name . '.');
} }
$mail->view('emails.application-deployment-failed', [ $mail->view('emails.application-deployment-failed', [
'name' => $this->application_name, 'name' => $this->application_name,
@ -69,10 +69,10 @@ public function toMail(): MailMessage
public function toDiscord(): string public function toDiscord(): string
{ {
if ($this->preview) { if ($this->preview) {
$message = 'Coolify: Pull request #' . $this->preview->pull_request_id . ' of **' . $this->application_name . '** (' . $this->preview->fqdn . ') deployment failed: '; $message = 'Last Hour Cloud: Pull request #' . $this->preview->pull_request_id . ' of **' . $this->application_name . '** (' . $this->preview->fqdn . ') deployment failed: ';
$message .= '[View Deployment Logs](' . $this->deployment_url . ')'; $message .= '[View Deployment Logs](' . $this->deployment_url . ')';
} else { } else {
$message = 'Coolify: Deployment failed of **' . $this->application_name . '** (' . $this->fqdn . '): '; $message = 'Last Hour Cloud: Deployment failed of **' . $this->application_name . '** (' . $this->fqdn . '): ';
$message .= '[View Deployment Logs](' . $this->deployment_url . ')'; $message .= '[View Deployment Logs](' . $this->deployment_url . ')';
} }
return $message; return $message;
@ -80,9 +80,9 @@ public function toDiscord(): string
public function toTelegram(): array public function toTelegram(): array
{ {
if ($this->preview) { if ($this->preview) {
$message = 'Coolify: Pull request #' . $this->preview->pull_request_id . ' of **' . $this->application_name . '** (' . $this->preview->fqdn . ') deployment failed: '; $message = 'Last Hour Cloud: Pull request #' . $this->preview->pull_request_id . ' of **' . $this->application_name . '** (' . $this->preview->fqdn . ') deployment failed: ';
} else { } else {
$message = 'Coolify: Deployment failed of **' . $this->application_name . '** (' . $this->fqdn . '): '; $message = 'Last Hour Cloud: Deployment failed of **' . $this->application_name . '** (' . $this->fqdn . '): ';
} }
$buttons[] = [ $buttons[] = [
"text" => "Deployment logs", "text" => "Deployment logs",

View File

@ -52,10 +52,10 @@ public function toMail(): MailMessage
$pull_request_id = data_get($this->preview, 'pull_request_id', 0); $pull_request_id = data_get($this->preview, 'pull_request_id', 0);
$fqdn = $this->fqdn; $fqdn = $this->fqdn;
if ($pull_request_id === 0) { if ($pull_request_id === 0) {
$mail->subject("Coolify: New version is deployed of {$this->application_name}"); $mail->subject("Last Hour Cloud: New version is deployed of {$this->application_name}");
} else { } else {
$fqdn = $this->preview->fqdn; $fqdn = $this->preview->fqdn;
$mail->subject("Coolify: Pull request #{$pull_request_id} of {$this->application_name} deployed successfully"); $mail->subject("Last Hour Cloud: Pull request #{$pull_request_id} of {$this->application_name} deployed successfully");
} }
$mail->view('emails.application-deployment-success', [ $mail->view('emails.application-deployment-success', [
'name' => $this->application_name, 'name' => $this->application_name,
@ -69,7 +69,7 @@ public function toMail(): MailMessage
public function toDiscord(): string public function toDiscord(): string
{ {
if ($this->preview) { if ($this->preview) {
$message = 'Coolify: New PR' . $this->preview->pull_request_id . ' version successfully deployed of ' . $this->application_name . ' $message = 'Last Hour Cloud: New PR' . $this->preview->pull_request_id . ' version successfully deployed of ' . $this->application_name . '
'; ';
if ($this->preview->fqdn) { if ($this->preview->fqdn) {
@ -77,7 +77,7 @@ public function toDiscord(): string
} }
$message .= '[Deployment logs](' . $this->deployment_url . ')'; $message .= '[Deployment logs](' . $this->deployment_url . ')';
} else { } else {
$message = 'Coolify: New version successfully deployed of ' . $this->application_name . ' $message = 'Last Hour Cloud: New version successfully deployed of ' . $this->application_name . '
'; ';
if ($this->fqdn) { if ($this->fqdn) {
@ -90,7 +90,7 @@ public function toDiscord(): string
public function toTelegram(): array public function toTelegram(): array
{ {
if ($this->preview) { if ($this->preview) {
$message = 'Coolify: New PR' . $this->preview->pull_request_id . ' version successfully deployed of ' . $this->application_name . ''; $message = 'Last Hour Cloud: New PR' . $this->preview->pull_request_id . ' version successfully deployed of ' . $this->application_name . '';
if ($this->preview->fqdn) { if ($this->preview->fqdn) {
$buttons[] = [ $buttons[] = [
"text" => "Open Application", "text" => "Open Application",

View File

@ -43,7 +43,7 @@ public function toMail(): MailMessage
{ {
$mail = new MailMessage(); $mail = new MailMessage();
$fqdn = $this->fqdn; $fqdn = $this->fqdn;
$mail->subject("Coolify: {$this->resource_name} has been stopped"); $mail->subject("Last Hour Cloud: {$this->resource_name} has been stopped");
$mail->view('emails.application-status-changes', [ $mail->view('emails.application-status-changes', [
'name' => $this->resource_name, 'name' => $this->resource_name,
'fqdn' => $fqdn, 'fqdn' => $fqdn,
@ -54,20 +54,20 @@ public function toMail(): MailMessage
public function toDiscord(): string public function toDiscord(): string
{ {
$message = 'Coolify: ' . $this->resource_name . ' has been stopped. $message = 'Last Hour Cloud: ' . $this->resource_name . ' has been stopped.
'; ';
$message .= '[Open Application in Coolify](' . $this->resource_url . ')'; $message .= '[Open Application in Last Hour Cloud](' . $this->resource_url . ')';
return $message; return $message;
} }
public function toTelegram(): array public function toTelegram(): array
{ {
$message = 'Coolify: ' . $this->resource_name . ' has been stopped.'; $message = 'Last Hour Cloud: ' . $this->resource_name . ' has been stopped.';
return [ return [
"message" => $message, "message" => $message,
"buttons" => [ "buttons" => [
[ [
"text" => "Open Application in Coolify", "text" => "Open Application in Last Hour Cloud",
"url" => $this->resource_url "url" => $this->resource_url
] ]
], ],

View File

@ -27,7 +27,7 @@ public function via(object $notifiable): array
public function toMail(): MailMessage public function toMail(): MailMessage
{ {
$mail = new MailMessage(); $mail = new MailMessage();
$mail->subject("Coolify: A resource ({$this->name}) has been restarted automatically on {$this->server->name}"); $mail->subject("Last Hour Cloud: A resource ({$this->name}) has been restarted automatically on {$this->server->name}");
$mail->view('emails.container-restarted', [ $mail->view('emails.container-restarted', [
'containerName' => $this->name, 'containerName' => $this->name,
'serverName' => $this->server->name, 'serverName' => $this->server->name,
@ -38,12 +38,12 @@ public function toMail(): MailMessage
public function toDiscord(): string public function toDiscord(): string
{ {
$message = "Coolify: A resource ({$this->name}) has been restarted automatically on {$this->server->name}"; $message = "Last Hour Cloud: A resource ({$this->name}) has been restarted automatically on {$this->server->name}";
return $message; return $message;
} }
public function toTelegram(): array public function toTelegram(): array
{ {
$message = "Coolify: A resource ({$this->name}) has been restarted automatically on {$this->server->name}"; $message = "Last Hour Cloud: A resource ({$this->name}) has been restarted automatically on {$this->server->name}";
$payload = [ $payload = [
"message" => $message, "message" => $message,
]; ];
@ -51,7 +51,7 @@ public function toTelegram(): array
$payload['buttons'] = [ $payload['buttons'] = [
[ [
[ [
"text" => "Check Proxy in Coolify", "text" => "Check Proxy in Last Hour Cloud",
"url" => $this->url "url" => $this->url
] ]
] ]

View File

@ -26,7 +26,7 @@ public function via(object $notifiable): array
public function toMail(): MailMessage public function toMail(): MailMessage
{ {
$mail = new MailMessage(); $mail = new MailMessage();
$mail->subject("Coolify: A resource has been stopped unexpectedly on {$this->server->name}"); $mail->subject("Last Hour Cloud: A resource has been stopped unexpectedly on {$this->server->name}");
$mail->view('emails.container-stopped', [ $mail->view('emails.container-stopped', [
'containerName' => $this->name, 'containerName' => $this->name,
'serverName' => $this->server->name, 'serverName' => $this->server->name,
@ -37,12 +37,12 @@ public function toMail(): MailMessage
public function toDiscord(): string public function toDiscord(): string
{ {
$message = "Coolify: A resource ($this->name) has been stopped unexpectedly on {$this->server->name}"; $message = "Last Hour Cloud: A resource ($this->name) has been stopped unexpectedly on {$this->server->name}";
return $message; return $message;
} }
public function toTelegram(): array public function toTelegram(): array
{ {
$message = "Coolify: A resource ($this->name) has been stopped unexpectedly on {$this->server->name}"; $message = "Last Hour Cloud: A resource ($this->name) has been stopped unexpectedly on {$this->server->name}";
$payload = [ $payload = [
"message" => $message, "message" => $message,
]; ];
@ -50,7 +50,7 @@ public function toTelegram(): array
$payload['buttons'] = [ $payload['buttons'] = [
[ [
[ [
"text" => "Open Application in Coolify", "text" => "Open Application in Last Hour Cloud",
"url" => $this->url "url" => $this->url
] ]
] ]

View File

@ -33,7 +33,7 @@ public function via(object $notifiable): array
public function toMail(): MailMessage public function toMail(): MailMessage
{ {
$mail = new MailMessage(); $mail = new MailMessage();
$mail->subject("Coolify: [ACTION REQUIRED] Backup FAILED for {$this->database->name}"); $mail->subject("Last Hour Cloud: [ACTION REQUIRED] Backup FAILED for {$this->database->name}");
$mail->view('emails.backup-failed', [ $mail->view('emails.backup-failed', [
'name' => $this->name, 'name' => $this->name,
'frequency' => $this->frequency, 'frequency' => $this->frequency,
@ -44,11 +44,11 @@ public function toMail(): MailMessage
public function toDiscord(): string public function toDiscord(): string
{ {
return "Coolify: Database backup for {$this->name} with frequency of {$this->frequency} was FAILED.\n\nReason: {$this->output}"; return "Last Hour Cloud: Database backup for {$this->name} with frequency of {$this->frequency} was FAILED.\n\nReason: {$this->output}";
} }
public function toTelegram(): array public function toTelegram(): array
{ {
$message = "Coolify: Database backup for {$this->name} with frequency of {$this->frequency} was FAILED.\n\nReason: {$this->output}"; $message = "Last Hour Cloud: Database backup for {$this->name} with frequency of {$this->frequency} was FAILED.\n\nReason: {$this->output}";
return [ return [
"message" => $message, "message" => $message,
]; ];

View File

@ -30,7 +30,7 @@ public function via(object $notifiable): array
public function toMail(): MailMessage public function toMail(): MailMessage
{ {
$mail = new MailMessage(); $mail = new MailMessage();
$mail->subject("Coolify: Backup successfully done for {$this->database->name}"); $mail->subject("Last Hour Cloud: Backup successfully done for {$this->database->name}");
$mail->view('emails.backup-success', [ $mail->view('emails.backup-success', [
'name' => $this->name, 'name' => $this->name,
'frequency' => $this->frequency, 'frequency' => $this->frequency,
@ -40,11 +40,11 @@ public function toMail(): MailMessage
public function toDiscord(): string public function toDiscord(): string
{ {
return "Coolify: Database backup for {$this->name} with frequency of {$this->frequency} was successful."; return "Last Hour Cloud: Database backup for {$this->name} with frequency of {$this->frequency} was successful.";
} }
public function toTelegram(): array public function toTelegram(): array
{ {
$message = "Coolify: Database backup for {$this->name} with frequency of {$this->frequency} was successful."; $message = "Last Hour Cloud: Database backup for {$this->name} with frequency of {$this->frequency} was successful.";
return [ return [
"message" => $message, "message" => $message,
]; ];

View File

@ -42,7 +42,7 @@ public function via(object $notifiable): array
public function toMail(): MailMessage public function toMail(): MailMessage
{ {
$mail = new MailMessage(); $mail = new MailMessage();
$mail->subject("Coolify: Server ({$this->server->name}) high disk usage detected!"); $mail->subject("Last Hour Cloud: Server ({$this->server->name}) high disk usage detected!");
$mail->view('emails.high-disk-usage', [ $mail->view('emails.high-disk-usage', [
'name' => $this->server->name, 'name' => $this->server->name,
'disk_usage' => $this->disk_usage, 'disk_usage' => $this->disk_usage,
@ -53,13 +53,13 @@ public function toMail(): MailMessage
public function toDiscord(): string public function toDiscord(): string
{ {
$message = "Coolify: Server '{$this->server->name}' high disk usage detected!\nDisk usage: {$this->disk_usage}%. Threshold: {$this->cleanup_after_percentage}%.\nPlease cleanup your disk to prevent data-loss.\nHere are some tips: https://coolify.io/docs/automated-cleanup."; $message = "Last Hour Cloud: Server '{$this->server->name}' high disk usage detected!\nDisk usage: {$this->disk_usage}%. Threshold: {$this->cleanup_after_percentage}%.\nPlease cleanup your disk to prevent data-loss.\nHere are some tips from upstream docs: https://coolify.io/docs/automated-cleanup.";
return $message; return $message;
} }
public function toTelegram(): array public function toTelegram(): array
{ {
return [ return [
"message" => "Coolify: Server '{$this->server->name}' high disk usage detected!\nDisk usage: {$this->disk_usage}%. Threshold: {$this->cleanup_after_percentage}%.\nPlease cleanup your disk to prevent data-loss.\nHere are some tips: https://coolify.io/docs/automated-cleanup." "message" => "Last Hour Cloud: Server '{$this->server->name}' high disk usage detected!\nDisk usage: {$this->disk_usage}%. Threshold: {$this->cleanup_after_percentage}%.\nPlease cleanup your disk to prevent data-loss.\nHere are some tips from upstream docs: https://coolify.io/docs/automated-cleanup."
]; ];
} }
} }

View File

@ -45,7 +45,7 @@ public function via(object $notifiable): array
public function toMail(): MailMessage public function toMail(): MailMessage
{ {
$mail = new MailMessage(); $mail = new MailMessage();
$mail->subject("Coolify: Server ({$this->server->name}) revived."); $mail->subject("Last Hour Cloud: Server ({$this->server->name}) revived.");
$mail->view('emails.server-revived', [ $mail->view('emails.server-revived', [
'name' => $this->server->name, 'name' => $this->server->name,
]); ]);
@ -54,13 +54,13 @@ public function toMail(): MailMessage
public function toDiscord(): string public function toDiscord(): string
{ {
$message = "Coolify: Server '{$this->server->name}' revived. All automations & integrations are turned on again!"; $message = "Last Hour Cloud: Server '{$this->server->name}' revived. All automations & integrations are turned on again!";
return $message; return $message;
} }
public function toTelegram(): array public function toTelegram(): array
{ {
return [ return [
"message" => "Coolify: Server '{$this->server->name}' revived. All automations & integrations are turned on again!" "message" => "Last Hour Cloud: Server '{$this->server->name}' revived. All automations & integrations are turned on again!"
]; ];
} }
} }

View File

@ -43,7 +43,7 @@ public function via(object $notifiable): array
public function toMail(): MailMessage public function toMail(): MailMessage
{ {
$mail = new MailMessage(); $mail = new MailMessage();
$mail->subject("Coolify: Your server ({$this->server->name}) is unreachable."); $mail->subject("Last Hour Cloud: Your server ({$this->server->name}) is unreachable.");
$mail->view('emails.server-lost-connection', [ $mail->view('emails.server-lost-connection', [
'name' => $this->server->name, 'name' => $this->server->name,
]); ]);
@ -52,13 +52,13 @@ public function toMail(): MailMessage
public function toDiscord(): string public function toDiscord(): string
{ {
$message = "Coolify: Your server '{$this->server->name}' is unreachable. All automations & integrations are turned off! Please check your server! IMPORTANT: We automatically try to revive your server and turn on all automations & integrations."; $message = "Last Hour Cloud: Your server '{$this->server->name}' is unreachable. All automations & integrations are turned off! Please check your server! IMPORTANT: We automatically try to revive your server and turn on all automations & integrations.";
return $message; return $message;
} }
public function toTelegram(): array public function toTelegram(): array
{ {
return [ return [
"message" => "Coolify: Your server '{$this->server->name}' is unreachable. All automations & integrations are turned off! Please check your server! IMPORTANT: We automatically try to revive your server and turn on all automations & integrations." "message" => "Last Hour Cloud: Your server '{$this->server->name}' is unreachable. All automations & integrations are turned off! Please check your server! IMPORTANT: We automatically try to revive your server and turn on all automations & integrations."
]; ];
} }
} }

View File

@ -24,14 +24,14 @@ public function via(object $notifiable): array
public function toMail(): MailMessage public function toMail(): MailMessage
{ {
$mail = new MailMessage(); $mail = new MailMessage();
$mail->subject("Coolify: Test Email"); $mail->subject("Last Hour Cloud: Test Email");
$mail->view('emails.test'); $mail->view('emails.test');
return $mail; return $mail;
} }
public function toDiscord(): string public function toDiscord(): string
{ {
$message = 'Coolify: This is a test Discord notification from Coolify.'; $message = 'Last Hour Cloud: This is a test Discord notification from Last Hour Cloud.';
$message .= "\n\n"; $message .= "\n\n";
$message .= '[Go to your dashboard](' . base_url() . ')'; $message .= '[Go to your dashboard](' . base_url() . ')';
return $message; return $message;
@ -39,7 +39,7 @@ public function toDiscord(): string
public function toTelegram(): array public function toTelegram(): array
{ {
return [ return [
"message" => 'Coolify: This is a test Telegram notification from Coolify.', "message" => 'Last Hour Cloud: This is a test Telegram notification from Last Hour Cloud.',
"buttons" => [ "buttons" => [
[ [
"text" => "Go to your dashboard", "text" => "Go to your dashboard",

View File

@ -30,7 +30,7 @@ public function toMail(): MailMessage
$invitation_team = Team::find($invitation->team->id); $invitation_team = Team::find($invitation->team->id);
$mail = new MailMessage(); $mail = new MailMessage();
$mail->subject('Coolify: Invitation for ' . $invitation_team->name); $mail->subject('Last Hour Cloud: Invitation for ' . $invitation_team->name);
$mail->view('emails.invitation-link', [ $mail->view('emails.invitation-link', [
'team' => $invitation_team->name, 'team' => $invitation_team->name,
'email' => $this->user->email, 'email' => $this->user->email,

View File

@ -50,7 +50,7 @@ public function toMail($notifiable)
protected function buildMailMessage($url) protected function buildMailMessage($url)
{ {
$mail = new MailMessage(); $mail = new MailMessage();
$mail->subject('Coolify: Reset Password'); $mail->subject('Last Hour Cloud: Reset Password');
$mail->view('emails.reset-password', ['url' => $url, 'count' => config('auth.passwords.' . config('auth.defaults.passwords') . '.expire')]); $mail->view('emails.reset-password', ['url' => $url, 'count' => config('auth.passwords.' . config('auth.defaults.passwords') . '.expire')]);
return $mail; return $mail;
} }

View File

@ -25,7 +25,7 @@ public function via(): array
public function toMail(): MailMessage public function toMail(): MailMessage
{ {
$mail = new MailMessage(); $mail = new MailMessage();
$mail->subject('Coolify: Test Email'); $mail->subject('Last Hour Cloud: Test Email');
$mail->view('emails.test'); $mail->view('emails.test');
return $mail; return $mail;
} }

View File

@ -140,7 +140,7 @@ function get_route_parameters(): array
function get_latest_version_of_coolify(): string function get_latest_version_of_coolify(): string
{ {
try { try {
$response = Http::get('https://cdn.coollabs.io/coolify/versions.json'); $response = Http::get('https://cdn.lasthourhosting.org/lasthourcloud/versions.json');
$versions = $response->json(); $versions = $response->json();
return data_get($versions, 'coolify.v4.version'); return data_get($versions, 'coolify.v4.version');
} catch (\Throwable $e) { } catch (\Throwable $e) {

View File

@ -2,7 +2,7 @@
return [ return [
'docs' => [ 'docs' => [
'base_url' => 'https://coolify.io/docs', 'base_url' => 'https://coolify.io/docs',
'contact' => 'https://coolify.io/docs/contact', 'contact' => 'https://lasthourhosting.org/contact.html',
], ],
'ssh' => [ 'ssh' => [
'connection_timeout' => 10, 'connection_timeout' => 10,
@ -19,7 +19,7 @@
], ],
], ],
'services' => [ 'services' => [
'official' => 'https://cdn.coollabs.io/coolify/service-templates.json', 'official' => 'https://cdn.lasthourhosting.org/lasthourcloud/templates/service-templates.json',
], ],
'limits' => [ 'limits' => [
'trial_period' => 0, 'trial_period' => 0,

View File

@ -2,7 +2,7 @@
return [ return [
'docs' => 'https://coolify.io/docs/', 'docs' => 'https://coolify.io/docs/',
'contact' => 'https://coolify.io/docs/contact', 'contact' => 'https://lasthourhosting.org/contact.html',
'feedback_discord_webhook' => env('FEEDBACK_DISCORD_WEBHOOK'), 'feedback_discord_webhook' => env('FEEDBACK_DISCORD_WEBHOOK'),
'self_hosted' => env('SELF_HOSTED', true), 'self_hosted' => env('SELF_HOSTED', true),
'waitlist' => env('WAITLIST', false), 'waitlist' => env('WAITLIST', false),

View File

@ -7,7 +7,7 @@
// The release version of your application // The release version of your application
// Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD')) // Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD'))
'release' => '4.0.0-beta.221', 'release' => '4.0.0',
// When left empty or `null` the Laravel environment will be used // When left empty or `null` the Laravel environment will be used
'environment' => config('app.env'), 'environment' => config('app.env'),

View File

@ -1,3 +1,3 @@
<?php <?php
return '4.0.0-beta.221'; return '4.0.0';

View File

@ -20,7 +20,7 @@ public function up(): void
$table->string('default_redirect_404')->nullable(); $table->string('default_redirect_404')->nullable();
$table->integer('public_port_min')->default(9000); $table->integer('public_port_min')->default(9000);
$table->integer('public_port_max')->default(9100); $table->integer('public_port_max')->default(9100);
$table->boolean('do_not_track')->default(false); $table->boolean('do_not_track')->default(true);
$table->boolean('is_auto_update_enabled')->default(true); $table->boolean('is_auto_update_enabled')->default(true);
$table->boolean('is_registration_enabled')->default(true); $table->boolean('is_registration_enabled')->default(true);
$table->schemalessAttributes('smtp'); $table->schemalessAttributes('smtp');

View File

@ -94,7 +94,7 @@ public function run(): void
$server_details = [ $server_details = [
'id' => 0, 'id' => 0,
'name' => "localhost", 'name' => "localhost",
'description' => "This is the server where Coolify is running on. Don't delete this!", 'description' => "This is the server where Last Hour Cloud is running on. Don't delete this!",
'user' => 'root', 'user' => 'root',
'ip' => "host.docker.internal", 'ip' => "host.docker.internal",
'team_id' => 0, 'team_id' => 0,
@ -147,7 +147,7 @@ public function run(): void
'id' => 0, 'id' => 0,
'uuid' => 'coolify-testing-host', 'uuid' => 'coolify-testing-host',
'name' => "localhost", 'name' => "localhost",
'description' => "This is the server where Coolify is running on. Don't delete this!", 'description' => "This is the server where Last Hour Cloud is running on. Don't delete this!",
'user' => 'root', 'user' => 'root',
'ip' => "coolify-testing-host", 'ip' => "coolify-testing-host",
'team_id' => 0, 'team_id' => 0,

View File

@ -1,7 +1,7 @@
version: '3.8' version: "3.8"
services: services:
coolify: coolify:
image: "ghcr.io/coollabsio/coolify:${LATEST_IMAGE:-latest}" image: "githaven.org/shiloh/lasthourcloud:4.0.0"
volumes: volumes:
- type: bind - type: bind
source: /data/coolify/source/.env source: /data/coolify/source/.env
@ -12,6 +12,7 @@ services:
- /data/coolify/databases:/var/www/html/storage/app/databases - /data/coolify/databases:/var/www/html/storage/app/databases
- /data/coolify/services:/var/www/html/storage/app/services - /data/coolify/services:/var/www/html/storage/app/services
- /data/coolify/backups:/var/www/html/storage/app/backups - /data/coolify/backups:/var/www/html/storage/app/backups
environment: environment:
- APP_ID - APP_ID
- APP_ENV=production - APP_ENV=production
@ -106,7 +107,7 @@ services:
"CMD-SHELL", "CMD-SHELL",
"pg_isready -U ${DB_USERNAME:-coolify}", "pg_isready -U ${DB_USERNAME:-coolify}",
"-d", "-d",
"${DB_DATABASE:-coolify}" "${DB_DATABASE:-coolify}",
] ]
interval: 5s interval: 5s
retries: 10 retries: 10

View File

@ -1,4 +1,4 @@
version: '3.8' version: "3.8"
services: services:
coolify-testing-host: coolify-testing-host:
init: true init: true
@ -15,7 +15,7 @@ services:
restart: always restart: always
working_dir: /var/www/html working_dir: /var/www/html
extra_hosts: extra_hosts:
- 'host.docker.internal:host-gateway' - "host.docker.internal:host-gateway"
volumes: volumes:
- type: bind - type: bind
source: .env source: .env
@ -80,7 +80,7 @@ services:
"CMD-SHELL", "CMD-SHELL",
"pg_isready -U ${DB_USERNAME:-coolify}", "pg_isready -U ${DB_USERNAME:-coolify}",
"-d", "-d",
"${DB_DATABASE:-coolify}" "${DB_DATABASE:-coolify}",
] ]
interval: 5s interval: 5s
retries: 10 retries: 10
@ -103,7 +103,7 @@ services:
retries: 10 retries: 10
timeout: 2s timeout: 2s
soketi: soketi:
image: 'quay.io/soketi/soketi:1.6-16-alpine' image: "quay.io/soketi/soketi:1.6-16-alpine"
pull_policy: always pull_policy: always
container_name: coolify-realtime container_name: coolify-realtime
restart: always restart: always

View File

@ -7,7 +7,7 @@
"auth.register_now": "Register a new account", "auth.register_now": "Register a new account",
"auth.logout": "Logout", "auth.logout": "Logout",
"auth.register": "Register", "auth.register": "Register",
"auth.registration_disabled": "Registration is disabled. Please contact the administrator.", "auth.registration_disabled": "Registration is disabled. Please contact support@lasthourhosting.org for help.",
"auth.reset_password": "Reset password", "auth.reset_password": "Reset password",
"auth.failed": "These credentials do not match our records.", "auth.failed": "These credentials do not match our records.",
"auth.failed.password": "The provided password is incorrect.", "auth.failed.password": "The provided password is incorrect.",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 641 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
public/lasthour.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View File

@ -2,7 +2,7 @@
<div class="flex items-center justify-center h-screen"> <div class="flex items-center justify-center h-screen">
<div> <div>
<div class="flex flex-col items-center pb-8"> <div class="flex flex-col items-center pb-8">
<div class="text-5xl font-bold tracking-tight text-center text-white">Coolify</div> <div class="text-5xl font-bold tracking-tight text-center text-white">Last Hour Cloud</div>
<x-version /> <x-version />
</div> </div>
<div class="w-96"> <div class="w-96">

View File

@ -3,7 +3,7 @@
<div> <div>
<div class="flex flex-col items-center pb-8"> <div class="flex flex-col items-center pb-8">
<a href="{{ route('dashboard') }}"> <a href="{{ route('dashboard') }}">
<div class="text-5xl font-bold tracking-tight text-center text-white">Coolify</div> <div class="text-5xl font-bold tracking-tight text-center text-white">Last Hour Cloud</div>
</a> </a>
<x-version /> <x-version />
</div> </div>

View File

@ -2,7 +2,7 @@
<div class="min-h-screen hero"> <div class="min-h-screen hero">
<div class="w-96 min-w-fit"> <div class="w-96 min-w-fit">
<div class="flex flex-col items-center pb-8"> <div class="flex flex-col items-center pb-8">
<div class="text-5xl font-extrabold tracking-tight text-center text-white">Coolify</div> <div class="text-5xl font-extrabold tracking-tight text-center text-white">Last Hour Cloud</div>
</div> </div>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<h1>{{ __('auth.login') }}</h1> <h1>{{ __('auth.login') }}</h1>

View File

@ -2,7 +2,7 @@
<div class="flex items-center justify-center min-h-screen "> <div class="flex items-center justify-center min-h-screen ">
<div class="w-1/2"> <div class="w-1/2">
<div class="flex flex-col items-center pb-8"> <div class="flex flex-col items-center pb-8">
<div class="text-5xl font-bold tracking-tight text-center text-white">Coolify</div> <div class="text-5xl font-bold tracking-tight text-center text-white">Last Hour Cloud</div>
<x-version /> <x-version />
</div> </div>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">

View File

@ -3,7 +3,7 @@
<div> <div>
<div class="flex flex-col items-center "> <div class="flex flex-col items-center ">
<a href="{{ route('dashboard') }}"> <a href="{{ route('dashboard') }}">
<div class="text-5xl font-bold tracking-tight text-center text-white">Coolify</div> <div class="text-5xl font-bold tracking-tight text-center text-white">Last Hour Cloud</div>
</a> </a>
</div> </div>
<div class="flex items-center justify-center pb-4 text-center"> <div class="flex items-center justify-center pb-4 text-center">

View File

@ -2,7 +2,7 @@
<div class="flex items-center justify-center h-screen"> <div class="flex items-center justify-center h-screen">
<div> <div>
<div class="flex flex-col items-center pb-8"> <div class="flex flex-col items-center pb-8">
<div class="text-5xl font-bold tracking-tight text-center text-white">Coolify</div> <div class="text-5xl font-bold tracking-tight text-center text-white">Last Hour Cloud</div>
<x-version /> <x-version />
</div> </div>
<div class="w-96" x-data="{ showRecovery: false }"> <div class="w-96" x-data="{ showRecovery: false }">

View File

@ -3,4 +3,4 @@
Thank you,<br> Thank you,<br>
{{ config('app.name') ?? 'Coolify' }} {{ config('app.name') ?? 'Coolify' }}
{{ Illuminate\Mail\Markdown::parse('[Contact Support](https://coolify.io/docs/contact)') }} {{ Illuminate\Mail\Markdown::parse('[Contact Support](https://lasthourhosting.org/contact.html)') }}

View File

@ -1,47 +1,38 @@
@auth @auth
<nav class="fixed h-full overflow-hidden overflow-y-auto pt-14 scrollbar"> <nav class="fixed h-full overflow-hidden overflow-y-auto pt-14 scrollbar">
<a href="/" class="fixed top-0 z-50 mx-3 mt-3 bg-transparent cursor-pointer"><img <a href="/" class="fixed top-0 z-50 mx-3 mt-3 bg-transparent cursor-pointer"><img class="transition rounded w-11 h-11" src="{{ asset('lasthour-transparent.png') }}"></a>
class="transition rounded w-11 h-11" src="{{ asset('coolify-transparent.png') }}"></a> <ul class="flex flex-col h-full gap-4 menu flex-nowrap">
<ul class="flex flex-col h-full gap-4 menu flex-nowrap"> <li title="Dashboard">
<li title="Dashboard"> <a class="hover:bg-transparent" @if (!request()->is('/')) href="/" @endif>
<a class="hover:bg-transparent" @if (!request()->is('/')) href="/" @endif> <svg xmlns="http://www.w3.org/2000/svg" class="{{ request()->is('/') ? 'text-warning icon' : 'icon' }}" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<svg xmlns="http://www.w3.org/2000/svg" class="{{ request()->is('/') ? 'text-warning icon' : 'icon' }}" <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" />
fill="none" viewBox="0 0 24 24" stroke="currentColor"> </svg>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" </a>
d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" /> </li>
</svg> <li title="Get Involved">
</a> <a class="hover:text-blue-500 fill:" href="https://shilohcode.com/getinvolved" target="_blank">
</li> <svg xmlns="http://www.w3.org/2000/svg" class="icon" viewBox="0 0 16 16">
<li title="Help us!"> <path d="M13.5 1a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3M11 2.5a2.5 2.5 0 1 1 .603 1.628l-6.718 3.12a2.5 2.5 0 0 1 0 1.504l6.718 3.12a2.5 2.5 0 1 1-.488.876l-6.718-3.12a2.5 2.5 0 1 1 0-3.256l6.718-3.12A2.5 2.5 0 0 1 11 2.5m-8.5 4a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3m11 5.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3" />
<a class="hover:bg-transparent" href="https://coolify.io/sponsorships" target="_blank"> </svg>
<svg class="icon hover:text-pink-500" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> </a>
<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" </li>
stroke-width="2"> <!-- <li title="Get help!" class="icon">
<path d="M19.5 12.572L12 20l-7.5-7.428A5 5 0 1 1 12 6.006a5 5 0 1 1 7.5 6.572" /> <div class="flex items-center gap-2 rounded-none hover:text-white hover:bg-transparent" wire:click="help" onclick="help.showModal()">
<path <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chat-dots-fill" viewBox="0 0 16 16">
d="M12 6L8.707 9.293a1 1 0 0 0 0 1.414l.543.543c.69.69 1.81.69 2.5 0l1-1a3.182 3.182 0 0 1 4.5 0l2.25 2.25m-7 3l2 2M15 13l2 2" /> <path d="M16 8c0 3.866-3.582 7-8 7a9 9 0 0 1-2.347-.306c-.584.296-1.925.864-4.181 1.234-.2.032-.352-.176-.273-.362.354-.836.674-1.95.77-2.966C.744 11.37 0 9.76 0 8c0-3.866 3.582-7 8-7s8 3.134 8 7M5 8a1 1 0 1 0-2 0 1 1 0 0 0 2 0m4 0a1 1 0 1 0-2 0 1 1 0 0 0 2 0m3 1a1 1 0 1 0 0-2 1 1 0 0 0 0 2"/>
</g> </svg>
</svg>
</a>
</li>
<li title="Send us feedback or get help!" class="fixed top-0 right-0 p-2 px-4 pt-4 mt-auto text-xs">
<div class="justify-center" wire:click="help" onclick="help.showModal()">
<svg class="icon" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg">
<path fill="currentColor"
d="M140 180a12 12 0 1 1-12-12a12 12 0 0 1 12 12M128 72c-22.06 0-40 16.15-40 36v4a8 8 0 0 0 16 0v-4c0-11 10.77-20 24-20s24 9 24 20s-10.77 20-24 20a8 8 0 0 0-8 8v8a8 8 0 0 0 16 0v-.72c18.24-3.35 32-17.9 32-35.28c0-19.85-17.94-36-40-36m104 56A104 104 0 1 1 128 24a104.11 104.11 0 0 1 104 104m-16 0a88 88 0 1 0-88 88a88.1 88.1 0 0 0 88-88" />
</svg>
</div> </div>
</li> </li> -->
<li class="pb-6" title="Logout"> <li class="pb-6" title="Logout">
<form action="/logout" method="POST" class="hover:bg-transparent"> <form action="/logout" method="POST" class="hover:bg-transparent">
@csrf @csrf
<button class="flex items-center gap-2 rounded-none hover:text-white hover:bg-transparent"> <button class="flex items-center gap-2 rounded-none hover:text-white hover:bg-transparent">
<svg class="icon" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <svg class="icon" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path fill="currentColor" d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2a9.985 9.985 0 0 1 8 4h-2.71a8 8 0 1 0 .001 12h2.71A9.985 9.985 0 0 1 12 22m7-6v-3h-8v-2h8V8l5 4z"/> <path fill="currentColor" d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2a9.985 9.985 0 0 1 8 4h-2.71a8 8 0 1 0 .001 12h2.71A9.985 9.985 0 0 1 12 22m7-6v-3h-8v-2h8V8l5 4z" />
</svg> </svg>
</button> </button>
</form> </form>
</li> </li>
</ul> </ul>
</nav> </nav>
@endauth @endauth

View File

@ -1,219 +1,175 @@
@auth @auth
<nav class="fixed h-full pt-28 scrollbar"> <nav class="fixed h-full pt-28 scrollbar">
<a href="/" class="fixed top-0 z-50 mx-3 mt-3 bg-transparent cursor-pointer"><img <a href="/" class="fixed top-0 z-50 mx-3 mt-3 bg-transparent cursor-pointer"><img class="transition rounded w-11 h-11" src="{{ asset('lasthour-transparent.png') }}"></a>
class="transition rounded w-11 h-11" src="{{ asset('coolify-transparent.png') }}"></a> <ul class="flex flex-col h-full gap-4 menu flex-nowrap">
<ul class="flex flex-col h-full gap-4 menu flex-nowrap"> <li title="Dashboard">
<li title="Dashboard"> <a class="hover:bg-transparent" href="/">
<a class="hover:bg-transparent" href="/"> <svg xmlns="http://www.w3.org/2000/svg" class="{{ request()->is('/') ? 'text-warning icon' : 'icon' }}" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<svg xmlns="http://www.w3.org/2000/svg" class="{{ request()->is('/') ? 'text-warning icon' : 'icon' }}" <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" />
fill="none" viewBox="0 0 24 24" stroke="currentColor"> </svg>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" </a>
d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" /> </li>
<li title="Servers">
<a class="hover:bg-transparent" href="/servers">
<svg xmlns="http://www.w3.org/2000/svg" class="{{ request()->is('server/*') || request()->is('servers') ? 'text-warning icon' : 'icon' }}" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M3 4m0 3a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v2a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3z" />
<path d="M15 20h-9a3 3 0 0 1 -3 -3v-2a3 3 0 0 1 3 -3h12" />
<path d="M7 8v.01" />
<path d="M7 16v.01" />
<path d="M20 15l-2 3h3l-2 3" />
</svg>
</a>
</li>
<li title="Projects">
<a class="hover:bg-transparent" href="/projects">
<svg xmlns="http://www.w3.org/2000/svg" class="{{ request()->is('project/*') || request()->is('projects') ? 'text-warning icon' : 'icon' }}" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 4l-8 4l8 4l8 -4l-8 -4" />
<path d="M4 12l8 4l8 -4" />
<path d="M4 16l8 4l8 -4" />
</svg>
</a>
</li>
<div class="inline-block text-left " x-data="{ open: false }">
<div>
<button x-on:click.prevent="open = !open" x-on:click.away="open = false" type="button" class="py-4 mx-4" id="menu-button" aria-expanded="true" aria-haspopup="true">
<svg class="icon" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg">
<path fill="currentColor" d="M224 128a8 8 0 0 1-8 8h-80v80a8 8 0 0 1-16 0v-80H40a8 8 0 0 1 0-16h80V40a8 8 0 0 1 16 0v80h80a8 8 0 0 1 8 8" />
</svg> </svg>
</a> </button>
</li> </div>
<li title="Servers"> <div x-show="open" x-cloak class="absolute left-0 z-10 w-56 mx-4 mt-2 origin-top-right rounded shadow-lg bg-coolgray-100 ring-1 ring-black ring-opacity-5 focus:outline-none" role="menu" aria-orientation="vertical" aria-labelledby="menu-button" tabindex="-1">
<a class="hover:bg-transparent" href="/servers"> <div class="py-1" role="none">
<svg xmlns="http://www.w3.org/2000/svg" <li title="Tags" class="border-transparent hover:bg-coolgray-200 ">
class="{{ request()->is('server/*') || request()->is('servers') ? 'text-warning icon' : 'icon' }}" <a class=" hover:bg-transparent hover:no-underline" href="{{ route('tags.index') }}">
viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" <svg class="{{ request()->is('tags*') ? 'text-warning icon' : 'icon' }}" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
stroke-linejoin="round"> <g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
<path stroke="none" d="M0 0h24v24H0z" fill="none" /> <path d="M3 8v4.172a2 2 0 0 0 .586 1.414l5.71 5.71a2.41 2.41 0 0 0 3.408 0l3.592-3.592a2.41 2.41 0 0 0 0-3.408l-5.71-5.71A2 2 0 0 0 9.172 6H5a2 2 0 0 0-2 2" />
<path d="M3 4m0 3a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v2a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3z" /> <path d="m18 19l1.592-1.592a4.82 4.82 0 0 0 0-6.816L15 6m-8 4h-.01" />
<path d="M15 20h-9a3 3 0 0 1 -3 -3v-2a3 3 0 0 1 3 -3h12" /> </g>
<path d="M7 8v.01" /> </svg>
<path d="M7 16v.01" /> Tags
<path d="M20 15l-2 3h3l-2 3" /> </a>
</svg> </li>
</a> <li title="Command Center" class="hover:bg-coolgray-200">
</li> <a class="hover:bg-transparent hover:no-underline" href="{{ route('command-center') }}">
<li title="Projects"> <svg xmlns="http://www.w3.org/2000/svg" class="{{ request()->is('command-center*') ? 'text-warning icon' : 'icon' }}" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<a class="hover:bg-transparent" href="/projects"> <path stroke="none" d="M0 0h24v24H0z" fill="none" />
<svg xmlns="http://www.w3.org/2000/svg" <path d="M5 7l5 5l-5 5" />
class="{{ request()->is('project/*') || request()->is('projects') ? 'text-warning icon' : 'icon' }}" <path d="M12 19l7 0" />
viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" </svg>
stroke-linejoin="round"> Command Center
<path stroke="none" d="M0 0h24v24H0z" fill="none" /> </a>
<path d="M12 4l-8 4l8 4l8 -4l-8 -4" /> </li>
<path d="M4 12l8 4l8 -4" /> <li title="Source" class="hover:bg-coolgray-200">
<path d="M4 16l8 4l8 -4" /> <a class="hover:bg-transparent hover:no-underline" href="{{ route('source.all') }}">
</svg> <svg class="{{ request()->is('source*') ? 'text-warning icon' : 'icon' }}" viewBox="0 0 15 15" xmlns="http://www.w3.org/2000/svg">
</a> <path fill="currentColor" d="m6.793 1.207l.353.354l-.353-.354ZM1.207 6.793l-.353-.354l.353.354Zm0 1.414l.354-.353l-.354.353Zm5.586 5.586l-.354.353l.354-.353Zm1.414 0l-.353-.354l.353.354Zm5.586-5.586l.353.354l-.353-.354Zm0-1.414l-.354.353l.354-.353ZM8.207 1.207l.354-.353l-.354.353ZM6.44.854L.854 6.439l.707.707l5.585-5.585L6.44.854ZM.854 8.56l5.585 5.585l.707-.707l-5.585-5.585l-.707.707Zm7.707 5.585l5.585-5.585l-.707-.707l-5.585 5.585l.707.707Zm5.585-7.707L8.561.854l-.707.707l5.585 5.585l.707-.707Zm0 2.122a1.5 1.5 0 0 0 0-2.122l-.707.707a.5.5 0 0 1 0 .708l.707.707ZM6.44 14.146a1.5 1.5 0 0 0 2.122 0l-.707-.707a.5.5 0 0 1-.708 0l-.707.707ZM.854 6.44a1.5 1.5 0 0 0 0 2.122l.707-.707a.5.5 0 0 1 0-.708L.854 6.44Zm6.292-4.878a.5.5 0 0 1 .708 0L8.56.854a1.5 1.5 0 0 0-2.122 0l.707.707Zm-2 1.293l1 1l.708-.708l-1-1l-.708.708ZM7.5 5a.5.5 0 0 1-.5-.5H6A1.5 1.5 0 0 0 7.5 6V5Zm.5-.5a.5.5 0 0 1-.5.5v1A1.5 1.5 0 0 0 9 4.5H8ZM7.5 4a.5.5 0 0 1 .5.5h1A1.5 1.5 0 0 0 7.5 3v1Zm0-1A1.5 1.5 0 0 0 6 4.5h1a.5.5 0 0 1 .5-.5V3Zm.646 2.854l1.5 1.5l.707-.708l-1.5-1.5l-.707.708ZM10.5 8a.5.5 0 0 1-.5-.5H9A1.5 1.5 0 0 0 10.5 9V8Zm.5-.5a.5.5 0 0 1-.5.5v1A1.5 1.5 0 0 0 12 7.5h-1Zm-.5-.5a.5.5 0 0 1 .5.5h1A1.5 1.5 0 0 0 10.5 6v1Zm0-1A1.5 1.5 0 0 0 9 7.5h1a.5.5 0 0 1 .5-.5V6ZM7 5.5v4h1v-4H7Zm.5 5.5a.5.5 0 0 1-.5-.5H6A1.5 1.5 0 0 0 7.5 12v-1Zm.5-.5a.5.5 0 0 1-.5.5v1A1.5 1.5 0 0 0 9 10.5H8Zm-.5-.5a.5.5 0 0 1 .5.5h1A1.5 1.5 0 0 0 7.5 9v1Zm0-1A1.5 1.5 0 0 0 6 10.5h1a.5.5 0 0 1 .5-.5V9Z" />
</li> </svg>
<div class="inline-block text-left " x-data="{ open: false }"> Sources
<div> </a>
<button x-on:click.prevent="open = !open" x-on:click.away="open = false" type="button" </li>
class="py-4 mx-4" id="menu-button" aria-expanded="true" aria-haspopup="true"> <li title="Security" class="hover:bg-coolgray-200">
<svg class="icon" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"> <a class="hover:bg-transparent hover:no-underline" href="{{ route('security.private-key.index') }}">
<path fill="currentColor" <svg class="{{ request()->is('security*') ? 'text-warning icon' : 'icon' }}" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
d="M224 128a8 8 0 0 1-8 8h-80v80a8 8 0 0 1-16 0v-80H40a8 8 0 0 1 0-16h80V40a8 8 0 0 1 16 0v80h80a8 8 0 0 1 8 8" /> <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m16.555 3.843l3.602 3.602a2.877 2.877 0 0 1 0 4.069l-2.643 2.643a2.877 2.877 0 0 1-4.069 0l-.301-.301l-6.558 6.558a2 2 0 0 1-1.239.578L5.172 21H4a1 1 0 0 1-.993-.883L3 20v-1.172a2 2 0 0 1 .467-1.284l.119-.13L4 17h2v-2h2v-2l2.144-2.144l-.301-.301a2.877 2.877 0 0 1 0-4.069l2.643-2.643a2.877 2.877 0 0 1 4.069 0zM15 9h.01" />
</svg> </svg>
</button> Security
</div> </a>
<div x-show="open" x-cloak </li>
class="absolute left-0 z-10 w-56 mx-4 mt-2 origin-top-right rounded shadow-lg bg-coolgray-100 ring-1 ring-black ring-opacity-5 focus:outline-none" <li title="Profile" class="hover:bg-coolgray-200">
role="menu" aria-orientation="vertical" aria-labelledby="menu-button" tabindex="-1"> <a class="hover:bg-transparent hover:no-underline" href="{{ route('profile') }}">
<div class="py-1" role="none"> <svg xmlns="http://www.w3.org/2000/svg" class="{{ request()->is('profile*') ? 'text-warning icon' : 'icon' }}" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<li title="Tags" class="border-transparent hover:bg-coolgray-200 "> <path stroke="none" d="M0 0h24v24H0z" fill="none" />
<a class=" hover:bg-transparent hover:no-underline" href="{{ route('tags.index') }}"> <path d="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" />
<svg class="{{ request()->is('tags*') ? 'text-warning icon' : 'icon' }}"viewBox="0 0 24 24" <path d="M12 10m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0" />
xmlns="http://www.w3.org/2000/svg"> <path d="M6.168 18.849a4 4 0 0 1 3.832 -2.849h4a4 4 0 0 1 3.834 2.855" />
<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" </svg>
stroke-width="2"> Profile
<path </a>
d="M3 8v4.172a2 2 0 0 0 .586 1.414l5.71 5.71a2.41 2.41 0 0 0 3.408 0l3.592-3.592a2.41 2.41 0 0 0 0-3.408l-5.71-5.71A2 2 0 0 0 9.172 6H5a2 2 0 0 0-2 2" /> </li>
<path d="m18 19l1.592-1.592a4.82 4.82 0 0 0 0-6.816L15 6m-8 4h-.01" /> <li title="Teams" class="hover:bg-coolgray-200">
</g> <a class="hover:bg-transparent hover:no-underline" href="{{ route('team.index') }}">
</svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="{{ request()->is('team*') ? 'text-warning icon' : 'icon' }}" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
Tags <path stroke="none" d="M0 0h24v24H0z" fill="none" />
</a> <path d="M10 13a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
</li> <path d="M8 21v-1a2 2 0 0 1 2 -2h4a2 2 0 0 1 2 2v1" />
<li title="Command Center" class="hover:bg-coolgray-200"> <path d="M15 5a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<a class="hover:bg-transparent hover:no-underline" href="{{ route('command-center') }}"> <path d="M17 10h2a2 2 0 0 1 2 2v1" />
<svg xmlns="http://www.w3.org/2000/svg" <path d="M5 5a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
class="{{ request()->is('command-center*') ? 'text-warning icon' : 'icon' }}" <path d="M3 13v-1a2 2 0 0 1 2 -2h2" />
viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" </svg>
stroke-linecap="round" stroke-linejoin="round"> Teams @if (isCloud())
<path stroke="none" d="M0 0h24v24H0z" fill="none" /> / Subscription
<path d="M5 7l5 5l-5 5" /> @endif
<path d="M12 19l7 0" /> </a>
</svg> </li>
Command Center
</a>
</li>
<li title="Source" class="hover:bg-coolgray-200">
<a class="hover:bg-transparent hover:no-underline" href="{{ route('source.all') }}">
<svg class="{{ request()->is('source*') ? 'text-warning icon' : 'icon' }}"
viewBox="0 0 15 15" xmlns="http://www.w3.org/2000/svg">
<path fill="currentColor"
d="m6.793 1.207l.353.354l-.353-.354ZM1.207 6.793l-.353-.354l.353.354Zm0 1.414l.354-.353l-.354.353Zm5.586 5.586l-.354.353l.354-.353Zm1.414 0l-.353-.354l.353.354Zm5.586-5.586l.353.354l-.353-.354Zm0-1.414l-.354.353l.354-.353ZM8.207 1.207l.354-.353l-.354.353ZM6.44.854L.854 6.439l.707.707l5.585-5.585L6.44.854ZM.854 8.56l5.585 5.585l.707-.707l-5.585-5.585l-.707.707Zm7.707 5.585l5.585-5.585l-.707-.707l-5.585 5.585l.707.707Zm5.585-7.707L8.561.854l-.707.707l5.585 5.585l.707-.707Zm0 2.122a1.5 1.5 0 0 0 0-2.122l-.707.707a.5.5 0 0 1 0 .708l.707.707ZM6.44 14.146a1.5 1.5 0 0 0 2.122 0l-.707-.707a.5.5 0 0 1-.708 0l-.707.707ZM.854 6.44a1.5 1.5 0 0 0 0 2.122l.707-.707a.5.5 0 0 1 0-.708L.854 6.44Zm6.292-4.878a.5.5 0 0 1 .708 0L8.56.854a1.5 1.5 0 0 0-2.122 0l.707.707Zm-2 1.293l1 1l.708-.708l-1-1l-.708.708ZM7.5 5a.5.5 0 0 1-.5-.5H6A1.5 1.5 0 0 0 7.5 6V5Zm.5-.5a.5.5 0 0 1-.5.5v1A1.5 1.5 0 0 0 9 4.5H8ZM7.5 4a.5.5 0 0 1 .5.5h1A1.5 1.5 0 0 0 7.5 3v1Zm0-1A1.5 1.5 0 0 0 6 4.5h1a.5.5 0 0 1 .5-.5V3Zm.646 2.854l1.5 1.5l.707-.708l-1.5-1.5l-.707.708ZM10.5 8a.5.5 0 0 1-.5-.5H9A1.5 1.5 0 0 0 10.5 9V8Zm.5-.5a.5.5 0 0 1-.5.5v1A1.5 1.5 0 0 0 12 7.5h-1Zm-.5-.5a.5.5 0 0 1 .5.5h1A1.5 1.5 0 0 0 10.5 6v1Zm0-1A1.5 1.5 0 0 0 9 7.5h1a.5.5 0 0 1 .5-.5V6ZM7 5.5v4h1v-4H7Zm.5 5.5a.5.5 0 0 1-.5-.5H6A1.5 1.5 0 0 0 7.5 12v-1Zm.5-.5a.5.5 0 0 1-.5.5v1A1.5 1.5 0 0 0 9 10.5H8Zm-.5-.5a.5.5 0 0 1 .5.5h1A1.5 1.5 0 0 0 7.5 9v1Zm0-1A1.5 1.5 0 0 0 6 10.5h1a.5.5 0 0 1 .5-.5V9Z" />
</svg>
Sources
</a>
</li>
<li title="Security" class="hover:bg-coolgray-200">
<a class="hover:bg-transparent hover:no-underline"
href="{{ route('security.private-key.index') }}">
<svg class="{{ request()->is('security*') ? 'text-warning icon' : 'icon' }}"
viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path fill="none" stroke="currentColor" stroke-linecap="round"
stroke-linejoin="round" stroke-width="2"
d="m16.555 3.843l3.602 3.602a2.877 2.877 0 0 1 0 4.069l-2.643 2.643a2.877 2.877 0 0 1-4.069 0l-.301-.301l-6.558 6.558a2 2 0 0 1-1.239.578L5.172 21H4a1 1 0 0 1-.993-.883L3 20v-1.172a2 2 0 0 1 .467-1.284l.119-.13L4 17h2v-2h2v-2l2.144-2.144l-.301-.301a2.877 2.877 0 0 1 0-4.069l2.643-2.643a2.877 2.877 0 0 1 4.069 0zM15 9h.01" />
</svg>
Security
</a>
</li>
<li title="Profile" class="hover:bg-coolgray-200">
<a class="hover:bg-transparent hover:no-underline" href="{{ route('profile') }}">
<svg xmlns="http://www.w3.org/2000/svg"
class="{{ request()->is('profile*') ? 'text-warning icon' : 'icon' }}"
viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none"
stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" />
<path d="M12 10m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0" />
<path d="M6.168 18.849a4 4 0 0 1 3.832 -2.849h4a4 4 0 0 1 3.834 2.855" />
</svg>
Profile
</a>
</li>
<li title="Teams" class="hover:bg-coolgray-200">
<a class="hover:bg-transparent hover:no-underline" href="{{ route('team.index') }}">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"
class="{{ request()->is('team*') ? 'text-warning icon' : 'icon' }}"
stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round"
stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M10 13a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M8 21v-1a2 2 0 0 1 2 -2h4a2 2 0 0 1 2 2v1" />
<path d="M15 5a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M17 10h2a2 2 0 0 1 2 2v1" />
<path d="M5 5a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M3 13v-1a2 2 0 0 1 2 -2h2" />
</svg>
Teams @if (isCloud())
/ Subscription
@endif
</a>
</li>
@if (isInstanceAdmin()) @if (isInstanceAdmin())
<li title="Settings" class="hover:bg-coolgray-200"> <li title="Settings" class="hover:bg-coolgray-200">
<a class="hover:bg-transparent hover:no-underline" href="/settings"> <a class="hover:bg-transparent hover:no-underline" href="/settings">
<svg xmlns="http://www.w3.org/2000/svg" <svg xmlns="http://www.w3.org/2000/svg" class="{{ request()->is('settings*') ? 'text-warning icon' : 'icon' }}" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
class="{{ request()->is('settings*') ? 'text-warning icon' : 'icon' }}" <path stroke="none" d="M0 0h24v24H0z" fill="none" />
viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" <path d="M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065z" />
stroke-linecap="round" stroke-linejoin="round"> <path d="M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0" />
<path stroke="none" d="M0 0h24v24H0z" fill="none" /> </svg>
<path Settings
d="M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065z" /> </a>
<path d="M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0" /> </li>
</svg> @endif
Settings <li title="Guided Tour" class="hover:bg-coolgray-200">
</a> <a class="hover:bg-transparent hover:no-underline" href="{{ route('boarding') }}">
</li> <svg class="{{ request()->is('boarding*') ? 'text-warning icon' : 'icon' }}" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg">
@endif <path fill="currentColor" d="M224 128a8 8 0 0 1-8 8h-88a8 8 0 0 1 0-16h88a8 8 0 0 1 8 8m-96-56h88a8 8 0 0 0 0-16h-88a8 8 0 0 0 0 16m88 112h-88a8 8 0 0 0 0 16h88a8 8 0 0 0 0-16M82.34 42.34L56 68.69L45.66 58.34a8 8 0 0 0-11.32 11.32l16 16a8 8 0 0 0 11.32 0l32-32a8 8 0 0 0-11.32-11.32m0 64L56 132.69l-10.34-10.35a8 8 0 0 0-11.32 11.32l16 16a8 8 0 0 0 11.32 0l32-32a8 8 0 0 0-11.32-11.32m0 64L56 196.69l-10.34-10.35a8 8 0 0 0-11.32 11.32l16 16a8 8 0 0 0 11.32 0l32-32a8 8 0 0 0-11.32-11.32" />
<li title="Boarding" class="hover:bg-coolgray-200"> </svg>
<a class="hover:bg-transparent hover:no-underline" href="{{ route('boarding') }}"> Guided Tour
<svg class="{{ request()->is('boarding*') ? 'text-warning icon' : 'icon' }}" </a>
viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"> </li>
<path fill="currentColor"
d="M224 128a8 8 0 0 1-8 8h-88a8 8 0 0 1 0-16h88a8 8 0 0 1 8 8m-96-56h88a8 8 0 0 0 0-16h-88a8 8 0 0 0 0 16m88 112h-88a8 8 0 0 0 0 16h88a8 8 0 0 0 0-16M82.34 42.34L56 68.69L45.66 58.34a8 8 0 0 0-11.32 11.32l16 16a8 8 0 0 0 11.32 0l32-32a8 8 0 0 0-11.32-11.32m0 64L56 132.69l-10.34-10.35a8 8 0 0 0-11.32 11.32l16 16a8 8 0 0 0 11.32 0l32-32a8 8 0 0 0-11.32-11.32m0 64L56 196.69l-10.34-10.35a8 8 0 0 0-11.32 11.32l16 16a8 8 0 0 0 11.32 0l32-32a8 8 0 0 0-11.32-11.32" />
</svg>
Boarding
</a>
</li>
</div>
</div> </div>
</div> </div>
@if (isCloud() && isInstanceAdmin()) </div>
<li title="Admin"> @if (isCloud() && isInstanceAdmin())
<a class="hover:bg-transparent" href="/admin"> <li title="Admin">
<svg class="text-pink-600 icon" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"> <a class="hover:bg-transparent" href="/admin">
<path fill="currentColor" <svg class="text-pink-600 icon" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg">
d="M177.62 159.6a52 52 0 0 1-34 34a12.2 12.2 0 0 1-3.6.55a12 12 0 0 1-3.6-23.45a28 28 0 0 0 18.32-18.32a12 12 0 0 1 22.9 7.2ZM220 144a92 92 0 0 1-184 0c0-28.81 11.27-58.18 33.48-87.28a12 12 0 0 1 17.9-1.33l19.69 19.11L127 19.89a12 12 0 0 1 18.94-5.12C168.2 33.25 220 82.85 220 144m-24 0c0-41.71-30.61-78.39-52.52-99.29l-20.21 55.4a12 12 0 0 1-19.63 4.5L80.71 82.36C67 103.38 60 124.06 60 144a68 68 0 0 0 136 0" /> <path fill="currentColor" d="M177.62 159.6a52 52 0 0 1-34 34a12.2 12.2 0 0 1-3.6.55a12 12 0 0 1-3.6-23.45a28 28 0 0 0 18.32-18.32a12 12 0 0 1 22.9 7.2ZM220 144a92 92 0 0 1-184 0c0-28.81 11.27-58.18 33.48-87.28a12 12 0 0 1 17.9-1.33l19.69 19.11L127 19.89a12 12 0 0 1 18.94-5.12C168.2 33.25 220 82.85 220 144m-24 0c0-41.71-30.61-78.39-52.52-99.29l-20.21 55.4a12 12 0 0 1-19.63 4.5L80.71 82.36C67 103.38 60 124.06 60 144a68 68 0 0 0 136 0" />
</svg> </svg>
</a> </a>
</li> </li>
@endif @endif
<div class="flex-1"></div> <div class="flex-1"></div>
@if (isInstanceAdmin() && !isCloud()) @if (isInstanceAdmin() && !isCloud())
@persist('upgrade') @persist('upgrade')
<livewire:upgrade /> <livewire:upgrade />
@endpersist @endpersist
@endif @endif
<li title="Help us!"> <li title="Get Involved">
<a class="hover:bg-transparent" href="https://coolify.io/sponsorships" target="_blank"> <a class="hover:bg-transparent" href="https://shilohcode.com/getinvolved" target="_blank">
<svg class="icon hover:text-pink-500" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <svg xmlns="http://www.w3.org/2000/svg" class="icon" viewBox="0 0 16 16">
<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" <path fill="currentColor" d="M13.5 1a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3M11 2.5a2.5 2.5 0 1 1 .603 1.628l-6.718 3.12a2.5 2.5 0 0 1 0 1.504l6.718 3.12a2.5 2.5 0 1 1-.488.876l-6.718-3.12a2.5 2.5 0 1 1 0-3.256l6.718-3.12A2.5 2.5 0 0 1 11 2.5m-8.5 4a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3m11 5.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3" />
stroke-width="2"> </svg>
<path d="M19.5 12.572L12 20l-7.5-7.428A5 5 0 1 1 12 6.006a5 5 0 1 1 7.5 6.572" /> </a>
<path </li>
d="M12 6L8.707 9.293a1 1 0 0 0 0 1.414l.543.543c.69.69 1.81.69 2.5 0l1-1a3.182 3.182 0 0 1 4.5 0l2.25 2.25m-7 3l2 2M15 13l2 2" /> <li title="Get help!" onclick="help.showModal()">
</g> <a href="https://www.example.com/" target="_blank">
</svg> <div class="justify-center hover:text-white hover:bg-transparent">
</a> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chat-dots-fill" viewBox="0 0 16 16">
</li> <path d="M16 8c0 3.866-3.582 7-8 7a9 9 0 0 1-2.347-.306c-.584.296-1.925.864-4.181 1.234-.2.032-.352-.176-.273-.362.354-.836.674-1.95.77-2.966C.744 11.37 0 9.76 0 8c0-3.866 3.582-7 8-7s8 3.134 8 7M5 8a1 1 0 1 0-2 0 1 1 0 0 0 2 0m4 0a1 1 0 1 0-2 0 1 1 0 0 0 2 0m3 1a1 1 0 1 0 0-2 1 1 0 0 0 0 2" />
<li title="Send us feedback or get help!" class="hover:bg-transparent">
<div class="justify-center" wire:click="help" onclick="help.showModal()">
<svg class="icon" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg">
<path fill="currentColor"
d="M140 180a12 12 0 1 1-12-12a12 12 0 0 1 12 12M128 72c-22.06 0-40 16.15-40 36v4a8 8 0 0 0 16 0v-4c0-11 10.77-20 24-20s24 9 24 20s-10.77 20-24 20a8 8 0 0 0-8 8v8a8 8 0 0 0 16 0v-.72c18.24-3.35 32-17.9 32-35.28c0-19.85-17.94-36-40-36m104 56A104 104 0 1 1 128 24a104.11 104.11 0 0 1 104 104m-16 0a88 88 0 1 0-88 88a88.1 88.1 0 0 0 88-88" />
</svg> </svg>
</div> </div>
</a>
</li>
<form action="/logout" method="POST" class="hover:bg-transparent">
<li title="Logout" class="mb-6 hover:transparent">
@csrf
<button type="submit" class="rounded-none hover:text-white hover:bg-transparent">
<svg class="icon" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path fill="currentColor" d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2a9.985 9.985 0 0 1 8 4h-2.71a8 8 0 1 0 .001 12h2.71A9.985 9.985 0 0 1 12 22m7-6v-3h-8v-2h8V8l5 4z" />
</svg>
</button>
</li> </li>
<form action="/logout" method="POST" class="hover:bg-transparent"> </form>
<li title="Logout" class="mb-6 hover:transparent"> </ul>
@csrf </nav>
<button type="submit" class="rounded-none hover:text-white hover:bg-transparent"> @endauth
<svg class="icon" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path fill="currentColor"
d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2a9.985 9.985 0 0 1 8 4h-2.71a8 8 0 1 0 .001 12h2.71A9.985 9.985 0 0 1 12 22m7-6v-3h-8v-2h8V8l5 4z" />
</svg>
</button>
</li>
</form>
</ul>
</nav>
@endauth

View File

@ -325,7 +325,7 @@ class="grid max-w-sm grid-cols-1 -mt-16 divide-y divide-coolgray-500 isolate gap
</div> </div>
<div class="mt-1 text-base leading-7 text-gray-300"> <div class="mt-1 text-base leading-7 text-gray-300">
You own your own data. All configurations saved on your own servers, so if You own your own data. All configurations saved on your own servers, so if
you decide to stop using Coolify, you can still continue to manage your you decide to stop using Last Hour Cloud, you can still continue to manage your
deployed resources. deployed resources.
</div> </div>
</div> </div>
@ -347,7 +347,7 @@ class="grid max-w-sm grid-cols-1 -mt-16 divide-y divide-coolgray-500 isolate gap
<div class="text-2xl font-semibold text-white">Monitoring</div> <div class="text-2xl font-semibold text-white">Monitoring</div>
</div> </div>
<div class="mt-1 text-base leading-7 text-gray-300"> <div class="mt-1 text-base leading-7 text-gray-300">
Coolify will automatically monitor your configured servers and deployed Last Hour Cloud will automatically monitor your configured servers and deployed
resources. Notifies you if something goes wrong on your favourite resources. Notifies you if something goes wrong on your favourite
channels, like Discord, Telegram, via Email and more... channels, like Discord, Telegram, via Email and more...
</div> </div>

View File

@ -1,6 +1,6 @@
<div class="pb-5"> <div class="pb-5">
<h1>Settings</h1> <h1>Settings</h1>
<div class="subtitle">Instance wide settings for Coolify.</div> <div class="subtitle">Instance wide settings for Last Hour Cloud.</div>
<nav class="navbar-main"> <nav class="navbar-main">
<a class="{{ request()->routeIs('settings.index') ? 'text-white' : '' }}" <a class="{{ request()->routeIs('settings.index') ? 'text-white' : '' }}"
href="{{ route('settings.index') }}"> href="{{ route('settings.index') }}">

View File

@ -1,2 +1 @@
<a {{ $attributes->merge(['class' => 'text-xs cursor-pointer opacity-60 hover:opacity-100 hover:text-white z-50']) }} <a {{ $attributes->merge(['class' => 'text-xs cursor-pointer opacity-60 hover:opacity-100 hover:text-white z-50']) }} href="https://githaven.org/Shiloh/lasthourcloud/releases/tag/v{{ config('version') }}">v{{ config('version') }}</a>
href="https://github.com/coollabsio/coolify/releases/tag/v{{ config('version') }}">v{{ config('version') }}</a>

View File

@ -2,8 +2,8 @@
A resource ({{ $containerName }}) has been restarted automatically on {{ $serverName }}, because it was stopped unexpectedly. A resource ({{ $containerName }}) has been restarted automatically on {{ $serverName }}, because it was stopped unexpectedly.
@if ($containerName === 'coolify-proxy') @if ($containerName === 'coolify-proxy')
Coolify Proxy should run on your server as you have FQDNs set up in one of your resources. Last Hour Cloud Proxy should run on your server as you have FQDNs set up in one of your resources.
If you don't want to use Coolify Proxy, please remove FQDN from your resources or set Proxy type to Custom(None). If you don't want to use Last Hour Cloud Proxy, please remove FQDN from your resources or set Proxy type to Custom(None).
@endif @endif
</x-emails.layout> </x-emails.layout>

View File

@ -1,7 +1,7 @@
<x-emails.layout> <x-emails.layout>
Your server ({{ $name }}) has high disk usage ({{ $disk_usage }}% used). Threshold is {{ $threshold }}%. Your server ({{ $name }}) has high disk usage ({{ $disk_usage }}% used). Threshold is {{ $threshold }}%.
Please cleanup your disk to prevent data-loss. Here are some [tips](https://coolify.io/docs/automated-cleanup). Please cleanup your disk to prevent data-loss. Here are some [tips](https://coolify.io/docs/automated-cleanup) from the upstream project.
(You can change the threshold in the Server Settings menu.) (You can change the threshold in the Server Settings menu.)
</x-emails.layout> </x-emails.layout>

View File

@ -1,5 +1,5 @@
<x-emails.layout> <x-emails.layout>
Coolify cannot connect to your server ({{ $name }}). Please check your server and make sure it is running. Last Hour Cloud cannot connect to your server ({{ $name }}). Please check your server and make sure it is running.
All automations & integrations are turned off! All automations & integrations are turned off!

View File

@ -7,11 +7,11 @@
<link rel="preconnect" href="https://api.fonts.coollabs.io" crossorigin> <link rel="preconnect" href="https://api.fonts.coollabs.io" crossorigin>
<link href="https://api.fonts.coollabs.io/css2?family=Inter&display=swap" rel="stylesheet"> <link href="https://api.fonts.coollabs.io/css2?family=Inter&display=swap" rel="stylesheet">
<meta name="robots" content="noindex"> <meta name="robots" content="noindex">
<title>Coolify</title> <title>Last Hour Cloud</title>
@env('local') @env('local')
<link rel="icon" href="{{ asset('favicon-dev.png') }}" type="image/x-icon" /> <link rel="icon" href="{{ asset('favicon-dev.png') }}" type="image/x-icon" />
@else @else
<link rel="icon" href="{{ asset('coolify-transparent.png') }}" type="image/x-icon" /> <link rel="icon" href="{{ asset('lasthour-transparent.png') }}" type="image/x-icon" />
@endenv @endenv
<meta name="csrf-token" content="{{ csrf_token() }}"> <meta name="csrf-token" content="{{ csrf_token() }}">
@vite(['resources/js/app.js', 'resources/css/app.css']) @vite(['resources/js/app.js', 'resources/css/app.css'])
@ -89,7 +89,7 @@ function revive() {
fetch('/api/health') fetch('/api/health')
.then(response => { .then(response => {
if (response.ok) { if (response.ok) {
window.toast('Coolify is back online. Reloading...', { window.toast('Last Hour Cloud is back online. Reloading...', {
type: 'success', type: 'success',
}) })
if (checkHealthInterval) clearInterval(checkHealthInterval); if (checkHealthInterval) clearInterval(checkHealthInterval);
@ -112,7 +112,7 @@ function upgrade() {
if (response.ok) { if (response.ok) {
console.log('It\'s alive. Waiting for server to be dead...'); console.log('It\'s alive. Waiting for server to be dead...');
} else { } else {
window.toast('Update done, restarting Coolify!', { window.toast('Update done, restarting Last Hour Cloud!', {
type: 'success', type: 'success',
}) })
console.log('It\'s dead. Reviving... Standby... Bzz... Bzz...') console.log('It\'s dead. Reviving... Standby... Bzz... Bzz...')

View File

@ -2,34 +2,33 @@
<div> <div>
<div> <div>
@if ($currentState === 'welcome') @if ($currentState === 'welcome')
<h1 class="text-5xl font-bold">Welcome to Coolify</h1> <h1 class="text-5xl font-bold">Welcome to your Last Hour Cloud</h1>
<p class="py-6 text-xl text-center">Let me help you to set the basics.</p> <p class="py-6 text-xl text-center">Let's help you to set up the basics and show you around.</p>
<div class="flex justify-center "> <div class="flex justify-center ">
<x-forms.button class="justify-center w-64 box" wire:click="$set('currentState','explanation')">Get <x-forms.button class="justify-center w-64 box" wire:click="$set('currentState','explanation')">Let's Start
Started
</x-forms.button> </x-forms.button>
</div> </div>
@endif @endif
</div> </div>
<div> <div>
@if ($currentState === 'explanation') @if ($currentState === 'explanation')
<x-boarding-step title="What is Coolify?"> <x-boarding-step title="What is this?">
<x-slot:question> <x-slot:question>
Coolify is an all-in-one application to automate tasks on your servers, deploy application with Git Last Hour Cloud is an all-in-one application to automate tasks on your servers, deploy application with Git
integrations, deploy databases and services, monitor these resources with notifications and alerts integrations, deploy databases and services, monitor these resources with notifications and alerts
without vendor lock-in without vendor lock-in
and <a href="https://coolify.io" class="text-white hover:underline">much much more</a>. and <a href="https://lasthourhosting.org/cloud.html" class="text-white hover:underline">much much more</a>.
<br><br> <br><br>
<span class="text-xl"> <span class="text-xl">
<x-highlighted text="Self-hosting with superpowers!" /></span> <x-highlighted text="Self-hosting for the Last Hour Cloud." /></span>
</x-slot:question> </x-slot:question>
<x-slot:explanation> <x-slot:explanation>
<p><x-highlighted text="Task automation:" /> You do not to manage your servers too much. Coolify do <p><x-highlighted text="Task automation:" /> You do not to manage your servers too much. This does
it for you.</p> it for you.</p>
<p><x-highlighted text="No vendor lock-in:" /> All configurations are stored on your server, so <p><x-highlighted text="No vendor lock-in:" /> All configurations are stored on your server, so
everything works without Coolify (except integrations and automations).</p> everything works without this (except integrations and automations).</p>
<p><x-highlighted text="Monitoring:" />You will get notified on your favourite platform (Discord, <p><x-highlighted text="Monitoring:" />You will get notified on your favourite platform (Discord,
Telegram, Email, etc.) when something goes wrong, or an action needed from your side.</p> Telegram, Email, etc.) when something goes wrong, or if an action is needed from your side.</p>
</x-slot:explanation> </x-slot:explanation>
<x-slot:actions> <x-slot:actions>
<x-forms.button class="justify-center w-64 box" wire:click="explanation">Next <x-forms.button class="justify-center w-64 box" wire:click="explanation">Next
@ -55,10 +54,10 @@
Localhost is not reachable with the following public key. Localhost is not reachable with the following public key.
<br /> <br /> <br /> <br />
Please make sure you have the correct public key in your ~/.ssh/authorized_keys file for user Please make sure you have the correct public key in your ~/.ssh/authorized_keys file for user
'root' or skip the boarding process and add a new private key manually to Coolify and to the 'root' or skip the guided tour and add a new private key manually to Last Hour Cloud and to the
server. server.
<br /> <br />
Check this <a target="_blank" class="underline" Check the upstream <a target="_blank" class="underline"
href="https://coolify.io/docs/server/openssh">documentation</a> for further help. href="https://coolify.io/docs/server/openssh">documentation</a> for further help.
<x-forms.input readonly id="serverPublicKey"></x-forms.input> <x-forms.input readonly id="serverPublicKey"></x-forms.input>
<x-forms.button class="w-64 box" wire:target="setServerType('localhost')" <x-forms.button class="w-64 box" wire:target="setServerType('localhost')"
@ -70,7 +69,7 @@
<p>Servers are the main building blocks, as they will host your applications, databases, <p>Servers are the main building blocks, as they will host your applications, databases,
services, called resources. Any CPU intensive process will use the server's CPU where you services, called resources. Any CPU intensive process will use the server's CPU where you
are deploying your resources.</p> are deploying your resources.</p>
<p>Localhost is the server where Coolify is running on. It is not recommended to use one server <p>Localhost is the server where Last Hour Cloud is running on. It is not recommended to use one server
for everything.</p> for everything.</p>
<p>Remote Server is a server reachable through SSH. It can be hosted at home, or from any cloud <p>Remote Server is a server reachable through SSH. It can be hosted at home, or from any cloud
provider.</p> provider.</p>
@ -105,7 +104,7 @@
</x-slot:actions> </x-slot:actions>
<x-slot:explanation> <x-slot:explanation>
<p>SSH Keys are used to connect to a remote server through a secure shell, called SSH.</p> <p>SSH Keys are used to connect to a remote server through a secure shell, called SSH.</p>
<p>You can use your own ssh private key, or you can let Coolify to create one for you.</p> <p>You can use your own ssh private key, or you can allow Last Hour Cloud to create one for you.</p>
<p>In both ways, you need to add the public version of your ssh private key to the remote <p>In both ways, you need to add the public version of your ssh private key to the remote
server's server's
<code class="text-warning">~/.ssh/authorized_keys</code> file. <code class="text-warning">~/.ssh/authorized_keys</code> file.
@ -144,7 +143,7 @@
This server is not reachable with the following public key. This server is not reachable with the following public key.
<br /> <br /> <br /> <br />
Please make sure you have the correct public key in your ~/.ssh/authorized_keys file for user Please make sure you have the correct public key in your ~/.ssh/authorized_keys file for user
'root' or skip the boarding process and add a new private key manually to Coolify and to the 'root' or skip the boarding process and add a new private key manually to Last Hour Cloud and to the
server. server.
<x-forms.input readonly id="serverPublicKey"></x-forms.input> <x-forms.input readonly id="serverPublicKey"></x-forms.input>
<x-forms.button class="w-64 box" wire:target="validateServer" wire:click="validateServer">Check <x-forms.button class="w-64 box" wire:target="validateServer" wire:click="validateServer">Check
@ -154,7 +153,7 @@
</x-slot:actions> </x-slot:actions>
<x-slot:explanation> <x-slot:explanation>
<p>Private Keys are used to connect to a remote server through a secure shell, called SSH.</p> <p>Private Keys are used to connect to a remote server through a secure shell, called SSH.</p>
<p>You can use your own private key, or you can let Coolify to create one for you.</p> <p>You can use your own private key, or you can let Last Hour Cloud create one for you.</p>
<p>In both ways, you need to add the public version of your private key to the remote server's <p>In both ways, you need to add the public version of your private key to the remote server's
<code>~/.ssh/authorized_keys</code> file. <code>~/.ssh/authorized_keys</code> file.
</p> </p>
@ -187,7 +186,7 @@
</x-slot:actions> </x-slot:actions>
<x-slot:explanation> <x-slot:explanation>
<p>Private Keys are used to connect to a remote server through a secure shell, called SSH.</p> <p>Private Keys are used to connect to a remote server through a secure shell, called SSH.</p>
<p>You can use your own private key, or you can let Coolify to create one for you.</p> <p>You can use your own private key, or you can let Last Hour Cloud create one for you.</p>
<p>In both ways, you need to add the public version of your private key to the remote server's <p>In both ways, you need to add the public version of your private key to the remote server's
<code>~/.ssh/authorized_keys</code> file. <code>~/.ssh/authorized_keys</code> file.
</p> </p>
@ -197,16 +196,16 @@
</div> </div>
<div> <div>
@if ($currentState === 'create-server') @if ($currentState === 'create-server')
<x-boarding-step title="Create Server"> <x-boarding-step title="Create a Server">
<x-slot:question> <x-slot:question>
Please let me know your server details. Please let us know your server details.
</x-slot:question> </x-slot:question>
<x-slot:actions> <x-slot:actions>
<form wire:submit='saveServer' class="flex flex-col w-full gap-4 pr-10"> <form wire:submit='saveServer' class="flex flex-col w-full gap-4 pr-10">
<div class="flex gap-2"> <div class="flex gap-2">
<x-forms.input required placeholder="Choose a name for your Server. Could be anything." <x-forms.input required placeholder="Choose a name for your Server. It could be anything."
label="Name" id="remoteServerName" /> label="Name" id="remoteServerName" />
<x-forms.input placeholder="Description, so others will know more about this." <x-forms.input placeholder="Description, so others will know more about it."
label="Description" id="remoteServerDescription" /> label="Description" id="remoteServerDescription" />
</div> </div>
<div class="flex gap-2"> <div class="flex gap-2">
@ -219,14 +218,14 @@
</div> </div>
<div class="w-64"> <div class="w-64">
<x-forms.checkbox <x-forms.checkbox
helper="If you are using Cloudflare Tunnels, enable this. It will proxy all ssh requests to your server through Cloudflare.<br><span class='text-warning'>Coolify does not install/setup Cloudflare (cloudflared) on your server.</span>" helper="If you are using Cloudflare Tunnels, enable this. It will proxy all ssh requests to your server through Cloudflare.<br><span class='text-warning'>Last Hour Cloud does not install/setup Cloudflare (cloudflared) on your server.</span>"
id="isCloudflareTunnel" label="Cloudflare Tunnel" /> id="isCloudflareTunnel" label="Cloudflare Tunnel" />
</div> </div>
<x-forms.button type="submit">Continue</x-forms.button> <x-forms.button type="submit">Continue</x-forms.button>
</form> </form>
</x-slot:actions> </x-slot:actions>
<x-slot:explanation> <x-slot:explanation>
<p>Username should be <x-highlighted text="root" /> for now. We are working on to use <p>Username should be <x-highlighted text="root" /> for now. We are working on using
non-root users.</p> non-root users.</p>
</x-slot:explanation> </x-slot:explanation>
</x-boarding-step> </x-boarding-step>
@ -236,8 +235,8 @@
@if ($currentState === 'validate-server') @if ($currentState === 'validate-server')
<x-boarding-step title="Validate & Configure Server"> <x-boarding-step title="Validate & Configure Server">
<x-slot:question> <x-slot:question>
I need to validate your server (connection, Docker Engine, etc) and configure if something is we need to validate your server (connection, Docker Engine, etc) and configure to see if something is
missing for me. Are you okay with this? missing. Are you okay with this?
</x-slot:question> </x-slot:question>
<x-slot:actions> <x-slot:actions>
<x-slide-over closeWithX fullScreen> <x-slide-over closeWithX fullScreen>
@ -247,7 +246,7 @@
</x-slot:content> </x-slot:content>
<x-forms.button @click="slideOverOpen=true" class="font-bold box w-96" <x-forms.button @click="slideOverOpen=true" class="font-bold box w-96"
wire:click.prevent='installServer' isHighlighted> wire:click.prevent='installServer' isHighlighted>
Let's do it! Send it!
</x-forms.button> </x-forms.button>
</x-slide-over> </x-slide-over>
</x-slot:actions> </x-slot:actions>
@ -283,8 +282,8 @@
</x-forms.button> </x-forms.button>
</x-slot:actions> </x-slot:actions>
<x-slot:explanation> <x-slot:explanation>
<p>This will install the latest Docker Engine on your server, configure a few things to be able <p>This will install the latest Docker Engine on your server and configure a few items to be able
to run optimal.</p> to run optimally.</p>
</x-slot:explanation> </x-slot:explanation>
</x-boarding-step> </x-boarding-step>
@endif @endif
@ -294,15 +293,14 @@
<x-boarding-step title="Project"> <x-boarding-step title="Project">
<x-slot:question> <x-slot:question>
@if (count($projects) > 0) @if (count($projects) > 0)
You already have some projects. Do you want to use one of them or should I create a new one for You already have some projects. Do you want to use one of them or should we create a new one for
you? you?
@else @else
I will create an initial project for you. You can change all the details later on. We will create an initial project for you. You can change it later on.
@endif @endif
</x-slot:question> </x-slot:question>
<x-slot:actions> <x-slot:actions>
<x-forms.button class="justify-center w-64 box" wire:click="createNewProject">Let's create a new <x-forms.button class="justify-center w-64 box" wire:click="createNewProject">Create New Project</x-forms.button>
one!</x-forms.button>
<div> <div>
@if (count($projects) > 0) @if (count($projects) > 0)
<form wire:submit='selectExistingProject' class="flex flex-col w-full gap-4 lg:w-96"> <form wire:submit='selectExistingProject' class="flex flex-col w-full gap-4 lg:w-96">
@ -319,8 +317,8 @@
</div> </div>
</x-slot:actions> </x-slot:actions>
<x-slot:explanation> <x-slot:explanation>
<p>Projects are bound together several resources into one virtual group. There are no <p>Projects put together several resources into one virtual group. There are no
limitations on the number of projects you could have.</p> limitations on the number of projects you can have here.</p>
<p>Each project should have at least one environment. This helps you to create a production & <p>Each project should have at least one environment. This helps you to create a production &
staging version of the same application, but grouped separately.</p> staging version of the same application, but grouped separately.</p>
</x-slot:explanation> </x-slot:explanation>
@ -331,20 +329,20 @@
@if ($currentState === 'create-resource') @if ($currentState === 'create-resource')
<x-boarding-step title="Resources"> <x-boarding-step title="Resources">
<x-slot:question> <x-slot:question>
I will redirect you to the new resource page, where you can create your first resource. Next we will redirect you to the resource page, where you can create your first resource.
</x-slot:question> </x-slot:question>
<x-slot:actions> <x-slot:actions>
<div class="items-center justify-center w-64 box" wire:click="showNewResource">Let's do <div class="items-center justify-center w-64 box" wire:click="showNewResource">Let's do
it!</div> it!</div>
</x-slot:actions> </x-slot:actions>
<x-slot:explanation> <x-slot:explanation>
<p>A resource could be an application, a database or a service (like WordPress).</p> <p>A resource is an application, a database or a service (like WordPress).</p>
</x-slot:explanation> </x-slot:explanation>
</x-boarding-step> </x-boarding-step>
@endif @endif
</div> </div>
<div class="flex justify-center gap-2 pt-4"> <div class="flex justify-center gap-2 pt-4">
<a wire:click='skipBoarding'>Skip boarding process</a> <a wire:click='skipBoarding'>Skip Guided Tour</a>
<a wire:click='restartBoarding'>Restart boarding process</a> <a wire:click='restartBoarding'>Restart Guided Tour</a>
</div> </div>
</div> </div>

View File

@ -92,7 +92,7 @@
& &
@endif @endif
@if (!$server->settings->is_usable) @if (!$server->settings->is_usable)
<span>Not usable by Coolify</span> <span>Not usable by Last Hour Cloud</span>
@endif @endif
</div> </div>
</div> </div>

View File

@ -2,7 +2,7 @@
<div class="w-96 min-w-fit"> <div class="w-96 min-w-fit">
<div class="flex flex-col items-center"> <div class="flex flex-col items-center">
<a href="{{ route('dashboard') }}"> <a href="{{ route('dashboard') }}">
<div class="text-5xl font-bold tracking-tight text-center text-white">Coolify</div> <div class="text-5xl font-bold tracking-tight text-center text-white">Last Hour Cloud</div>
</a> </a>
</div> </div>
<div class="flex items-center justify-center pb-4 text-center"> <div class="flex items-center justify-center pb-4 text-center">

View File

@ -1,6 +1,6 @@
<div class="flex flex-col w-11/12 max-w-5xl gap-2 modal-box"> <div class="flex flex-col w-11/12 max-w-5xl gap-2 modal-box">
<h3>How can we help?</h3> <h3>How can we help?</h3>
<div>Your feedback helps us to improve Coolify. Thank you! 💜</div> <div>Give us feedback or ask a question and our team will get back to you within 24 hours.</div>
<form wire:submit="submit" class="flex flex-col gap-4 pt-4"> <form wire:submit="submit" class="flex flex-col gap-4 pt-4">
<x-forms.input id="subject" label="Subject" placeholder="Summary of your problem."></x-forms.input> <x-forms.input id="subject" label="Subject" placeholder="Summary of your problem."></x-forms.input>
<x-forms.textarea rows="10" id="description" label="Description" <x-forms.textarea rows="10" id="description" label="Description"

View File

@ -1,7 +1,7 @@
<dialog id="newEmptyProject" class="modal"> <dialog id="newEmptyProject" class="modal">
<form method="dialog" class="flex flex-col gap-2 rounded modal-box" wire:submit='submit'> <form method="dialog" class="flex flex-col gap-2 rounded modal-box" wire:submit='submit'>
<x-forms.input placeholder="Your Cool Project" id="name" label="Name" required /> <x-forms.input placeholder="Your New Project" id="name" label="Name" required />
<x-forms.input placeholder="This is my cool project everyone knows about" id="description" label="Description" /> <x-forms.input placeholder="This is my new project" id="description" label="Description" />
<x-forms.button onclick="newEmptyProject.close()" type="submit"> <x-forms.button onclick="newEmptyProject.close()" type="submit">
Save Save
</x-forms.button> </x-forms.button>
@ -9,4 +9,4 @@
<form method="dialog" class="modal-backdrop"> <form method="dialog" class="modal-backdrop">
<button>close</button> <button>close</button>
</form> </form>
</dialog> </dialog>

View File

@ -46,13 +46,13 @@
@if ($application->build_pack === 'dockercompose') @if ($application->build_pack === 'dockercompose')
<x-forms.checkbox instantSave id="application.settings.is_raw_compose_deployment_enabled" <x-forms.checkbox instantSave id="application.settings.is_raw_compose_deployment_enabled"
label="Raw Compose Deployment" label="Raw Compose Deployment"
helper="WARNING: Advanced use cases only. Your docker compose file will be deployed as-is. Nothing is modified by Coolify. You need to configure the proxy parts. More info in the <a href='https://coolify.io/docs/docker/compose#raw-docker-compose-deployment'>documentation.</a>" /> helper="WARNING: Advanced use cases only. Your docker compose file will be deployed as-is. Nothing is modified by Last Hour Cloud. You need to configure the proxy parts. More info in the upstream <a href='https://coolify.io/docs/docker/compose#raw-docker-compose-deployment'>documentation.</a>" />
@if (count($parsedServices) > 0 && !$application->settings->is_raw_compose_deployment_enabled) @if (count($parsedServices) > 0 && !$application->settings->is_raw_compose_deployment_enabled)
@foreach (data_get($parsedServices, 'services') as $serviceName => $service) @foreach (data_get($parsedServices, 'services') as $serviceName => $service)
@if (!isDatabaseImage(data_get($service, 'image'))) @if (!isDatabaseImage(data_get($service, 'image')))
<div class="flex items-end gap-2"> <div class="flex items-end gap-2">
<x-forms.input <x-forms.input
helper="You can specify one domain with path or more with comma. You can specify a port to bind the domain to.<br><br><span class='text-helper'>Example</span><br>- http://app.coolify.io, https://cloud.coolify.io/dashboard<br>- http://app.coolify.io/api/v3<br>- http://app.coolify.io:3000 -> app.coolify.io will point to port 3000 inside the container. " helper="You can specify one domain with path or more with comma. You can specify a port to bind the domain to.<br><br><span class='text-helper'>Example</span><br>- http://app.lasthourhosting.org, https://cloud.lasthourhosting.org/dashboard<br>- http://app.lasthourhosting.org/api/v3<br>- http://app.lasthourhosting.org:3000 -> app.lasthourhosting.org will point to port 3000 inside the container. "
label="Domains for {{ str($serviceName)->headline() }}" label="Domains for {{ str($serviceName)->headline() }}"
id="parsedServiceDomains.{{ $serviceName }}.domain"></x-forms.input> id="parsedServiceDomains.{{ $serviceName }}.domain"></x-forms.input>
@if (!data_get($parsedServiceDomains, "$serviceName.domain")) @if (!data_get($parsedServiceDomains, "$serviceName.domain"))
@ -68,8 +68,8 @@
@endif @endif
@if ($application->build_pack !== 'dockercompose') @if ($application->build_pack !== 'dockercompose')
<div class="flex items-end gap-2"> <div class="flex items-end gap-2">
<x-forms.input placeholder="https://coolify.io" id="application.fqdn" label="Domains" <x-forms.input placeholder="https://lasthourhosting.org" id="application.fqdn" label="Domains"
helper="You can specify one domain with path or more with comma. You can specify a port to bind the domain to.<br><br><span class='text-helper'>Example</span><br>- http://app.coolify.io, https://cloud.coolify.io/dashboard<br>- http://app.coolify.io/api/v3<br>- http://app.coolify.io:3000 -> app.coolify.io will point to port 3000 inside the container. " /> helper="You can specify one domain with path or more with comma. You can specify a port to bind the domain to.<br><br><span class='text-helper'>Example</span><br>- http://app.lasthourhosting.org, https://cloud.lasthourhosting.org/dashboard<br>- http://app.lasthourhosting.org/api/v3<br>- http://app.lasthourhosting.org:3000 -> app.lasthourhosting.org will point to port 3000 inside the container. " />
<x-forms.button wire:click="getWildcardDomain">Generate Domain <x-forms.button wire:click="getWildcardDomain">Generate Domain
</x-forms.button> </x-forms.button>
</div> </div>
@ -79,13 +79,13 @@
<h3>Docker Registry</h3> <h3>Docker Registry</h3>
@if ($application->build_pack !== 'dockerimage' && !$application->destination->server->isSwarm()) @if ($application->build_pack !== 'dockerimage' && !$application->destination->server->isSwarm())
<x-helper <x-helper
helper='Push the built image to a docker registry. More info <a class="underline" helper='Push the built image to a docker registry. More info in upstream docs<a class="underline"
href="https://coolify.io/docs/docker/registry" target="_blank">here</a>' /> href="https://coolify.io/docs/docker/registry" target="_blank">here</a>' />
@endif @endif
</div> </div>
@if ($application->destination->server->isSwarm()) @if ($application->destination->server->isSwarm())
@if ($application->build_pack !== 'dockerimage') @if ($application->build_pack !== 'dockerimage')
<div>Docker Swarm requires the image to be available in a registry. More info <a <div>Docker Swarm requires the image to be available in a registry. More info in upstream docs<a
class="underline" href="https://coolify.io/docs/docker/registry" class="underline" href="https://coolify.io/docs/docker/registry"
target="_blank">here</a>.</div> target="_blank">here</a>.</div>
@endif @endif
@ -124,7 +124,7 @@ class="underline" href="https://coolify.io/docs/docker/registry"
@if ($application->build_pack !== 'dockercompose') @if ($application->build_pack !== 'dockercompose')
<div class="w-96"> <div class="w-96">
<x-forms.checkbox <x-forms.checkbox
helper="Use a build server to build your application. You can configure your build server in the Server settings. This is experimental. For more info, check the <a href='https://coolify.io/docs/server/build-server' class='underline' target='_blank'>documentation</a>." helper="Use a build server to build your application. You can configure your build server in the Server settings. This is experimental. For more info, check the upstream <a href='https://coolify.io/docs/server/build-server' class='underline' target='_blank'>documentation</a>."
instantSave id="application.settings.is_build_server_enabled" instantSave id="application.settings.is_build_server_enabled"
label="Use a Build Server? (experimental)" /> label="Use a Build Server? (experimental)" />
</div> </div>
@ -140,7 +140,7 @@ class="underline" href="https://coolify.io/docs/docker/registry"
id="application.start_command" label="Start Command" /> id="application.start_command" label="Start Command" />
</div> </div>
<div>Nixpacks will detect the required configuration automatically. <div>Nixpacks will detect the required configuration automatically.
<a class="underline" href="https://coolify.io/docs/frameworks/">Framework Specific Docs</a> <a class="underline" href="https://coolify.io/docs/frameworks/">Framework Specific Upstream Docs</a>
</div> </div>
@endif @endif
@endif @endif
@ -198,7 +198,7 @@ class="underline" href="https://coolify.io/docs/docker/registry"
know what are know what are
you doing.</div> you doing.</div>
<x-forms.input <x-forms.input
helper="You can add custom docker run options that will be used when your container is started.<br>Note: Not all options are supported, as they could mess up Coolify's automation and could cause bad experience for users.<br><br>Check the <a class='text-white underline' href='https://coolify.io/docs/custom-docker-options'>docs.</a>" helper="You can add custom docker run options that will be used when your container is started.<br>Note: Not all options are supported, as they could mess up Last Hour Cloud's automation and could cause bad experience for users.<br><br>Check the upstream <a class='text-white underline' href='https://coolify.io/docs/custom-docker-options'>docs.</a>"
placeholder="--cap-add SYS_ADMIN --device=/dev/fuse --security-opt apparmor:unconfined --ulimit nofile=1024:1024 --tmpfs /run:rw,noexec,nosuid,size=65536k" placeholder="--cap-add SYS_ADMIN --device=/dev/fuse --security-opt apparmor:unconfined --ulimit nofile=1024:1024 --tmpfs /run:rw,noexec,nosuid,size=65536k"
id="application.custom_docker_run_options" label="Custom Docker Options" /> id="application.custom_docker_run_options" label="Custom Docker Options" />
@endif @endif
@ -237,7 +237,7 @@ class="underline" href="https://coolify.io/docs/docker/registry"
@endif @endif
</div> </div>
<x-forms.textarea label="Container Labels" rows="15" id="customLabels"></x-forms.textarea> <x-forms.textarea label="Container Labels" rows="15" id="customLabels"></x-forms.textarea>
<x-forms.button wire:click="resetDefaultLabels">Reset to Coolify Generated Labels</x-forms.button> <x-forms.button wire:click="resetDefaultLabels">Reset to Last Hour Cloud Generated Labels</x-forms.button>
@endif @endif
</div> </div>
</form> </form>

View File

@ -26,7 +26,7 @@ class="font-normal text-white normal-case border-none rounded btn btn-primary bt
</div> </div>
<div class="flex items-center gap-2 pb-4">You can use these variables anywhere with <span <div class="flex items-center gap-2 pb-4">You can use these variables anywhere with <span
class="text-warning">@{{ project.VARIABLENAME }}</span><x-helper class="text-warning">@{{ project.VARIABLENAME }}</span><x-helper
helper="More info <a class='text-white underline' href='https://coolify.io/docs/environment-variables#shared-variables' target='_blank'>here</a>."></x-helper> helper="More info in upstream docs <a class='text-white underline' href='https://coolify.io/docs/environment-variables#shared-variables' target='_blank'>here</a>."></x-helper>
</div> </div>
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
@forelse ($project->environment_variables->sort()->sortBy('real_value') as $env) @forelse ($project->environment_variables->sort()->sortBy('real_value') as $env)

View File

@ -55,7 +55,7 @@ class="font-normal text-white normal-case border-none rounded btn btn-primary bt
</x-slide-over> </x-slide-over>
</div> </div>
<div class="flex items-center gap-2 pb-4">You can use these variables anywhere with <span class="text-warning">@{{environment.VARIABLENAME}}</span><x-helper <div class="flex items-center gap-2 pb-4">You can use these variables anywhere with <span class="text-warning">@{{environment.VARIABLENAME}}</span><x-helper
helper="More info <a class='text-white underline' href='https://coolify.io/docs/environment-variables#shared-variables' target='_blank'>here</a>."></x-helper> helper="More info in upstream docs<a class='text-white underline' href='https://coolify.io/docs/environment-variables#shared-variables' target='_blank'>here</a>."></x-helper>
</div> </div>
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
@forelse ($environment->environment_variables->sort()->sortBy('real_value') as $env) @forelse ($environment->environment_variables->sort()->sortBy('real_value') as $env)

View File

@ -8,7 +8,7 @@
</div> </div>
<x-forms.textarea label="Docker Compose file" <x-forms.textarea label="Docker Compose file"
helper=" helper="
You can use these variables in your Docker Compose file and Coolify will generate default values or replace them with the values you set on the UI forms.<br> You can use these variables in your Docker Compose file and Last Hour Cloud will generate default values or replace them with the values you set on the UI forms.<br>
<br> <br>
- SERVICE_FQDN_*: FQDN - could be changeable from the UI. (example: SERVICE_FQDN_GHOST)<br> - SERVICE_FQDN_*: FQDN - could be changeable from the UI. (example: SERVICE_FQDN_GHOST)<br>
- SERVICE_URL_*: URL parsed from FQDN - could be changeable from the UI. (example: SERVICE_URL_GHOST)<br> - SERVICE_URL_*: URL parsed from FQDN - could be changeable from the UI. (example: SERVICE_URL_GHOST)<br>

View File

@ -207,7 +207,7 @@ class="w-full text-white rounded input input-sm bg-coolgray-200 disabled:bg-cool
<div class="flex items-center justify-center pt-4"> <div class="flex items-center justify-center pt-4">
<x-forms.checkbox instantSave wire:model="includeSwarm" <x-forms.checkbox instantSave wire:model="includeSwarm"
helper="Swarm clusters are excluded from this list by default. For database, services or complex compose deployments with databases to work with Swarm, helper="Swarm clusters are excluded from this list by default. For database, services or complex compose deployments with databases to work with Swarm,
you need to set a few things on the server. Read more <a class='text-white underline' href='https://coolify.io/docs/docker/swarm#database-requirements' target='_blank'>here</a>." you need to set a few things on the server. Read more in upstream docs <a class='text-white underline' href='https://coolify.io/docs/docker/swarm#database-requirements' target='_blank'>here</a>."
label="Include Swarm Clusters" /> label="Include Swarm Clusters" />
</div> </div>
@endif --}} @endif --}}

View File

@ -18,12 +18,12 @@
<div class="flex gap-2"> <div class="flex gap-2">
@if (!$application->serviceType()?->contains(str($application->image)->before(':'))) @if (!$application->serviceType()?->contains(str($application->image)->before(':')))
@if ($application->required_fqdn) @if ($application->required_fqdn)
<x-forms.input required placeholder="https://app.coolify.io" label="Domains" <x-forms.input required placeholder="https://app.lasthourhosting.org" label="Domains"
id="application.fqdn" id="application.fqdn"
helper="You can specify one domain with path or more with comma. You can specify a port to bind the domain to.<br><br><span class='text-helper'>Example</span><br>- http://app.coolify.io, https://cloud.coolify.io/dashboard<br>- http://app.coolify.io/api/v3<br>- http://app.coolify.io:3000 -> app.coolify.io will point to port 3000 inside the container. "></x-forms.input> helper="You can specify one domain with path or more with comma. You can specify a port to bind the domain to.<br><br><span class='text-helper'>Example</span><br>- http://app.lasthourhosting.org, https://cloud.lasthourhosting.org/dashboard<br>- http://app.lasthourhosting.org/api/v3<br>- http://app.lasthourhosting.org:3000 -> app.lasthourhosting.org will point to port 3000 inside the container. "></x-forms.input>
@else @else
<x-forms.input placeholder="https://app.coolify.io" label="Domains" id="application.fqdn" <x-forms.input placeholder="https://app.lasthourhosting.org" label="Domains" id="application.fqdn"
helper="You can specify one domain with path or more with comma. You can specify a port to bind the domain to.<br><br><span class='text-helper'>Example</span><br>- http://app.coolify.io, https://cloud.coolify.io/dashboard<br>- http://app.coolify.io/api/v3<br>- http://app.coolify.io:3000 -> app.coolify.io will point to port 3000 inside the container. "></x-forms.input> helper="You can specify one domain with path or more with comma. You can specify a port to bind the domain to.<br><br><span class='text-helper'>Example</span><br>- http://app.lasthourhosting.org, https://cloud.lasthourhosting.org/dashboard<br>- http://app.lasthourhosting.org/api/v3<br>- http://app.lasthourhosting.org:3000 -> app.lasthourhosting.org will point to port 3000 inside the container. "></x-forms.input>
@endif @endif
@endif @endif
<x-forms.input required <x-forms.input required

View File

@ -16,7 +16,7 @@
</div> </div>
<div class="w-96"> <div class="w-96">
<x-forms.checkbox instantSave id="service.connect_to_docker_network" label="Connect To Predefined Network" <x-forms.checkbox instantSave id="service.connect_to_docker_network" label="Connect To Predefined Network"
helper="By default, you do not reach the Coolify defined networks.<br>Starting a docker compose based resource will have an internal network. <br>If you connect to a Coolify defined network, you maybe need to use different internal DNS names to connect to a resource.<br><br>For more information, check <a class='text-white underline' href='https://coolify.io/docs/docker/compose#connect-to-predefined-networks'>this</a>." /> helper="By default, you do not reach the Last Hour Cloud defined networks.<br>Starting a docker compose based resource will have an internal network. <br>If you connect to a Last Hour Cloud defined network, you maybe need to use different internal DNS names to connect to a resource.<br><br>For more information, check the upstream <a class='text-white underline' href='https://coolify.io/docs/docker/compose#connect-to-predefined-networks'>docs</a>." />
</div> </div>
@if ($fields) @if ($fields)
<div> <div>

View File

@ -2,11 +2,11 @@
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<h2>Webhooks</h2> <h2>Webhooks</h2>
<x-helper <x-helper
helper="For more details goto our <a class='text-white underline' href='https://coolify.io/docs/api/deploy-webhook' target='_blank'>docs</a>." /> helper="For more details go to the upstream <a class='text-white underline' href='https://coolify.io/docs/api/deploy-webhook' target='_blank'>docs</a>." />
</div> </div>
<div> <div>
<x-forms.input readonly <x-forms.input readonly
helper="See details in our <a target='_blank' class='text-white underline' href='https://coolify.io/docs/api/authentication'>documentation</a>." helper="See details in the upstream <a target='_blank' class='text-white underline' href='https://coolify.io/docs/api/authentication'>documentation</a>."
label="Deploy Webhook (auth required)" id="deploywebhook"></x-forms.input> label="Deploy Webhook (auth required)" id="deploywebhook"></x-forms.input>
</div> </div>
@if ($resource->type() !== 'service') @if ($resource->type() !== 'service')

View File

@ -13,12 +13,12 @@
$wire.showNotification = true; $wire.showNotification = true;
@endif @endif
console.error( console.error(
'Coolify could not connect to the new realtime service introduced in beta.154. This will cause unusual problems on the UI if not fixed! Please check the related documentation (https://coolify.io/docs/cloudflare/tunnels) or get help on Discord (https://coollabs.io/discord).)' 'Last Hour Cloud could not connect to the new realtime service introduced in beta.154. This will cause unusual problems on the UI if not fixed! Please check the related upstream documentation (https://coolify.io/docs/cloudflare/tunnels) or get help on Discord (https://coollabs.io/discord).)'
); );
clearInterval(checkPusherInterval); clearInterval(checkPusherInterval);
} }
} else { } else {
console.log('Coolify Realtime Service is connected!'); console.log('Last Hour Cloud Realtime Service is connected!');
clearInterval(checkPusherInterval); clearInterval(checkPusherInterval);
} }
} else { } else {
@ -26,7 +26,7 @@
$wire.showNotification = true; $wire.showNotification = true;
@endif @endif
console.error( console.error(
'Coolify could not connect to the new realtime service introduced in beta.154. This will cause unusual problems on the UI if not fixed! Please check the related documentation (https://coolify.io/docs/cloudflare/tunnels) or get help on Discord (https://coollabs.io/discord).)' 'Last Hour Cloud could not connect to the new realtime service introduced in beta.154. This will cause unusual problems on the UI if not fixed! Please check the related upstream documentation (https://coolify.io/docs/cloudflare/tunnels) or get help on Discord (https://coollabs.io/discord).)'
); );
clearInterval(checkPusherInterval); clearInterval(checkPusherInterval);
} }
@ -35,10 +35,10 @@
@endscript @endscript
<div class="toast z-[9999]" x-cloak x-show="showNotification"> <div class="toast z-[9999]" x-cloak x-show="showNotification">
<div class="flex flex-col text-white border border-red-500 border-dashed rounded alert bg-coolgray-200"> <div class="flex flex-col text-white border border-red-500 border-dashed rounded alert bg-coolgray-200">
<span><span class="font-bold text-left text-red-500">WARNING: </span>Coolify could not connect to the new <span><span class="font-bold text-left text-red-500">WARNING: </span>Last Hour Cloud could not connect to the new
realtime service introduced in beta.154. <br>This will cause unusual problems on the UI if not realtime service introduced in beta.154. <br>This will cause unusual problems on the UI if not
fixed!<br><br>Please check the fixed!<br><br>Please check the
related <a href='https://coolify.io/docs/cloudflare/tunnels' target='_blank'>documentation</a> or get related upstream <a href='https://coolify.io/docs/cloudflare/tunnels' target='_blank'>documentation</a> or get
help on <a href='https://coollabs.io/discord' target='_blank'>Discord</a>.</span> help on <a href='https://coollabs.io/discord' target='_blank'>Discord</a>.</span>
<x-forms.button class="bg-coolgray-400" wire:click='disable'>Acknowledge the problem and disable this <x-forms.button class="bg-coolgray-400" wire:click='disable'>Acknowledge the problem and disable this
popup</x-forms.button> popup</x-forms.button>

View File

@ -1,9 +1,9 @@
<div> <div>
@if ($server->id !== 0) @if ($server->id !== 0)
<h2 class="pt-4">Danger Zone</h2> <h2 class="pt-4">Danger Zone</h2>
<div class="">Woah. I hope you know what are you doing.</div> <div class="">Wait a minute, We hope you know what are you doing.</div>
<h4 class="pt-4">Delete Server</h4> <h4 class="pt-4">Delete Server</h4>
<div class="pb-4">This will remove this server from Coolify. Beware! There is no coming <div class="pb-4">This will remove this server from Last Hour Cloud. Beware! There is no coming
back! back!
</div> </div>
@if ($server->definedResources()->count() > 0) @if ($server->definedResources()->count() > 0)

View File

@ -70,27 +70,27 @@ class="w-full mt-8 mb-4 font-bold box-without-bg bg-coollabs hover:bg-coollabs-1
label="Use it as a build server?" /> label="Use it as a build server?" />
@else @else
<x-forms.checkbox instantSave <x-forms.checkbox instantSave
helper="If you are using Cloudflare Tunnels, enable this. It will proxy all SSH requests to your server through Cloudflare.<br><span class='text-warning'>Coolify does not install or set up Cloudflare (cloudflared) on your server.</span>" helper="If you are using Cloudflare Tunnels, enable this. It will proxy all SSH requests to your server through Cloudflare.<br><span class='text-warning'>Last Hour Cloud does not install or set up Cloudflare (cloudflared) on your server.</span>"
id="server.settings.is_cloudflare_tunnel" label="Cloudflare Tunnel" /> id="server.settings.is_cloudflare_tunnel" label="Cloudflare Tunnel" />
@if ($server->isSwarm()) @if ($server->isSwarm())
<div class="pt-6"> Swarm support is experimental. </div> <div class="pt-6"> Swarm support is experimental. </div>
@endif @endif
@if ($server->settings->is_swarm_worker) @if ($server->settings->is_swarm_worker)
<x-forms.checkbox disabled instantSave type="checkbox" id="server.settings.is_swarm_manager" <x-forms.checkbox disabled instantSave type="checkbox" id="server.settings.is_swarm_manager"
helper="For more information, please read the documentation <a class='text-white' href='https://coolify.io/docs/docker/swarm' target='_blank'>here</a>." helper="For more information, please read the upstream documentation <a class='text-white' href='https://coolify.io/docs/docker/swarm' target='_blank'>here</a>."
label="Is it a Swarm Manager?" /> label="Is it a Swarm Manager?" />
@else @else
<x-forms.checkbox instantSave type="checkbox" id="server.settings.is_swarm_manager" <x-forms.checkbox instantSave type="checkbox" id="server.settings.is_swarm_manager"
helper="For more information, please read the documentation <a class='text-white' href='https://coolify.io/docs/docker/swarm' target='_blank'>here</a>." helper="For more information, please read the upstream documentation <a class='text-white' href='https://coolify.io/docs/docker/swarm' target='_blank'>here</a>."
label="Is it a Swarm Manager?" /> label="Is it a Swarm Manager?" />
@endif @endif
@if ($server->settings->is_swarm_manager) @if ($server->settings->is_swarm_manager)
<x-forms.checkbox disabled instantSave type="checkbox" id="server.settings.is_swarm_worker" <x-forms.checkbox disabled instantSave type="checkbox" id="server.settings.is_swarm_worker"
helper="For more information, please read the documentation <a class='text-white' href='https://coolify.io/docs/docker/swarm' target='_blank'>here</a>." helper="For more information, please read the upstream documentation <a class='text-white' href='https://coolify.io/docs/docker/swarm' target='_blank'>here</a>."
label="Is it a Swarm Worker?" /> label="Is it a Swarm Worker?" />
@else @else
<x-forms.checkbox instantSave type="checkbox" id="server.settings.is_swarm_worker" <x-forms.checkbox instantSave type="checkbox" id="server.settings.is_swarm_worker"
helper="For more information, please read the documentation <a class='text-white' href='https://coolify.io/docs/docker/swarm' target='_blank'>here</a>." helper="For more information, please read the upstream documentation <a class='text-white' href='https://coolify.io/docs/docker/swarm' target='_blank'>here</a>."
label="Is it a Swarm Worker?" /> label="Is it a Swarm Worker?" />
@endif @endif
@endif @endif

View File

@ -28,7 +28,7 @@
& &
@endif @endif
@if (!$server->settings->is_usable) @if (!$server->settings->is_usable)
<span>Not usable by Coolify</span> <span>Not usable by Last Hour Cloud</span>
@endif @endif
</div> </div>
</div> </div>

View File

@ -30,25 +30,25 @@
</div> </div>
<div class="w-96"> <div class="w-96">
<h3 class="pt-6">Swarm Support</h3> <h3 class="pt-6">Swarm Support</h3>
<div> Swarm support is experimental. Read the docs <a class='text-white' <div> Swarm support is experimental. Read the upstream docs to learn more <a class='text-white'
href='https://coolify.io/docs/docker/swarm#deploy-with-persistent-storage' href='https://coolify.io/docs/docker/swarm#deploy-with-persistent-storage'
target='_blank'>here</a>.</div> target='_blank'>here</a>.</div>
@if ($is_swarm_worker || $is_build_server) @if ($is_swarm_worker || $is_build_server)
<x-forms.checkbox disabled instantSave type="checkbox" id="is_swarm_manager" <x-forms.checkbox disabled instantSave type="checkbox" id="is_swarm_manager"
helper="For more information, please read the documentation <a class='text-white' href='https://coolify.io/docs/docker/swarm' target='_blank'>here</a>." helper="For more information, please read the the upstream documentation <a class='text-white' href='https://coolify.io/docs/docker/swarm' target='_blank'>here</a>."
label="Is it a Swarm Manager?" /> label="Is it a Swarm Manager?" />
@else @else
<x-forms.checkbox type="checkbox" instantSave id="is_swarm_manager" <x-forms.checkbox type="checkbox" instantSave id="is_swarm_manager"
helper="For more information, please read the documentation <a class='text-white' href='https://coolify.io/docs/docker/swarm' target='_blank'>here</a>." helper="For more information, please read the the upstream documentation <a class='text-white' href='https://coolify.io/docs/docker/swarm' target='_blank'>here</a>."
label="Is it a Swarm Manager?" /> label="Is it a Swarm Manager?" />
@endif @endif
@if ($is_swarm_manager|| $is_build_server) @if ($is_swarm_manager|| $is_build_server)
<x-forms.checkbox disabled instantSave type="checkbox" id="is_swarm_worker" <x-forms.checkbox disabled instantSave type="checkbox" id="is_swarm_worker"
helper="For more information, please read the documentation <a class='text-white' href='https://coolify.io/docs/docker/swarm' target='_blank'>here</a>." helper="For more information, please read the upstream documentation <a class='text-white' href='https://coolify.io/docs/docker/swarm' target='_blank'>here</a>."
label="Is it a Swarm Worker?" /> label="Is it a Swarm Worker?" />
@else @else
<x-forms.checkbox type="checkbox" instantSave id="is_swarm_worker" <x-forms.checkbox type="checkbox" instantSave id="is_swarm_worker"
helper="For more information, please read the documentation <a class='text-white' href='https://coolify.io/docs/docker/swarm' target='_blank'>here</a>." helper="For more information, please read the upstream documentation <a class='text-white' href='https://coolify.io/docs/docker/swarm' target='_blank'>here</a>."
label="Is it a Swarm Worker?" /> label="Is it a Swarm Worker?" />
@endif @endif
@if ($is_swarm_worker && count($swarm_managers) > 0) @if ($is_swarm_worker && count($swarm_managers) > 0)

View File

@ -18,7 +18,7 @@
configurations. configurations.
</div> </div>
@endif @endif
<x-forms.input placeholder="https://app.coolify.io" id="redirect_url" label="Default Redirect 404" <x-forms.input placeholder="https://lasthourhosting.org" id="redirect_url" label="Default Redirect 404"
helper="All urls that has no service available will be redirected to this domain." /> helper="All urls that has no service available will be redirected to this domain." />
<div wire:loading wire:target="loadProxyConfiguration" class="pt-4"> <div wire:loading wire:target="loadProxyConfiguration" class="pt-4">
<x-loading text="Loading proxy configuration..." /> <x-loading text="Loading proxy configuration..." />

View File

@ -15,7 +15,7 @@
<h2>Resources</h2> <h2>Resources</h2>
<x-forms.button wire:click="refreshStatus">Refresh</x-forms.button> <x-forms.button wire:click="refreshStatus">Refresh</x-forms.button>
</div> </div>
<div class="pb-4 title">Here you can find all resources that are managed by Coolify.</div> <div class="pb-4 title">Here you can find all resources that are managed by Last Hour Cloud.</div>
</div> </div>
<div class="flex flex-col"> <div class="flex flex-col">
<div class="flex flex-col"> <div class="flex flex-col">

View File

@ -8,7 +8,7 @@
</x-forms.button> </x-forms.button>
@endif @endif
</div> </div>
<div class="pb-4">Backup your Coolify instance settings</div> <div class="pb-4">Backup your Last Hour Cloud instance settings</div>
<div> <div>
@if (isset($database)) @if (isset($database))
<div class="flex flex-col gap-3 pb-4"> <div class="flex flex-col gap-3 pb-4">
@ -24,8 +24,8 @@
</div> </div>
<livewire:project.database.backup-edit :backup="$backup" :s3s="$s3s" :status="data_get($database, 'status')" /> <livewire:project.database.backup-edit :backup="$backup" :s3s="$s3s" :status="data_get($database, 'status')" />
@else @else
To configure automatic backup for your Coolify instance, you first need to add as a database resource To configure automatic backup for your Last Hour Cloud instance, you first need to add as a database resource
into Coolify. into Last Hour Cloud.
<x-forms.button wire:click="add_coolify_database">Add Database</x-forms.button> <x-forms.button wire:click="add_coolify_database">Add Database</x-forms.button>
@endif @endif
</div> </div>

View File

@ -6,11 +6,11 @@
Save Save
</x-forms.button> </x-forms.button>
</div> </div>
<div>General configuration for your Coolify instance.</div> <div>General configuration for your Last Hour Cloud instance.</div>
<div class="flex flex-col gap-2 pt-4"> <div class="flex flex-col gap-2 pt-4">
<div class="flex items-end gap-2"> <div class="flex items-end gap-2">
<x-forms.input id="settings.fqdn" label="Instance's Domain" placeholder="https://coolify.io" /> <x-forms.input id="settings.fqdn" label="Instance's Domain" placeholder="https://lasthourhosting.org" />
<x-forms.input id="settings.custom_dns_servers" label="DNS Servers" helper="DNS servers for validation FQDNS againts. A comma separated list of DNS servers." placeholder="1.1.1.1,8.8.8.8" /> <x-forms.input id="settings.custom_dns_servers" label="DNS Servers" helper="DNS servers for validation FQDNS againts. A comma separated list of DNS servers." placeholder="1.1.1.1,8.8.8.8" />
<x-forms.checkbox instantSave id="is_dns_validation_enabled" label="Validate DNS settings?" /> <x-forms.checkbox instantSave id="is_dns_validation_enabled" label="Validate DNS settings?" />
</div> </div>
@ -25,9 +25,9 @@
<div class="flex flex-col py-6 text-right w-80"> <div class="flex flex-col py-6 text-right w-80">
@if(!is_null(env('AUTOUPDATE', null))) @if(!is_null(env('AUTOUPDATE', null)))
<x-forms.checkbox instantSave helper="AUTOUPDATE is set in .env file, you need to modify it there." disabled <x-forms.checkbox instantSave helper="AUTOUPDATE is set in .env file, you need to modify it there." disabled
id="is_auto_update_enabled" label="Auto Update Coolify" /> id="is_auto_update_enabled" label="Auto Update Last Hour Cloud" />
@else @else
<x-forms.checkbox instantSave id="is_auto_update_enabled" label="Auto Update Coolify" /> <x-forms.checkbox instantSave id="is_auto_update_enabled" label="Auto Update Last Hour Cloud" />
@endif @endif
<x-forms.checkbox instantSave id="is_registration_enabled" label="Registration Allowed" /> <x-forms.checkbox instantSave id="is_registration_enabled" label="Registration Allowed" />
<x-forms.checkbox instantSave id="do_not_track" label="Do Not Track" /> <x-forms.checkbox instantSave id="do_not_track" label="Do Not Track" />

View File

@ -35,7 +35,7 @@
@if (!isCloud()) @if (!isCloud())
<div class="w-48"> <div class="w-48">
<x-forms.checkbox label="System Wide?" <x-forms.checkbox label="System Wide?"
helper="If checked, this GitHub App will be available for everyone in this Coolify instance." helper="If checked, this GitHub App will be available for everyone in this Last Hour Cloud instance."
instantSave id="github_app.is_system_wide" /> instantSave id="github_app.is_system_wide" />
</div> </div>
@endif @endif
@ -98,7 +98,7 @@
@if (!isCloud() || isDev()) @if (!isCloud() || isDev())
<div class="flex items-end gap-2"> <div class="flex items-end gap-2">
<x-forms.select wire:model.live='webhook_endpoint' label="Webhook Endpoint" <x-forms.select wire:model.live='webhook_endpoint' label="Webhook Endpoint"
helper="All Git webhooks will be sent to this endpoint. <br><br>If you would like to use domain instead of IP address, set your Coolify instance's FQDN in the Settings menu."> helper="All Git webhooks will be sent to this endpoint. <br><br>If you would like to use domain instead of IP address, set your Last Hour Cloud instance's FQDN in the Settings menu.">
@if ($ipv4) @if ($ipv4)
<option value="{{ $ipv4 }}">Use {{ $ipv4 }}</option> <option value="{{ $ipv4 }}">Use {{ $ipv4 }}</option>
@endif @endif

View File

@ -2,11 +2,10 @@
@if (data_get(auth()->user(), 'is_notification_sponsorship_enabled')) @if (data_get(auth()->user(), 'is_notification_sponsorship_enabled'))
<div class="toast"> <div class="toast">
<div class="flex flex-col text-white rounded alert bg-coolgray-200"> <div class="flex flex-col text-white rounded alert bg-coolgray-200">
<span>Love Coolify as we do? <a href="https://coolify.io/sponsorships" <span>Like Last Hour Cloud? <a href="https://lasthourhosting.org/"
class="underline text-warning">Please class="underline text-warning">Please
consider donating!</a>💜</span> consider sharing about us!</a></span>
<span>It enables us to keep creating features without paywalls, ensuring our work remains free and <span>Your support enables us to keep creating services that support sharing the Gospel of Jesus Christ. 1 John 2:18</span>
open.</span>
<x-forms.button class="bg-coolgray-400" wire:click='disable'>Disable This Popup</x-forms.button> <x-forms.button class="bg-coolgray-400" wire:click='disable'>Disable This Popup</x-forms.button>
</div> </div>
</div> </div>

View File

@ -40,8 +40,8 @@ class="text-warning">{{ session('currentTeam.name') }}</span></span>
<span>Currently active team: <span class="text-warning">{{ session('currentTeam.name') }}</span></span> <span>Currently active team: <span class="text-warning">{{ session('currentTeam.name') }}</span></span>
</div> </div>
<div>You are not an admin or have been removed from this team. If this does not make sense, please <span <div>You are not an admin or have been removed from this team. If this does not make sense, please <span
class="text-white underline cursor-pointer" wire:click="help" onclick="help.showModal()">contact class="text-white underline">contact
us</span>.</div> us at support@lasthourhosting.org</span>.</div>
</div> </div>
@endif @endif
@else @else

View File

@ -13,7 +13,7 @@ class="font-normal text-white normal-case border-none rounded btn btn-primary bt
</x-slide-over> </x-slide-over>
</div> </div>
<div class="flex items-center gap-2 pb-4">You can use these variables anywhere with <span class="text-warning">@{{team.VARIABLENAME}}</span> <x-helper <div class="flex items-center gap-2 pb-4">You can use these variables anywhere with <span class="text-warning">@{{team.VARIABLENAME}}</span> <x-helper
helper="More info <a class='text-white underline' href='https://coolify.io/docs/environment-variables#shared-variables' target='_blank'>here</a>."></x-helper> helper="More info in upstream docs<a class='text-white underline' href='https://coolify.io/docs/environment-variables#shared-variables' target='_blank'>here</a>."></x-helper>
</div> </div>
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">

View File

@ -2,7 +2,7 @@
<div class="w-96 min-w-fit"> <div class="w-96 min-w-fit">
<div class="flex flex-col items-center pb-8"> <div class="flex flex-col items-center pb-8">
<a href="{{ route('dashboard') }}"> <a href="{{ route('dashboard') }}">
<div class="text-5xl font-bold tracking-tight text-center text-white">Coolify</div> <div class="text-5xl font-bold tracking-tight text-center text-white">Last Hour Cloud</div>
</a> </a>
</div> </div>
<div class="flex items-center justify-center pb-4 text-center"> <div class="flex items-center justify-center pb-4 text-center">

View File

@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
## Do not modify this file. You will lose the ability to install and auto-update!
set -e # Exit immediately if a command exits with a non-zero status set -e # Exit immediately if a command exits with a non-zero status
## $1 could be empty, so we need to disable this check ## $1 could be empty, so we need to disable this check
@ -9,7 +8,7 @@ set -o pipefail # Cause a pipeline to return the status of the last command that
VERSION="1.2.0" VERSION="1.2.0"
DOCKER_VERSION="24.0" DOCKER_VERSION="24.0"
CDN="https://cdn.coollabs.io/coolify" CDN="https://cdn.lasthourhosting.org/lasthourcloud"
OS_TYPE=$(grep -w "ID" /etc/os-release | cut -d "=" -f 2 | tr -d '"') OS_TYPE=$(grep -w "ID" /etc/os-release | cut -d "=" -f 2 | tr -d '"')
if [ "$OS_TYPE" = "arch" ]; then if [ "$OS_TYPE" = "arch" ]; then
@ -18,7 +17,7 @@ else
OS_VERSION=$(grep -w "VERSION_ID" /etc/os-release | cut -d "=" -f 2 | tr -d '"') OS_VERSION=$(grep -w "VERSION_ID" /etc/os-release | cut -d "=" -f 2 | tr -d '"')
fi fi
LATEST_VERSION=$(curl --silent $CDN/versions.json | grep -i version | sed -n '2p' | xargs | awk '{print $2}' | tr -d ',') LATEST_VERSION=$(wget -q -O - $CDN/versions.json | grep -i version | sed -n '2p' | xargs | awk '{print $2}' | tr -d ',')
DATE=$(date +"%Y%m%d-%H%M%S") DATE=$(date +"%Y%m%d-%H%M%S")
if [ $EUID != 0 ]; then if [ $EUID != 0 ]; then
@ -42,13 +41,13 @@ if [ "$1" != "" ]; then
fi fi
echo -e "-------------" echo -e "-------------"
echo -e "Welcome to Coolify v4 beta installer!" echo -e "Welcome to Last Hour Cloud v4 installer!"
echo -e "This script will install everything for you." echo -e "This script will install everything for you."
echo -e "(Source code: https://github.com/coollabsio/coolify/blob/main/scripts/install.sh)\n" echo -e "(Source code: https://githaven.org/Shiloh/lasthourcloud/src/branch/main/scripts/install.sh)\n"
echo -e "-------------" echo -e "-------------"
echo "OS: $OS_TYPE $OS_VERSION" echo "OS: $OS_TYPE $OS_VERSION"
echo "Coolify version: $LATEST_VERSION" echo "Last Hour Cloud version: $LATEST_VERSION"
echo -e "-------------" echo -e "-------------"
echo "Installing required packages..." echo "Installing required packages..."
@ -101,7 +100,7 @@ fi
if [ "$SSH_DETECTED" = "false" ]; then if [ "$SSH_DETECTED" = "false" ]; then
echo "###############################################################################" echo "###############################################################################"
echo "WARNING: Could not detect if OpenSSH server is installed and running - this does not mean that it is not installed, just that we could not detect it." echo "WARNING: Could not detect if OpenSSH server is installed and running - this does not mean that it is not installed, just that we could not detect it."
echo -e "Please make sure it is set, otherwise Coolify cannot connect to the host system. \n" echo -e "Please make sure it is set, otherwise Last Hour Cloud cannot connect to the host system. \n"
echo "###############################################################################" echo "###############################################################################"
fi fi
@ -118,7 +117,7 @@ if [ "$SSH_PERMIT_ROOT_LOGIN" != "true" ]; then
echo "###############################################################################" echo "###############################################################################"
echo "WARNING: PermitRootLogin is not enabled in /etc/ssh/sshd_config." echo "WARNING: PermitRootLogin is not enabled in /etc/ssh/sshd_config."
echo -e "It is set to $SSH_PERMIT_ROOT_LOGIN_CONFIG. Should be prohibit-password, yes or without-password.\n" echo -e "It is set to $SSH_PERMIT_ROOT_LOGIN_CONFIG. Should be prohibit-password, yes or without-password.\n"
echo -e "Please make sure it is set, otherwise Coolify cannot connect to the host system. \n" echo -e "Please make sure it is set, otherwise Last Hour Cloud cannot connect to the host system. \n"
echo "(Currently we only support root user to login via SSH, this will be changed in the future.)" echo "(Currently we only support root user to login via SSH, this will be changed in the future.)"
echo "###############################################################################" echo "###############################################################################"
fi fi
@ -197,19 +196,26 @@ else
fi fi
echo -e "-------------" echo -e "-------------"
#add directories here that you want to modify
mkdir -p /data/coolify/{source,ssh,applications,databases,backups,services,proxy} mkdir -p /data/coolify/{source,ssh,applications,databases,backups,services,proxy,tailwind}
mkdir -p /data/coolify/ssh/{keys,mux} mkdir -p /data/coolify/ssh/{keys,mux}
mkdir -p /data/coolify/proxy/dynamic mkdir -p /data/coolify/proxy/dynamic
chown -R 9999:root /data/coolify
chmod -R 700 /data/coolify
echo "Downloading required files from CDN..." echo "Downloading required files from CDN..."
curl -fsSL $CDN/docker-compose.yml -o /data/coolify/source/docker-compose.yml curl -fsSL $CDN/docker-compose.yml -o /data/coolify/source/docker-compose.yml
curl -fsSL $CDN/docker-compose.prod.yml -o /data/coolify/source/docker-compose.prod.yml curl -fsSL $CDN/docker-compose.prod.yml -o /data/coolify/source/docker-compose.prod.yml
curl -fsSL $CDN/.env.production -o /data/coolify/source/.env.production curl -fsSL $CDN/.env.production -o /data/coolify/source/.env.production
curl -fsSL $CDN/upgrade.sh -o /data/coolify/source/upgrade.sh curl -fsSL $CDN/scripts/upgrade.sh -o /data/coolify/source/upgrade.sh
# echo "Copying required files from Last Hour Cloud git repo..."
# cp /home/lasthour/lasthourcloud/docker-compose.yml /data/coolify/source/docker-compose.yml
# cp /home/lasthour/lasthourcloud/docker-compose.prod.yml /data/coolify/source/docker-compose.prod.yml
# cp /home/lasthour/lasthourcloud/.env.production /data/coolify/source/.env.production
# cp /home/lasthour/lasthourcloud/scripts/upgrade.sh /data/coolify/source/upgrade.sh
chown -R 9999:root /data/coolify
chmod -R 700 /data/coolify
# Copy .env.example if .env does not exist # Copy .env.example if .env does not exist
if [ ! -f /data/coolify/source/.env ]; then if [ ! -f /data/coolify/source/.env ]; then
@ -255,8 +261,10 @@ fi
if ! grep -qw "root@coolify" ~/.ssh/authorized_keys; then if ! grep -qw "root@coolify" ~/.ssh/authorized_keys; then
addSshKey addSshKey
fi fi
echo "Generated SSH access"
echo "Begin upgrade.sh"
bash /data/coolify/source/upgrade.sh "${LATEST_VERSION:-latest}" bash /data/coolify/source/upgrade.sh "${LATEST_VERSION:-latest}"
echo -e "\nCongratulations! Your Coolify instance is ready to use.\n" echo -e "\nCongratulations! Your Last Hour Cloud instance is ready to use.\n"
echo "Please visit http://$(curl -4s https://ifconfig.io):8000 to get started." echo "Please visit http://$(curl -4s https://ifconfig.io):8000 to get started."

View File

@ -2,12 +2,19 @@
## Do not modify this file. You will lost the ability to autoupdate! ## Do not modify this file. You will lost the ability to autoupdate!
VERSION="1.0.4" VERSION="1.0.4"
CDN="https://cdn.coollabs.io/coolify" CDN="https://cdn.lasthourhosting.org/lasthourcloud"
curl -fsSL $CDN/docker-compose.yml -o /data/coolify/source/docker-compose.yml curl -fsSL $CDN/docker-compose.yml -o /data/coolify/source/docker-compose.yml
curl -fsSL $CDN/docker-compose.prod.yml -o /data/coolify/source/docker-compose.prod.yml curl -fsSL $CDN/docker-compose.prod.yml -o /data/coolify/source/docker-compose.prod.yml
curl -fsSL $CDN/.env.production -o /data/coolify/source/.env.production curl -fsSL $CDN/.env.production -o /data/coolify/source/.env.production
# echo "Copying required files from Last Hour Cloud git repo..."
# cp /home/lasthour/lasthourcloud/docker-compose.yml /data/coolify/source/docker-compose.yml
# cp /home/lasthour/lasthourcloud/docker-compose.prod.yml /data/coolify/source/docker-compose.prod.yml
# cp /home/lasthour/lasthourcloud/.env.production /data/coolify/source/.env.production
# cp /home/lasthour/lasthourcloud/scripts/upgrade.sh /data/coolify/source/upgrade.sh
# Merge .env and .env.production. New values will be added to .env # Merge .env and .env.production. New values will be added to .env
sort -u -t '=' -k 1,1 /data/coolify/source/.env /data/coolify/source/.env.production | sed '/^$/d' >/data/coolify/source/.env.temp && mv /data/coolify/source/.env.temp /data/coolify/source/.env sort -u -t '=' -k 1,1 /data/coolify/source/.env /data/coolify/source/.env.production | sed '/^$/d' >/data/coolify/source/.env.temp && mv /data/coolify/source/.env.temp /data/coolify/source/.env

View File

@ -1,8 +1,8 @@
/** @type {import('tailwindcss').Config} */ /** @type {import('tailwindcss').Config} */
module.exports = { module.exports = {
content: [ content: [
'./vendor/wire-elements/modal/resources/views/*.blade.php', "./vendor/wire-elements/modal/resources/views/*.blade.php",
'./storage/framework/views/*.php', "./storage/framework/views/*.php",
"./resources/**/*.blade.php", "./resources/**/*.blade.php",
"./app/**/*.php", "./app/**/*.php",
"./resources/**/*.js", "./resources/**/*.js",
@ -14,8 +14,8 @@ module.exports = {
sans: ["Inter", "sans-serif"], sans: ["Inter", "sans-serif"],
}, },
colors: { colors: {
coollabs: "#6B16ED", coollabs: "#00bff7",
"coollabs-100": "#7317FF", "coollabs-100": "#00bff7",
"coolgray-100": "#181818", "coolgray-100": "#181818",
"coolgray-200": "#202020", "coolgray-200": "#202020",
"coolgray-300": "#242424", "coolgray-300": "#242424",
@ -34,8 +34,8 @@ module.exports = {
coollabs: { coollabs: {
primary: "#202020", primary: "#202020",
"primary-focus": "#242424", "primary-focus": "#242424",
secondary: "#6B16ED", secondary: "#00bcf3",
accent: "#4338ca", accent: "#00bff7",
neutral: "#1B1D1D", neutral: "#1B1D1D",
"base-100": "#101010", "base-100": "#101010",
info: "#2563EB", info: "#2563EB",

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