Merge pull request #596 from coollabsio/next

v3.9.2
This commit is contained in:
Andras Bacsai 2022-09-07 10:16:54 +02:00 committed by GitHub
commit d3a1bbc3d0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 86 additions and 40 deletions

View File

@ -20,7 +20,8 @@
"svelte.svelte-vscode", "svelte.svelte-vscode",
"ardenivanov.svelte-intellisense", "ardenivanov.svelte-intellisense",
"Prisma.prisma", "Prisma.prisma",
"bradlc.vscode-tailwindcss" "bradlc.vscode-tailwindcss",
"waderyan.gitblame"
], ],
// Use 'forwardPorts' to make a list of ports inside the container available locally. // Use 'forwardPorts' to make a list of ports inside the container available locally.
"forwardPorts": [3000, 3001], "forwardPorts": [3000, 3001],

View File

@ -17,7 +17,6 @@ const algorithm = 'aes-256-ctr';
async function main() { async function main() {
// Enable registration for the first user // Enable registration for the first user
// Set initial HAProxy password
const settingsFound = await prisma.setting.findFirst({}); const settingsFound = await prisma.setting.findFirst({});
if (!settingsFound) { if (!settingsFound) {
await prisma.setting.create({ await prisma.setting.create({
@ -25,7 +24,8 @@ async function main() {
isRegistrationEnabled: true, isRegistrationEnabled: true,
proxyPassword: encrypt(generatePassword()), proxyPassword: encrypt(generatePassword()),
proxyUser: cuid(), proxyUser: cuid(),
arch: process.arch arch: process.arch,
DNSServers: '1.1.1.1,8.8.8.8'
} }
}); });
} else { } else {

View File

@ -89,6 +89,22 @@ export function setDefaultBaseImage(buildPack: string | null, deploymentType: st
} }
]; ];
const phpVersions = [ const phpVersions = [
{
value: 'webdevops/php-apache:8.2',
label: 'webdevops/php-apache:8.2'
},
{
value: 'webdevops/php-nginx:8.2',
label: 'webdevops/php-nginx:8.2'
},
{
value: 'webdevops/php-apache:8.1',
label: 'webdevops/php-apache:8.1'
},
{
value: 'webdevops/php-nginx:8.1',
label: 'webdevops/php-nginx:8.1'
},
{ {
value: 'webdevops/php-apache:8.0', value: 'webdevops/php-apache:8.0',
label: 'webdevops/php-apache:8.0' label: 'webdevops/php-apache:8.0'
@ -145,6 +161,22 @@ export function setDefaultBaseImage(buildPack: string | null, deploymentType: st
value: 'webdevops/php-nginx:5.6', value: 'webdevops/php-nginx:5.6',
label: 'webdevops/php-nginx:5.6' label: 'webdevops/php-nginx:5.6'
}, },
{
value: 'webdevops/php-apache:8.2-alpine',
label: 'webdevops/php-apache:8.2-alpine'
},
{
value: 'webdevops/php-nginx:8.2-alpine',
label: 'webdevops/php-nginx:8.2-alpine'
},
{
value: 'webdevops/php-apache:8.1-alpine',
label: 'webdevops/php-apache:8.1-alpine'
},
{
value: 'webdevops/php-nginx:8.1-alpine',
label: 'webdevops/php-nginx:8.1-alpine'
},
{ {
value: 'webdevops/php-apache:8.0-alpine', value: 'webdevops/php-apache:8.0-alpine',
label: 'webdevops/php-apache:8.0-alpine' label: 'webdevops/php-apache:8.0-alpine'
@ -305,11 +337,11 @@ export function setDefaultBaseImage(buildPack: string | null, deploymentType: st
payload.baseImage = 'denoland/deno:latest'; payload.baseImage = 'denoland/deno:latest';
} }
if (buildPack === 'php') { if (buildPack === 'php') {
payload.baseImage = 'webdevops/php-apache:8.0-alpine'; payload.baseImage = 'webdevops/php-apache:8.2-alpine';
payload.baseImages = phpVersions; payload.baseImages = phpVersions;
} }
if (buildPack === 'laravel') { if (buildPack === 'laravel') {
payload.baseImage = 'webdevops/php-apache:8.0-alpine'; payload.baseImage = 'webdevops/php-apache:8.2-alpine';
payload.baseBuildImage = 'node:18'; payload.baseBuildImage = 'node:18';
payload.baseBuildImages = nodeVersions; payload.baseBuildImages = nodeVersions;
} }

View File

@ -21,7 +21,7 @@ import { scheduler } from './scheduler';
import { supportedServiceTypesAndVersions } from './services/supportedVersions'; import { supportedServiceTypesAndVersions } from './services/supportedVersions';
import { includeServices } from './services/common'; import { includeServices } from './services/common';
export const version = '3.9.1'; export const version = '3.9.2';
export const isDev = process.env.NODE_ENV === 'development'; export const isDev = process.env.NODE_ENV === 'development';
const algorithm = 'aes-256-ctr'; const algorithm = 'aes-256-ctr';

View File

@ -198,7 +198,7 @@ COPY ./init-db.sh /docker-entrypoint-initdb.d/init-db.sh`;
await fs.writeFile(`${workdir}/Dockerfile`, Dockerfile); await fs.writeFile(`${workdir}/Dockerfile`, Dockerfile);
const { volumeMounts } = persistentVolumes(id, persistentStorage, config.plausibleAnalytics) const { volumeMounts } = persistentVolumes(id, persistentStorage, config)
const composeFile: ComposeFile = { const composeFile: ComposeFile = {
version: '3.8', version: '3.8',
@ -333,6 +333,8 @@ async function startMinioService(request: FastifyRequest<ServiceStartStop>) {
image: `${image}:${version}`, image: `${image}:${version}`,
volumes: [`${id}-minio-data:/data`], volumes: [`${id}-minio-data:/data`],
environmentVariables: { environmentVariables: {
MINIO_SERVER_URL: fqdn,
MINIO_DOMAIN: getDomain(fqdn),
MINIO_ROOT_USER: rootUser, MINIO_ROOT_USER: rootUser,
MINIO_ROOT_PASSWORD: rootUserPassword, MINIO_ROOT_PASSWORD: rootUserPassword,
MINIO_BROWSER_REDIRECT_URL: fqdn MINIO_BROWSER_REDIRECT_URL: fqdn
@ -852,7 +854,7 @@ async function startGhostService(request: FastifyRequest<ServiceStartStop>) {
}); });
} }
const { volumeMounts } = persistentVolumes(id, persistentStorage, config.ghost) const { volumeMounts } = persistentVolumes(id, persistentStorage, config)
const composeFile: ComposeFile = { const composeFile: ComposeFile = {
version: '3.8', version: '3.8',
services: { services: {
@ -1086,7 +1088,7 @@ async function startUmamiService(request: FastifyRequest<ServiceStartStop>) {
FROM ${config.postgresql.image} FROM ${config.postgresql.image}
COPY ./schema.postgresql.sql /docker-entrypoint-initdb.d/schema.postgresql.sql`; COPY ./schema.postgresql.sql /docker-entrypoint-initdb.d/schema.postgresql.sql`;
await fs.writeFile(`${workdir}/Dockerfile`, Dockerfile); await fs.writeFile(`${workdir}/Dockerfile`, Dockerfile);
const { volumeMounts } = persistentVolumes(id, persistentStorage, config.umami) const { volumeMounts } = persistentVolumes(id, persistentStorage, config)
const composeFile: ComposeFile = { const composeFile: ComposeFile = {
version: '3.8', version: '3.8',
services: { services: {
@ -1114,6 +1116,7 @@ async function startUmamiService(request: FastifyRequest<ServiceStartStop>) {
}, },
volumes: volumeMounts volumes: volumeMounts
}; };
console.log(composeFile)
const composeFileDestination = `${workdir}/docker-compose.yaml`; const composeFileDestination = `${workdir}/docker-compose.yaml`;
await fs.writeFile(composeFileDestination, yaml.dump(composeFile)); await fs.writeFile(composeFileDestination, yaml.dump(composeFile));
await startServiceContainers(destinationDocker.id, composeFileDestination) await startServiceContainers(destinationDocker.id, composeFileDestination)
@ -1167,7 +1170,7 @@ async function startHasuraService(request: FastifyRequest<ServiceStartStop>) {
}); });
} }
const { volumeMounts } = persistentVolumes(id, persistentStorage, config.hasura) const { volumeMounts } = persistentVolumes(id, persistentStorage, config)
const composeFile: ComposeFile = { const composeFile: ComposeFile = {
version: '3.8', version: '3.8',
services: { services: {
@ -1272,7 +1275,7 @@ async function startFiderService(request: FastifyRequest<ServiceStartStop>) {
config.fider.environmentVariables[secret.name] = secret.value; config.fider.environmentVariables[secret.name] = secret.value;
}); });
} }
const { volumeMounts } = persistentVolumes(id, persistentStorage, config.fider) const { volumeMounts } = persistentVolumes(id, persistentStorage, config)
const composeFile: ComposeFile = { const composeFile: ComposeFile = {
version: '3.8', version: '3.8',
services: { services: {
@ -1880,7 +1883,7 @@ async function startMoodleService(request: FastifyRequest<ServiceStartStop>) {
config.moodle.environmentVariables[secret.name] = secret.value; config.moodle.environmentVariables[secret.name] = secret.value;
}); });
} }
const { volumeMounts } = persistentVolumes(id, persistentStorage, config.moodle) const { volumeMounts } = persistentVolumes(id, persistentStorage, config)
const composeFile: ComposeFile = { const composeFile: ComposeFile = {
version: '3.8', version: '3.8',
services: { services: {
@ -2006,7 +2009,7 @@ async function startGlitchTipService(request: FastifyRequest<ServiceStartStop>)
config.glitchTip.environmentVariables[secret.name] = secret.value; config.glitchTip.environmentVariables[secret.name] = secret.value;
}); });
} }
const { volumeMounts } = persistentVolumes(id, persistentStorage, config.glitchTip) const { volumeMounts } = persistentVolumes(id, persistentStorage, config)
const composeFile: ComposeFile = { const composeFile: ComposeFile = {
version: '3.8', version: '3.8',
services: { services: {
@ -2475,7 +2478,7 @@ async function startTaigaService(request: FastifyRequest<ServiceStartStop>) {
TAIGA_SECRET_KEY: secretKey, TAIGA_SECRET_KEY: secretKey,
} }
}, },
postgresql: { postgresql: {
image: `postgres:12.3`, image: `postgres:12.3`,
volumes: [`${id}-postgresql-data:/var/lib/postgresql/data`], volumes: [`${id}-postgresql-data:/var/lib/postgresql/data`],

View File

@ -525,9 +525,7 @@ export async function checkDomain(request: FastifyRequest<CheckDomain>) {
} }
export async function checkDNS(request: FastifyRequest<CheckDNS>) { export async function checkDNS(request: FastifyRequest<CheckDNS>) {
try { try {
const { id } = request.params const { id } = request.params
let { exposePort, fqdn, forceSave, dualCerts } = request.body let { exposePort, fqdn, forceSave, dualCerts } = request.body
if (!fqdn) { if (!fqdn) {
return {} return {}

View File

@ -133,7 +133,7 @@ export async function gitLabEvents(request: FastifyRequest<GitLabEvents>) {
await prisma.build.create({ await prisma.build.create({
data: { data: {
id: buildId, id: buildId,
pullmergeRequestId, pullmergeRequestId: pullmergeRequestId.toString(),
sourceBranch, sourceBranch,
applicationId: application.id, applicationId: application.id,
destinationDockerId: application.destinationDocker.id, destinationDockerId: application.destinationDocker.id,

View File

@ -244,7 +244,7 @@
{/if} {/if}
{#if $status.application.initialLoading} {#if $status.application.initialLoading}
<button <button
class="icons flex animate-spin items-center space-x-2 bg-transparent text-sm duration-500 ease-in-out" class="icons flex animate-spin items-center space-x-2 bg-transparent text-sm duration-500 ease-in-out hover:bg-transparent"
> >
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"

View File

@ -218,7 +218,8 @@
if (loading) return; if (loading) return;
loading = true; loading = true;
try { try {
nonWWWDomain = application.fqdn != null && getDomain(application.fqdn).replace(/^www\./, ''); nonWWWDomain = application.fqdn && getDomain(application.fqdn).replace(/^www\./, '');
console.log({debug: nonWWWDomain})
if (application.deploymentType) if (application.deploymentType)
application.deploymentType = application.deploymentType.toLowerCase(); application.deploymentType = application.deploymentType.toLowerCase();
!isBot && !isBot &&

View File

@ -87,12 +87,15 @@
const sure = confirm($t('database.confirm_stop', { name: database.name })); const sure = confirm($t('database.confirm_stop', { name: database.name }));
if (sure) { if (sure) {
$status.database.initialLoading = true; $status.database.initialLoading = true;
$status.database.loading = true;
try { try {
await post(`/databases/${database.id}/stop`, {}); await post(`/databases/${database.id}/stop`, {});
} catch (error) { } catch (error) {
return errorNotification(error); return errorNotification(error);
} finally { } finally {
$status.database.initialLoading = false; $status.database.initialLoading = false;
$status.database.loading = false;
await getStatus();
} }
} }
} }
@ -175,7 +178,7 @@
{/if} {/if}
{#if $status.database.initialLoading} {#if $status.database.initialLoading}
<button <button
class="icons flex animate-spin items-center space-x-2 bg-transparent text-sm duration-500 ease-in-out" class="icons flex animate-spin items-center space-x-2 bg-transparent text-sm duration-500 ease-in-out hover:bg-transparent"
> >
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"

View File

@ -70,7 +70,7 @@
</div> </div>
</div> </div>
<div class="prose"> <div class="prose">
<h4>Coolify dashboard</h4> <h4>Coolify</h4>
</div> </div>
{/if} {/if}
</div> </div>

View File

@ -100,7 +100,7 @@
</div> </div>
</div> </div>
<div class="prose"> <div class="prose">
<h4>Coolify dashboard</h4> <h4>Coolify</h4>
</div> </div>
{/if} {/if}
</div> </div>

View File

@ -12,7 +12,14 @@
import { get, post } from '$lib/api'; import { get, post } from '$lib/api';
import { errorNotification, getDomain } from '$lib/common'; import { errorNotification, getDomain } from '$lib/common';
import { t } from '$lib/translations'; import { t } from '$lib/translations';
import { appSession, disabledButton, status, location, setLocation, addToast } from '$lib/store'; import {
appSession,
status,
setLocation,
addToast,
checkIfDeploymentEnabledServices,
isDeploymentEnabled
} from '$lib/store';
import CopyPasswordField from '$lib/components/CopyPasswordField.svelte'; import CopyPasswordField from '$lib/components/CopyPasswordField.svelte';
import Setting from '$lib/components/Setting.svelte'; import Setting from '$lib/components/Setting.svelte';
@ -78,8 +85,8 @@
}); });
await post(`/services/${id}`, { ...service }); await post(`/services/${id}`, { ...service });
setLocation(service); setLocation(service);
$disabledButton = false;
forceSave = false; forceSave = false;
$isDeploymentEnabled = checkIfDeploymentEnabledServices($appSession.isAdmin, service);
return addToast({ return addToast({
message: 'Configuration saved.', message: 'Configuration saved.',
type: 'success' type: 'success'

View File

@ -12,7 +12,7 @@
export let readOnly: any; export let readOnly: any;
export let settings: any; export let settings: any;
const { id } = $page.params; const { id } = $page.params;
const { ipv4, ipv6 } = settings;
let ftpUrl = generateUrl(service.wordpress.ftpPublicPort); let ftpUrl = generateUrl(service.wordpress.ftpPublicPort);
let ftpUser = service.wordpress.ftpUser; let ftpUser = service.wordpress.ftpUser;
let ftpPassword = service.wordpress.ftpPassword; let ftpPassword = service.wordpress.ftpPassword;
@ -22,7 +22,7 @@
function generateUrl(publicPort: any) { function generateUrl(publicPort: any) {
return browser return browser
? `sftp://${ ? `sftp://${
settings?.fqdn ? getDomain(settings.fqdn) : window.location.hostname settings?.fqdn ? getDomain(settings.fqdn) : ipv4 || ipv6
}:${publicPort}` }:${publicPort}`
: 'Loading...'; : 'Loading...';
} }

View File

@ -97,12 +97,15 @@
const sure = confirm($t('database.confirm_stop', { name: service.name })); const sure = confirm($t('database.confirm_stop', { name: service.name }));
if (sure) { if (sure) {
$status.service.initialLoading = true; $status.service.initialLoading = true;
$status.service.loading = true;
try { try {
await post(`/services/${service.id}/${service.type}/stop`, {}); await post(`/services/${service.id}/${service.type}/stop`, {});
} catch (error) { } catch (error) {
return errorNotification(error); return errorNotification(error);
} finally { } finally {
$status.service.initialLoading = false; $status.service.initialLoading = false;
$status.service.loading = false;
await getStatus();
} }
} }
} }

