Skip to content

Commit 415f12c

Browse files
feat: took care of things pointed out in PR review
1 parent 145027f commit 415f12c

File tree

7 files changed

+92
-56
lines changed

7 files changed

+92
-56
lines changed

docker/named_pipe/listen.sh

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,18 @@ while true; do
44

55
if echo "$raw" | grep -q "^RESPOND::"; then
66
cmd="${raw##RESPOND::}"
7-
eval "$cmd" > output_pipe 2>&1
7+
response_file=$(mktemp)
8+
eval "$cmd" > "$response_file" 2>&1
9+
(
10+
while ! mkdir output_pipe.lock 2>/dev/null; do
11+
sleep 1
12+
done
13+
14+
cat "$response_file" > output_pipe
15+
rm -f "$response_file"
16+
rmdir output_pipe.lock
17+
) &
818
else
9-
eval "$raw" &
19+
eval "$raw"
1020
fi
1121
done

src/backend/scripts.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ async function addScript(
4343
const memLimit = shellEscape(MEMORY_LIMIT || "512m", "MEMORY_LIMIT");
4444
volume_needed=(volume_needed=="Yes").toString();
4545
const volumeNeeded=shellEscape(volume_needed,"false");
46-
console.log(`volume neeeded is ${volumeNeeded}`);
46+
console.log(`volume needed is ${volumeNeeded}`);
4747
if (document.resource_type === "URL") {
4848
await safeExec(
4949
`bash -c "echo 'bash ../../src/backend/shell_scripts/automate.sh -u ${resource} ${subdomain}' > /hostpipe/pipe"`,

src/backend/shell_scripts/container.sh

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ STORAGE_ROOT="/mnt/storage"
1212
PROJECT_STORAGE="$STORAGE_ROOT/$name"
1313
PROJECT_IMG="$STORAGE_ROOT/$name.img"
1414
SIZE_MB=100
15-
sudo mkdir -p $STORAGE_ROOT
16-
sudo chmod 755 $STORAGE_ROOT
15+
sudo mkdir -p "$STORAGE_ROOT"
16+
sudo chmod 755 "$STORAGE_ROOT"
1717
for ((port=PORT_MIN; port<=PORT_MAX; port++)); do
1818
if ! ss -ln src :$port | grep -q "\<$port\>"; then
1919
available_ports+=($port)
@@ -23,9 +23,9 @@ done
2323
echo "Available ports: ${available_ports[56]}"
2424
AVAILABLE=0
2525
echo "Creating subdomain $name"
26-
git clone $resource $name
27-
sudo cp .env $name/
28-
cd $name
26+
git clone $resource "$name"
27+
sudo cp .env "$name/"
28+
cd "$name"
2929

3030
if [ $flag = "-g" ]; then
3131
sudo cp ../Dockerfile ./
@@ -40,39 +40,39 @@ if [ "$enable_volume" = "true" ]; then
4040
echo "Creating persistent storage at $PROJECT_STORAGE"
4141

4242
if [ ! -f "$PROJECT_IMG" ]; then
43-
sudo dd if=/dev/zero of=$PROJECT_IMG bs=1M count=$SIZE_MB
44-
sudo mkfs.ext4 $PROJECT_IMG
43+
sudo dd if=/dev/zero of="$PROJECT_IMG" bs=1M count=$SIZE_MB
44+
sudo mkfs.ext4 "$PROJECT_IMG"
4545
fi
46-
sudo mkdir -p $PROJECT_STORAGE
47-
if ! mount | grep -q "$PROJECT_STORAGE"; then
48-
sudo mount -o loop $PROJECT_IMG $PROJECT_STORAGE
46+
sudo mkdir -p "$PROJECT_STORAGE"
47+
if ! mountpoint -q "$PROJECT_STORAGE"; then
48+
sudo mount -o loop "$PROJECT_IMG" "$PROJECT_STORAGE"
4949
fi
50-
sudo chmod 777 $PROJECT_STORAGE
50+
sudo chmod 777 "$PROJECT_STORAGE"
5151
fi
52-
sudo docker build -t $name .
52+
sudo docker build -t "$name" .
5353
if [ "$enable_volume" = "true" ]; then
5454
sudo docker run \
5555
--memory=$max_mem \
56-
--name=$name \
56+
--name="$name" \
5757
-d \
5858
-p ${available_ports[$AVAILABLE]}:$exp_port \
59-
-v $PROJECT_STORAGE:/app/data \
59+
-v "$PROJECT_STORAGE":/app/data \
6060
-e DATA_DIR=/app/data \
61-
$name
61+
"$name"
6262
else
6363
sudo docker run \
6464
--memory=$max_mem \
65-
--name=$name \
65+
--name="$name" \
6666
-d \
6767
-p ${available_ports[$AVAILABLE]}:$exp_port \
68-
$name
68+
"$name"
6969
fi
7070
cd ..
71-
sudo rm -rf $name
71+
sudo rm -rf "$name"
7272
sudo rm Dockerfile
7373
sudo rm .env
74-
sudo touch /etc/nginx/sites-available/$name.conf
75-
sudo chmod 666 /etc/nginx/sites-available/$name.conf
74+
sudo touch "/etc/nginx/sites-available/$name".conf
75+
sudo chmod 666 "/etc/nginx/sites-available/$name.conf"
7676
sudo echo "# Virtual Host configuration for $name
7777
server {
7878
listen 80;
@@ -88,6 +88,6 @@ sudo echo "# Virtual Host configuration for $name
8888
}
8989
charset utf-8;
9090
client_max_body_size 20M;
91-
}" > /etc/nginx/sites-available/$name.conf
92-
sudo ln -s /etc/nginx/sites-available/$name.conf /etc/nginx/sites-enabled/$name.conf
91+
}" > "/etc/nginx/sites-available/$name.conf"
92+
sudo ln -s "/etc/nginx/sites-available/$name.conf" "/etc/nginx/sites-enabled/$name.conf"
9393
sudo systemctl reload nginx

src/backend/shell_scripts/delete.sh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,18 @@ sudo docker stop $1
2020
sudo docker rm $1
2121
sudo docker rmi $1
2222

23-
if mount | grep -q "$PROJECT_STORAGE"; then
23+
if mountpoint -q "$PROJECT_STORAGE"; then
2424
echo "Unmounting volume..."
25-
sudo umount $PROJECT_STORAGE
25+
sudo umount "$PROJECT_STORAGE"
2626
fi
2727

2828
if [ -d "$PROJECT_STORAGE" ]; then
29-
sudo rm -rf $PROJECT_STORAGE
29+
sudo rm -rf "$PROJECT_STORAGE"
3030
fi
3131

3232
if [ -f "$PROJECT_IMG" ]; then
3333
echo "Deleting volume image..."
34-
sudo rm -f $PROJECT_IMG
34+
sudo rm -f "$PROJECT_IMG"
3535
fi
3636

3737
sudo systemctl reload nginx

src/backend/utils/container-storage.ts

Lines changed: 48 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,56 @@
1-
import {exec } from "../dependencies.ts";
1+
import { exec } from "../dependencies.ts";
2+
3+
const STORAGE_TIMEOUT_MS = 5000;
4+
5+
let storagePipeLock: Promise<void> = Promise.resolve();
6+
async function withStoragePipeLock<T>(operation: () => Promise<T>): Promise<T> {
7+
const previousLock = storagePipeLock;
8+
let releaseLock!: () => void;
9+
storagePipeLock = new Promise<void>((resolve) => {
10+
releaseLock = resolve;
11+
});
12+
await previousLock;
13+
try {
14+
return await operation();
15+
} finally {
16+
releaseLock();
17+
}
18+
}
219
export async function canAllocateStorage(requestedMb: number) {
320
const STORAGE_PATH = "/mnt/storage";
421
const SAFETY_BUFFER_MB = 200; // keep buffer for system + docker
522

623
try {
7-
const responseProcess = new Deno.Command("sh", {
8-
args: ["-c", "cat /hostpipe/output_pipe"],
9-
}).output(); // don't await yet, just start it
10-
await exec(`bash -c "echo 'RESPOND::df ${STORAGE_PATH} --output=avail' > /hostpipe/pipe"`);
11-
const response=await responseProcess;
12-
const output = new TextDecoder().decode(response.stdout).trim().split("\n");
13-
const availableKb = parseInt(output[1].trim());
14-
if (isNaN(availableKb)) {
15-
throw new Error(`Unexpected df output: ${output}`);
16-
}
17-
const availableMb = Math.floor(availableKb / 1024);
18-
const usableMb = availableMb - SAFETY_BUFFER_MB;
19-
const canAllocate = usableMb >= requestedMb;
20-
console.log(`can allocate ${canAllocate} memory`);
21-
console.log(`Available memory is ${availableMb} requested is ${requestedMb}`);
22-
return {
23-
can_allocate: canAllocate,
24-
available_mb: usableMb,
25-
requested_mb: requestedMb,
26-
reason: canAllocate ? null : "Not enough disk space",
27-
};
24+
return await withStoragePipeLock(async () => {
25+
const abortController = new AbortController();
26+
const timeoutId = setTimeout(() => abortController.abort(), STORAGE_TIMEOUT_MS);
27+
try {
28+
const responseProcess = new Deno.Command("sh", {
29+
args: ["-c", "cat /hostpipe/output_pipe"],
30+
}).output(); // don't await yet, just start it
31+
await exec(`bash -c "echo 'RESPOND::df ${STORAGE_PATH} --output=avail' > /hostpipe/pipe"`);
32+
const response = await responseProcess;
33+
const output = new TextDecoder().decode(response.stdout).trim().split("\n");
34+
const availableKb = parseInt(output[1].trim());
35+
if (isNaN(availableKb)) {
36+
throw new Error(`Unexpected df output: ${output}`);
37+
}
38+
const availableMb = Math.floor(availableKb / 1024);
39+
const usableMb = availableMb - SAFETY_BUFFER_MB;
40+
const canAllocate = usableMb >= requestedMb;
41+
console.log(`can allocate ${canAllocate} memory`);
42+
console.log(`Available memory is ${availableMb} requested is ${requestedMb}`);
43+
return {
44+
can_allocate: canAllocate,
45+
available_mb: usableMb,
46+
requested_mb: requestedMb,
47+
reason: canAllocate ? null : "Not enough disk space",
48+
};
49+
} finally {
50+
clearTimeout(timeoutId);
51+
}
52+
});
53+
2854
} catch (err) {
2955
console.log(`Error during memory check volume`);
3056
return {

src/cli/features/createDomain.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export async function createDomain(userApiKey: string, user: string, provider: s
8585
if (response.data.status === 'success') {
8686
console.log(`✅ Domain '${subdomain}.${domain}' created successfully!`);
8787
} else {
88-
if(response.error=="INSUFFICIENT_STORAGE")console.log("INSUFFICIENT_STORAGE")
88+
if(response.data.error=="INSUFFICIENT_STORAGE")console.log("INSUFFICIENT_STORAGE")
8989
console.log('❌ Domain creation failed!');
9090
console.log("Either the domain exist or the domain is not created");
9191
}

src/frontend/src/components/modal.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ const domain = import.meta.env.VITE_APP_DOMAIN
2626
<div v-if="static_content === 'No'" class="stack-section">
2727
<div class="docker-content">
2828
<label for="dockerfile-content">Do you have dockerfile in your repo ?</label><br>
29-
<input name="radio" type="radio" value="Yes" v-model="dockerfile_present"> Yes
30-
<input name="radio" type="radio" value="No" v-model="dockerfile_present"> No
29+
<input name="docker_radio" type="radio" value="Yes" v-model="dockerfile_present"> Yes
30+
<input name="docker_radio" type="radio" value="No" v-model="dockerfile_present"> No
3131
</div>
3232
<div v-if="dockerfile_present === 'No'" class="dockerfile-section">
3333
<p>Stack:</p>
@@ -37,8 +37,8 @@ const domain = import.meta.env.VITE_APP_DOMAIN
3737
</div>
3838
<div class="volume-needed">
3939
<label for="volume">Do you need persistent storage (Volume)?</label><br>
40-
<input name="radio" type="radio" value="Yes" v-model="volume_needed"> Yes
41-
<input name="radio" type="radio" value="No" v-model="volume_needed"> No
40+
<input name="volume_radio" type="radio" value="Yes" v-model="volume_needed"> Yes
41+
<input name="volume_radio" type="radio" value="No" v-model="volume_needed"> No
4242
</div>
4343
<p>Port:<br><input class="input-field" v-model="port" /></p>
4444
<div v-if="dockerfile_present === 'No'" class="dockerfile-section">

0 commit comments

Comments
 (0)