Phase 0 Complete
This commit is contained in:
-31
@@ -1,31 +0,0 @@
|
|||||||
# Base image
|
|
||||||
FROM python:3.11-slim
|
|
||||||
|
|
||||||
# Environment vars
|
|
||||||
ENV PYTHONDONTWRITEBYTECODE=1 \
|
|
||||||
PYTHONUNBUFFERED=1 \
|
|
||||||
PRODUCTION=true
|
|
||||||
|
|
||||||
# Working directory
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
# Install system dependencies
|
|
||||||
RUN apt-get update && \
|
|
||||||
apt-get install -y git && \
|
|
||||||
rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Copy dependency file
|
|
||||||
COPY requirements.txt .
|
|
||||||
RUN pip install --no-cache-dir -r requirements.txt
|
|
||||||
|
|
||||||
# Copy entire app
|
|
||||||
COPY . .
|
|
||||||
|
|
||||||
# Ensure uploads folder exists
|
|
||||||
RUN mkdir -p uploads
|
|
||||||
|
|
||||||
# Expose the port Flask uses
|
|
||||||
EXPOSE 5000
|
|
||||||
|
|
||||||
# Start the app
|
|
||||||
CMD ["python", "app.py"]
|
|
||||||
+6
-1
@@ -6,6 +6,11 @@
|
|||||||
### Phase 0
|
### Phase 0
|
||||||
|
|
||||||
- [x] Remove docker files (Dropping official docker support)
|
- [x] Remove docker files (Dropping official docker support)
|
||||||
|
<<<<<<< HEAD
|
||||||
|
|
||||||
|
- [x] Update README.md to be current.
|
||||||
|
=======
|
||||||
|
>>>>>>> 2a414e62cf21b47eb5976535fe1499e02d561f4c
|
||||||
|
|
||||||
- [x] Add roadmap.md to repo
|
- [x] Add roadmap.md to repo
|
||||||
|
|
||||||
@@ -15,7 +20,7 @@
|
|||||||
|
|
||||||
- [x] Create /paccrypt_algos/ folder
|
- [x] Create /paccrypt_algos/ folder
|
||||||
|
|
||||||
- [ ] Builder better start, stop and restart scripts both prod and dev (Universal)
|
- [x] Builder better start, stop and restart scripts both prod and dev (Linux Only)
|
||||||
|
|
||||||
- [ ] Add a button in the admin panel to switch to and from prod and dev modes - **Saving for UI Revamp**
|
- [ ] Add a button in the admin panel to switch to and from prod and dev modes - **Saving for UI Revamp**
|
||||||
|
|
||||||
|
|||||||
@@ -31,14 +31,14 @@ app.secret_key = os.getenv("FLASK_SECRET", os.urandom(24))
|
|||||||
CORS(app, origins=["https://pdf.unnaturalll.dev"])
|
CORS(app, origins=["https://pdf.unnaturalll.dev"])
|
||||||
|
|
||||||
# ===== Constants =====
|
# ===== Constants =====
|
||||||
ADMIN_CRED_FILE = 'admin_creds.json'
|
ADMIN_CRED_FILE = 'application_data/admin_creds.json'
|
||||||
ADMIN_KEY_FILE = 'admin_key.key'
|
ADMIN_KEY_FILE = 'application_data/admin_key.key'
|
||||||
ADMIN_LOG_FILE = 'admin_logs.enc'
|
ADMIN_LOG_FILE = 'application_data/admin_logs.enc'
|
||||||
SETTINGS_FILE = 'settings.json'
|
SETTINGS_FILE = 'application_data/settings.json'
|
||||||
ALPHABET = list('abcdefghijklmnopqrstuvwxyz')
|
ALPHABET = list('abcdefghijklmnopqrstuvwxyz')
|
||||||
|
|
||||||
DEFAULT_SETTINGS = {
|
DEFAULT_SETTINGS = {
|
||||||
"upload_folder": "uploads",
|
"upload_folder": "pacshare",
|
||||||
"max_file_age_days": 14,
|
"max_file_age_days": 14,
|
||||||
"max_file_size_bytes": 25 * 1024 * 1024 * 1024 # 25GB
|
"max_file_size_bytes": 25 * 1024 * 1024 * 1024 # 25GB
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import signal
|
||||||
|
import time
|
||||||
|
import sys
|
||||||
|
import psutil
|
||||||
|
|
||||||
|
APP_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../app.py"))
|
||||||
|
|
||||||
|
DEBUG = True
|
||||||
|
|
||||||
|
def log(msg):
|
||||||
|
if DEBUG:
|
||||||
|
print(msg)
|
||||||
|
|
||||||
|
def start_dev():
|
||||||
|
env = os.environ.copy()
|
||||||
|
env["PRODUCTION"] = "false"
|
||||||
|
return subprocess.Popen(
|
||||||
|
["python3", APP_PATH],
|
||||||
|
env=env,
|
||||||
|
preexec_fn=os.setsid,
|
||||||
|
stdout=sys.stdout,
|
||||||
|
stderr=sys.stderr
|
||||||
|
)
|
||||||
|
|
||||||
|
def stop_by_port(port=5000):
|
||||||
|
for proc in psutil.process_iter(["pid", "name"]):
|
||||||
|
try:
|
||||||
|
for conn in proc.connections(kind="inet"):
|
||||||
|
if conn.laddr.port == port:
|
||||||
|
log(f"[*] Killing process {proc.pid} using port {port}")
|
||||||
|
os.killpg(os.getpgid(proc.pid), signal.SIGTERM)
|
||||||
|
return
|
||||||
|
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
||||||
|
continue
|
||||||
|
log(f"[!] No process found using port {port}")
|
||||||
|
|
||||||
|
def main():
|
||||||
|
log("[*] Restarting PacCrypt in DEVELOPMENT mode...")
|
||||||
|
stop_by_port()
|
||||||
|
time.sleep(1)
|
||||||
|
start_dev()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import signal
|
||||||
|
import time
|
||||||
|
import sys
|
||||||
|
import psutil
|
||||||
|
|
||||||
|
APP_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../app.py"))
|
||||||
|
|
||||||
|
def start_prod():
|
||||||
|
env = os.environ.copy()
|
||||||
|
env["PRODUCTION"] = "true"
|
||||||
|
return subprocess.Popen(
|
||||||
|
["python3", APP_PATH],
|
||||||
|
env=env,
|
||||||
|
preexec_fn=os.setsid,
|
||||||
|
stdout=subprocess.DEVNULL,
|
||||||
|
stderr=subprocess.DEVNULL
|
||||||
|
)
|
||||||
|
|
||||||
|
def stop_by_port(port=5000):
|
||||||
|
for proc in psutil.process_iter(["pid", "name"]):
|
||||||
|
try:
|
||||||
|
for conn in proc.connections(kind="inet"):
|
||||||
|
if conn.laddr.port == port:
|
||||||
|
print(f"[*] Killing process {proc.pid} using port {port}")
|
||||||
|
os.killpg(os.getpgid(proc.pid), signal.SIGTERM)
|
||||||
|
return
|
||||||
|
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
||||||
|
continue
|
||||||
|
print(f"[!] No process found using port {port}")
|
||||||
|
|
||||||
|
def main():
|
||||||
|
print("[*] Restarting PacCrypt in PRODUCTION mode with Waitress...")
|
||||||
|
stop_by_port()
|
||||||
|
time.sleep(1)
|
||||||
|
start_prod()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import time
|
||||||
|
import sys
|
||||||
|
|
||||||
|
APP_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../app.py"))
|
||||||
|
|
||||||
|
DEBUG = True
|
||||||
|
|
||||||
|
def log(msg):
|
||||||
|
if DEBUG:
|
||||||
|
print(msg)
|
||||||
|
|
||||||
|
def start_dev():
|
||||||
|
env = os.environ.copy()
|
||||||
|
env["PRODUCTION"] = "false"
|
||||||
|
return subprocess.Popen(
|
||||||
|
["python3", APP_PATH],
|
||||||
|
env=env,
|
||||||
|
preexec_fn=os.setsid,
|
||||||
|
stdout=sys.stdout,
|
||||||
|
stderr=sys.stderr
|
||||||
|
)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
log("[*] Starting PacCrypt in DEVELOPMENT mode...")
|
||||||
|
start_dev()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import time
|
||||||
|
import sys
|
||||||
|
|
||||||
|
APP_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../app.py"))
|
||||||
|
|
||||||
|
def start_prod():
|
||||||
|
env = os.environ.copy()
|
||||||
|
env["PRODUCTION"] = "true"
|
||||||
|
return subprocess.Popen(
|
||||||
|
["python3", APP_PATH],
|
||||||
|
env=env,
|
||||||
|
preexec_fn=os.setsid,
|
||||||
|
stdout=subprocess.DEVNULL,
|
||||||
|
stderr=subprocess.DEVNULL
|
||||||
|
)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
print("[*] Starting PacCrypt in PRODUCTION mode with Waitress...")
|
||||||
|
start_prod()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
import psutil
|
||||||
|
import os
|
||||||
|
import signal
|
||||||
|
|
||||||
|
DEBUG = True
|
||||||
|
|
||||||
|
def log(msg):
|
||||||
|
if DEBUG:
|
||||||
|
print(msg)
|
||||||
|
|
||||||
|
def stop_by_port(port=5000):
|
||||||
|
for proc in psutil.process_iter(["pid", "name"]):
|
||||||
|
try:
|
||||||
|
for conn in proc.connections(kind="inet"):
|
||||||
|
if conn.laddr.port == port:
|
||||||
|
log(f"[*] Killing process {proc.pid} using port {port}")
|
||||||
|
os.killpg(os.getpgid(proc.pid), signal.SIGTERM)
|
||||||
|
return
|
||||||
|
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
||||||
|
continue
|
||||||
|
log(f"[!] No process found using port {port}")
|
||||||
|
|
||||||
|
def main():
|
||||||
|
stop_by_port()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -8,4 +8,4 @@ werkzeug==3.0.1
|
|||||||
psutil>=5.9.0,<6.0.0
|
psutil>=5.9.0,<6.0.0
|
||||||
|
|
||||||
# nginx - Only needed for Nginx integration, not installed via pip
|
# nginx - Only needed for Nginx integration, not installed via pip
|
||||||
# Run pip install -r requirements.txt
|
# Run pip install -r application_data/requirements.txt
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
version: "3.8"
|
|
||||||
|
|
||||||
services:
|
|
||||||
paccrypt:
|
|
||||||
build: .
|
|
||||||
container_name: paccrypt
|
|
||||||
ports:
|
|
||||||
- "5001:5000"
|
|
||||||
environment:
|
|
||||||
- PYTHONDONTWRITEBYTECODE=1
|
|
||||||
- PYTHONUNBUFFERED=1
|
|
||||||
- PRODUCTION=true
|
|
||||||
volumes:
|
|
||||||
- /mnt/stor4tb/uploads:/app/uploads
|
|
||||||
restart: unless-stopped
|
|
||||||
networks:
|
|
||||||
- shared_internal
|
|
||||||
|
|
||||||
networks:
|
|
||||||
|
|
||||||
shared_internal:
|
|
||||||
external: true
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
|
|
||||||
@echo off
|
|
||||||
timeout /t 2 /nobreak
|
|
||||||
taskkill /F /PID 15428
|
|
||||||
set PRODUCTION=true
|
|
||||||
start "" "python" "app.py"
|
|
||||||
|
|
||||||
-17
@@ -1,17 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
sleep 2
|
|
||||||
|
|
||||||
# Save current process PID
|
|
||||||
PID=$1
|
|
||||||
|
|
||||||
# Gracefully stop the current server
|
|
||||||
kill "$PID"
|
|
||||||
|
|
||||||
# Wait until it exits
|
|
||||||
while kill -0 "$PID" 2>/dev/null; do
|
|
||||||
sleep 0.5
|
|
||||||
done
|
|
||||||
|
|
||||||
# Restart with the same interpreter and script
|
|
||||||
export PRODUCTION=true
|
|
||||||
exec "$2" "$3"
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"upload_folder": "uploads", "max_file_age_days": 14, "max_file_size_bytes": 26843545600}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
@echo off
|
|
||||||
echo Starting PacCrypt in DEVELOPMENT mode...
|
|
||||||
set PRODUCTION=false
|
|
||||||
python app.py
|
|
||||||
pause
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
echo "Starting PacCrypt in DEVELOPMENT mode..."
|
|
||||||
export PRODUCTION=false
|
|
||||||
python3 app.py
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
@echo off
|
|
||||||
echo Starting PacCrypt in PRODUCTION mode...
|
|
||||||
set PRODUCTION=true
|
|
||||||
python app.py
|
|
||||||
pause
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
echo "Starting PacCrypt in PRODUCTION mode..."
|
|
||||||
export PRODUCTION=true
|
|
||||||
python3 app.py
|
|
||||||
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 5.0 KiB |
Reference in New Issue
Block a user