Remove ecosystem configuration file, add Docker entrypoint script, and update deployment workflow to build and push Docker images. Enhance AdminPage with Docker export functionality and improve post management API to use dynamic posts directory path.
This commit is contained in:
@@ -78,6 +78,7 @@ export default function AdminPage() {
|
||||
const [changePwFeedback, setChangePwFeedback] = useState<string | null>(null);
|
||||
const [previewHtml, setPreviewHtml] = useState('');
|
||||
const [editingPost, setEditingPost] = useState<{ slug: string, path: string } | null>(null);
|
||||
const [isDocker, setIsDocker] = useState<boolean>(false);
|
||||
const router = useRouter();
|
||||
const usernameRef = useRef<HTMLInputElement>(null);
|
||||
const passwordRef = useRef<HTMLInputElement>(null);
|
||||
@@ -96,6 +97,7 @@ export default function AdminPage() {
|
||||
useEffect(() => {
|
||||
localStorage.setItem('pinnedPosts', JSON.stringify(pinned));
|
||||
}, [pinned]);
|
||||
|
||||
useEffect(() => {
|
||||
marked.setOptions({
|
||||
gfm: true,
|
||||
@@ -111,6 +113,14 @@ export default function AdminPage() {
|
||||
setPreviewHtml(marked.parse(newPost.content || '') as string);
|
||||
}, [newPost.content]);
|
||||
|
||||
useEffect(() => {
|
||||
// Check if docker is used
|
||||
fetch('/api/admin/docker')
|
||||
.then(res => res.json())
|
||||
.then(data => setIsDocker(!!data.docker))
|
||||
.catch(() => setIsDocker(false));
|
||||
}, []);
|
||||
|
||||
const loadContent = async () => {
|
||||
try {
|
||||
const response = await fetch('/api/posts');
|
||||
@@ -480,6 +490,25 @@ export default function AdminPage() {
|
||||
}
|
||||
};
|
||||
|
||||
function handleExportTarball() {
|
||||
fetch('/api/admin/export')
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw new Error('Export failed');
|
||||
const blob = await res.blob();
|
||||
const url = window.URL.createObjectURL(blob);
|
||||
const a = document.createElement('a');
|
||||
a.href = url;
|
||||
a.download = 'markdownblog-export.tar.gz';
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
a.remove();
|
||||
window.URL.revokeObjectURL(url);
|
||||
})
|
||||
.catch((err) => {
|
||||
alert('Export failed: ' + err.message);
|
||||
});
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="min-h-screen bg-gray-100 p-8">
|
||||
{pinFeedback && (
|
||||
@@ -548,6 +577,19 @@ export default function AdminPage() {
|
||||
>
|
||||
Passwort ändern
|
||||
</button>
|
||||
{/* Docker warning above export button */}
|
||||
{isDocker && (
|
||||
<div className="mb-2 px-4 py-2 bg-yellow-200 text-yellow-900 rounded border border-yellow-400 font-semibold text-sm text-center">
|
||||
<span className="font-bold">Warning:</span> Docker is in use. Exporting will export the entire <span className="font-mono">/app</span> root directory (including all files and folders in the container's root).
|
||||
</div>
|
||||
)}
|
||||
<button
|
||||
onClick={handleExportTarball}
|
||||
className="px-4 py-2 bg-green-600 text-white rounded hover:bg-green-700"
|
||||
title="Export the entire root folder as a tarball"
|
||||
>
|
||||
Export Root as Tarball
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user