import { findAllDeploymentsByApplicationId } from "@dokploy/server/services/deployment";import { findRegistryByIdWithCredentials, type Registry, safeDockerLoginCommand,} from "@dokploy/server/services/registry";import { createRollback } from "@dokploy/server/services/rollbacks";import type { ApplicationNested } from "../builders"; export const uploadImageRemoteCommand = async ( application: ApplicationNested,) => { const registry = application.registry; const buildRegistry = application.buildRegistry; const rollbackRegistry = application.rollbackRegistry; if (!registry && !buildRegistry && !rollbackRegistry) { throw new Error("No registry found"); } const { appName } = application; const imageName = application.sourceType === "docker" ? application.dockerImage || "" : `${appName}:latest`; const commands: string[] = []; if (registry) { const r = await findRegistryByIdWithCredentials(registry.registryId); const registryTag = getRegistryTag(r, imageName); if (registryTag) { commands.push(`echo "π¦ [Enabled Registry Swarm]"`); commands.push(getRegistryCommands(r, imageName, registryTag)); } } if (buildRegistry) { const r = await findRegistryByIdWithCredentials(buildRegistry.registryId); const buildRegistryTag = getRegistryTag(r, imageName); if (buildRegistryTag) { commands.push(`echo "π [Enabled Build Registry]"`); commands.push(getRegistryCommands(r, imageName, buildRegistryTag)); commands.push( `echo "β οΈ INFO: After the build is finished, you need to wait a few seconds for the server to download the image and run the container."`, ); commands.push( `echo "π Check the Logs tab to see when the container starts running."`, ); } } if (rollbackRegistry && application.rollbackActive) { const deployment = await findAllDeploymentsByApplicationId( application.applicationId, ); if (!deployment || !deployment[0]) { throw new Error("Deployment not found"); } const deploymentId = deployment[0].deploymentId; const rollback = await createRollback({ appName: appName, deploymentId: deploymentId, }); const r = await findRegistryByIdWithCredentials( rollbackRegistry.registryId, ); const rollbackRegistryTag = getRegistryTag(r, rollback?.image || ""); if (rollbackRegistryTag) { commands.push(`echo "π [Enabled Rollback Registry]"`); commands.push(getRegistryCommands(r, imageName, rollbackRegistryTag)); } } try { return commands.join("\n"); } catch (error) { throw error; }}; /** * Extract the repository name from imageName by taking the last part after '/' * Examples: * - "nginx" -> "nginx" * - "nginx:latest" -> "nginx:latest" * - "myuser/myrepo" -> "myrepo" * - "myuser/myrepo:tag" -> "myrepo:tag" * - "docker.io/myuser/myrepo" -> "myrepo" */const extractRepositoryName = (imageName: string): string => { const lastSlashIndex = imageName.lastIndexOf("/"); // If no '/', return the imageName as is if (lastSlashIndex === -1) { return imageName; } // Extract everything after the last '/' return imageName.substring(lastSlashIndex + 1);}; export const getRegistryTag = (registry: Registry, imageName: string) => { const { registryUrl, imagePrefix, username } = registry; // Extract the repository name (last part after '/') const repositoryName = extractRepositoryName(imageName); // Build the final tag using registry's username/prefix (must be lowercase for valid image refs) const targetPrefix = (imagePrefix || username).toLowerCase(); const finalRegistry = registryUrl || ""; return finalRegistry ? `${finalRegistry}/${targetPrefix}/${repositoryName}` : `${targetPrefix}/${repositoryName}`;}; const getRegistryCommands = ( registry: Registry, imageName: string, registryTag: string,): string => { const loginCmd = safeDockerLoginCommand( registry.registryUrl, registry.username, registry.password, ); return `echo "π¦ [Enabled Registry] Uploading image to '${registry.registryType}' | '${registryTag}'" ;${loginCmd} || { echo "β DockerHub Failed" ; exit 1;}echo "β
Registry Login Success" ;docker tag ${imageName} ${registryTag} || { echo "β Error tagging image" ; exit 1;}echo "β
Image Tagged" ;docker push ${registryTag} || { echo "β Error pushing image" ; exit 1;} echo "β
Image Pushed" ;`;};
import { findAllDeploymentsByApplicationId } from "@dokploy/server/services/deployment";
import {
findRegistryByIdWithCredentials,
type Registry,
safeDockerLoginCommand,
} from "@dokploy/server/services/registry";
import { createRollback } from "@dokploy/server/services/rollbacks";
import type { ApplicationNested } from "../builders";
export const uploadImageRemoteCommand = async (
application: ApplicationNested,
) => {
const registry = application.registry;
const buildRegistry = application.buildRegistry;
const rollbackRegistry = application.rollbackRegistry;
if (!registry && !buildRegistry && !rollbackRegistry) {
throw new Error("No registry found");
}
const { appName } = application;
const imageName =
application.sourceType === "docker"
? application.dockerImage || ""
: `${appName}:latest`;
const commands: string[] = [];
if (registry) {
const r = await findRegistryByIdWithCredentials(registry.registryId);
const registryTag = getRegistryTag(r, imageName);
if (registryTag) {
commands.push(`echo "π¦ [Enabled Registry Swarm]"`);
commands.push(getRegistryCommands(r, imageName, registryTag));
}
}
if (buildRegistry) {
const r = await findRegistryByIdWithCredentials(buildRegistry.registryId);
const buildRegistryTag = getRegistryTag(r, imageName);
if (buildRegistryTag) {
commands.push(`echo "π [Enabled Build Registry]"`);
commands.push(getRegistryCommands(r, imageName, buildRegistryTag));
commands.push(
`echo "β οΈ INFO: After the build is finished, you need to wait a few seconds for the server to download the image and run the container."`,
);
commands.push(
`echo "π Check the Logs tab to see when the container starts running."`,
);
}
}
if (rollbackRegistry && application.rollbackActive) {
const deployment = await findAllDeploymentsByApplicationId(
application.applicationId,
);
if (!deployment || !deployment[0]) {
throw new Error("Deployment not found");
}
const deploymentId = deployment[0].deploymentId;
const rollback = await createRollback({
appName: appName,
deploymentId: deploymentId,
});
const r = await findRegistryByIdWithCredentials(
rollbackRegistry.registryId,
);
const rollbackRegistryTag = getRegistryTag(r, rollback?.image || "");
if (rollbackRegistryTag) {
commands.push(`echo "π [Enabled Rollback Registry]"`);
commands.push(getRegistryCommands(r, imageName, rollbackRegistryTag));
}
}
try {
return commands.join("\n");
} catch (error) {
throw error;
}
};
/**
* Extract the repository name from imageName by taking the last part after '/'
* Examples:
* - "nginx" -> "nginx"
* - "nginx:latest" -> "nginx:latest"
* - "myuser/myrepo" -> "myrepo"
* - "myuser/myrepo:tag" -> "myrepo:tag"
* - "docker.io/myuser/myrepo" -> "myrepo"
*/
const extractRepositoryName = (imageName: string): string => {
const lastSlashIndex = imageName.lastIndexOf("/");
// If no '/', return the imageName as is
if (lastSlashIndex === -1) {
return imageName;
}
// Extract everything after the last '/'
return imageName.substring(lastSlashIndex + 1);
};
export const getRegistryTag = (registry: Registry, imageName: string) => {
const { registryUrl, imagePrefix, username } = registry;
// Extract the repository name (last part after '/')
const repositoryName = extractRepositoryName(imageName);
// Build the final tag using registry's username/prefix (must be lowercase for valid image refs)
const targetPrefix = (imagePrefix || username).toLowerCase();
const finalRegistry = registryUrl || "";
return finalRegistry
? `${finalRegistry}/${targetPrefix}/${repositoryName}`
: `${targetPrefix}/${repositoryName}`;
};
const getRegistryCommands = (
registry: Registry,
imageName: string,
registryTag: string,
): string => {
const loginCmd = safeDockerLoginCommand(
registry.registryUrl,
registry.username,
registry.password,
);
return `
echo "π¦ [Enabled Registry] Uploading image to '${registry.registryType}' | '${registryTag}'" ;
${loginCmd} || {
echo "β DockerHub Failed" ;
exit 1;
}
echo "β
Registry Login Success" ;
docker tag ${imageName} ${registryTag} || {
echo "β Error tagging image" ;
exit 1;
}
echo "β
Image Tagged" ;
docker push ${registryTag} || {
echo "β Error pushing image" ;
exit 1;
}
echo "β
Image Pushed" ;
`;
};