From b60f8df17ae133d3b1c639e15bdd0b312a78ed74 Mon Sep 17 00:00:00 2001 From: buttercubz Date: Sun, 9 Jun 2024 12:14:55 -0400 Subject: [PATCH 001/112] feat: spanish translation --- lang/es.json | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 lang/es.json diff --git a/lang/es.json b/lang/es.json new file mode 100644 index 000000000..866f5ae88 --- /dev/null +++ b/lang/es.json @@ -0,0 +1,30 @@ +{ + "auth.login": "Iniciar Sesión", + "auth.login.azure": "Acceder con Microsoft", + "auth.login.bitbucket": "Acceder con Bitbucket", + "auth.login.github": "Acceder con GitHub", + "auth.login.gitlab": "Acceder con Gitlab", + "auth.login.google": "Acceder con Google", + "auth.already_registered": "¿Ya estás registrado?", + "auth.confirm_password": "Confirmar contraseña", + "auth.forgot_password": "¿Olvidaste tu contraseña?", + "auth.forgot_password_send_email": "Enviar correo de recuperación de contraseña", + "auth.register_now": "Registrar", + "auth.logout": "Cerrar sesión", + "auth.register": "Registrar", + "auth.registration_disabled": "El registro está desactivado. Por favor contacta con el administrador.", + "auth.reset_password": "Cambiar contraseña", + "auth.failed": "Las credenciales no coinciden con nuestro registro..", + "auth.failed.callback": "Fallo el proceso de inicio de sesión con el proveedor.", + "auth.failed.password": "La contraseña es incorrecta.", + "auth.failed.email": "No encontramos un usuario con ese correo.", + "auth.throttle": "Demasiados intentos. Por favor Inténtalo en :seconds segundos.", + "input.name": "Nombre", + "input.email": "Correo", + "input.password": "Contraseña", + "input.password.again": "Escribe la contraseña otra vez", + "input.code": "Código de único uso", + "input.recovery_code": "Código de recuperación", + "button.save": "Guardar", + "repository.url": "Examples
Para repositorios publicos, usar https://....
Para repositorios privados, usar git@....

https://github.com/coollabsio/coolify-examples main la rama 'main' será seleccionada.
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastify la rama 'nodejs-fastify' será seleccionada.
https://gitea.com/sedlav/expressjs.git main la rama 'main' será seleccionada.
https://gitlab.com/andrasbacsai/nodejs-example.git main la rama 'main' será seleccionada." +} From 55e2e29696986b15168465d9b14bbd01c2a6d97c Mon Sep 17 00:00:00 2001 From: Ikko Eltociear Ashimine Date: Mon, 10 Jun 2024 02:50:10 +0900 Subject: [PATCH 002/112] Add Japanese language support --- lang/ja.json | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 lang/ja.json diff --git a/lang/ja.json b/lang/ja.json new file mode 100644 index 000000000..4652a3b17 --- /dev/null +++ b/lang/ja.json @@ -0,0 +1,30 @@ +{ + "auth.login": "ログイン", + "auth.login.azure": "Microsoftでログイン", + "auth.login.bitbucket": "Bitbucketでログイン", + "auth.login.github": "GitHubでログイン", + "auth.login.gitlab": "Gitlabでログイン", + "auth.login.google": "Googleでログイン", + "auth.already_registered": "すでに登録済みですか?", + "auth.confirm_password": "パスワードを確認", + "auth.forgot_password": "パスワードを忘れた", + "auth.forgot_password_send_email": "パスワードリセットメールを送信", + "auth.register_now": "今すぐ登録", + "auth.logout": "ログアウト", + "auth.register": "登録", + "auth.registration_disabled": "登録は無効です。管理者に連絡してください。", + "auth.reset_password": "パスワードをリセット", + "auth.failed": "これらの資格情報は記録と一致しません。", + "auth.failed.callback": "ログインプロバイダーからのコールバックの処理に失敗しました。", + "auth.failed.password": "提供されたパスワードが正しくありません。", + "auth.failed.email": "そのメールアドレスのユーザーが見つかりません。", + "auth.throttle": "ログイン試行回数が多すぎます。:seconds秒後にもう一度お試しください。", + "input.name": "名前", + "input.email": "メール", + "input.password": "パスワード", + "input.password.again": "パスワード再入力", + "input.code": "ワンタイムコード", + "input.recovery_code": "リカバリーコード", + "button.save": "保存", + "repository.url": "
公開リポジトリの場合はhttps://...を使用してください。
プライベートリポジトリの場合はgit@...を使用してください。

https://github.com/coollabsio/coolify-examples mainブランチが選択されます
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastifyブランチが選択されます。
https://gitea.com/sedlav/expressjs.git mainブランチが選択されます。
https://gitlab.com/andrasbacsai/nodejs-example.git mainブランチが選択されます。" +} From 665cd454efb32ec01f30be3de51e84ade9613a11 Mon Sep 17 00:00:00 2001 From: systematicRealm <119763173+systematicRealm@users.noreply.github.com> Date: Mon, 10 Jun 2024 13:23:18 +0300 Subject: [PATCH 003/112] =?UTF-8?q?=F0=9F=8C=90=20ADD:=20Arabic=20Language?= =?UTF-8?q?=20Support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lang/ar.json | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 lang/ar.json diff --git a/lang/ar.json b/lang/ar.json new file mode 100644 index 000000000..c5ec96c8d --- /dev/null +++ b/lang/ar.json @@ -0,0 +1,30 @@ +{ + "auth.login": "تسجيل الدخول", + "auth.login.azure": "تسجيل الدخول باستخدام Microsoft", + "auth.login.bitbucket": "تسجيل الدخول باستخدام Bitbucket", + "auth.login.github": "تسجيل الدخول باستخدام GitHub", + "auth.login.gitlab": "تسجيل الدخول باستخدام Gitlab", + "auth.login.google": "تسجيل الدخول باستخدام Google", + "auth.already_registered": "هل سبق لك التسجيل؟", + "auth.confirm_password": "تأكيد كلمة المرور", + "auth.forgot_password": "نسيت كلمة المرور", + "auth.forgot_password_send_email": "إرسال بريد إلكتروني لإعادة تعيين كلمة المرور", + "auth.register_now": "تسجيل", + "auth.logout": "تسجيل الخروج", + "auth.register": "تسجيل", + "auth.registration_disabled": "تم تعطيل التسجيل. يرجى التواصل مع المسؤول.", + "auth.reset_password": "إعادة تعيين كلمة المرور", + "auth.failed": "هذه البيانات لا تتطابق مع سجلاتنا.", + "auth.failed.callback": "فشل في معالجة استدعاء من مزود تسجيل الدخول.", + "auth.failed.password": "كلمة المرور المقدمة غير صحيحة.", + "auth.failed.email": "لا يمكننا العثور على مستخدم بهذا البريد الإلكتروني.", + "auth.throttle": "عدد محاولات تسجيل الدخول كثيرة جدًا. يرجى المحاولة مرة أخرى في :seconds ثانية.", + "input.name": "الاسم", + "input.email": "البريد الإلكتروني", + "input.password": "كلمة المرور", + "input.password.again": "كلمة المرور مرة أخرى", + "input.code": "الرمز لمرة واحدة", + "input.recovery_code": "رمز الاسترداد", + "button.save": "حفظ", + "repository.url": "أمثلة
للمستودعات العامة، استخدم https://....
للمستودعات الخاصة، استخدم git@....

سيتم تحديد الفرع main لـ https://github.com/coollabsio/coolify-examples
سيتم تحديد الفرع nodejs-fastify لـ https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify
سيتم تحديد الفرع main لـ https://gitea.com/sedlav/expressjs.git
سيتم تحديد الفرع main لـ https://gitlab.com/andrasbacsai/nodejs-example.git." +} From f4904047b5d720462a5f08c23942f9906ab8ddb0 Mon Sep 17 00:00:00 2001 From: Ling <59746573+ndbiaw@users.noreply.github.com> Date: Tue, 11 Jun 2024 03:36:11 +0700 Subject: [PATCH 004/112] chore: add Vietnamese translate --- lang/vi.json | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 lang/vi.json diff --git a/lang/vi.json b/lang/vi.json new file mode 100644 index 000000000..548dbe8b7 --- /dev/null +++ b/lang/vi.json @@ -0,0 +1,30 @@ +{ + "auth.login": "Đăng Nhập", + "auth.login.azure": "Đăng Nhập Bằng Microsoft", + "auth.login.bitbucket": "Đăng Nhập Bằng Bitbucket", + "auth.login.github": "Đăng Nhập Bằng GitHub", + "auth.login.gitlab": "Đăng Nhập Bằng Gitlab", + "auth.login.google": "Đăng Nhập Bằng Google", + "auth.already_registered": "Đã đăng ký?", + "auth.confirm_password": "Nhập lại mật khẩu", + "auth.forgot_password": "Quên mật khẩu", + "auth.forgot_password_send_email": "Gửi email đặt lại mật khẩu", + "auth.register_now": "Đăng ký ngay", + "auth.logout": "Đăng xuất", + "auth.register": "Đăng ký", + "auth.registration_disabled": "Đăng ký không khả dụng. Vui lòng liên hệ quản trị viên.", + "auth.reset_password": "Đặt lại mật khẩu", + "auth.failed": "Thông tin đăng nhập không khớp với bất kỳ tài khoản nào.", + "auth.failed.callback": "Xử lý thông tin từ nhà cung cấp đăng nhập thất bại.", + "auth.failed.password": "Mật khẩu bạn cung cấp không chính xác.", + "auth.failed.email": "Không có người dùng nào đã đăng ký với email đó.", + "auth.throttle": "Quá nhiều lần đăng nhập thất bại. Vui lòng thử lại sau :seconds giây.", + "input.name": "Tên", + "input.email": "Email", + "input.password": "Mật khẩu", + "input.password.again": "Mật khẩu lần nữa", + "input.code": "One-time code", + "input.recovery_code": "Mã khôi phục", + "button.save": "Lưu", + "repository.url": "Ví dụ
Với repo công khai, sử dụng https://....
Với repo riêng tư, sử dụng git@....

https://github.com/coollabsio/coolify-examples nhánh chính sẽ được chọn
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nhánh nodejs-fastify sẽ được chọn.
https://gitea.com/sedlav/expressjs.git nhánh chính sẽ được chọn.
https://gitlab.com/andrasbacsai/nodejs-example.git nhánh chính sẽ được chọn." +} From e282686f97e8a4c0ea3242d3ce8b4e961955900a Mon Sep 17 00:00:00 2001 From: Flow Date: Tue, 11 Jun 2024 01:29:37 +0200 Subject: [PATCH 005/112] Add french translation --- lang/fr.json | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 lang/fr.json diff --git a/lang/fr.json b/lang/fr.json new file mode 100644 index 000000000..ae7fa0a03 --- /dev/null +++ b/lang/fr.json @@ -0,0 +1,30 @@ +{ + "auth.login": "Connexion", + "auth.login.azure": "Connexion avec Microsoft", + "auth.login.bitbucket": "Connexion avec Bitbucket", + "auth.login.github": "Connexion avec GitHub", + "auth.login.gitlab": "Connexion avec Gitlab", + "auth.login.google": "Connexion avec Google", + "auth.already_registered": "Déjà enregistré ?", + "auth.confirm_password": "Confirmer le mot de passe", + "auth.forgot_password": "Mot de passe oublié", + "auth.forgot_password_send_email": "Envoyer l'email de réinitialisation de mot de passe", + "auth.register_now": "S'enregistrer", + "auth.logout": "Déconnexion", + "auth.register": "S'enregistrer", + "auth.registration_disabled": "L'enregistrement est désactivé. Merci de contacter l'administateur.", + "auth.reset_password": "Réinitialiser le mot de passe", + "auth.failed": "Aucune correspondance n'a été trouvé pour les informations d'identification renseignées.", + "auth.failed.callback": "Erreur lors du processus de retour de la plateforme de connexion.", + "auth.failed.password": "Le mot de passe renseigné est incorrect.", + "auth.failed.email": "Aucun utilisateur avec cette adresse email n'a été trouvé.", + "auth.throttle": "Trop de tentatives de connexion. Merci de réessayer dans :seconds secondes.", + "input.name": "Nom", + "input.email": "Email", + "input.password": "Mot de passe", + "input.password.again": "Mot de passe identique", + "input.code": "Code à usage unique", + "input.recovery_code": "Code de récupération", + "button.save": "Sauvegarder", + "repository.url": "Exemples
Pour les dépôts publiques, utilisez https://....
Pour les dépôts privés, utilisez git@....

https://github.com/coollabsio/coolify-examples main sera la branche selectionnée
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastify sera la branche selectionnée.
https://gitea.com/sedlav/expressjs.git main sera la branche selectionnée.
https://gitlab.com/andrasbacsai/nodejs-example.git main sera la branche selectionnée." +} From 85d313a7912483f96dec5969946505864b16f401 Mon Sep 17 00:00:00 2001 From: lopesboa Date: Tue, 11 Jun 2024 12:21:03 -0300 Subject: [PATCH 006/112] chore: add portuguese traslation --- lang/pt.json | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 lang/pt.json diff --git a/lang/pt.json b/lang/pt.json new file mode 100644 index 000000000..b5dd5c434 --- /dev/null +++ b/lang/pt.json @@ -0,0 +1,30 @@ +{ + "auth.login": "Entrar", + "auth.login.azure": "Entrar com Microsoft", + "auth.login.bitbucket": "Entrar com Bitbucket", + "auth.login.github": "Entrar com GitHub", + "auth.login.gitlab": "Entrar com Gitlab", + "auth.login.google": "Entrar com Google", + "auth.already_registered": "Já tem uma conta?", + "auth.confirm_password": "Confirmar senha", + "auth.forgot_password": "Esqueceu a senha?", + "auth.forgot_password_send_email": "Enviar e-mail de redefinição de senha", + "auth.register_now": "Cadastrar-se", + "auth.logout": "Sair", + "auth.register": "Cadastrar", + "auth.registration_disabled": "Cadastro desativado. Por favor, entre em contato com o administrador.", + "auth.reset_password": "Redefinir senha", + "auth.failed": "Essas credenciais não correspondem aos nossos registros.", + "auth.failed.callback": "Falha ao processar o callback do provedor de login.", + "auth.failed.password": "A senha fornecida está incorreta.", + "auth.failed.email": "Não encontramos um usuário com esse endereço de e-mail.", + "auth.throttle": "Muitas tentativas de login. Por favor, tente novamente em :seconds segundos.", + "input.name": "Nome", + "input.email": "E-mail", + "input.password": "Senha", + "input.password.again": "Repetir senha", + "input.code": "Código único", + "input.recovery_code": "Código de recuperação", + "button.save": "Salvar", + "repository.url": "Exemplos
Para repositórios públicos, use https://....
Para repositórios privados, use git@....

https://github.com/coollabsio/coolify-examples a branch main será selecionada
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify a branch nodejs-fastify será selecionada.
https://gitea.com/sedlav/expressjs.git a branch main será selecionada.
https://gitlab.com/andrasbacsai/nodejs-example.git a branch main será selecionada." +} From 1876e8009474dd09353d11f67961c68ecd22baf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Muhammed=20Mustafa=20Ak=C5=9Fam?= Date: Tue, 11 Jun 2024 22:46:02 +0300 Subject: [PATCH 007/112] chore: add Turkish translations --- lang/tr.json | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 lang/tr.json diff --git a/lang/tr.json b/lang/tr.json new file mode 100644 index 000000000..255b0d15b --- /dev/null +++ b/lang/tr.json @@ -0,0 +1,30 @@ +{ + "auth.login": "Giriş", + "auth.login.azure": "Microsoft ile Giriş Yap", + "auth.login.bitbucket": "Bitbucket ile Giriş Yap", + "auth.login.github": "GitHub ile Giriş Yap", + "auth.login.gitlab": "GitLab ile Giriş Yap", + "auth.login.google": "Google ile Giriş Yap", + "auth.already_registered": "Zaten kayıtlı mısınız?", + "auth.confirm_password": "Şifreyi Onayla", + "auth.forgot_password": "Şifremi Unuttum", + "auth.forgot_password_send_email": "Şifre sıfırlama e-postası gönder", + "auth.register_now": "Kayıt Ol", + "auth.logout": "Çıkış Yap", + "auth.register": "Kayıt Ol", + "auth.registration_disabled": "Kayıt devre dışı bırakıldı. Lütfen yöneticiyle iletişime geçin.", + "auth.reset_password": "Şifreyi Sıfırla", + "auth.failed": "Bu kimlik bilgileri kayıtlarımızla eşleşmiyor.", + "auth.failed.callback": "Giriş sağlayıcıdan gelen istek işlenemedi.", + "auth.failed.password": "Sağlanan şifre yanlış.", + "auth.failed.email": "Bu e-posta adresiyle bir kullanıcı bulamıyoruz.", + "auth.throttle": "Çok fazla giriş denemesi. Lütfen :seconds saniye sonra tekrar deneyin.", + "input.name": "İsim", + "input.email": "E-posta", + "input.password": "Şifre", + "input.password.again": "Şifreyi Tekrar Girin", + "input.code": "Tek Kullanımlık Kod", + "input.recovery_code": "Kurtarma Kodu", + "button.save": "Kaydet", + "repository.url": "Örnekler
Halka açık depolar için https://... kullanın.
Özel depolar için git@... kullanın.

https://github.com/coollabsio/coolify-examples main dalı seçilecek
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastify dalı seçilecek.
https://gitea.com/sedlav/expressjs.git main dalı seçilecek.
https://gitlab.com/andrasbacsai/nodejs-example.git main dalı seçilecek." +} From 25649f578d74b01f78bbdc6489130f84e11a2348 Mon Sep 17 00:00:00 2001 From: Levi Date: Wed, 12 Jun 2024 13:33:06 +0200 Subject: [PATCH 008/112] Create de.json --- lang/de.json | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 lang/de.json diff --git a/lang/de.json b/lang/de.json new file mode 100644 index 000000000..8c9b41de1 --- /dev/null +++ b/lang/de.json @@ -0,0 +1,30 @@ +{ + "auth.login": "Anmelden", + "auth.login.azure": "Mit Microsoft anmelden", + "auth.login.bitbucket": "Mit Bitbucket anmelden", + "auth.login.github": "Mit GitHub anmelden", + "auth.login.gitlab": "Mit GitLab anmelden", + "auth.login.google": "Mit Google anmelden", + "auth.already_registered": "Bereits registriert?", + "auth.confirm_password": "Passwort bestätigen", + "auth.forgot_password": "Passwort vergessen", + "auth.forgot_password_send_email": "Passwort zurücksetzen E-Mail senden", + "auth.register_now": "Registrieren", + "auth.logout": "Abmelden", + "auth.register": "Registrieren", + "auth.registration_disabled": "Registrierung ist deaktiviert. Bitte kontaktiere einen Administrator.", + "auth.reset_password": "Passwort zurücksetzen", + "auth.failed": "Diese Anmeldedaten wurden nicht gefunden.", + "auth.failed.callback": "Fehlerhafte Verarbeitung der Antwort des Anmeldeanbieters.", + "auth.failed.password": "Das angegebene Passwort ist inkorrekt.", + "auth.failed.email": "Wir können keinen Benutzer mit dieser E-Mail Adresse finden.", + "auth.throttle": "Zu viele anmeldeversuche. Bitte versuchen es in :seconds Sekunden erneut.", + "input.name": "Name", + "input.email": "E-Mail", + "input.password": "Passwort", + "input.password.again": "Passwort wiederholen", + "input.code": "Einmalcode", + "input.recovery_code": "Wiederherstellungscode", + "button.save": "Speichern", + "repository.url": "Beispiele
Für öffentliche Reposetories benutze https://....
Für private Repositories benutze git@....

https://github.com/coollabsio/coolify-examples main Branch wird ausgewählt
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastify Branch wird ausgewählt.
https://gitea.com/sedlav/expressjs.git main Branch wird ausgewählt.
https://gitlab.com/andrasbacsai/nodejs-example.git main Branch wird ausgewählt." +} From 6bb565ee6768a8a0b2cd52e29c2c1d21e8bd5116 Mon Sep 17 00:00:00 2001 From: Julian Date: Thu, 13 Jun 2024 08:30:41 +0100 Subject: [PATCH 009/112] Create it.json chore: add Italian translations --- lang/it.json | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 lang/it.json diff --git a/lang/it.json b/lang/it.json new file mode 100644 index 000000000..6e4feb9cc --- /dev/null +++ b/lang/it.json @@ -0,0 +1,30 @@ +{ + "auth.login": "Accedi", + "auth.login.azure": "Accedi con Microsoft", + "auth.login.bitbucket": "Accedi con Bitbucket", + "auth.login.github": "Accedi con GitHub", + "auth.login.gitlab": "Accedi con Gitlab", + "auth.login.google": "Accedi con Google", + "auth.already_registered": "Già registrato?", + "auth.confirm_password": "Conferma password", + "auth.forgot_password": "Password dimenticata", + "auth.forgot_password_send_email": "Invia email per reimpostare la password", + "auth.register_now": "Registrati", + "auth.logout": "Esci", + "auth.register": "Registrati", + "auth.registration_disabled": "La registrazione è disabilitata. Si prega di contattare l'amministratore.", + "auth.reset_password": "Reimposta password", + "auth.failed": "Queste credenziali non corrispondono ai nostri record.", + "auth.failed.callback": "Errore durante l'elaborazione del callback dal provider di accesso.", + "auth.failed.password": "La password fornita non è corretta.", + "auth.failed.email": "Non possiamo trovare un utente con questo indirizzo email.", + "auth.throttle": "Troppi tentativi di accesso. Per favore riprova tra :seconds secondi.", + "input.name": "Nome", + "input.email": "Email", + "input.password": "Password", + "input.password.again": "Ripeti password", + "input.code": "Codice monouso", + "input.recovery_code": "Codice di recupero", + "button.save": "Salva", + "repository.url": "Esempi
Per i repository pubblici, utilizza https://....
Per i repository privati, utilizza git@....

https://github.com/coollabsio/coolify-examples verrà selezionato il branch main
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify verrà selezionato il branch nodejs-fastify.
https://gitea.com/sedlav/expressjs.git verrà selezionato il branch main.
https://gitlab.com/andrasbacsai/nodejs-example.git verrà selezionato il branch main." +} From 30ac392af48b30ed3a9fdf034328078064ffa87d Mon Sep 17 00:00:00 2001 From: Levi Date: Thu, 13 Jun 2024 13:56:19 +0200 Subject: [PATCH 010/112] Update lang/de.json Co-authored-by: Marco <59606979+marcomaiermm@users.noreply.github.com> --- lang/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/de.json b/lang/de.json index 8c9b41de1..f2050283f 100644 --- a/lang/de.json +++ b/lang/de.json @@ -26,5 +26,5 @@ "input.code": "Einmalcode", "input.recovery_code": "Wiederherstellungscode", "button.save": "Speichern", - "repository.url": "Beispiele
Für öffentliche Reposetories benutze https://....
Für private Repositories benutze git@....

https://github.com/coollabsio/coolify-examples main Branch wird ausgewählt
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastify Branch wird ausgewählt.
https://gitea.com/sedlav/expressjs.git main Branch wird ausgewählt.
https://gitlab.com/andrasbacsai/nodejs-example.git main Branch wird ausgewählt." + "repository.url": "Beispiele
Für öffentliche Repositories benutze https://....
Für private Repositories benutze git@....

https://github.com/coollabsio/coolify-examples main Branch wird ausgewählt
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastify Branch wird ausgewählt.
https://gitea.com/sedlav/expressjs.git main Branch wird ausgewählt.
https://gitlab.com/andrasbacsai/nodejs-example.git main Branch wird ausgewählt." } From a47816f45df635fcc81bedc731dbcf920b9480d5 Mon Sep 17 00:00:00 2001 From: Levi Date: Thu, 13 Jun 2024 13:56:27 +0200 Subject: [PATCH 011/112] Update lang/de.json Co-authored-by: Marco <59606979+marcomaiermm@users.noreply.github.com> --- lang/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/de.json b/lang/de.json index f2050283f..29fec629f 100644 --- a/lang/de.json +++ b/lang/de.json @@ -18,7 +18,7 @@ "auth.failed.callback": "Fehlerhafte Verarbeitung der Antwort des Anmeldeanbieters.", "auth.failed.password": "Das angegebene Passwort ist inkorrekt.", "auth.failed.email": "Wir können keinen Benutzer mit dieser E-Mail Adresse finden.", - "auth.throttle": "Zu viele anmeldeversuche. Bitte versuchen es in :seconds Sekunden erneut.", + "auth.throttle": "Zu viele Anmeldeversuche. Bitte versuche es in :seconds Sekunden erneut.", "input.name": "Name", "input.email": "E-Mail", "input.password": "Passwort", From 49d91c498eef858149c92317ce0ba66d7d9c7f02 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 14 Jun 2024 09:50:16 +0200 Subject: [PATCH 012/112] refactor: Update image sizes and add new logos to README.md --- README.md | 9 +++++---- other/logos/fractal.png | Bin 0 -> 5643 bytes 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 other/logos/fractal.png diff --git a/README.md b/README.md index 2f61468a1..d22ec90d1 100644 --- a/README.md +++ b/README.md @@ -34,13 +34,14 @@ Thank you so much! Special thanks to our biggest sponsors! cccareers logo -hetzner logo -logto logo +hetzner logo +logto logo bc direct logo -quantcdn logo +quantcdn logo arcjet logo supaguide logo -tigris logo +tigris logo +fractal logo ## Github Sponsors ($40+) SerpAPI diff --git a/other/logos/fractal.png b/other/logos/fractal.png new file mode 100644 index 0000000000000000000000000000000000000000..c4d39c1f1dbcb8861479cf169ceed9e796c6e351 GIT binary patch literal 5643 zcmds5`9G9j`$vmP$nL{rnX;6TP?QYGkSHS+CS!!rg6w3cWNU1b8p+P%qhi9yF!tRr zjY-Nrw#hz-iLuXfd!FZq@9TMe|AOa-d7b+@=iFz`eVyxizu(u1voOETe@yBa7Z(@* z4HK9p7Z>-}{ofHDpr@ZC*u%vo_WcIT;BG($ldfKjv<@0rfwvz^q8lNT-zu%}I9djL zH8#yh$TyuzzIsY)@Pdrc(VGU*(Gc*W_%c)+JCeLCA7|2XD;z+(eBh*W?Y(f39jfmNH*vdOoCQ$>oft$7sz=7KyzVcH)S`DQbwx3cH8I&e$Ba zUh(BhZuj^l!&!TZ5i^2)j zNx1TiF|?LZe*05l{i{MB8kef3WUDPl%RDoPsb6Z-I!h0D^kqld#T=b0Y$WtZ+sQ{0 zHLu3mJHO6$+Ilil`&UX*O44-=FkhUQ5faqC-q)k=pqn^Rpm9C#+B#akph?cZ1mr)r z^-?hI+u-|Ef9}()zI63!uaRaM$>VurY7;&mG8TDEa(WTx9#E*0jzYAZmVn?8HvyDRZa(|UF|FT4i}&$CY?Pt2fRoZ-`hg2?$j$P;I_jiF zlF0ROC}QK>F^YODM0d1FfXU>Gnj*VNG&;TUelCtzBK(d;d8AoO9I`l!jVcM{R5E^A zGnjw(7QHb+Pvkbqect8u*uJBKEm-?R8jd0gBkmXXBBpdiy?m(%`|7C;==UV zpx^vpv)z-Rv7yl}C~pWKwqP2Grv`~2=9zeHMnb=jAU7OL_(5$q)@36z=<$0P_x^{w zagYiP$<}UMD(?p&Y=I&Ye+wE1arJOI^|@iu<*AD)8WGG81iZc^KOPGza!y#=R^Ptn z@bRJwqR+BYy2hH>_?-((d4J}WGitH%yC|5V^Ou0rBg%^Edl(vVz(}a2e{#|S^+X1% zP?TqL&Mu~9#OLZ+u$kVHf9@d|4ir@9jH;mnecoWR3gFKvu@Etxn!jZCPP0!~oKdR( z(DmSi>_`_BMx{4o2lH4xR4@xV_w6iYlJhGo;%yw{jGqprR;T_RZc~?iu=pnW#<+I4 z=H6PvtMc>}X1UiSZ0U*AFONONe+{0ot(0cihSkc&aaQep;Ei3n8+p1$Liy6_yD*28 zcQgh?%}21Qs~CNzv)li;y-$crZc#8vXugpx^uWdb<&Gt>qW&+_tl6wi=)vm_ z3KVr9psFY6#b@2@yP@3IPZL1*IBk;Q$-%Myl1WY)`?G#ENnF1xSkU5 zTaJAJgdwlmA@O!)K-xE}Sd}C=z;Q}J3sgzE#lU=ghk5|QA-&ZU*Wp>?-}ZO!Ks~4& zv2YtpC%~Vwryo)Z2?Wytd(`JKCpC*J*e-4RB zCo$%;R2-$@=)jHWzO_m_yxqs5nzDuFRI3vRaJy{lAa%s>OM6H?vN5rPG?N1c4_hh0 z&$R@tGgsk)RcAeyQ8)Dxfi0HPGSnW6VV`E_#nM%@ct81gZZ`V94;ENGF^KzDn0&7Q zZ*Q-(CoLZTl0haK7mB0|k5WJVpv*A3=_7{8X-*Z3Ii+Ih=J~i%c;_NIIrRnGGtIz&`x|AUU!-=2zF`bKmQzB)xe|-QM zf57L(uHXT?C7`$zl(zU{$h#|tr}qhx?(~(Ogu`R@Ln{d)5k!DJa z*3!~tnof<@RrzQu%GTUZC&aq(`_*()6ulOMYS&^&F*#3Q#ON?<2g-v_0gIQ%s#1KVTFlOcDV)LLbMGkmz%9aAn;InmjzEEq6mYPv?5)Wu7O;qF#>OZ4 z)W2jpnpRXlym|}4Pw=REpFl`G4cFJ>=<2<1&8%6ON+lKMCctphQv0!x%1bswKluQ} zKuv1!krRmb9g9Q7BG>{0fv}O^nOKHxu^_hKjAF__y&Esi?-b$3m>cnH5zwuGE$Cin zGZJKn!<;kYAb#tso507hPy9X&HlsttS9(tW-TN+t$t|$}M}HKwcD-W=HoFCQI7k@L zHyR?d>oZEt`y1&;4oasn?03wf3hH4vzY3eyC6q6%3W~X3Zr6BUD#>ZzgHl(~2+hxZ zeVS zZFFI;B&w^o1OTWBxYfqYGxp@XdvoApmEl9Dfy5aJ(N~mxM0PDK|GF^!aEBF69BQbl z6Kh~y@tP3h1uLh%b>qixn)>S|_J_Zbzn5tq?+z<@RxFrC%?s~7r>X!@^i-O8KKt5n zwR?60`*}y<4Eua-meCa-uCwgE`#YIz8NI1{cqY}gao&R_C6F3;QowAxu_@=JO-nxv z$JlK9Ih1lE+M{88-Fss5Wh!st!$(EG1pmr{@B>$pAK4et#xy+8% zovnA)Nmxod9<{jUxOF4mT^T}spkQnGQTx~o3pk12jOfg6@3o<2>)pEK*W|u$e|qm` zXRNp^?qSsT?jMp+|q>a>TYWeDpj)e;bo&sz8Gy|iYkiKm=%>y z!Dc{YV(|@;Cx13=E{9btjMIxD)~@WJqaKPcFDeplsi#5u3x}^Hg@*Yp2Kmy^m*j$f z_u8fme@5nJ?j$>kh_#iB{jlEceBoCWGX8FBW_5=nO`UAA7Eu-7T(DT7zAXI=!yOzA z(i{zdvQLzX!*G_QaIX3r=re|u(f~d2LgAI;{jrb^1`?u+C41jB5@OimKL198DOgdX zkd4%p5g*b_gx}10o}%Hw#6gK;d@%r7p559VsB`2M7l5NLXShF0v%XSV3dT;=`0A9E zi$xkNUCzP5a7qCGYmXHzOdTja48wW!&cT*9XW6M(s27-h!NLhl(H;avSjIu@uT-UZ z2CJ|^-;}`=!$<=rs*HWCKm;*z^T^RSx0;hXTJe?k@_%8U7Ujie;w1%qXx#it1pEci zIX+ij@$VvoIIm5vyJqNN2d7he<3FeDSC9P^9uyxK{JgU4ZAguC%ipwHVgS?(zbf({ zm=~U1!v(In_j!qitFaGWc>dOnQ5BLSiYt2qL#MYYK588=;0NK(p?*WGY=*~6b+>U_e7F^uk4n=;15Cl*>SD z75|%3E_C}!?fL+)eHn<7SB|7;zi&CdbWQc_8JQQ;rFIs!5;4bY>*>&_0;CmT?Z;dz z6Ek9Xp?i1RYfE-Y=EdJ-uknQ^^`E_Kq_Tm{96)sTeQP%k+0?HUwk5QIvvxaH%Co1k zBKPOz_7;i}(d7tVnlj`Jz&)8^fNtU^*tD)s&DM<@OA31#+~kLDyDc4^_t3&5DXQ;Y z(A$Q{=#ruQw-gB%{{TWxF)G zT}Z~i*auw}u(7`2n`SLoWg`eSI|ZuM_1xDlzZYP*E$MwaC{S6rf&N&&k8@616ezDQ zj?eLfYE*$hG5Vu?N96~AuG~Rmc~-!D&k&51Fk*gu+~p}SAdhvfqt2|za+LS}&;UJp zD-N>YqL(zGkbdAtCYcZhykr2wU1V&CQ^ADdggIanF?^53vChzt^NE;LZ$a)U5rp@Z zf#;#y_m?iq9mOiBbW}dp!77LV4KKFfes-w%v!(W5PJ&gBk75h14PQ|Y0{GD447NZx z(WA!-Y~~0w?qD-hpa}w-NhNwT0i4JKGyphTUamhhcAD^}V?{OKCD~hdd)sTqeWb2t z=MHK@2ux9rH}>+QQ4ah*2mmrLHAaq5+`XcD=>pbS3|Qb53}@&Q!e^yK0KH(?dfo+7 zfOMzS?n}6cYGH(oM_DXi2|)gUDFtBaRyIdPC-Y@?IA>3dCNc0liUBB&t>K1*@Gbc3 z5P&$9)5(1ndAt^h9tJ$Xxn_r=R(ZQ;dh}#`+`?g-vqj3{J2#qA>U7BoI+7Q2c4ZXm8oaqeb%msHiTRPOWQ|(seWW{g|1oggb>{yPUPX-FLg}jiQEE`n%|W(6L; zl-aG_9Z6afBkbP_FgtkwY0Gsq4s!Jxm@he*{BM&qpDgy&t@Y!bu>i4WWwG0A#v^^o zWwBxv?3Cv#@YZhC#(m$Ku{}W$vT>ukX6erh`>FFhV+G2SljoyLPOdAyU%78lyB}$~T3paLZ7${f{F@LRB zj?DR)QrVpTDBD`l2B6A5(k;FVz1_z6h*I0MZmeF-a#H~~ zHdvu^y0LO=yQtyd;alMIkg_jh=71o*Mc1P5RiMnlLqisb<__o|JYwQ=p7hzcb8sE?)*Ip?q-j_n|8+lNQ zY~fij1z9;vxv`Uo+wU>$v0_D!i zB{rxO1;{d62*673`05h?NZ7Af)<22sCIY04F*@Gev0rc5xQ?D1HxU&VxQ<59(ZY2S zz+;O)chNhVQ@{<>#Babk>ugrY@)D|6b2XmN3JmylnQ|$#I&XPsEUB}@Yo>b@9vJmA z&W%5GFR=DU$!yKJTEbTq&$}`qKfl!l-wOeXkNs5>=RTH9&W&i6=H2N<&cD6SE^pdQiCM3}5A7iwNRJy4*%$=nGj&$5h4b=$?jkfad@W)f zN{%4+_4(c(DiK81{t{3%fuR@NboJaH&9G*(F@oXuhfEr^2UGA3=1PYfB-GaOhoQ^{ z@8!{!Q-_}|3SM;q56c1K*dz41OJQ$Sbs^pYPy)DwgpCP71}{x5a(H2PH9VWf$iERk zy0#r{p$^<4k|Wjrhp!O->yC7mbBK$J!{IyoNaShWjTYdNm+OX+IqdVb2QU5!+*Ie8 literal 0 HcmV?d00001 From b17be37aee22ae807da978d77cd98dafa4e40738 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 14 Jun 2024 14:09:56 +0200 Subject: [PATCH 013/112] fix: db proxy status shown better in the UI --- app/Actions/Database/StopDatabaseProxy.php | 2 ++ app/Livewire/Project/Database/Heading.php | 1 - .../Project/Database/Postgresql/General.php | 27 ++++++++++++++----- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/app/Actions/Database/StopDatabaseProxy.php b/app/Actions/Database/StopDatabaseProxy.php index 984225435..1b262c898 100644 --- a/app/Actions/Database/StopDatabaseProxy.php +++ b/app/Actions/Database/StopDatabaseProxy.php @@ -2,6 +2,7 @@ namespace App\Actions\Database; +use App\Events\DatabaseStatusChanged; use App\Models\ServiceDatabase; use App\Models\StandaloneClickhouse; use App\Models\StandaloneDragonfly; @@ -28,5 +29,6 @@ class StopDatabaseProxy instant_remote_process(["docker rm -f {$uuid}-proxy"], $server); $database->is_public = false; $database->save(); + DatabaseStatusChanged::dispatch(); } } diff --git a/app/Livewire/Project/Database/Heading.php b/app/Livewire/Project/Database/Heading.php index 61dafa76f..ae88ac12b 100644 --- a/app/Livewire/Project/Database/Heading.php +++ b/app/Livewire/Project/Database/Heading.php @@ -12,7 +12,6 @@ use App\Actions\Database\StartPostgresql; use App\Actions\Database\StartRedis; use App\Actions\Database\StopDatabase; use App\Actions\Docker\GetContainersStatus; -use App\Jobs\ContainerStatusJob; use Livewire\Component; class Heading extends Component diff --git a/app/Livewire/Project/Database/Postgresql/General.php b/app/Livewire/Project/Database/Postgresql/General.php index 38cac2e5c..a950e5ef9 100644 --- a/app/Livewire/Project/Database/Postgresql/General.php +++ b/app/Livewire/Project/Database/Postgresql/General.php @@ -25,7 +25,17 @@ class General extends Component public ?string $db_url_public = null; - protected $listeners = ['refresh', 'save_init_script', 'delete_init_script']; + public function getListeners() + { + $userId = auth()->user()->id; + + return [ + "echo-private:user.{$userId},DatabaseStatusChanged" => 'database_stopped', + "refresh", + "save_init_script", + "delete_init_script", + ]; + } protected $rules = [ 'database.name' => 'required', @@ -68,11 +78,14 @@ class General extends Component } $this->server = data_get($this->database, 'destination.server'); } - + public function database_stopped() + { + $this->dispatch('success', 'Database proxy stopped. Database is no longer publicly accessible.'); + } public function instantSaveAdvanced() { try { - if (! $this->server->isLogDrainEnabled()) { + if (!$this->server->isLogDrainEnabled()) { $this->database->is_log_drain_enabled = false; $this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.'); @@ -89,14 +102,14 @@ class General extends Component public function instantSave() { try { - if ($this->database->is_public && ! $this->database->public_port) { + if ($this->database->is_public && !$this->database->public_port) { $this->dispatch('error', 'Public port is required.'); $this->database->is_public = false; return; } if ($this->database->is_public) { - if (! str($this->database->status)->startsWith('running')) { + if (!str($this->database->status)->startsWith('running')) { $this->dispatch('error', 'Database must be started to be publicly accessible.'); $this->database->is_public = false; @@ -112,7 +125,7 @@ class General extends Component } $this->database->save(); } catch (\Throwable $e) { - $this->database->is_public = ! $this->database->is_public; + $this->database->is_public = !$this->database->is_public; return handleError($e, $this); } @@ -157,7 +170,7 @@ class General extends Component return; } - if (! isset($this->database->init_scripts)) { + if (!isset($this->database->init_scripts)) { $this->database->init_scripts = []; } $this->database->init_scripts = array_merge($this->database->init_scripts, [ From f10f3456d7bfc6f6d4a3ed7b0d8cc3eeaa9a4a97 Mon Sep 17 00:00:00 2001 From: andrasbacsai Date: Fri, 14 Jun 2024 12:10:40 +0000 Subject: [PATCH 014/112] Fix styling --- .../Project/Database/Postgresql/General.php | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/app/Livewire/Project/Database/Postgresql/General.php b/app/Livewire/Project/Database/Postgresql/General.php index a950e5ef9..1c5d39055 100644 --- a/app/Livewire/Project/Database/Postgresql/General.php +++ b/app/Livewire/Project/Database/Postgresql/General.php @@ -31,9 +31,9 @@ class General extends Component return [ "echo-private:user.{$userId},DatabaseStatusChanged" => 'database_stopped', - "refresh", - "save_init_script", - "delete_init_script", + 'refresh', + 'save_init_script', + 'delete_init_script', ]; } @@ -78,14 +78,16 @@ class General extends Component } $this->server = data_get($this->database, 'destination.server'); } + public function database_stopped() { $this->dispatch('success', 'Database proxy stopped. Database is no longer publicly accessible.'); } + public function instantSaveAdvanced() { try { - if (!$this->server->isLogDrainEnabled()) { + if (! $this->server->isLogDrainEnabled()) { $this->database->is_log_drain_enabled = false; $this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.'); @@ -102,14 +104,14 @@ class General extends Component public function instantSave() { try { - if ($this->database->is_public && !$this->database->public_port) { + if ($this->database->is_public && ! $this->database->public_port) { $this->dispatch('error', 'Public port is required.'); $this->database->is_public = false; return; } if ($this->database->is_public) { - if (!str($this->database->status)->startsWith('running')) { + if (! str($this->database->status)->startsWith('running')) { $this->dispatch('error', 'Database must be started to be publicly accessible.'); $this->database->is_public = false; @@ -125,7 +127,7 @@ class General extends Component } $this->database->save(); } catch (\Throwable $e) { - $this->database->is_public = !$this->database->is_public; + $this->database->is_public = ! $this->database->is_public; return handleError($e, $this); } @@ -170,7 +172,7 @@ class General extends Component return; } - if (!isset($this->database->init_scripts)) { + if (! isset($this->database->init_scripts)) { $this->database->init_scripts = []; } $this->database->init_scripts = array_merge($this->database->init_scripts, [ From 1ecd0307edc96e7d04c2c4cc44d2e551470c563b Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 14 Jun 2024 14:23:40 +0200 Subject: [PATCH 015/112] feat: COOLIFY_CONTAINER_NAME predefined variable --- app/Jobs/ApplicationDeploymentJob.php | 6 ++++++ app/Models/Service.php | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/app/Jobs/ApplicationDeploymentJob.php b/app/Jobs/ApplicationDeploymentJob.php index fb577b895..8f89da2d2 100644 --- a/app/Jobs/ApplicationDeploymentJob.php +++ b/app/Jobs/ApplicationDeploymentJob.php @@ -828,6 +828,9 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue if ($this->application->environment_variables_preview->where('key', 'COOLIFY_BRANCH')->isEmpty()) { $envs->push("COOLIFY_BRANCH={$local_branch}"); } + if ($this->application->environment_variables_preview->where('key', 'COOLIFY_CONTAINER_NAME')->isEmpty()) { + $envs->push("COOLIFY_CONTAINER_NAME={$this->container_name}"); + } foreach ($sorted_environment_variables_preview as $env) { $real_value = $env->real_value; if ($env->version === '4.0.0-beta.239') { @@ -869,6 +872,9 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue if ($this->application->environment_variables->where('key', 'COOLIFY_BRANCH')->isEmpty()) { $envs->push("COOLIFY_BRANCH={$local_branch}"); } + if ($this->application->environment_variables->where('key', 'COOLIFY_CONTAINER_NAME')->isEmpty()) { + $envs->push("COOLIFY_CONTAINER_NAME={$this->container_name}"); + } foreach ($sorted_environment_variables as $env) { $real_value = $env->real_value; if ($env->version === '4.0.0-beta.239') { diff --git a/app/Models/Service.php b/app/Models/Service.php index 7851eb58a..6e8ba25a8 100644 --- a/app/Models/Service.php +++ b/app/Models/Service.php @@ -6,6 +6,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Collection; +use Symfony\Component\Yaml\Yaml; class Service extends BaseModel { @@ -837,6 +838,13 @@ class Service extends BaseModel $commands[] = "mkdir -p $workdir"; $commands[] = "cd $workdir"; + $json = Yaml::parse($this->docker_compose); + foreach($json['services'] as $service => $config) { + $envs = collect($config['environment']); + $envs->push("COOLIFY_CONTAINER_NAME=$service-{$this->uuid}"); + data_set($json, "services.$service.environment", $envs->toArray()); + } + $this->docker_compose = Yaml::dump($json); $docker_compose_base64 = base64_encode($this->docker_compose); $commands[] = "echo $docker_compose_base64 | base64 -d | tee docker-compose.yml > /dev/null"; $envs = $this->environment_variables()->get(); From 2b6fc16637f488048412f402327a764c886d9911 Mon Sep 17 00:00:00 2001 From: andrasbacsai Date: Fri, 14 Jun 2024 12:24:28 +0000 Subject: [PATCH 016/112] Fix styling --- app/Models/Service.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Models/Service.php b/app/Models/Service.php index 6e8ba25a8..8adca3424 100644 --- a/app/Models/Service.php +++ b/app/Models/Service.php @@ -839,7 +839,7 @@ class Service extends BaseModel $commands[] = "cd $workdir"; $json = Yaml::parse($this->docker_compose); - foreach($json['services'] as $service => $config) { + foreach ($json['services'] as $service => $config) { $envs = collect($config['environment']); $envs->push("COOLIFY_CONTAINER_NAME=$service-{$this->uuid}"); data_set($json, "services.$service.environment", $envs->toArray()); From f6f44d8e8f5c36649af3327f09d617fe862797da Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 14 Jun 2024 14:48:12 +0200 Subject: [PATCH 017/112] fix: show commit message on webhooks + prs --- .../application/deployment/index.blade.php | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/resources/views/livewire/project/application/deployment/index.blade.php b/resources/views/livewire/project/application/deployment/index.blade.php index 4282700f8..241530fe0 100644 --- a/resources/views/livewire/project/application/deployment/index.blade.php +++ b/resources/views/livewire/project/application/deployment/index.blade.php @@ -46,7 +46,7 @@ {{ $deployment->status }} @if (data_get($deployment, 'is_webhook') || data_get($deployment, 'pull_request_id')) -
+
@if (data_get($deployment, 'is_webhook')) Webhook @endif @@ -55,12 +55,19 @@ | @endif Pull Request #{{ data_get($deployment, 'pull_request_id') }} - (SHA - @if (data_get($deployment, 'commit')) - {{ data_get($deployment, 'commit') }}) - @else - HEAD) - @endif + @endif + @if (data_get($deployment, 'commit')) +
+
+ @if ($deployment->commitMessage()) + ({{ data_get_str($deployment, 'commit')->limit(7) }} - + {{ $deployment->commitMessage() }}) + @else + {{ data_get_str($deployment, 'commit')->limit(7) }} + @endif +
+
@endif
@else @@ -98,7 +105,7 @@ Finished 0s in 0s @else - Running for 0s + Running for 0s @endif
From af38d0cc078d76ee83e5ecca9ae69a723ca2dd3c Mon Sep 17 00:00:00 2001 From: Alexzvn Date: Sat, 15 Jun 2024 00:01:58 +0000 Subject: [PATCH 018/112] fix: application custom labels reset after saving --- app/Livewire/Project/Application/General.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/Livewire/Project/Application/General.php b/app/Livewire/Project/Application/General.php index 60cdee48e..06ff7b1de 100644 --- a/app/Livewire/Project/Application/General.php +++ b/app/Livewire/Project/Application/General.php @@ -347,7 +347,9 @@ class General extends Component public function submit($showToaster = true) { try { - $this->set_redirect(); + if ($this->application->isDirty('redirect')) { + $this->set_redirect(); + } $this->application->fqdn = str($this->application->fqdn)->replaceEnd(',', '')->trim(); $this->application->fqdn = str($this->application->fqdn)->replaceStart(',', '')->trim(); $this->application->fqdn = str($this->application->fqdn)->trim()->explode(',')->map(function ($domain) { From 1ae6106782ec0451ca15ac3659c77927fd4beca3 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 17 Jun 2024 10:20:02 +0200 Subject: [PATCH 019/112] refactor: Update README.md with new logos and fix styling --- README.md | 4 +++- other/logos/advin.png | Bin 0 -> 33880 bytes other/logos/codext.jpg | Bin 0 -> 105902 bytes other/logos/fractal.svg | 40 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 other/logos/advin.png create mode 100644 other/logos/codext.jpg create mode 100644 other/logos/fractal.svg diff --git a/README.md b/README.md index d22ec90d1..34c40acf5 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,8 @@ Special thanks to our biggest sponsors! arcjet logo supaguide logo tigris logo -fractal logo +fractal logo +advin logo ## Github Sponsors ($40+) SerpAPI @@ -52,6 +53,7 @@ Special thanks to our biggest sponsors! FlintCompany American Cloud CryptoJobsList +Codext Thompson Edolo UXWizz Younes Barrad diff --git a/other/logos/advin.png b/other/logos/advin.png new file mode 100644 index 0000000000000000000000000000000000000000..155408b9cb1914a35c86e99d8b3a85b06def62d6 GIT binary patch literal 33880 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 z z(ma%Hl` z$p#GhwU88BNU}UOhMZOWMsa{CtylSyo<(=EwHviY$*bQLYubbuj7U!|MOEW0yV=P9 zvSkZ%UhB~Ota*7g`CQZXi*Eguor_kAV>=ENBDj{SoRGimTbUIw;vCLyNl?Va-cP5n z_Y#!`Jr&1jd@uuN<=Pyy-bQbGe7D@y3@t)PW!)AODBb(^(BS*oOfOgs)DKx`h)>(L z%&bx$!0tS9IltG_6T}*7N*C z`55LJ4G3)D`GV`jgXmh|^7+AQ?{^AW^@n;qgeiOOn2pJv{43qpy1?Ctj&$SS7U}+K zY;T92LQ6uIc((g=Ks;Y*)F`L#RNk4#7&ms?-ZeWV1}*Mv9TvkJ2&Fh zM0m;*NuL(u5EL_-xp%>!zYlA$B?HE?9&dY0s(wa5gF%wNei*O9Ua+!%3aXp181O)# z%=_=X644V)X!7r=x)K{t4C5NtL;Woc4W*z*9DAi63!a7WCioLRv?AK^-J?RhBlWk! zVGLVl@8@}C7Gd~jJVfoT*ur4A4?jGU&URAPu(prsQEz|Nee)6Eao~

*p?!IAt}F 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