<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Advanced Programming Stories &#187; apache</title>
	<atom:link href="http://developstories.gr/tag/apache/feed/" rel="self" type="application/rss+xml" />
	<link>http://developstories.gr</link>
	<description>advanced web development techniques &#38; reverse engineering stories</description>
	<lastBuildDate>Mon, 31 Oct 2011 10:24:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Συνδέοντας το git με τον apache σε ubuntu server</title>
		<link>http://developstories.gr/server/git-apache-ubuntu/</link>
		<comments>http://developstories.gr/server/git-apache-ubuntu/#comments</comments>
		<pubDate>Tue, 11 May 2010 10:43:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[server]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[repository]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://developstories.gr/?p=110</guid>
		<description><![CDATA[Καθώς μεγαλώνει η ομάδα του social whale, και ταυτόχρονα οι απαιτήσεις (βλ. διαγωνισμός vodafone), αρχίζει η ανάγκη για version control system. Έτσι αποφασίσαμε να πειραματιστούμε με το git σε έναν Ubuntu server. Έτσι, ξεκινώντας από το 0 και με σύμμαχο το google, αρχίσαμε τα tests. Όποιο tutorial και να βρίσκαμε δεν είχε ακριβώς αυτό που [...]]]></description>
			<content:encoded><![CDATA[<p>Καθώς μεγαλώνει η ομάδα του <a href="http://socialwhale.com">social whale</a>, και ταυτόχρονα οι απαιτήσεις (βλ. <a href="http://pea.to/SocialWhale">διαγωνισμός vodafone</a>), αρχίζει η ανάγκη για version control system. Έτσι αποφασίσαμε να πειραματιστούμε με το <a title="Version Control System" href="http://git-scm.com/">git</a> σε έναν Ubuntu server.</p>
<p>Έτσι, ξεκινώντας από το 0 και με σύμμαχο το google, αρχίσαμε τα tests. Όποιο tutorial και να βρίσκαμε δεν είχε ακριβώς αυτό που θέλαμε να πετύχουμε. Πιο συγκεκριμένα θέλαμε, όταν κάνει μια αλλαγή κάποιος developer/designer και την ανεβάζει στο repository, αυτόματα να μπορεί να βλέπει την αλλαγή σε ένα dev url. Η λύση που σκεφτήκαμε ήταν να φτιάξουμε ένα client που έκανε αυτόματα sync από το repository και ταυτόχρονα να είναι το virtual host που βλέπει ο apache. Αυτό το πετύχαμε με ένα hook στο repository, ώστε σε κάθε update που δέχεται να κάνει sync τον client του apache. Ας το δούμε στην πράξη:</p>
<p><strong>1. Εγκατάσταση του git στον server (ip: 192.168.0.2)</strong><br />
<code>user@ubuntu_server: sudo apt-get install git-core</code></p>
<p><strong>2. Δημιουργία ενός git share repository στον server</strong><br />
<code>user@ubuntu_server: sudo mkdir /myapp.git<br />
user@ubuntu_server: sudo chown user:group /myapp.git<br />
user@ubuntu_server: cd /myapp.git<br />
user@ubuntu_server: git --bare init</code></p>
<p><strong>3. Δημιουργία ενός κλώνου του repository για την σύνδεση με τον apache</strong><br />
<code>user@ubuntu_server: cd /var/www<br />
user@ubuntu_server: git clone /myapp.git</code></p>
<p>Σε μερικές εκδόσεις του git (πχ. 1.4, 1.5) δεν επιτρέπει το clone σε empty repository οπότε πρέπει να δημιουργήσουμε ένα empty και απλά να το συνδέσουμε με το master repository.<br />
<code>user@ubuntu_server: cd /var/www<br />
user@ubuntu_server: mkdir myapp<br />
user@ubuntu_server: cd myapp<br />
user@ubuntu_server: git init<br />
user@ubuntu_server: git remote add origin /myapp.git<br />
user@ubuntu_server: git config branch.master.remote origin<br />
user@ubuntu_server: git config branch.master.merge refs/heads/master<br />
</code></p>
<p><strong>4. Σύνδεση του <a title="Apache Virtual Host documentation" href="http://httpd.apache.org/docs/1.3/vhosts/">VirtualHost</a> με το clone folder στο DocumentRoot</strong><br />
<code>user@ubuntu_server: sudo vi /etc/apache2/site-enabled/myapp<br />
&lt;VirtualHost *:80&gt;<br />
  ServerName myapp.com<br />
  DocumentRoot /var/www/myapp<br />
&lt;/VirtualHost&gt;</p>
<p>user@ubuntu_server: cd /var/www/myapp<br />
user@ubuntu_server: echo 'MyApp (ver 1.00)' &gt; index.html<br />
user@ubuntu_server: git add index.html<br />
user@ubuntu_server: git commit -a -m 'Add index.html'<br />
user@ubuntu_server: git push origin master</code></p>
<p>Με την <a href="http://www.kernel.org/pub/software/scm/git/docs/git-clone.html">git clone</a> φτιάξαμε ένα κλώνο από το myapp git repository, με την <a href="http://www.kernel.org/pub/software/scm/git/docs/git-add.html">git add</a> προσθέσαμε ένα αρχείο, με την <a href="http://www.kernel.org/pub/software/scm/git/docs/git-commit.html">git commit</a> στείλαμε την αλλαγή στο τοπικό μας repository (κάθε clone έχει και δικό του repository), και τέλος με την <a href="http://www.kernel.org/pub/software/scm/git/docs/git-push.html">git push</a> στείλαμε την αλλαγή και στο κεντρικό μας repository. Τώρα αν ανοίξουμε ένα browser και δώσουμε το url του VirtualHost θα πρέπει να εμφανιστεί το &#8220;MyApp (ver 1.00)&#8221;.</p>
<p><strong>5. Στείνουμε σε ένα ubuntu desktop client το git και κατεβάζουμε (clone) το repository από τον server (desktop ip:192.168.0.3)</strong><br />
<code>user@ubuntu_desktop: sudo apt-get install git-core<br />
user@ubuntu_desktop: git clone ssh://user@192.168.0.2/myapp.git</code></p>
<p>Ετσι δημιουργήθηκε ένα folder myapp που μέσα έχει την index.html</p>
<p><strong>6. Αλλάζουμε την index.html και την ανεβάζουμε στο repository στο server</strong><br />
<code>user@ubuntu_desktop: echo 'MyApp (ver 2.00)' &gt; index.html<br />
user@ubuntu_desktop: git commit -a -m 'Modify index.html'<br />
user@ubuntu_desktop: git push</code></p>
<p>Τώρα αν κάνουμε refresh τον browser, θα διαπιστώσουμε ότι δεν άλλαξε τίποτα. Καλά δεν θα ήταν να μας έδειχνε αυτόματα την διορθωμένη index.html; Για να γίνει αυτό θα πρέπει να πάμε πάλι πίσω στον server και συγκεκριμένα στο clone repository που βλέπει ο apache και να δώσουμε:<br />
user@ubuntu_server: <a href="http://www.kernel.org/pub/software/scm/git/docs/git-pull.html">git pull</a></p>
<p>Τώρα στο refresh θα δούμε το αλλαγμένο ver την σελίδα μας.</p>
<p><strong>7. Δημιουργία script για αυτόματο sync του apache από το κεντρικό repository</strong><br />
To git έχει <a href="http://www.kernel.org/pub/software/scm/git/docs/githooks.html">hook scripts</a> που εκτελούνται μετά η πριν από συγκεκριμένες διαδικασίες. Αυτό που θέλουμε εδώ είναι κάνουμε hook το after post.</p>
<p><code>user@ubuntu_server: cd /myapp.git/hooks<br />
user@ubuntu_server: vi post-update<br />
#!/bin/sh<br />
cd /var/www/myapp<br />
env -i git pull</p>
<p>user@ubuntu_server: chmod +x post-update</code></p>
<p>Τώρα πάμε πίσω στον client να το δοκιμάσουμε, επαναλαμβάνουμε το βήμα 6 απλά αντί για ver 2.0 βάζουμε 3.0. Στο refresh, η σελίδα μας έχει αλλάξει, χωρίς να δώσουμε git pull στον server, αυτό γίνεται αυτόματα με το hook.</p>
<p><strong>8. Δημιουργία script για αυτόματο push με από κάθε commit</strong><br />
Δεν μας έφτασε αυτό, θέλαμε να αποφύγουμε και το git push στους clients γιατί επειδή είναι με ssh και μας ζητάει password συνέχεια, και όταν υπάρχουν συνεχόμενες αλλαγές (πχ σε ένα css element) είναι πολύ χρονοβόρα διαδικασία. Σκεφτήκαμε ότι θα μπορούσαμε να βάλουμε ένα hook όπου μετά από ένα commit να γίνεται αυτόματα το push. Όλα ωραία στην θεωρία άλλα όταν πας στην πράξη αρχίζουν τα προβλήματα. Το πρόβλημα είναι κάπως πρέπει να δωσεις το password. Η λύση εδώ είναι το <a href="http://en.wikipedia.org/wiki/Expect">expect command line script</a>.</p>
<p><code>user@ubuntu_desktop: sudo apt-get install expect<br />
user@ubuntu_desktop: cd .git/hooks<br />
user@ubuntu_desktop: vi post-commit<br />
#!/usr/bin/expect<br />
spawn git push<br />
expect "password:"<br />
send "mypass\r"<br />
interact</code></p>
<p>Δεν πρέπει να ξεχνάμε ότι πριν από ένα commit, push θα πρέπει να έχει προηγηθεί ένα pull.</p>
<p><strong>9. Τελευταίo test</strong><br />
<code>user@ubuntu_desktop: cd ../..<br />
user@ubuntu_desktop: echo 'MyApp (ver 4.00)' &gt; index.html<br />
user@ubuntu_desktop: git commit -a -m 'Modify index.html'</code></p>
<p>Τώρα αν κάνουμε refresh τον browser, βλέπουμε το ver 4.00, και το έχουμε πετύχει με μόνο μια εντολή την commit.</p>
<p>Νομίζω ότι ένα τέτοιο σενάριο είναι πολύ καλό για δημιουργία projects με πολλούς developers/designers και μάλιστα χωρίς να είναι στον ίδιο χώρο αν ανοίξουμε το http και το ssh στον server.</p>
]]></content:encoded>
			<wfw:commentRss>http://developstories.gr/server/git-apache-ubuntu/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>php και sudo</title>
		<link>http://developstories.gr/php/php-%ce%ba%ce%b1%ce%b9-sudo/</link>
		<comments>http://developstories.gr/php/php-%ce%ba%ce%b1%ce%b9-sudo/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 11:34:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[sudo]]></category>

		<guid isPermaLink="false">http://developstories.gr/?p=80</guid>
		<description><![CDATA[Ένα απο τα ζητήματα που προκύπτουν στο advanced web development είναι η αλληλεπίδραση με το λειτουργικό σύστημα. Για παράδειγμα θέλουμε να τρέξουμε μία εντολή και να δούμε το αποτέλεσμά της. Αυτό γίνεται εύκολα με την shell_exec() ή την exec() ωστόσο απο μόνη της δέν λύνει όλα τα προβλήματα. Ο apache αλλα και κάθε web server [...]]]></description>
			<content:encoded><![CDATA[<p>Ένα απο τα ζητήματα που προκύπτουν στο advanced web development είναι η αλληλεπίδραση με το λειτουργικό σύστημα. Για παράδειγμα θέλουμε να τρέξουμε μία εντολή και να δούμε το αποτέλεσμά της. Αυτό γίνεται εύκολα με την shell_exec() ή την exec() ωστόσο απο μόνη της δέν λύνει όλα τα προβλήματα.</p>
<p>Ο apache αλλα και κάθε web server τρέχει με ελάχιστα δικαιώματα που συνήθως του επιτρέπουν να κάνει μόνο βασικά πράγματα. Απο άποψη ασφάλειας αυτό είναι θεμιτό και σε καμία περίπτωση δέν πρέπει να τρέχει με δικαιώματα root γιατί εκεί ένα απλό bug ασφαλείας μπορεί να οδηγήσει σε πλήρη καταστροφή. Την λύση σ&#8217;αυτό το πρόβλημα την δίνει το εργαλείο sudo.</p>
<h3>Τί είναι το sudo</h3>
<p>Το <a href="http://www.courtesan.com/sudo/">sudo</a> είναι ένα εργαλείο για *nix συστήματα (unix,linux,κτλ) το οποίο επιτρέπει να τρέξουμε κάποια εντολή με δικαιώματα root. Έτσι αντί να κάνουμε vurnerable όλο τον web server μπορούμε όποτε χρειάζεται να τρέχουμε μέσω sudo τις εντολές που θέλουμε.</p>
<h3>Sudo configuration</h3>
<p>Καταρχήν πρέπει να κάνουμε ένα απλό configuration στο sudo ωστε να δέχεται εντολές απο τον web server. Για την ακρίβεια πρέπει να δώσουμε δικαιώματα στον χρήστη που τρέχει τον apache που συνήθως λέγεται apache. Για σιγουριά δείτε στο httpd.conf το directive User.</p>
<p>Για να κάνουμε το sudo να δέχεται εντολές απο τον web server πάμε στο αρχείο /etc/sudoers και προσθέτουμε την παρακάτω γραμμή:</p>
<blockquote><p><code><strong>apache ALL=(ALL) ALL</strong></code></p></blockquote>
<p>Αν ο χρήστης δέν ονομάζεται apache αντικαταστήστε το όνομα apache στο παραπάνω. Για να μήν υπάρχουν προβλήματα ασφαλείας θέτουμε και ένα password στον χρήστη apache. Αυτό γίνεται απο κονσόλα με την παρακάτω εντολή:</p>
<blockquote><p><strong><code>passwd apache</code></strong></p></blockquote>
<p>Αν δέν ακολουθήσετε το τελευταίο βήμα, κάθε php script στον server θα μπορεί να τρέξει εντολές με δικαιώματα root και αυτό μπορεί να οδηγήσει σε σοβαρά προβλήματα ασφαλείας.</p>
<h3>Τρέχοντας sudo με php</h3>
<p>Αφού τελειώσουμε με τα configuration το υπόλοιπο είναι πολύ εύκολο αρκεί να χρησιμοποιήσετε την παρακάτω <a href="http://developstories.gr/cat/php/">php</a> function που δημιούργησα για αυτό τον σκοπό:</p>
<pre class="brush: php; title: ; notranslate">

define(&quot;SUDO&quot;,&quot;/usr/bin/sudo&quot;);
define(&quot;SUDO_PASS&quot;,&quot;pass&quot;);

// SUDO START
exec('echo '.SUDO_PASS.'|'.SUDO.' -S -v 2&gt;&amp;1');

// SUDO EXECUTE
echo exec(SUDO . &quot; ls /root 2&gt;&amp;1&quot;);

// SUDO STOP
exec(SUDO.&quot; -k 2&gt;&amp;1&quot;);
</pre>
<p>Προσέξτε τα δύο define στην αρχή. Το πρώτο είναι το path για την sudo και λογικά δέν χρειάζεται να το πειράξετε. Το δεύτερο όρισμα (SUDO_PASS) πρέπει να περιέχει το password του apache.</p>
]]></content:encoded>
			<wfw:commentRss>http://developstories.gr/php/php-%ce%ba%ce%b1%ce%b9-sudo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

