Publicado 2024-11-23
Además de algún que otro juego, la idea de el servidor casero para mi es poder hostear una página web y repositorios git. El setup lo fui cambiando, refinando y simplificando con los años. Cómo lo tengo ahora es muy muy simple y funcional. Fijate si te sirve.
Esto está1 hecho en una máquina con Fedora, pero si te andás con otra distro te va a andar, solo tenés que buscar los paquetes equivalentes y las ubicaciones de los archivos de configuración que posiblemente sean distintos.
Al ser una compu de escritorio que uso regularmente, me gusta que al sitio web tenerlo en el home directory de mi usuario principal, y para eso uso mod_userdir
. Apache lo tengo más o menos out-of-the box. Solamente agrego un redirect de /
a /~ramiro/
y permito symlinks en los userdir.
En redirect.conf
:
RewriteEngine on
RedirectMatch "^/$" "/~ramiro/"
En userdir.conf
:
<IfModule mod_userdir.c>
UserDir enabled
UserDir public_html
</IfModule>
<Directory "/home/*/public_html">
(...)
Options (...) SymLinksIfOwnerMatch
</Directory>
También tiene mod_markdown
de hamano (está en los repos de Fedora). Básicamente te deja servir markdown directamente. Para mi, HTML, como LaTeX, que no está hecho para que escribas a mano, es perder el tiempo.
https://github.com/hamano/apache-mod-markdown
mod_markdown
lo configuro en el .htaccess
de /~ramiro/
.
En .htaccess
:
(...)
AddHandler markdown .md
MarkdownCss /~ramiro/static/style.css
MarkdownFlags 0x42205000
MarkdownFooter '<p><a href="/~ramiro/">Home</a></p>'
Y también tiene un par de mods más mi apache, mod_php
y mod_autoindex
, que más abajo les explico para que los uso.
Tip: podés no exponer ciertos directorios creando en ellos un .htaccess
con la directiva Deny from all
.
El blog lo hago basante artesanal: unos archivos de markdown con fecha y copyright escritos a mano. Lo que si tengo es un scriptcito de PHP para generar el índice y el feed atom y ahorrarme el dolor de huevos que es.2
Algo así tengo en feed.php
:
(...)
<?php foreach (glob("*.md") as $index=>$file):
$url = "http://" . $_SERVER["SERVER_NAME"] . dirname($_SERVER["REQUEST_URI"]) . "/" . $file;
$lines = file($file);
$content = file_get_contents($file);
$title_regex = '/(?<=\#\ ).*(?=\n)/';
$date_regex = '/\d{4}-([0][1-9]|1[0-2])-([0][1-9]|[1-2]\d|3[01])/';
preg_match($title_regex, $lines[0], $title);
preg_match($date_regex, $content, $date);
?>
<entry>
<id><?=$url?></id>
<title><?=$title[0] ?? "Untitled entry"?></title>
<updated><?=$date[0] ?? "1970-01-01"?>T00:00:00.00Z</updated>
<link href="<?=$url?>" rel="alternate" />
</entry>
<?php endforeach; ?>
(...)
y el index.php
es muy parecido, te lo dejo de tarea.
Mi solución para hostear repositorios git es básicamente solo usar SSH. Lo tengo explciado en otro post.
http://covacha.net.ar/~ramiro/blog/servidor_git.md
Esto me hace muy muy fácil hacer una interfaz minimalista. Básicamente tengo un symlink a public_git/
, donde tengo mis repos, y ahí un script index.php
muy parecido al feed.php
para listar los repositorios.3
Para la vista de un repositorio en particular me apoyo en el mod_autoindex
que viene con Apache. Dejo mis repositrios no bare para que se pueda generar un índice, y muy clave esto: tengo un hook que al pushear al repositorio genera en su raíz un README.html
a partir del README
del repositorio. mod_autoxindex
muestra el README.html
abajo del índice y queda muy prolijo.
Mi hook post-receive
:
#!/bin/sh
if [ $(git rev-parse --is-bare-repository) = true ] ; then
ROOT=$(git rev-parse --show-toplevel)
else
git --git-dir=. --work-tree=$PWD/.. reset --hard
ROOT="$PWD/../"
fi
git cat-file blob HEAD:README | markdown > "$ROOT/README.html"
En el .htaccess
, para configurar un poco el índice:
IndexStyleSheet /~ramiro/static/autoindex.css
IndexOptions NameWidth=* +SuppressSize +SuppressDescription +ScanHTMLTitles +IconsAreLinks +FoldersFirst
(...)
© 2020-2025 Ramiro. Contenido disponible bajo CC BY-SA 4.0.