Compare commits

...

63 Commits
wip ... v0.10.4

Author SHA1 Message Date
Mauricio Siu
a93f18eb4a Merge pull request #599 from Dokploy/canary
v0.10.4
2024-10-25 21:35:15 -06:00
Mauricio Siu
77e9617770 chore(version): bump version 2024-10-25 21:18:04 -06:00
Mauricio Siu
21e97b0175 Merge pull request #598 from Dokploy/593-use-advertise_addr-from-environment-variable-in-dokpoy-service
feat(dokploy): add env for ADVERTISE_ADDR to installation #593
2024-10-25 20:50:58 -06:00
Mauricio Siu
a6618a14d5 feat(dokploy): add env for ADVERTISE_ADDR to installation #593 2024-10-25 20:48:46 -06:00
Mauricio Siu
59308ab013 Merge pull request #596 from Dokploy/595-dokploy-internal-postgres-database-is-publicly-accessible-by-default
fix(dokploy): remove expose ports in production
2024-10-25 20:19:14 -06:00
Mauricio Siu
e19c8d7a7a fix(dokploy): remove expose ports in production 2024-10-25 17:09:06 -06:00
Mauricio Siu
421c93795b refactor(dokploy): prevent start worker when is cloud 2024-10-25 16:56:32 -06:00
Mauricio Siu
182f908c31 chore: add new sponsor 2024-10-25 10:20:56 -06:00
Mauricio Siu
20616363e9 refactor: update badge server 2024-10-25 00:39:34 -06:00
Mauricio Siu
d85073b26d Merge pull request #591 from Dokploy/feat/remove-build-on-server
Feat/remove build on server
2024-10-25 00:23:56 -06:00
Mauricio Siu
303d1b1b87 chore: add missing command 2024-10-25 00:21:12 -06:00
Mauricio Siu
60d4e1ba63 chore: update dockerfiles 2024-10-25 00:17:10 -06:00
Mauricio Siu
83d52b68f0 refactor: update 2024-10-25 00:05:55 -06:00
Mauricio Siu
af3b1a27f4 refactor: update tests 2024-10-24 23:57:40 -06:00
Mauricio Siu
7f94593c07 chore: revert ci/cd 2024-10-24 23:35:21 -06:00
Mauricio Siu
5df7654873 chore: update imports 2024-10-24 23:33:15 -06:00
Mauricio Siu
054836fd4c chore: update workflows 2024-10-24 23:28:52 -06:00
Mauricio Siu
484ead1f1f chore: update workflows 2024-10-24 23:26:06 -06:00
Mauricio Siu
fbada4c5de chore: set right filter pnpm dockerfile 2024-10-24 23:22:23 -06:00
Mauricio Siu
491113416b chore: remove server build 2024-10-24 23:20:51 -06:00
Mauricio Siu
c42f5cb799 refactor: update 2024-10-24 23:18:23 -06:00
Mauricio Siu
47aa223f87 refactor: remove save on build on next app and integrate turbopack 2024-10-24 23:13:24 -06:00
Mauricio Siu
554ac59b97 Merge pull request #589 from alok-debnath/typo-fixes
Typo fixes in README.md
2024-10-24 13:43:28 -06:00
Alok Debnath
0247898876 minor typo fixes in README.md for better readability 2024-10-25 00:06:09 +05:30
Mauricio Siu
467acc4d4d Merge pull request #586 from Dokploy/canary
v0.10.3
2024-10-24 01:21:17 -06:00
Mauricio Siu
fc2778db35 Merge pull request #585 from Dokploy/505-mongodb-backup-is-empty-in-output-pipeline
fix(dokploy): add missing --archive to mongodump
2024-10-24 01:14:10 -06:00
Mauricio Siu
85d6ff9012 chore(version): bump version 2024-10-24 01:11:43 -06:00
Mauricio Siu
522f8baec7 fix(dokploy): add missing --archive to mongodump 2024-10-24 01:07:02 -06:00
Mauricio Siu
01e5cf0852 Merge pull request #580 from Dokploy/canary
v0.10.2
2024-10-22 21:17:38 -06:00
Mauricio Siu
df9fad088f Merge pull request #567 from Dokploy/canary
v0.10.1
2024-10-18 23:12:12 -06:00
Mauricio Siu
2644b638d1 Merge pull request #553 from Dokploy/canary
v0.10.0
2024-10-13 16:30:00 -06:00
Mauricio Siu
acd722678e Merge pull request #521 from Dokploy/canary
v0.9.4
2024-10-03 02:12:03 -06:00
Mauricio Siu
727e50648e Merge pull request #501 from Dokploy/canary
v0.9.3
2024-09-29 16:30:43 -06:00
Mauricio Siu
349bc89851 Merge pull request #500 from Dokploy/canary
v0.9.2
2024-09-29 14:16:56 -06:00
Mauricio Siu
9f6f872536 Merge pull request #495 from Dokploy/canary
v0.9.1
2024-09-28 12:00:04 -06:00
Mauricio Siu
e378d89477 Merge pull request #475 from Dokploy/canary
v0.9.0
2024-09-22 19:38:12 -06:00
Mauricio Siu
63e7eacae9 chore(version): bump version 2024-09-19 16:37:00 -06:00
Mauricio Siu
f4ab588516 Merge pull request #466 from Dokploy/canary
v0.8.3
2024-09-19 16:01:27 -06:00
Mauricio Siu
4d8a0ba58f Merge pull request #457 from Dokploy/canary
v0.8.2
2024-09-16 15:57:20 -06:00
Mauricio Siu
e88cd11041 Merge pull request #427 from Dokploy/canary
v0.8.1
2024-09-07 13:25:36 -06:00
Mauricio Siu
5f174a883b Merge pull request #424 from Dokploy/canary
v0.8.0
2024-09-07 00:55:08 -06:00
Mauricio Siu
536a6ba2ff Merge pull request #397 from Dokploy/canary
v0.7.3
2024-08-30 00:27:59 -06:00
Mauricio Siu
213fa08210 Merge pull request #382 from Dokploy/canary
v0.7.2
2024-08-26 15:52:49 -06:00
Mauricio Siu
d5c6a601d8 Merge pull request #367 from Dokploy/canary
v0.7.1
2024-08-19 16:03:39 -06:00
Mauricio Siu
452793c8e5 Merge pull request #359 from Dokploy/canary
v0.7.0
2024-08-18 10:26:52 -06:00
Mauricio Siu
385fbf4af5 Merge pull request #355 from Dokploy/canary
v0.6.3
2024-08-16 22:26:35 -06:00
Mauricio Siu
3590f3bed2 Merge pull request #332 from Dokploy/canary
v0.6.2
2024-08-07 21:48:49 -06:00
Mauricio Siu
9b2fcaea31 Merge pull request #317 from Dokploy/canary
v0.6.1
2024-08-03 15:46:05 -06:00
Mauricio Siu
5abcc82215 Merge pull request #312 from Dokploy/canary
v0.6.0
2024-08-02 10:47:43 -06:00
Mauricio Siu
ee855452e3 Merge pull request #303 from Dokploy/canary
chore: add slash to version
2024-08-01 02:06:43 -06:00
Mauricio Siu
d000b526d3 Merge pull request #302 from Dokploy/canary
v0.5.1
2024-08-01 01:58:15 -06:00
Mauricio Siu
9bf88b90c3 Merge pull request #280 from Dokploy/canary
v0.5.0
2024-07-27 15:20:43 -06:00
Mauricio Siu
b1a48d4636 refactor: update job 2024-07-22 03:51:07 -06:00
Mauricio Siu
c34c4b244e Merge pull request #251 from Dokploy/canary
v0.4.0
2024-07-22 03:38:47 -06:00
Mauricio Siu
bb59a0cd3f Merge pull request #230 from Dokploy/canary
v0.3.3
2024-07-18 00:11:10 -06:00
Mauricio Siu
44e6a117dd Merge pull request #208 from Dokploy/canary
v0.3.2
2024-07-11 23:21:32 -06:00
Mauricio Siu
bfdc73f8d1 Merge pull request #197 from Dokploy/canary
v0.3.1
2024-07-06 12:01:07 -06:00
Mauricio Siu
64ada7020a Merge pull request #185 from Dokploy/canary
v0.3.0
2024-07-01 00:01:16 -06:00
Mauricio Siu
4706adc0c0 Merge pull request #174 from Dokploy/canary
v0.2.5
2024-06-29 13:29:39 -06:00
Mauricio Siu
e01d92d1d9 Merge pull request #161 from Dokploy/canary
v0.2.4
2024-06-23 19:40:45 -06:00
Mauricio Siu
fe22890311 Merge pull request #156 from Dokploy/canary
v0.2.3
2024-06-21 11:50:40 -06:00
Mauricio Siu
2b7c7632f4 Merge pull request #136 from Dokploy/canary
v0.2.2
2024-06-08 22:06:39 -06:00
Mauricio Siu
1b7244e841 Merge pull request #127 from Dokploy/canary
v0.2.1
2024-06-07 02:52:03 -06:00
128 changed files with 1107 additions and 490 deletions

View File

@@ -71,10 +71,9 @@ Run the command that will spin up all the required services and files.
pnpm run dokploy:setup pnpm run dokploy:setup
``` ```
Build the server package (If you make any changes after in the packages/server folder, you need to rebuild and run this command) Run this script
```bash ```bash
pnpm run server:build pnpm run server:script
``` ```
Now run the development server. Now run the development server.

View File

@@ -15,6 +15,7 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile
# Deploy only the dokploy app # Deploy only the dokploy app
ENV NODE_ENV=production ENV NODE_ENV=production
RUN pnpm --filter=@dokploy/server switch:prod
RUN pnpm --filter=@dokploy/server build RUN pnpm --filter=@dokploy/server build
RUN pnpm --filter=./apps/dokploy run build RUN pnpm --filter=./apps/dokploy run build

View File

@@ -15,6 +15,7 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm --filter=@dokploy/server
# Deploy only the dokploy app # Deploy only the dokploy app
ENV NODE_ENV=production ENV NODE_ENV=production
RUN pnpm --filter=@dokploy/server switch:prod
RUN pnpm --filter=@dokploy/server build RUN pnpm --filter=@dokploy/server build
RUN pnpm --filter=./apps/dokploy run build RUN pnpm --filter=./apps/dokploy run build

View File

@@ -15,6 +15,7 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm --filter=@dokploy/server
# Deploy only the dokploy app # Deploy only the dokploy app
ENV NODE_ENV=production ENV NODE_ENV=production
RUN pnpm --filter=@dokploy/server switch:prod
RUN pnpm --filter=@dokploy/server build RUN pnpm --filter=@dokploy/server build
RUN pnpm --filter=./apps/schedules run build RUN pnpm --filter=./apps/schedules run build

View File

@@ -15,6 +15,7 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm --filter=@dokploy/server
# Deploy only the dokploy app # Deploy only the dokploy app
ENV NODE_ENV=production ENV NODE_ENV=production
RUN pnpm --filter=@dokploy/server switch:prod
RUN pnpm --filter=@dokploy/server build RUN pnpm --filter=@dokploy/server build
RUN pnpm --filter=./apps/api run build RUN pnpm --filter=./apps/api run build

View File