View File

@ -362,17 +362,15 @@
on:click={() => changeSettings('isAPIDebuggingEnabled')} on:click={() => changeSettings('isAPIDebuggingEnabled')}
/> />
</div> </div>
{#if browser && $features.beta} <div class="grid grid-cols-2 items-center">
<div class="grid grid-cols-2 items-center"> <Setting
<Setting id="isAutoUpdateEnabled"
id="isAutoUpdateEnabled" bind:setting={isAutoUpdateEnabled}
bind:setting={isAutoUpdateEnabled} title={$t('setting.auto_update_enabled')}
title={$t('setting.auto_update_enabled')} description={$t('setting.auto_update_enabled_explainer')}
description={$t('setting.auto_update_enabled_explainer')} on:click={() => changeSettings('isAutoUpdateEnabled')}
on:click={() => changeSettings('isAutoUpdateEnabled')} />
/> </div>
</div>
{/if}
</div> </div>
</form> </form>
</div> </div>

View File

@ -46,8 +46,8 @@
customPort: source.customPort customPort: source.customPort
}); });
const { organization, htmlUrl } = source; const { organization, htmlUrl } = source;
const { fqdn } = settings; const { fqdn, ipv4, ipv6 } = settings;
const host = dev ? getAPIUrl() : fqdn ? fqdn : `http://${window.location.host}` || ''; const host = dev ? getAPIUrl() : fqdn ? fqdn : `http://${ipv4 || ipv6}` || '';
const domain = getDomain(fqdn); const domain = getDomain(fqdn);
let url = 'settings/apps/new'; let url = 'settings/apps/new';

View File

@ -1,7 +1,7 @@
{ {
"name": "coolify", "name": "coolify",
"description": "An open-source & self-hostable Heroku / Netlify alternative.", "description": "An open-source & self-hostable Heroku / Netlify alternative.",
"version": "3.9.1", "version": "3.9.2",
"license": "Apache-2.0", "license": "Apache-2.0",
"repository": "github:coollabsio/coolify", "repository": "github:coollabsio/coolify",
"scripts": { "scripts": {