@@ -15,29 +15,29 @@
</div> </div>
</div> </div>
<br /> <br />
Dokploy is a free self-hostable Platform as a Service (PaaS) that simplifies the deployment and management of applications and databases. Dokploy is a free, self-hostable Platform as a Service (PaaS) that simplifies the deployment and management of applications and databases.
### Features ### Features
Dokploy include multiples features to make your life easier. Dokploy includes multiple features to make your life easier.
- **Applications**: Deploy any type of application (Node.js, PHP, Python, Go, Ruby, etc.). - **Applications**: Deploy any type of application (Node.js, PHP, Python, Go, Ruby, etc.).
- **Databases**: Create and manage databases with support for MySQL, PostgreSQL, MongoDB, MariaDB, Redis. - **Databases**: Create and manage databases with support for MySQL, PostgreSQL, MongoDB, MariaDB, and Redis.
- **Backups**: Automate backups for databases to a external storage destination. - **Backups**: Automate backups for databases to an external storage destination.
- **Docker Compose**: Native support for Docker Compose to manage complex applications. - **Docker Compose**: Native support for Docker Compose to manage complex applications.
- **Multi Node**: Scale applications to multiples nodes using docker swarm to manage the cluster. - **Multi Node**: Scale applications to multiple nodes using Docker Swarm to manage the cluster.
- **Templates**: Deploy in a single click open source templates (Plausible, Pocketbase, Calcom, etc.). - **Templates**: Deploy open-source templates (Plausible, Pocketbase, Calcom, etc.) with a single click.
- **Traefik Integration**: Automatically integrates with Traefik for routing and load balancing. - **Traefik Integration**: Automatically integrates with Traefik for routing and load balancing.
- **Real-time Monitoring**: Monitor CPU, memory, storage, and network usage, for every resource. - **Real-time Monitoring**: Monitor CPU, memory, storage, and network usage for every resource.
- **Docker Management**: Easily deploy and manage Docker containers. - **Docker Management**: Easily deploy and manage Docker containers.
- **CLI/API**: Manage your applications and databases using the command line or through the API. - **CLI/API**: Manage your applications and databases using the command line or through the API.
- **Notifications**: Get notified when your deployments are successful or failed (Slack, Discord, Telegram, Email, etc.) - **Notifications**: Get notified when your deployments succeed or fail (via Slack, Discord, Telegram, Email, etc.).
- **Multi Server**: Deploy and manager your applications remotely to external servers. - **Multi Server**: Deploy and manage your applications remotely to external servers.
- **Self-Hosted**: Self-host Dokploy on your VPS. - **Self-Hosted**: Self-host Dokploy on your VPS.
## 🚀 Getting Started ## 🚀 Getting Started
To get started run the following command in a VPS: To get started, run the following command on a VPS:
```bash ```bash
curl -sSL https://dokploy.com/install.sh | sh curl -sSL https://dokploy.com/install.sh | sh
@@ -90,6 +90,8 @@ For detailed documentation, visit [docs.dokploy.com](https://docs.dokploy.com).
<div style="display: flex; gap: 30px; flex-wrap: wrap;"> <div style="display: flex; gap: 30px; flex-wrap: wrap;">
<a href="https://steamsets.com/?ref=dokploy"><img src="https://avatars.githubusercontent.com/u/111978405?s=200&v=4" width="60px" alt="Steamsets.com"/></a> <a href="https://steamsets.com/?ref=dokploy"><img src="https://avatars.githubusercontent.com/u/111978405?s=200&v=4" width="60px" alt="Steamsets.com"/></a>
<a href="https://rivo.gg/?ref=dokploy"><img src="https://avatars.githubusercontent.com/u/126797452?s=200&v=4" width="60px" alt="Rivo.gg"/></a> <a href="https://rivo.gg/?ref=dokploy"><img src="https://avatars.githubusercontent.com/u/126797452?s=200&v=4" width="60px" alt="Rivo.gg"/></a>
<a href="https://photoquest.wedding/?ref=dokploy"><img src="https://photoquest.wedding/favicon/android-chrome-512x512.png" width="60px" alt="Rivo.gg"/></a>
</div> </div>
#### Organizations: #### Organizations:

View File

@@ -9,7 +9,7 @@ import {
rebuildRemoteCompose, rebuildRemoteCompose,
updateApplicationStatus, updateApplicationStatus,
updateCompose, updateCompose,
} from "@dokploy/server"; } from "@dokploy/server/dist";
import type { DeployJob } from "./schema"; import type { DeployJob } from "./schema";
import type { LemonSqueezyLicenseResponse } from "./types"; import type { LemonSqueezyLicenseResponse } from "./types";

View File

@@ -15,13 +15,13 @@ description: '学习如何在服务器上手动安装 Dokploy。'
```bash ```bash
#!/bin/bash #!/bin/bash
# 确保以根用户身份运行脚本 # Ensure the script is run as root
if [ "$(id -u)" != "0" ]; then if [ "$(id -u)" != "0" ]; then
echo "This script must be run as root" >&2 echo "This script must be run as root" >&2
exit 1 exit 1
fi fi
# 检查 Linux 操作系统(非 macOS 或 Docker 容器内的操作系统) # Check for Linux OS (not macOS or inside a Docker container)
if [ "$(uname)" = "Darwin" ]; then if [ "$(uname)" = "Darwin" ]; then
echo "This script must be run on Linux" >&2 echo "This script must be run on Linux" >&2
exit 1 exit 1
@@ -32,7 +32,7 @@ if [ -f /.dockerenv ]; then
exit 1 exit 1
fi fi
# 检查端口是否被占用 # Check for occupied ports
if ss -tulnp | grep ':80 ' >/dev/null; then if ss -tulnp | grep ':80 ' >/dev/null; then
echo "Error: Port 80 is already in use" >&2 echo "Error: Port 80 is already in use" >&2
exit 1 exit 1
@@ -43,32 +43,53 @@ if ss -tulnp | grep ':443 ' >/dev/null; then
exit 1 exit 1
fi fi
# 检查命令是否存在 # Function to check if a command exists
command_exists() { command_exists() {
command -v "$@" > /dev/null 2>&1 command -v "$@" > /dev/null 2>&1
} }
# 如果未安装 Docker 则安装 # Install Docker if it is not installed
if command_exists docker; then if command_exists docker; then
echo "Docker already installed" echo "Docker already installed"
else else
curl -sSL https://get.docker.com | sh curl -sSL https://get.docker.com | sh
fi fi
# 初始化 Docker Swarm # Initialize Docker Swarm
docker swarm leave --force 2>/dev/null docker swarm leave --force 2>/dev/null
advertise_addr=$(curl -s ifconfig.me)
docker swarm init --advertise-addr $advertise_addr
echo "Swarm initialized"
# 创建网络 get_ip() {
docker network rm -f dokploy-network 2>/dev/null # Try to get IPv4
docker network create --driver overlay --attachable dokploy-network local ipv4=$(curl -4s https://ifconfig.io 2>/dev/null)
echo "Network created"
# 准备配置目录 if [ -n "$ipv4" ]; then
mkdir -p /etc/dokploy echo "$ipv4"
chmod -R 777 /etc/dokploy else
# Try to get IPv6
local ipv6=$(curl -6s https://ifconfig.io 2>/dev/null)
if [ -n "$ipv6" ]; then
echo "$ipv6"
fi
fi
}
advertise_addr="${ADVERTISE_ADDR:-$(get_ip)}"
docker swarm init --advertise-addr $advertise_addr
if [ $? -ne 0 ]; then
echo "Error: Failed to initialize Docker Swarm" >&2
exit 1
fi
docker network rm -f dokploy-network 2>/dev/null
docker network create --driver overlay --attachable dokploy-network
echo "Network created"
mkdir -p /etc/dokploy
chmod 777 /etc/dokploy
# Pull and deploy Dokploy # Pull and deploy Dokploy
docker pull dokploy/dokploy:latest docker pull dokploy/dokploy:latest
@@ -84,9 +105,10 @@ docker service create \
-e PORT=<Value For PORT eg(3000)> \ -e PORT=<Value For PORT eg(3000)> \
-e TRAEFIK_SSL_PORT=<Value For SSL PORT eg(444)> \ -e TRAEFIK_SSL_PORT=<Value For SSL PORT eg(444)> \
-e TRAEFIK_PORT=<VALUE FOR TRAEFIK HTTP PORT eg(81)> \ -e TRAEFIK_PORT=<VALUE FOR TRAEFIK HTTP PORT eg(81)> \
-e ADVERTISE_ADDR=$advertise_addr \
dokploy/dokploy:latest dokploy/dokploy:latest
# 输出成功消息 # Output success message
GREEN="\033[0;32m" GREEN="\033[0;32m"
YELLOW="\033[1;33m" YELLOW="\033[1;33m"
BLUE="\033[0;34m" BLUE="\033[0;34m"

View File

@@ -57,18 +57,39 @@ fi
# Initialize Docker Swarm # Initialize Docker Swarm
docker swarm leave --force 2>/dev/null docker swarm leave --force 2>/dev/null
advertise_addr=$(curl -s ifconfig.me)
docker swarm init --advertise-addr $advertise_addr
echo "Swarm initialized"
# Create network get_ip() {
docker network rm -f dokploy-network 2>/dev/null # Try to get IPv4
docker network create --driver overlay --attachable dokploy-network local ipv4=$(curl -4s https://ifconfig.io 2>/dev/null)
echo "Network created"
# Prepare configuration directory if [ -n "$ipv4" ]; then
mkdir -p /etc/dokploy echo "$ipv4"
chmod -R 777 /etc/dokploy else
# Try to get IPv6
local ipv6=$(curl -6s https://ifconfig.io 2>/dev/null)
if [ -n "$ipv6" ]; then
echo "$ipv6"
fi
fi
}
advertise_addr="${ADVERTISE_ADDR:-$(get_ip)}"
docker swarm init --advertise-addr $advertise_addr
if [ $? -ne 0 ]; then
echo "Error: Failed to initialize Docker Swarm" >&2
exit 1
fi
docker network rm -f dokploy-network 2>/dev/null
docker network create --driver overlay --attachable dokploy-network
echo "Network created"
mkdir -p /etc/dokploy
chmod 777 /etc/dokploy
# Pull and deploy Dokploy # Pull and deploy Dokploy
docker pull dokploy/dokploy:latest docker pull dokploy/dokploy:latest
@@ -84,6 +105,7 @@ docker service create \
-e PORT=<Value For PORT eg(3000)> \ -e PORT=<Value For PORT eg(3000)> \
-e TRAEFIK_SSL_PORT=<Value For SSL PORT eg(444)> \ -e TRAEFIK_SSL_PORT=<Value For SSL PORT eg(444)> \
-e TRAEFIK_PORT=<VALUE FOR TRAEFIK HTTP PORT eg(81)> \ -e TRAEFIK_PORT=<VALUE FOR TRAEFIK HTTP PORT eg(81)> \
-e ADVERTISE_ADDR=$advertise_addr \
dokploy/dokploy:latest dokploy/dokploy:latest
# Output success message # Output success message

View File

@@ -1,12 +1,23 @@
import fs from "node:fs/promises"; import fs from "node:fs/promises";
import path from "node:path"; import path from "node:path";
import { paths } from "@dokploy/server/dist/constants"; import { paths } from "@dokploy/server/constants";
const { APPLICATIONS_PATH } = paths(); const { APPLICATIONS_PATH } = paths();
import type { ApplicationNested } from "@dokploy/server"; import type { ApplicationNested } from "@dokploy/server";
import { unzipDrop } from "@dokploy/server"; import { unzipDrop } from "@dokploy/server";
import AdmZip from "adm-zip"; import AdmZip from "adm-zip";
import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
vi.mock("@dokploy/server/constants", async (importOriginal) => {
const actual = await importOriginal();
return {
// @ts-ignore
...actual,
paths: () => ({
APPLICATIONS_PATH: "./__test__/drop/zips/output",
}),
};
});
if (typeof window === "undefined") { if (typeof window === "undefined") {
const undici = require("undici"); const undici = require("undici");
globalThis.File = undici.File as any; globalThis.File = undici.File as any;
@@ -82,16 +93,6 @@ const baseApp: ApplicationNested = {
dockerContextPath: null, dockerContextPath: null,
}; };
vi.mock("@dokploy/server/dist/constants", async (importOriginal) => {
const actual = await importOriginal();
return {
// @ts-ignore
...actual,
paths: () => ({
APPLICATIONS_PATH: "./__test__/drop/zips/output",
}),
};
});
describe("unzipDrop using real zip files", () => { describe("unzipDrop using real zip files", () => {
// const { APPLICATIONS_PATH } = paths(); // const { APPLICATIONS_PATH } = paths();
beforeAll(async () => { beforeAll(async () => {

View File

@@ -1,13 +1,8 @@
import path from "node:path";
import tsconfigPaths from "vite-tsconfig-paths"; import tsconfigPaths from "vite-tsconfig-paths";
import { defineConfig } from "vitest/config"; import { defineConfig } from "vitest/config";
export default defineConfig({ export default defineConfig({
plugins: [
tsconfigPaths({
root: "./",
projects: ["tsconfig.json"],
}),
],
test: { test: {
include: ["__test__/**/*.test.ts"], // Incluir solo los archivos de test en el directorio __test__ include: ["__test__/**/*.test.ts"], // Incluir solo los archivos de test en el directorio __test__
exclude: ["**/node_modules/**", "**/dist/**", "**/.docker/**"], exclude: ["**/node_modules/**", "**/dist/**", "**/.docker/**"],
@@ -18,4 +13,12 @@ export default defineConfig({
NODE: "test", NODE: "test",
}, },
}, },
resolve: {
alias: {
"@dokploy/server": path.resolve(
__dirname,
"../../../packages/server/src",
),
},
},
}); });

View File

@@ -1,6 +1,6 @@
{ {
"name": "dokploy", "name": "dokploy",
"version": "v0.10.2", "version": "v0.10.4",
"private": true, "private": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"type": "module", "type": "module",
@@ -11,7 +11,7 @@
"build-next": "next build", "build-next": "next build",
"setup": "tsx -r dotenv/config setup.ts && sleep 5 && pnpm run migration:run", "setup": "tsx -r dotenv/config setup.ts && sleep 5 && pnpm run migration:run",
"reset-password": "node -r dotenv/config dist/reset-password.mjs", "reset-password": "node -r dotenv/config dist/reset-password.mjs",
"dev": "tsx -r dotenv/config ./server/server.ts --project tsconfig.server.json ", "dev": "TURBOPACK=1 tsx -r dotenv/config ./server/server.ts --project tsconfig.server.json ",
"studio": "drizzle-kit studio --config ./server/db/drizzle.config.ts", "studio": "drizzle-kit studio --config ./server/db/drizzle.config.ts",
"migration:generate": "drizzle-kit generate --config ./server/db/drizzle.config.ts", "migration:generate": "drizzle-kit generate --config ./server/db/drizzle.config.ts",
"migration:run": "tsx -r dotenv/config migration.ts", "migration:run": "tsx -r dotenv/config migration.ts",
@@ -90,7 +90,7 @@
"lucia": "^3.0.1", "lucia": "^3.0.1",
"lucide-react": "^0.312.0", "lucide-react": "^0.312.0",
"nanoid": "3", "nanoid": "3",
"next": "^14.1.3", "next": "^15.0.1",
"next-themes": "^0.2.1", "next-themes": "^0.2.1",
"node-pty": "1.0.0", "node-pty": "1.0.0",
"node-schedule": "2.1.1", "node-schedule": "2.1.1",

View File

@@ -1,6 +1,6 @@
import { db } from "@/server/db"; import { db } from "@/server/db";
import { applications } from "@/server/db/schema"; import { applications } from "@/server/db/schema";
import type { DeploymentJob } from "@/server/queues/deployments-queue"; import type { DeploymentJob } from "@/server/queues/queue-types";
import { myQueue } from "@/server/queues/queueSetup"; import { myQueue } from "@/server/queues/queueSetup";
import { deploy } from "@/server/utils/deploy"; import { deploy } from "@/server/utils/deploy";
import { IS_CLOUD } from "@dokploy/server"; import { IS_CLOUD } from "@dokploy/server";

View File

@@ -1,6 +1,6 @@
import { db } from "@/server/db"; import { db } from "@/server/db";
import { compose } from "@/server/db/schema"; import { compose } from "@/server/db/schema";
import type { DeploymentJob } from "@/server/queues/deployments-queue"; import type { DeploymentJob } from "@/server/queues/queue-types";
import { myQueue } from "@/server/queues/queueSetup"; import { myQueue } from "@/server/queues/queueSetup";
import { deploy } from "@/server/utils/deploy"; import { deploy } from "@/server/utils/deploy";
import { IS_CLOUD } from "@dokploy/server"; import { IS_CLOUD } from "@dokploy/server";

View File

@@ -1,6 +1,6 @@
import { db } from "@/server/db"; import { db } from "@/server/db";
import { applications, compose, github } from "@/server/db/schema"; import { applications, compose, github } from "@/server/db/schema";
import type { DeploymentJob } from "@/server/queues/deployments-queue"; import type { DeploymentJob } from "@/server/queues/queue-types";
import { myQueue } from "@/server/queues/queueSetup"; import { myQueue } from "@/server/queues/queueSetup";
import { deploy } from "@/server/utils/deploy"; import { deploy } from "@/server/utils/deploy";
import { IS_CLOUD } from "@dokploy/server"; import { IS_CLOUD } from "@dokploy/server";

View File

@@ -110,9 +110,11 @@ const Service = (
<div className="flex flex-row h-fit w-fit gap-2"> <div className="flex flex-row h-fit w-fit gap-2">
<Badge <Badge
variant={ variant={
data?.server?.serverStatus === "active" !data?.serverId
? "default" ? "default"
: "destructive" : data?.server?.serverStatus === "active"
? "default"
: "destructive"
} }
> >
{data?.server?.name || "Dokploy Server"} {data?.server?.name || "Dokploy Server"}

View File

@@ -105,9 +105,11 @@ const Service = (
<div className="flex flex-row h-fit w-fit gap-2"> <div className="flex flex-row h-fit w-fit gap-2">
<Badge <Badge
variant={ variant={
data?.server?.serverStatus === "active" !data?.serverId
? "default" ? "default"
: "destructive" : data?.server?.serverStatus === "active"
? "default"
: "destructive"
} }
> >
{data?.server?.name || "Dokploy Server"} {data?.server?.name || "Dokploy Server"}

View File

@@ -93,9 +93,11 @@ const Mariadb = (
<div className="flex flex-row h-fit w-fit gap-2"> <div className="flex flex-row h-fit w-fit gap-2">
<Badge <Badge
variant={ variant={
data?.server?.serverStatus === "active" !data?.serverId
? "default" ? "default"
: "destructive" : data?.server?.serverStatus === "active"
? "default"
: "destructive"
} }
> >
{data?.server?.name || "Dokploy Server"} {data?.server?.name || "Dokploy Server"}

View File

@@ -94,9 +94,11 @@ const Mongo = (
<div className="flex flex-row h-fit w-fit gap-2"> <div className="flex flex-row h-fit w-fit gap-2">
<Badge <Badge
variant={ variant={
data?.server?.serverStatus === "active" !data?.serverId
? "default" ? "default"
: "destructive" : data?.server?.serverStatus === "active"
? "default"
: "destructive"
} }
> >
{data?.server?.name || "Dokploy Server"} {data?.server?.name || "Dokploy Server"}

View File

@@ -92,9 +92,11 @@ const MySql = (
<div className="flex flex-row h-fit w-fit gap-2"> <div className="flex flex-row h-fit w-fit gap-2">
<Badge <Badge
variant={ variant={
data?.server?.serverStatus === "active" !data?.serverId
? "default" ? "default"
: "destructive" : data?.server?.serverStatus === "active"
? "default"
: "destructive"
} }
> >
{data?.server?.name || "Dokploy Server"} {data?.server?.name || "Dokploy Server"}

View File

@@ -93,9 +93,11 @@ const Postgresql = (
<div className="flex flex-row h-fit w-fit gap-2"> <div className="flex flex-row h-fit w-fit gap-2">
<Badge <Badge
variant={ variant={
data?.server?.serverStatus === "active" !data?.serverId
? "default" ? "default"
: "destructive" : data?.server?.serverStatus === "active"
? "default"
: "destructive"
} }
> >
{data?.server?.name || "Dokploy Server"} {data?.server?.name || "Dokploy Server"}

View File

@@ -92,9 +92,11 @@ const Redis = (
<div className="flex flex-row h-fit w-fit gap-2"> <div className="flex flex-row h-fit w-fit gap-2">
<Badge <Badge
variant={ variant={
data?.server?.serverStatus === "active" !data?.serverId
? "default" ? "default"
: "destructive" : data?.server?.serverStatus === "active"
? "default"
: "destructive"
} }
> >
{data?.server?.name || "Dokploy Server"} {data?.server?.name || "Dokploy Server"}

View File

@@ -19,11 +19,8 @@ import {
apiUpdateApplication, apiUpdateApplication,
applications, applications,
} from "@/server/db/schema"; } from "@/server/db/schema";
import { import type { DeploymentJob } from "@/server/queues/queue-types";
type DeploymentJob, import { cleanQueuesByApplication, myQueue } from "@/server/queues/queueSetup";
cleanQueuesByApplication,
} from "@/server/queues/deployments-queue";
import { myQueue } from "@/server/queues/queueSetup";
import { deploy } from "@/server/utils/deploy"; import { deploy } from "@/server/utils/deploy";
import { uploadFileSchema } from "@/utils/schema"; import { uploadFileSchema } from "@/utils/schema";
import { import {

View File

@@ -9,11 +9,7 @@ import {
apiUpdateCompose, apiUpdateCompose,
compose, compose,
} from "@/server/db/schema"; } from "@/server/db/schema";
import { import { cleanQueuesByCompose, myQueue } from "@/server/queues/queueSetup";
type DeploymentJob,
cleanQueuesByCompose,
} from "@/server/queues/deployments-queue";
import { myQueue } from "@/server/queues/queueSetup";
import { templates } from "@/templates/templates"; import { templates } from "@/templates/templates";
import type { TemplatesKeys } from "@/templates/types/templates-data.type"; import type { TemplatesKeys } from "@/templates/types/templates-data.type";
import { import {
@@ -28,6 +24,7 @@ import _ from "lodash";
import { nanoid } from "nanoid"; import { nanoid } from "nanoid";
import { createTRPCRouter, protectedProcedure } from "../trpc"; import { createTRPCRouter, protectedProcedure } from "../trpc";
import type { DeploymentJob } from "@/server/queues/queue-types";
import { deploy } from "@/server/utils/deploy"; import { deploy } from "@/server/utils/deploy";
import { import {
IS_CLOUD, IS_CLOUD,
@@ -41,7 +38,6 @@ import {
createComposeByTemplate, createComposeByTemplate,
createDomain, createDomain,
createMount, createMount,
findAdmin,
findAdminById, findAdminById,
findComposeById, findComposeById,
findDomainsByComposeId, findDomainsByComposeId,

View File

@@ -1 +1 @@
export * from "@dokploy/server/dist/db/schema"; export * from "@dokploy/server/db/schema";

View File

@@ -11,29 +11,8 @@ import {
updateCompose, updateCompose,
} from "@dokploy/server"; } from "@dokploy/server";
import { type Job, Worker } from "bullmq"; import { type Job, Worker } from "bullmq";
import { myQueue, redisConfig } from "./queueSetup"; import type { DeploymentJob } from "./queue-types";
import { redisConfig } from "./redis-connection";
type DeployJob =
| {
applicationId: string;
titleLog: string;
descriptionLog: string;
server?: boolean;
type: "deploy" | "redeploy";
applicationType: "application";
serverId?: string;
}
| {
composeId: string;
titleLog: string;
descriptionLog: string;
server?: boolean;
type: "deploy" | "redeploy";
applicationType: "compose";
serverId?: string;
};
export type DeploymentJob = DeployJob;
export const deploymentWorker = new Worker( export const deploymentWorker = new Worker(
"deployments", "deployments",
@@ -114,25 +93,3 @@ export const deploymentWorker = new Worker(
connection: redisConfig, connection: redisConfig,
}, },
); );
export const cleanQueuesByApplication = async (applicationId: string) => {
const jobs = await myQueue.getJobs(["waiting", "delayed"]);
for (const job of jobs) {
if (job?.data?.applicationId === applicationId) {
await job.remove();
console.log(`Removed job ${job.id} for application ${applicationId}`);
}
}
};
export const cleanQueuesByCompose = async (composeId: string) => {
const jobs = await myQueue.getJobs(["waiting", "delayed"]);
for (const job of jobs) {
if (job?.data?.composeId === composeId) {
await job.remove();
console.log(`Removed job ${job.id} for compose ${composeId}`);
}
}
};

View File

@@ -0,0 +1,21 @@
type DeployJob =
| {
applicationId: string;
titleLog: string;
descriptionLog: string;
server?: boolean;
type: "deploy" | "redeploy";
applicationType: "application";
serverId?: string;
}
| {
composeId: string;
titleLog: string;
descriptionLog: string;
server?: boolean;
type: "deploy" | "redeploy";
applicationType: "compose";
serverId?: string;
};
export type DeploymentJob = DeployJob;

View File

@@ -1,8 +1,6 @@
import { type ConnectionOptions, Queue } from "bullmq"; import { Queue } from "bullmq";
import { redisConfig } from "./redis-connection";
export const redisConfig: ConnectionOptions = {
host: process.env.NODE_ENV === "production" ? "dokploy-redis" : "127.0.0.1",
};
const myQueue = new Queue("deployments", { const myQueue = new Queue("deployments", {
connection: redisConfig, connection: redisConfig,
}); });
@@ -21,4 +19,26 @@ myQueue.on("error", (error) => {
} }
}); });
export const cleanQueuesByApplication = async (applicationId: string) => {
const jobs = await myQueue.getJobs(["waiting", "delayed"]);
for (const job of jobs) {
if (job?.data?.applicationId === applicationId) {
await job.remove();
console.log(`Removed job ${job.id} for application ${applicationId}`);
}
}
};
export const cleanQueuesByCompose = async (composeId: string) => {
const jobs = await myQueue.getJobs(["waiting", "delayed"]);
for (const job of jobs) {
if (job?.data?.composeId === composeId) {
await job.remove();
console.log(`Removed job ${job.id} for compose ${composeId}`);
}
}
};
export { myQueue }; export { myQueue };

View File

@@ -0,0 +1,5 @@
import type { ConnectionOptions } from "bullmq";
export const redisConfig: ConnectionOptions = {
host: process.env.NODE_ENV === "production" ? "dokploy-redis" : "127.0.0.1",
};

View File

@@ -19,15 +19,12 @@ import { setupDockerContainerLogsWebSocketServer } from "./wss/docker-container-
import { setupDockerContainerTerminalWebSocketServer } from "./wss/docker-container-terminal"; import { setupDockerContainerTerminalWebSocketServer } from "./wss/docker-container-terminal";
import { setupDockerStatsMonitoringSocketServer } from "./wss/docker-stats"; import { setupDockerStatsMonitoringSocketServer } from "./wss/docker-stats";
import { setupDeploymentLogsWebSocketServer } from "./wss/listen-deployment"; import { setupDeploymentLogsWebSocketServer } from "./wss/listen-deployment";
import { import { setupTerminalWebSocketServer } from "./wss/terminal";
getPublicIpWithFallback,
setupTerminalWebSocketServer,
} from "./wss/terminal";
config({ path: ".env" }); config({ path: ".env" });
const PORT = Number.parseInt(process.env.PORT || "3000", 10); const PORT = Number.parseInt(process.env.PORT || "3000", 10);
const dev = process.env.NODE_ENV !== "production"; const dev = process.env.NODE_ENV !== "production";
const app = next({ dev }); const app = next({ dev, turbopack: dev });
const handle = app.getRequestHandler(); const handle = app.getRequestHandler();
void app.prepare().then(async () => { void app.prepare().then(async () => {
try { try {
@@ -55,7 +52,6 @@ void app.prepare().then(async () => {
await initializeRedis(); await initializeRedis();
initCronJobs(); initCronJobs();
welcomeServer();
// Timeout to wait for the database to be ready // Timeout to wait for the database to be ready
await new Promise((resolve) => setTimeout(resolve, 7000)); await new Promise((resolve) => setTimeout(resolve, 7000));
@@ -78,18 +74,3 @@ void app.prepare().then(async () => {
console.error("Main Server Error", e); console.error("Main Server Error", e);
} }
}); });
async function welcomeServer() {
const ip = await getPublicIpWithFallback();
console.log(
[
"",
"",
"Dokploy server is up and running!",
"Please wait for 15 seconds before opening the browser.",
` http://${ip}:${PORT}`,
"",
"",
].join("\n"),
);
}

View File

@@ -1,5 +1,5 @@
import { findServerById } from "@dokploy/server"; import { findServerById } from "@dokploy/server";
import type { DeploymentJob } from "../queues/deployments-queue"; import type { DeploymentJob } from "../queues/queue-types";
export const deploy = async (jobData: DeploymentJob) => { export const deploy = async (jobData: DeploymentJob) => {
try { try {

View File

@@ -3,15 +3,15 @@ import {
createDefaultServerTraefikConfig, createDefaultServerTraefikConfig,
createDefaultTraefikConfig, createDefaultTraefikConfig,
initializeTraefik, initializeTraefik,
} from "@dokploy/server/dist/setup/traefik-setup"; } from "@dokploy/server/setup/traefik-setup";
import { setupDirectories } from "@dokploy/server/dist/setup/config-paths"; import { setupDirectories } from "@dokploy/server/setup/config-paths";
import { initializePostgres } from "@dokploy/server/dist/setup/postgres-setup"; import { initializePostgres } from "@dokploy/server/setup/postgres-setup";
import { initializeRedis } from "@dokploy/server/dist/setup/redis-setup"; import { initializeRedis } from "@dokploy/server/setup/redis-setup";
import { import {
initializeNetwork, initializeNetwork,
initializeSwarm, initializeSwarm,
} from "@dokploy/server/dist/setup/setup"; } from "@dokploy/server/setup/setup";
(async () => { (async () => {
try { try {
setupDirectories(); setupDirectories();

View File

@@ -26,7 +26,8 @@
/* Path Aliases */ /* Path Aliases */
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {
"@/*": ["./*"] "@/*": ["./*"],
"@dokploy/server/*": ["../../packages/server/src/*"]
} }
}, },

View File

@@ -9,7 +9,8 @@
"moduleResolution": "Node", "moduleResolution": "Node",
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {
"@/*": ["./*"] "@/*": ["./*"],
"@dokploy/server/*": ["../../packages/server/src/*"]
} }
}, },
"include": ["next-env.d.ts", "./server/**/*"] "include": ["next-env.d.ts", "./server/**/*"]

View File

@@ -8,7 +8,7 @@ import {
runMongoBackup, runMongoBackup,
runMySqlBackup, runMySqlBackup,
runPostgresBackup, runPostgresBackup,
} from "@dokploy/server"; } from "@dokploy/server/dist";
import { db } from "@dokploy/server/dist/db"; import { db } from "@dokploy/server/dist/db";
import { backups, server } from "@dokploy/server/dist/db/schema"; import { backups, server } from "@dokploy/server/dist/db/schema";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";

View File

@@ -305,6 +305,19 @@ export const ShowSponsors = () => {
alt="Rivo.gg" alt="Rivo.gg"
/> />
</a> </a>
<a
href="https://photoquest.wedding/?ref=dokploy"
target="_blank"
rel="noreferrer"
>
<img
src="https://photoquest.wedding/favicon/android-chrome-512x512.png"
className="rounded-xl"
width="60px"
alt="Rivo.gg"
/>
</a>
</div> </div>
</div> </div>
<div className="flex flex-col gap-4 md:gap-8 justify-start"> <div className="flex flex-col gap-4 md:gap-8 justify-start">

View File

@@ -57,7 +57,7 @@ install_dokploy() {
fi fi
} }
advertise_addr=$(get_ip) advertise_addr="${ADVERTISE_ADDR:-$(get_ip)}"
docker swarm init --advertise-addr $advertise_addr docker swarm init --advertise-addr $advertise_addr
@@ -92,6 +92,7 @@ install_dokploy() {
--update-order stop-first \ --update-order stop-first \
--constraint 'node.role == manager' \ --constraint 'node.role == manager' \
-e RELEASE_TAG=canary \ -e RELEASE_TAG=canary \
-e ADVERTISE_ADDR=$advertise_addr \
dokploy/dokploy:canary dokploy/dokploy:canary
GREEN="\033[0;32m" GREEN="\033[0;32m"

View File

@@ -41,7 +41,23 @@ install_dokploy() {
fi fi
docker swarm leave --force 2>/dev/null docker swarm leave --force 2>/dev/null
advertise_addr=$(curl -s ifconfig.me)
get_ip() {
# Try to get IPv4
local ipv4=$(curl -4s https://ifconfig.io 2>/dev/null)
if [ -n "$ipv4" ]; then
echo "$ipv4"
else
# Try to get IPv6
local ipv6=$(curl -6s https://ifconfig.io 2>/dev/null)
if [ -n "$ipv6" ]; then
echo "$ipv6"
fi
fi
}
advertise_addr="${ADVERTISE_ADDR:-$(get_ip)}"
docker swarm init --advertise-addr $advertise_addr docker swarm init --advertise-addr $advertise_addr
@@ -76,6 +92,7 @@ install_dokploy() {
--update-order stop-first \ --update-order stop-first \
--constraint 'node.role == manager' \ --constraint 'node.role == manager' \
-e RELEASE_TAG=feature \ -e RELEASE_TAG=feature \
-e ADVERTISE_ADDR=$advertise_addr \
dokploy/dokploy:feature dokploy/dokploy:feature
GREEN="\033[0;32m" GREEN="\033[0;32m"

View File

@@ -56,7 +56,7 @@ install_dokploy() {
fi fi
} }
advertise_addr=$(get_ip) advertise_addr="${ADVERTISE_ADDR:-$(get_ip)}"
docker swarm init --advertise-addr $advertise_addr docker swarm init --advertise-addr $advertise_addr
@@ -90,6 +90,7 @@ install_dokploy() {
--update-parallelism 1 \ --update-parallelism 1 \
--update-order stop-first \ --update-order stop-first \
--constraint 'node.role == manager' \ --constraint 'node.role == manager' \
-e ADVERTISE_ADDR=$advertise_addr \
dokploy/dokploy:latest dokploy/dokploy:latest
GREEN="\033[0;32m" GREEN="\033[0;32m"

View File

@@ -8,6 +8,7 @@
"dokploy:build": "pnpm --filter=dokploy run build", "dokploy:build": "pnpm --filter=dokploy run build",
"dokploy:start": "pnpm --filter=dokploy run start", "dokploy:start": "pnpm --filter=dokploy run start",
"test": "pnpm --filter=dokploy run test", "test": "pnpm --filter=dokploy run test",
"server:script": "pnpm --filter=server run switch:dev",
"server:dev": "pnpm --filter=server run dev", "server:dev": "pnpm --filter=server run dev",
"server:build": "pnpm --filter=server run build", "server:build": "pnpm --filter=server run build",
"docker:build:canary": "./apps/dokploy/docker/build.sh canary", "docker:build:canary": "./apps/dokploy/docker/build.sh canary",

View File

@@ -1,28 +1,28 @@
// import { build } from "esbuild"; import path from "node:path";
// import alias from "esbuild-plugin-alias"; import { fileURLToPath } from "node:url";
// import path from "node:path"; import { build } from "esbuild";
// import { fileURLToPath } from "node:url"; import alias from "esbuild-plugin-alias";
// const __filename = fileURLToPath(import.meta.url); // get the resolved path to the file const __filename = fileURLToPath(import.meta.url); // get the resolved path to the file
// const __dirname = path.dirname(__filename); const __dirname = path.dirname(__filename);
// build({ build({
// entryPoints: ["./src/**/*.ts"], entryPoints: ["./src/**/*.ts"],
// // outfile: "./dist/index.js", // outfile: "./dist/index.js",
// outdir: "./dist", outdir: "./dist",
// bundle: true, bundle: true,
// minify: false, minify: false,
// platform: "node", platform: "node",
// target: "esnext", target: "esnext",
// format: "esm", format: "esm",
// plugins: [ plugins: [
// alias({ alias({
// "@/server": path.resolve(__dirname, "src"), "@dokploy/server": path.resolve(__dirname, "src"),
// }), }),
// ], ],
// packages: "external", packages: "external",
// // Opcional: si deseas emitir declaraciones de tipos con esbuild-plugin-dts // Opcional: si deseas emitir declaraciones de tipos con esbuild-plugin-dts
// }) })
// .then(() => { .then(() => {
// console.log("Build successful"); console.log("Build successful");
// }) })
// .catch(() => process.exit(1)); .catch(() => process.exit(1));

View File

@@ -1,14 +1,42 @@
{ {
"name": "@dokploy/server", "name": "@dokploy/server",
"version": "1.0.0", "version": "1.0.0",
"main": "dist/index.js", "main": "./src/index.ts",
"types": "dist/index.d.ts",
"type": "module", "type": "module",
"exports": {
".": "./src/index.ts",
"./db": {
"import": "./src/db/index.ts",
"require": "./dist/db/index.cjs.js"
},
"./setup/*": {
"import": "./src/setup/*.ts",
"require": "./dist/setup/index.cjs.js"
},
"./constants": {
"import": "./src/constants/index.ts",
"require": "./dist/constants.cjs.js"
},
"./dist": {
"import": "./dist/index.js",
"require": "./dist/index.cjs.js"
},
"./dist/db": {
"import": "./dist/db/index.js",
"require": "./dist/db/*.cjs"
},
"./dist/db/schema": {
"import": "./dist/db/schema/index.js",
"require": "./dist/db/schema/*.cjs"
}
},
"scripts": { "scripts": {
"build": "rm -rf ./dist && tsc --project tsconfig.server.json && tsc-alias -p tsconfig.server.json", "build": "rm -rf ./dist && tsc --project tsconfig.server.json && tsc-alias -p tsconfig.server.json",
"build:types": "tsc --emitDeclarationOnly --experimenta-dts", "build:types": "tsc --emitDeclarationOnly --experimenta-dts",
"switch:dev": "node scripts/switchToSrc.js",
"switch:prod": "node scripts/switchToDist.js",
"dev": "rm -rf ./dist && pnpm esbuild && tsc --emitDeclarationOnly --outDir dist -p tsconfig.server.json", "dev": "rm -rf ./dist && pnpm esbuild && tsc --emitDeclarationOnly --outDir dist -p tsconfig.server.json",
"esbuild": "tsx ./esbuild.config.ts", "esbuild": "tsx ./esbuild.config.ts && tsc --project tsconfig.server.json --emitDeclarationOnly ",
"typecheck": "tsc --noEmit" "typecheck": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
@@ -49,6 +77,7 @@
"ssh2": "1.15.0" "ssh2": "1.15.0"
}, },
"devDependencies": { "devDependencies": {
"esbuild-plugin-alias": "0.2.1",
"tailwindcss": "^3.4.1", "tailwindcss": "^3.4.1",
"tsx": "^4.7.1", "tsx": "^4.7.1",
"tsc-alias": "1.8.10", "tsc-alias": "1.8.10",

View File

@@ -0,0 +1,27 @@
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const packagePath = path.resolve(__dirname, "../package.json");
const pkg = JSON.parse(fs.readFileSync(packagePath, "utf-8"));
pkg.exports = {
".": {
import: "./dist/index.js",
require: "./dist/index.cjs.js",
},
"./db": {
import: "./dist/db/index.js",
require: "./dist/db/index.cjs.js",
},
"./*": {
import: "./dist/*",
require: "./dist/*.cjs",
},
};
fs.writeFileSync(packagePath, JSON.stringify(pkg, null, 2));
console.log("Switched exports to use dist for production");

View File

@@ -0,0 +1,45 @@
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const packagePath = path.resolve(__dirname, "../package.json");
// Leer el archivo package.json
const pkg = JSON.parse(fs.readFileSync(packagePath, "utf-8"));
// Modificar los exports
pkg.exports = {
".": "./src/index.ts",
"./db": {
import: "./src/db/index.ts",
require: "./dist/db/index.cjs.js",
},
"./setup/*": {
import: "./src/setup/*.ts",
require: "./dist/setup/index.cjs.js",
},
"./constants": {
import: "./src/constants/index.ts",
require: "./dist/constants.cjs.js",
},
"./dist": {
import: "./dist/index.js",
require: "./dist/index.cjs.js",
},
"./dist/db": {
import: "./dist/db/index.js",
require: "./dist/db/*.cjs",
},
"./dist/db/schema": {
import: "./dist/db/schema/index.js",
require: "./dist/db/schema/*.cjs",
},
};
// Guardar los cambios en package.json
fs.writeFileSync(packagePath, JSON.stringify(pkg, null, 2));
console.log("Switched exports to use src for development");

View File

@@ -1,7 +1,7 @@
import { webcrypto } from "node:crypto"; import { webcrypto } from "node:crypto";
import type { IncomingMessage, ServerResponse } from "node:http"; import type { IncomingMessage, ServerResponse } from "node:http";
import { findAdminByAuthId } from "@/server/services/admin"; import { findAdminByAuthId } from "@dokploy/server/services/admin";
import { findUserByAuthId } from "@/server/services/user"; import { findUserByAuthId } from "@dokploy/server/services/user";
import { DrizzlePostgreSQLAdapter } from "@lucia-auth/adapter-drizzle"; import { DrizzlePostgreSQLAdapter } from "@lucia-auth/adapter-drizzle";
import { TimeSpan } from "lucia"; import { TimeSpan } from "lucia";
import { Lucia } from "lucia/dist/core.js"; import { Lucia } from "lucia/dist/core.js";

View File

@@ -1,11 +1,11 @@
import { randomBytes } from "node:crypto"; import { randomBytes } from "node:crypto";
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { import {
admins, admins,
type apiCreateUserInvitation, type apiCreateUserInvitation,
auth, auth,
users, users,
} from "@/server/db/schema"; } from "@dokploy/server/db/schema";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import * as bcrypt from "bcrypt"; import * as bcrypt from "bcrypt";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";

View File

@@ -1,38 +1,41 @@
import { docker } from "@/server/constants"; import { docker } from "@dokploy/server/constants";
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { type apiCreateApplication, applications } from "@/server/db/schema"; import {
import { generateAppName } from "@/server/db/schema"; type apiCreateApplication,
import { getAdvancedStats } from "@/server/monitoring/utilts"; applications,
import { generatePassword } from "@/server/templates/utils"; } from "@dokploy/server/db/schema";
import { generateAppName } from "@dokploy/server/db/schema";
import { getAdvancedStats } from "@dokploy/server/monitoring/utilts";
import { generatePassword } from "@dokploy/server/templates/utils";
import { import {
buildApplication, buildApplication,
getBuildCommand, getBuildCommand,
mechanizeDockerContainer, mechanizeDockerContainer,
} from "@/server/utils/builders"; } from "@dokploy/server/utils/builders";
import { sendBuildErrorNotifications } from "@/server/utils/notifications/build-error"; import { sendBuildErrorNotifications } from "@dokploy/server/utils/notifications/build-error";
import { sendBuildSuccessNotifications } from "@/server/utils/notifications/build-success"; import { sendBuildSuccessNotifications } from "@dokploy/server/utils/notifications/build-success";
import { execAsyncRemote } from "@/server/utils/process/execAsync"; import { execAsyncRemote } from "@dokploy/server/utils/process/execAsync";
import { import {
cloneBitbucketRepository, cloneBitbucketRepository,
getBitbucketCloneCommand, getBitbucketCloneCommand,
} from "@/server/utils/providers/bitbucket"; } from "@dokploy/server/utils/providers/bitbucket";
import { import {
buildDocker, buildDocker,
buildRemoteDocker, buildRemoteDocker,
} from "@/server/utils/providers/docker"; } from "@dokploy/server/utils/providers/docker";
import { import {
cloneGitRepository, cloneGitRepository,
getCustomGitCloneCommand, getCustomGitCloneCommand,
} from "@/server/utils/providers/git"; } from "@dokploy/server/utils/providers/git";
import { import {
cloneGithubRepository, cloneGithubRepository,
getGithubCloneCommand, getGithubCloneCommand,
} from "@/server/utils/providers/github"; } from "@dokploy/server/utils/providers/github";
import { import {
cloneGitlabRepository, cloneGitlabRepository,
getGitlabCloneCommand, getGitlabCloneCommand,
} from "@/server/utils/providers/gitlab"; } from "@dokploy/server/utils/providers/gitlab";
import { createTraefikConfig } from "@/server/utils/traefik/application"; import { createTraefikConfig } from "@dokploy/server/utils/traefik/application";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { encodeBase64 } from "../utils/docker/utils"; import { encodeBase64 } from "../utils/docker/utils";

View File

@@ -1,13 +1,13 @@
import { randomBytes } from "node:crypto"; import { randomBytes } from "node:crypto";
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { import {
admins, admins,
type apiCreateAdmin, type apiCreateAdmin,
type apiCreateUser, type apiCreateUser,
auth, auth,
users, users,
} from "@/server/db/schema"; } from "@dokploy/server/db/schema";
import { getPublicIpWithFallback } from "@/server/wss/terminal"; import { getPublicIpWithFallback } from "@dokploy/server/wss/terminal";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import * as bcrypt from "bcrypt"; import * as bcrypt from "bcrypt";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
@@ -43,7 +43,8 @@ export const createAdmin = async (input: typeof apiCreateAdmin._type) => {
.values({ .values({
authId: newAuth.id, authId: newAuth.id,
...(!IS_CLOUD && { ...(!IS_CLOUD && {
serverIp: await getPublicIpWithFallback(), serverIp:
process.env.ADVERTISE_ADDR || (await getPublicIpWithFallback()),
}), }),
}) })
.returning(); .returning();

View File

@@ -1,5 +1,5 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { type apiCreateBackup, backups } from "@/server/db/schema"; import { type apiCreateBackup, backups } from "@dokploy/server/db/schema";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";

View File

@@ -1,10 +1,10 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { import {
type apiCreateBitbucket, type apiCreateBitbucket,
type apiUpdateBitbucket, type apiUpdateBitbucket,
bitbucket, bitbucket,
gitProvider, gitProvider,
} from "@/server/db/schema"; } from "@dokploy/server/db/schema";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";

View File

@@ -1,9 +1,12 @@
import fs from "node:fs"; import fs from "node:fs";
import path from "node:path"; import path from "node:path";
import { paths } from "@/server/constants"; import { paths } from "@dokploy/server/constants";
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { type apiCreateCertificate, certificates } from "@/server/db/schema"; import {
import { removeDirectoryIfExistsContent } from "@/server/utils/filesystem/directory"; type apiCreateCertificate,
certificates,
} from "@dokploy/server/db/schema";
import { removeDirectoryIfExistsContent } from "@dokploy/server/utils/filesystem/directory";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { dump } from "js-yaml"; import { dump } from "js-yaml";

View File

@@ -1,44 +1,47 @@
import { join } from "node:path"; import { join } from "node:path";
import { paths } from "@/server/constants"; import { paths } from "@dokploy/server/constants";
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { type apiCreateCompose, compose } from "@/server/db/schema"; import { type apiCreateCompose, compose } from "@dokploy/server/db/schema";
import { generateAppName } from "@/server/db/schema"; import { generateAppName } from "@dokploy/server/db/schema";
import { generatePassword } from "@/server/templates/utils"; import { generatePassword } from "@dokploy/server/templates/utils";
import { import {
buildCompose, buildCompose,
getBuildComposeCommand, getBuildComposeCommand,
} from "@/server/utils/builders/compose"; } from "@dokploy/server/utils/builders/compose";
import { randomizeSpecificationFile } from "@/server/utils/docker/compose"; import { randomizeSpecificationFile } from "@dokploy/server/utils/docker/compose";
import { import {
cloneCompose, cloneCompose,
cloneComposeRemote, cloneComposeRemote,
loadDockerCompose, loadDockerCompose,
loadDockerComposeRemote, loadDockerComposeRemote,
} from "@/server/utils/docker/domain"; } from "@dokploy/server/utils/docker/domain";
import type { ComposeSpecification } from "@/server/utils/docker/types"; import type { ComposeSpecification } from "@dokploy/server/utils/docker/types";
import { sendBuildErrorNotifications } from "@/server/utils/notifications/build-error"; import { sendBuildErrorNotifications } from "@dokploy/server/utils/notifications/build-error";
import { sendBuildSuccessNotifications } from "@/server/utils/notifications/build-success"; import { sendBuildSuccessNotifications } from "@dokploy/server/utils/notifications/build-success";
import { execAsync, execAsyncRemote } from "@/server/utils/process/execAsync"; import {
execAsync,
execAsyncRemote,
} from "@dokploy/server/utils/process/execAsync";
import { import {
cloneBitbucketRepository, cloneBitbucketRepository,
getBitbucketCloneCommand, getBitbucketCloneCommand,
} from "@/server/utils/providers/bitbucket"; } from "@dokploy/server/utils/providers/bitbucket";
import { import {
cloneGitRepository, cloneGitRepository,
getCustomGitCloneCommand, getCustomGitCloneCommand,
} from "@/server/utils/providers/git"; } from "@dokploy/server/utils/providers/git";
import { import {
cloneGithubRepository, cloneGithubRepository,
getGithubCloneCommand, getGithubCloneCommand,
} from "@/server/utils/providers/github"; } from "@dokploy/server/utils/providers/github";
import { import {
cloneGitlabRepository, cloneGitlabRepository,
getGitlabCloneCommand, getGitlabCloneCommand,
} from "@/server/utils/providers/gitlab"; } from "@dokploy/server/utils/providers/gitlab";
import { import {
createComposeFile, createComposeFile,
getCreateComposeFileCommand, getCreateComposeFileCommand,
} from "@/server/utils/providers/raw"; } from "@dokploy/server/utils/providers/raw";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { encodeBase64 } from "../utils/docker/utils"; import { encodeBase64 } from "../utils/docker/utils";

View File

@@ -1,14 +1,14 @@
import { existsSync, promises as fsPromises } from "node:fs"; import { existsSync, promises as fsPromises } from "node:fs";
import path from "node:path"; import path from "node:path";
import { paths } from "@/server/constants"; import { paths } from "@dokploy/server/constants";
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { import {
type apiCreateDeployment, type apiCreateDeployment,
type apiCreateDeploymentCompose, type apiCreateDeploymentCompose,
type apiCreateDeploymentServer, type apiCreateDeploymentServer,
deployments, deployments,
} from "@/server/db/schema"; } from "@dokploy/server/db/schema";
import { removeDirectoryIfExistsContent } from "@/server/utils/filesystem/directory"; import { removeDirectoryIfExistsContent } from "@dokploy/server/utils/filesystem/directory";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { format } from "date-fns"; import { format } from "date-fns";
import { desc, eq } from "drizzle-orm"; import { desc, eq } from "drizzle-orm";
@@ -20,7 +20,7 @@ import {
import { type Compose, findComposeById, updateCompose } from "./compose"; import { type Compose, findComposeById, updateCompose } from "./compose";
import { type Server, findServerById } from "./server"; import { type Server, findServerById } from "./server";
import { execAsyncRemote } from "@/server/utils/process/execAsync"; import { execAsyncRemote } from "@dokploy/server/utils/process/execAsync";
export type Deployment = typeof deployments.$inferSelect; export type Deployment = typeof deployments.$inferSelect;

View File

@@ -1,5 +1,8 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { type apiCreateDestination, destinations } from "@/server/db/schema"; import {
type apiCreateDestination,
destinations,
} from "@dokploy/server/db/schema";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { and, eq } from "drizzle-orm"; import { and, eq } from "drizzle-orm";

View File

@@ -1,4 +1,7 @@
import { execAsync, execAsyncRemote } from "@/server/utils/process/execAsync"; import {
execAsync,
execAsyncRemote,
} from "@dokploy/server/utils/process/execAsync";
export const getContainers = async (serverId?: string | null) => { export const getContainers = async (serverId?: string | null) => {
try { try {

View File

@@ -1,6 +1,6 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { generateRandomDomain } from "@/server/templates/utils"; import { generateRandomDomain } from "@dokploy/server/templates/utils";
import { manageDomain } from "@/server/utils/traefik/domain"; import { manageDomain } from "@dokploy/server/utils/traefik/domain";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { type apiCreateDomain, domains } from "../db/schema"; import { type apiCreateDomain, domains } from "../db/schema";

View File

@@ -1,5 +1,5 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { gitProvider } from "@/server/db/schema"; import { gitProvider } from "@dokploy/server/db/schema";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";

View File

@@ -1,5 +1,9 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { type apiCreateGithub, gitProvider, github } from "@/server/db/schema"; import {
type apiCreateGithub,
gitProvider,
github,
} from "@dokploy/server/db/schema";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";

View File

@@ -1,11 +1,11 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { import {
type apiCreateGitlab, type apiCreateGitlab,
type bitbucket, type bitbucket,
gitProvider, gitProvider,
type github, type github,
gitlab, gitlab,
} from "@/server/db/schema"; } from "@dokploy/server/db/schema";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";

View File

@@ -1,14 +1,18 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { type apiCreateMariaDB, backups, mariadb } from "@/server/db/schema"; import {
import { generateAppName } from "@/server/db/schema"; type apiCreateMariaDB,
import { generatePassword } from "@/server/templates/utils"; backups,
import { buildMariadb } from "@/server/utils/databases/mariadb"; mariadb,
import { pullImage } from "@/server/utils/docker/utils"; } from "@dokploy/server/db/schema";
import { generateAppName } from "@dokploy/server/db/schema";
import { generatePassword } from "@dokploy/server/templates/utils";
import { buildMariadb } from "@dokploy/server/utils/databases/mariadb";
import { pullImage } from "@dokploy/server/utils/docker/utils";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq, getTableColumns } from "drizzle-orm"; import { eq, getTableColumns } from "drizzle-orm";
import { validUniqueServerAppName } from "./project"; import { validUniqueServerAppName } from "./project";
import { execAsyncRemote } from "@/server/utils/process/execAsync"; import { execAsyncRemote } from "@dokploy/server/utils/process/execAsync";
export type Mariadb = typeof mariadb.$inferSelect; export type Mariadb = typeof mariadb.$inferSelect;

View File

@@ -1,14 +1,14 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { type apiCreateMongo, backups, mongo } from "@/server/db/schema"; import { type apiCreateMongo, backups, mongo } from "@dokploy/server/db/schema";
import { generateAppName } from "@/server/db/schema"; import { generateAppName } from "@dokploy/server/db/schema";
import { generatePassword } from "@/server/templates/utils"; import { generatePassword } from "@dokploy/server/templates/utils";
import { buildMongo } from "@/server/utils/databases/mongo"; import { buildMongo } from "@dokploy/server/utils/databases/mongo";
import { pullImage } from "@/server/utils/docker/utils"; import { pullImage } from "@dokploy/server/utils/docker/utils";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq, getTableColumns } from "drizzle-orm"; import { eq, getTableColumns } from "drizzle-orm";
import { validUniqueServerAppName } from "./project"; import { validUniqueServerAppName } from "./project";
import { execAsyncRemote } from "@/server/utils/process/execAsync"; import { execAsyncRemote } from "@dokploy/server/utils/process/execAsync";
export type Mongo = typeof mongo.$inferSelect; export type Mongo = typeof mongo.$inferSelect;

View File

@@ -1,14 +1,17 @@
import path from "node:path"; import path from "node:path";
import { paths } from "@/server/constants"; import { paths } from "@dokploy/server/constants";
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { import {
type ServiceType, type ServiceType,
type apiCreateMount, type apiCreateMount,
mounts, mounts,
} from "@/server/db/schema"; } from "@dokploy/server/db/schema";
import { createFile, getCreateFileCommand } from "@/server/utils/docker/utils"; import {
import { removeFileOrDirectory } from "@/server/utils/filesystem/directory"; createFile,
import { execAsyncRemote } from "@/server/utils/process/execAsync"; getCreateFileCommand,
} from "@dokploy/server/utils/docker/utils";
import { removeFileOrDirectory } from "@dokploy/server/utils/filesystem/directory";
import { execAsyncRemote } from "@dokploy/server/utils/process/execAsync";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { type SQL, eq, sql } from "drizzle-orm"; import { type SQL, eq, sql } from "drizzle-orm";

View File

@@ -1,14 +1,14 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { type apiCreateMySql, backups, mysql } from "@/server/db/schema"; import { type apiCreateMySql, backups, mysql } from "@dokploy/server/db/schema";
import { generateAppName } from "@/server/db/schema"; import { generateAppName } from "@dokploy/server/db/schema";
import { generatePassword } from "@/server/templates/utils"; import { generatePassword } from "@dokploy/server/templates/utils";
import { buildMysql } from "@/server/utils/databases/mysql"; import { buildMysql } from "@dokploy/server/utils/databases/mysql";
import { pullImage } from "@/server/utils/docker/utils"; import { pullImage } from "@dokploy/server/utils/docker/utils";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq, getTableColumns } from "drizzle-orm"; import { eq, getTableColumns } from "drizzle-orm";
import { validUniqueServerAppName } from "./project"; import { validUniqueServerAppName } from "./project";
import { execAsyncRemote } from "@/server/utils/process/execAsync"; import { execAsyncRemote } from "@dokploy/server/utils/process/execAsync";
export type MySql = typeof mysql.$inferSelect; export type MySql = typeof mysql.$inferSelect;

View File

@@ -1,4 +1,4 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { import {
type apiCreateDiscord, type apiCreateDiscord,
type apiCreateEmail, type apiCreateEmail,
@@ -13,7 +13,7 @@ import {
notifications, notifications,
slack, slack,
telegram, telegram,
} from "@/server/db/schema"; } from "@dokploy/server/db/schema";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";

View File

@@ -1,5 +1,5 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { type apiCreatePort, ports } from "@/server/db/schema"; import { type apiCreatePort, ports } from "@dokploy/server/db/schema";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";

View File

@@ -1,14 +1,18 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { type apiCreatePostgres, backups, postgres } from "@/server/db/schema"; import {
import { generateAppName } from "@/server/db/schema"; type apiCreatePostgres,
import { generatePassword } from "@/server/templates/utils"; backups,
import { buildPostgres } from "@/server/utils/databases/postgres"; postgres,
import { pullImage } from "@/server/utils/docker/utils"; } from "@dokploy/server/db/schema";
import { generateAppName } from "@dokploy/server/db/schema";
import { generatePassword } from "@dokploy/server/templates/utils";
import { buildPostgres } from "@dokploy/server/utils/databases/postgres";
import { pullImage } from "@dokploy/server/utils/docker/utils";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq, getTableColumns } from "drizzle-orm"; import { eq, getTableColumns } from "drizzle-orm";
import { validUniqueServerAppName } from "./project"; import { validUniqueServerAppName } from "./project";
import { execAsyncRemote } from "@/server/utils/process/execAsync"; import { execAsyncRemote } from "@dokploy/server/utils/process/execAsync";
export type Postgres = typeof postgres.$inferSelect; export type Postgres = typeof postgres.$inferSelect;

View File

@@ -1,4 +1,4 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { import {
type apiCreateProject, type apiCreateProject,
applications, applications,
@@ -8,7 +8,7 @@ import {
postgres, postgres,
projects, projects,
redis, redis,
} from "@/server/db/schema"; } from "@dokploy/server/db/schema";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";

View File

@@ -1,10 +1,10 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { type apiCreateRedirect, redirects } from "@/server/db/schema"; import { type apiCreateRedirect, redirects } from "@dokploy/server/db/schema";
import { import {
createRedirectMiddleware, createRedirectMiddleware,
removeRedirectMiddleware, removeRedirectMiddleware,
updateRedirectMiddleware, updateRedirectMiddleware,
} from "@/server/utils/traefik/redirect"; } from "@dokploy/server/utils/traefik/redirect";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { desc, eq } from "drizzle-orm"; import { desc, eq } from "drizzle-orm";
import type { z } from "zod"; import type { z } from "zod";

View File

@@ -1,14 +1,14 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { type apiCreateRedis, redis } from "@/server/db/schema"; import { type apiCreateRedis, redis } from "@dokploy/server/db/schema";
import { generateAppName } from "@/server/db/schema"; import { generateAppName } from "@dokploy/server/db/schema";
import { generatePassword } from "@/server/templates/utils"; import { generatePassword } from "@dokploy/server/templates/utils";
import { buildRedis } from "@/server/utils/databases/redis"; import { buildRedis } from "@dokploy/server/utils/databases/redis";
import { pullImage } from "@/server/utils/docker/utils"; import { pullImage } from "@dokploy/server/utils/docker/utils";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { validUniqueServerAppName } from "./project"; import { validUniqueServerAppName } from "./project";
import { execAsyncRemote } from "@/server/utils/process/execAsync"; import { execAsyncRemote } from "@dokploy/server/utils/process/execAsync";
export type Redis = typeof redis.$inferSelect; export type Redis = typeof redis.$inferSelect;

View File

@@ -1,6 +1,9 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { type apiCreateRegistry, registry } from "@/server/db/schema"; import { type apiCreateRegistry, registry } from "@dokploy/server/db/schema";
import { execAsync, execAsyncRemote } from "@/server/utils/process/execAsync"; import {
execAsync,
execAsyncRemote,
} from "@dokploy/server/utils/process/execAsync";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { IS_CLOUD } from "../constants"; import { IS_CLOUD } from "../constants";

View File

@@ -1,9 +1,9 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { type apiCreateSecurity, security } from "@/server/db/schema"; import { type apiCreateSecurity, security } from "@dokploy/server/db/schema";
import { import {
createSecurityMiddleware, createSecurityMiddleware,
removeSecurityMiddleware, removeSecurityMiddleware,
} from "@/server/utils/traefik/security"; } from "@dokploy/server/utils/traefik/security";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import type { z } from "zod"; import type { z } from "zod";

View File

@@ -1,5 +1,5 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { type apiCreateServer, server } from "@/server/db/schema"; import { type apiCreateServer, server } from "@dokploy/server/db/schema";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { desc, eq } from "drizzle-orm"; import { desc, eq } from "drizzle-orm";

View File

@@ -1,8 +1,8 @@
import { readdirSync } from "node:fs"; import { readdirSync } from "node:fs";
import { join } from "node:path"; import { join } from "node:path";
import { docker } from "@/server/constants"; import { docker } from "@dokploy/server/constants";
import { getServiceContainer } from "@/server/utils/docker/utils"; import { getServiceContainer } from "@dokploy/server/utils/docker/utils";
import { execAsyncRemote } from "@/server/utils/process/execAsync"; import { execAsyncRemote } from "@dokploy/server/utils/process/execAsync";
// import packageInfo from "../../../package.json"; // import packageInfo from "../../../package.json";
const updateIsAvailable = async () => { const updateIsAvailable = async () => {

View File

@@ -1,11 +1,11 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { import {
type apiCreateSshKey, type apiCreateSshKey,
type apiFindOneSshKey, type apiFindOneSshKey,
type apiRemoveSshKey, type apiRemoveSshKey,
type apiUpdateSshKey, type apiUpdateSshKey,
sshKeys, sshKeys,
} from "@/server/db/schema"; } from "@dokploy/server/db/schema";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";

View File

@@ -1,5 +1,5 @@
import { db } from "@/server/db"; import { db } from "@dokploy/server/db";
import { users } from "@/server/db/schema"; import { users } from "@dokploy/server/db/schema";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";

View File

@@ -32,16 +32,18 @@ export const initializePostgres = async () => {
Replicas: 1, Replicas: 1,
}, },
}, },
EndpointSpec: { ...(process.env.NODE_ENV === "development" && {
Ports: [ EndpointSpec: {
{ Ports: [
TargetPort: 5432, {
PublishedPort: process.env.NODE_ENV === "development" ? 5432 : 0, TargetPort: 5432,
Protocol: "tcp", PublishedPort: 5432,
PublishMode: "host", Protocol: "tcp",
}, PublishMode: "host",
], },
}, ],
},
}),
}; };
try { try {
await pullImage(imageName); await pullImage(imageName);

View File

@@ -29,16 +29,18 @@ export const initializeRedis = async () => {
Replicas: 1, Replicas: 1,
}, },
}, },
EndpointSpec: { ...(process.env.NODE_ENV === "development" && {
Ports: [ EndpointSpec: {
{ Ports: [
TargetPort: 6379, {
PublishedPort: process.env.NODE_ENV === "development" ? 6379 : 0, TargetPort: 6379,
Protocol: "tcp", PublishedPort: 6379,
PublishMode: "host", Protocol: "tcp",
}, PublishMode: "host",
], },
}, ],
},
}),
}; };
try { try {
await pullImage(imageName); await pullImage(imageName);

View File

@@ -1,15 +1,15 @@
import { createWriteStream } from "node:fs"; import { createWriteStream } from "node:fs";
import path from "node:path"; import path from "node:path";
import { paths } from "@/server/constants"; import { paths } from "@dokploy/server/constants";
import { import {
createServerDeployment, createServerDeployment,
updateDeploymentStatus, updateDeploymentStatus,
} from "@/server/services/deployment"; } from "@dokploy/server/services/deployment";
import { findServerById } from "@/server/services/server"; import { findServerById } from "@dokploy/server/services/server";
import { import {
getDefaultMiddlewares, getDefaultMiddlewares,
getDefaultServerTraefikConfig, getDefaultServerTraefikConfig,
} from "@/server/setup/traefik-setup"; } from "@dokploy/server/setup/traefik-setup";
import { Client } from "ssh2"; import { Client } from "ssh2";
import { recreateDirectory } from "../utils/filesystem/directory"; import { recreateDirectory } from "../utils/filesystem/directory";

View File

@@ -1,7 +1,7 @@
import { randomBytes } from "node:crypto"; import { randomBytes } from "node:crypto";
import { readFile } from "node:fs/promises"; import { readFile } from "node:fs/promises";
import { join } from "node:path"; import { join } from "node:path";
import type { Domain } from "@/server/services/domain"; import type { Domain } from "@dokploy/server/services/domain";
export interface Schema { export interface Schema {
serverIp: string; serverIp: string;

View File

@@ -1,4 +1,4 @@
import type * as schema from "@/server/db/schema"; import type * as schema from "@dokploy/server/db/schema";
import type { import type {
BuildQueryResult, BuildQueryResult,
DBQueryConfig, DBQueryConfig,

View File

@@ -1,5 +1,5 @@
import { IS_CLOUD, paths } from "@/server/constants"; import { IS_CLOUD, paths } from "@dokploy/server/constants";
import { updateAdmin } from "@/server/services/admin"; import { updateAdmin } from "@dokploy/server/services/admin";
import { type RotatingFileStream, createStream } from "rotating-file-stream"; import { type RotatingFileStream, createStream } from "rotating-file-stream";
import { db } from "../../db"; import { db } from "../../db";
import { execAsync } from "../process/execAsync"; import { execAsync } from "../process/execAsync";

View File

@@ -1,5 +1,5 @@
import { findAdmin } from "@/server/services/admin"; import { findAdmin } from "@dokploy/server/services/admin";
import { getAllServers } from "@/server/services/server"; import { getAllServers } from "@dokploy/server/services/server";
import { scheduleJob } from "node-schedule"; import { scheduleJob } from "node-schedule";
import { db } from "../../db/index"; import { db } from "../../db/index";
import { import {

View File

@@ -1,7 +1,7 @@
import path from "node:path"; import path from "node:path";
import type { BackupSchedule } from "@/server/services/backup"; import type { BackupSchedule } from "@dokploy/server/services/backup";
import type { Mariadb } from "@/server/services/mariadb"; import type { Mariadb } from "@dokploy/server/services/mariadb";
import { findProjectById } from "@/server/services/project"; import { findProjectById } from "@dokploy/server/services/project";
import { import {
getRemoteServiceContainer, getRemoteServiceContainer,
getServiceContainer, getServiceContainer,

View File

@@ -1,7 +1,7 @@
import path from "node:path"; import path from "node:path";
import type { BackupSchedule } from "@/server/services/backup"; import type { BackupSchedule } from "@dokploy/server/services/backup";
import type { Mongo } from "@/server/services/mongo"; import type { Mongo } from "@dokploy/server/services/mongo";
import { findProjectById } from "@/server/services/project"; import { findProjectById } from "@dokploy/server/services/project";
import { import {
getRemoteServiceContainer, getRemoteServiceContainer,
getServiceContainer, getServiceContainer,
@@ -29,7 +29,7 @@ export const runMongoBackup = async (mongo: Mongo, backup: BackupSchedule) => {
mongo.serverId, mongo.serverId,
appName, appName,
); );
const mongoDumpCommand = `docker exec ${containerId} sh -c "mongodump -d '${database}' -u '${databaseUser}' -p '${databasePassword}' --authenticationDatabase=admin --gzip"`; const mongoDumpCommand = `docker exec ${containerId} sh -c "mongodump -d '${database}' -u '${databaseUser}' -p '${databasePassword}' --archive --authenticationDatabase=admin --gzip"`;
await execAsyncRemote( await execAsyncRemote(
mongo.serverId, mongo.serverId,
@@ -37,7 +37,7 @@ export const runMongoBackup = async (mongo: Mongo, backup: BackupSchedule) => {
); );
} else { } else {
const { Id: containerId } = await getServiceContainer(appName); const { Id: containerId } = await getServiceContainer(appName);
const mongoDumpCommand = `docker exec ${containerId} sh -c "mongodump -d '${database}' -u '${databaseUser}' -p '${databasePassword}' --authenticationDatabase=admin --gzip"`; const mongoDumpCommand = `docker exec ${containerId} sh -c "mongodump -d '${database}' -u '${databaseUser}' -p '${databasePassword}' --archive --authenticationDatabase=admin --gzip"`;
await execAsync(`${mongoDumpCommand} | ${rcloneCommand}`); await execAsync(`${mongoDumpCommand} | ${rcloneCommand}`);
} }

View File

@@ -1,8 +1,8 @@
import { unlink } from "node:fs/promises"; import { unlink } from "node:fs/promises";
import path from "node:path"; import path from "node:path";
import type { BackupSchedule } from "@/server/services/backup"; import type { BackupSchedule } from "@dokploy/server/services/backup";
import type { MySql } from "@/server/services/mysql"; import type { MySql } from "@dokploy/server/services/mysql";
import { findProjectById } from "@/server/services/project"; import { findProjectById } from "@dokploy/server/services/project";
import { import {
getRemoteServiceContainer, getRemoteServiceContainer,
getServiceContainer, getServiceContainer,

View File

@@ -1,7 +1,7 @@
import path from "node:path"; import path from "node:path";
import type { BackupSchedule } from "@/server/services/backup"; import type { BackupSchedule } from "@dokploy/server/services/backup";
import type { Postgres } from "@/server/services/postgres"; import type { Postgres } from "@dokploy/server/services/postgres";
import { findProjectById } from "@/server/services/project"; import { findProjectById } from "@dokploy/server/services/project";
import { import {
getRemoteServiceContainer, getRemoteServiceContainer,
getServiceContainer, getServiceContainer,

View File

@@ -1,5 +1,5 @@
import type { BackupSchedule } from "@/server/services/backup"; import type { BackupSchedule } from "@dokploy/server/services/backup";
import type { Destination } from "@/server/services/destination"; import type { Destination } from "@dokploy/server/services/destination";
import { scheduleJob, scheduledJobs } from "node-schedule"; import { scheduleJob, scheduledJobs } from "node-schedule";
import { runMariadbBackup } from "./mariadb"; import { runMariadbBackup } from "./mariadb";
import { runMongoBackup } from "./mongo"; import { runMongoBackup } from "./mongo";

View File

@@ -5,8 +5,8 @@ import {
writeFileSync, writeFileSync,
} from "node:fs"; } from "node:fs";
import { dirname, join } from "node:path"; import { dirname, join } from "node:path";
import { paths } from "@/server/constants"; import { paths } from "@dokploy/server/constants";
import type { InferResultType } from "@/server/types/with"; import type { InferResultType } from "@dokploy/server/types/with";
import boxen from "boxen"; import boxen from "boxen";
import { import {
writeDomainsToCompose, writeDomainsToCompose,

View File

@@ -1,5 +1,5 @@
import type { WriteStream } from "node:fs"; import type { WriteStream } from "node:fs";
import { prepareEnvironmentVariables } from "@/server/utils/docker/utils"; import { prepareEnvironmentVariables } from "@dokploy/server/utils/docker/utils";
import type { ApplicationNested } from "."; import type { ApplicationNested } from ".";
import { import {
getBuildAppDirectory, getBuildAppDirectory,

View File

@@ -1,8 +1,8 @@
import fs from "node:fs/promises"; import fs from "node:fs/promises";
import path, { join } from "node:path"; import path, { join } from "node:path";
import { paths } from "@/server/constants"; import { paths } from "@dokploy/server/constants";
import type { Application } from "@/server/services/application"; import type { Application } from "@dokploy/server/services/application";
import { findServerById } from "@/server/services/server"; import { findServerById } from "@dokploy/server/services/server";
import AdmZip from "adm-zip"; import AdmZip from "adm-zip";
import { Client, type SFTPWrapper } from "ssh2"; import { Client, type SFTPWrapper } from "ssh2";
import { import {

View File

@@ -1,5 +1,5 @@
import { createWriteStream } from "node:fs"; import { createWriteStream } from "node:fs";
import type { InferResultType } from "@/server/types/with"; import type { InferResultType } from "@dokploy/server/types/with";
import type { CreateServiceOptions } from "dockerode"; import type { CreateServiceOptions } from "dockerode";
import { uploadImage } from "../cluster/upload"; import { uploadImage } from "../cluster/upload";
import { import {

View File

@@ -1,6 +1,9 @@
import { type WriteStream, existsSync, mkdirSync } from "node:fs"; import { type WriteStream, existsSync, mkdirSync } from "node:fs";
import path from "node:path"; import path from "node:path";
import { buildStatic, getStaticCommand } from "@/server/utils/builders/static"; import {
buildStatic,
getStaticCommand,
} from "@dokploy/server/utils/builders/static";
import { nanoid } from "nanoid"; import { nanoid } from "nanoid";
import type { ApplicationNested } from "."; import type { ApplicationNested } from ".";
import { prepareEnvironmentVariables } from "../docker/utils"; import { prepareEnvironmentVariables } from "../docker/utils";

View File

@@ -2,7 +2,7 @@ import type { WriteStream } from "node:fs";
import { import {
buildCustomDocker, buildCustomDocker,
getDockerCommand, getDockerCommand,
} from "@/server/utils/builders/docker-file"; } from "@dokploy/server/utils/builders/docker-file";
import type { ApplicationNested } from "."; import type { ApplicationNested } from ".";
import { createFile, getCreateFileCommand } from "../docker/utils"; import { createFile, getCreateFileCommand } from "../docker/utils";
import { getBuildAppDirectory } from "../filesystem/directory"; import { getBuildAppDirectory } from "../filesystem/directory";

View File

@@ -1,4 +1,4 @@
import type { InferResultType } from "@/server/types/with"; import type { InferResultType } from "@dokploy/server/types/with";
import type { CreateServiceOptions } from "dockerode"; import type { CreateServiceOptions } from "dockerode";
import { import {
calculateResources, calculateResources,

View File

@@ -1,4 +1,4 @@
import type { InferResultType } from "@/server/types/with"; import type { InferResultType } from "@dokploy/server/types/with";
import type { CreateServiceOptions } from "dockerode"; import type { CreateServiceOptions } from "dockerode";
import { import {
calculateResources, calculateResources,

View File

@@ -1,4 +1,4 @@
import type { InferResultType } from "@/server/types/with"; import type { InferResultType } from "@dokploy/server/types/with";
import type { CreateServiceOptions } from "dockerode"; import type { CreateServiceOptions } from "dockerode";
import { import {
calculateResources, calculateResources,

View File

@@ -1,4 +1,4 @@
import type { InferResultType } from "@/server/types/with"; import type { InferResultType } from "@dokploy/server/types/with";
import type { CreateServiceOptions } from "dockerode"; import type { CreateServiceOptions } from "dockerode";
import { import {
calculateResources, calculateResources,

View File

@@ -1,4 +1,4 @@
import type { InferResultType } from "@/server/types/with"; import type { InferResultType } from "@dokploy/server/types/with";
import type { CreateServiceOptions } from "dockerode"; import type { CreateServiceOptions } from "dockerode";
import { import {
calculateResources, calculateResources,

View File

@@ -1,5 +1,5 @@
import crypto from "node:crypto"; import crypto from "node:crypto";
import { findComposeById } from "@/server/services/compose"; import { findComposeById } from "@dokploy/server/services/compose";
import { dump, load } from "js-yaml"; import { dump, load } from "js-yaml";
import { addSuffixToAllConfigs } from "./compose/configs"; import { addSuffixToAllConfigs } from "./compose/configs";
import { addSuffixToAllNetworks } from "./compose/network"; import { addSuffixToAllNetworks } from "./compose/network";

View File

@@ -1,9 +1,9 @@
import fs, { existsSync, readFileSync } from "node:fs"; import fs, { existsSync, readFileSync } from "node:fs";
import { writeFile } from "node:fs/promises"; import { writeFile } from "node:fs/promises";
import { join } from "node:path"; import { join } from "node:path";
import { paths } from "@/server/constants"; import { paths } from "@dokploy/server/constants";
import type { Compose } from "@/server/services/compose"; import type { Compose } from "@dokploy/server/services/compose";
import type { Domain } from "@/server/services/domain"; import type { Domain } from "@dokploy/server/services/domain";
import { dump, load } from "js-yaml"; import { dump, load } from "js-yaml";
import { execAsyncRemote } from "../process/execAsync"; import { execAsyncRemote } from "../process/execAsync";
import { import {

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